summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/config2
-rw-r--r--doc/ncmpcpp.15
-rw-r--r--src/help.cpp6
-rw-r--r--src/settings.cpp5
-rw-r--r--src/settings.h1
-rw-r--r--src/visualizer.cpp37
-rw-r--r--src/visualizer.h5
7 files changed, 55 insertions, 6 deletions
diff --git a/doc/config b/doc/config
index f2f559f0..50efa83e 100644
--- a/doc/config
+++ b/doc/config
@@ -34,6 +34,8 @@
#
#visualizer_fifo_path = ""
#
+#visualizer_type = "spectrum" (spectrum/wave)
+#
##### system encoding #####
##
## if you use encoding other than utf8, set it in
diff --git a/doc/ncmpcpp.1 b/doc/ncmpcpp.1
index 2ccef2cf..440c9aa1 100644
--- a/doc/ncmpcpp.1
+++ b/doc/ncmpcpp.1
@@ -66,9 +66,12 @@ Set connection timeout to MPD to given value.
.B mpd_crossfade_time = SECONDS
Default number of seconds to crossfade, if enabled by ncmpcpp.
.TP
-.B fifo_visualizer_path = PATH
+.B visualizer_fifo_path = PATH
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
+Defines default visualizer type.
+.TP
.B system_encoding = ENCODING
If you use encoding other than utf8, set it in order to handle utf8 encoded strings properly.
.TP
diff --git a/src/help.cpp b/src/help.cpp
index 54f42c5f..57890847 100644
--- a/src/help.cpp
+++ b/src/help.cpp
@@ -298,6 +298,12 @@ void Help::GetKeybindings()
# endif // ENABLE_OUTPUTS
+# ifdef ENABLE_VISUALIZER
+ *w << "\n\n " << fmtBold << "Keys - Music visualizer\n -----------------------------------------\n" << fmtBoldEnd;
+ *w << DisplayKeys(Key.Space) << "Toggle visualization type\n";
+# endif // ENABLE_VISUALIZER
+
+
*w << "\n\n " << fmtBold << "Mouse - Global\n -----------------------------------------\n" << fmtBoldEnd;
*w << "\tLeft click on \"Playing/Paused\" " << ": Play/pause\n";
*w << "\tLeft click on progressbar " << ": Go to chosen position in played track\n";
diff --git a/src/settings.cpp b/src/settings.cpp
index 9639b534..2bcdeecb 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -306,6 +306,7 @@ void DefaultConfiguration(ncmpcpp_config &conf)
conf.ask_before_clearing_main_playlist = false;
conf.mouse_support = true;
conf.new_design = false;
+ conf.visualizer_use_wave = false;
conf.set_window_title = true;
conf.mpd_port = 6600;
conf.mpd_connection_timeout = 15;
@@ -789,6 +790,10 @@ void ReadConfiguration(ncmpcpp_config &conf)
{
conf.ask_before_clearing_main_playlist = v == "yes";
}
+ else if (cl.find("visualizer_type") != std::string::npos)
+ {
+ conf.visualizer_use_wave = v == "wave";
+ }
else if (cl.find("mouse_support") != std::string::npos)
{
conf.mouse_support = v == "yes";
diff --git a/src/settings.h b/src/settings.h
index 86c9e5ba..2b755eb3 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -203,6 +203,7 @@ struct ncmpcpp_config
bool ask_before_clearing_main_playlist;
bool mouse_support;
bool new_design;
+ bool visualizer_use_wave;
int mpd_port;
int mpd_connection_timeout;
diff --git a/src/visualizer.cpp b/src/visualizer.cpp
index 8e901254..b4f2fcb5 100644
--- a/src/visualizer.cpp
+++ b/src/visualizer.cpp
@@ -102,6 +102,37 @@ void Visualizer::Update()
if (data < 0) // no data available in fifo
return;
+ w->Clear(0);
+ Config.visualizer_use_wave ? DrawSoundWave(buf, data) : DrawFrequencySpectrum(buf, data);
+ w->Refresh();
+}
+
+void Visualizer::SpacePressed()
+{
+ Config.visualizer_use_wave = !Config.visualizer_use_wave;
+ ShowMessage("Visualization type: %s", Config.visualizer_use_wave ? "Sound wave" : "Frequency spectrum");
+}
+
+void Visualizer::DrawSoundWave(int16_t *buf, ssize_t data)
+{
+ const int samples_per_col = data/sizeof(int16_t)/COLS;
+ const int half_height = MainHeight/2;
+ *w << fmtAltCharset;
+ for (int i = 0; i < COLS; ++i)
+ {
+ double point_pos = 0;
+ for (int j = 0; j < samples_per_col; ++j)
+ point_pos += buf[i*samples_per_col+j];
+ point_pos /= samples_per_col;
+ point_pos /= std::numeric_limits<int16_t>::max();
+ point_pos *= half_height;
+ *w << XY(i, half_height+point_pos) << '`';
+ }
+ *w << fmtAltCharsetEnd;
+}
+
+void Visualizer::DrawFrequencySpectrum(int16_t *buf, ssize_t data)
+{
// zero old values
std::fill(buf+data/sizeof(int16_t), buf+Samples, 0);
for (unsigned i = 0; i < Samples; ++i)
@@ -113,17 +144,15 @@ void Visualizer::Update()
for (unsigned i = 0; i < FFTResults; ++i)
itsFreqsMagnitude[i] = sqrt(itsOutput[i][0]*itsOutput[i][0] + itsOutput[i][1]*itsOutput[i][1])/1e5*LINES/5;
- w->Clear(0);
const int freqs_per_col = FFTResults/COLS /* cut bandwidth a little to achieve better look */ * 4/5;
for (int i = 0; i < COLS; ++i)
{
size_t bar_height = 0;
for (int j = 0; j < freqs_per_col; ++j)
bar_height += itsFreqsMagnitude[i*freqs_per_col+j];
- bar_height = std::min(bar_height/freqs_per_col, Global::MainHeight);
- mvwvline(w->Raw(), Global::MainHeight-bar_height, i, 0, bar_height);
+ bar_height = std::min(bar_height/freqs_per_col, MainHeight);
+ mvwvline(w->Raw(), MainHeight-bar_height, i, 0, bar_height);
}
- w->Refresh();
}
void Visualizer::SetFD()
diff --git a/src/visualizer.h b/src/visualizer.h
index cc887720..50f5ad30 100644
--- a/src/visualizer.h
+++ b/src/visualizer.h
@@ -44,7 +44,7 @@ class Visualizer : public Screen<Window>
virtual void Scroll(Where, const int *) { }
virtual void EnterPressed() { }
- virtual void SpacePressed() { }
+ virtual void SpacePressed();
virtual void MouseButtonPressed(MEVENT) { }
virtual NCurses::List *GetList() { return 0; }
@@ -58,6 +58,9 @@ class Visualizer : public Screen<Window>
virtual void Init();
private:
+ void DrawSoundWave(int16_t *, ssize_t);
+ void DrawFrequencySpectrum(int16_t *, ssize_t);
+
int itsFifo;
unsigned *itsFreqsMagnitude;
double *itsInput;