diff --git a/macosx/coreaudio/JackCoreAudioDriver.cpp b/macosx/coreaudio/JackCoreAudioDriver.cpp index 840ad947..2fb0f497 100644 --- a/macosx/coreaudio/JackCoreAudioDriver.cpp +++ b/macosx/coreaudio/JackCoreAudioDriver.cpp @@ -258,17 +258,21 @@ static CFStringRef GetDeviceName(AudioDeviceID id) return (err == noErr) ? UIname : NULL; } -static void ParseChannelList(const string& list, vector& result) +static void ParseChannelList(const string& list, vector& result, int max_chan) { stringstream ss(list); string token; - int chan; - + int chan; + while (ss >> token) { istringstream ins; ins.str(token); ins >> chan; - result.push_back(chan); + if (chan < 0 || chan >= max_chan) { + jack_error("Ignore incorrect channel mapping value = %d", chan); + } else { + result.push_back(chan); + } } } @@ -2027,19 +2031,7 @@ int JackCoreAudioDriver::Open(jack_nframes_t buffer_size, vector parsed_chan_in_list; vector parsed_chan_out_list; - - ParseChannelList(chan_in_list, parsed_chan_in_list); - if (parsed_chan_in_list.size() > 0) { - jack_info("Explicit input channel list size = %d", parsed_chan_in_list.size()); - inchannels = parsed_chan_in_list.size(); - } - - ParseChannelList(chan_out_list, parsed_chan_out_list); - if (parsed_chan_out_list.size() > 0) { - jack_info("Explicit output channel list size = %d", parsed_chan_out_list.size()); - outchannels = parsed_chan_out_list.size(); - } - + // Starting with 10.6 systems, the HAL notification thread is created internally if (major == 10 && minor >= 6) { CFRunLoopRef theRunLoop = NULL; @@ -2070,6 +2062,18 @@ int JackCoreAudioDriver::Open(jack_nframes_t buffer_size, if (SetupChannels(capturing, playing, inchannels, outchannels, in_nChannels, out_nChannels, !ac3_encoding) < 0) { goto error; } + + ParseChannelList(chan_in_list, parsed_chan_in_list, in_nChannels); + if (parsed_chan_in_list.size() > 0) { + jack_info("Explicit input channel list size = %d", parsed_chan_in_list.size()); + inchannels = parsed_chan_in_list.size(); + } + + ParseChannelList(chan_out_list, parsed_chan_out_list, out_nChannels); + if (parsed_chan_out_list.size() > 0) { + jack_info("Explicit output channel list size = %d", parsed_chan_out_list.size()); + outchannels = parsed_chan_out_list.size(); + } if (SetupBufferSize(buffer_size) < 0) { goto error; @@ -2470,8 +2474,8 @@ extern "C" jack_driver_descriptor_add_parameter(desc, &filler, "out-channels", 'o', JackDriverParamInt, &value, NULL, "Maximum number of output channels", "Maximum number of output channels. If -1, max possible number of output channels will be used"); value.str[0] = 0; - jack_driver_descriptor_add_parameter(desc, &filler, "input-list", 'n', JackDriverParamString, &value, NULL, "Input channel list", "List of input channel number to be opened"); - jack_driver_descriptor_add_parameter(desc, &filler, "output-list", 'N', JackDriverParamString, &value, NULL, "Output channel list", "List of output channel number to be opened"); + jack_driver_descriptor_add_parameter(desc, &filler, "input-list", 'n', JackDriverParamString, &value, NULL, "Input channel list for channel mapping", "List of input channel number to be opened (syntax like : \"0 3 2\")"); + jack_driver_descriptor_add_parameter(desc, &filler, "output-list", 'N', JackDriverParamString, &value, NULL, "Output channel list for channel mapping", "List of output channel number to be opened (syntax like : \"0 3 2\")"); value.str[0] = 0; jack_driver_descriptor_add_parameter(desc, &filler, "capture", 'C', JackDriverParamString, &value, NULL, "Input CoreAudio device name", NULL); @@ -2665,7 +2669,7 @@ extern "C" printf("Input channel list and in channels are both specified, input channel list will take over...\n"); } - if (strcmp(chan_out_list, "") != 0 && chan_out >= 0) { + if (strcmp(chan_out_list, "") != 0 && chan_out >= 0) { printf("Output channel list and out channels are both specified, output channel list will take over...\n"); }