X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=mixer.h;h=3a19d3aaef946f6257a27a9ae060c0cf057306ba;hb=e2d886719370306464e2c67574bb6eef62a0a64e;hp=d7f50cf61baf891c13c9cab3c201f40fed57694c;hpb=4ed1495550e603bfb7584e1b1b9a0c74e57de223;p=nageru diff --git a/mixer.h b/mixer.h index d7f50cf..3a19d3a 100644 --- a/mixer.h +++ b/mixer.h @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -26,9 +27,11 @@ #include "pbo_frame_allocator.h" #include "ref_counted_frame.h" #include "ref_counted_gl_sync.h" -#include "resampler.h" +#include "resampling_queue.h" #include "theme.h" #include "timebase.h" +#include "stereocompressor.h" +#include "filter.h" class H264Encoder; class QSurface; @@ -95,7 +98,9 @@ public: output_channel[output].set_frame_ready_callback(callback); } - typedef std::function audio_level_callback_t; + typedef std::function audio_level_callback_t; void set_audio_level_callback(audio_level_callback_t callback) { audio_level_callback = callback; @@ -126,6 +131,13 @@ public: theme->set_wb(channel, r, g, b); } + void set_locut_cutoff(float cutoff_hz) + { + locut_cutoff_hz = cutoff_hz; + } + + void reset_meters(); + private: void bm_frame(unsigned card_index, uint16_t timecode, FrameAllocator::Frame video_frame, size_t video_offset, uint16_t video_format, @@ -161,16 +173,15 @@ private: QSurface *surface; QOpenGLContext *context; - bool new_data_ready = false; // Whether new_frame and new_frame_audio contains anything. + bool new_data_ready = false; // Whether new_frame contains anything. bool should_quit = false; RefCountedFrame new_frame; GLsync new_data_ready_fence; // Whether new_frame is ready for rendering. - std::vector new_frame_audio; std::condition_variable new_data_ready_changed; // Set whenever new_data_ready is changed. unsigned dropped_frames = 0; // Before new_frame. std::mutex audio_mutex; - std::unique_ptr resampler; // Under audio_mutex. + std::unique_ptr resampling_queue; // Under audio_mutex. int last_timecode = -1; // Unwrapped. }; CaptureCard cards[MAX_CARDS]; // protected by @@ -203,7 +214,17 @@ private: Ebu_r128_proc r128; // TODO: Implement oversampled peak detection. - float peak = 0.0f; + std::atomic peak{0.0f}; + + StereoFilter locut; // Default cutoff 150 Hz, 24 dB/oct. + std::atomic locut_cutoff_hz; + + // First compressor; takes us up to about -12 dBFS. + StereoCompressor level_compressor; + float last_gain_staging_db = 0.0f; + + StereoCompressor limiter; + StereoCompressor compressor; }; extern Mixer *global_mixer;