2010-12-12 4 views
2

aurioTouchサンプルアプリケーションでは、RemoteIOオーディオユニットは、8.24固定小数点形式の2チャンネル非インターリーブLPCM用に設定されています。これはiOSプラットフォームで推奨されるフォーマットであり、ハードウェアADCがどのようなものを放出しているかを想定しています。だから私は、アプリケーションが後でオーディオバッファを受信したとき、それはいくつかのために、そのMDATAメンバーに詰め2チャンネル分のデータを持っていることを期待しiOS LPCM 2チャンネルの非インターリーブオーディオ入力:不可能?

// set our required format - Canonical AU format: LPCM non-interleaved 8.24 fixed point 
outFormat.SetAUCanonical(2, false); 

:彼らも、これについてのコメント(source)を作りました。

mData = [L1, L2, L3, L4, R1, R2, R3, R4]; 

ここで、LとRは、ステレオマイクの左右チャンネルのデータを表します。 「インターリーブ」falseの場合、それはによって「mBytesPerPacket」とmBytesPerFrame」を掛けていない

void SetAUCanonical(UInt32 nChannels, bool interleaved) 
{ 
    mFormatID = kAudioFormatLinearPCM; 
#if CA_PREFER_FIXED_POINT 
    mFormatFlags = kAudioFormatFlagsCanonical | (kAudioUnitSampleFractionBits << kLinearPCMFormatFlagsSampleFractionShift); 
#else 
    mFormatFlags = kAudioFormatFlagsCanonical; 
#endif 
    mChannelsPerFrame = nChannels; 
    mFramesPerPacket = 1; 
    mBitsPerChannel = 8 * sizeof(AudioUnitSampleType); 
    if (interleaved) 
     mBytesPerPacket = mBytesPerFrame = nChannels * sizeof(AudioUnitSampleType); 
    else { 
     mBytesPerPacket = mBytesPerFrame = sizeof(AudioUnitSampleType); 
     mFormatFlags |= kAudioFormatFlagIsNonInterleaved; 
    } 
} 

:それだけではSetAUCannonical()が追加チャネルを保持するのに十分なmemmoryを設定していないので、それは当てはまらないことができそうですチャネル数。余分なチャンネルを格納するのに十分なビットがフレームにはありません。

サンプルコードは、2つのチャンネルを聞いたときにちょっと誤解を招くことがありますか?それはちょうどその、とにかく戻って取得しようとして何のthats以来、1つのチャネルを求めてすべきこと:

outFormat.SetAUCanonical(1, false); 

私はちょうど「修正」は、これが

mChannelsPerFrame = nChannels; 
if (!interleaved) { 
    mChannelsPerFrame = 1 
    mFormatFlags |= kAudioFormatFlagIsNonInterleaved; 
} 
mFramesPerPacket = 1; 
mBitsPerChannel = 8 * sizeof(AudioUnitSampleType); 
mBytesPerPacket = mBytesPerFrame = nChannels * sizeof(AudioUnitSampleType);  

?:明確なものを作るのが好きかであるSetAUCannonicalことができます2つのチャンネルを求める理由がいくつかありますか?私はマイクがステレオマイクだとは思わない。

答えて

2

内蔵マイクとヘッドセットのマイク入力は両方ともモノラルです。

カメラ接続キットには、いくつかの以前のOSのバージョンを実行しているいくつかの新しいiOSデバイス上でいくつかのUSBマイクからステレオオーディオ入力が可能になったかもしれないが、私は、現在のOSのリリースで、この作業のいずれかのレポートを見ていません。

また、2チャンネル(ステレオ)非インターリーブ形式が1つのバッファに連結データの代わりに、RemoteIOコールバックに2つのバッファを返す可能性があるかどうかをチェックします。

+0

私は今夜これを調べます。 –

+0

それは私の経験でした。インターリーブされた状態には何も指定していませんでした。 SimulatorはデフォルトでIOコールバック内に1つのインターリーブバッファを必要としますが、デフォルトでは2つのシングルチャネルバッファが必要です。 –

1

は、私はあなたが「インターリーブ」と「非インターリーブを」混乱していると思うのCoreAudioはあなたを与えるかというのABLのデータ。 SetAUCanonical()は正しいことをしています。 ABLにはバッファの可変配列があり、非インターリーブの場合、各バッファは単一チャネルのデータしか保持しません。

0

問題は(時には)誤解を招く変数名です。私はそれも好きではありませんが、ここで何が起こっているのか説明しています。

NonInterleaved (of any form)と設定すると、mChannelsPerFrameはチャネル数を指定し、残りのフィールドは1つのチャネルの望ましいプロパティを指定する必要があります。 したがって、チャンネル数で倍数にする必要はありません。適切な値は次のとおりです。

mBytesPerPacket = mFramesPerPacket * sizeof(sampleSizeInBytes); // e.g. sizeof(float) 
mBytesPerFrame = sizeof(sampleSizeInBytes); 
関連する問題