序
そもそも経緯としては、会社用で使っている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"