From d2189aa0f4bf2ca7e2ad7aca81da2e86eaaaee7d Mon Sep 17 00:00:00 2001 From: Andrzej Rybczak Date: Tue, 1 Sep 2015 21:43:58 +0200 Subject: [PATCH] visualizer: scale automatically if multiplier is 1 --- NEWS | 1 + src/status.cpp | 3 +++ src/visualizer.cpp | 24 ++++++++++++++++++++++-- src/visualizer.h | 2 ++ 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 931471d2..91ddd1eb 100644 --- a/NEWS +++ b/NEWS @@ -29,6 +29,7 @@ ncmpcpp-0.7 (????-??-??) * Support for selecting found items was added (bound to Ctrl-_ by default). * Tracks in media library are now properly sorted for track numbers greater than 99. * Value of 'visualizer_sync_interval' is now restricted to be greater than 9. +* Output of the visualizer now scales automatically as long as 'visualizer_sample_multiplier' is set to 1. ncmpcpp-0.6.5 (2015-07-05) diff --git a/src/status.cpp b/src/status.cpp index 12c09ad1..7c9f5352 100644 --- a/src/status.cpp +++ b/src/status.cpp @@ -526,6 +526,9 @@ void Status::Changes::songID(int song_id) playing_song_scroll_begin = 0; first_line_scroll_begin = 0; second_line_scroll_begin = 0; +# ifdef ENABLE_VISUALIZER + myVisualizer->ResetAutoScaleMultiplier(); +# endif // ENABLE_VISUALIZER if (m_player_state != MPD::psStop) { auto &pl = myPlaylist->main(); diff --git a/src/visualizer.cpp b/src/visualizer.cpp index 2ba53ad7..6d10d367 100644 --- a/src/visualizer.cpp +++ b/src/visualizer.cpp @@ -148,8 +148,23 @@ void Visualizer::update() } const ssize_t samples_read = data/sizeof(int16_t); - std::for_each(buf, buf+samples_read, [](int16_t &sample) { - int32_t tmp = sample * Config.visualizer_sample_multiplier; + if (Config.visualizer_sample_multiplier == 1.0) + { + m_auto_scale_multiplier += 1.0/fps; + std::for_each(buf, buf+samples_read, [this](int16_t &sample) { + double scale = std::numeric_limits::min(); + scale /= sample; + scale = fabs(scale); + if (scale < m_auto_scale_multiplier) + m_auto_scale_multiplier = scale; + }); + } + std::for_each(buf, buf+samples_read, [this](int16_t &sample) { + int32_t tmp = sample; + if (Config.visualizer_sample_multiplier != 1.0) + tmp *= Config.visualizer_sample_multiplier; + else if (m_auto_scale_multiplier <= 50.0) // limit the auto scale + tmp *= m_auto_scale_multiplier; if (tmp < std::numeric_limits::min()) sample = std::numeric_limits::min(); else if (tmp > std::numeric_limits::max()) @@ -474,6 +489,11 @@ void Visualizer::FindOutputID() } } +void Visualizer::ResetAutoScaleMultiplier() +{ + m_auto_scale_multiplier = std::numeric_limits::infinity(); +} + #endif // ENABLE_VISUALIZER /* vim: set tabstop=4 softtabstop=4 shiftwidth=4 noexpandtab : */ diff --git a/src/visualizer.h b/src/visualizer.h index 48fd4d5f..8baf608a 100644 --- a/src/visualizer.h +++ b/src/visualizer.h @@ -60,6 +60,7 @@ struct Visualizer: Screen, Tabbable void SetFD(); void ResetFD(); void FindOutputID(); + void ResetAutoScaleMultiplier(); private: void DrawSoundWave(int16_t *, ssize_t, size_t, size_t); @@ -78,6 +79,7 @@ private: int m_fifo; size_t m_samples; + double m_auto_scale_multiplier; # ifdef HAVE_FFTW3_H size_t m_fftw_results; double *m_fftw_input;