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 <kode54@gmail.com>
This commit is contained in:
Christopher Snowhill 2023-10-02 19:15:58 -07:00
parent 73738aa185
commit 791c9f9b17
No known key found for this signature in database

View file

@ -160,6 +160,9 @@ static OSStatus eqRenderCallback(void *inRefCon, AudioUnitRenderActionFlags *ioA
if(fabs(realStreamFormat.mSampleRate - lastVisRate) > 1e-5) { if(fabs(realStreamFormat.mSampleRate - lastVisRate) > 1e-5) {
if(rsvis) { if(rsvis) {
for(;;) { for(;;) {
if(stopping) {
break;
}
int samplesFlushed; int samplesFlushed;
samplesFlushed = (int)rsstate_flush(rsvis, &visTemp[0], 8192); samplesFlushed = (int)rsstate_flush(rsvis, &visTemp[0], 8192);
if(samplesFlushed > 1) { if(samplesFlushed > 1) {
@ -181,6 +184,9 @@ static OSStatus eqRenderCallback(void *inRefCon, AudioUnitRenderActionFlags *ioA
size_t inDone = 0; size_t inDone = 0;
size_t visFrameCount = frameCount; size_t visFrameCount = frameCount;
do { do {
if(stopping) {
break;
}
int visTodo = (int)MIN(visFrameCount, visResamplerRemain + visFrameCount - 8192); int visTodo = (int)MIN(visFrameCount, visResamplerRemain + visFrameCount - 8192);
if(visTodo) { if(visTodo) {
cblas_scopy(visTodo, &visAudio[0], 1, &visResamplerInput[visResamplerRemain], 1); cblas_scopy(visTodo, &visAudio[0], 1, &visResamplerInput[visResamplerRemain], 1);
@ -202,6 +208,9 @@ static OSStatus eqRenderCallback(void *inRefCon, AudioUnitRenderActionFlags *ioA
} }
} else if(rsvis) { } else if(rsvis) {
for(;;) { for(;;) {
if(stopping) {
break;
}
int samplesFlushed; int samplesFlushed;
samplesFlushed = (int)rsstate_flush(rsvis, &visTemp[0], 8192); samplesFlushed = (int)rsstate_flush(rsvis, &visTemp[0], 8192);
if(samplesFlushed > 1) { if(samplesFlushed > 1) {
@ -215,7 +224,7 @@ static OSStatus eqRenderCallback(void *inRefCon, AudioUnitRenderActionFlags *ioA
rsvis = NULL; rsvis = NULL;
[visController postVisPCM:&visAudio[0] amount:frameCount]; [visController postVisPCM:&visAudio[0] amount:frameCount];
visPushed += (double)frameCount / 44100.0; visPushed += (double)frameCount / 44100.0;
} else { } else if(!stopping) {
[visController postVisPCM:&visAudio[0] amount:frameCount]; [visController postVisPCM:&visAudio[0] amount:frameCount];
visPushed += (double)frameCount / 44100.0; visPushed += (double)frameCount / 44100.0;
} }