我正在寻求帮助或建议来在我的 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"}
为了更进一步的参考。