From e43ea18d29773c32bed4e3596ed2dfb4ec4a446d Mon Sep 17 00:00:00 2001 From: Andrzej Rybczak Date: Tue, 27 Oct 2009 02:15:51 +0100 Subject: [PATCH] provide a way to sync between visualization and sound workaround for http://musicpd.org/mantis/view.php?id=2503 --- doc/config | 10 ++++++++++ doc/ncmpcpp.1 | 3 +++ src/settings.cpp | 7 ++++++- src/settings.h | 1 + src/visualizer.cpp | 23 +++++++++++++++++++++++ src/visualizer.h | 3 +++ 6 files changed, 46 insertions(+), 1 deletion(-) diff --git a/doc/config b/doc/config index 0d5b575a..9eb40bb8 100644 --- a/doc/config +++ b/doc/config @@ -35,6 +35,16 @@ #visualizer_fifo_path = "" # ## +## Note: Below parameter is needed for ncmpcpp +## to determine which output provides data for +## visualizer and thus allow syncing between +## visualization and sound as currently there +## are some problems with it. +## +# +#visualizer_output_name = "" +# +## ## Note: To enable spectrum frequency visualization ## you need to compile ncmpcpp with fftw3 support. ## diff --git a/doc/ncmpcpp.1 b/doc/ncmpcpp.1 index 67e2761c..aaca304d 100644 --- a/doc/ncmpcpp.1 +++ b/doc/ncmpcpp.1 @@ -70,6 +70,9 @@ Set connection timeout to MPD to given value. Default number of seconds to crossfade, if enabled by ncmpcpp. .TP .B visualizer_fifo_path = PATH +Name of output that provides data for visualizer. Needed to keep sound and visualization in sync. +.TP +.B visualizer_output_name = NAME Path to mpd fifo output. This is needed to make music visualizer work (note that output sound format of this fifo has to be 44100:16:1) .TP .B visualizer_type = spectrum/wave diff --git a/src/settings.cpp b/src/settings.cpp index 7bfb5a13..8e757bd3 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -521,11 +521,16 @@ void ReadConfiguration(ncmpcpp_config &conf) conf.mpd_music_dir = v + "/"; } } - if (cl.find("visualizer_fifo_path") != std::string::npos) + else if (cl.find("visualizer_fifo_path") != std::string::npos) { if (!v.empty()) conf.visualizer_fifo_path = v; } + else if (cl.find("visualizer_output_name") != std::string::npos) + { + if (!v.empty()) + conf.visualizer_output_name = v; + } else if (cl.find("mpd_port") != std::string::npos) { if (StrToInt(v)) diff --git a/src/settings.h b/src/settings.h index 74ca029d..01951d9c 100644 --- a/src/settings.h +++ b/src/settings.h @@ -131,6 +131,7 @@ struct ncmpcpp_config std::string mpd_host; std::string mpd_music_dir; std::string visualizer_fifo_path; + std::string visualizer_output_name; std::string empty_tag; std::string song_list_columns_format; std::string song_list_format; diff --git a/src/visualizer.cpp b/src/visualizer.cpp index 0b050471..c5c74cd6 100644 --- a/src/visualizer.cpp +++ b/src/visualizer.cpp @@ -29,6 +29,7 @@ #include #include #include +#include using Global::myScreen; using Global::MainStartY; @@ -53,6 +54,18 @@ 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()); + } + isInitialized = 1; } @@ -72,6 +85,9 @@ void Visualizer::SwitchTo() SetFD(); + itsTimer.tv_sec = 0; + itsTimer.tv_usec = 0; + if (itsFifo >= 0) Global::wFooter->SetTimeout(1000/25); Global::RedrawHeader = 1; @@ -101,6 +117,13 @@ void Visualizer::Update() return; } + if (itsOutputID != -1 && Global::Timer.tv_sec > itsTimer.tv_sec+5) + { + Mpd.DisableOutput(itsOutputID); + Mpd.EnableOutput(itsOutputID); + gettimeofday(&itsTimer, 0); + } + // it supports only PCM in format 44100:16:1 static int16_t buf[Samples]; ssize_t data = read(itsFifo, buf, sizeof(buf)); diff --git a/src/visualizer.h b/src/visualizer.h index be5b12ce..e1c44637 100644 --- a/src/visualizer.h +++ b/src/visualizer.h @@ -65,6 +65,9 @@ class Visualizer : public Screen void DrawFrequencySpectrum(int16_t *, ssize_t); # endif // HAVE_FFTW3_H + int itsOutputID; + timeval itsTimer; + int itsFifo; # ifdef HAVE_FFTW3_H unsigned *itsFreqsMagnitude;