From a8a03427458d79bc3196f918dba691dbbdfb1b4a Mon Sep 17 00:00:00 2001 From: hogliux Date: Thu, 6 Oct 2022 15:45:36 +0200 Subject: [PATCH] CoreAudio: Include buffer size and stream latency when calculating CoreAudio device's total latency --- .../native/juce_mac_CoreAudio.cpp | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp b/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp index da98049b04..02ee160823 100644 --- a/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp +++ b/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp @@ -915,15 +915,28 @@ public: { const auto scope = getScope (isInput); - const auto latency = audioObjectGetProperty (parent.deviceID, { kAudioDevicePropertyLatency, - scope, - juceAudioObjectPropertyElementMain }).value_or (0); + const auto deviceLatency = audioObjectGetProperty (parent.deviceID, { kAudioDevicePropertyLatency, + scope, + juceAudioObjectPropertyElementMain }).value_or (0); - const auto safetyOffset = audioObjectGetProperty (parent.deviceID, { kAudioDevicePropertySafetyOffset, - scope, - juceAudioObjectPropertyElementMain }).value_or (0); + const auto safetyOffset = audioObjectGetProperty (parent.deviceID, { kAudioDevicePropertySafetyOffset, + scope, + juceAudioObjectPropertyElementMain }).value_or (0); - return static_cast (latency + safetyOffset); + const auto framesInBuffer = audioObjectGetProperty (parent.deviceID, { kAudioDevicePropertyBufferFrameSize, + kAudioObjectPropertyScopeWildcard, + juceAudioObjectPropertyElementMain }).value_or (0); + + UInt32 streamLatency = 0; + + if (auto streams = audioObjectGetProperties (parent.deviceID, { kAudioDevicePropertyStreams, + scope, + juceAudioObjectPropertyElementMain }); ! streams.empty()) + streamLatency = audioObjectGetProperty (streams.front(), { kAudioStreamPropertyLatency, + scope, + juceAudioObjectPropertyElementMain }).value_or (0); + + return static_cast (deviceLatency + safetyOffset + framesInBuffer + streamLatency); } //==============================================================================