高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1348
Sequence Grabber - Using the SGDataProc for Sound

Q: 現在、SGDataProcSample を使って作業しています。Video SGChannel でサンプルをキャプチャするのと同じ手法を Sound SGChannel で使ってオーディオを処理できるかどうか教えてください。

A: はい、もちろんできます。ビデオとサウンドをキャプチャする際、SGDataProc に渡される SGChannel パラメータは、Video SGChannel または Sound SGChannel のどちらかになります。これらのどちらが渡されたかを毎回コールバックを通じてチェックし、それに応じて先へ進むことができます。

SGDataProc コールバックを登録すると、バッファがディスクに書き込まれると同時に渡されます。デフォルトでは、Sound SGChannel (SoundMediaType) はオーディオデータを約 1 秒間隔で内部的にバッファリングします。つまり、オーディオデータの場合は、SGDataProc が約 1 秒に 1 回呼び出されるということです。この動作を変更するには、SGSetSoundRecordChunkSize を呼び出して、チャンク当たりの秒数パラメータを必要に応じて高い値や低い値に設定します。

また、SGDataProc に渡す writeType パラメータも認識する必要があります。Video SGChannel を扱う場合、writeType パラメータは必ず seqGrabWriteAppend と同じになります。しかし、サウンドの場合は異なります。Sound SGChannel は、Video SGChannel とはデータの書き込みが異なり、まずブロックを予約し、次の SGIdle 呼び出し時にブロックを書き込みます。つまり、writeTypeseqGrabWriteReserve と同じ場合、SGDataProc に渡されるポインタ (Ptr p) が無視されるため、何もせずに戻ることできます。writeTypeseqGrabWriteFill と同じであれば、データを処理できます。

注意:
SGSetSoundRecordChunkSize は「チャンクあたりの秒数」として long を取ります。1 秒より短い期間でチャンクを記録したい場合は、(SInt32 ではなく)負の Fixed(固定)小数点値で渡す必要があります。たとえば、0.5 秒のチャンクにしたい場合は、0xFFFF8000Fixed 小数点値の -0.5)を渡します。

Sound SGChannel が Sound Manager を使ってオーディオデータを取得すると、そのデータは必ず、SGSettingsDialog などの API を使って選択された形式で、インターリーブされたバッファに提供されることを覚えておいてください。デフォルトの形式は、16 ビットの 2 の補数('twos' - 下記の注を参照)で、"NONE" 圧縮タイプによって指定されます。32 ビットの浮動小数点数または 24 ビットの整数など、他の形式を選択した場合、DataProc に提供されるデータは異なります。QDesign などの圧縮形式を選択した場合、データはすでにパケットに圧縮されています。

左右のチャンネルに別々にアクセスしたり、データを何らかの AudioUnit に渡したりすることによってデータを面白い方法で処理したい場合は、必ずデータをインターリーブ解除する必要があります。これは、AudioConverterAudioConverter.h を参照)を使って行えます。この場合は、デフォルトの 'twos' 形式を使って Sound SGChannel からグラブし、その後で一度だけ変換を実行するほうが賢明です。これを実行するには、単一の AudioConverter を使用して、16ビット符号付き整数インターリーブ形式から、Core Audio による処理が可能な 32 ビット浮動小数点数非デインターリーブ形式に変換します。

前述のように、seconds パラメータを低い値に設定することで、SGSetSoundRecordChunkSize を使って待ち時間を短縮することができます。この場合、SGDataProc には、より小さなチャンクのオーディオデータが、より頻繁に渡されることになります。

注意:
デフォルトのキャプチャ形式は 16 ビットの 2 の補数で、サンプルは最小値 0x8000 (-32768) から 最大値 0x7fff (32767) の範囲です。


参考資料:


[2004 年 4 月 6 日]