Хорошо, вот сценарий: у меня есть приложение для записи в реальном времени, использующее 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, что это утечка памяти или что-то, что подсчет ссылок сбивается до нуля, но я не могу понять, что это может быть, и Googles рисуют полный пробел.Я разместил эту же вещь на форуме разработчиков Apple для CoreAudio, но ни одна душа не пожалела меня, даже чтобы сделать содержательный комментарий.HALP!
РЕДАКТИРОВАТЬ: Обнаружена проблема.Ошибка происходила, когда ExtAudioFileWriteAsync пытался записать новый файл, прежде чем старый файл был «оптимизирован».Небольшая любовь мьютекса решила проблему.