音を鳴らすための作業を進めている。
オーディオインターフェイスとプレイヤーはコントローラクラスのメンバーにする。コントローラのクラスはシングルトンとなっていて、どこからでも参照可能とする。
ドライバとプレイヤーを繋ぐバッファ部分はコントローラのメンバーとし、パブリックで公開する。
バッファは昨日書いた通りリングバッファとする。
リングバッファはfloatで16キロバイト(4096個)の大きさで、読みだし用と書きこみ用のポインタを持つ。
リングバッファはインターフェイスが持つ出力ポートの数に応じて複数用意する。
再生時はまずドライバのスレッドを起動し、その後Waveデータをオープンし、リングバッファに書き込む。ドライバスレッドは、リングバッファデータをバッファのフォーマットに変換しつつコピーする。
ASIOの場合、カーネルミキサを通さないので自前でサンプリングレートやフォーマット変換を行わなくてはならない。そこが面倒なところだ。
しかし余分なミキシング機能やサンプリングレートコンバータをバイパスする分音質が良くなると言われている(ここのBBS参照。実情はもっと複雑だったりする)。
カーネルミキサを超えるサンプリングレートコンバータやミキサを作れればの話だが・・