Итак, вот сценарий: у меня есть приложение для записи в реальном времени с использованием ExtAudioFileWriteAsync, предназначенное для iOS 4.3. В первый раз, когда я записываю с помощью этого приложения, оно работает отлично. Если я нажимаю стоп, а затем снова записываю, то более чем в половине случаев я получаю EXC_BAD_ACCESS в AudioRingBuffer::GetTimeBounds прямо в момент начала записи.
То есть 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, но ни одна душа не сжалилась надо мной, даже чтобы сделать язвительный комментарий. HALP!
EDIT: Нашел проблему. Ошибка возникала, когда ExtAudioFileWriteAsync пытался записать новый файл до того, как старый файл был "оптимизирован". Небольшая любовь к мьютексу решила проблему.