From 791c9f9b17132d82a7e324dba33df03c25d1c1df Mon Sep 17 00:00:00 2001 From: Christopher Snowhill Date: Mon, 2 Oct 2023 19:15:58 -0700 Subject: [PATCH] Stop visualizer feed for stopped playback A stopped instance of OutputCoreAudio should not continue to feed the visualization system with stale audio, potentially while another instance is already starting up and feeding its own audio output. Signed-off-by: Christopher Snowhill --- Audio/Output/OutputCoreAudio.m | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Audio/Output/OutputCoreAudio.m b/Audio/Output/OutputCoreAudio.m index a4685330c..1160146dd 100644 --- a/Audio/Output/OutputCoreAudio.m +++ b/Audio/Output/OutputCoreAudio.m @@ -160,6 +160,9 @@ static OSStatus eqRenderCallback(void *inRefCon, AudioUnitRenderActionFlags *ioA if(fabs(realStreamFormat.mSampleRate - lastVisRate) > 1e-5) { if(rsvis) { for(;;) { + if(stopping) { + break; + } int samplesFlushed; samplesFlushed = (int)rsstate_flush(rsvis, &visTemp[0], 8192); if(samplesFlushed > 1) { @@ -181,6 +184,9 @@ static OSStatus eqRenderCallback(void *inRefCon, AudioUnitRenderActionFlags *ioA size_t inDone = 0; size_t visFrameCount = frameCount; do { + if(stopping) { + break; + } int visTodo = (int)MIN(visFrameCount, visResamplerRemain + visFrameCount - 8192); if(visTodo) { cblas_scopy(visTodo, &visAudio[0], 1, &visResamplerInput[visResamplerRemain], 1); @@ -202,6 +208,9 @@ static OSStatus eqRenderCallback(void *inRefCon, AudioUnitRenderActionFlags *ioA } } else if(rsvis) { for(;;) { + if(stopping) { + break; + } int samplesFlushed; samplesFlushed = (int)rsstate_flush(rsvis, &visTemp[0], 8192); if(samplesFlushed > 1) { @@ -215,7 +224,7 @@ static OSStatus eqRenderCallback(void *inRefCon, AudioUnitRenderActionFlags *ioA rsvis = NULL; [visController postVisPCM:&visAudio[0] amount:frameCount]; visPushed += (double)frameCount / 44100.0; - } else { + } else if(!stopping) { [visController postVisPCM:&visAudio[0] amount:frameCount]; visPushed += (double)frameCount / 44100.0; }