From 355fa64c79154d5c6ec4bef099848a7f55abc69a Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sun, 28 Aug 2016 13:44:30 +0200 Subject: fix Coreaudio Aggregate for separate devices with identical names --- libs/backends/coreaudio/coreaudio_backend.cc | 42 ++++++++++++++++++---------- libs/backends/coreaudio/coreaudio_backend.h | 3 +- 2 files changed, 30 insertions(+), 15 deletions(-) (limited to 'libs') diff --git a/libs/backends/coreaudio/coreaudio_backend.cc b/libs/backends/coreaudio/coreaudio_backend.cc index d4e1d91444..504a7376f9 100644 --- a/libs/backends/coreaudio/coreaudio_backend.cc +++ b/libs/backends/coreaudio/coreaudio_backend.cc @@ -203,8 +203,8 @@ CoreAudioBackend::available_sample_rates2 (const std::string& input_device, cons std::vector sr_in; std::vector sr_out; - const uint32_t inp = name_to_id (input_device); - const uint32_t out = name_to_id (output_device); + const uint32_t inp = name_to_id (input_device, Input); + const uint32_t out = name_to_id (output_device, Output); if (inp == UINT32_MAX && out == UINT32_MAX) { return sr; @@ -237,8 +237,8 @@ CoreAudioBackend::available_buffer_sizes2 (const std::string& input_device, cons std::vector bs; std::vector bs_in; std::vector bs_out; - const uint32_t inp = name_to_id (input_device); - const uint32_t out = name_to_id (output_device); + const uint32_t inp = name_to_id (input_device, Input); + const uint32_t out = name_to_id (output_device, Output); if (inp == UINT32_MAX && out == UINT32_MAX) { return bs; } else if (inp == UINT32_MAX) { @@ -292,7 +292,7 @@ int CoreAudioBackend::set_input_device_name (const std::string& d) { _input_audio_device = d; - const float sr = _pcmio->current_sample_rate(name_to_id(_input_audio_device)); + const float sr = _pcmio->current_sample_rate(name_to_id(_input_audio_device, Input)); if (sr > 0) { set_sample_rate(sr); } return 0; } @@ -302,7 +302,7 @@ CoreAudioBackend::set_output_device_name (const std::string& d) { _output_audio_device = d; // TODO check SR. - const float sr = _pcmio->current_sample_rate(name_to_id(_output_audio_device)); + const float sr = _pcmio->current_sample_rate(name_to_id(_output_audio_device, Output)); if (sr > 0) { set_sample_rate(sr); } return 0; } @@ -459,10 +459,10 @@ void CoreAudioBackend::launch_control_app () { if (name_to_id (_input_audio_device) != UINT32_MAX) { - _pcmio->launch_control_app(name_to_id(_input_audio_device)); + _pcmio->launch_control_app(name_to_id(_input_audio_device, Input)); } if (name_to_id (_output_audio_device) != UINT32_MAX) { - _pcmio->launch_control_app(name_to_id(_output_audio_device)); + _pcmio->launch_control_app(name_to_id(_output_audio_device, Output)); } } @@ -507,8 +507,8 @@ CoreAudioBackend::_start (bool for_latency_measurement) _portmap.clear(); } - uint32_t device1 = name_to_id(_input_audio_device); - uint32_t device2 = name_to_id(_output_audio_device); + uint32_t device1 = name_to_id(_input_audio_device, Input); + uint32_t device2 = name_to_id(_output_audio_device, Output); assert(_active_ca == false); assert(_active_fw == false); @@ -778,10 +778,24 @@ CoreAudioBackend::samples_since_cycle_start () } uint32_t -CoreAudioBackend::name_to_id(std::string device_name) const { +CoreAudioBackend::name_to_id(std::string device_name, DeviceFilter filter) const { uint32_t device_id = UINT32_MAX; std::map devices; - _pcmio->device_list(devices); + switch (filter) { + case Input: + _pcmio->input_device_list (devices); + break; + case Output: + _pcmio->output_device_list (devices); + break; + case Duplex: + _pcmio->duplex_device_list (devices); + break; + case All: + default: + _pcmio->device_list (devices); + break; + } for (std::map::const_iterator i = devices.begin (); i != devices.end(); ++i) { if (i->second == device_name) { @@ -1074,8 +1088,8 @@ CoreAudioBackend::register_system_audio_ports() const uint32_t a_ins = _n_inputs; const uint32_t a_out = _n_outputs; - const uint32_t coreaudio_reported_input_latency = _pcmio->get_latency(name_to_id(_input_audio_device), true); - const uint32_t coreaudio_reported_output_latency = _pcmio->get_latency(name_to_id(_output_audio_device), false); + const uint32_t coreaudio_reported_input_latency = _pcmio->get_latency(name_to_id(_input_audio_device, Input), true); + const uint32_t coreaudio_reported_output_latency = _pcmio->get_latency(name_to_id(_output_audio_device, Output), false); #ifndef NDEBUG printf("COREAUDIO LATENCY: i:%d, o:%d\n", diff --git a/libs/backends/coreaudio/coreaudio_backend.h b/libs/backends/coreaudio/coreaudio_backend.h index d37ef6c19a..5211839a9c 100644 --- a/libs/backends/coreaudio/coreaudio_backend.h +++ b/libs/backends/coreaudio/coreaudio_backend.h @@ -434,7 +434,8 @@ class CoreAudioBackend : public AudioBackend { uint32_t _systemic_audio_output_latency; /* coreaudio specific */ - uint32_t name_to_id(std::string) const; + enum DeviceFilter { All, Input, Output, Duplex }; + uint32_t name_to_id(std::string, DeviceFilter filter = All) const; /* processing */ float _dsp_load; -- cgit v1.2.3