![]() |
C++標準はストリームを位置指定能力に関して次の2つに分類している。
任意の整数値位置にシーク可能なストリーム
以前に停止した位置に対してだけシーク可能なストリーム
一般に、オーディオデータの量子化ビット数は8ないし16ビットであり、これをチャンネル数分まとめた1サンプルがオーディオストリームの最小単位となる。これを8ビットchar型 [1] のストリームで表現すると、ストリームの位置はサンプルサイズの倍数の値しかとることができない。よって、サンプルが8ビットモノラルでない限り、Hamigaki.Audioライブラリの提供する入力ストリームは全て位置復元可能ストリームとなる。
ストリームの文字型としてサンプルサイズの型を選択することもできただろう。しかし、この方法には以下のような問題がある。
チャンネル数によっては、サンプルサイズに適した基本型がない場合がある。文字型を構造体にすると、パディングのため空間効率が悪くなったり、char配列とオブジェクト表現(object representation)が異なるためmemcopy()のような処理が行えなくなり、処理効率が落ちる可能性がある。
少なくとも現在のBoost.Iostreams実装では、std::char_traitsの特殊化に依存した箇所がある。std名前空間へ基本型に対するテンプレートの特殊化を追加した場合の動作は未定義とされている。[17.4.3.1]
通常、サンプルサイズはオーディオデータのヘッダ情報を解釈するまで確定しないので、テンプレート実引数としてコンパイル時にサンプルの型を指定することができない。
こうして位置復元可能ストリームが選択された。
製作著作 © 2006 Takeshi Mouri |