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環境と聞く人の能力に大きく左右されそうです。ここまで極めるとオカルト的なところも入ってきますからね(笑

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

スポンサーリンク

Comments [16]

WASAPI 排他モードの解説ありがとうございます。大変わかりやすかったです。
うちのノートPCで試したところ通常ですとドルビーホームシアターを介して補正が掛かるのですがフラットな音が聞けました場合によっては使い分けが必要ですね。

コメントありがとうございます。

お役に立てて嬉しいです。WASAPI 排他モードは強力な分、不便なところもありますので状況によって切り替えるのが一番ですね。これを使うと最大音量によるリミッター問題も無くなったりと映像関連のお仕事をしている方は必須の機能みたいです。

Windowsもどんどん進化していって嬉しいですね。

詳しい説明をありがとうござます。PCオーディオの初心者です。以下の質問です。

WASAP排他モードをインストールしないで、Prefevence → PIayback → Output とクリックしました。
マランツのS14-S1のダックにUSB接続して、ドライヴェーをインストールしました。出力デヴァイスにその名前が出ますが、その場合、WASAP
排他モードになっているのでしょうか? そのまま使用しても良い音で鳴っていますが、WASAPに変更したほうが、さらに良い音質に変わるのでしょうか?

どうかよろしくお指導ください。

コメントありがとうございます。

まず、WASAPI排他モードを利用するためには「OSがWindows Vista SP1以降」で「デバイスとソフトウェア側の対応がなされていること」が条件です。コメントではOSの表記がないのでこちらは判断できませんが、foobar2000側で対応させるために「WASAPI output support」が必要なので、これをインストールしていない場合は排他モードにはなりませんね。(標準ではfoobar2000はWASAPI排他モード非対応です)

記事でも書いておりますが、WASAPI排他モードが本当に有効になっている場合はfoobar2000以外の音は絶対に鳴りませんので、排他モードで動いてるかどうかはすぐわかりますよ。foobar2000以外の音が鳴るようであれば、DirectSound経由の「WASAPI共有モード」による再生になっているかと思われます。

WASAPI排他モードで再生すると音質が改善するかというと、まあ悪い方向にはいかないはずです。が、それを体感できるできるかどうかは鉱石ラジオさんのオーディオ環境次第ですね。私のところではパソコンにサウンドカードとして「ONKYO SE-300PCIE」が刺さっていていますが、違いはよく分からなかったです(笑

詳細な説明、ありがとうございます。なんとかWASAPI排他モードで出力できました。私のOSは、7の64biteですが、また新たな問題に直面しています。実は、先日、オンキョウのサイトからDSFファイルをダウンロードしましたが、このWASAPI排他モードでは、outputからデバイスが確認できません。
他のソフト(ソニーのHI-RES AuDio Player)からだと、デバイスが認識でき、再生も可能となります。しかし、ソニーのUDA-1のみで、もう一つのDAC・マランツSA14S1では再生できませんでした。
おそらくfoobar2000の設定ミスだと思いますが、どのように対処すればよろしいのでしょうか?
よろしくご指導のほど、お願いします。

私はDSD音源を持っていないので検証はできないのですが、確かfoobar2000は標準で「DSFファイル」は再生できなかったと記憶しております。
DSF Decoder を有すコンポーネントを探しだしてインストールすれば大丈夫かと思います。以下のやつとかどうでしょう。

◯http://sourceforge.jp/projects/sfnet_sacddecoder/

◯http://www.foobar2000.org/components/view/foo_input_ht

foobar2000というソフトウェアですが、これ自体は万能なソフトウェアではありません。どちらかというと最低限の機能しか有していないシンプルなプレイヤーです。再生できないファイルや操作できないことはたくさんあります。このソフトウェアの真価は「コンポーネントによる拡張が容易であること」で、これにより再生可能ファイルを増やしたり、エンコードしたりエフェクト処理をしたりできるようになります。

ですので、このソフトウェアを使いこなすためには「自分が求めているコンポーネントを探し出す」という思考が必要です。できないのならばできるようなコンポーネントを探そう!という考え方になるので、そこが他のプレイヤーと異なることに注意してください。

この素晴らしい記事を一年近く見逃していたことを後悔しています(笑)
管理人さんの記事はどれも丁寧に説明されていて、とても分かりやすく、たくさん読ませて頂きました。
使っていても知らない言葉(今回で言えばWASAPIですね)をここまで分かりやすく説明できるのはかなり理解していないとできないことだと思います。
Foobar2000はいろんなプレーヤーを使ってみて、直感的に一番忠実な音を鳴らしてくれるプレイヤーかなとは思っていたのですが、カスタムすることでここまでの設定ができることに気づかず、まだまだもったいない使い方をしていたな、と感じました。
音質向上もそうですが、操作性、管理のしやすさなどでも的確なアドバイスが書いてあり、とても参考になりました。
これからも私のような初心者にやさしい記事を書いていただけるととても嬉しいです!
応援しています!

コメント欄で判断していましたが、記事自体は2012年でしたね。(汗)
失礼いたしました。

お褒めの言葉ありがとうございます!

foobar2000は特殊なプレイヤーで「色々やらせることはできるけどその方法は自分で探して設定してね」
というものなのでどんどん調べていかないと全然使いこなせないんですよね(笑

私のブログはなるべくPCが分からない人でも簡単な仕組みと操作方法がわかるように書いています。
文章が長くなってしまうのが欠点ですがこれからも色々書いていきたいと思います。

2015年2月22日、foobar2000+WASAPIの排他モード、設定を指示通り、調整してノイズ解消出来ました。アンプ付きSPは、BOSEですが、iTunesとの音の違いを実感出来ます。有難うございました。

お役に立てれば嬉しいです。

WASAPI排他モードで音質向上、としていますが正確には「劣化させない」ということなので
ノイズ除去の効果もありますね。その他の音が鳴らないという欠点はありますが、
それ以外では非常に優秀な機能なのでうまく使ってあげてください。

秋葉原のYカメラでFoobar2000を薦められ歳よりながらトライしました。WASAPIを指示通り設定しました(つもり)が有効になっているのか確認できていない状態です。そこで質問ですが、視覚的にチエックする方法はありますか?

コメントありがとうございます。

視覚的に、ということですが・・・
あまりはっきりと「効いてる!」と実際に見ることができる場所はなさそうですね。
強いて言えば、Windowsの音量ミキサーを開いてみて

 ・音声再生中に緑のバーが上下していればWASAPI排他モードが有効になってない
・音声再生中でも緑のバーがなく無反応のように見えればWASAPI排他モードが有効になっている

といった感じでしょうか。

視覚的ではなくて聴覚的でよければWASAPI排他モードの特徴から有効かどうかすぐに判別できます。
Foobar2000で排他モードに設定したのであれば、Foobar2000以外の音声、Windowsが出す
システム音も含めてすべて聞こえなくなります。Webブラウザ上の音声も聞こえなくなります。

ということなので、Foobar2000で音楽を再生している最中に別の、例えばWindows Media Playerや
Webブラウザ上の動画なんかを再生してみて

 ・音が聞こえるようならば排他モードは有効になっていません。
・すべて聞こえないようであれば排他モードが有効になっています。

といった感じで判別できます。参考までにどうぞ。

早速ご回答有難うございます。

WASAPI排他モードが,有効!になっていました。嬉しいです。
ご指摘の「有効ならば、Foobar2000以外の音声が聞こえない・・・」を確かめました。
解説に記してありましたがWMPで確かめることに思いが及びませんでした。

更に充実したものにカスタマイズしようと思っています。

最近知ったのですが、この WASAPI排他モードには大変強力な機能が
あり、それは例えば、FLAC 96kHz/24bitをWAV 96kHz/24bitに変換する
PC上の唯一の方法を提供している事です。詳しくは下記参照。

http://ameblo.jp/st2400/entry-12090919290.html

お返事が遅れてしまい申し訳ございません。
土日にお返事をしようとしたのですが、体調を崩してしまいまして・・・

新しい情報のご提供ありがとうございます。
ただ、記載いただいたURL先の記事が少し修正されたようですね。
WAVファイルが正しく再生できない原因として「タグ」が正しかったと
修正されているようです。

WAVは本来タグ付けをサポートしていないため、変換ソフトで
タグ情報まで受け継がせようとすると特殊なWAVになる、
というのは私も存じております。
(MP3とかにも拡張されたオプションを使うと汎用性が落ちますね)

私は、WAVに戻す際にはタグ付けはすべて無効になるよう調整します。
タグが付いていたらおかしいと思うようにしていれば大体の場合は大丈夫かなと。

今回は違ったようですが、WASAPI排他モード が強力な手段の1つ
であることは間違いないので、今後も積極的に使っていきたいと思います。

このページの上部へ

サイト内検索

広告

最近のコメント

Powered by Movable Type 6.3.2