From b36d95d971e0643cf57d380162751d3ca2aca776 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 4 Jun 2015 02:44:58 +0200 Subject: half-duplex Coreaudio support. --- libs/backends/coreaudio/coreaudio_backend.cc | 25 +++++++++++++++++++------ libs/backends/coreaudio/coreaudio_pcmio.cc | 25 +++++++++++++++---------- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/libs/backends/coreaudio/coreaudio_backend.cc b/libs/backends/coreaudio/coreaudio_backend.cc index 6cc2adf833..2ccc1fbcb7 100644 --- a/libs/backends/coreaudio/coreaudio_backend.cc +++ b/libs/backends/coreaudio/coreaudio_backend.cc @@ -164,6 +164,7 @@ CoreAudioBackend::enumerate_input_devices () const std::map devices; _pcmio->input_device_list(devices); + _input_audio_device_status.push_back (DeviceStatus (_("None"), true)); for (std::map::const_iterator i = devices.begin (); i != devices.end(); ++i) { if (_input_audio_device == "") _input_audio_device = i->second; _input_audio_device_status.push_back (DeviceStatus (i->second, true)); @@ -179,6 +180,7 @@ CoreAudioBackend::enumerate_output_devices () const std::map devices; _pcmio->output_device_list(devices); + _output_audio_device_status.push_back (DeviceStatus (_("None"), true)); for (std::map::const_iterator i = devices.begin (); i != devices.end(); ++i) { if (_output_audio_device == "") _output_audio_device = i->second; _output_audio_device_status.push_back (DeviceStatus (i->second, true)); @@ -193,12 +195,23 @@ CoreAudioBackend::available_sample_rates (const std::string&) const std::vector sr_in; std::vector sr_out; - _pcmio->available_sample_rates(name_to_id(_input_audio_device), sr_in); - _pcmio->available_sample_rates(name_to_id(_output_audio_device), sr_out); - - // TODO allow to use different SR per device, tweak aggregate - std::set_intersection(sr_in.begin(), sr_in.end(), sr_out.begin(), sr_out.end(), std::back_inserter(sr)); - return sr; + const uint32_t inp = name_to_id(_input_audio_device); + const uint32_t out = name_to_id(_output_audio_device); + if (inp == UINT32_MAX && out == UINT32_MAX) { + return sr; + } else if (inp == UINT32_MAX) { + _pcmio->available_sample_rates(out, sr_out); + return sr_out; + } else if (out == UINT32_MAX) { + _pcmio->available_sample_rates(inp, sr_in); + return sr_in; + } else { + _pcmio->available_sample_rates(inp, sr_in); + _pcmio->available_sample_rates(out, sr_out); + // TODO allow to use different SR per device, tweak aggregate + std::set_intersection(sr_in.begin(), sr_in.end(), sr_out.begin(), sr_out.end(), std::back_inserter(sr)); + return sr; + } } std::vector diff --git a/libs/backends/coreaudio/coreaudio_pcmio.cc b/libs/backends/coreaudio/coreaudio_pcmio.cc index fb1d8caeff..b6105c9c12 100644 --- a/libs/backends/coreaudio/coreaudio_pcmio.cc +++ b/libs/backends/coreaudio/coreaudio_pcmio.cc @@ -571,6 +571,9 @@ CoreAudioPCM::set_device_sample_rate_id (AudioDeviceID id, float rate, bool inpu int CoreAudioPCM::set_device_sample_rate (uint32_t device_id, float rate, bool input) { + if (device_id >= _n_devices) { + return 0; + } return set_device_sample_rate_id(_device_ids[device_id], rate, input); } @@ -793,9 +796,8 @@ CoreAudioPCM::pcm_start ( std::string errorMsg; _state = -2; - // TODO add "none' device to force half-duplex - - if (device_id_out >= _n_devices || device_id_in >= _n_devices) { + // "None" = UINT32_MAX + if (device_id_out >= _n_devices && device_id_in >= _n_devices) { return -1; } @@ -809,8 +811,8 @@ CoreAudioPCM::pcm_start ( _capture_channels = 0; _playback_channels = 0; - const uint32_t chn_in = _device_ins[device_id_in] + ((device_id_out != device_id_in) ? _device_ins[device_id_out] : 0); - const uint32_t chn_out = _device_outs[device_id_out] + ((device_id_out != device_id_in) ? _device_outs[device_id_in] : 0); + const uint32_t chn_in = (device_id_in < _n_devices ? _device_ins[device_id_in] : 0) + ((device_id_out != device_id_in && device_id_out < _n_devices) ? _device_ins[device_id_out] : 0); + const uint32_t chn_out =(device_id_out < _n_devices ? _device_outs[device_id_out] : 0) + ((device_id_out != device_id_in && device_id_in < _n_devices) ? _device_outs[device_id_in] : 0); assert (chn_in > 0 || chn_out > 0); @@ -839,15 +841,15 @@ CoreAudioPCM::pcm_start ( } // explicitly request device buffer size - if (set_device_buffer_size_id(_device_ids[device_id_in], samples_per_period)) { + if (device_id_in < _n_devices && set_device_buffer_size_id(_device_ids[device_id_in], samples_per_period)) { errorMsg="kAudioDevicePropertyBufferFrameSize, Input"; goto error; } - if (set_device_buffer_size_id(_device_ids[device_id_out], samples_per_period)) { + if (device_id_out < _n_devices && set_device_buffer_size_id(_device_ids[device_id_out], samples_per_period)) { errorMsg="kAudioDevicePropertyBufferFrameSize, Output"; goto error; } // create aggregate device.. - if (_device_ids[device_id_in] != _device_ids[device_id_out]) { + if (device_id_in < _n_devices && device_id_out < _n_devices && _device_ids[device_id_in] != _device_ids[device_id_out]) { if (0 == create_aggregate_device(_device_ids[device_id_in], _device_ids[device_id_out], sample_rate, &_aggregate_device_id)) { device_id = _aggregate_device_id; } else { @@ -855,12 +857,15 @@ CoreAudioPCM::pcm_start ( _aggregate_plugin_id = 0; errorMsg="Cannot create Aggregate Device"; goto error; } - } else { + } else if (device_id_out < _n_devices) { device_id = _device_ids[device_id_out]; + } else { + assert (device_id_in < _n_devices); + device_id = _device_ids[device_id_in]; } if (device_id_out != device_id_in) { - assert(_aggregate_device_id > 0); + assert(_aggregate_device_id > 0 || device_id_in >= _n_devices || device_id_out >= _n_devices); } // enableIO to progress further -- cgit v1.2.3