]> git.sesse.net Git - nageru/blobdiff - audio_mixer.cpp
Make it possible to load/save input mappings.
[nageru] / audio_mixer.cpp
index 87a99bddc3c732dc81b29c044306bb739976815b..962877ed4647cf986e968e5868b4652608e89c7f 100644 (file)
@@ -13,6 +13,7 @@
 #include "db.h"
 #include "flags.h"
 #include "mixer.h"
+#include "state.pb.h"
 #include "timebase.h"
 
 using namespace bmusb;
@@ -162,6 +163,8 @@ AudioMixer::AudioMixer(unsigned num_cards)
          limiter(OUTPUT_FREQUENCY),
          correlation(OUTPUT_FREQUENCY)
 {
+       global_audio_mixer = this;
+
        for (unsigned bus_index = 0; bus_index < MAX_BUSES; ++bus_index) {
                locut[bus_index].init(FILTER_HPF, 2);
                locut_enabled[bus_index] = global_flags.locut_enabled;
@@ -741,8 +744,8 @@ map<DeviceSpec, DeviceInfo> AudioMixer::get_devices()
                const DeviceSpec spec{ InputSourceType::CAPTURE_CARD, card_index };
                const AudioDevice *device = &video_cards[card_index];
                DeviceInfo info;
-               info.name = device->name;
-               info.num_channels = 8;  // FIXME: This is wrong for fake cards.
+               info.display_name = device->display_name;
+               info.num_channels = 8;
                devices.insert(make_pair(spec, info));
        }
        vector<ALSAPool::Device> available_alsa_devices = alsa_pool.get_devices();
@@ -750,19 +753,40 @@ map<DeviceSpec, DeviceInfo> AudioMixer::get_devices()
                const DeviceSpec spec{ InputSourceType::ALSA_INPUT, card_index };
                const ALSAPool::Device &device = available_alsa_devices[card_index];
                DeviceInfo info;
-               info.name = device.name + " (" + device.info + ")";
+               info.display_name = device.display_name();
                info.num_channels = device.num_channels;
+               info.alsa_name = device.name;
+               info.alsa_info = device.info;
+               info.alsa_address = device.address;
                devices.insert(make_pair(spec, info));
        }
        return devices;
 }
 
-void AudioMixer::set_name(DeviceSpec device_spec, const string &name)
+void AudioMixer::set_display_name(DeviceSpec device_spec, const string &name)
 {
        AudioDevice *device = find_audio_device(device_spec);
 
        lock_guard<timed_mutex> lock(audio_mutex);
-       device->name = name;
+       device->display_name = name;
+}
+
+void AudioMixer::serialize_device(DeviceSpec device_spec, DeviceSpecProto *device_spec_proto)
+{
+       lock_guard<timed_mutex> lock(audio_mutex);
+       switch (device_spec.type) {
+               case InputSourceType::SILENCE:
+                       device_spec_proto->set_type(DeviceSpecProto::SILENCE);
+                       break;
+               case InputSourceType::CAPTURE_CARD:
+                       device_spec_proto->set_type(DeviceSpecProto::CAPTURE_CARD);
+                       device_spec_proto->set_index(device_spec.index);
+                       device_spec_proto->set_display_name(video_cards[device_spec.index].display_name);
+                       break;
+               case InputSourceType::ALSA_INPUT:
+                       alsa_pool.serialize_device(device_spec.index, device_spec_proto);
+                       break;
+       }
 }
 
 void AudioMixer::set_input_mapping(const InputMapping &new_input_mapping)