From da96d2c21ed81a29f8a43295c866e7b2a068c704 Mon Sep 17 00:00:00 2001 From: Christopher Snowhill Date: Fri, 17 Sep 2021 19:09:34 -0700 Subject: [PATCH] Core Audio Output: Add a check that should prevent it from attempting to output data through the callback during or after destruction --- Audio/Output/OutputCoreAudio.h | 2 ++ Audio/Output/OutputCoreAudio.m | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/Audio/Output/OutputCoreAudio.h b/Audio/Output/OutputCoreAudio.h index 636845cb5..6c283dbcb 100644 --- a/Audio/Output/OutputCoreAudio.h +++ b/Audio/Output/OutputCoreAudio.h @@ -17,6 +17,8 @@ @interface OutputCoreAudio : NSObject { OutputNode * outputController; + + BOOL stopping; AudioDeviceID outputDeviceID; AudioUnit outputUnit; diff --git a/Audio/Output/OutputCoreAudio.m b/Audio/Output/OutputCoreAudio.m index 8787e4d07..fcb71560c 100644 --- a/Audio/Output/OutputCoreAudio.m +++ b/Audio/Output/OutputCoreAudio.m @@ -34,6 +34,13 @@ static OSStatus Sound_Renderer(void *inRefCon, AudioUnitRenderActionFlags *ioAc void *readPointer = ioData->mBuffers[0].mData; int amountToRead, amountRead; + + if (output->stopping == YES) + { + // *shrug* At least this will stop it from trying to emit data post-shutdown + ioData->mBuffers[0].mDataByteSize = 0; + return eofErr; + } if ([output->outputController shouldContinue] == NO) { @@ -384,6 +391,7 @@ static OSStatus Sound_Renderer(void *inRefCon, AudioUnitRenderActionFlags *ioAc size); //setup render callbacks + stopping = NO; renderCallback.inputProc = Sound_Renderer; renderCallback.inputProcRefCon = (__bridge void * _Nullable)(self); @@ -413,6 +421,7 @@ static OSStatus Sound_Renderer(void *inRefCon, AudioUnitRenderActionFlags *ioAc { if (outputUnit) { + stopping = YES; AudioOutputUnitStop(outputUnit); AudioUnitUninitialize (outputUnit); AudioComponentInstanceDispose(outputUnit);