From 95ce4065aea8bd1731b068ce30a119e4647ad03c Mon Sep 17 00:00:00 2001 From: Andrzej Rybczak Date: Tue, 27 Oct 2009 02:30:28 +0100 Subject: [PATCH] add event handler for MPD_IDLE_OUTPUT notification --- src/mpdpp.cpp | 6 ++++++ src/mpdpp.h | 3 ++- src/ncmpcpp.cpp | 4 +--- src/outputs.cpp | 13 +++---------- src/status.cpp | 7 +++++++ src/visualizer.cpp | 27 ++++++++++++++++----------- src/visualizer.h | 1 + 7 files changed, 36 insertions(+), 25 deletions(-) diff --git a/src/mpdpp.cpp b/src/mpdpp.cpp index 43a3e73a..52a70c19 100644 --- a/src/mpdpp.cpp +++ b/src/mpdpp.cpp @@ -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) diff --git a/src/mpdpp.h b/src/mpdpp.h index 9b72b67a..1d01b65c 100644 --- a/src/mpdpp.h +++ b/src/mpdpp.h @@ -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 Output; diff --git a/src/ncmpcpp.cpp b/src/ncmpcpp.cpp index a64fb4c0..ad2ae697 100644 --- a/src/ncmpcpp.cpp +++ b/src/ncmpcpp.cpp @@ -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 } } diff --git a/src/outputs.cpp b/src/outputs.cpp index bef53feb..44daa39a 100644 --- a/src/outputs.cpp +++ b/src/outputs.cpp @@ -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 diff --git a/src/status.cpp b/src/status.cpp index 3948a364..c59b265a 100644 --- a/src/status.cpp +++ b/src/status.cpp @@ -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))) diff --git a/src/visualizer.cpp b/src/visualizer.cpp index c5c74cd6..c0487f23 100644 --- a/src/visualizer.cpp +++ b/src/visualizer.cpp @@ -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 diff --git a/src/visualizer.h b/src/visualizer.h index e1c44637..64e51d19 100644 --- a/src/visualizer.h +++ b/src/visualizer.h @@ -55,6 +55,7 @@ class Visualizer : public Screen void SetFD(); void ResetFD(); + void FindOutputID(); protected: virtual void Init();