diff options
author | Robin Gareus <robin@gareus.org> | 2016-08-28 13:44:30 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2016-08-28 13:44:30 +0200 |
commit | 355fa64c79154d5c6ec4bef099848a7f55abc69a (patch) | |
tree | 1a8844d951988668835bdb3a2d36b4e1e35adeba | |
parent | eeee70c32d0eca36ce789047aeedef3263d8697b (diff) |
fix Coreaudio Aggregate for separate devices with identical names
-rw-r--r-- | libs/backends/coreaudio/coreaudio_backend.cc | 42 | ||||
-rw-r--r-- | libs/backends/coreaudio/coreaudio_backend.h | 3 |
2 files changed, 30 insertions, 15 deletions
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<float> sr_in; std::vector<float> 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<uint32_t> bs; std::vector<uint32_t> bs_in; std::vector<uint32_t> 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<size_t, std::string> 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<size_t, std::string>::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; |