RSS Twitter Facebook

2012/11/19 (2012年11月 のアーカイブ)

WMPのオーディオDSPプラグインのテスト

この記事は藤本健氏の記事「「Windowsオーディオエンジンで音質劣化」を検証 」
http://av.watch.impress.co.jp/docs/series/dal/20121112_572414.html
およびありぱぱ氏の記事「Windows Media Playerは音質が悪い?」
http://dgo.xsrv.jp/alipapa/wmp/
で言及されているWindowsでの音の再生時にある条件でリミッターがかかり、本来のデータがそのまま出てこないという現象に関するメモです。

Twitter上で色々と議論が交わされているのを見て興味が湧き、ついちょっと横から口出ししたりしてたのですが、状況整理と、回避のテストの一部としてTwitterの140字では説明が厳しいものがあるのでここに書いておきます。

とりあえず今わかっている事

テスト方法 ループバックできるオーディオIF、またはSPDIFで接続した2台のIF or PCを使い、0dBFSまで振れているデータを再生し、戻ってきたデータと比較する。
症状 振幅が-0.13dBFS (= 0.985くらい) のあたりでリミッタがかかる。  単にクリップするのではなく、多少先読みしてゲインリダクションしている。
回避方法など
  • ASIO(ASIO4ALLでも可)、WASAPI排他モード、WDM/KSを使う事で発生しない
  • 発生するのは MME、DirectSound、WASAPI共有モード
  • 元ソースが-0.13dBFS以上まで振れてなければそもそも問題なし
  • 注意点として、再生アプリのボリューム(例えばMediaPlayerの音量バー)を下げても回避できないものが多い。
    (これはアプリの作りによる。内部処理で音量を下げているのなら回避できるが、多くはシステムのボリューム(タスクトレイの所にあるミキサー)を操作しているだけ)
  • なお、MMEの場合のみ挙動が一部異なり、再生アプリのボリュームを下げると回避できる

で、やっかいなのは一番ユーザーが多いと思われるWindows Media Player(WMP)での再生の場合に回避が難しいこと。

だったのですが、WMPにはオーディオDSPプラグインという機構があって再生時にエフェクトをかけたりする事ができるのですが、そこに細工をして解決するという道がなくはない、というのが今の所のWMPに対する最善策。もちろん、使用アプリをWMPじゃなくてfoobar2000にASIO入れたものにするとかすれば問題なくなるのですが。

(1) 例えばこれは、WMPからASIOに出力するプラグインです。これでWMPの出力をASIOに流してしまえばリミッターは通りません。
http://sourceforge.jp/projects/sfnet_asiowmpplg/
ただ私がテストした限りでは時々データがこぼれたりしていまいち安定していません。

(2) もう1つはプラグインで全体のレベルを-0.13dBほど下げるという方法があります。
単純に音量を制御する、というプラグインは、Windows SDKのサンプルプログラムとして入っていますので、これをそのままビルドしたものが使えます。
ビルドしたもの⇒wmpplugin1.zip
これの使い方はちょっと面倒です。

解凍するとwmpplugin1.dll というファイルが出てきます。
wmpplugin1.dllのあるディレクトリでコマンドプロンプトから

>regsvr32 wmpplugin1.dll

とするとシステムに登録されます (ちなみに削除する場合は 「>regsvr32 /u wmpplugin1.dll」とします)。
WMPを立ち上げて再生画面を右クリック⇒「その他のオプション」⇒「プラグイン」⇒「オーディオDSP」を選択
「オーディオDSP:」の欄でWmpplugin1 plugin にチェックして選択し、「プロパティ」
Scale Factor (0.0 to 1.0): の欄が最初は1.0になっているのを 「0.98」に編集しOK

これでWMPでの再生は全て音量が0.98 ( = -0.175dB) と少しだけ下がったものになり、リミッターのスレッショルドにひっかからなくなります。

Posted by g200kg : 2012/11/19 19:19:48