From 1caeebce7e0d2b18ae7fb588aaccde7d19117e00 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Sat, 17 Sep 2016 23:41:17 +0200 Subject: [PATCH] Make it possible to load an audio input mapping on start, through a command-line flag. --- audio_mixer.cpp | 31 ++++++++++++++++++++----------- flags.cpp | 7 ++++++- flags.h | 1 + 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/audio_mixer.cpp b/audio_mixer.cpp index 962877e..c7676b5 100644 --- a/audio_mixer.cpp +++ b/audio_mixer.cpp @@ -181,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(); diff --git a/flags.cpp b/flags.cpp index ef32e6a..996107b 100644 --- a/flags.cpp +++ b/flags.cpp @@ -55,6 +55,7 @@ void usage() fprintf(stderr, " -v, --va-display=SPEC VA-API device for H.264 encoding\n"); fprintf(stderr, " ($DISPLAY spec or /dev/dri/render* path)\n"); fprintf(stderr, " -m, --map-signal=SIGNAL,CARD set a default card mapping (can be given multiple times)\n"); + fprintf(stderr, " -M, --input-mapping=FILE start with the given audio input mapping\n"); fprintf(stderr, " --fake-cards-audio make fake (disconnected) cards output a simple tone\n"); fprintf(stderr, " --http-uncompressed-video send uncompressed NV12 video to HTTP clients\n"); fprintf(stderr, " --http-x264-video send x264-compressed video to HTTP clients\n"); @@ -100,6 +101,7 @@ void parse_flags(int argc, char * const argv[]) { "theme", required_argument, 0, 't' }, { "theme-dir", required_argument, 0, 'I' }, { "map-signal", required_argument, 0, 'm' }, + { "input-mapping", required_argument, 0, 'M' }, { "va-display", required_argument, 0, 'v' }, { "fake-cards-audio", no_argument, 0, OPTION_FAKE_CARDS_AUDIO }, { "http-uncompressed-video", no_argument, 0, OPTION_HTTP_UNCOMPRESSED_VIDEO }, @@ -135,7 +137,7 @@ void parse_flags(int argc, char * const argv[]) vector theme_dirs; for ( ;; ) { int option_index = 0; - int c = getopt_long(argc, argv, "c:t:I:v:m:", long_options, &option_index); + int c = getopt_long(argc, argv, "c:t:I:v:m:M:", long_options, &option_index); if (c == -1) { break; @@ -167,6 +169,9 @@ void parse_flags(int argc, char * const argv[]) global_flags.default_stream_mapping[signal_num] = card_num; break; } + case 'M': + global_flags.input_mapping_filename = optarg; + break; case 'v': global_flags.va_display = optarg; break; diff --git a/flags.h b/flags.h index ba69db6..8e68a66 100644 --- a/flags.h +++ b/flags.h @@ -36,6 +36,7 @@ struct Flags { std::vector x264_extra_param; // In “key[,value]” format. bool enable_alsa_output = true; std::map default_stream_mapping; + std::string input_mapping_filename; // Empty for none. }; extern Flags global_flags; -- 2.39.2