2014-09-27 87 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

相关问题