Set sizes of samples read properly for stereo visualizers

This commit is contained in:
Andrzej Rybczak
2020-12-14 13:35:04 +01:00
parent 8237bcef27
commit b8983b93ec
5 changed files with 51 additions and 50 deletions

View File

@@ -105,13 +105,13 @@
# #
#visualizer_spectrum_smooth_look = yes #visualizer_spectrum_smooth_look = yes
# #
## A value between 1 and 7 inclusive. Specifying a larger value makes the ## A value between 1 and 5 inclusive. Specifying a larger value makes the
## visualizer look at a larger slice of time, which results in less jumpy ## visualizer look at a larger slice of time, which results in less jumpy
## visualizer output. ## visualizer output.
# #
#visualizer_spectrum_dft_size = 4 #visualizer_spectrum_dft_size = 3
# #
#visualizer_spectrum_gain = 20 #visualizer_spectrum_gain = 10
# #
## Left-most frequency of visualizer in Hz, must be less than HZ MAX ## Left-most frequency of visualizer in Hz, must be less than HZ MAX
# #

View File

@@ -107,7 +107,7 @@ Automatically scale visualizer size.
For spectrum visualizer, use unicode block characters for a smoother, more continuous look. This will override the visualizer_look option. With transparent terminals and visualizer_in_stereo set, artifacts may be visible on the bottom half of the visualization. For spectrum visualizer, use unicode block characters for a smoother, more continuous look. This will override the visualizer_look option. With transparent terminals and visualizer_in_stereo set, artifacts may be visible on the bottom half of the visualization.
.TP .TP
.B visualizer_spectrum_dft_size = NUMBER .B visualizer_spectrum_dft_size = NUMBER
For spectrum visualizer, a value between 1 and 7 inclusive. Specifying a larger value makes the visualizer look at a larger slice of time, which results in less jumpy visualizer output. For spectrum visualizer, a value between 1 and 5 inclusive. Specifying a larger value makes the visualizer look at a larger slice of time, which results in less jumpy visualizer output.
.TP .TP
.B visualizer_spectrum_gain = dB .B visualizer_spectrum_gain = dB
Gain for spectrum visualizer in dB, larger/smaller values shift bars up/down. Gain for spectrum visualizer in dB, larger/smaller values shift bars up/down.

View File

@@ -52,7 +52,7 @@ Visualizer *myVisualizer;
namespace { namespace {
const int fps = 30; const size_t fps = 30;
const uint32_t MIN_DFT_SIZE = 14; const uint32_t MIN_DFT_SIZE = 14;
// toColor: a scaling function for coloring. For numbers 0 to max this function // toColor: a scaling function for coloring. For numbers 0 to max this function
@@ -83,16 +83,7 @@ Visualizer::Visualizer()
#endif #endif
{ {
ResetFD(); ResetFD();
# ifdef HAVE_FFTW3_H SetVisualizationType();
m_read_samples = DFT_NONZERO_SIZE;
# else
m_read_samples = 44100 / fps;
# endif // HAVE_FFTW3_H
if (Config.visualizer_in_stereo)
m_read_samples *= 2;
m_sample_buffer.resize(m_read_samples, 0);
m_temp_sample_buffer.resize(m_read_samples, 0);
# ifdef HAVE_FFTW3_H # ifdef HAVE_FFTW3_H
m_fftw_results = DFT_TOTAL_SIZE/2+1; m_fftw_results = DFT_TOTAL_SIZE/2+1;
m_freq_magnitudes.resize(m_fftw_results); m_freq_magnitudes.resize(m_fftw_results);
@@ -166,39 +157,8 @@ void Visualizer::update()
m_timer = Global::Timer; m_timer = Global::Timer;
} }
void (Visualizer::*draw)(int16_t *, ssize_t, size_t, size_t); if (Config.visualizer_autoscale)
void (Visualizer::*drawStereo)(int16_t *, int16_t *, ssize_t, size_t);
# ifdef HAVE_FFTW3_H
if (Config.visualizer_type == VisualizerType::Spectrum)
{ {
m_read_samples = DFT_NONZERO_SIZE;
draw = &Visualizer::DrawFrequencySpectrum;
drawStereo = &Visualizer::DrawFrequencySpectrumStereo;
}
else
# endif // HAVE_FFTW3_H
if (Config.visualizer_type == VisualizerType::WaveFilled)
{
m_read_samples = 44100 / fps;
draw = &Visualizer::DrawSoundWaveFill;
drawStereo = &Visualizer::DrawSoundWaveFillStereo;
}
else if (Config.visualizer_type == VisualizerType::Ellipse)
{
m_read_samples = 44100 / fps;
draw = &Visualizer::DrawSoundEllipse;
drawStereo = &Visualizer::DrawSoundEllipseStereo;
}
else
{
m_read_samples = 44100 / fps;
draw = &Visualizer::DrawSoundWave;
drawStereo = &Visualizer::DrawSoundWaveStereo;
}
m_sample_buffer.resize(m_read_samples);
m_temp_sample_buffer.resize(m_read_samples);
if (Config.visualizer_autoscale) {
m_auto_scale_multiplier += 1.0/fps; m_auto_scale_multiplier += 1.0/fps;
for (auto &sample : m_sample_buffer) for (auto &sample : m_sample_buffer)
{ {
@@ -634,6 +594,41 @@ void Visualizer::GenLogspace()
} }
#endif // HAVE_FFTW3_H #endif // HAVE_FFTW3_H
void Visualizer::SetVisualizationType()
{
switch (Config.visualizer_type)
{
case VisualizerType::Wave:
m_read_samples = std::max(44100 / fps, w.getWidth());
draw = &Visualizer::DrawSoundWave;
drawStereo = &Visualizer::DrawSoundWaveStereo;
break;
case VisualizerType::WaveFilled:
m_read_samples = std::max(44100 / fps, w.getWidth());
draw = &Visualizer::DrawSoundWaveFill;
drawStereo = &Visualizer::DrawSoundWaveFillStereo;
break;
# ifdef HAVE_FFTW3_H
case VisualizerType::Spectrum:
m_read_samples = DFT_NONZERO_SIZE;
draw = &Visualizer::DrawFrequencySpectrum;
drawStereo = &Visualizer::DrawFrequencySpectrumStereo;
break;
# endif // HAVE_FFTW3_H
case VisualizerType::Ellipse:
m_read_samples = 44100 / fps;
draw = &Visualizer::DrawSoundEllipse;
drawStereo = &Visualizer::DrawSoundEllipseStereo;
break;
}
if (Config.visualizer_in_stereo)
m_read_samples *= 2;
m_sample_buffer.resize(m_read_samples);
m_temp_sample_buffer.resize(m_read_samples);
std::fill(m_sample_buffer.begin(), m_sample_buffer.end(), 0);
std::fill(m_temp_sample_buffer.begin(), m_temp_sample_buffer.end(), 0);
}
/**********************************************************************/ /**********************************************************************/
void Visualizer::Clear() void Visualizer::Clear()
@@ -665,6 +660,7 @@ void Visualizer::ToggleVisualizationType()
Config.visualizer_type = VisualizerType::Wave; Config.visualizer_type = VisualizerType::Wave;
break; break;
} }
SetVisualizationType();
Statusbar::printf("Visualization type: %1%", Config.visualizer_type); Statusbar::printf("Visualization type: %1%", Config.visualizer_type);
} }

View File

@@ -77,6 +77,11 @@ private:
double Interpolate(size_t, size_t); double Interpolate(size_t, size_t);
# endif // HAVE_FFTW3_H # endif // HAVE_FFTW3_H
void SetVisualizationType();
void (Visualizer::*draw)(int16_t *, ssize_t, size_t, size_t);
void (Visualizer::*drawStereo)(int16_t *, int16_t *, ssize_t, size_t);
int m_output_id; int m_output_id;
boost::posix_time::ptime m_timer; boost::posix_time::ptime m_timer;

View File

@@ -296,13 +296,13 @@ bool Configuration::read(const std::vector<std::string> &config_paths, bool igno
p.add("visualizer_autoscale", &visualizer_autoscale, "no", yes_no); p.add("visualizer_autoscale", &visualizer_autoscale, "no", yes_no);
p.add("visualizer_spectrum_smooth_look", &visualizer_spectrum_smooth_look, "yes", yes_no); p.add("visualizer_spectrum_smooth_look", &visualizer_spectrum_smooth_look, "yes", yes_no);
p.add("visualizer_spectrum_dft_size", &visualizer_spectrum_dft_size, p.add("visualizer_spectrum_dft_size", &visualizer_spectrum_dft_size,
"4", [](std::string v) { "3", [](std::string v) {
uint32_t result = verbose_lexical_cast<uint32_t>(v); uint32_t result = verbose_lexical_cast<uint32_t>(v);
boundsCheck<uint32_t>(result, 1, 7); boundsCheck<uint32_t>(result, 1, 5);
return result + 11; return result + 11;
}); });
p.add("visualizer_spectrum_gain", &visualizer_spectrum_gain, p.add("visualizer_spectrum_gain", &visualizer_spectrum_gain,
"20", [](std::string v) { "10", [](std::string v) {
auto result = verbose_lexical_cast<double>(v); auto result = verbose_lexical_cast<double>(v);
boundsCheck<double>(result, 0, 100); boundsCheck<double>(result, 0, 100);
return result; return result;