2009-09-03 31 views
2

OS Xでリアルタイムオーディオシーケンサーアプリケーションを作成しています。 リアルタイムシンセパートはAURenderCallbackを使用して実装されています。 レンダリングした結果をウェーブファイル(44100Hz 16bit Stereo)に書き込む機能を作っています。 レンダリングコールバック関数の形式は44100Hz 32bit floatステレオインターリーブされています。オーディオユニットとファイルへの書き込み

私はファイルに書き込むのに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; 
    } 
    } 

答えて

1

どのような種類のデバッグを行う前に、実際にそのエラーメッセージが意味するものを理解する必要があります。 GetMacOSStatusErrorString()またはGetMacOSStatusCommentString()にそのステータスコードを渡そうとしましたか?これらはあまりうまく文書化されていませんが、CoreServices/CarbonCore/Debugging.hで宣言されています。

+0

。私はそれらを試してみます。ありがとう! –

2

一部のエラーコードは、実際には4つの文字列です。 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

そして、そのような関数を実行すると、コードが 'insz'であることがわかります。これは、AudioConvert.h: 'kAudioConverterErr_InvalidInputSize = 'insz''にあります。私はあなたが半ダースの大きさをどのように与えたのが大好きで、どちらが間違っているのかを教えてくれません。 –