X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=audio_mixer.h;h=c332671e0bebd6f385d66b8ddc40fd426fd765ad;hb=1062c5403b57859c219558e736564a3d0bbecfd5;hp=29016eb9ea7e07a68257bb8c02b6617edc4c4b6d;hpb=2140fc18714d6e9ac2b0aca51d9b7ff986245c08;p=nageru diff --git a/audio_mixer.h b/audio_mixer.h index 29016eb..c332671 100644 --- a/audio_mixer.h +++ b/audio_mixer.h @@ -52,6 +52,13 @@ struct DeviceInfo { unsigned num_channels; }; +enum EQBand { + EQ_BAND_BASS = 0, + EQ_BAND_MID, + EQ_BAND_TREBLE, + NUM_EQ_BANDS +}; + static inline uint64_t DeviceSpec_to_key(const DeviceSpec &device_spec) { return (uint64_t(device_spec.type) << 32) | device_spec.index; @@ -111,6 +118,12 @@ public: return locut_enabled[bus]; } + void set_eq(unsigned bus_index, EQBand band, float db_gain) + { + assert(band >= 0 && band < NUM_EQ_BANDS); + eq_level_db[bus_index][band] = db_gain; + } + float get_limiter_threshold_dbfs() const { return limiter_threshold_dbfs; @@ -201,6 +214,8 @@ public: return final_makeup_gain_auto; } + void reset_peak(unsigned bus_index); + struct BusLevel { float current_level_dbfs[2]; // Digital peak of last frame, left and right. float peak_level_dbfs[2]; // Digital peak with hold, left and right. @@ -237,6 +252,7 @@ private: void reset_resampler_mutex_held(DeviceSpec device_spec); void reset_alsa_mutex_held(DeviceSpec device_spec); std::map get_devices_mutex_held() const; + void apply_eq(unsigned bus_index, std::vector *samples_bus); void update_meters(const std::vector &samples); void add_bus_to_master(unsigned bus_index, const std::vector &samples_bus, std::vector *samples_out); void measure_bus_levels(unsigned bus_index, const std::vector &left, const std::vector &right); @@ -255,6 +271,7 @@ private: std::atomic locut_cutoff_hz; StereoFilter locut[MAX_BUSES]; // Default cutoff 120 Hz, 24 dB/oct. std::atomic locut_enabled[MAX_BUSES]; + StereoFilter eq[MAX_BUSES][NUM_EQ_BANDS]; // The one for EQBand::MID isn't actually used (see comments in apply_eq()). // First compressor; takes us up to about -12 dBFS. mutable std::mutex compressor_mutex; @@ -280,7 +297,7 @@ private: float last_peak = 0.0f; float age_seconds = 0.0f; // Time since "last_peak" was set. }; - PeakHistory peak_history[MAX_BUSES][2]; // Separate for each channel. + PeakHistory peak_history[MAX_BUSES][2]; // Separate for each channel. Under audio_mutex. double final_makeup_gain = 1.0; // Under compressor_mutex. Read/write by the user. Note: Not in dB, we want the numeric precision so that we can change it slowly. bool final_makeup_gain_auto = true; // Under compressor_mutex. @@ -288,6 +305,7 @@ private: InputMapping input_mapping; // Under audio_mutex. std::atomic fader_volume_db[MAX_BUSES] {{ 0.0f }}; float last_fader_volume_db[MAX_BUSES] { 0.0f }; // Under audio_mutex. + std::atomic eq_level_db[MAX_BUSES][NUM_EQ_BANDS] {{{ 0.0f }}}; audio_level_callback_t audio_level_callback = nullptr; mutable std::mutex audio_measure_mutex;