好的,这是场景:我有一个使用 ExtAudioFileWriteAsync 针对 iOS 4.3 的实时录音应用程序。我第一次使用该应用程序录制时,它运行良好。如果我按停止,然后再次录制,则有一半的时间我会在录制开始时在 AudioRingBuffer::GetTimeBounds 中获得 EXC_BAD_ACCESS。
也就是说,ExtAudioFileWriteAsync 在开始第二次录制时在 GetTimeBounds 上失败。下面是录制开始时触发的一段代码,它创建了 ExtAudioFile 引用:
- (void) setActive:(NSString *) file
{
if (mExtAFRef) {
ExtAudioFileDispose(mExtAFRef);
mExtAFRef = nil;
NSLog(@"mExtAFRef Disposed.");
}
if (mOutputAudioFile)
{
ExtAudioFileDispose(mOutputAudioFile);
mOutputAudioFile = nil;
NSLog(@"mOutputAudioFile Disposed.");
}
NSURL *outUrl = [NSURL fileURLWithPath:file];
OSStatus setupErr = ExtAudioFileCreateWithURL((CFURLRef)outUrl, kAudioFileWAVEType, &mOutputFormat, NULL, kAudioFileFlags_EraseFile, &mOutputAudioFile);
NSAssert(setupErr == noErr, @"Couldn't create file for writing");
setupErr = ExtAudioFileSetProperty(mOutputAudioFile, kExtAudioFileProperty_ClientDataFormat, sizeof(AudioStreamBasicDescription), &audioFormat);
NSAssert(setupErr == noErr, @"Couldn't create file for format");
setupErr = ExtAudioFileWriteAsync(mOutputAudioFile, 0, NULL);
NSAssert(setupErr == noErr, @"Couldn't initialize write buffers for audio file");
isActive = TRUE;
}
有没有人对可能导致这种情况的原因有任何想法?我假设,鉴于 EXC_BAD_ACCESS,这是内存泄漏或某些东西的引用计数被敲到零,但我无法终生弄清楚它可能是什么,而谷歌正在画一个完全空白。我在 Apple 开发论坛上为 CoreAudio 发布了同样的内容,但没有人同情我,甚至发表了一句精辟的评论。停!
编辑:发现问题。当 ExtAudioFileWriteAsync 在旧文件“优化”之前尝试写入新文件时发生错误。一点互斥爱解决了这个问题。