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: possible improvements:
- dynamic bit strength - dynamic bit strength
limiter:
- flush
...@@ -97,3 +97,21 @@ Limiter::debug_scale (float scale) ...@@ -97,3 +97,21 @@ Limiter::debug_scale (float scale)
debug_scale_samples++; 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 ...@@ -13,6 +13,7 @@ class Limiter
uint block_size = 0; uint block_size = 0;
uint n_channels = 0; uint n_channels = 0;
uint sample_rate = 0; uint sample_rate = 0;
size_t buffered_frames = 0;
std::vector<float> buffer; std::vector<float> buffer;
void process_block (const float *in, float *out); void process_block (const float *in, float *out);
...@@ -25,6 +26,7 @@ public: ...@@ -25,6 +26,7 @@ public:
void set_ceiling (float ceiling); void set_ceiling (float ceiling);
std::vector<float> process (const std::vector<float>& samples); std::vector<float> process (const std::vector<float>& samples);
std::vector<float> flush();
}; };
#endif /* AUDIOWMARK_LIMITER_HH */ #endif /* AUDIOWMARK_LIMITER_HH */
...@@ -69,7 +69,10 @@ impulses() ...@@ -69,7 +69,10 @@ impulses()
in_all.insert (in_all.end(), in_samples.begin(), in_samples.end()); in_all.insert (in_all.end(), in_samples.begin(), in_samples.end());
out_all.insert (out_all.end(), out_samples.begin(), out_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 */ assert (out_all[i] == out_all[i + 1]); /* stereo */
printf ("%f %f\n", in_all[i], out_all[i]); printf ("%f %f\n", in_all[i], out_all[i]);
...@@ -114,4 +117,6 @@ main (int argc, char **argv) ...@@ -114,4 +117,6 @@ main (int argc, char **argv)
out.write_frames (out_samples); out.write_frames (out_samples);
} }
while (in_samples.size()); 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