Controlador ALSA de Linux usando el número de canales 3

Controlador ALSA de Linux usando el número de canales 3

Estoy ejecutando mi controlador ALSA en Ubuntu 14.04, 64 bits, kernel genérico 3.16.0-30.

El hardware es propietario, por lo que no puedo proporcionar muchos detalles.

La siguiente es la implementación del controlador existente:

  1. El controlador recibe channel_count como entrada a través del parámetro del módulo. (Debido a los requisitos, es necesario proporcionar el recuento de canales a través del parámetro del módulo)
  2. El controlador completa la estructura alsa snd_pcm_hardware como reproducción->channels_min = channel_count & para reproducción->channels_max = channel_count; Los mismos valores para el lado de captura.
  3. El hardware está configurado para relojes basados ​​en el número de canales y el controlador se registra correctamente en la capa ALSA.
  4. aplay/arecord funciona bien para channel_count = 1/2/4
  5. Durante una reproducción/grabación, en el controlador, cuando se marca el valor "tiempo de ejecución->canales", se refleja el número de canales configurado, lo que me parece correcto. Registre los datos de los partidos jugados, ya que es una prueba de bucle invertido.

Pero cuando uso channel_count = 3, tanto aplay como arecord informan "Configuración rota para este PCM: ¡no hay configuraciones disponibles"! para un archivo wave con channel_count '3'

Ej: Reproducción de WAVE './xxx.wav': Little Endian de 16 bits firmado, velocidad de 48000 Hz, canales 3

ALSA lib pcm_params.c:2162:(snd1_pcm_hw_refine_slave) PCM esclavo no utilizable

aplay: set_params:1204: Configuración rota para este PCM: no hay configuraciones disponibles


Con los siguientes cambios pude avanzar un poco:

Método 1:

  1. El controlador recibe channel_count '3' como entrada a través del parámetro del módulo
  2. Controlador modificado para completar la estructura snd_pcm_hardware como recuperación de la inversión->channels_min = 2 y reproducción->channels_min = 3; Valores similares para la ruta de captura
  3. aplay/arecord informa como 'recuento de canales no disponible', aunque el archivo wave en uso tiene 3 canales

ej: aplay -D hw:CARD=xxx,DEV=0 ./xxx.wav Reproducción de WAVE './xxx.wav': Little Endian de 16 bits firmado, velocidad de 48000 Hz, canales 3

aplay: set_params:1239: El recuento de canales no está disponible

  1. Intenté aplay/arecord con plughw y aplay/arecord avanzó

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:CARD=xxx,DEV=0 ./xxx.wav

Grabación WAVE './xxx_rec0.wav': Little Endian de 16 bits firmado, velocidad 48000 Hz, canales 3

Reproducción de WAVE './xxx.wav': Little Endian de 16 bits firmado, velocidad de 48000 Hz, canales 3

Fin de la prueba

  1. Durante una reproducción/grabación, en el controlador, cuando se marca el valor "tiempo de ejecución->canales", se devuelve el valor 2. Pero el archivo wave reproducido tiene 3 canales...

  2. Cuando se verifican los datos en el archivo grabado, todo está en silencio.


Método 2:

  1. El controlador recibe channel_count '3' como entrada a través del parámetro del módulo

  2. Controlador modificado para completar la estructura snd_pcm_hardware como reproducción->channels_min = 3 y reproducción->channels_min = 4; Valores similares para la ruta de captura

  3. aplay/arecord informa como 'recuento de canales no disponible', aunque el archivo wave en uso tiene 3 canales

  4. Intenté aplay/arecord con plughw y aplay/arecord avanzó

  5. Durante una reproducción/grabación, en el controlador, cuando se marca el valor "tiempo de ejecución->canales", devuelve el valor 4. Pero el archivo wave reproducido tiene 3 canales...

  6. Cuando se verifican los datos en el archivo grabado, todo está en silencio.

Entonces, según las observaciones anteriores, el tiempo de ejecución->canales es 2 o 4, pero alsa stack nunca utilizó 3 canales aunque se solicitó. Cuando se usa Plughw, también convierte datos para ejecutarlos en 2 o 4 canales.

¿Alguien puede ayudarme por qué no puedo usar el número de canales 3? Proporcionará más información si es necesario. Gracias de antemano.

Respuesta1

Gracias por su respuesta.

Colocará la pregunta en stackoverflow.

Si puedes ayudar más, esto es lo que solicitaste.

definir DEFAULT_PERIOD_SIZE (4096)

definir DEFAULT_NO_OF_PERIODS (1024)

estructura 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 similares para la estructura snd_pcm_hardware del lado de las capturas.

Tenga en cuenta que los siguientes valores a continuación se reemplazarán en el punto de entrada abierto de reproducción, según la configuración de prueba de audio actual: (el usuario proporciona el formato de audio, la velocidad de audio y el recuento de canales a través de los parámetros del módulo como entradas al controlador, que se rellenan en snd_pcm_hardware estructura)

xxx_reproducción.formatos,

xxx_playback.rates,

xxx_playback.rate_min, xxx_playback.rate_max,

xxx_playback.channels_min, xxx_playback.channels_max

(Valores similares reemplazados en la estructura snd_pcm_hardware en el lado de captura)

información relacionada