Alsa 将扬声器声音复制到 HDMI

Alsa 将扬声器声音复制到 HDMI

我正在寻求帮助或建议来在我的 Linux 机器上设置音频。

我想将从扬声器发出的音频复制到 HDMI 输出。

请查看我的设置:

aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: HDMI [HDA ATI HDMI], device 3: Generic Digital [Generic Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: Generic [HD-Audio Generic], device 0: ALC662 rev3 Analog [ALC662 rev3 Analog]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 1: Generic [HD-Audio Generic], device 1: ALC662 rev3 Digital [ALC662 rev3 Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

# aplay -L
null
    Discard all samples (playback) or generate zero samples (capture)
hdmi:CARD=HDMI,DEV=0
    HDA ATI HDMI, Generic Digital
    HDMI Audio Output
sysdefault:CARD=Generic
    HD-Audio Generic, ALC662 rev3 Analog
    Default Audio Device
front:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Analog
    Front speakers
surround21:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Analog
    2.1 Surround output to Front and Subwoofer speakers
surround40:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Analog
    4.0 Surround output to Front and Rear speakers
surround41:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Analog
    4.1 Surround output to Front, Rear and Subwoofer speakers
surround50:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Analog
    5.0 Surround output to Front, Center and Rear speakers
surround51:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Analog
    5.1 Surround output to Front, Center, Rear and Subwoofer speakers
surround71:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Analog
    7.1 Surround output to Front, Center, Side, Rear and Woofer speakers
iec958:CARD=Generic,DEV=0
    HD-Audio Generic, ALC662 rev3 Digital
    IEC958 (S/PDIF) Digital Audio Output

声音配置文件

pcm.!default{
 type plug
 slave.pcm "speakerphat"
}

ctl.!default {
 type hw card 1
}

pcm.speakerphat {
  type softvol
  slave.pcm "plughw:1"
  control.name "Master"
  control.card 1
}

扬声器的声音已启用:

amixer -q sset 'Master' unmute
amixer -q sset 'IEC958' unmute

答案1

在仅使用 alsa 的声音系统中,这个答案是一个可能的工作答案。
此后的所有代码段都应连接起来并替换现有的 asound.conf 定义。
通过级联定义,所有这些都可以变得更短。但是,那魔法会更难理解,调试会更困难……;-)


让我们开始定义需要重新采样时使用的速率转换器(需要时 dmix 重新采样)

defaults.pcm.rate_converter "speexrate_best"

然后主要是给设备定义别名。非阻塞允许多个应用程序同时打开关联的设备。

pcm.ALC662{
        type hw
        card Generic
        device 1
        subdevice 0
        nonblock true}
ctl.ALC662{
        type hw
        card Generic}
pcm.ATI{
        type hw
        card HDMI
        device 0
        subdevice 0
        nonblock true}
ctl.ATI{
        type hw
        card HDMI}

现在让我们继续混合插件定义(启用多个声源的混合并在需要时重新采样)。每个声音输出设备一个。
请注意ipc_key(共享内存标识符)。选择任何唯一的数字。 (检查第一次触发sudo ipcs -ma
还要注意,仍然根据需要进行记录,我现在才意识到在我的系统上指定 ipc_key 是没有用的。可能是某些升级在我背后放弃了类似 sysV 的 ipcs 的使用……?
也可以随意适应周期大小&缓冲区大小根据您的延迟要求和系统功能...

pcm.analog {
    type dmix
    ipc_key 219345
    slave{
        pcm ALC662
        format S32_LE
        period_size 1024
        buffer_size 4096 }}

pcm.hdmi {
    type dmix
    ipc_key 219346
    slave{
        pcm ATI
        format S32_LE
        period_size 1024
        buffer_size 4096 }}

现在来了魔法:将多个(立体声 VG 2 通道)流组合为一个(立体声 VG 2 通道),这得益于插入 :

pcm.analogHDMI {
    type multi
    slaves.a.pcm "analog"
    slaves.a.channels 2
    slaves.b.pcm "hdmi"
    slaves.b.channels 2

    bindings.0.slave a
    bindings.0.channel 0
    bindings.1.slave a
    bindings.1.channel 1
    bindings.2.slave b
    bindings.2.channel 0
    bindings.3.slave b
    bindings.3.channel 1}

就是这样 ?嗯……还没有:

请注意,生成的 pcm 不是交错格式,而是“复杂”格式。因此,只能处理交错(或非交错)格式的应用程序无法访问它。在这种情况下,请使用路由或插头插件包装此 PCM。

威尔科,让我们路线频道(源.目标音量):

pcm.2in1 {
    type route
    slave.pcm "analogHDMI"   
    ttable.0.0 1
    ttable.1.1 1
    ttable.0.2 1
    ttable.1.3 1}

当然,如果您希望这是默认的 alsa 输出,那么您需要添加:

pcm.!default {
    type plug
    slave.pcm "2in1"}

为了更进一步的参考

相关内容