Frage Linux ALSA Treiber mit Kanalanzahl 3


Bin mein ALSA Driver auf Ubuntu 14.04, 64bit, 3.16.0-30-generischem Kernel laufen.

Hardware ist eine proprietäre Hardware und kann daher nicht viele Details enthalten.

Im Folgenden finden Sie die vorhandene Treiberimplementierung:

  1. Dem Treiber wird channel_count als Eingabe über den Modulparameter bereitgestellt. (Aufgrund der Anforderungen muss die Anzahl über Modulparameter zur Verfügung gestellt werden)
  2. Treiber füllt alsa snd_pcm_hardware structure als playback-> channels_min = channel_count & für playback-> channels_max = channel_count; Gleiche Werte für die Aufnahmeseite.
  3. Die Hardware ist für Uhren basierend auf channel_count konfiguriert, und der Treiber registriert erfolgreich die ALSA-Schicht
  4. aplay / Arecord funktioniert gut für channel_count = 1/2/4
  5. Während der Wiedergabe / Arecord, im Treiber, wenn der Wert "runtime-> channels" ausgewählt ist, wird der konfigurierte channel_count angezeigt, was für mich korrekt klingt. Daten werden mit abgespielt, da es sich um einen Loop-Back-Test handelt.

Aber wenn ich channel_count = 3 verwende, Sowohl aplay- als auch Arecord-Berichte "Defekte Konfiguration für dieses PCM: keine Konfigurationen verfügbar" !! für eine Wave-Datei mit channel_count '3'

Ex: Wiedergabe von WAVE './xxx.wav': Signiertes 16 Bit Little Endian, Rate 48000 Hz, Kanäle 3

ALSA lib pcm_params.c: 2162: (snd1_pcm_hw_refine_slave) Slave-PCM nicht verwendbar

aplay: set_params: 1204: Defekte Konfiguration für dieses PCM: keine Konfigurationen verfügbar


Mit folgenden Änderungen konnte ich ein Stück weitergehen:

Methode 1:

  1. Dem Treiber wird channel_count '3' als Eingabe über den Modulparameter übergeben
  2. Modifizierter Treiber, um die Struktur von snd_pcm_hardware als Payback-> Channels_min = 2 & playback-> channels_min = 3 zu füllen; Ähnliche Werte für den Aufnahmepfad
  3. aplay / Arecord-Berichte als "Kanalanzahl nicht verfügbar", obwohl die verwendete Wave-Datei 3 Kanäle hat

Beispiel: aplay -D hw: CARD = xxx, DEV = 0 ./xxx.wav Wiedergabe von WAVE './xxx.wav': Signiertes 16 Bit Little Endian, Rate 48000 Hz, Kanäle 3

aplay: set_params: 1239: Anzahl der Kanäle nicht verfügbar

  1. Versuchte aplay / Arecord mit plughw, und aplay / Arecord bewegte sich voran

modprobe my_driver.ko Kanal = 3

Arecord -DDruck: CARD = xxx, DEV = 0 -d 3 -f S16_LE -r 48000 -c 3 ./xxx_rec0.wav

aplay -D plughw: KARTE = xxx, DEV = 0 ./xxx.wav

Aufnahme WAVE './xxx_rec0.wav': Signed 16 Bit Little Endian, Rate 48000 Hz, Kanäle 3

Wiedergabe von WAVE './xxx.wav': Signiertes 16 Bit Little Endian, Rate 48000 Hz, Kanäle 3

Ende des Tests

  1. Während der Wiedergabe / Arecord, Im Treiber, wenn der Wert "runtime-> channels" aktiviert ist, wird der Wert 2 zurückgegeben !!! Aber gespielt Wavefile hat ch count 3 ...

  2. Wenn Daten in der aufgenommenen Datei überprüft werden, ist alles still


Methode 2:

  1. Dem Treiber wird channel_count '3' als Eingabe über den Modulparameter übergeben

  2. Modified Driver, um die Struktur von snd_pcm_hardware als playback-> channels_min = 3 & playback-> channels_min = 4 zu füllen; Ähnliche Werte für den Aufnahmepfad

  3. aplay / Arecord-Berichte als "Kanalanzahl nicht verfügbar", obwohl die verwendete Wave-Datei 3 Kanäle hat

  4. Versuchte aplay / Arecord mit plughw, und aplay / Arecord bewegte sich voran

  5. Während der Wiedergabe / Arecord, wenn der Wert "runtime-> channels" aktiviert ist, gibt der Treiber den Wert 4 zurück !!! Aber gespielt Wavefile hat ch count 3 ...

  6. Wenn Daten in der aufgenommenen Datei überprüft werden, ist alles still

Aus obigen Beobachtungen ergibt sich, dass die Runtime-> Channels entweder 2 oder 4 sind, aber niemals 3 Channels wurden von alsa-Stack verwendet, obwohl sie angefordert wurden. Wenn plughw verwendet wird, konvertiert alsa Daten, um unter 2 oder 4 Kanälen zu laufen.

Kann jemand helfen, warum Kanalzahl 3 nicht verwenden kann. Wird bei Bedarf mehr Informationen bereitstellen. Danke im Voraus.


1
2018-05-16 11:36


Ursprung


Zeige alle aktuellen Werte des snd_pcm_hardware Struktur. (Und diese Frage gehört zu Stack Overflow.) - CL.


Antworten:


Vielen Dank für Ihre Antwort.

Wird die Frage in stackoverflow platzieren.

Wenn Sie weiter helfen können, hier ist, was Sie angefordert haben.

definiere DEFAULT_PERIOD_SIZE (4096)

definiere DEFAULT_NO_OF_PERIODS (1024)

statische Struktur 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,

};

Ähnliche Werte für Captures-Seite snd_pcm_hardware Struktur.

Bitte beachten Sie, dass die folgenden Werte bei der Wiedergabe im geöffneten Einstiegspunkt basierend auf der aktuellen Audiotestkonfiguration ersetzt werden: (Benutzer stellt Audio-Format, Audio-Rate, Ch-Anzahl über Modul-Parameter als Eingaben für den Treiber, die in der Struktur snd_pcm_hardware nachgefüllt werden) zur Verfügung

xxx_playback.formate,

xxx_playback.rates,

xxx_playback.rate_min, xxx_playback.rate_max,

xxx_playback.channels_min, xxx_playback.channels_max

(Ähnliche Werte werden in der snd_pcm_hardware-Struktur auf der Capture-Seite ersetzt)


0
2018-05-18 13:16



Lösung zur Verfügung gestellt bei: stackoverflow.com/questions/30304697/... - vsu