Darkside(https対応しました)

2008年5月21日(水) 17:23

WAVボリューム問題

 非常に不安な関数がある。それは、ボリューム設定を行う waveOutSetVolume() である。

MMRESULT waveOutSetVolume( HWAVEOUT hwo, DWORD dwVolume );

 最初の引数は Windows プログラムではお馴染みの概念である「ハンドル」を指定する。
 open 系の関数でハンドルを取得
        ↓
 そのハンドルを指定して数々の関数を実行
        ↓
 close 系の関数でハンドルを破棄

 問題は2つ目の引数。ここでボリュームを指定するが実は左右別々に指定できる。DWORD は符号無し32ビット整数であり、下位16ビットで左のボリュームを、上位16ビットで右のボリュームを指定する。0が無音で 0xffff が最大となる。
 そう、ボリューム最大が 0xffff なのだ。

 0xffff を与えたときに WAV データそのままのビットが出力されるのであれば何も問題は無い。だが、プログラムの都合からすると WAV 値にボリューム指定値を掛け算し、それを 0xffff で割り算するという処理が行われているかどうか極めて不安である。ちょっとコンピュータのことを分かっていれば自明だが、0xffff で割り算するより 0x10000 で割り算する方が遙かに素直だ。もしも、
 (出力値)=(WAVオリジナル値)×(ボリューム指定値)÷0x10000

 などということが行われていると、ボリュームに指定可能な 0〜0xffff までのいかなる値を与えても WAVオリジナル値そのままを出力出来なくなってしまう。音楽を聴くのであれば実用上は全く問題ないが、ビット列をナマで使いたい場合は大問題だ。
 やる前から心配しているのは、PlaySound() でビット化けしていた事実があるから。手動だがボリュームを最大に引き上げても、LSB近辺が不安定だった。杞憂ならいいが waveOutSetVolume() はボリュームコントロールに連動しているらしいので不安ありまくり。ダブルバッファを実装する前にボリューム問題を確認すべきかもしれない。

written by higashino [ガルバノメーター] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

Comments

TrackBacks

Darkside(https対応しました)

Generated by MySketch GE 1.4.1

Remodelling origin is MySketch 2.7.4