From d3e254e24fda04684644d709ed0575483f9ef7a7 Mon Sep 17 00:00:00 2001 From: reuk Date: Wed, 18 Sep 2024 14:56:18 +0100 Subject: [PATCH] iOS Audio: Request exactly the desired buffersize, to avoid an issue where iOS 18 fails to apply non-power-of-2 sizes --- .../juce_audio_devices/native/juce_Audio_ios.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/modules/juce_audio_devices/native/juce_Audio_ios.cpp b/modules/juce_audio_devices/native/juce_Audio_ios.cpp index 64dc6ccfb4..fa0ba27793 100644 --- a/modules/juce_audio_devices/native/juce_Audio_ios.cpp +++ b/modules/juce_audio_devices/native/juce_Audio_ios.cpp @@ -320,7 +320,18 @@ struct iOSAudioIODevice::Pimpl final : public AsyncUpdater int tryBufferSize (const double currentSampleRate, const int newBufferSize) { - NSTimeInterval bufferDuration = currentSampleRate > 0 ? (NSTimeInterval) ((newBufferSize + 1) / currentSampleRate) : 0.0; + const auto extraOffset = std::invoke ([&] + { + // Older iOS versions (iOS 12) seem to require that the requested buffer size is a bit + // larger than the desired buffer size. + // This breaks on iOS 18, which needs the buffer duration to be as precise as possible. + if (@available (ios 18, *)) + return 0; + + return 1; + }); + + NSTimeInterval bufferDuration = currentSampleRate > 0 ? (NSTimeInterval) (newBufferSize + extraOffset) / currentSampleRate : 0.0; auto session = [AVAudioSession sharedInstance]; JUCE_NSERROR_CHECK ([session setPreferredIOBufferDuration: bufferDuration