visualizer: scale automatically if multiplier is 1

This commit is contained in:
Andrzej Rybczak
2015-09-01 21:43:58 +02:00
parent dbe655d159
commit d2189aa0f4
4 changed files with 28 additions and 2 deletions

View File

@@ -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();

View File

@@ -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<int16_t>::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<int16_t>::min())
sample = std::numeric_limits<int16_t>::min();
else if (tmp > std::numeric_limits<int16_t>::max())
@@ -474,6 +489,11 @@ void Visualizer::FindOutputID()
}
}
void Visualizer::ResetAutoScaleMultiplier()
{
m_auto_scale_multiplier = std::numeric_limits<double>::infinity();
}
#endif // ENABLE_VISUALIZER
/* vim: set tabstop=4 softtabstop=4 shiftwidth=4 noexpandtab : */

View File

@@ -60,6 +60,7 @@ struct Visualizer: Screen<NC::Window>, 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;