マイクミュートをコントロールするスクリプト
開発::noddy
序
そもそも経緯としては、会社用で使っているThinkPad X1 Carbon
(8th)を、PulseAudioからPipewire(pipewire-pulse
)に切り替えたことでミュート関係が非常に不安定になったことによる。
これは、勝手にミュートが切り替わってしまうほか、ミュートキー(ファンクションキー)を押すと反応が非常に遅く、さらに何度反応するか分からないため結果がどうかなるか分からないという問題があったりする。
他にも問題はあるが、特にこの問題を解消したかった。
もちろんXF86AudioMute
の動作を再定義しても良いのだが、そもそもこのキーが不安定であるようにも感じるため、別の方法を用意することにした。
対象sourceを見つける
今回はPipeWire環境ではあるものの、PulseAudioを使うものとする。
pipewire-pulse
にしたため(pacmd
がpulseaudio
パッケージ所属だから)pactl
を使わざるを得ないのだが、ちょっと使い方が違う。
sourcesを一覧するには、pacmd
の場合pacmd list-sources
とする。
一方、pactl
ではpactl list sources
になる。
これでミュート操作を行いたいソースのname
を確定させる。
私のThinkPadの場合、alsa_input.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__hw_sofhdadsp_6__source
が本体の内蔵マイクであった。
一般的にはヘッドセットとは同じsourceになっているのだが、珍しくそうではない。
ミュート操作
ミュート操作は次のように行う。
ミュートする。
pactl mute $name true
ミュート解除する。
pactl mute $name false
現在と逆の状態にする。
pactl mute $name toggle
これがわかっていれば、ショートカットキー設定でミュート操作を行うことが可能。
なお、ThinkPad X1 Carbon
(8th)だと、PulseAudioでも不安定だったミュート状態を示すランプが、pactl
を使った場合は常に正しく動作した。
Mute Controller
さて、ここからが本題だ。 ショートカットキーでオンオフできるようにはなったが、それとは別にsystrayでコントロールできるようにしたい。
systrayで動作するプログラムを作る簡単な方法はyadだ。yadの--notification
オプションは(Zenityとは異なり)systrayに常駐する。--command
オプションでアイコンをクリックしたときの動作を規定できるが、そのほかに--menu
オプションで右クリックのメニューを作ることができる。
--menu
の形式はtitle!command[|...]
である。atnowではかなり複雑な処理をしたが、今回の場合基本的にpactl
コマンドを呼ぶだけなので、単純にyad
だけで書ける。
menuは複雑なので別で定義し、ついでに起動時に呼ばれたらミュートにするようにして、こんな感じ。
#!/bin/bash
MENU_COMMAND='Toggle!pactl set-source-mute alsa_input.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__hw_sofhdadsp_6__source toggle|Mute!pactl set-source-mute alsa_input.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__hw_sofhdadsp_6__source true|Unmute!pactl set-source-mute alsa_input.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__hw_sofhdadsp_6__source false'
pactl set-source-mute alsa_input.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__hw_sofhdadsp_6__source true
notify-send "Microphone Mute Controller is running, set mute."
yad --notification --image="audio-input-microphone" --menu="$MENU_COMMAND" --command="pactl set-source-mute alsa_input.pci-0000_00_1f.3-platform-skl_hda_dsp_generic.HiFi__hw_sofhdadsp_6__source toggle"