スポンサーリンク

Alfredでサウンド出力を切り換えるためのワークフロー

Alfredのパワーパックを購入してから、ワークフローで遊んでいます。

クリップボード拡張目的でパワーパックを購入しましたが、ワークフロー機能こそAlfredの真骨頂ですね。

サウンドデバイスの切り替えが面倒

一日に何回もあるわけではありませんが、イヤホン・ヘッドホンとスピーカーを切り換えることがあります。

システム環境設定を開かなくても、オプションキーを押しながらメニューにあるボリューム調整アイコンをクリックするだけで、切り換えることができます。

これでも十分に簡単ですが、いちいちマウスを使うのが面倒であったり、デバイス名を見ながら「あれ?どっちがイヤホンだったっけ?」と思うこともしばしば。

オーディオデバイスが一つなら、イヤホンの抜き差しで切り替わるので問題になりませんけどね。

ワークフローがすでにあった

最初はAppleScriptで書こうかなと思いましたが、すでに二つ存在していました。

一つ目はPerl、二つ目はAppleScriptで書かれているようです。どちらも同じ動きをするので、自分好みのプログラム言語を選べば良いかと思います。

拡張子が.alfredworkflowのファイルをダウンロードして、それをダブルクリックするとAlfredに追加されます。

どちらのワークフローも最初のScript Filterでサウンドデバイスを取得してリストアップする処理をしています。

選択されたデバイス名を次のプロセスに渡し、そこでデバイスの切り替えが実行されます。処理が終わると、Post Notificationにより、通知センターで切り替わったことが表示されます。

コマンド一発で切り換えたい

このままでも十分ですが、マウスでの選択がキーボードでの選択になっただけです。

  • earphonesと入力したらイヤホンに切り換え
  • speakerと入力したらスピーカーに切り換え

このように動作するように、二つ目のワークフローを参考にして作ることにしました。

InputsのKeywordを追加する。

Keywordは、Alfredでの検索に利用されます。Titleは検索結果に表示されます。

ActionsのRun NSAppleScriptを追加する。

on alfred_script(q)
	set device to "USB Sound Device        " -- 1

	tell application "System Preferences"
		reveal anchor "output" of pane id "com.apple.preference.sound"
	end tell

	tell application "System Events" to tell process "System Preferences"
		repeat with i from 1 to the count of rows of table 1 of scroll area 1 of tab group 1 of window 1
			if exists (text field 1 of row i of table 1 of scroll area 1 of tab group 1 of window 1) then
				set deviceselected to the value of text field 1 of row i of table 1 of scroll area 1 of tab group 1 of window 1
				-- display dialog deviceselected
				if deviceselected is equal to device then
					set selected of row i of table 1 of scroll area 1 of tab group 1 of window 1 to true
				end if
			end if
		end repeat
	end tell

	tell application "System Preferences"
		quit
	end tell

	set volume output volume 1 -- num/100%

	set theMessage to "Speaker"
end alfred_script

Cache compiled AppleScriptは、コンパイル済みのAppleScriptをキャッシュするので高速動作する代わりにメモリを余計に使いますよということなので、お好みで。

処理としては、

  1. システム環境設定を開き、サウンドパネルの出力タブを呼び出す。
  2. set device to ...で指定したデバイス名と一致するまでループさせる。
  3. 一致したらそのデバイスに切り換える。
  4. システム環境設定を閉じる。

という処理です。

set volume ...は、個人的にボリュームを最小値にしたかっただけなので、なくても大丈夫です。

set theMessage ...で、次のプロセスで表示させたい文字列を渡せます。

軽くはまったポイントは、デバイス名(ソースの1)です。サウンドパネルで見ると、USB Sound Deviceなのですが、実際にはUSB Sound Device______と後ろにスペースが入っています。display dialogなどで確認しながら試しましょう。

これらをイヤホン用とスピーカー用の二つ作成します。

OutputsのPost Notificationを追加する。

このプロセスは通知センターの表示を行います。一つ前のset theMessage ...に渡された文字列が、{query}で受け取れます。

パワーパックのワークフローはおもしろい!

なんでもできる!は大げさですが、以下のプログラム言語が利用できるので、いろいろと楽しめそうです。

  • bash
  • zsh
  • perl
  • php
  • applescript(osascript)
  • ruby
  • python