Depois da minha primeira guerra de configuração contra o alsa (ganho com a ajuda de CL. ) verifique esta pergunta ...
Gostaria agora de ir mais longe:
Eu consigo reproduzir sons de vários canais na minha configuração, mas agora preciso reproduzi-los simultaneamente!
Descobri que usar o dmix deveria me ajudar, mas ainda tenho problemas para configurar o arquivo asound.conf correto, aqui as diferentes soluções que tentei e seus respectivos resultados:
Inicial (trabalhando com vários canais, mas não simultaneamente) asound.conf:
pcm.!default {
type asym
playback.pcm {
type plug
slave.pcm "surround40:CA0106"
}
capture.pcm {
type plug
slave.pcm "hw:CA0106"
}
}
Inicial (Tocando simultaneamente, mas não multicanal, apenas 2 canais aqui) 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"
}
Nota sobre a configuração acima
Este asound.conf permite-me tocar simultaneamente 2 sons, mas apenas em 2 canais, perdi a capacidade multicanal ...
Além disso, alguns sons que costumavam funcionar com o meu asound.conf inicial (o primeiro trecho acima) não funciona mais com este asound.conf, aqui está a mensagem de falha :
[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
E um exemplo de som funcional:
[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
Estou usando a opção "-N" para obter alguns sons curtos para tocar um após o outro muito rapidamente, não consigo me livrar dessa ação.
Para encurtar a história, estou procurando um arquivo asound.conf que me permita manter a capacidade multicanal, mas que também me permita tocar 2 sons diferentes simultaneamente.
Entre os 2 sons há um usando os 2 alto-falantes frontais e o outro usando os 2 alto-falantes traseiros, ambos os sons são construídos usando 4 canais com 2 canais (frontal ou traseiro dependendo do som) em branco.
Do meu pequeno entendimento eu precisaria especificar um "dispositivo customizado" (tipo de plugue ou qualquer outro tipo?) primeiro e então "dmix" eles, porque eu tentei mudar o slave.pcm endereço de hardware dentro do bloco pcm.dmixed mas isso me dá um erro dizendo que o tipo não estava correto para este bloco (ou algo similar, eu posso fornecer a mensagem exata se necessário ...)
hw:CA0106
para
surround40:CA0106
Qualquer informação e ideia são bem-vindas para me ajudar a resolver esse problema.
UPDATE_1:
Seguindo CL. advices, eu construí este 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"
}
Mas ainda não está funcionando ... Falha com este erro:
ALSA lib pcm_multi.c:1042:(_snd_pcm_multi_open) Unknown field slave
Parece que estou perdendo uma definição de escravo, mas não consigo encontrar onde ...
UPDATE_2:
Aqui meu último "quase" arquivo de trabalho, graças ao CL., Eu ainda estou tendo um som tocado em 2 partes (veja comentários para mais informações), mas ainda é melhor que nada ..
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 }
]
}
Eu finalmente fui para o uso de plug: dmix_front e plug: dmix_front do meu aplicativo.
Obrigado CL. pelo seu apoio e paciência.