add event handler for MPD_IDLE_OUTPUT notification
This commit is contained in:
@@ -249,6 +249,7 @@ void Connection::UpdateStatus()
|
||||
itsChanges.Consume = 1;
|
||||
itsChanges.PlayerState = 1;
|
||||
itsChanges.StatusFlags = 1;
|
||||
itsChanges.Outputs = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -259,6 +260,7 @@ void Connection::UpdateStatus()
|
||||
itsChanges.DBUpdating = idle_mask & MPD_IDLE_UPDATE;
|
||||
itsChanges.Volume = idle_mask & MPD_IDLE_MIXER;
|
||||
itsChanges.StatusFlags = idle_mask & MPD_IDLE_OPTIONS;
|
||||
itsChanges.Outputs = idle_mask & MPD_IDLE_OUTPUT;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -280,6 +282,10 @@ void Connection::UpdateStatus()
|
||||
|| itsChanges.Consume
|
||||
|| itsChanges.Crossfade
|
||||
|| itsChanges.DBUpdating;
|
||||
|
||||
// there is no way to determine if the output has changed or not
|
||||
// from mpd status, it's possible only with idle notifications
|
||||
itsChanges.Outputs = 0;
|
||||
}
|
||||
|
||||
itsChanges.SongID = mpd_status_get_song_id(itsOldStatus)
|
||||
|
||||
@@ -49,7 +49,7 @@ namespace MPD
|
||||
|
||||
struct StatusChanges
|
||||
{
|
||||
StatusChanges() : Playlist(0), SongID(0), Database(0), DBUpdating(0), Volume(0), ElapsedTime(0), Crossfade(0), Random(0), Repeat(0), Single(0), Consume(0), PlayerState(0), StatusFlags(0) { }
|
||||
StatusChanges() : Playlist(0), SongID(0), Database(0), DBUpdating(0), Volume(0), ElapsedTime(0), Crossfade(0), Random(0), Repeat(0), Single(0), Consume(0), PlayerState(0), StatusFlags(0), Outputs(0) { }
|
||||
bool Playlist:1;
|
||||
bool SongID:1;
|
||||
bool Database:1;
|
||||
@@ -63,6 +63,7 @@ namespace MPD
|
||||
bool Consume:1;
|
||||
bool PlayerState:1;
|
||||
bool StatusFlags:1;
|
||||
bool Outputs:1;
|
||||
};
|
||||
|
||||
typedef std::pair<std::string, bool> Output;
|
||||
|
||||
@@ -310,13 +310,11 @@ int main(int argc, char *argv[])
|
||||
wFooter->AddFDCallback(Mpd.GetFD(), StatusbarMPDCallback);
|
||||
MessagesAllowed = 0;
|
||||
UpdateStatusImmediately = 1;
|
||||
# ifdef ENABLE_OUTPUTS
|
||||
myOutputs->FetchList();
|
||||
# endif // ENABLE_OUTPUTS
|
||||
# ifdef ENABLE_VISUALIZER
|
||||
myVisualizer->ResetFD();
|
||||
if (myScreen == myVisualizer)
|
||||
myVisualizer->SetFD();
|
||||
myVisualizer->FindOutputID();
|
||||
# endif // ENABLE_VISUALIZER
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,22 +74,13 @@ void Outputs::EnterPressed()
|
||||
if (w->Current().second)
|
||||
{
|
||||
if (Mpd.DisableOutput(w->Choice()))
|
||||
{
|
||||
ShowMessage("Output \"%s\" disabled", w->Current().first.c_str());
|
||||
w->Current().second = 0;
|
||||
w->Bold(w->Choice(), 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Mpd.EnableOutput(w->Choice()))
|
||||
{
|
||||
ShowMessage("Output \"%s\" enabled", w->Current().first.c_str());
|
||||
w->Current().second = 1;
|
||||
w->Bold(w->Choice(), 1);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Outputs::MouseButtonPressed(MEVENT me)
|
||||
@@ -112,9 +103,11 @@ void Outputs::FetchList()
|
||||
return;
|
||||
MPD::OutputList ol;
|
||||
Mpd.GetOutputs(ol);
|
||||
w->Clear();
|
||||
w->Clear(0);
|
||||
for (MPD::OutputList::const_iterator it = ol.begin(); it != ol.end(); ++it)
|
||||
w->AddOption(*it, it->second);
|
||||
if (myScreen == this)
|
||||
w->Refresh();
|
||||
}
|
||||
|
||||
#endif // ENABLE_OUTPUTS
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include "helpers.h"
|
||||
#include "lyrics.h"
|
||||
#include "media_library.h"
|
||||
#include "outputs.h"
|
||||
#include "playlist.h"
|
||||
#include "playlist_editor.h"
|
||||
#include "search_engine.h"
|
||||
@@ -591,6 +592,12 @@ void NcmpcppStatusChanged(Connection *, StatusChanges changed, void *)
|
||||
*wHeader << clEnd;
|
||||
wHeader->Refresh();
|
||||
}
|
||||
if (changed.Outputs)
|
||||
{
|
||||
# ifdef ENABLE_OUTPUTS
|
||||
myOutputs->FetchList();
|
||||
# endif // ENABLE_OUTPUTS
|
||||
}
|
||||
*wFooter << fmtBoldEnd;
|
||||
wFooter->GotoXY(sx, sy);
|
||||
if (changed.PlayerState || (changed.ElapsedTime && (!Config.new_design || Mpd.GetState() == psPlay)))
|
||||
|
||||
@@ -54,17 +54,7 @@ void Visualizer::Init()
|
||||
itsPlan = fftw_plan_dft_r2c_1d(Samples, itsInput, itsOutput, FFTW_ESTIMATE);
|
||||
# endif // HAVE_FFTW3_H
|
||||
|
||||
itsOutputID = -1;
|
||||
if (!Config.visualizer_output_name.empty())
|
||||
{
|
||||
MPD::OutputList outputs;
|
||||
Mpd.GetOutputs(outputs);
|
||||
for (unsigned i = 0; i < outputs.size(); ++i)
|
||||
if (outputs[i].first == Config.visualizer_output_name)
|
||||
itsOutputID = i;
|
||||
if (itsOutputID == -1)
|
||||
ShowMessage("There is no output named \"%s\"!", Config.visualizer_output_name.c_str());
|
||||
}
|
||||
FindOutputID();
|
||||
|
||||
isInitialized = 1;
|
||||
}
|
||||
@@ -213,5 +203,20 @@ void Visualizer::ResetFD()
|
||||
itsFifo = -1;
|
||||
}
|
||||
|
||||
void Visualizer::FindOutputID()
|
||||
{
|
||||
itsOutputID = -1;
|
||||
if (!Config.visualizer_output_name.empty())
|
||||
{
|
||||
MPD::OutputList outputs;
|
||||
Mpd.GetOutputs(outputs);
|
||||
for (unsigned i = 0; i < outputs.size(); ++i)
|
||||
if (outputs[i].first == Config.visualizer_output_name)
|
||||
itsOutputID = i;
|
||||
if (itsOutputID == -1)
|
||||
ShowMessage("There is no output named \"%s\"!", Config.visualizer_output_name.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
#endif // ENABLE_VISUALIZER
|
||||
|
||||
|
||||
@@ -55,6 +55,7 @@ class Visualizer : public Screen<Window>
|
||||
|
||||
void SetFD();
|
||||
void ResetFD();
|
||||
void FindOutputID();
|
||||
|
||||
protected:
|
||||
virtual void Init();
|
||||
|
||||
Reference in New Issue
Block a user