+ const AudioDevice *find_audio_device(DeviceSpec device_spec) const
+ {
+ return const_cast<AudioMixer *>(this)->find_audio_device(device_spec);
+ }
+
+ AudioDevice *find_audio_device(DeviceSpec device_spec);
+
+ void find_sample_src_from_device(const std::map<DeviceSpec, std::vector<float>> &samples_card, DeviceSpec device_spec, int source_channel, const float **srcptr, unsigned *stride);
+ void fill_audio_bus(const std::map<DeviceSpec, std::vector<float>> &samples_card, const InputMapping::Bus &bus, unsigned num_samples, float *output);
+ void reset_resampler_mutex_held(DeviceSpec device_spec);
+ void apply_eq(unsigned bus_index, std::vector<float> *samples_bus);
+ void update_meters(const std::vector<float> &samples);
+ void add_bus_to_master(unsigned bus_index, const std::vector<float> &samples_bus, std::vector<float> *samples_out);
+ void measure_bus_levels(unsigned bus_index, const std::vector<float> &left, const std::vector<float> &right);
+ void send_audio_level_callback();
+ std::vector<DeviceSpec> get_active_devices() const;
+ void set_input_mapping_lock_held(const InputMapping &input_mapping);
+
+ unsigned num_cards;
+
+ mutable std::timed_mutex audio_mutex;
+
+ ALSAPool alsa_pool;
+ AudioDevice video_cards[MAX_VIDEO_CARDS]; // Under audio_mutex.
+ AudioDevice alsa_inputs[MAX_ALSA_CARDS]; // Under audio_mutex.
+
+ std::atomic<float> locut_cutoff_hz{120};
+ StereoFilter locut[MAX_BUSES]; // Default cutoff 120 Hz, 24 dB/oct.
+ std::atomic<bool> 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()).