とりあえず音を鳴らすところまでは出来た。
ファイルの選択、状態に応じたUI表示、ファイル読み込みおよび再生・一時停止・停止部分を実装した。UI部分はWindows API全開である。ただキーボードによるUIコントロール間の移動ができない。また凡ミスだろう。
WAVファイル読み込みはWASAPIのサンプルコードをほぼそのままであり、まだオーバーラップI/Oを使った非同期読み込みは使っていない。読み込みスレッド上で少しずつつファイルを読み込んでバッファに格納している。これでいいのかなと思うがやはりオーバーラップI/Oは使ってみたい。
wasapiの共有モード再生も過去に作ったコードを少々いじって実装。しかしまだサンプルフォーマットがコンパネの設定と異なるときの挙動を実装していないのでエラーで落ちる。 IAudioClockAdjustmentでサンプルレートのコンバート、サンプルビット数は自前で変換コードを書かないといけない。排他モードで動かしても手間に関しては大した差はないかもしれない。
サンプルレート・サンプルビット数の変換は自前で書かなくてもいいライブラリがありそうだ。
両方共ソースコードが公開されているので、それを参考にして排他モードで実装してみても良いかもしれない。でもまずは共有モードで行くか。APOがいろいろあるのでそれを試してみたいしね。
The Synthesis ToolKit in C++ (STK)にもあるかもしれないのでチェックしてみようかなと思う。
サンプルレート・サンプルビット数変換処理は非同期読み込みをうまく使って読み込み終了までの時間か、wasapiのレイテンシ分の待ち時間中かどちらかで行おうと思っている。
スレッドの同期まわりは結局イベントとboost::atomic、boost::lockfreeで実装した。イベントはまあいいとしてatomic変数やらlockfreeコンテナはまだ理解の途中でかなりいい加減な実装である。理解が深まれば見直そうかなと思っている。