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 日]
|