[英]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.