バッファ周りの処理の改良

公開:2011-11-20 07:35
更新:2020-02-15 04:36
カテゴリ:wasapi,c++,dawもどきの作成,windows,audio,windows api

バッファ周りの処理を改良し始めている。タイマーモード(pushモード)時の動作を安定させるため。元々排他・イベントモードをメインに使う想定で実装していたのでタイマーモード、特に共有モードでの動作がいいかげんであった。

排他・イベント(pull)モードでは指定したバッファのサイズ通りにデータをコピーすればよい。なのでWAVファイルデータの読み込み単位はバッファサイズの整数倍にしておくと処理効率が良い。私の場合はバッファサイズの等倍でデータを読みこんで、そのポインタを再生キューに送る。再生側はキューから取り出してコピーするだけだ。

しかしその他のモードではパディングを考慮しなくてはならない。パディングとはバッファ中でまだドライバが処理していないデータのことである。アプリ側はパディングをチェックし、バッファサイズからパディングを除いたデータをコピーする必要がある。私はパディングを除いたデータをコピーするのはデータ構造上面倒なので、パディングがなくなるまで待ってからコピーするようにしていた。がどうもその方式だとデータにギャップができるようでプチったり再生がもたついたりする。これがどのオーディオ・インターフェースでも起こるのではあればすぐ気がついたのだけれど、E-mu0404では問題なかったのである。HDAudioに切り替えてみて初めて気がついた。おそらくオーディオ・インターフェース側が持つバッファの仕様の違いなどがあるのではないかと思うが定かではない。しかしHDAudioでも発生するのは共有・タイマーモードかつバッファサイズが10ms以上のときだけなんだよね。不思議だ。。

そういうわけで排他・イベントモード以外では即パディングを除いたデータを送り残りは次に回すようにコードを書き換えることにする。