音频单元和写入文件

时间:2009-09-03 16:57:54

标签: macos audio

我正在OS X上创建实时音频音序器应用程序。 实时合成器部分使用AURenderCallback实现。 现在我正在创建将渲染结果写入Wave File (44100Hz 16bit Stereo)的函数。 渲染回调函数的格式是44100Hz 32bit float Stereo interleaved。

我正在使用ExtAudioFileWrite写入文件。 但ExtAudioFileWrite函数返回错误代码1768846202;

我搜索1768846202但我无法获取信息。 你能给我一些提示吗?

谢谢。

这是代码。

    outFileFormat.mSampleRate = 44100;
    outFileFormat.mFormatID = kAudioFormatLinearPCM;
    outFileFormat.mFormatFlags = 
 kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
    outFileFormat.mBitsPerChannel = 16;
    outFileFormat.mChannelsPerFrame = 2;
    outFileFormat.mFramesPerPacket = 1;
    outFileFormat.mBytesPerFrame = 
 outFileFormat.mBitsPerChannel / 8 * outFileFormat.mChannelsPerFrame;
    outFileFormat.mBytesPerPacket = 
 outFileFormat.mBytesPerFrame * outFileFormat.mFramesPerPacket;

 AudioBufferList *ioList;
    ioList = (AudioBufferList*)calloc(1, sizeof(AudioBufferList)
         + 2 * sizeof(AudioBuffer));
    ioList->mNumberBuffers = 2;
    ioList->mBuffers[0].mNumberChannels = 1;
    ioList->mBuffers[0].mDataByteSize = allocByteSize / 2;
    ioList->mBuffers[0].mData = ioDataL;
 ioList->mBuffers[1].mNumberChannels = 1;
    ioList->mBuffers[1].mDataByteSize = allocByteSize / 2;
    ioList->mBuffers[1].mData = ioDataR;

...

while (1) {
  //Fill buffer by using render callback func.
  RenderCallback(self, nil, nil, 0, frames, ioList);

        //i want to create one sec file.
        if (renderedFrames >= 44100) break;

  err = ExtAudioFileWrite(outAudioFileRef, frames , ioList);
  if (err != noErr){
   NSLog(@"ERROR AT WRITING TO FILE");
   goto errorExit;
  }
    }

2 个答案:

答案 0 :(得分:2)

有些错误代码实际上是四个字符串。 Core Audio本书提供了一个很好的处理错误的功能。

static void CheckError(OSStatus error, const char *operation)
{
    if (error == noErr) return;

    char str[20];
    // see if it appears to be a 4-char-code
    *(UInt32 *)(str + 1) = CFSwapInt32HostToBig(error);
    if (isprint(str[1]) && isprint(str[2]) && isprint(str[3]) && isprint(str[4])) {
        str[0] = str[5] = '\'';
        str[6] = '\0';
    } else
        // no, format it as an integer
        sprintf(str, "%d", (int)error);

    fprintf(stderr, "Error: %s (%s)\n", operation, str);

    exit(1);
}

像这样使用:

CheckError(ExtAudioFileSetProperty(outputFile, 
                                 kExtAudioFileProperty_CodecManufacturer, 
                                 sizeof(codec), 
                                 &codec), "Setting codec.");

答案 1 :(得分:1)

在进行任何类型的调试之前,您可能需要弄清楚错误消息的实际含义。您是否尝试将该状态代码传递给GetMacOSStatusErrorString()或GetMacOSStatusCommentString()?它们没有很好地记录,但它们在CoreServices / CarbonCore / Debugging.h中声明。