ios - AudioRingBuffer::GetTimeBounds 中的 EXC_BAD_ACCESS

标签 ios core-audio audiounit

好的,这是场景:我有一个实时录音应用程序,它使用针对 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,这是内存泄漏或某些引用计数被清零,但我终究无法弄清楚它可能是什么,谷歌正在绘制一个完整的空白。我在 CoreAudio 的 Apple 开发论坛上发布了同样的内容,但没有人同情我,甚至没有发表精辟的评论。哈普!

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

最佳答案

我在录音应用程序上遇到了几乎相同的问题,谁能解释一下如何用“A little mutex love”来解决这个问题? 编辑

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

#include <pthread.h>
static pthread_mutex_t outputAudioFileLock;

然后在我的初始化中:

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;
}

再次感谢您的帮助,希望这能节省一些人的时间。

关于ios - AudioRingBuffer::GetTimeBounds 中的 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7961087/

相关文章:

installation - 由于已弃用的核心音频功能,端口音频将无法安装

ios - 音频单元记录噪音

iphone - 谁能帮我通过 Audio Unit 录制 iPhone 输出的声音

audio - 实时 MIDI 输入和音频同步

ios - 将 UIScrollView 连接到 UIView 类

ios - 在iOS应用中使用私钥和证书生成P12文件

ios - 当设备的位置服务关闭时,有什么方法可以启动更新位置吗?

ios - 混合 midi 文件,每个文件都有自己的声音字体

ios - 进入后台并返回前台后无法继续从 AVAssetReaderOutput 读取

ios - 逆脉冲效应