add event handler for MPD_IDLE_OUTPUT notification

This commit is contained in:
Andrzej Rybczak
2009-10-27 02:30:28 +01:00
parent e43ea18d29
commit 95ce4065ae
7 changed files with 36 additions and 25 deletions

View File

@@ -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)

View File

@@ -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;

View File

@@ -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
}
}

View File

@@ -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

View File

@@ -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)))

View File

@@ -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

View File

@@ -55,6 +55,7 @@ class Visualizer : public Screen<Window>
void SetFD();
void ResetFD();
void FindOutputID();
protected:
virtual void Init();