X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=audio_mixer.h;h=42aa92a70b30ac9e0ad1d5901abd6b003b138472;hb=3a6cd1156318a52fd8575f9fa39d7b37f3f3b16f;hp=88c2f880cac0fee500d087abec37d1ff9eed1230;hpb=c3a08ff6100840205d295a58d6bf340aa20afde0;p=nageru diff --git a/audio_mixer.h b/audio_mixer.h index 88c2f88..42aa92a 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; @@ -101,6 +108,11 @@ public: locut_cutoff_hz = cutoff_hz; } + float get_locut_cutoff() const + { + return locut_cutoff_hz; + } + void set_locut_enabled(unsigned bus, bool enabled) { locut_enabled[bus] = enabled; @@ -111,6 +123,18 @@ 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_eq(unsigned bus_index, EQBand band) const + { + assert(band >= 0 && band < NUM_EQ_BANDS); + return eq_level_db[bus_index][band]; + } + float get_limiter_threshold_dbfs() const { return limiter_threshold_dbfs; @@ -239,6 +263,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); @@ -254,9 +279,10 @@ private: AudioDevice alsa_inputs[MAX_ALSA_CARDS]; // Under audio_mutex. std::vector available_alsa_cards; - std::atomic locut_cutoff_hz; + std::atomic locut_cutoff_hz{120}; 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; @@ -290,6 +316,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;