+
+vector<string> AudioMixer::get_names() const
+{
+ lock_guard<mutex> lock(audio_mutex);
+ vector<string> names;
+ for (unsigned card_index = 0; card_index < num_cards; ++card_index) {
+ const CaptureCard *card = &cards[card_index];
+ names.push_back(card->name);
+ }
+ return names;
+}
+
+void AudioMixer::set_name(unsigned card_index, const string &name)
+{
+ lock_guard<mutex> lock(audio_mutex);
+ CaptureCard *card = &cards[card_index];
+ card->name = name;
+}
+
+void AudioMixer::set_input_mapping(const InputMapping &new_input_mapping)
+{
+ lock_guard<mutex> lock(audio_mutex);
+
+ map<unsigned, set<unsigned>> interesting_channels;
+ for (const InputMapping::Bus &bus : new_input_mapping.buses) {
+ if (bus.input_source_type == InputSourceType::CAPTURE_CARD) {
+ for (unsigned channel = 0; channel < 2; ++channel) {
+ if (bus.source_channel[channel] != -1) {
+ interesting_channels[bus.input_source_index].insert(bus.source_channel[channel]);
+ }
+ }
+ }
+ }
+
+ // Reset resamplers for all cards that don't have the exact same state as before.
+ for (unsigned card_index = 0; card_index < num_cards; ++card_index) {
+ CaptureCard *card = &cards[card_index];
+ if (card->interesting_channels != interesting_channels[card_index]) {
+ card->interesting_channels = interesting_channels[card_index];
+ reset_card_mutex_held(card_index);
+ }
+ }
+
+ input_mapping = new_input_mapping;
+}
+
+InputMapping AudioMixer::get_input_mapping() const
+{
+ lock_guard<mutex> lock(audio_mutex);
+ return input_mapping;
+}