From 4dd46a1b5b6ab79ce6373eaa3659425165bc6979 Mon Sep 17 00:00:00 2001 From: Christopher Snowhill Date: Tue, 11 Jan 2022 07:52:44 -0800 Subject: [PATCH] Core Audio output: Fix output stopping properly --- Audio/Output/OutputCoreAudio.h | 2 ++ Audio/Output/OutputCoreAudio.m | 13 +++++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Audio/Output/OutputCoreAudio.h b/Audio/Output/OutputCoreAudio.h index cafef373b..48ed7f938 100644 --- a/Audio/Output/OutputCoreAudio.h +++ b/Audio/Output/OutputCoreAudio.h @@ -23,6 +23,8 @@ BOOL stopping; BOOL stopped; + size_t outputSilenceBlocks; + BOOL listenerapplied; float volume; diff --git a/Audio/Output/OutputCoreAudio.m b/Audio/Output/OutputCoreAudio.m index f9f674380..9239460f6 100644 --- a/Audio/Output/OutputCoreAudio.m +++ b/Audio/Output/OutputCoreAudio.m @@ -26,6 +26,7 @@ extern void scale_by_volume(float * buffer, size_t count, float volume); volume = 1.0; outputDeviceID = -1; listenerapplied = NO; + outputSilenceBlocks = 0; [[NSUserDefaultsController sharedUserDefaultsController] addObserver:self forKeyPath:@"values.outputDevice" options:0 context:NULL]; } @@ -225,6 +226,7 @@ default_device_changed(AudioObjectID inObjectID, UInt32 inNumberAddresses, const stopping = NO; stopped = NO; outputDeviceID = -1; + outputSilenceBlocks = 0; AVAudioFormat *format, *renderFormat; AudioComponentDescription desc; @@ -307,7 +309,7 @@ default_device_changed(AudioObjectID inObjectID, UInt32 inNumberAddresses, const if (err != nil) return NO; - float * volume = &self->volume; + __unsafe_unretained typeof(self) weakSelf = self; _au.outputProvider = ^AUAudioUnitStatus(AudioUnitRenderActionFlags * actionFlags, const AudioTimeStamp * timestamp, AUAudioFrameCount frameCount, NSInteger inputBusNumber, AudioBufferList * inputData) { @@ -319,11 +321,13 @@ default_device_changed(AudioObjectID inObjectID, UInt32 inNumberAddresses, const amountToRead = framesToRead * (self->deviceFormat.mBytesPerPacket); - if (self->stopping == YES) + if (self->outputSilenceBlocks || self->stopping == YES) { - self->stopped = YES; memset(readPointer, 0, amountToRead); inputData->mBuffers[0].mDataByteSize = amountToRead; + if (self->outputSilenceBlocks && + --self->outputSilenceBlocks == 0) + [weakSelf stop]; return 0; } @@ -331,6 +335,7 @@ default_device_changed(AudioObjectID inObjectID, UInt32 inNumberAddresses, const { memset(readPointer, 0, amountToRead); inputData->mBuffers[0].mDataByteSize = amountToRead; + self->outputSilenceBlocks = 48; return 0; } @@ -344,7 +349,7 @@ default_device_changed(AudioObjectID inObjectID, UInt32 inNumberAddresses, const } int framesRead = amountRead / sizeof(float); - scale_by_volume((float*)readPointer, framesRead, *volume); + scale_by_volume((float*)readPointer, framesRead, weakSelf->volume); if (amountRead < amountToRead) {