Driver Linux ALSA usando contagem de canais 3

Driver Linux ALSA usando contagem de canais 3

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:

  1. 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)
  2. 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.
  3. O hardware é configurado para relógios baseados em channel_count e o driver é registrado com sucesso na camada ALSA
  4. aplay/arecord funciona bem para channel_count = 1/2/4
  5. 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:

  1. O driver é fornecido channel_count '3' como entrada via parâmetro do módulo
  2. Driver modificado para preencher a estrutura snd_pcm_hardware como payback->channels_min = 2 & playback->channels_min = 3; Valores semelhantes para caminho de captura
  3. 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

  1. 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

  1. 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...

  2. Quando os dados no arquivo gravado são verificados, tudo fica em silêncio


Método2:

  1. O driver é fornecido channel_count '3' como entrada via parâmetro do módulo

  2. Driver modificado para preencher a estrutura snd_pcm_hardware como playback->channels_min = 3 & playback->channels_min = 4; Valores semelhantes para caminho de captura

  3. aplay/arecord relata como 'contagem de canais não disponível', embora o arquivo wave em uso tenha 3 canais

  4. Tentei aplay/arecord com plughw e aplay/arecord seguiu em frente

  5. 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...

  6. 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)

informação relacionada