ExtAudioFileWriteAsync上的EXC_BAD_ACCESS

时间:2012-02-14 13:57:33

标签: objective-c xcode audio exc-bad-access core-audio

我在Mic / Line In Audio Rendering Callback的末尾添加了以下代码。

但该应用程序在EXC_BAD_ACCESS上一直崩溃:

err = ExtAudioFileWriteAsync(mOutputAudioFile, inNumberFrames, ioData);

其余代码如下:

ExtAudioFileRef mOutputAudioFile;
    AudioFileID mAfid;
    NSLog(@"Writing output to file ....");

    NSArray *dirPaths;
    NSString *docsDir;
    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    docsDir = [dirPaths objectAtIndex:0];
    NSLog(@"docDir = %@", docsDir);
    NSString *soundFilePath = [docsDir stringByAppendingPathComponent:@"sound.caf"];
    NSURL *inPath = [NSURL fileURLWithPath:soundFilePath];
    NSLog(@"Output file path is : %@", inPath);

    AudioStreamBasicDescription mStreamFormat;

    mStreamFormat.mChannelsPerFrame     = 1;
    mStreamFormat.mSampleRate           = 44100.00;
    mStreamFormat.mFormatID             = kAudioFormatLinearPCM;
    mStreamFormat.mFormatFlags          = kAudioFormatFlagIsBigEndian | kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
    mStreamFormat.mBitsPerChannel       = 16;
    mStreamFormat.mBytesPerFrame        = 2;
    mStreamFormat.mFramesPerPacket      = 1;
    mStreamFormat.mBytesPerPacket       = 2;
    mStreamFormat.mReserved             = 0;


    err = AudioFileCreateWithURL((CFURLRef)inPath, kAudioFileCAFType, &mStreamFormat, kAudioFileFlags_EraseFile, &mAfid);
    if (err != noErr) {
        NSLog(@"ERROR : Audio file could not be created !! %d", (int)err);

    }
    err = ExtAudioFileWrapAudioFileID(mAfid, true, &mOutputAudioFile);
    err = ExtAudioFileSetProperty(mOutputAudioFile, kExtAudioFileProperty_ClientDataFormat, sizeof(AudioStreamBasicDescription), &mStreamFormat);
    if (ioData) {
        err = ExtAudioFileWriteAsync(mOutputAudioFile, inNumberFrames, ioData);
        if (err != noErr) {
            NSLog(@"ERROR : Audio file could not be written !! %d", (int)err);
        }
    }
    else {

        NSLog(@"No ioData found");
    }
    NSLog(@"Done writing output to file ....");

我已经尝试了几乎所有的东西。如果有人能帮我解决,我会非常感激。谢谢!

更新1:

如果我使用ExtAudioFileWrite而不是ExtAudioFileWriteAsync,应用程序不会崩溃,但会为ExtAudioFileWrite返回错误-50。

我仍然不知道发生了什么。在这方面的任何帮助都非常感谢。

感谢。

2 个答案:

答案 0 :(得分:0)

答案中公布的示例代码回答了我的所有问题:

Can anybody help me in recording iPhone output sound through Audio Unit

非常感谢大家的帮助。

答案 1 :(得分:0)

检查ioData.mNumberBuffers值。对我来说,尽管缓冲列表中只有1个缓冲区,但它被设置为2。这导致了EXC_BAD_ACCESS。