好的,这是场景:我有一个针对iOS 4.3的使用ExtAudioFileWriteAsync的实时录音应用程序。我第一次使用该应用程序录制时,它运行良好。如果我按下停止键,然后再进行录制,这比一半的时间要好,因为录制开始时,我会立即在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,我假设这是内存泄漏或某些引用计数被减为零,但是我一生无法弄清楚它可能是什么,而Google却将其完全空白。我在苹果公司针对CoreAudio的开发论坛上发布了同样的东西,但是没有一个人怜悯我,甚至没有发表任何评论。警惕!

编辑:发现了问题。在“优化”旧文件之前,ExtAudioFileWriteAsync尝试写入新文件时发生错误。一点互斥爱解决了这个问题。

最佳答案

我在录音应用程序中遇到的问题几乎相同,有人可以解释一下如何用“一点互斥爱”来解决它吗?
编辑

Tnx与Chris Randall的关系我确实设法解决了我的问题。这就是我实现互斥锁的方式:

#include <pthread.h>
static pthread_mutex_t outputAudioFileLock;

然后在我的init中:
pthread_mutex_init(&outputAudioFileLock,NULL);

并在回调中:
if (THIS.mIsRecording) {
        if (0 == pthread_mutex_trylock(&outputAudioFileLock)) {
        OSStatus err = ExtAudioFileWriteAsync(THIS.mRecordFile, inNumberFrames, THIS.recordingBufferList);
        if (noErr != err) {
            NSLog(@"ExtAudioFileWriteAsync Failed: %ld!!!", err);
        } else {
        }
        pthread_mutex_unlock(&outputAudioFileLock);
    }
    }

最后在stopRecord方法中:
if (mRecordFile) {

    pthread_mutex_lock(&outputAudioFileLock);
    OSStatus setupErr;
    setupErr = ExtAudioFileDispose(mRecordFile);
    mRecordFile = NULL;
    pthread_mutex_unlock(&outputAudioFileLock);
    NSAssert(setupErr == noErr, @"Couldn't dispose audio file");
    NSLog(@"Stopping Record");
    mIsRecording = NO;
}

Tnx再次寻求帮助,希望这可以节省人的时间。

10-08 16:56