WASAPI共有モードやwaveOut系API出力の音質劣化対策
2014/02/22作成

早速ですが、今回は電子機器とは全く関係ありません。
Windows Vista以降のOSでは音声出力とミキサーの実装がXP以前と全く異なり、大きな音量の音楽等を再生すると、Internet Explorerのページ移動時の音等の他の効果音を正しく再生するために音量を自動的に調整する機能が含まれています。
この機能は一般的にピークリミッターと呼ばれ、オーディオミキサーには一般的に必要とされています。
しかし、Vista以降のピークリミッターは効果音の発音の遅延を防ぐためか、効果音等が再生される時だけにリミッターが働くのではなく、大きな音量で一つの音声だけを再生している時も働いてしまい、またリミッターの実装が音質を考慮しない単純なもののため、結果として音質の劣化を招いています。
Windowsの設定を変更するにはレジストリ等を編集することが一般的ですが、残念ながらピークリミッターがあるWindows Audio Engineは著作権保護のためにリミッターの設定を変更できないようになっています。
また同様の理由でWindows Audio Engine関係のファイルを書き換えることも出来ません。
そこで今回はメモリ上にあるピークリミッターのコードを書き換え、一つの音声の再生ではピークリミッターが働かないようにし、音質の劣化を防ぐプログラムDisable Peak Limiter in Windows Audio Engineを自作しました。

まず初めにピークリミッターの挙動をWaveGeneWaveSpectraで確認しました。

ピークリミッター有効-10dB

まず何も対策を行わない状態で-10dBの音声を再生しました。
デバイスの音量は適当ですが、ステレオミキサーによるループバック録音で-32.86dBを示しています。

ピークリミッター有効0dB

次に0dBの音声を再生しました。
録音は-22.98dBを示しており、10dB音量を上げたはずが9.88dBしか上がっていません。
ピークリミッターにより再生時の音量が0.12dB小さくされているためです。

ピークリミッター無効0dB

ここで自作のDisable Peak Limiter in Windows Audio Engineを実行し、ピークリミッターを無効化し、同様に0dBの音声を再生しました。
録音は-22.85dBを示しており、正常に音量が10dB上がっていることが確認できました。
なお、この状態で他の音声を同時に再生するとピークリミッターが働きます。

現在のところ、このいい加減な実装のピークリミッターはWindows 8.1でも使われているようで、8.1も同様にリミッターを無効化することが出来ました。


目次 質問フォーム Q&A このサイトについて トップページ