From 341cd455d8f5b0f01e33aaa0fd675eeb396b4355 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 21 Jun 2023 23:54:55 +0200 Subject: [PATCH] CoreAudio: unconditionally apply device latency --- libs/backends/coreaudio/coreaudio_backend.cc | 22 ++++++++++++++++---- libs/backends/coreaudio/coreaudio_backend.h | 3 +++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/libs/backends/coreaudio/coreaudio_backend.cc b/libs/backends/coreaudio/coreaudio_backend.cc index 15e8c9f8b9..fd28b76ad0 100644 --- a/libs/backends/coreaudio/coreaudio_backend.cc +++ b/libs/backends/coreaudio/coreaudio_backend.cc @@ -112,6 +112,8 @@ CoreAudioBackend::CoreAudioBackend (AudioEngine& e, AudioBackendInfo& info) , _n_outputs (0) , _systemic_audio_input_latency (0) , _systemic_audio_output_latency (0) + , _hw_audio_input_latency (0) + , _hw_audio_output_latency (0) , _dsp_load (0) , _processed_samples (0) { @@ -451,6 +453,7 @@ CoreAudioBackend::systemic_output_latency () const uint32_t CoreAudioBackend::systemic_hw_input_latency () const { + return 0; if (name_to_id (_input_audio_device) != UINT32_MAX) { return _pcmio->get_latency(name_to_id(_input_audio_device, Input), true); } @@ -460,6 +463,7 @@ CoreAudioBackend::systemic_hw_input_latency () const uint32_t CoreAudioBackend::systemic_hw_output_latency () const { + return 0; if (name_to_id (_output_audio_device) != UINT32_MAX) { return _pcmio->get_latency(name_to_id(_output_audio_device, Output), false); } @@ -642,6 +646,16 @@ CoreAudioBackend::_start (bool for_latency_measurement) PBD::warning << _("CoreAudioBackend: sample rate does not match.") << endmsg; } + _hw_audio_input_latency = _hw_audio_output_latency = 0; + + if (device1 != UINT32_MAX) { + _hw_audio_input_latency = _pcmio->get_latency(device1, true); + } + + if (device2 != UINT32_MAX) { + _hw_audio_output_latency = _pcmio->get_latency(device2, false); + } + _measure_latency = for_latency_measurement; _preinit = true; @@ -1244,12 +1258,12 @@ CoreAudioBackend::get_latency_range (PortEngine::PortHandle port_handle, bool fo r = port->latency_range (for_playback); if (port->is_physical() && port->is_terminal() && port->type() == DataType::AUDIO) { if (port->is_input() && for_playback) { - r.min += _samples_per_period; - r.max += _samples_per_period; + r.min += _samples_per_period + _hw_audio_input_latency; + r.max += _samples_per_period + _hw_audio_input_latency; } if (port->is_output() && !for_playback) { - r.min += _samples_per_period; - r.max += _samples_per_period; + r.min += _samples_per_period + _hw_audio_output_latency; + r.max += _samples_per_period + _hw_audio_output_latency; } } return r; diff --git a/libs/backends/coreaudio/coreaudio_backend.h b/libs/backends/coreaudio/coreaudio_backend.h index 05cff39d6d..e3daeec26e 100644 --- a/libs/backends/coreaudio/coreaudio_backend.h +++ b/libs/backends/coreaudio/coreaudio_backend.h @@ -368,6 +368,9 @@ class CoreAudioBackend : public AudioBackend, public PortEngineSharedImpl { uint32_t _systemic_audio_input_latency; uint32_t _systemic_audio_output_latency; + uint32_t _hw_audio_input_latency; + uint32_t _hw_audio_output_latency; + /* coreaudio specific */ enum DeviceFilter { All, Input, Output, Duplex }; uint32_t name_to_id(std::string, DeviceFilter filter = All) const;