2023-06-18

【LMDE】サウンドアプレットに表示されるデバイス名を変えることができた

Linux Mint/LMDE にはサウンドアプレット(sound@cinnamon.org)が提供されており、音声の出力デバイスが複数搭載されている場合に簡単に切り替えられるようになっていて便利です。ただし、ワタシの場合はデバイス名がサッパリわからずちょっと難儀していました。

LMDE 5、Cinnamon 5.6.8、PipeWire 0.3.65、WirePlumber0.4.13 という環境です。

まずは現状です。

どっちがどっち?

サウンドアプレットを右クリックすると「出力デバイス」という項目で音声を出力するデバイスを簡単に切り替えられるようになっています。左端に丸が付いているのが現在選択されている出力用デバイスです。

「USB PnP Sound Device」と「USB PnP Audio Device」がリストアップされており、どちらかが USB スピーカーで、どちらかが USB ヘッドホン(USB-DAC)です。

音を鳴らしている時はいいのですが、音を鳴らそうとしていて出ない時にここの部分を確認しても、ヘッドホンになっているのかそうでないのかがパッとわからないのです。


やってみた

Lua スクリプトで調整後

結果としては大成功です。一番下のデバイス名もムダに長かったのでついでに変更してしまいました。

PulseAudio でデバイスの表示名を変えられたはず・・・

昔の記憶で PulseAudio では default.pa という設定ファイルを調整することでこのデバイスの表示名を変えられた記憶がありました。調べてみると確かにできるのですが、「はて? PipeWire でも default.pa が効くのかしら?」という疑問が。

PipeWire で PulseAudio 相当の設定変更は pipewire-pulse.conf だったような?と思い、調べてみましたが、どうやらこれはハズレのようでした。

Config PulseAudio · Wiki · PipeWire / pipewire · GitLab

他の方法を調べて行くと、突き当たるのはいつもの ArchWiki でした。ArchWiki の情報整備能力はスゴイですよね。

WirePlumber - ArchWiki

 

 

Lua スクリプトを書いてみた

結論としては PipeWire 環境では Lua スクリプトを書くことで PulseAudio の default.pa と同じことができるようです。

まずは /home 配下にスクリプトファイルを配置します。

~/.config/wireplumber/main.lua.d/51-alsa-rename.lua

スクリプト内でデバイスのプロパティ情報を更新するのですが、サウンドアプレットに表示しているのがどのプロパティかがわかりません。pactl list sinks で出力される情報の中には怪しいプロパティがこれだけありました。

	alsa.card_name = "USB PnP Sound Device"
	api.alsa.card.name = "USB PnP Sound Device"
	device.description = "USB PnP Sound Device"
	node.nick = "USB PnP Sound Device"
	device.nick = "USB PnP Sound Device"
	device.product.name = "USB PnP Sound Device"

とりあえず、以下のようなスクリプトを用意して試してみましたが、表示名は変わりませんでした。

rule = {
  matches = {
    {
      { "device.name", "equals", "alsa_card.usb-C-Media_Electronics_Inc._USB_PnP_Sound_Device-00" },
    },
  },
  apply_properties = {
    ["device.nick"] = "USB Headphone",
  },
}

table.insert(alsa_monitor.rules, rule)

Lus スクリプトを編集した際は WirePlumber だけを再起動すれば良いようです。サウンドアプレットは右クリックの度にその時の最新の状況を取得しなおしているようです。

systemctl --user restart wireplumber.service

むぅ、数を打てば当たるのでしょうが面倒です。サウンドアプレット(sound@cinnamon.org)のソースからどのプロパティ情報を使っているのか確認することにしました。

アプレットのソースは /usr/share/cinnamon/applets/sound@cinnamon.org/applet.js です。

巨大なソースを確認する時は Visual Studio Code が便利です。左側にソースの内部構造を解析した結果を表示してくれます。

description を使っていると見た
 

ソースコードから恐らく nick ではなく description を使用していると思われます。Lua スクリプトの変更対象を description に修正して WirePlumber を再起動させてみると、ついにサウンドアプレットのデバイスの表示名が変更されていました!!

ちなみに、PipeWire のコマンドでも Lua スクリプトの結果は確認できます。

$ pw-cli list-objects Device

	id 54, type PipeWire:Interface:Device/3
 		object.serial = "730"
 		factory.id = "14"
 		client.id = "79"
 		device.api = "alsa"
 		device.description = "USB headphone"
 		device.name = "alsa_card.usb-C-Media_Electronics_Inc._USB_PnP_Sound_Device-00"
 		device.nick = "USB PnP Sound Device"
 		media.class = "Audio/Device"



最後に

Lua スクリプトで 1つのデバイスは変更できたので、残りのデバイスについてもスクリプトに書き足す必要があります。Lua スクリプトは rule、matches、apply を 1組ずつ定義しなければならないようです。rule 内に複数の matches と apply を定義したところ、1つだけしか反映されませんでした。

最終的に出来上がった Lua スクリプトは以下の通りです。

$ cat 51-alsa-rename.lua 
rule1 = {
  matches = {
    {
      { "device.name", "equals", "alsa_card.usb-0c76_USB_PnP_Audio_Device-00" },
    },
  },
  apply_properties = {
    ["device.description"] = "USB Speaker",
  },
}

table.insert(alsa_monitor.rules, rule1)

rule2 = {
  matches = {
    {
      { "device.name", "equals", "alsa_card.usb-C-Media_Electronics_Inc._USB_PnP_Sound_Device-00" },
    },
  },
  apply_properties = {
    ["device.description"] = "USB Headphone",
  },
}

table.insert(alsa_monitor.rules, rule2)

rule3 = {
  matches = {
    {
      { "device.name", "equals", "alsa_card.pci-0000_06_00.6" },
    },
  },
  apply_properties = {
    ["device.description"] = "HD Audio Controller",
  },
}

table.insert(alsa_monitor.rules, rule3)

いや、久しぶりにスッキリと解決しました。