Estou executando meu driver ALSA no Ubuntu 14.04, 64 bits, 3.16.0-30-Kernel genérico.
O hardware é proprietário e, portanto, não pode fornecer muitos detalhes.
A seguir está a implementação do driver existente:
- O driver é fornecido channel_count como entrada através do parâmetro do módulo. (Devido aos requisitos, é necessário fornecer contagem de canais por meio do parâmetro do módulo)
- O driver também preenche a estrutura snd_pcm_hardware como playback->channels_min = channel_count & para playback->channels_max = channel_count; Mesmos valores para o lado de captura.
- O hardware é configurado para relógios baseados em channel_count e o driver é registrado com sucesso na camada ALSA
- aplay/arecord funciona bem para channel_count = 1/2/4
- Durante aplay/arecord, no driver, quando o valor "runtime->channels" é verificado, ele reflete o channel_count configurado, o que me parece correto. Grave partidas de dados jogadas, pois é um teste de loop back.
Mas quando eu uso channel_count = 3, tanto o aplay quanto o arecord relatam "Configuração quebrada para este PCM: nenhuma configuração disponível"!! para um arquivo wave com channel_count '3'
ex: Reproduzindo WAVE './xxx.wav': Little Endian de 16 bits assinado, taxa de 48.000 Hz, canais 3
ALSA lib pcm_params.c:2162:(snd1_pcm_hw_refine_slave) PCM escravo não utilizável
aplay: set_params:1204: Configuração quebrada para este PCM: nenhuma configuração disponível
Com as seguintes alterações, consegui avançar um pouco:
Método 1:
- O driver é fornecido channel_count '3' como entrada via parâmetro do módulo
- Driver modificado para preencher a estrutura snd_pcm_hardware como payback->channels_min = 2 & playback->channels_min = 3; Valores semelhantes para caminho de captura
- aplay/arecord relata como 'contagem de canais não disponível', embora o arquivo wave em uso tenha 3 canais
ex: aplay -D hw:CARD=xxx,DEV=0 ./xxx.wav Reproduzindo WAVE './xxx.wav': Little Endian de 16 bits assinado, taxa de 48.000 Hz, canais 3
aplay: set_params:1239: Contagem de canais não disponível
- Tentei aplay/arecord com plughw e aplay/arecord seguiu em frente
modprobe meu_driver.ko Canal = 3
registro de arquivo -D plughw:CARD=xxx,DEV=0 -d 3 -f S16_LE -r 48000 -c 3 ./xxx_rec0.wav
aplay -D plughw:CARD=xxx,DEV=0 ./xxx.wav
Gravação WAVE './xxx_rec0.wav': Little Endian de 16 bits assinado, taxa de 48000 Hz, canais 3
Reproduzindo WAVE './xxx.wav': Little Endian de 16 bits assinado, taxa de 48000 Hz, canais 3
Fim do teste
Durante aplay/arecord, no driver quando o valor "runtime->channels" é verificado, ele retorna o valor 2!!! Mas o wavefile reproduzido tem contagem de ch 3...
Quando os dados no arquivo gravado são verificados, tudo fica em silêncio
Método2:
O driver é fornecido channel_count '3' como entrada via parâmetro do módulo
Driver modificado para preencher a estrutura snd_pcm_hardware como playback->channels_min = 3 & playback->channels_min = 4; Valores semelhantes para caminho de captura
aplay/arecord relata como 'contagem de canais não disponível', embora o arquivo wave em uso tenha 3 canais
Tentei aplay/arecord com plughw e aplay/arecord seguiu em frente
Durante aplay/arecord, no driver quando o valor "runtime->channels" é verificado ele retorna o valor 4!!! Mas o wavefile reproduzido tem contagem de ch 3...
Quando os dados no arquivo gravado são verificados, tudo fica em silêncio
Portanto, a partir das observações acima, o tempo de execução-> canais é 2 ou 4, mas nunca 3 canais foram usados pela pilha alsa, embora solicitado. Quando usado o Plughw, também converte dados para execução em 2 ou 4 canais.
Alguém pode ajudar por que não consigo usar a contagem de canais 3? Fornecerá mais informações, se necessário. Desde já, obrigado.
Responder1
obrigado pela sua resposta.
Colocará a questão no stackoverflow.
Se você puder ajudar mais, aqui está o que você solicitou.
definir DEFAULT_PERIOD_SIZE (4096)
definir DEFAULT_NO_OF_PERIODS (1024)
estrutura estática snd_pcm_hardware xxx_playback =
{
.info = SNDRV_PCM_INFO_MMAP |
SNDRV_PCM_INFO_INTERLEAVED |
SNDRV_PCM_INFO_MMAP_VALID |
SNDRV_PCM_INFO_SYNC_START,
.formats = SNDRV_PCM_FMTBIT_S16_LE,
.rates = (SNDRV_PCM_RATE_8000 | \
SNDRV_PCM_RATE_16000 | \
SNDRV_PCM_RATE_48000 | \
SNDRV_PCM_RATE_96000),
.rate_min = 8000,
.rate_max = 96000,
.channels_min = 1,
.channels_max = 1,
.buffer_bytes_max = (DEFAULT_PERIOD_SIZE * DEFAULT_NO_OF_PERIODS),
.period_bytes_min = DEFAULT_PERIOD_SIZE,
.period_bytes_max = DEFAULT_PERIOD_SIZE,
.periods_min = DEFAULT_NO_OF_PERIODS,
.periods_max = DEFAULT_NO_OF_PERIODS,
};
Valores semelhantes para a estrutura snd_pcm_hardware do lado da captura.
Observe que os seguintes valores abaixo serão substituídos no ponto de entrada aberto de reprodução, com base na configuração atual do teste de áudio: (o usuário fornece formato de áudio, taxa de áudio, contagem de canais por meio de parâmetros do módulo como entradas para o driver, que são recarregados em snd_pcm_hardware estrutura)
xxx_playback.formatos,
xxx_playback.rates,
xxx_playback.rate_min, xxx_playback.rate_max,
xxx_playback.canais_min, xxx_playback.canais_max
(Da mesma forma, os valores são substituídos na estrutura snd_pcm_hardware no lado da captura)