2014-09-27 90 views
0

我正在通過傳遞MPMediaItem對象使用以下方法將音頻文件讀入RAM中。但是,每次調用這個函數時,函數的開始都會釋放用於前一個音頻文件的內存,而不是這樣,即Xcode顯示每次調用該函數時內存使用量都會持續增加,最終會導致OS內存耗盡。如何釋放AudioFileReadPacketData使用的內存 - Xcode顯示仍在使用的內存

我在做什麼明顯錯誤?

注:以下功能是我使用我的audioData伊娃

Memory allocation summary in Instruments

The same audio file cached in memory by below function

void *audioData; 

- (void)playItem:(MPMediaItem *)mediaItem 
{ 
    if (audioData != NULL) { 
     NSLog(@"audio data pointer not empty"); 
     free (audioData); 
    } 

    // open audio file 
    AudioFileID audioFileID; 
    NSURL *mediaItemURL = [mediaItem valueForProperty:MPMediaItemPropertyAssetURL]; 

    OSErr err; 
    err = AudioFileOpenURL((__bridge CFURLRef)mediaItemURL, 
          kAudioFileReadPermission, 
          0, 
          &audioFileID); 
    NSAssert(err == noErr, @"Couldn't open audio file..."); 

    // read audio file properties and malloc audioData property 
    UInt32 audioDataPacketCount; 
    UInt32 audioDataPacketCountSize = sizeof(audioDataPacketCount); 
    err = AudioFileGetProperty(audioFileID, 
           kAudioFilePropertyAudioDataPacketCount, 
           &audioDataPacketCountSize, 
           &audioDataPacketCount); 
    NSAssert(err == noErr, @"Couldn't read audio file properties..."); 

    UInt32 audioDataByteCount; 
    UInt32 audioDataByteCountSize = sizeof(audioDataByteCount); 
    err = AudioFileGetProperty(audioFileID, 
           kAudioFilePropertyAudioDataByteCount, 
           &audioDataByteCountSize, 
           &audioDataByteCount); 
    NSAssert(err == noErr, @"Couldn't read audio file properties..."); 
    audioData = malloc(audioDataByteCount); 

    // read audio file packets 
    err = AudioFileReadPacketData(audioFileID, 
           false, 
           &audioDataByteCount, 
           NULL, 
           0, 
           &audioDataPacketCount, 
           audioData); 
    NSAssert(err == noErr, @"Couldn't read audio file to memory..."); 

} 

編輯的唯一的地方:我用同樣的代碼結構和讀取音頻文件數據使用ExtAudioFileRead函數取而代之的是內存釋放並重新分配。這可能與我如何使用AudioFileReadPacketData功能有關=/

+0

如果你在儀器中運行內存工具,那麼你應該能夠更好地瞭解哪一點內存在懸掛。 – 2014-09-27 16:35:07

+0

我看到音頻文件讀取到RAM並放入到我的audioData伊娃,我不能免費... – believesInSanta 2014-09-27 16:37:53

+0

我不明白爲什麼所有這些文件都積累 - 他們應該釋放時,我打電話免費(audioData) ?爲什麼...? – believesInSanta 2014-09-27 16:48:10

回答

0

在釋放AudioFileID資源之前,您需要致電AudioFileClose

否則AudioFile保留對音頻數據的引用void指針和內存不能被釋放。

if (audioData != NULL) { 
    NSLog(@"audio data pointer not empty"); 
    AudioFileClose(audioFileID); // <- missing call 
    free (audioData); 
} 
+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 – skuntsel 2014-09-28 08:00:25

+0

我不明白你在說什麼,@skuntsel。對不起,英語不是我的母語。你能簡單地做到嗎? – liaogang 2014-09-28 08:05:44

+0

爲了清晰起見,我編輯了他的答案。一切都很好。 – believesInSanta 2014-09-28 08:08:44

相關問題