Ich verwende meinen ALSA-Treiber auf Ubuntu 14.04, 64 Bit, 3.16.0-30-generischer Kernel.
Die Hardware ist proprietär, daher können nicht viele Details bereitgestellt werden.
Nachfolgend sehen Sie die vorhandene Treiberimplementierung:
- Dem Treiber wird die Kanalanzahl als Eingabe über den Modulparameter bereitgestellt. (Aus Anforderungen muss die Kanalanzahl über den Modulparameter bereitgestellt werden.)
- Der Treiber füllt die Alsa-SND_PCM_Hardwarestruktur als „Wiedergabe->Kanäle_min = Kanalanzahl“ und für „Wiedergabe->Kanäle_max = Kanalanzahl“ aus. Dieselben Werte gelten für die Aufnahmeseite.
- Die Hardware ist für Takte basierend auf der Kanalanzahl konfiguriert und der Treiber wird erfolgreich bei der ALSA-Schicht registriert.
- aplay/arecord funktioniert gut für channel_count = 1/2/4
- Wenn während einer Wiedergabe/Aufzeichnung im Treiber der Wert „runtime->channels“ aktiviert ist, spiegelt dieser die konfigurierte Kanalanzahl wider, was für mich richtig klingt. Die aufgezeichneten Daten stimmen mit den wiedergegebenen überein, da es sich um einen Loopback-Test handelt.
Aber wenn ich channel_count = 3 verwende, melden sowohl aplay als auch arecord "Defekte Konfiguration für dieses PCM: keine Konfigurationen verfügbar"!! für eine Wave-Datei mit channel_count '3'
Beispiel: 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: Beschädigte Konfiguration für dieses PCM: keine Konfigurationen verfügbar
Mit folgenden Änderungen konnte ich ein Stück weiterkommen:
Methode 1:
- Der Treiber erhält channel_count '3' als Eingabe über den Modulparameter
- Modifizierter Treiber zum Füllen der snd_pcm_hardware-Struktur als payback->channels_min = 2 & playback->channels_min = 3; Ähnliche Werte für den Aufnahmepfad
- aplay/arecord meldet „Kanalanzahl nicht verfügbar“, obwohl die verwendete Wave-Datei 3 Kanäle hat
Beispiel: aplay -D hw:CARD=xxx,DEV=0 ./xxx.wav WAVE './xxx.wav' wird abgespielt: Signiertes 16-Bit Little Endian, Rate 48000 Hz, Kanäle 3
aplay: set_params:1239: Anzahl der Kanäle nicht verfügbar
- Habe aplay/arecord mit Plughw versucht und aplay/arecord ist weitergegangen
modprobe my_driver.ko Kanal=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
Aufnahme WAVE './xxx_rec0.wav': Signiertes 16-Bit Little Endian, Rate 48000 Hz, Kanäle 3
WAVE './xxx.wav' wird abgespielt: Signiertes 16-Bit Little Endian, Rate 48000 Hz, Kanäle 3
Ende des Tests
Wenn während einer Wiedergabe/Aufnahme im Treiber der Wert „Laufzeit->Kanäle“ aktiviert ist, wird der Wert 2 zurückgegeben!!! Aber die abgespielte Wave-Datei hat eine Kanalanzahl von 3 …
Beim Überprüfen der Daten in der aufgezeichneten Datei herrscht Stille
Methode 2:
Der Treiber erhält channel_count '3' als Eingabe über den Modulparameter
Modifizierter Treiber zum Füllen der snd_pcm_hardware-Struktur als playback->channels_min = 3 & playback->channels_min = 4; Ähnliche Werte für den Aufnahmepfad
aplay/arecord meldet „Kanalanzahl nicht verfügbar“, obwohl die verwendete Wave-Datei 3 Kanäle hat
Habe aplay/arecord mit Plughw versucht und aplay/arecord ist weitergegangen
Wenn während einer Wiedergabe/Aufnahme im Treiber der Wert „Laufzeit->Kanäle“ aktiviert ist, wird der Wert 4 zurückgegeben!!! Aber die abgespielte Wave-Datei hat eine Kanalanzahl von 3 …
Beim Überprüfen der Daten in der aufgezeichneten Datei herrscht Stille
Aus den obigen Beobachtungen geht hervor, dass die Laufzeit->Kanäle entweder 2 oder 4 beträgt, aber vom Alsa-Stack wurden nie 3 Kanäle verwendet, obwohl dies angefordert wurde. Bei Verwendung von Plughw konvertiert Alsa die Daten so, dass sie auf 2 oder 4 Kanälen ausgeführt werden.
Kann mir jemand helfen, warum ich Kanal Nummer 3 nicht verwenden kann? Ich werde bei Bedarf weitere Informationen bereitstellen. Vielen Dank im Voraus.
Antwort1
Vielen Dank für Ihre Antwort.
Werde die Frage in Stackoverflow platzieren.
Wenn Sie weiterhelfen können, finden Sie hier die gewünschte Lösung.
Definieren Sie DEFAULT_PERIOD_SIZE (4096)
Definieren Sie 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 die Erfassung der snd_pcm_hardware-Struktur.
Bitte beachten Sie, dass die folgenden Werte im offenen Einstiegspunkt für die Wiedergabe basierend auf der aktuellen Audiotestkonfiguration ersetzt werden: (Der Benutzer stellt Audioformat, Audiorate und Kanalanzahl über Modulparameter als Eingaben für den Treiber bereit, die in der snd_pcm_hardware-Struktur erneut ausgefüllt werden.)
xxx_playback.formats,
xxx_playback.rates,
xxx_Wiedergaberate_min, xxx_Wiedergaberate_max,
xxx_playback.channels_min, xxx_playback.channels_max
(Ähnliche Werte wurden in der snd_pcm_hardware-Struktur auf der Erfassungsseite ersetzt)