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