diff --git a/MCSimpleAudioPlayerDemo/MCSimpleAudioPlayer/MCAudioFile.m b/MCSimpleAudioPlayerDemo/MCSimpleAudioPlayer/MCAudioFile.m index 4e2d58e..d390b6b 100644 --- a/MCSimpleAudioPlayerDemo/MCSimpleAudioPlayer/MCAudioFile.m +++ b/MCSimpleAudioPlayerDemo/MCSimpleAudioPlayer/MCAudioFile.m @@ -239,10 +239,19 @@ - (NSArray *)parseData:(BOOL *)isEof UInt32 ioNumBytes = ioNumPackets * _maxPacketSize; void * outBuffer = (void *)malloc(ioNumBytes); - UInt32 descSize = sizeof(AudioStreamPacketDescription) * ioNumPackets; - AudioStreamPacketDescription * outPacketDescriptions = (AudioStreamPacketDescription *)malloc(descSize); + AudioStreamPacketDescription * outPacketDescriptions = NULL; + OSStatus status = noErr; + if (_format.mFormatID != kAudioFormatLinearPCM) + { + UInt32 descSize = sizeof(AudioStreamPacketDescription) * ioNumPackets; + outPacketDescriptions = (AudioStreamPacketDescription *)malloc(descSize); + status = AudioFileReadPacketData(_audioFileID, false, &ioNumBytes, outPacketDescriptions, _packetOffset, &ioNumPackets, outBuffer); + } + else + { + status = AudioFileReadPackets(_audioFileID, false, &ioNumBytes, outPacketDescriptions, _packetOffset, &ioNumPackets, outBuffer); + } - OSStatus status = AudioFileReadPacketData(_audioFileID, false, &ioNumBytes, outPacketDescriptions, _packetOffset, &ioNumPackets, outBuffer); if (status != noErr) { *isEof = status == kAudioFileEndOfFileError; @@ -262,10 +271,23 @@ - (NSArray *)parseData:(BOOL *)isEof NSMutableArray *parsedDataArray = [[NSMutableArray alloc] init]; for (int i = 0; i < ioNumPackets; ++i) { - AudioStreamPacketDescription packetDescriptioin = outPacketDescriptions[i]; - MCParsedAudioData *parsedData = [MCParsedAudioData parsedAudioDataWithBytes:outBuffer + packetDescriptioin.mStartOffset - packetDescription:packetDescriptioin]; - [parsedDataArray addObject:parsedData]; + AudioStreamPacketDescription packetDescription; + if (outPacketDescriptions) + { + packetDescription = outPacketDescriptions[i]; + } + else + { + packetDescription.mStartOffset = i * _format.mBytesPerPacket; + packetDescription.mDataByteSize = _format.mBytesPerPacket; + packetDescription.mVariableFramesInPacket = _format.mFramesPerPacket; + } + MCParsedAudioData *parsedData = [MCParsedAudioData parsedAudioDataWithBytes:outBuffer + packetDescription.mStartOffset + packetDescription:packetDescription]; + if (parsedData) + { + [parsedDataArray addObject:parsedData]; + } } return parsedDataArray; }