ファイル読み込み部分を非同期バージョンに変更しようとした矢先のこの暑さ。朝から朦朧としている。年寄りにはきついのだ、暑さは。
wasapi共有モードでは異なるさまざまなサンプル・フォーマットへの対応が楽にできそうな感じがしたのだがそうでもないことがわかってきた。 なのでファイル読み込み~wasapiへのデータ出力前に変換処理を入れることにした。その処理時間を稼ぐためにやはり非同期読み込みは必要だ。OSに読ませている間にすでに読み込んだデータの変換処理を入れるのである。あとwasapiにデータをコピーする際もレイテンシ時間の待ちが発生するのでその待ち時間の間にも処理を挟み込めそうな気もするが、その場合はタイマモードではなくイベントモードにした方がいいかもしれない。
で、どう実装するかを考えている。自分で実装しても良いのだけれど、アリネタで良いものがあればそれをそのまま使用したい。暑いしね。
Boost.asioが良さそうな気もするけど、どうだろうね。少しずつ非同期読み込みしないといけないのでその仕様に合うかどうか。後はCode Projectにあった「A Simple Wrapper for Asynchronous File I/O (ReadFileEx, WriteFileEx)」のサンプルコード。
とりあえずBoost.Asioのドキュメントと、サンプルコードをチェックして決めることにする。
しかし非同期読み込み(オーバーラップI/O)は制約が結構あるね。読み込みの開始位置は「セクタサイズの整数倍のバイトオフセットの位置」だとか読み込みサイズは「セクタサイズの整数倍」にしないといけないとか。wasapiのバッファサイズとの最小公倍数で読み取ればいいかな。
上記は間違いであった。ReadFileExは制約はあるが、ReadFileであればその制約はない。というのも間違いであった。上記はFILE_FLAG_NO_BUFFERING オプション時の挙動だった。。