2009-12-08 62 views
4

使用Xcode/Cocoa和ExtAudioFile API時,我試圖將AudioBufferList *對象存儲起來供以後使用,但我在重新訪問數據時遇到了麻煩。這些對象來自重複的ExtAudioFileRead調用。從ExtAudioFile API中存儲AudioBufferLists以供將來使用

我意識到我不能將這些AudioBufferList *對象填充到一個NSArray中,但我的印象是NSPointerArray可以用於此目的。但是,在將音頻緩衝區列表存儲在NSPointerArray中之後嘗試訪問audioBufferList-> mBuffers [0] .mData時,它們只會回零。

因爲我正在爲每個ExtAudioFileRead調用重複使用相同的音頻緩衝區列表,所以我正在將audioBufferLists寫入新的audioBufferList對象。不過,我不確定這是否足夠,並且對void * audioBufferList-> mBuffers [0] .mData對象進行memc編碼也沒有幫助。

什麼是最簡單的方法來存儲這些AudioBufferList *對象?我在正確的軌道上嗎?

回答

5

AudioBufferLists將其數據保存在audioBufferList.mBuffers[i].mData中。
mDatavoid*並且值的實際類型由您指定的輸出格式決定。

實施例:
如果定義
kAudioFormatFlagsCanonical
kAudioFormatLinearPCM
mBitsPerChannel = 32
mFramesPerPacket = 1
作爲輸出格式,所述MDATA陣列包含AudioSampleType類型的值(這是Float32一個typedef)

如果您已選擇數組可能包含另一種格式的SInt16值或其他值。
所以,當你想複製mData的內容時,你必須知道你的輸出類型。
如果你知道你可以簡單地創建一個C數組

dataCopy = calloc(dataSize, sizeof(Float32)); 

和memcpy audioBufferList.mBuffers [I] .mData成的格式。
如果你想使用一個可可NSMutableArray,你將不得不將浮動包裝到一個NSNumber對象中。

+0

或者你也可以創建一個NSMutableData,在數據的mutableBytes中保存'dataSize'字節和'memcpy''mData'。 – 2009-12-08 20:06:07

相關問題