2010-12-07 9 views
5

私はiOS用の周波数検出アプリケーションで作業していましたが、マイクからのオーディオサンプルでユーザー定義のAudioBufferListを埋め込む問題があります。リモートI/Oで録音、AudioUnitRender -50リターンコード

InputCallbackメソッドでAudioUnitRenderを呼び出すと、リターンコードが-50になります。これは私のパラメータの1つが無効であることを意味します。私はそれがAudioBufferListだと思っていますが、何が間違っているのか理解できませんでした。 ASBDで指定したデータ形式と一致するように設定したと思います。以下は

は、リモートI/Oの設定で、機能は私が正しくない可能性が信じていることを呼び出します。

ASBD:

size_t bytesPerSample = sizeof(AudioUnitSampleType); 
AudioStreamBasicDescription localStreamFormat = {0}; 
localStreamFormat.mFormatID = kAudioFormatLinearPCM; 
localStreamFormat.mFormatFlags = kAudioFormatFlagsAudioUnitCanonical; 
localStreamFormat.mBytesPerPacket = bytesPerSample; 
localStreamFormat.mBytesPerFrame = bytesPerSample; 
localStreamFormat.mFramesPerPacket = 1; 
localStreamFormat.mBitsPerChannel = 8 * bytesPerSample; 
localStreamFormat.mChannelsPerFrame = 2; 
localStreamFormat.mSampleRate = sampleRate; 

InputCallback宣言:

err = AudioUnitSetProperty(ioUnit, kAudioOutputUnitProperty_SetInputCallback, 
          kAudioUnitScope_Input, 
          kOutputBus, &callbackStruct, sizeof(callbackStruct)); 

AudioBufferList宣言:

// Allocate AudioBuffers 
bufferList = (AudioBufferList *)malloc(sizeof(AudioBuffer)); 
bufferList->mNumberBuffers = 1; 
bufferList->mBuffers[0].mNumberChannels = 2; 

bufferList->mBuffers[0].mDataByteSize = 1024; 
bufferList->mBuffers[0].mData = calloc(256, sizeof(uint32_t)); 

InputCallback機能:

AudioUnit rioUnit = THIS->ioUnit; 
OSStatus renderErr; 
UInt32 bus1 = 1; 
renderErr = AudioUnitRender(rioUnit, ioActionFlags, inTimeStamp, bus1, inNumberFrames, THIS->bufferList); 

注意すべきいくつか:

  • サンプルレート= 22050ヘルツ
  • リモートI/Oデータの標準フォーマットが8.24ビットの固定小数点であるので、私はサンプルはそれぞれ32ビット(または4バイト)であると仮定します。 unsigned intは4バイトなので、私はそれを使って自分のオーディオバッファを割り当てます。
  • オーディオデータフローを入力のみではなくPassThruとして実装すると、オーディオを正しくレンダリングするために同じコードを取得できます。
  • リモートI/Oで既にMichael Tyson's blog postを見ました。私がやっていることとは違う何かが見えなかった。

ありがとうございました。

Demetri氏

+0

最後に私が言及した周波数検出アプリケーションを終了しました。私は興味のある人のためのソースコードとともに書面を掲示しました。編集:リンク... http://sleepyleaf.com/2011/01/25/pitch-detection-in-ios-4-x/ – irtemed88

+0

上記のコードにはコードが見つかりませんでした。リンクsleepyleaf.com/2011/ 01/25/pitch-in-ios-4-x - irtemed88 –

+0

申し訳ありませんが、私のドメインを更新しました。新しいリンク:http://demetrimiller.com/2011/01/25/pitch-detection-in-ios-4-x/ – irtemed88

答えて

4

フレームあたり2つのチャンネルがある場合は、フレームのサイズとしてbytesPerSampleを使用できません。用語は混乱ビットであるので:

  • サンプル波形における所定の位置に単一の値である
  • は、特定のオーディオストリームに関連付けられたデータを指すチャンネル、すなわち、左/ステレオ用の右チャンネル、モノラル用のシングルチャンネルなど
  • フレームパケットは、1つ以上のフレーム

だから基本的に、あなたはmBytesPerFrameためbytesPerSample * mChannelsPerFrameを使用する必要が含まれている波形

  • 内の指定された位置のためのすべてのチャンネルのサンプルが含まれており、 mBytesPerPacketにはmBytesPerFrame * mFramesPerPacketを使用してください。

    また、サンプルサイズに32ビットを使用しています。実際にこれをやりたいのかどうかはわかりません。通常、16ビットのサンプルを使ってオーディオを録音したいと思っています。ほとんどのリスナーにとって、16と32ビットの音声の差はほとんどありません(平均CDは44.1kHz、16ビットPCMでマスターされています)。これはI/Oとストレージのコストの50%を節約します。

  • +0

    ありがとう!ドキュメントでは、正規のオーディオサンプルフォーマットは8.24ビットの固定小数点であると私は少し混乱していました。私はそれが私が使用しなければならなかったフォーマットであり、32ビットであると仮定しました。 16ビットサンプルを使用している場合、サンプルタイプは16ビット符号付き整数であることを意味しますか? – irtemed88

    +0

    はい、16ビットは、データが技術的に署名されたショートとして格納されていることを意味します。「SInt16」。そして、はい、8-24ビットは最も一般的な範囲を表しますが、ほぼすべての毎日の録画物は16ビットを使用します。 8ビットの音がひどく、誰も16と24の違いを聞くことはできません。 –

    0

    一つの違いは、タイソンのRemoteIOのブログ記事は、リニアPCMのサンプルあたり2つのバイトを使用することです。これは、フォーマットに互換性のないエラーである可能性があります。

    +0

    なぜ私はフォーマットのためのkAudioFormatFlagsAudioUnitCanonicalを設定して以来、これが問題になるのか分かりませんフラグ。ドキュメントは、これが8.24ビットの固定小数点形式であることを示しています。 – irtemed88

    0

    bufferList = (AudioBufferList *)malloc(sizeof(AudioBuffer));も間違っています。 AudioBufferはAudioBufferListよりも小さいので、十分なメモリが割り当てられません。