From b4948882e46ae3b36dc00a73f31276968e3c5091 Mon Sep 17 00:00:00 2001 From: Thong Nguyen Date: Wed, 22 Jan 2014 22:52:51 +0000 Subject: [PATCH] Fixed async AudioQueue stop method for determing if a queued item has finished not taking into account upcoming queued items that aren't being decoded because they're incompatible --- StreamingKit/StreamingKit/STKAudioPlayer.m | 30 +++++++++++++++++----- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/StreamingKit/StreamingKit/STKAudioPlayer.m b/StreamingKit/StreamingKit/STKAudioPlayer.m index b8a154e..9806664 100644 --- a/StreamingKit/StreamingKit/STKAudioPlayer.m +++ b/StreamingKit/StreamingKit/STKAudioPlayer.m @@ -246,6 +246,19 @@ AudioQueueBufferRefLookupEntry; } } +-(BOOL) couldBeIncompatible:(AudioStreamBasicDescription*)basicDescription +{ + if (self->audioStreamBasicDescription.mSampleRate != 0) + { + if (memcmp(&(self->audioStreamBasicDescription), basicDescription, sizeof(*basicDescription)) != 0) + { + return YES; + } + } + + return NO; +} + -(NSString*) description { return [[self queueItemId] description]; @@ -1090,7 +1103,15 @@ static void AudioQueueIsRunningCallbackProc(void* userData, AudioQueueRef audioQ } } - if ([upcomingQueue peek] == nil && everythingInBufferingQueueBuffered) + BOOL upcomingExistsAndIsIncompatible = NO; + STKQueueEntry* upcoming = [upcomingQueue peek]; + + if (upcoming != nil) + { + upcomingExistsAndIsIncompatible = [upcoming couldBeIncompatible:¤tAudioStreamBasicDescription]; + } + + if ((upcoming == nil || upcomingExistsAndIsIncompatible) && everythingInBufferingQueueBuffered) { if (self.internalState != AudioPlayerInternalStateFlushingAndStoppingButStillPlaying) { @@ -1834,12 +1855,9 @@ static void AudioQueueIsRunningCallbackProc(void* userData, AudioQueueRef audioQ if (next) { - if (next->audioStreamBasicDescription.mSampleRate != 0) + if ([next couldBeIncompatible:¤tAudioStreamBasicDescription]) { - if (memcmp(&next->audioStreamBasicDescription, ¤tAudioStreamBasicDescription, sizeof(currentAudioStreamBasicDescription)) != 0) - { - nextIsIncompatible = YES; - } + nextIsIncompatible = YES; } } }