Nun kann man eine gefundene Lösung ewig betreiben im Sinne von "never touch a running system".
Ab und zu will ich aber dann doch schauen was denn so Neues passiert, es gibt ja immer neue Versionen. Die Linux-Community lebt.
Also habe ich mir das einmal mit dem aktuellen Raspbian bzw. PiCore11.0 angeschaut. Und wie es so kommt, das Format S32_LE läuft nicht. Invalid format!
Und so sind dann einige Stunden zusammengekommen um festzustellen was denn die Ursache ist. Es gibt zu Brutefir ja leider auch keine Community wo man einfach mal eine Frage losschiessen kann. Und Hifiberry hat gleich abgelehnt im Sinne von "wir sind es nicht!". Dabei habe ich nur gefragt ob sich vielleicht was am Treiber geändert hat. Früher war es hifiberry-digi.c, jetzt gibt es zusammenfassend für mehrere Hersteller rpi-wm8804-soundcard.c
Im nächsten Schritt habe ich mal nachgeschaut wo es denn bei Brutefir hapert. Nämlich bei der Funktion wo für die Hardware das Format S32_LE gesetzt wird. Das nimmt die Karte nicht an. Es folgt die Fehlermeldung mit Invalid format. Und ... S24_LE geht mit Brutefir auch nicht. S16_LE spielt dagegen.
Mmh, seltsam. Bei einem Test von aplay kann ich eine 24bit wav-Datei einwandfrei spielen.
Also habe ich mir selbst anhand von ALSA-Testprogrammen eine eigene kleine Testroutine gebastelt. Und hier klappte das mit derselben Format-Funktion, die auch Brutefir verwendet!
Aber eben nicht mit Brutefir.
Nach reichlich weiteren Tests und Überlegungen, die ich Euch nun doch ersparen will, war ich an einem Punkt, wo ich mit einer Testausgabe in meinem Testprogramm angezeigt bekam:
Code: Alles auswählen
FORMAT: S8 U8 S16_LE S16_BE U16_LE U16_BE S24_LE S24_BE U24_LE U24_BE S32_LE S32_BE U32_LE U32_BE FLOAT_LE FLOAT_BE FLOAT64_LE FLOAT64_BE MU_LAW A_LAW IMA_ADPCM S20_LE S20_BE U20_LE U20_BE S24_3LE S24_3BE U24_3LE U24_3BE S20_3LE S20_3BE U20_3LE U20_3BE S18_3LE S18_3BE U18_3LE U18_3BE
Code: Alles auswählen
FORMAT: S16_LE S24_LE
Obwohl: auch in Brutefir zeigt die Testausgabe an dass S24_LE geht. Nicht aber in der config-Datei.
Die weitere Inspektion ergibt dann: S24_LE in der config führt zum Brutefir-Format BF_SAMPLE_FORMAT_S24_LE, welches dann in bfio_alsa.c umgesetzt wird zu SND_PCM_FORMAT_S24_3LE.
S24_3LE kann die Soundkarte aber nicht. Also flugs den Quellcode geändert in SND_PCM_FORMAT_S24_LE. Und siehe da, die Ausgabe mit 24 bit unter Angabe von S24_LE in der config läuft. HEUREKA!!
Aber früher konnte ich doch S32_LE verwenden und nun nicht mehr. Frechweg eine weitere Quellcode-Änderung:
BF_SAMPLE_FORMAT_S32_LE wird nun ebenfalls umgesetzt in SND_PCM_FORMAT_S24_LE (anstelle des falschen SND_PCM_FORMAT_S32_LE).
Und schon läuft auch wie früher Brutefir mit der Digi +IO mit S32_LE in der config.
Es verbleibt noch die Frage wieso das Testprogramm viel mehr Formate anzeigt (s.o.). Da bin ich auch noch dahinter gekommen. Man muss ja das Device, also eigentlich die Soundkarte vorgeben. Und das kann man in mehrfachen Varianten tun. Ich habe dabei nun z.B. kennengelernt:
hw:sndrpihifiberry
hw:0 (indiziert, bei mehreren Soundkarten muss der Index passen)
default
plughw:0
dsnoop
Die beiden ersten Varianten zeigen das tatsächlich mögliche Format, also S16_LE und S24_LE.
Die anderen Varianten zeigen alle möglichen ALSA-Formate, jedoch nicht eben, was die Hardware kann.
Brutefir verwendet nun die ersten beiden Varianten, mein Testprogramm (abgekupfert aus ALSA-Testprogrammen) hat die anderen Varianten aufgerufen.
Mittlerweile weiss ich:
Mein Testprogramm hätte es nicht wirklich gebraucht. Dasselbe tut z.B. der Aufruf:
Code: Alles auswählen
arecord -D hw:sndrpihifiberry --dump-hw-params
Eine gegebene Soundkarte zeigt hier also, was sie wirklich kann.
Und dann wählt man in Brutefir die config-Parameter, die dann die möglichen Parameter setzen. Ggf. muss man den Quellcode anpassen und neu übersetzen (was übrigens auch ein Abenteuer für sich sein kann. FFTW, Flex und Jack verhalten sich allesamt anders).
Was ich immer noch nicht weiss:
Wieso gibt es eigentlich die ganzen Varianten bezgl der Devices? Was bezwecken sie genau und warum unterscheiden sie sich?
Fazit:
wenn ich Langeweile habe dann befasse ich mich mit Linux. Ansonsten nur im Notfall. Wer sich diese shice ausgedacht hat ...
Vielleicht hilft der Beitrag trotzdem dem einen oder anderen.
Viele Grüsse
Uli
PS: im Treiber der Digi +IO steht u.a.
Code: Alles auswählen
#define WM8804_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
SNDRV_PCM_FMTBIT_S24_LE)
Hölle, wer hat sich denn da wieder was zusammengemurkst...?