禁用通过 USB 声卡连接的外部扬声器的音量控制

禁用通过 USB 声卡连接的外部扬声器的音量控制

我有一个 USB 声卡 (Avantree Leaf) 连接到运行 Ubuntu 19.10 的 PC,还有一个通过 AptX 连接到声卡的 Dockin D-Fine 扬声器。

在 Ubuntu 18.10 中,一切正常 - PC 和扬声器上的音量控制是独立的,当我更改扬声器的音量时,它不会影响 PC 音量。

在 19.10 中,它得到了“改进”,现在当我改变扬声器的音量时,PC 上的音量也会改变。但这是有问题的:

  • 音量控制保持独立,只要我按“+”,扬声器和电脑上的音量控制就会同时增加
  • 有时当我按扬声器上的“+”时,电脑上的音量会降低

那么,问题是:

如何禁止通过扬声器更改电脑音量?

这是标准的 Ubuntu 19.10 安装,因此它使用 PulseAudio。

$ cat /proc/asound/cards | grep Leaf
 2 [Leaf           ]: USB-Audio - Avantree Leaf
                      Avantree Leaf at usb-0000:00:1d.7-5.2, full speed
$ amixer -c 2
Simple mixer control 'PCM',0
  Capabilities: pvolume pvolume-joined pswitch pswitch-joined
  Playback channels: Mono
  Limits: Playback 0 - 15
  Mono: Playback 0 [0%] [-15.00dB] [on]
Simple mixer control 'Mic',0
  Capabilities: cvolume cvolume-joined
  Capture channels: Mono
  Limits: Capture 0 - 31
  Mono: Capture 24 [77%] [24.00dB]
$ pacmd dump
### Configuration dump generated at Sun Jan 12 16:42:59 2020

load-module module-device-restore
load-module module-stream-restore
load-module module-card-restore
load-module module-augment-properties
load-module module-switch-on-port-available
load-module module-switch-on-connect
load-module module-udev-detect
load-module module-bluetooth-policy
load-module module-bluetooth-discover
load-module module-bluez5-discover
load-module module-native-protocol-unix
load-module module-default-device-restore
load-module module-rescue-streams
load-module module-always-sink
load-module module-intended-roles
load-module module-suspend-on-idle
load-module module-console-kit
load-module module-systemd-login
load-module module-position-event-sounds
load-module module-role-cork
load-module module-snap-policy
load-module module-filter-heuristics
load-module module-filter-apply
load-module module-alsa-card device_id="1" name="pci-0000_0f_00.1" card_name="alsa_card.pci-0000_0f_00.1" namereg_fail=false tsched=yes fixed_latency_range=no ignore_dB=no deferred_volume=yes use_ucm=yes avoid_resampling=no card_properties="module-udev-detect.discovered=1"
load-module module-alsa-card device_id="0" name="pci-0000_00_1b.0" card_name="alsa_card.pci-0000_00_1b.0" namereg_fail=false tsched=yes fixed_latency_range=no ignore_dB=no deferred_volume=yes use_ucm=yes avoid_resampling=no card_properties="module-udev-detect.discovered=1"
load-module module-x11-publish display=:1
load-module module-x11-cork-request display=:1
load-module module-x11-xsmp display=:1 session_manager=local/dasha-HP-Z600-Workstation:@/tmp/.ICE-unix/2419,unix/dasha-HP-Z600-Workstation:/tmp/.ICE-unix/2419
load-module module-alsa-card device_id="2" name="usb-0a12_Avantree_Leaf-00" card_name="alsa_card.usb-0a12_Avantree_Leaf-00" namereg_fail=false tsched=yes fixed_latency_range=no ignore_dB=no deferred_volume=yes use_ucm=yes avoid_resampling=no card_properties="module-udev-detect.discovered=1"
load-module module-cli-protocol-unix

set-sink-volume alsa_output.pci-0000_00_1b.0.analog-stereo 0x725a
set-sink-mute alsa_output.pci-0000_00_1b.0.analog-stereo no
suspend-sink alsa_output.pci-0000_00_1b.0.analog-stereo yes
set-sink-volume alsa_output.usb-0a12_Avantree_Leaf-00.iec958-stereo 0x570c
set-sink-mute alsa_output.usb-0a12_Avantree_Leaf-00.iec958-stereo no
suspend-sink alsa_output.usb-0a12_Avantree_Leaf-00.iec958-stereo yes

set-source-volume alsa_output.pci-0000_00_1b.0.analog-stereo.monitor 0x10000
set-source-mute alsa_output.pci-0000_00_1b.0.analog-stereo.monitor no
suspend-source alsa_output.pci-0000_00_1b.0.analog-stereo.monitor yes
set-source-volume alsa_output.usb-0a12_Avantree_Leaf-00.iec958-stereo.monitor 0x10000
set-source-mute alsa_output.usb-0a12_Avantree_Leaf-00.iec958-stereo.monitor no
suspend-source alsa_output.usb-0a12_Avantree_Leaf-00.iec958-stereo.monitor yes
set-source-volume alsa_input.usb-0a12_Avantree_Leaf-00.mono-fallback 0xc3b1
set-source-mute alsa_input.usb-0a12_Avantree_Leaf-00.mono-fallback no
suspend-source alsa_input.usb-0a12_Avantree_Leaf-00.mono-fallback yes

set-card-profile alsa_card.pci-0000_0f_00.1 off
set-card-profile alsa_card.pci-0000_00_1b.0 output:analog-stereo
set-card-profile alsa_card.usb-0a12_Avantree_Leaf-00 output:iec958-stereo+input:mono-fallback

set-default-sink alsa_output.usb-0a12_Avantree_Leaf-00.iec958-stereo
set-default-source alsa_input.usb-0a12_Avantree_Leaf-00.mono-fallback

### EOF

答案1

注意:如果您像我一样配置 avantree dg60,请向下滚动到我谈论 udev 的位置,并将规则添加到您的 udev 配置中。否则,您需要按照以下步骤确定在 udev 规则中使用的具体值,因为它非常特定于硬件。

我也有一个 avantree 设备,也觉得这很烦人。事实证明,它通过注册 HID 来发送媒体键事件来实现音量控制。

我在 Ubuntu 18.04 和 20.04 上尝试过,但对于具有此潜在烦人功能的其他操作系统和声卡,该过程应该非常相似。

首先查看 lsusb 以获取 avantree/usb 声卡的总线/设备号。这是我自己的相关部分,您的会有所不同:

$ lsusb
Bus 003 Device 009: ID 0a12:1004 Cambridge Silicon Radio, Ltd 

如果您不确定您的供应商/产品 ID 是哪个,请在插入/移除时检查 dmesg 的输出,查找类似“usb 3-1:找到新 USB 设备、idVendor=0a12、idProduct=1004、bcdDevice”的条目=30.83”。

查看“lsusb -t”以查看它已注册的内容。这是我的相关部分:

...
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 480M
    |__ Port 2: Dev 9, If 0, Class=Audio, Driver=snd-usb-audio, 12M
    |__ Port 2: Dev 9, If 1, Class=Audio, Driver=snd-usb-audio, 12M
    |__ Port 2: Dev 9, If 2, Class=Audio, Driver=snd-usb-audio, 12M
    |__ Port 2: Dev 9, If 3, Class=Human Interface Device, Driver=usbhid, 12M
...

看,在总线03:端口1=>端口2:dev 9,接口3,它已经注册了一个HID。接下来,检查 /sys/bus/usb/devices/[bus]-[port] 处的 sysfs 条目。对我来说,那就是 /sys/bus/usb/devices/3-2:

$ ls -l /sys/bus/usb/devices/3-2/
total 0
drwxr-xr-x 4 root root     0 Jun  2 19:14 3-2:1.0
drwxr-xr-x 3 root root     0 Jun  2 19:14 3-2:1.1
drwxr-xr-x 3 root root     0 Jun  2 19:14 3-2:1.2
drwxr-xr-x 6 root root     0 Jun  2 19:14 3-2:1.3
...

我们可以从 lsusb -t 中看到接口 3(1.3)。列出其中的文件...

$ ls -1 /sys/bus/usb/devices/3-2/3-2:1.3 
0003:0A12:1004.0036
authorized
bAlternateSetting
bInterfaceClass
bInterfaceNumber
bInterfaceProtocol
bInterfaceSubClass
bNumEndpoints
driver
ep_81
modalias
power
subsystem
supports_autosuspend
uevent
usbmisc

您将看到分配给该 HID 的“授权”属性,默认为“1”。只需将其设置为“0”即可暂时修复它:

$ echo 0 > /sys/bus/usb/devices/3-2/3-2:1.3/authorized

效果应该是立竿见影的。但是,您可能希望它从现在开始自动执行此操作。这可以通过编写 udev 规则来实现:

ACTION=="add", ATTR{idVendor}=="0a12", ATTR{idProduct}=="1004", RUN+="/bin/sh -c 'echo 0 > /sys$DEVPATH/`basename $DEVPATH`:1.3/authorized'"

将上述规则放入 /etc/udev/rules.d/99-avantree.rules 并确保其具有权限 644 和 user:group=root:root 并通过执行“udevadm control --reload-rules”重新加载规则下次插入设备时,“授权”属性应设置为 0。

RUN 脚本获取 $DEVPATH (对我来说包含 /devices/pci0000:00/0000:00:08.1/0000:28:00.3/usb3/3-2。 /sys/bus/usb/devices/3-2是到此路径的符号链接,但 $DEVPATH 缺少 /sys) 和前缀 /sys,并在 $DEVPATH 变量中添加 1-4 后缀,并添加 1.3。

此修复可能不是 100% 稳定,因为我不完全确定 udev 匹配和路径等,但当我尝试不同的 USB 端口时,它似乎对我有用。

相关内容