Linux ALSA Driver usando a contagem de canais 3

1

Estou executando meu driver ALSA no Ubuntu 14.04, 64 bits, 3.16.0-30-Kernel genérico.

Hardware é um hardware proprietário, portanto, não podemos dar 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 a necessidade de requisitos para fornecer contagem ch via parâmetro do módulo)
  2. O driver preenche a estrutura alsa snd_pcm_hardware como playback- > channels_min = channel_count & para reprodução - > channels_max = channel_count; Mesmos valores para o lado da captura.
  3. O hardware está configurado para relógios baseados em channel_count e o driver registra com êxito com a camada ALSA
  4. aplay / arecord funciona bem para channel_count = 1/2/4
  5. Durante a reprodução / registro de voz, no driver quando o valor "canais de tempo de execução >" está marcado, ele reflete o channel_count configurado, o que parece correto para mim. Registre as correspondências de dados com o jogado, já que é um teste de loopback.

Mas quando eu uso channel_count = 3, Aplay ou arecord reporta "Configuração quebrada para este PCM: sem configurações disponíveis" !! para um arquivo wave com channel_count '3'

ex: Tocando WAVE './xxx.wav': Assinado 16 bit Little Endian, taxa 48000 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étodo1:

  1. O driver é fornecido como channel_count '3' como entrada por meio do 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 o caminho de captura
  3. relatórios aplay / arecord como 'contagem de canais não disponível', embora o arquivo wave em uso tenha 3 canais

ex: aplay -D hw: CARTÃO = xxx, DEV = 0 ./xxx.wav Tocando WAVE './xxx.wav': Assinado 16 bit Little Endian, taxa 48000 Hz, canais 3

aplay: set_params: 1239: a contagem de canais não está disponível

  1. Tentei aplay / arecord com plughw e aplay / arecord avançou

modprobe my_driver.ko Canal = 3

arecord -D plughw: CARD = xxx, DEV = 0 -d 3 -f S16_LE -r 48000 -c 3 ./xxx_rec0.wav

aplay -D plughw: CARTÃO = xxx, DEV = 0 ./xxx.wav

Gravando WAVE './xxx_rec0.wav': assinado 16 bits Little Endian, taxa 48000 Hz, canais 3

Tocando WAVE './xxx.wav': assinado 16 bits Little Endian, taxa 48.000 Hz, canais 3

Fim do teste

  1. Durante a reprodução / registro de voz, no driver quando o valor "canais de tempo de execução >" está marcado, ele retorna o valor 2 !!! Mas o wavefile jogado tem ch count 3 ...

  2. Quando os dados no arquivo gravado são verificados, tudo é silencioso

Método 2:

  1. O driver é fornecido como channel_count '3' como entrada por meio do 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 o caminho de captura

  3. relatórios aplay / arecord 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 avançou

  5. Durante a reprodução / registro de voz, no driver quando o valor "canais de tempo de execução >" está marcado, ele retorna o valor 4 !!! Mas o wavefile jogado tem ch count 3 ...

  6. Quando os dados no arquivo gravado são verificados, tudo é silencioso

Assim, a partir das observações acima, os canais de tempo de execução > são 2 ou 4, mas nunca 3 canais foram usados pela pilha alsa embora solicitados. Quando usado Plughw, alsa está convertendo dados para rodar em 2 ou 4 canais.

Alguém pode ajudar por que não conseguimos usar a contagem de canais 3. Fornecerá mais informações, se necessário. Obrigado antecipadamente.

    
por vsu 16.05.2015 / 13:36

1 resposta

0

obrigado pela sua resposta.

Colocará a pergunta no stackoverflow.

Se você puder ajudar mais, aqui está o que você pediu.

defina DEFAULT_PERIOD_SIZE (4096)

defina DEFAULT_NO_OF_PERIODS (1024)

static struct 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 das capturas.

Por favor, note que os seguintes valores abaixo serão substituídos no ponto de entrada de abertura da reprodução, com base na configuração atual do teste de áudio: (o usuário fornece o formato de áudio, a taxa de áudio, a contagem de canais através dos parâmetros do módulo como entradas para o driver, que são recarregados na estrutura snd_pcm_hardware)

xxx_playback.formats,

xxx_playback.rates,

xxx_playback.rate_min, xxx_playback.rate_max,

xxx_playback.channels_min, xxx_playback.channels_max

(Similarmente valores substituídos na estrutura snd_pcm_hardware no lado da captura)

    
por 18.05.2015 / 15:16