WASAPI 排他モード – foobar2000でさらなる音質向上を目指してみよう


私が普段使用している音楽プレイヤーは「foobar2000」というフリーのプレイヤーです。
カスタマイズが基本の中級者以上向けプレイヤーですが、中々おもしろいプレイヤーですのでお気に入りです。

foobar2000は音楽データのソフトウェア面での処理の仕方がうまいため、「Windows Media Playe」や「iTunes」などのメジャープレイヤーよりクリアな音が流れると評判です。

さて、標準状態でも中々よい音を出してくれるfoobar2000ですが、実は更なる音質向上の手段を持っています。
それが、今回解説する「WASAPI 排他モード」と呼ばれる機能です。

環境が揃っていれば比較的簡単に実行でき、かつお金もかからない方法ですので、興味のある方は一度試してみましょう。

foobar2000のWASAPI出力設定
▲クリックで拡大

ブログ内関連記事

「foobae2000って?」とか「音楽データのこと知らない」という方は、まず以下の記事をお読みいただければ幸いです。
WASAPI 排他モードを使うならもちろん、無圧縮または可逆圧縮の音源を利用しましょう。
(別にこのブログの記事でなくてもいいですが、基礎となる知識がないと理解しにくいと思うので。)

WASAPI とは

ここから少し長くなりますし、中々理解しにくい内容ですが、できるだけかみ砕いて解説できるよう努力します。
(正直、私も理解していないところ多数あるので間違っているところがあるかもしれませんが、目的は達成できるはず)

WASAPIはVista以降のOS標準機能

WASAPI【Windows Audio Session API】、通常「ワサピ」と呼ばれている(のかな?)はWindows Vista SP1以降のOSに標準搭載されているオーディオAPIのことです。(XPでは使うことができません)

OS標準の機能のため、こちらで特別なドライバなどを用意する必要はありません。
ただし、WASAPIを使うにはデバイスとソフトウェア側の対応がなされていることが必要です。

API「Application Programming Interface」とは、ある一連の動作・機能(関数)をひとまとめにした、プログラムの部品と考えていただければ大丈夫です。最初からプログラミングするのはとても面倒なので、よく使う動作(共通の動作、例えばコピーなど)はAPIとしてまとめ、簡単にプログラムできるように設定されています。

「API」と呼ばれているのですから、何か一連の動作をまとめているということになります。一体何をまとめているのか。

「Windows Audio Session:ウィンドウズ オーディオ セッション」とは、Windowsが管理する「音楽データの流れ」=「オーディオ ストリーム」を抽象的にまとめた一種の概念です。つまり、まとめているのは「オーディオ ストリーム」ということになります。

音楽データの流れ「オーディオ ストリーム」

「オーディオ ストリーム」という言葉にはいくつか意味があるらしいですが、ここで言うオーディオ ストリームとは「音楽データが処理されていく流れ」として使っていきます。

私たちがパソコン(以下PC)のプレイヤーで音楽を再生するときは、MP3などの音楽データをプレイヤーに読み込ませ、再生ボタンを押せば再生されますね。一見単純なように思えます。

ですが、音楽データが読み出せれてからヘッドフォンやスピーカーにまでデータが流れていく間には実に様々な処理がされています。以下の図を見てください。

オーディオストリーム
▲出典:楽しいハック講座 (4) Windows7 オーディオアーキテクチャの概要

何を言っているのか分からないと思いますが、雰囲気だけ感じ取っていただければOKです。

一番上の列「従来の/新しいアプリケーション」がつまり再生ソフトになります。そこから一番下の「ハードウェア」、つまりヘッドフォンやスピーカーなど音を実際に出す機器まで、音楽データの大まかな流れが書かれています。
これが「オーディオ ストリーム」です。様々なシステムを経由していることが分かりますね。

従来の、または新しいアプリケーションから「WASAPI “共有モード”」を介した場合、アプリから渡された音楽データ(オーディオサンプル)は「オーディオ エンジン」へと渡されています。このオーディオエンジン、XPでは「カーネルミキサー」に当たる部分ですが、どんなことをしてくれているかというと主に以下の通り。

  • 複数のアプリケーションが鳴らす音を合成(ミックス)して出力する。(ミキシング)
  • 各アプリケーションが鳴らす音の音量調整。
  • サンプリングレートなどの調整。(リサンプリング)
  • 各種エフェクト(APO)処理。
  • etc

一番恩恵を受けているであろう機能が最初の「ミキシング」でしょう。これがあるお陰で、音楽プレイヤーで音楽を再生しながらでもブラウザ上の動画の音が聞こえたり、Windowsが標準で鳴らす警告音なども一緒に出力することができます。

それから各種ドライバへとデータを渡し、ハードウェアへと送られます。

オーディオ エンジンが音質に影響を与える

通常、PCを操作するならばこのオーディオ エンジンは無くてはならない存在です。
ですが、音楽再生に特化させた場合だとこれがかえって邪魔になることがあります。

「音楽データはできるだけ変質させない方が高音質で出力できる」と言われています。入力から出力まで、データが1bitも変化しないことを音楽データの分野では「ビットパーフェクト」と呼びます。コンピューターの分野(つまり広義の意味)では「バイナリ一致」と呼びます。これが理想ということになりますね。

ですが、オーディオ エンジンを介してしまうと、ミキシングやリサンプリングなどの処理が発生してしまうため、データの変質が少なからず起きてしまいます。また、処理する時間分の遅延(レイテンシ)も発生してしまい、これが音質に影響するということもあるようです。

余計な処理をすべて回避して出力する「WASAPI 排他モード」

ここまでお読みいただけました方はもうお分かりでしょう。

さらなる音質の向上を目指すのならば、このオーディオエンジンを回避(バイパス)すればよいのです。
これを実現してくれるのが「WASAPI 排他モード」なのです。

先ほどの図を見てください。「新しいアプリケーション」から「排他モード WASAPIアプリケーション」を辿っていくと、DMAバッファを介してすぐにハードウェアへオーディオサンプルが渡されているのが分かります。

このように、音楽データを最短距離でハードウェアへ送ることで音質の低下を最小限に抑えることができるのです。
(WASAPI 共有モードは通常通りオーディオエンジンを介します。)

しかし、デメリットとしてWASAPI 排他モードで再生しているアプリケーション以外の音はすべてキャンセルされ鳴ることはありません。オーディオ エンジンで処理していたミキシングができなくなったのですから同然ですね。
(そもそもミキシング処理を回避するためにやっているのですから。Windowsの警告音なども鳴らなくなります。)

以下補足や用語解説

補足:XP以前、オーディオに関わるコンポーネントはカーネルモードにありました。そのため、処理中に重大なエラーが発生するとOSごとブルースクリーンで落ちてしまうことがありました。しかし、WASAPIではユーザーモードに移行したため、オーディオ処理でエラーが発生してもオーディオエンジン(audiodg)が落ちる程度になり、安定性が向上しました。

カーネルモード:CPUはそのアーキテクチャに対してすべての操作が可能である。
ユーザーモード:CPUはそのアーキテクチャに対して制限された操作しか実行できない。

参考:「DMA」【Direct Memory Access】とは、CPUを介さず各装置とメモリ間で直接データ転送を行う方式のこと。
また、「バッファ」【buffer】とは一時的に保存する領域のこと。

つまり、「DMA バッファ」とはDMA通信をするための一時的な保存場所のこと。ここに音楽データを一時的に格納することで、CPUのオーバーヘッドが伴わずにハードウェアへデータを送ることができます。つまり、遅延(レイテンシ)が少なくなります。

オーバーヘッド【Overhead】:目的の処理以外のところでかかる時間。

foobar2000でWASAPI 排他モードを使う

ここまで解説するのに随分時間をとってしまいました・・・
ですが、折角利用する機能です。意味も分からず使ってほしくはないので概要だけでも解説いたしました。

ここからはお待ちかね、実際にfoobar2000でWASAPI 排他モードを使ってみましょう。

注意点

WASAPI 排他モードを使うには以下の環境が必要です。まずはご自分のPC環境をご確認ください。

  • OSが「Windows Vista SP1」以降、「Windowsu 7」以降であること。(SP:サービスパック)
  • WASAPIに対応したソフトウェアであること。(foobar2000はコンポーネントで対応可能)

foobar2000未導入の方は以下の記事を参考にどうぞ。コンポーネント導入方法もこちらから。

WASAPIに対応させるコンポーネントの導入

標準状態ではfoobar2000といえど対応していません。対応させるためのコンポーネントをインストールしてください。
コンポーネントファイル名は「foo_out_wasapi.dll」です。

設定方法

「WASAPI output support」をインストール後、foobar2000を起動します。
メインメニューから「File」→「Preference」と選択します。

サイドメニューから「Playback」→「Output」を選択し、「出力デバイス」から「WASAPI:○○○」となっているデバイスを選びます。(出力デバイスが複数ある場合は好きなデバイスを指定)

 output
▲右はクリックで拡大

補足:「DS:○○○」の「DS」ですが、これは「DirectSound」の略です。DirectXのソフトウェアの一部品で、音を再生するために使用されます。標準ではこちらで再生しています。

次に「バッファー長」と「出力のデータ形式」を設定します。設定したら「適用」をクリックし再生してみましょう。
うまく再生できれば設定終了です。

バッファーサイズは標準で「1000ms」ですが、これで再生できない場合は少し値を下げてみてください。
ここらの適正値はPC環境により異なるのでご自分で探ってみてください。ノイズ等のる場合もこの値を弄ってみると解決するかもしれません。

ビットの値も、音楽データに合わせたものにしてください。通常は16bitで問題ありません。

設定

Unrecoverable playback error: Unsupported buffer size

以上のエラーは、バッファー長の値が大きすぎた場合に出ます。値を下げて設定してみてください。最大値はサウンドデバイスにより異なります。

Unrecoverable playback error: Unsupported stream format: ○○ Hz / ○○-bit / ○ channels

周波数、ビット数、チャンネルのいずれかがが入力された信号と合っていません。値を下げてみるか、サードパーティ製のサウンドドライバーがあり、こちらで設定できる場合はここでも設定を変更してみてください。

その他のコンポーネント

foobar2000には出力サンプリングレートを設定できるDSPが標準で入っています。
Resampler(PPHS)というDSPです。通常は44100Hzですが、ハイサンプリングで保存されているCDなどでは、それ以上のサンプリングレートで記録されていることがあります。この場合に設定してみるといいでしょう。

PPHS
▲クリックで拡大

OS標準の設定場所

最後に、OS標準で共有モードのサンプリングレートや排他モードを設定できる場所を解説します。

「スタートメニュー」から「コントロールパネル」を開きます。そこから「サウンド」を見つけたら選択。
あるいは、デスクトップ画面右下の「音量調整バー」を右クリックし、「サウンド」を選択してください。

サウンド

再生デバイスを右クリックし「プロパティ」を選択。そしたら「詳細」タブを選択します。
ここで共有モード中のサンプリングレートとビット深度が設定できます。

プロパティ 詳細

まとめ

以上、長くなりましたが「WASAPI 排他モード」と「foobar2000でWASAPI 排他モードを使う方法」のふたつを解説しました。できるだけ分かりやすいよう、用語解説なども含めて書いてみましたが、専門的なことなのでちゃんとした文章になっているのかどうか不安です・・・

私のPC環境ですが、サウンドカードとして「ONKYO SE-300PCIE」が刺さっています。
これが中々の性能で、通常の共有モードでもよい音を出してくれます。(ASIO標準対応ですしね)

なので、正直なところ、ここからさらにWASAPI 排他モードにしたところでそこまでの音質向上は感じられませんでした。
若干分解能が上がったかな?と感じましたが、プラシーボな気もしなくない。私の耳が良くないだけかもしれないですが。

なので、ここまで解説しておいてこのまとまは何だと個人的にも思いますが、効果があるかどうかはPC環境と聞く人の能力に大きく左右されそうです。ここまで極めるとオカルト的なところも入ってきますからね(笑

ただ、特に難しい操作もお金も必要ないので興味のある方は、更なる音質向上を目指して気軽に試してみると良いでしょう。