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つのチャンネルを求める理由がいくつかありますか?私はマイクがステレオマイクだとは思わない。
私は今夜これを調べます。 –
それは私の経験でした。インターリーブされた状態には何も指定していませんでした。 SimulatorはデフォルトでIOコールバック内に1つのインターリーブバッファを必要としますが、デフォルトでは2つのシングルチャネルバッファが必要です。 –