provide a way to sync between visualization and sound
workaround for http://musicpd.org/mantis/view.php?id=2503
This commit is contained in:
10
doc/config
10
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.
|
||||
##
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include <cstring>
|
||||
#include <fstream>
|
||||
#include <fcntl.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
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));
|
||||
|
||||
@@ -65,6 +65,9 @@ class Visualizer : public Screen<Window>
|
||||
void DrawFrequencySpectrum(int16_t *, ssize_t);
|
||||
# endif // HAVE_FFTW3_H
|
||||
|
||||
int itsOutputID;
|
||||
timeval itsTimer;
|
||||
|
||||
int itsFifo;
|
||||
# ifdef HAVE_FFTW3_H
|
||||
unsigned *itsFreqsMagnitude;
|
||||
|
||||
Reference in New Issue
Block a user