作成したいスクリプトのパイプラインのpw-topから静的出力を取得する必要があります。配管設備のリストだけが必要です。
例えば、私は走ってpw-top | grep output
から何かをしたいです。基本的にパイプデバイスとそのIDのリストを取得したいと思います。
私が望む出力タイプ(スピーカーとヘッドフォンのみ):
<device name> <id>
<device name> <id>
<device name> <id>
など
私は以下を試しました:
[aggam@aggam-archlinux ~]$ pactl list cards | grep -E 'port.type|Name|Card'
Card #39
Name: alsa_card.pci-0000_01_00.1
port.type = "hdmi"
port.type = "hdmi"
port.type = "hdmi"
port.type = "hdmi"
port.type = "hdmi"
port.type = "hdmi"
Card #40
Name: alsa_card.usb-0c76_USB_PnP_Audio_Device-00
port.type = "mic"
Card #41
Name: alsa_card.pci-0000_00_1f.3
port.type = "mic"
port.type = "mic"
port.type = "line"
port.type = "line"
port.type = "headphones"
port.type = "spdif"
しかし、
- 一部はスピーカーとマイクロ表示されますか?ヘッドフォンだと思います...
- これはパルスオーディオデバイスであり、問題を避けたいので、パイプワイヤーデバイスIDが欲しいです。
編集2:私のパスワード:
S ID QUANT RATE WAIT BUSY W/Q B/Q ERR FORMAT NAME
S 28 0 0 --- --- --- --- 0 Dummy-Driver
S 29 0 0 --- --- --- --- 0 Freewheel-Driver
S 36 0 0 --- --- --- --- 0 Midi-Bridge
S 42 0 0 --- --- --- --- 0 alsa_output.pci-0000_01_00.1.hdmi-stereo-extra3
S 43 0 0 --- --- --- --- 0 alsa_input.usb-0c76_USB_PnP_Audio_Device-00.mono-fallback
S 44 0 0 --- --- --- --- 0 alsa_output.pci-0000_00_1f.3.analog-stereo
S 45 0 0 --- --- --- --- 0 alsa_input.pci-0000_00_1f.3.analog-stereo
S 71 0 0 --- --- --- --- 0 alsa_output.usb-KURZWEIL_MPS-Piano-00.analog-stereo
S 69 0 0 --- --- --- --- 0 alsa_input.usb-KURZWEIL_MPS-Piano-00.analog-stereo
I 67 0 0 0.0us 0.0us 0.00 0.00 0 F32LE 2 48000 Firefox
ピアノの出力は71です。出力はpactl list short sinks
次のとおりです。
42 alsa_output.pci-0000_01_00.1.hdmi-stereo-extra3 PipeWire s32le 2ch 48000Hz SUSPENDED
44 alsa_output.pci-0000_00_1f.3.analog-stereo PipeWire s32le 2ch 48000Hz SUSPENDED
401 alsa_output.usb-KURZWEIL_MPS-Piano-00.analog-stereo PipeWire s16le 2ch 48000Hz SUSPENDED
ピアノが突然401に変わるので注意してください...
答え1
私はそれを考えた!シェルコマンドを使用する代わりに、Pythonスクリプト全体を作成しました。このスクリプトはすべてのデバイスをインポートして辞書を作成し、dmenu / bemenuを使用して目的のデバイスを選択できるようにします。
スクリプトはここにあります。私のgithubにしかし、コードのこの部分は次のとおりです。
sp = subprocess.run(['wpctl', 'status'], stdout=subprocess.PIPE).stdout.decode('utf-8')\
.split("Sinks")[1].split('├─')[0]
newsp = []
for line in sp.split('\n'):
if '.' in line:
newsp.append(line.replace(' ', '')[1:])
devices = {} # name: id
for line in newsp:
line = line.split('.')
devices[line[1].split('[vol')[0]] = line[0].replace('*', '')