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

Technical Q&A QA1317
Signaling the end of data when using AudioConverterFillComplexBuffer


Q:AudioConverterFillComplexBuffer を使用してデータを変換しているときに、データがなくなったらどうすればよいのでしょうか。

A:データがなくなる理由は 3 つ考えられます。

1. ストリームの終わりに達した。

入力プロシージャの中で、読み取ったパケットの総数と AudioBufferList 内のデータのサイズをゼロに設定する必要があります。また、入力プロシージャから noErrr を返さなければなりません。これが、 AudioConverter に対する、データがなくなったことの通知となります。具体的に言うと、入力プロシージャの中で、ioNumberDataPackets と ioBufferList->mDataByteSize の値をゼロに設定し、noErr を返します。ioNumberDataPackets は、変換されたデータの量を示し、ioBufferList->mDataByteSize は、入力プロシージャコールバック内の各 AudioBuffer において変換されたデータのサイズを示します。入力プロシージャは、それ以降も何度か呼び出されることもありますが、引き続き値をゼロに設定し、noErr を返すようにします。

2. 一部のデータは入力ストリームから入手できるが、入力要求を満たすには不十分な場合。

データをリアルタイムでストリーミングしていると、処理する十分なデータがなくて、コールバックで要求されるデータ量を満たせない状況が生じる可能性があります。この場合は、入力コールバックから noErr と処理済みのパケット量を返してください。残りのパケットについては、入力コールバックが再度呼び出されます。

3. 現在利用できるデータがない場合。

現在入力ストリームから入手できるデータがないのに、変換するデータが残っている場合は、ioNumberDataPackets をゼロに設定し、エラー(ゼロ以外の任意の値)を返します。エラーは呼び出し元に戻されます。データが変換されると、それも呼び出し元に返されます。



注意:
このような状況にあると思われる場合は、AudioConverterFillComplexBuffer を呼び出す際に少量のデータを要求してください。大量のデータを要求して、一部の量を取得しようと考えないでください。

また、データバッファ全体を 1 回の呼び出しで変換するために、コールバックから要求するデータの量を正確に推測しようとしないでください。コーデックは内部的に任意の量のデータをバッファリングできるため、データを小分けに要求するべきです。変換自体に比べれば、変換要求のオーバヘッドは小さいものです。膨大なバッファを要求することは、キャッシュにもよくありません。すべての内部バッファを大きくするか、小さなチャンクに分割してしまうことになります。



AudioConverter の使い方の詳細については、AudioToolbox.framework のヘッダファイル AudioConverter.h を参照してください。


[2004 年 4 月 19 日]