在我与 alsa 的第一次配置战争之后(在CL。) 查看这个问题...
我现在想更进一步:
我可以在我的设置上播放多通道声音,但我现在需要同时播放它们!
我发现使用 dmix 应该对我有帮助,但我在设置正确的 asound.conf 文件时仍然遇到问题,这里是我尝试过的不同解决方案及其各自的结果:
初始(使用多通道但不能同时使用)asound.conf :
pcm.!default {
type asym
playback.pcm {
type plug
slave.pcm "surround40:CA0106"
}
capture.pcm {
type plug
slave.pcm "hw:CA0106"
}
}
初始(同时播放但不是多通道,这里只有 2 个通道) asound.conf :
pcm.dmixed {
type dmix
ipc_key 1024
ipc_key_add_uid 0
slave.pcm "hw:CA0106"
}
pcm.duplex {
type asym
playback.pcm "dmixed"
}
# Instruct ALSA to use pcm.duplex as the default device
pcm.!default {
type plug
slave.pcm "duplex"
}
关于上述设置的注意事项 这个asound.conf允许我同时播放2个声音,但只在2个通道上,我失去了多通道能力......
另外,一些曾经与我的初始 asound.conf(上面的第一个摘录)一起使用的声音不再与此 asound.conf 一起使用,这是失败消息:
[root@server Sons]# aplay -N Apparition.wav
Playing WAVE 'Apparition.wav' : Signed 32 bit Little Endian, Rate 22050 Hz, Channels 4
aplay: set_params:1015: Unable to install hw params:
ACCESS: RW_INTERLEAVED
FORMAT: S32_LE
SUBFORMAT: STD
SAMPLE_BITS: 32
FRAME_BITS: 128
CHANNELS: 4
RATE: NONE
PERIOD_TIME: 125000
PERIOD_SIZE: NONE
PERIOD_BYTES: (44096 44112)
PERIODS: (1 2)
BUFFER_TIME: (249977 249978)
BUFFER_SIZE: 5512
BUFFER_BYTES: 88192
TICK_TIME: 0
还有一个有效的声音示例:
[root@server Sons]# aplay -vN Disparition.wav
Playing WAVE 'Disparition.wav' : Signed 32 bit Little Endian, Rate 22254 Hz, Channels 4
Plug PCM: Route conversion PCM (sformat=S32_LE)
Transformation table:
0 <- 0
1 <- 1
Its setup is:
stream : PLAYBACK
access : RW_INTERLEAVED
format : S32_LE
subformat : STD
channels : 4
rate : 22254
exact rate : 22254 (22254/1)
msbits : 32
buffer_size : 5563
period_size : 2781
period_time : 125000
tstamp_mode : NONE
period_step : 1
avail_min : 2781
period_event : 0
start_threshold : 5563
stop_threshold : 5563
silence_threshold: 0
silence_size : 0
boundary : 729153536
Slave: Rate conversion PCM (48000, sformat=S16_LE)
Its setup is:
stream : PLAYBACK
access : MMAP_INTERLEAVED
format : S32_LE
subformat : STD
channels : 2
rate : 22254
exact rate : 22254 (22254/1)
msbits : 32
buffer_size : 5563
period_size : 2781
period_time : 125000
tstamp_mode : NONE
period_step : 1
avail_min : 2781
period_event : 0
start_threshold : 5563
stop_threshold : 5563
silence_threshold: 0
silence_size : 0
boundary : 729153536
Slave: Direct Stream Mixing PCM
Its setup is:
stream : PLAYBACK
access : MMAP_INTERLEAVED
format : S16_LE
subformat : STD
channels : 2
rate : 48000
exact rate : 48000 (48000/1)
msbits : 16
buffer_size : 12000
period_size : 6000
period_time : 125000
tstamp_mode : NONE
period_step : 1
avail_min : 6000
period_event : 0
start_threshold : 12000
stop_threshold : 12000
silence_threshold: 0
silence_size : 0
boundary : 1572864000
Hardware PCM card 0 'CA0106' device 0 subdevice 0
Its setup is:
stream : PLAYBACK
access : MMAP_INTERLEAVED
format : S16_LE
subformat : STD
channels : 2
rate : 48000
exact rate : 48000 (48000/1)
msbits : 16
buffer_size : 12000
period_size : 6000
period_time : 125000
tstamp_mode : ENABLE
period_step : 1
avail_min : 6000
period_event : 0
start_threshold : 1
stop_threshold : 1572864000
silence_threshold: 0
silence_size : 1572864000
boundary : 1572864000
我正在使用“-N”选项来获得一些非常短的声音,以便快速地一个接一个地播放,我无法摆脱这个动作。
长话短说,我正在寻找一个 asound.conf 文件,它可以让我保持多通道容量,但也可以让我同时播放 2 种不同的声音。
在 2 种声音中,一种使用 2 个前置扬声器,另一种使用 2 个后置扬声器,这两种声音均使用 4 通道构建,其中 2 通道(前置或后置,具体取决于声音)空白。
根据我的一点理解,我需要首先指定一个“自定义设备”(插头类型或任何其他类型?),然后“混合”它们,因为我试图更改Slave.pcm硬件地址在 - 的里面PCM.dmixed块,但这给了我一个错误,指出该块的类型不正确(或类似的东西,如果需要,我可以提供确切的消息......)
hw:CA0106
到
surround40:CA0106
欢迎任何信息和想法来帮助我解决这个问题。
UPDATE_1: 继 CL.建议,我构建了这个 asound.conf :
pcm.dmixed {
type dmix
ipc_key 1024
ipc_key_add_uid 0
slave {
pcm "hw:0,0"
channels 4
}
}
pcm.dmixed2 {
type dmix
ipc_key 1025
ipc_key_add_uid 0
slave {
pcm "hw:0,1"
channels 4
}
}
pcm.quad {
type multi
slave.pcm "dmixed"
slave.pcm "dmixed2"
}
# Instruct ALSA to use pcm.quad as the default device
pcm.!default {
type plug
slave.pcm "quad"
}
但它仍然不起作用...它失败并出现以下错误:
ALSA lib pcm_multi.c:1042:(_snd_pcm_multi_open) Unknown field slave
看起来我缺少奴隶定义,但我找不到在哪里......
更新_2: 这是我最新的“几乎”工作文件,感谢 CL.,我仍然有两个部分播放声音(更多信息请参阅评论),但它仍然比没有好。
pcm.!default { # The "!" is used to overwrite an existing definition (pcm.default in this case ...)
type asym
playback.pcm {
type plug # plug is the "automatic conversion" plugin : convert data rate, channel and format on demand
slave.pcm "quad"
}
}
pcm.dmix_front { # Define the front speakers device : hw:0,0
type dmix
ipc_key 12345
ipc_key_add_uid 0
slave.pcm "hw:0,0"
}
pcm.dmix_rear { # Define the rear speakers device : hw:0,1
type dmix
ipc_key 67890
ipc_key_add_uid 0
slave.pcm "hw:0,1"
}
pcm.quad {
type multi
slaves {
a { pcm dmix_front channels 2 }
b { pcm dmix_rear channels 2 }
}
bindings [
{ slave a channel 0 }
{ slave a channel 1 }
{ slave b channel 0 }
{ slave b channel 1 }
]
}
我最终从我的应用程序中使用了plug:dmix_front和plug:dmix_front。
谢谢你,CL。感谢您的支持和耐心。
答案1
根据文档,这样的事情应该有效:
pcm.dmix_front {
type dmix
ipc_key 12345
ipc_key_add_uid 0
slave.pcm "hw:0,0"
}
pcm.dmix_rear {
type dmix
ipc_key 67890
ipc_key_add_uid 0
slave.pcm "hw:0,1"
}
pcm.quad {
type multi
slaves {
a { pcm dmix_front channels 2 }
b { pcm dmix_rear channels 2 }
}
bindings [
{ slave a channel 0 }
{ slave a channel 1 }
{ slave b channel 0 }
{ slave b channel 1 }
]
}