X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=audio_mixer.h;h=5a36475b6c1d9122ffd1b4b6725b2db275bea6e7;hb=41c91a56e836c4e81fcee2f3728ca09c0cc2a7bd;hp=6f7dbe5d0b45850fed81f743b6674eeb176c6c7b;hpb=4bbcd111d04f36a42cf3d40f18fcee5a91c6322a;p=nageru diff --git a/audio_mixer.h b/audio_mixer.h index 6f7dbe5..5a36475 100644 --- a/audio_mixer.h +++ b/audio_mixer.h @@ -14,8 +14,10 @@ #include #include #include +#include #include #include +#include #include #include "bmusb/bmusb.h" @@ -32,14 +34,14 @@ struct AudioFormat; enum class InputSourceType { SILENCE, CAPTURE_CARD }; struct InputMapping { - struct Input { + struct Bus { std::string name; InputSourceType input_source_type; unsigned input_source_index; int source_channel[2] { -1, -1 }; // Left and right. -1 = none. }; - std::vector inputs; + std::vector buses; }; class AudioMixer { @@ -55,7 +57,7 @@ public: // See comments inside get_output(). void set_current_loudness(double level_lufs) { loudness_lufs = level_lufs; } - void set_fader_volume(unsigned card_index, float level_db) { cards[card_index].fader_volume_db = level_db; } + void set_fader_volume(unsigned bus_index, float level_db) { fader_volume_db[bus_index] = level_db; } std::vector get_names() const; void set_name(unsigned card_index, const std::string &name); @@ -168,18 +170,21 @@ public: } private: + void find_sample_src_from_capture_card(const std::vector *samples_card, unsigned card_index, int source_channel, const float **srcptr, unsigned *stride); + void reset_card_mutex_held(unsigned card_index); + unsigned num_cards; - struct CaptureCard { - std::atomic fader_volume_db{0.0f}; + mutable std::mutex audio_mutex; - // Everything below audio_mutex is protected by it. - mutable std::mutex audio_mutex; + struct CaptureCard { std::unique_ptr resampling_queue; int64_t next_local_pts = 0; std::string name; + // Which channels we consider interesting (ie., are part of some input_mapping). + std::set interesting_channels; }; - CaptureCard cards[MAX_CARDS]; + CaptureCard cards[MAX_CARDS]; // Under audio_mutex. StereoFilter locut; // Default cutoff 120 Hz, 24 dB/oct. std::atomic locut_cutoff_hz; @@ -206,8 +211,8 @@ private: 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. - mutable std::mutex mapping_mutex; - InputMapping input_mapping; // Under mapping_mutex. + InputMapping input_mapping; // Under audio_mutex. + std::atomic fader_volume_db[MAX_BUSES] {{ 0.0f }}; }; #endif // !defined(_AUDIO_MIXER_H)