diff --git a/VoidLink/Stream/Connection.m b/VoidLink/Stream/Connection.m index 63978fcd..5720b46d 100644 --- a/VoidLink/Stream/Connection.m +++ b/VoidLink/Stream/Connection.m @@ -402,14 +402,42 @@ void AudioEngineInit(int sampleRate, int channelCount) { + (void)resetSysAudioPlayback { audioSessionInterrupted = true; - [audioPlayerNode stop]; - [audioEngine stop]; - AudioEngineInit(audioConfig.sampleRate, audioConfig.channelCount); - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5*NSEC_PER_SEC), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - audioSessionInterrupted = false; + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0), + dispatch_get_main_queue(), ^{ + @try { + if (audioPlayerNode) { + [audioPlayerNode stop]; + } + + if (audioEngine) { + [audioEngine stop]; + [audioEngine reset]; + + if (audioPlayerNode) { + [audioEngine disconnectNodeInput:audioPlayerNode]; + [audioEngine disconnectNodeOutput:audioPlayerNode]; + [audioEngine detachNode:audioPlayerNode]; + } + } + + audioEngine = nil; + audioPlayerNode = nil; + + AudioEngineInit(audioConfig.sampleRate, audioConfig.channelCount); + } + @catch (NSException *exception) { + NSLog(@"resetSysAudioPlayback failed: %@, reason: %@", + exception.name, + exception.reason); + } + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), + dispatch_get_main_queue(), ^{ + audioSessionInterrupted = false; + }); }); } + void ArDecodeAndPlaySample(char* sampleData, int sampleLength) { if(appDidEnterBackgroundWithoutPip && muteInBackground) return;