From a15405b6c5e824be7e0dafc019bcc3c6a2cce949 Mon Sep 17 00:00:00 2001 From: Thong Nguyen Date: Wed, 5 Feb 2014 19:05:47 +0000 Subject: [PATCH] Fixed audio thread may set the state to playing even in certain conditions even if the player has been user-paused or stopped (race condition) --- StreamingKit/StreamingKit/STKAudioPlayer.m | 29 ++++++++++++++++------ 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/StreamingKit/StreamingKit/STKAudioPlayer.m b/StreamingKit/StreamingKit/STKAudioPlayer.m index df0baaa..45f4dc6 100644 --- a/StreamingKit/StreamingKit/STKAudioPlayer.m +++ b/StreamingKit/StreamingKit/STKAudioPlayer.m @@ -1533,8 +1533,6 @@ static void AudioFileStreamPacketsProc(void* clientData, UInt32 numberBytes, UIn if (audioGraph != nil) { - //error = AudioOutputUnitStart(outputAudiotUnit); - error = AUGraphStart(audioGraph); if (error) @@ -1907,6 +1905,15 @@ static BOOL GetHardwareCodecClassDesc(UInt32 formatId, AudioClassDescription* cl OSStatus status; [self resetPcmBuffers]; + + Boolean isRunning; + + status = AUGraphIsRunning(audioGraph, &isRunning); + + if (isRunning) + { + return NO; + } status = AUGraphStart(audioGraph); @@ -1932,6 +1939,15 @@ static BOOL GetHardwareCodecClassDesc(UInt32 formatId, AudioClassDescription* cl return; } + Boolean isRunning; + + status = AUGraphIsRunning(audioGraph, &isRunning); + + if (!isRunning) + { + return; + } + status = AUGraphStop(audioGraph); [self resetPcmBuffers]; @@ -2369,8 +2385,6 @@ static OSStatus OutputRenderCallback(void* inRefCon, AudioUnitRenderActionFlags* { return (state & STKAudioPlayerInternalStateRunning) && state != STKAudioPlayerInternalStatePaused; }]; - - audioPlayer.internalState = STKAudioPlayerInternalStatePlaying; } if (totalFramesCopied < inNumberFrames) @@ -2383,9 +2397,10 @@ static OSStatus OutputRenderCallback(void* inRefCon, AudioUnitRenderActionFlags* { // Buffering - pthread_mutex_lock(&audioPlayer->playerMutex); - audioPlayer.internalState = STKAudioPlayerInternalStateRebuffering; - pthread_mutex_unlock(&audioPlayer->playerMutex); + [audioPlayer setInternalState:STKAudioPlayerInternalStateRebuffering ifInState:^BOOL(STKAudioPlayerInternalState state) + { + return (state & STKAudioPlayerInternalStateRunning) && state != STKAudioPlayerInternalStatePaused; + }]; } }