From f8887b7ff18e3211418e67310601575ee481d162 Mon Sep 17 00:00:00 2001 From: Piers Date: Wed, 15 May 2013 16:29:24 +0000 Subject: [PATCH] Add support for HE-AAC The code for handling HE-AAC has been copied from Matt Gallagher's AudioStreamer library. https://github.com/mattgallagher/AudioStreamer/blob/master/Classes/AudioStreamer.m#L1605 --- Audjustable/Classes/AudioPlayer/AudioPlayer.m | 51 ++++++++++++++++--- 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/Audjustable/Classes/AudioPlayer/AudioPlayer.m b/Audjustable/Classes/AudioPlayer/AudioPlayer.m index 797f185..8ecdc6f 100644 --- a/Audjustable/Classes/AudioPlayer/AudioPlayer.m +++ b/Audjustable/Classes/AudioPlayer/AudioPlayer.m @@ -605,12 +605,13 @@ static void AudioQueueIsRunningCallbackProc(void* userData, AudioQueueRef audioQ break; case kAudioFileStreamProperty_DataFormat: { - AudioStreamBasicDescription newBasicDescription; - UInt32 size = sizeof(newBasicDescription); - - AudioFileStreamGetProperty(inAudioFileStream, kAudioFileStreamProperty_DataFormat, &size, &newBasicDescription); - - currentlyReadingEntry->audioStreamBasicDescription = newBasicDescription; + if (currentlyReadingEntry->audioStreamBasicDescription.mSampleRate == 0) { + AudioStreamBasicDescription newBasicDescription; + UInt32 size = sizeof(newBasicDescription); + + AudioFileStreamGetProperty(inAudioFileStream, kAudioFileStreamProperty_DataFormat, &size, &newBasicDescription); + currentlyReadingEntry->audioStreamBasicDescription = newBasicDescription; + } currentlyReadingEntry->sampleRate = currentlyReadingEntry->audioStreamBasicDescription.mSampleRate; currentlyReadingEntry->packetDuration = currentlyReadingEntry->audioStreamBasicDescription.mFramesPerPacket / currentlyReadingEntry->sampleRate; @@ -652,6 +653,44 @@ static void AudioQueueIsRunningCallbackProc(void* userData, AudioQueueRef audioQ discontinuous = YES; } break; + case kAudioFileStreamProperty_FormatList: + { + Boolean outWriteable; + UInt32 formatListSize; + OSStatus err = AudioFileStreamGetPropertyInfo(inAudioFileStream, kAudioFileStreamProperty_FormatList, &formatListSize, &outWriteable); + if (err) + { + break; + } + + AudioFormatListItem *formatList = malloc(formatListSize); + err = AudioFileStreamGetProperty(inAudioFileStream, kAudioFileStreamProperty_FormatList, &formatListSize, formatList); + if (err) + { + free(formatList); + break; + } + + for (int i = 0; i * sizeof(AudioFormatListItem) < formatListSize; i += sizeof(AudioFormatListItem)) + { + AudioStreamBasicDescription pasbd = formatList[i].mASBD; + + if (pasbd.mFormatID == kAudioFormatMPEG4AAC_HE || + pasbd.mFormatID == kAudioFormatMPEG4AAC_HE_V2) + { + // + // We've found HE-AAC, remember this to tell the audio queue + // when we construct it. + // +#if !TARGET_IPHONE_SIMULATOR + currentlyReadingEntry->audioStreamBasicDescription = pasbd; +#endif + break; + } + } + free(formatList); + } + break; } }