Alsa USB 音频热插拔

Alsa USB 音频热插拔

我的新 USB 音频扬声器在 Alsa 中显示为第二个设备。我设法将其设为主要设备:

$ cat /proc/asound/modules 
 0 snd_usb_audio
 1 snd_hda_intel
$ cat /proc/asound/cards
 0 [Speaker        ]: USB-Audio - uBoom Q Speaker
                      uBoom Q Speaker at usb-0000:00:1d.1-1, full speed
 1 [Intel          ]: HDA-Intel - HDA Intel
                      HDA Intel at 0x80000000 irq 16

通过添加以下几行到/etc/modprobe.d/alsa-base.conf

options snd_hda_intel index=1
options snd_usb_audio index=0

现在,当我启动时,USB-Audio 默认在所有地方都有效。问题是 — 当我断开它(或在没有它的情况下启动)时,我看到

$ cat /proc/asound/modules 
 1 snd_hda_intel

什么都不起作用,因为没有0-th 设备:

$ aplay
ALSA lib confmisc.c:768:(parse_card) cannot find card '0'

我想要的是重新分配设备索引的方法。如果解决方案是脚本 — 我将使用它创建一个 udev 规则。

目前,我将“index=?”改回默认的“0,1”,调用它alsa force-reload,它有帮助。还有更好的方法吗?

asoundconf注意:我的发行版(KUbuntu Lucid)中没有:(

答案1

答案2

首先,让我们处理 Alsa 设备的索引。插入您的 USB 扬声器并调用sudo alsa force-reload以便 Alsa 找到它。

列出卡索引及其驱动程序:

$ cat /proc/asound/modules 
 0 snd_hda_intel
 1 snd_usb_audio

显示更多详细信息:

$ cat /proc/asound/cards
 0 [Intel          ]: HDA-Intel - HDA Intel
                      HDA Intel at 0x80000000 irq 16
 1 [Speaker        ]: USB-Audio - uBoom Q Speaker
                      uBoom Q Speaker at usb-0000:00:1d.0-1, full speed

我们希望“发言人”的索引为 0。

如果存在,添加以下行以/etc/modprobe.d/alsa-base.conf使 USB 扬声器成为默认设备:

options snd_hda_intel index=-2
options snd_usb_audio index=-1

这使得 USB 扬声器比内置卡更受欢迎。问题来了sudo alsa force-reload,瞧!现在您可以看到cat /proc/asound/cards插入/拔下 USB 扬声器时卡如何出现和消失。


这是另一张关于如何选择下一个启动的应用程序将使用哪两张可用卡的收据。

将以下行添加到 /etc/asound.conf:

$ cat /etc/asound.conf.switch 
# CARD DEFINITIONS
#=== CARD 'card0'
pcm.card0-hw { type hw ; card 0 ; }
ctl.card0-hw { type hw ; card 0 ; }

pcm.card0 { type dmix ;
    ipc_key 4109 ; ipc_perm 0660 ;
    slave { pcm "hw:0,0"
        channels 2 ; period_size 1024 ; buffer_size 4096 ; rate 44100 ; period_time 0 ;
        }
    bindings { 0 0 ; 1 1 ; }
    }

#=== CARD 'card1'
pcm.card1-hw { type hw ; card 1 ; }
ctl.card1-hw { type hw ; card 1 ; }

pcm.card1 { type dmix ;
    ipc_key 1949 ; ipc_perm 0660 ;
    slave { pcm "hw:1,0"
        channels 2 ; period_size 1024 ; buffer_size 4096 ; rate 44100 ; period_time 0 ;
        }
    bindings { 0 0 ; 1 1 ; }
    }

这将创建两个“dmix”播放设备:“card0”和“card1”。它们将允许您在它们之间无问题地切换。

现在,将其放入 ~/.asoundrc 中:

# Define new virtual devices
pcm.this                { type plug ; slave.pcm "card1" ; }
ctl.this                ctl.card1-hw
# Set default device
pcm.!default    pcm.this
ctl.!default    ctl.this

切换到第二张卡。将所有“1”替换为“0”即可切换回来。一个小脚本会很方便 :)

注意:在本手册中,我们创建了几个新的 Alsa 设备:“this”、“card0-hw”、“card0”、“card1-hw”、“card1”。您可以参考它们:

$ amixer -D 'this' scontrols
Simple mixer control 'PCM',0

PS 我不太了解 Alsa 的实际工作方式,可能犯了严重的错误 :) 如果有更好的方法,请纠正我。但这仍然有效 :)

答案3

我尝试对 alsa-base.conf 进行简单的编辑,将板载设置为 -2,将 USB 设置为 -1,但这不起作用。

但是,当我将 BOTH 设置为 -1(首先列出板载)时,我就可以来回切换。

不过,每次更改后我都必须执行 alsa 强制重新加载。

答案4

我正在尝试解决同样的问题:当 USB 声卡插入系统时自动重新路由音频流,因此我决定为 udev 编写一条新规则:

/etc/udev/rules.d/50-alsa.rules:

SUBSYSTEMS=="usb", ATTRS{idVendor}=="****", ATTRS{idProduct}=="****", RUN+="/usr/local/bin/alsa-switch.sh"

当然,你必须根据你的设备用数字替换“*”(使用 lsusb 来知道哪些)

脚本alsa-switch.sh非常简单:

#!/bin/sh
ln -sf /path/to/custom/asoundrc /home/<user>/.asoundrc

可以添加另一条规则来在设备被移除时恢复配置(抱歉,我还在努力)

相关内容