// Linear PCM, stereo, noninterleaved stream at 44.1k AudioStreamBasicDescription targetAudioDescription; memset(&targetAudioDescription, 0, sizeof(targetAudioDescription)); targetAudioDescription.mFormatID = kAudioFormatLinearPCM; targetAudioDescription.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked | kAudioFormatFlagsNativeEndian; targetAudioDescription.mChannelsPerFrame = 2; targetAudioDescription.mBytesPerPacket = sizeof(SInt16)*targetAudioDescription.mChannelsPerFrame; targetAudioDescription.mFramesPerPacket = 1; targetAudioDescription.mBytesPerFrame = sizeof(SInt16)*targetAudioDescription.mChannelsPerFrame; targetAudioDescription.mBitsPerChannel = 8 * sizeof(SInt16); targetAudioDescription.mSampleRate = 44100.; NSURL *url = [[NSBundle mainBundle] URLForResource:@"test48k" withExtension:@"mp3"]; // NSURL *url = [[NSBundle mainBundle] URLForResource:@"test44.1k" withExtension:@"mp3"]; // -- Use this to see it working properly ExtAudioFileRef audioFile; OSStatus status; // Open file status = ExtAudioFileOpenURL((CFURLRef)url, &audioFile); checkStatus(status); if ( status != noErr ) { return; } // Determine data format AudioStreamBasicDescription fileAudioDescription; UInt32 size = sizeof(fileAudioDescription); status = ExtAudioFileGetProperty(audioFile, kExtAudioFileProperty_FileDataFormat, &size, &fileAudioDescription); if ( status != noErr ) { ExtAudioFileDispose(audioFile); return; } // Adjust client format to match number of channels targetAudioDescription.mChannelsPerFrame = fileAudioDescription.mChannelsPerFrame; targetAudioDescription.mBytesPerPacket = sizeof(SInt16)*fileAudioDescription.mChannelsPerFrame; targetAudioDescription.mBytesPerFrame = sizeof(SInt16)*fileAudioDescription.mChannelsPerFrame; // Set client format status = ExtAudioFileSetProperty(audioFile, kExtAudioFileProperty_ClientDataFormat, sizeof(targetAudioDescription), &targetAudioDescription); if ( status != noErr ) { ExtAudioFileDispose(audioFile); return; } // Get length of file (presumably in the client format's sample rate - // but note that even when assuming this is in the original file's sample rate, the same crash as described below occurs) UInt64 fileLengthInFrames; size = sizeof(fileLengthInFrames); status = ExtAudioFileGetProperty(audioFile, kExtAudioFileProperty_FileLengthFrames, &size, &fileLengthInFrames); if ( status != noErr ) { ExtAudioFileDispose(audioFile); return; } // Allocate space to load into memory SInt16* audioData = (SInt16*)malloc(fileLengthInFrames * targetAudioDescription.mBytesPerFrame); if ( !audioData ) { ExtAudioFileDispose(audioFile); return; } // Set up buffers AudioBufferList bufferList; bufferList.mNumberBuffers = 1; bufferList.mBuffers[0].mData = audioData; bufferList.mBuffers[0].mDataByteSize = fileLengthInFrames * targetAudioDescription.mBytesPerFrame; // Perform read UInt32 numberOfPackets = (UInt32)fileLengthInFrames; status = ExtAudioFileRead(audioFile, &numberOfPackets, &bufferList); // When loading the 48k file, crashes here with the following backtrace: // // #0 0x00d9b199 in SRC_convert_table_i16_scalar_stereo () // #1 0x00d9b570 in SRCWrapper::RenderOutput () // #2 0x00cb8268 in BufferedAudioConverter::FillBuffer () // #3 0x00cb841f in AudioConverterChain::RenderOutput () // #4 0x00cb8268 in BufferedAudioConverter::FillBuffer () // #5 0x00cb7fe0 in AudioConverterFillComplexBuffer () // #6 0x00dcf4f7 in ExtAudioFile::Read () // #7 0x00dd37f6 in ExtAudioFileRead () // #8 0x00002ed5 in -[AudioFileLoadTestViewController viewDidLoad] (self=0x693b6a0, _cmd=0x41ffd0) at AudioFileLoadTestViewController.m:107 // #9 0x000c3089 in -[UIViewController view] () // #10 0x00036d42 in -[UIWindow addRootViewControllerViewIfPossible] () // #11 0x00002897 in -[AudioFileLoadTestAppDelegate application:didFinishLaunchingWithOptions:] (self=0x55509f0, _cmd=0x4060c2, application=0x5634100, launchOptions=0x0) at AudioFileLoadTestAppDelegate.m:22 // #12 0x00013c89 in -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] () // #13 0x00015d88 in -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] () // #14 0x00020617 in -[UIApplication handleEvent:withNewEvent:] () // #15 0x00018abf in -[UIApplication sendEvent:] () // #16 0x0001df2e in _UIApplicationHandleEvent () // #17 0x01336992 in PurpleEventCallback () // #18 0x010de944 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ () // #19 0x0103ecf7 in __CFRunLoopDoSource1 () // #20 0x0103bf83 in __CFRunLoopRun () // #21 0x0103b840 in CFRunLoopRunSpecific () // #22 0x0103b761 in CFRunLoopRunInMode () // #23 0x000157d2 in -[UIApplication _run] () // #24 0x00021c93 in UIApplicationMain () // #25 0x000027d9 in main (argc=1, argv=0xbffff670) at main.m:14 if ( status != noErr ) { ExtAudioFileDispose(audioFile); free(audioData); return; } // Cleanup ExtAudioFileDispose(audioFile);