繁体   English   中英

如何释放AudioFileReadPacketData使用的内存-Xcode显示仍在使用的内存

[英]how to free memory used by AudioFileReadPacketData - Xcode shows memory still in use

我通过传递MPMediaItem对象,使用以下方法将音频文件读取到RAM中。 但是,每次调用此函数时,应该以函数的开头释放用于前一个音频文件的内存,而不会这样做,即Xcode显示,每次调用该函数时内存使用量一直在增加,最终OS内存不足。

我在做任何明显错误的事情吗?

注意:以下功能是我使用audioData ivar的唯一位置

乐器中的内存分配摘要

通过以下功能缓存在内存中的相同音频文件

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函数= /有关

您需要在释放AudioFileID资源之前调用AudioFileClose

否则,AudioFile会保留对音频数据空指针的引用,并且无法释放内存。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM