visualizer: use std::vector for samples
This commit is contained in:
@@ -40,6 +40,8 @@
|
|||||||
#include "status.h"
|
#include "status.h"
|
||||||
#include "enums.h"
|
#include "enums.h"
|
||||||
|
|
||||||
|
using Samples = std::vector<int16_t>;
|
||||||
|
|
||||||
using Global::MainStartY;
|
using Global::MainStartY;
|
||||||
using Global::MainHeight;
|
using Global::MainHeight;
|
||||||
|
|
||||||
@@ -108,8 +110,9 @@ void Visualizer::update()
|
|||||||
|
|
||||||
// PCM in format 44100:16:1 (for mono visualization) and
|
// PCM in format 44100:16:1 (for mono visualization) and
|
||||||
// 44100:16:2 (for stereo visualization) is supported.
|
// 44100:16:2 (for stereo visualization) is supported.
|
||||||
int16_t buf[m_samples];
|
Samples samples(m_samples);
|
||||||
ssize_t data = read(m_fifo, buf, sizeof(int16_t) * m_samples);
|
ssize_t data = read(m_fifo, samples.data(),
|
||||||
|
samples.size() * sizeof(Samples::value_type));
|
||||||
if (data < 0) // no data available in fifo
|
if (data < 0) // no data available in fifo
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -149,24 +152,26 @@ void Visualizer::update()
|
|||||||
|
|
||||||
const ssize_t samples_read = data/sizeof(int16_t);
|
const ssize_t samples_read = data/sizeof(int16_t);
|
||||||
m_auto_scale_multiplier += 1.0/fps;
|
m_auto_scale_multiplier += 1.0/fps;
|
||||||
std::for_each(buf, buf+samples_read, [this](int16_t &sample) {
|
for (auto &sample : samples)
|
||||||
double scale = std::numeric_limits<int16_t>::min();
|
{
|
||||||
scale /= sample;
|
double scale = std::numeric_limits<int16_t>::min();
|
||||||
scale = fabs(scale);
|
scale /= sample;
|
||||||
if (scale < m_auto_scale_multiplier)
|
scale = fabs(scale);
|
||||||
m_auto_scale_multiplier = 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;
|
for (auto &sample : samples)
|
||||||
if (m_auto_scale_multiplier <= 50.0) // limit the auto scale
|
{
|
||||||
tmp *= m_auto_scale_multiplier;
|
int32_t tmp = sample;
|
||||||
if (tmp < std::numeric_limits<int16_t>::min())
|
if (m_auto_scale_multiplier <= 50.0) // limit the auto scale
|
||||||
sample = std::numeric_limits<int16_t>::min();
|
tmp *= m_auto_scale_multiplier;
|
||||||
else if (tmp > std::numeric_limits<int16_t>::max())
|
if (tmp < std::numeric_limits<int16_t>::min())
|
||||||
sample = std::numeric_limits<int16_t>::max();
|
sample = std::numeric_limits<int16_t>::min();
|
||||||
else
|
else if (tmp > std::numeric_limits<int16_t>::max())
|
||||||
sample = tmp;
|
sample = std::numeric_limits<int16_t>::max();
|
||||||
});
|
else
|
||||||
|
sample = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
w.clear();
|
w.clear();
|
||||||
if (Config.visualizer_in_stereo)
|
if (Config.visualizer_in_stereo)
|
||||||
@@ -175,8 +180,8 @@ void Visualizer::update()
|
|||||||
int16_t buf_left[chan_samples], buf_right[chan_samples];
|
int16_t buf_left[chan_samples], buf_right[chan_samples];
|
||||||
for (ssize_t i = 0, j = 0; i < samples_read; i += 2, ++j)
|
for (ssize_t i = 0, j = 0; i < samples_read; i += 2, ++j)
|
||||||
{
|
{
|
||||||
buf_left[j] = buf[i];
|
buf_left[j] = samples[i];
|
||||||
buf_right[j] = buf[i+1];
|
buf_right[j] = samples[i+1];
|
||||||
}
|
}
|
||||||
size_t half_height = w.getHeight()/2;
|
size_t half_height = w.getHeight()/2;
|
||||||
|
|
||||||
@@ -184,7 +189,7 @@ void Visualizer::update()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
(this->*draw)(buf, samples_read, 0, w.getHeight());
|
(this->*draw)(samples.data(), samples_read, 0, w.getHeight());
|
||||||
}
|
}
|
||||||
w.refresh();
|
w.refresh();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user