Technically Impossible

Lets look at the weak link in your statement. Anything "Technically Impossible" basically means we haven't figured out how yet.

オーディオ・スタックの挙動と排他モード - Windows Vista

f:id:espio999:20190316001104j:plain
これは2007年の投稿で、以前のブログから移行したものを加筆、編集したものです。

自宅のPC環境をWindows Vistaへ移行した。以前に比べて快適に利用しているのだが、iTunesの挙動から不便を被っている。何か一つPodcastを再生して、そのまま終わりまで聴く。そして次のPodcastを再生しようとすると...音が出ない。このとき、

[コントロールパネル]-[サウンド]

の再生タブからスピーカーを選択し、プロパティ・ボタンを押下する。新しく開いたWindowの詳細タブからテスト・ボタンを押下しても、やはり音が出ない。
このような状況で、iTunesを再起動するか、先の詳細タブにある排他モードのチェック・ボックスを選択し、適用ボタンを押下すると、音が出ることがある。

どういうことだろう。そして、排他モードとは何を指しているのか?

自宅の環境で利用している音源はSound MAX Integrated Audio Deviceだ。マザーボードである、Intel D865PERLに統合されている。この音源からSPDIFでスピーカーと接続して使用している。このSound MAXはなかなか曲者のようだ。web検索すると諸々のトラブルが報告されている。
www.google.co.jp
この音源チップのドライバ、特にVista用の物をIntelは提供しておらず、Vistaで提供しているドライバもヴァージョンが古い。

"Changes to the audio stack and changes in Windows Media Player audio playback behavior in Windows Vista" - KB 925901によると、

  • Introduction

信頼性の向上、ならびにWindows Vistaでのオーディオ・アプリの開発を容易にするため、オーディオ・スタックを再設計した。
この新しいAPIを利用しているため、Windows XPの場合、Windows Vistaの場合で、Windows Media Player 11の挙動は異なる。

オーディオ・エンジンと呼ばれるコンポーネントのバッファへ、アプリケーションは非圧縮音声情報を出力する。
共有モード(※)では、オーディオ・エンジンはストリーム・セッションごとに処理し、ミキサー・バッファでそれぞれのストリームが統合、処理されて、オーディオ・デバイスへ出力される。
※排他モードを選択していない、デフォルト状態のこと。

アプリケーションはオーディオ・エンジンに対して、オーディオ・デバイスから直接DMAのオーディオ・バッファへアクセスするよう、要求できる。
OSから音声データへの干渉を最小限にしたいアプリケーションは、DMAモードで稼働する。またSPDIFを通じて圧縮音源データを出力したいアプリケーションも、DMAモードで稼働する。
排他モードでは、オーディオ・エンジンはバイパスされ、システム音、セッション毎のボリューム・コントロールWMP拡張は機能しない。

なぜiTunesを再起動したり、排他モードを適用すれば音声出力されたのか?iTunesが出力するのは圧縮音源だ。私の環境では、それはSPDIFを通じて出力されている。まさに排他モードで動かせ、という環境だったわけだ。
とはいえ、システム音や、セッションごとのボリューム・コントロールは機能している。例えば、音声ミキサーからiTunesだけをミュートしても、システム音はミュートされない。
実際の動作が説明と異なっているようにも感じる。断言できることではないが、iTunesVistaへの最適化しきれていない、とも言えるかもしれない。