2

私はiOS用のアプリケーションを開発しています。このアプリケーションは、RemoteIOオーディオユニットを使用してマイクからのオーディオを録音し、処理してスピーカー(ヘッドセット)に出力します。現在、入出力にはシングルチャンネル(モノラル)を使用しています。

私がやりたいのは、ユーザーが出力スピーカーを選択できるようにすることです。左のみ、右のみ、またはその両方です。私の現在のコードは「両方」の設定のみをサポートしています。同じ音が両方のスピーカーから聞こえます。

入力バスと出力バスのストリーム形式(kAudioUnitProperty_StreamFormat)を設定する方法は次のとおりです。

AudioStreamBasicDescription ASBD = {0};
size_t bytesPerSample = sizeof(SInt16);
ASBD.mFormatID = kAudioFormatLinearPCM;
ASBD.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
ASBD.mSampleRate = 44100;
ASBD.mFramesPerPacket = 1;
ASBD.mBytesPerFrame = bytesPerSample;
ASBD.mBytesPerPacket = bytesPerSample;
ASBD.mBitsPerChannel = 8 * bytesPerSample;
ASBD.mChannelsPerFrame = 1;

そして、私のレンダリングコールバック(kAudioUnitProperty_SetRenderCallback)はおおよそ次のようになります。

AudioUnitRender(remoteIO, ioActionFlags, inTimeStamp, inputBus, inNumberFrames, ioData);
SInt16 *renderBuffer = ioData->mBuffers[0].mData;
// Process renderBuffer and modify the samples

左のみ/右のみの設定を実装する最も簡単な方法は何でしょうか?何か関係があれば、デバイスの設定を変更してもかまいません。

4

1 に答える 1

2

これを行う最も簡単な方法は、制御する両方のRemoteIO要素(つまり、入力スコープの出力要素と出力スコープの入力要素)でステレオASBDを使用し、非アクティブなチャネルのサンプルとしてゼロを送信することです。もしあれば。

RemoteIOユニットは、オンザフライ形式変換の容量が限られていますが、内部形式コンバーターを使用して、マイクからのモノラルストリームをステレオストリームに分割できます。

これが正しく構成されている場合、正確なASBDに応じて、レンダーコールバックは、チャネルごとに個別のバッファー(非インターリーブ)または単一のインターリーブバッファーを持つバッファーリストを受け取ります。バッファーの1つ(インターリーブされていない場合)を実行するか、サンプルを反復処理してミュートする必要がありbzeroます(ゼロに設定、インターリーブされた場合)。

(注:選択的チャネルミューティングはおそらく独自の処理後に行われるため、ステレオデータに対応するために独自のコードを変更する必要がある場合があります。または、RemoteIOユニットの入力スコープの出力要素をモノラルサンプルを出力するように設定します。そこで処理し、独自のAudioConverterを使用して、後でストリームをステレオに分割します。)

于 2012-05-30T20:24:51.957 に答える