Maybe someone finds it useful
Code: Select all
;- Constants
#kAudioFormatFlagIsPacked = 8
#kAudioFormatFlagIsSignedInteger = 4
#kAudioFormatLinearPCM = $6c70636d; 'lpcm'
#kExtAudioFileProperty_ClientDataFormat = $63666d74; 'cfmt'
#kExtAudioFileProperty_FileDataFormat = $66666d74; 'ffmt'
#kExtAudioFileProperty_FileLengthFrames = $2366726d; '#frm'
#noErr = 0
;- Structures
Structure AudioBuffer Align #PB_Structure_AlignC
mNumberChannels.l
mDataByteSize.l
*mData
EndStructure
Structure AudioBufferList Align #PB_Structure_AlignC
mNumberBuffers.l
mBuffers.AudioBuffer[1]
EndStructure
Structure AudioStreamBasicDescription Align #PB_Structure_AlignC
mSampleRate.d
mFormatID.l
mFormatFlags.l
mBytesPerPacket.l
mFramesPerPacket.l
mBytesPerFrame.l
mChannelsPerFrame.l
mBitsPerChannel.l
mReserved.l
EndStructure
Structure Sample
l.w
r.w
EndStructure
Structure Samples
sample.Sample[0]
EndStructure
;- Imports
ImportC "-framework AudioToolbox"
ExtAudioFileDispose(inExtAudioFile)
ExtAudioFileGetProperty(inExtAudioFile, inPropertyID, *ioPropertyDataSize.Long, *outPropertyData)
ExtAudioFileOpenURL(inURL, *outExtAudioFile)
ExtAudioFileRead(inExtAudioFile, *ioNumberFrames.Long, *ioData.AudioBufferList)
ExtAudioFileSeek(inExtAudioFile, inFrameOffset.q)
ExtAudioFileSetProperty(inExtAudioFile, inPropertyID, inPropertyDataSize.l, *inPropertyData)
EndImport
;- Example
; Open file
FileName.s = "Test.mp3"
If ExtAudioFileOpenURL(CocoaMessage(0, 0, "NSURL fileURLWithPath:$", @FileName), @ExtAudioFile) = #noErr
; Get file format and length in frames
FileFormat.AudioStreamBasicDescription
Size = SizeOf(FileFormat)
ExtAudioFileGetProperty(ExtAudioFile, #kExtAudioFileProperty_FileDataFormat, @Size, @FileFormat)
Size = SizeOf(Quad)
ExtAudioFileGetProperty(ExtAudioFile, #kExtAudioFileProperty_FileLengthFrames, @Size, @FrameCount.q)
Debug "Source format id : " + PeekS(@FileFormat\mFormatID, 4, #PB_Ascii)
Debug "Source length in seconds : " + StrD(FrameCount / FileFormat\mSampleRate, 3)
; Set client format to 44100 Hz, 16 bit stereo
ClientFormat.AudioStreamBasicDescription
ClientFormat\mSampleRate = 44100
ClientFormat\mFormatID = #kAudioFormatLinearPCM
ClientFormat\mFormatFlags = #kAudioFormatFlagIsPacked | #kAudioFormatFlagIsSignedInteger
ClientFormat\mBytesPerPacket = 4
ClientFormat\mFramesPerPacket = 1
ClientFormat\mBytesPerFrame = 4
ClientFormat\mChannelsPerFrame = 2
ClientFormat\mBitsPerChannel = 16
Size = SizeOf(ClientFormat)
ExtAudioFileSetProperty(ExtAudioFile, #kExtAudioFileProperty_ClientDataFormat, @Size, @ClientFormat)
; Setup buffer and AudioBufferList
ClientFrameCount.q = FrameCount * ClientFormat\mSampleRate / FileFormat\mSampleRate
BufferSize = ClientFrameCount * ClientFormat\mBytesPerFrame
*Buffer.Samples = AllocateMemory(BufferSize)
AudioBufferList.AudioBufferList
AudioBufferList\mNumberBuffers = 1
AudioBufferList\mBuffers[0]\mNumberChannels = ClientFormat\mChannelsPerFrame
AudioBufferList\mBuffers[0]\mDataByteSize = BufferSize
AudioBufferList\mBuffers[0]\mData = *Buffer
NumberFrames.l = ClientFrameCount
If ExtAudioFileRead(ExtAudioFile, @NumberFrames, @AudioBufferList) = #noErr
Debug "Total client frames : " + Str(ClientFrameCount)
Debug "Frames read : " + Str(NumberFrames)
Debug "First 10 samples left channel : "
For i = 0 To 9
Debug *Buffer\sample[i]\l
Next
EndIf
ExtAudioFileDispose(ExtAudioFile)
FreeMemory(*Buffer)
EndIf