ASIOのバッファサイズ
ASIOには指定可能なバッファサイズを取得するASIOGetBufferSize関数があります。
ASIOError ASIOGetBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity);
ここで、
- minSize
- 設定可能な最小バッファサイズ
- maxSize
- 設定可能な最大バッファサイズ
- preferredSize
- ドライバあるいはユーザー設定による既定バッファサイズ
- granularity
- バッファサイズの増加幅。-1ならバッファサイズは2のn乗のみ。
です。(バッファサイズの単位はバイト数でなくサンプル数)
曲者はgranularityです。これが-1しか取らないのであれば、単純に
class asio_device { public: // 設定可能なバッファサイズの一覧を返す std::vector<long> available_buffer_sizes() const; };
のような設計が出来るのですが、granularityが小さな正の数の場合に巨大なvectorを返すことになります。
granularityに応じて動きを変える反復子を作ればメモリを節約できるようにも思えますが、この手の「仮想ランダムアクセス反復子」には、RandomAccessTraversal IteratorにすることができてもRandomAccess Iteratorにはならない微妙な問題があります。
参考: http://thread.gmane.org/gmane.comp.lib.boost.devel/140535
ASIO SDKのマニュアルによると、通常はgranularity=-1となるようですし、granularityの値に関わらず、常に2のn乗だけを扱うのが無難な気がします。
一応、available_buffer_sizes()の返す一覧にない値もバッファサイズとして設定することは可能(結果はエラーとなるかもしれない)ですから、それほど強い制約でもないと思います。