]> git.sesse.net Git - nageru/blobdiff - audio_mixer.cpp
Make it possible to load an audio input mapping on start, through a command-line...
[nageru] / audio_mixer.cpp
index 3b40955ef1e43b6604fd2d212e3da1e2c225ff3a..c7676b5910f06965c95582fb26ae998a53d64e4b 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;
@@ -180,20 +181,29 @@ AudioMixer::AudioMixer(unsigned num_cards)
        }
        set_limiter_enabled(global_flags.limiter_enabled);
        set_final_makeup_gain_auto(global_flags.final_makeup_gain_auto);
-
-       // Generate a very simple, default input mapping.
-       InputMapping::Bus input;
-       input.name = "Main";
-       input.device.type = InputSourceType::CAPTURE_CARD;
-       input.device.index = 0;
-       input.source_channel[0] = 0;
-       input.source_channel[1] = 1;
+       alsa_pool.init();
 
        InputMapping new_input_mapping;
-       new_input_mapping.buses.push_back(input);
-       set_input_mapping(new_input_mapping);
+       if (!global_flags.input_mapping_filename.empty()) {
+               if (!load_input_mapping_from_file(get_devices(),
+                                                 global_flags.input_mapping_filename,
+                                                 &new_input_mapping)) {
+                       fprintf(stderr, "Failed to load input mapping from '%s', exiting.\n",
+                               global_flags.input_mapping_filename.c_str());
+                       exit(1);
+               }
+       } else {
+               // Generate a very simple, default input mapping.
+               InputMapping::Bus input;
+               input.name = "Main";
+               input.device.type = InputSourceType::CAPTURE_CARD;
+               input.device.index = 0;
+               input.source_channel[0] = 0;
+               input.source_channel[1] = 1;
 
-       alsa_pool.init();
+               new_input_mapping.buses.push_back(input);
+       }
+       set_input_mapping(new_input_mapping);
 
        r128.init(2, OUTPUT_FREQUENCY);
        r128.integr_start();
@@ -754,6 +764,9 @@ map<DeviceSpec, DeviceInfo> AudioMixer::get_devices()
                DeviceInfo 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;
@@ -767,6 +780,24 @@ void AudioMixer::set_display_name(DeviceSpec device_spec, const string &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)
 {
        lock_guard<timed_mutex> lock(audio_mutex);