Windowsで音声形式を切り替えるためのスクリプト

1つの光S/PDIF出力をサラウンドヘッドホンとスピーカーに送り、ヘッドホンを使うときには出力する音声形式をDTSに、スピーカーから流したいときにはPCMに手動で切り替えるという運用を考える。

f:id:chryfopp:20130327112803p:plain

P8Z77-Vでは、以下の操作手順により音声形式を「PCMからDTS」または「DTSからPCM(DVD品質)」へと切り替えることができる。サウンドコントロールパネルからも切り替えられるが、オーディオマネージャを使った方が操作手順は少ない。

  1. Realtek HD オーディオマネージャ」を開く
  2. 「デフォルトフォーマット」タブを開く
  3. 「dts interactive」ボタンを押す
  4. Realtek HD オーディオマネージャ」を閉じる

f:id:chryfopp:20130327121042j:plain

これをさらにスマートに、1ないし2クリックで実現する方法がないか探してみた。

どうやら一般的な方法は「サウンドコントロールパネルを開いて設定を変更する操作を行うスクリプトを使う」ようである。そしてJute Memoさんの記事は、すでに私の要求を9割がた満たしている状態である。私の要求との相違点は「サウンドコントロールパネルで変更したい項目」だけなので、そこだけ自分用に書き換えて使ってみることにする。

「指定したタイトルのウィンドウを持つアプリケーションをアクティブにできるまで繰り返す」関数を用意した上で、WshShellオブジェクトを作成してサウンドコントロールパネルを開いてアクティブにするところまでは同じ。

var wait = function(title){
    do {
        WScript.Sleep(100);
    } while(!WshShell.AppActivate(title));
};

var WshShell =  WScript.CreateObject("WScript.Shell");
WshShell.Run("control mmsys.cpl");
wait("サウンド")

f:id:chryfopp:20130327113324p:plain

自分の環境では光S/PDIF出力用のデバイス「Realtek Digital Output(Optical)」は再生デバイスの7個目にあるので、カーソルキーの↓を7回送ってRealtek Digital Output(Optical)を選択した状態にし、ALT+Pを送ってプロパティを開く。

WshShell.SendKeys("{DOWN 7}%P");

f:id:chryfopp:20130327113325p:plain

「CTRL+PAGE UP」を送り、「詳細」タブを開く。

WshShell.SendKeys("^{PGUP}");

f:id:chryfopp:20130327113326p:plain

音声形式をDTSに変更する場合、「D」を送って「DTS Interactive」を選択させる。

// WshShell.SendKeys("D"); // DTS Interactive

f:id:chryfopp:20130327113327p:plain

PCMに変更する場合は「D」「2」「2」の順に送り、何が選択されていたとしても「D(DTS Interactive)」「2(2 チャネル、16ビット、44100 Hz)」「2(2 チャネル、16ビット、48000 Hz)」と選択していって最終的に「DVDの音質」が選択されるようにする。

// WshShell.SendKeys("D22"); // 2ch, 16bit, 48000 Hz

以上2つはスクリプトの引数として扱い、スクリプトを呼び出すショートカットの側で選択できるようにする。

WshShell.SendKeys(WScript.Arguments.item(0));

以上で再生形式の選択が完了するので、あとは「ENTER」を2回送って「OK」「OK」でウィンドウを閉じる。

WshShell.SendKeys("~");
WshShell.SendKeys("~");

以上をまとめると以下のスクリプトとなる。

var wait = function(title){
    do {
        WScript.Sleep(100);
    } while(!WshShell.AppActivate(title));
};

var WshShell =  WScript.CreateObject("WScript.Shell");
WshShell.Run("control mmsys.cpl");
wait("サウンド")
WshShell.SendKeys("{DOWN 7}%P");
WshShell.SendKeys("^{PGUP}");
// WshShell.SendKeys("D"); // DTS Interactive
// WshShell.SendKeys("D22"); // 2ch, 16bit, 48000 Hz
WshShell.SendKeys(WScript.Arguments.item(0));
WshShell.SendKeys("~");
WshShell.SendKeys("~");

これを「changePlaybackFormat.js」と名付けて保存し、これを引数「D」を付けて呼び出す「DTS Interactive」ショートカットと、引数「D22」を付けて呼び出す「2 チャネル、16ビット、48000 Hz」ショートカットを作成する。

f:id:chryfopp:20130327123419p:plain

ショートカットに判りやすいアイコンを付けてクイック起動に登録して完了。

f:id:chryfopp:20130327121043p:plain

これで1クリックで音声形式を切り替えられるようになった。