我們有一個讀取緩衝區的音頻單元,並且我在回調函數中增加了內存。它工作的很好,但我花了很多時間來解決這個泄漏。音頻單元Ostatus是否泄漏?
消除問題後,我發現基本配置代碼,由蘋果寫的,導致了內存增長(100K第二)
這是我的回調,採取一切其他的東西后,用問題:
AudioComponentInstance audioUnit;
static OSStatus recordingCallback(void *inRefCon,
AudioUnitRenderActionFlags *ioActionFlags,
const AudioTimeStamp *inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList *ioData)
{
AudioBuffer buffer;
buffer.mNumberChannels = 1;
buffer.mDataByteSize = inNumberFrames * 2;
buffer.mData = malloc(inNumberFrames * 2);
// Put buffer in a AudioBufferList
AudioBufferList bufferList;
bufferList.mNumberBuffers = 1;
bufferList.mBuffers[0] = buffer;
OSStatus status;
// problematic block ******
status = AudioUnitRender(audioUnit,
ioActionFlags,
inTimeStamp,
inBusNumber,
inNumberFrames,
&bufferList);
//end of problem block ******
free(buffer.mData);
}
去除塊解決問題。
audioUnit是否需要一個屬性? 這可能是我的基本問題? 謝謝。
首先非常感謝。其次,這是非常奇怪的,因爲蘋果文檔和其他每一個好網站都在以這種方式設置緩衝區(前四行)並將其分配到回調函數內部。無論如何,做這件事的最佳方式是什麼?如果我將緩衝區列表作爲參數從回調中發送到另一個函數,那麼我將在那裏創建一個池並處理音頻(dsp)是否可以? – user1280535 2012-04-25 06:43:07
忘記第二個回調 - 假裝它根本不存在。 :)現在,在您的代碼中有第一次機會時創建所需的緩衝區。如果你必須(認真)使用全局變量。現在,內作出(),只是零出緩衝器的內容,而不是重新分配。 – 2012-04-25 08:14:45
非常感謝您的時間。所以我應該在初始化分配一次,免費在它的dealloc,還是沒有?爲什麼零緩衝區內容?無論如何,它填滿了新的數據是不是? – user1280535 2012-04-27 08:17:29