我有一個關於什麼我認爲歸結爲C語法和內存考慮的問題。我在處理一些音頻的Objective-C類中有一個回調,其中一個參數是bufferListInOut
。它代表我想轉換爲立體聲的單聲道音頻信號。這裏是我的代碼:在一個結構中擴展一個數組C
static void tap_ProcessCallback(MTAudioProcessingTapRef tap,
CMItemCount numberFrames,
MTAudioProcessingTapFlags flags,
AudioBufferList *bufferListInOut,
CMItemCount *numberFramesOut,
MTAudioProcessingTapFlags *flagsOut){
// Retrieve mono audio data into bufferListInOut
MTAudioProcessingTapGetSourceAudio(tap, numberFrames, bufferListInOut, NULL, NULL, NULL);
// Copy the mono channel's data
float *channelLeft = malloc(numberFrames * sizeof(float));
channelLeft = bufferListInOut->mBuffers[0].mData;
// Attempt to create a second channel which is (currently) a copy of the first
bufferListInOut->mNumberBuffers = 2; // 2 for stereo, 1 for mono
bufferListInOut->mBuffers[1].mNumberChannels = 1;
bufferListInOut->mBuffers[1].mDataByteSize = numberFrames * sizeof(Float32);
bufferListInOut->mBuffers[1].mData = channelLeft;
// Set number of frames out
*numberFramesOut = numberFrames;
}
一些注意事項:
- 在這段代碼中,新的渠道僅僅是一個副本原件,但在實踐中,將進行一些處理。
- 的命名是有點不可思議,但確實
mNumberBuffers
,就是要2mNumberChannels
意味着是1
這崩潰與渲染的EXC_BAD_ACCESS
錯誤線向下行。所以,我的問題是什麼是正確的方式來添加一個新的緩衝區結構?我不經常鑽研C,所以我確信我在這裏錯過了一些基礎知識。任何指針都會很棒。謝謝閱讀。
你的問題是?這篇文章中沒有一個。 – Sanuuu
這是複雜的東西,但是馬上就要分配內存並將其分配給'channelLeft',然後立即重新分配'channelLeft',從而泄漏內存。我想你想'memcpy(channelLeft,bufferListInOut-> mBuffers [0] .mData,numberFrames * sizeof(float));'。 – trojanfoe
@Sanuuu感謝您的評論。我剛纔澄清了這個問題。 – Rogare