Commit e855bd54 authored by Stefan Westerfeld's avatar Stefan Westerfeld

Implement limiter flush for handling buffered data remaining at eof.

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent f0dc1fb8
possible improvements:
- dynamic bit strength
limiter:
- flush
......@@ -97,3 +97,21 @@ Limiter::debug_scale (float scale)
debug_scale_samples++;
}
vector<float>
Limiter::flush()
{
vector<float> out;
vector<float> zblock (1024 * n_channels);
size_t todo = buffer.size();
while (todo > 0)
{
vector<float> block = process (zblock);
if (block.size() > todo)
block.resize (todo);
out.insert (out.end(), block.begin(), block.end());
todo -= block.size();
}
return out;
}
......@@ -13,6 +13,7 @@ class Limiter
uint block_size = 0;
uint n_channels = 0;
uint sample_rate = 0;
size_t buffered_frames = 0;
std::vector<float> buffer;
void process_block (const float *in, float *out);
......@@ -25,6 +26,7 @@ public:
void set_ceiling (float ceiling);
std::vector<float> process (const std::vector<float>& samples);
std::vector<float> flush();
};
#endif /* AUDIOWMARK_LIMITER_HH */
......@@ -69,7 +69,10 @@ impulses()
in_all.insert (in_all.end(), in_samples.begin(), in_samples.end());
out_all.insert (out_all.end(), out_samples.begin(), out_samples.end());
}
for (size_t i = 0; i < min (in_all.size(), out_all.size()); i += 2)
vector<float> out_samples = limiter.flush();
out_all.insert (out_all.end(), out_samples.begin(), out_samples.end());
assert (in_all.size() == out_all.size());
for (size_t i = 0; i < out_all.size(); i += 2)
{
assert (out_all[i] == out_all[i + 1]); /* stereo */
printf ("%f %f\n", in_all[i], out_all[i]);
......@@ -114,4 +117,6 @@ main (int argc, char **argv)
out.write_frames (out_samples);
}
while (in_samples.size());
out.write_frames (limiter.flush());
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment