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()の返す一覧にない値もバッファサイズとして設定することは可能(結果はエラーとなるかもしれない)ですから、それほど強い制約でもないと思います。