X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=mixer.h;h=64a74e2f13d855d0030a19645cdadf95956b9558;hb=e8918c22dd8cd509d9679d50bfc6bba86661ebb3;hp=3a19d3aaef946f6257a27a9ae060c0cf057306ba;hpb=e2d886719370306464e2c67574bb6eef62a0a64e;p=nageru diff --git a/mixer.h b/mixer.h index 3a19d3a..64a74e2 100644 --- a/mixer.h +++ b/mixer.h @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -136,6 +137,36 @@ public: locut_cutoff_hz = cutoff_hz; } + float get_limiter_threshold_dbfs() + { + return limiter_threshold_dbfs; + } + + float get_compressor_threshold_dbfs() + { + return compressor_threshold_dbfs; + } + + void set_limiter_threshold_dbfs(float threshold_dbfs) + { + limiter_threshold_dbfs = threshold_dbfs; + } + + void set_compressor_threshold_dbfs(float threshold_dbfs) + { + compressor_threshold_dbfs = threshold_dbfs; + } + + void set_limiter_enabled(bool enabled) + { + limiter_enabled = enabled; + } + + void set_compressor_enabled(bool enabled) + { + compressor_enabled = enabled; + } + void reset_meters(); private: @@ -213,7 +244,7 @@ private: audio_level_callback_t audio_level_callback = nullptr; Ebu_r128_proc r128; - // TODO: Implement oversampled peak detection. + Resampler peak_resampler; std::atomic peak{0.0f}; StereoFilter locut; // Default cutoff 150 Hz, 24 dB/oct. @@ -223,8 +254,14 @@ private: StereoCompressor level_compressor; float last_gain_staging_db = 0.0f; + static constexpr float ref_level_dbfs = -14.0f; + StereoCompressor limiter; + std::atomic limiter_threshold_dbfs{ref_level_dbfs + 0.0f}; // 0 dB. + std::atomic limiter_enabled{true}; StereoCompressor compressor; + std::atomic compressor_threshold_dbfs{ref_level_dbfs - 12.0f}; // -12 dB. + std::atomic compressor_enabled{true}; }; extern Mixer *global_mixer;