From 0eb7687a636245b9f61d184ff24a77eaf289c774 Mon Sep 17 00:00:00 2001 From: Thong Nguyen Date: Mon, 20 Jan 2014 23:22:41 +0000 Subject: [PATCH] Prevent crash when reading unsupported types and raise didEncounterError delegate callback --- StreamingKit/StreamingKit/STKAudioPlayer.h | 3 +- StreamingKit/StreamingKit/STKAudioPlayer.m | 41 ++++++++++++++++++++-- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/StreamingKit/StreamingKit/STKAudioPlayer.h b/StreamingKit/StreamingKit/STKAudioPlayer.h index 2ba4974..7499458 100644 --- a/StreamingKit/StreamingKit/STKAudioPlayer.h +++ b/StreamingKit/StreamingKit/STKAudioPlayer.h @@ -94,7 +94,8 @@ typedef enum AudioPlayerErrorQueuePauseFailed, AudioPlayerErrorUnknownBuffer, AudioPlayerErrorQueueStopFailed, - AudioPlayerErrorOther + AudioPlayerErrorQueueCreationFailed, + AudioPlayerErrorOther = -1 } AudioPlayerErrorCode; diff --git a/StreamingKit/StreamingKit/STKAudioPlayer.m b/StreamingKit/StreamingKit/STKAudioPlayer.m index 4949272..182a2ee 100644 --- a/StreamingKit/StreamingKit/STKAudioPlayer.m +++ b/StreamingKit/StreamingKit/STKAudioPlayer.m @@ -722,12 +722,22 @@ static void AudioQueueIsRunningCallbackProc(void* userData, AudioQueueRef audioQ if (audioQueue == nil) { [self createAudioQueue]; + + if (audioQueue == nil) + { + return; + } } else if (memcmp(¤tAudioStreamBasicDescription, ¤tlyReadingEntry->audioStreamBasicDescription, sizeof(currentAudioStreamBasicDescription)) != 0) { if (currentlyReadingEntry == currentlyPlayingEntry) { [self createAudioQueue]; + + if (audioQueue == nil) + { + return; + } } else { @@ -1145,6 +1155,11 @@ static void AudioQueueIsRunningCallbackProc(void* userData, AudioQueueRef audioQ if (error) { + dispatch_async(dispatch_get_main_queue(), ^ + { + [self.delegate audioPlayer:self didEncounterError:AudioPlayerErrorQueueCreationFailed]; + }); + return; } @@ -1152,6 +1167,8 @@ static void AudioQueueIsRunningCallbackProc(void* userData, AudioQueueRef audioQ if (error) { + [self.delegate audioPlayer:self didEncounterError:AudioPlayerErrorQueueCreationFailed]; + return; } @@ -1193,6 +1210,11 @@ static void AudioQueueIsRunningCallbackProc(void* userData, AudioQueueRef audioQ if (error) { + dispatch_async(dispatch_get_main_queue(), ^ + { + [self.delegate audioPlayer:self didEncounterError:AudioPlayerErrorQueueCreationFailed]; + }); + return; } } @@ -1209,6 +1231,11 @@ static void AudioQueueIsRunningCallbackProc(void* userData, AudioQueueRef audioQ if (error) { + dispatch_async(dispatch_get_main_queue(), ^ + { + [self.delegate audioPlayer:self didEncounterError:AudioPlayerErrorQueueCreationFailed]; + }); + return; } @@ -1229,6 +1256,11 @@ static void AudioQueueIsRunningCallbackProc(void* userData, AudioQueueRef audioQ { free(cookieData); + dispatch_async(dispatch_get_main_queue(), ^ + { + [self.delegate audioPlayer:self didEncounterError:AudioPlayerErrorQueueCreationFailed]; + }); + return; } @@ -1816,9 +1848,12 @@ static void AudioQueueIsRunningCallbackProc(void* userData, AudioQueueRef audioQ [self stopAudioQueueWithReason:@"from startAudioQueue"]; [self createAudioQueue]; - self.internalState = AudioPlayerInternalStateWaitingForQueueToStart; - - AudioQueueStart(audioQueue, NULL); + if (audioQueue != nil) + { + self.internalState = AudioPlayerInternalStateWaitingForQueueToStart; + + AudioQueueStart(audioQueue, NULL); + } } [self stopSystemBackgroundTask];