mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
iOS: Provide a workaround for discovering sample rates on iOS 18
There appears to be a bug on iOS 18 which means the session sample may not update after a call to setPreferredSampleRate
This commit is contained in:
parent
9bdf69e499
commit
0864d614fd
1 changed files with 60 additions and 0 deletions
|
|
@ -480,7 +480,67 @@ struct iOSAudioIODevice::Pimpl final : public AsyncUpdater
|
|||
double trySampleRate (double rate)
|
||||
{
|
||||
auto session = [AVAudioSession sharedInstance];
|
||||
|
||||
if (exactlyEqual (session.sampleRate, rate))
|
||||
return rate;
|
||||
|
||||
const auto startingSampleRate = session.sampleRate;
|
||||
|
||||
setAudioSessionActive (false);
|
||||
|
||||
JUCE_NSERROR_CHECK ([session setPreferredSampleRate: rate error: &error]);
|
||||
|
||||
setAudioSessionActive (true);
|
||||
|
||||
if (! exactlyEqual (startingSampleRate, session.sampleRate))
|
||||
return session.sampleRate;
|
||||
|
||||
AudioStreamBasicDescription stream{};
|
||||
stream.mFormatID = kAudioFormatLinearPCM;
|
||||
stream.mSampleRate = rate;
|
||||
stream.mChannelsPerFrame = 2;
|
||||
stream.mBitsPerChannel = 32;
|
||||
stream.mFramesPerPacket = 1;
|
||||
stream.mBytesPerFrame = stream.mChannelsPerFrame * stream.mBitsPerChannel / 8;
|
||||
stream.mBytesPerPacket = stream.mBytesPerFrame * stream.mFramesPerPacket;
|
||||
stream.mFormatFlags = stream.mBitsPerChannel;
|
||||
stream.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger
|
||||
| kLinearPCMFormatFlagIsBigEndian
|
||||
| kLinearPCMFormatFlagIsPacked;
|
||||
|
||||
AudioQueueRef audioQueue;
|
||||
|
||||
auto err = AudioQueueNewOutput (&stream,
|
||||
[] (auto, auto, auto) {},
|
||||
nullptr,
|
||||
nullptr,
|
||||
kCFRunLoopCommonModes,
|
||||
0,
|
||||
&audioQueue);
|
||||
|
||||
if (err != noErr || audioQueue == nullptr)
|
||||
{
|
||||
jassertfalse;
|
||||
return session.sampleRate;
|
||||
}
|
||||
|
||||
const ScopeGuard disposeAudioQueueOnReturn { [&]
|
||||
{
|
||||
AudioQueueDispose (audioQueue, true);
|
||||
}};
|
||||
|
||||
Float64 deviceSampleRate{};
|
||||
UInt32 size = sizeof (deviceSampleRate);
|
||||
|
||||
err = AudioQueueGetProperty (audioQueue,
|
||||
kAudioQueueDeviceProperty_SampleRate,
|
||||
&deviceSampleRate,
|
||||
&size);
|
||||
|
||||
if (err == noErr && size == sizeof (deviceSampleRate))
|
||||
return deviceSampleRate;
|
||||
|
||||
jassertfalse;
|
||||
return session.sampleRate;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue