kein 24bit Audio mit HifiBerry Digi+

  • Hallo,
    ich habe einen Raspi B+ mit einem HifiBerry Digi+ zum laufen gebracht. 16bit Audio mit 44.1kHz und auch mit 48kHz wird abgespielt, 24bit 48kHz jedoch nicht. Bisher habe ich nur aplay benutzt, ich bekomme die Meldung:

    Playing WAVE 'music.wav' : Signed 24 bit Little Endian in 3bytes, Rate 48000 Hz, Stereo
    aplay: set_params:1233: Sample format non available
    Available formats:
    - S16_LE
    - S32_LE

    Das WAV-File wurde mit Audacity erstellt und ist z.B. auf einem PC abspielbar. Hat jemand eine Idee, was da schief läuft? Würde mplayer (oder war das mplay?) das besser können? Ein 32bit Audiofile will ich nicht anlegen, das ist ja um den Faktor 4/3 größer...

    Ich poste hier, da das HifiBerry-Forum nicht mehr funktioniert, ich kann mich nicht mehr einloggen, keinen neuen Account anlegen und auch nicht "Passwort vergessen" nutzen, dieses Popupfenster dort verschwindet nach der Eingabe und auf der Webseite darunter ist nichts mehr anclickbar. Öffnet man das Forum erneut, ist man wieder nicht angemeldet.

    Gruß

  • Die Ursache steht in der Meldung. Das Audiogerät nimmt Daten nur mit 16 und 32 Bit Sampletiefe entgegen und das ändert sich auch mit anderer Abspielsoftware nicht. Das ist auch für Soundkarten die über 24 Bit DACs verfügen nicht ungewöhnlich, weil in der Computerei 8, 16, 32, 64 Bit wesentlich üblicher sind als 12, 14, 20 oder 24.
    Das ist aber überhaupt kein Problem, weil man einfach durch "Ausstopfen" mit Nullen (für die neu hinzugekommenen niederwertigen Bit) auf höhere Sampletiefen umrechnen kann, genauso wie man die niederwertigen Bit einfach weglassen kann um eine niedrigere Sampletiefe zu erhalten. Hier ändert sich uU sogar etwas, weil es durchaus auch Abspielsoftware gibt, die die Umrechnenungen selbst macht.

    In Alsa erledigt normalerweise jedenfalls das plug-Plugin die notwendigen "Umrechnungen", bei aplay zB mit

    Code
    $ aplay -D plughw:1 meine-Audiodatei.wav


    In der Standardkonfiguration von Alsa muss man sich um solche Dinge eigentlich nicht kümmern - in irgendeiner Form musst du Alsa bereits konfiguriert haben.

    Einmal editiert, zuletzt von smutbert (7. März 2016 um 14:20)

  • Hallo,
    ich habe ein frisches Image vom HifiBerry genommen. Wahrscheinlich haben die Alsa schon konfiguriert. Dein Vorschlag für den Aufruf von aplay funktioniert leider nicht, ich bekomme folgendes als Fehlermeldung:

    Alsa lib pcm_hw.c:1401:(_snd_pcm_hw_open) Invalid value for card
    aplay: main:682: audio open error: No such file or directory

    Der Pfad und die Audiodatei darin waren aber richtig eingegeben, denn ein anschließender Versuch mit mplayer, wo ich den Pfad per Copy/Paste im Aufruf übernommen hatte, klappte ohne weiteres. Der mplayer spielte das 24bit 48kHz Audiofile, hat es aber laut Meldungen auf 16 bit heruntergerechnet, weil 24bit nicht gingen... Warum rechnet der dann nicht auf 32 bit rauf? Das geht doch angeblich wieder.

    Wo gibt es denn Doku zum Alsa, das "plughw:1" sagt mir so überhaupt nichts, ich habe das nur blind abgetippt.

    Gruß

  • Das wäre auch Glück gewesen, wenn es funktioniert hätte → 1 steht für die Nummer oder wahlweise (und vorzugsweise. weil die Nummerierung sich ändern kann) für den Namen der Soundkarte.
    Dokumentation von Alsa findest du in den Paketen unter /usr/share/doc/…, bei Alsa
    http://www.alsa-project.org/main/index.php/Main_Page
    und in diversen Wikis (mir hilft oft das Arch-Wiki), die oft etwas hilfreicher sind, weil Alsa doch etwas gewöhnungsbedürftig ist, was die Konfiguration angeht und dort oft genau die richtigen Beispiele stehen.

    Am besten du postest einmal die Ausgabe von

    Code
    $ aplay -l


    damit wir die Nummern und Namen der Soundkarten erfahren.

    Die eigentliche Konfiguration wird dann interessanter, weil ich noch nie in die Verlegenheit gekommen bin, dass ich Alsa dazu zwingen wollte etwas mit mehr als 16 Bit wiederzugeben... bis jetzt bin ich nur sicher, wie ich es mit mpd anstellen würde...

    Einmal editiert, zuletzt von smutbert (7. März 2016 um 21:15)

  • Hallo,
    hier die Antwort auf aplay -l:
    $ aplay -l
    **** List of PLAYBACK Hardware Devices ****
    card 0: sndrpihifiberry [snd_rpi_hifiberry_digi], device 0: HifiBerry Digi HiFi wm8804-spdif-0 []
    Subdevices: 1/1
    Subdevice #0: subdevice #0

    ich habe auch andere Nummern als 1 ausprobiert, genauer 0-3, nur bei 0 sah man interessanteres, vielleicht hilft das hier für die Fehlersuche:
    $ aplay -D plughw:0 /media/AUDIO_128GB/Konzert_Durufle/Durufle_24bit_48kHz_4_PieJesu.wav
    Playing WAVE '/media/AUDIO_128GB/Konzert_Durufle/Durufle_24bit_48kHz_4_PieJesu.wav' : Signed 24 bit Little Endian in 3bytes, Rate 48000 Hz, Stereo
    aplay: set_params:1145: Unable to install hw params:
    ACCESS: RW_INTERLEAVED
    FORMAT: S24_3LE
    SUBFORMAT: STD
    SAMPLE_BITS: 24
    FRAME_BITS: 48
    CHANNELS: 2
    RATE: 48000
    PERIOD_TIME: 125000
    PERIOD_SIZE: 6000
    PERIOD_BYTES: 36000
    PERIODS: 4
    BUFFER_TIME: 500000
    BUFFER_SIZE: 24000
    BUFFER_BYTES: 144000
    TICK_TIME: 0

    Signed 24 Bit little Endian 48kHz stereo stimmt haargenau, ich habe schon selber Software geschrieben, die WAV-Files bearbeitet, also auch entsprechende Funktionen zum Lesen und Schreiben geschrieben, ich weiß daher sehr genau, was in den WAV-Files drin ist. Aplay versteht also den Input ganz genau, nur mit dem Output an den HifiBerry hapert es...

    Im Gegensatz zum HifiBerry-Forum ist hier die Hilfe wirklich schnell und gut, momentan funktioniert das Einloggen ins dortige Forum gar nicht mehr...

    Gruß

  • Sollte der Player nicht nach 32 Bit FP konvertieren koennen? Ein hoerbarer Verlust ist da ja nicht zu befuerchten.

  • Also beim Hifiberryforum kann ich dir nicht helfen, das kenne ich nicht, aber dein Problem wird langsam interessant "Unable to install hw params:…" und das obwohl Alsa mit "plughw:…" für alle notwendigen Konvertierungen sorgen sollte…


    Interessanterweise findet man die Meldung im Netz hauptsächlich im Zusammenhang mit WAV-Dateien, die in einem Format vorliegen mit dem aplay oder die Soundkartentreiber nichts anfangen können.
    Ich würde also zuerst einmal eine "garantiert normale" WAV-Datei testen — immerhin ist WAVE nur ein Containerformat, das theoretisch sogar mp3 enthalten könnte und das Sampleformat S24_3LE bei deiner Datei ist mir komplett neu (hier gibt es unter Ubuntu auch merkwürdige und offensichtlich ungelöste Probleme mit S24_3LE während das normale S24_LE funktioniert) und zum Teil kann ich das Problem jetzt beim Testen sogar auf meinem PC nachvollziehen, auch wenn mir gar nicht klar ist, worum es bei diesem 3er genau geht...

    Das hier sollte jedenfalls funktionieren:

    Code
    $ aplay -D plughw:0 /usr/share/sounds/alsa/Front_Left.wav


    Der Vollständigkeit halber wäre es interessant was bei diesen beiden Befehlen herauskommt, obwohl ich es mir eh vorstellen kann:

    Code
    $ file /media/AUDIO_128GB/Konzert_Durufle/Durufle_24bit_48kHz_4_PieJesu.wav
    $ sox -i /media/AUDIO_128GB/Konzert_Durufle/Durufle_24bit_48kHz_4_PieJesu.wav


    (das Paket sox musst du gegebenenfalls erst installieren) und dann zum Testen


    Nach dem Konvertieren sollte sich die Datei rbrnfalls mit aplay abspielen lassen und das sogar ohne plug

    Code
    $ sox /media/AUDIO_128GB/Konzert_Durufle/Durufle_24bit_48kHz_4_PieJesu.wav -r 48000 -c 2 -L -b 32 -e signed-integer -t wav /eine/neue/testdatei.wav
    $ aplay -D hw:0 /eine/neue/testdatei.wav


    Dauerlösung ist das eben keine, aber wenn es dir nur um das Abspielen auf der Kommandozeile geht, dann ist vielleicht wieder das Paket sox sehr praktisch, weil das auch einen Befehl play mitbringt, der 24-Bit-Dateien zum Abspielen auf 32 Bit aufblasen sollte, wenn alles zusammenpasst:

    Code
    $ AUDIODEV=hw:0 play /media/AUDIO_128GB/Konzert_Durufle/Durufle_24bit_48kHz_4_PieJesu.wav


    was wie gesagt auch funktionieren sollte und das sogar - wie bereits erwähnt - verlässlicher ist den Namen der Soundkarte anzugeben

    Code
    $ AUDIODEV=hw:sndrpihifiberry play /media/AUDIO_128GB/Konzert_Durufle/Durufle_24bit_48kHz_4_PieJesu.wav


    Meine Meinung über die (Un)notwendigkeit von mehr als 16 Bit (beim Abspielen) werde ich mir an dieser Stelle ausnahmsweise :) verkneifen — im Gegensatz zu unnotwendig hohen Sampleraten schaden sie wenigstens nicht, aber vielleicht interessiert es dich noch, dass ich bei meiner Suche auf den Grund gestossen bin, aus dem hifiberry die 24 Bit nicht mehr (!) unterstützt:
    Offensichtlich hat es mit 24 Bit Probleme bei xbmc/kodi gegeben und daher haben sich die Entwickler der Treiber dafür entschieden 24 Bit im Treiber zu deaktivieren. (Vielleicht hat es zu viele Supportanfragen gegeben ;))

    Einmal editiert, zuletzt von smutbert (7. März 2016 um 23:23)

  • Hallo,
    jetzt ist es schon spät, morgen werde ich das mal ausprobieren. 24bit bringen durchaus ein wenig, wenn man auch in 24bit aufgenommen hat. Obige Sounddatei habe ich selbst mit einem Digitalrecorder von Tascam bei einem Konzert aufgenommen (mit Zustimmung der Musiker ;-)) die habe ich dann auch auf 16bit heruntergerechnet für eine CD. Fazit ist, daß die CD doch ein klein wenig mehr rauscht, man kann das auch hören, weil ich die Aufnahme völlig ohne Dynamikkompression gemacht habe, die Originaldynamik ist unverändert hoch geblieben. Eine entsprechende Anlage zum Abspielen ist auch vorhanden, kein "High-End" Voodoo, sondern Profigeräte und selbstentwickelte Aktivboxen, die wie Abhörmonitore konzipiert sind. Mit ca. 700W auf 30m² ist die Dynamik auch hoch genug, daß die 96db von 16bit Audio nicht mehr ganz ausreichen. Es gibt aber genug Musik, bei der man den Unterschied nie hören würde, da deren Dynamik viel zu klein ist...

    Gruß
    Andy

  • Hallo,
    soweit ich das googeln konnte, hat S24_3LE 3 Bytes pro Sample und Kanal, S24_LE dagegen 4 Byte. Also 32 Bit mit 8 _Nullen als LSBs. Dann sind die Dateien aber 33% größer... Ich könnte evtl. solche WAV-Dateien erstellen. Über Google fang ich im HifiBerry-Forum folgendes:

    https://support.hifiberry.com/hc/en-us/commu…4-bit-playback-

    Ich habe auch den MPlayer installiert und bekomme genau dieselbe Meldung, er spielt die Datei aber wenigstens mit 16 Bit ab. Den dortigen Vorschlag mit -format s32le werde ich auch mal versuchen, es wäre ja am einfachsten, wenn der Player aus den 24 Bit 32 macht und die abschickt, das soll ja wieder funktionieren. Der SP/DIF-und Toslink-Treiber macht da ja ohnehin wieder 24 Bit, mehr geht da ja nicht.

    20Bit wären für Wiedergabe auf hochwertigen Anlagen auch schon genug, da liegt auch die Grenze, die man mit der Analogtechnik der Wandler und der Elektronik dahinter maximal erreichen kann (120dB). 24 Bit ist eben das nächsthöhere Format und in der Produktion und beim Abmischen ist diese Reserve sinnvoll.

    Gruß

  • Dann sind wir ja eh einer Meinung.

    Hier steht das noch einmal mit der fehlenden 24-Bit Unterstützung:
    https://support.hifiberry.com/hc/en-us/commu…rch-not-working


    vielleicht ist mein voriger Beitrag ja etwas zu konfus, aber die simple Lösung besteht im Kommando play von sox. Das macht genau das was du willst, zumindest auf meiner Hardware. Einen Hifiberry habe ich zwar nicht, aber mein Onboardsound kann ebenfalls nur 16 und 32 Bit wiedergeben und mit Audacity habe ich es ebenfalls zu einer S24_3LE-Testdatei geschafft. Abspielen funktioniert mit (du musst PCH durch 0 oder sndrpihifiberry ersetzen!)

    Code
    $ AUDIODEV=hw:PCH play test.wav


    wie am Schnürchen.


    Aussehen tut das dann so


    und das hier ist der Beweis, dass nicht auf 16 Bit gekürzt wurde

    Code
    $ cat /proc/asound/card1/pcm0p/sub0/hw_params 
    access: RW_INTERLEAVED
    format: S32_LE
    subformat: STD
    channels: 2
    rate: 44100 (44100/1)
    period_size: 1024
    buffer_size: 8192


    (Der Pfad /proc/asound/card1/pcm0p/sub0/hw_params lautet bei dir natürlich wieder anders, vermutlich /proc/asound/card0/pcm0p/sub0/hw_params aber es gibt auch Soundkarten/Treiber, die diese Information überhaupt nicht zur Verfügung stellen)

    Einmal editiert, zuletzt von smutbert (8. März 2016 um 09:49)

  • Hallo,
    ein erster Test mit mplayer -format s32le hat bei mir schon funktioniert, er spielt die als 32bit ab, inzwischen bekomme ich den auch von meiner eigenen Anwendung nebenher gestartet. Die Sache mit sox werde ich wohl auch noch ausprobieren, wenn es nicht klappt, bleibt es beim mplayer. Auf jeden Fall habe ich jetzt eine funktionierende Lösung.

    Gruß
    Andy

  • Hallo,
    jetzt habe ich auch sox installiert und es funktioniert ebenfalls wie angegeben - wenn ich das in die Konsole eintippe. Von meinem Programm aus bekomme ich das mit execlp nicht gestartet, etwa wie:

    execlp("AUDIODEF=hw:0", "AUDIODEF=hw:0", "play", "/media/.../irgendeinfile.wav", NULL);

    Mit mplayer funktioniert es:

    execlp("mplayer", "mplayer", "-format", "s32le", "/media/.../irgendeinfile.wav", NULL);

    Allerdings ist AUDIOPLAY auch offensichtlich kein Programm mit Parametern, sondern etwas anderes, was man so mit execlp nicht starten kann. Weiß jemand, wie man das aus einem C-Programm heraus starten kann (das execlp() steht bei mir in einem fork, so daß mein Programm weiter läuft)? Mit "sox AUDIODEF=hw:0 ..." geht es jedenfalls nicht, Mir ist nicht klar, warum die Eingabezeile mit AUDIODEF=hw:0... überhaupt funktioniert, das scheint kein ausführbares Programm zu sein.

    Gruß

  • Du hast recht AUDIODEV=… ist kein Befehl oder Programm, sondern damit setzt man in der Shell vor dem Ausführen des darauf folgenden Befehls die Umgebungsvariable. play/sox wertet die dann aus und verwendet dementsprechend die richtige Soundkarte. (ich weiß nicht wie/ob man bei sox die Soundkarte mit Optionen auswählen kann)

    Jetzt habe ich nicht die geringste Ahnung wie man das in C macht, aber man kann es in der Shell mithilfe eines richtigen Befehls schreiben

    Code
    $ env AUDIODEV=hw:PCH play /media/…/irgendeinfile.wav


    dann wird env ausgeführt, das die Variable setzt und wiederum sox/play startet.

    Vielleicht funktioniert es auch vor dem Starten des C-Programmes die Variable in der Shell zu setzen und zu exportieren (auch für subshells zu setzen)

    Code
    $ export AUDIODEV=hw:PCH
    $ play /media/…/irgendeinfile.wav [oder dein C-Programm?]

    _____

    Noch einfacher wäre es vielleicht, wenn du verraten hättest was du eigentlich vor hast :)

    Es ist ja nicht so, dass man nicht in Alsa generell eine Soundkarte zum Default machen könnte, damit ersparst du dir die Optionen oder Umgebungsvariablen.
    Mit einer selbst angelegten /etc/asound.conf mit dem Inhalt

    Code
    pcm.!default {
       type hw
       card sndrpihifiberry
    }
    
    
    ctl.!default {
       type hw
       card sndrpihifiberry
    }


    sollte die Ausgabe aller Anwendungen, denen du nicht explizit etwas anderes sagst, direkt und ohne Resampling und dergleichen bei dem Hifiberry-Ding landen.
    Gleichzeitig hat das aber auch den Nachteil, dass du mit allen Anwendungen nur von Hardware/Treiber unterstützte Formate abspielen kannst (außer die Anwendung sebst konvertiert, wie zB sox/play und offensichtlich mplayer) und dass nicht die Ausgaben mehrerer Anwendungen gemischt werden können.

  • Hallo,
    ich habe später noch herausbekommen, daß play der auszuführende Befehl ist und lediglich "play /media/..." ausprobiert und es funktionierte so dann auch. Die Statusabfrage in /proc/asound/card0/pcm0p/sub0/hw_params (während das Soundfile abgespielt wird) zeigt auch dann noch, daß 32bit übertragen wurden. Also ist die Umgebungsvariable wohl schon gesetzt, funktionierte auch nach einem Reboot noch. Aber ich werde auch noch die Datei /etc/asound.conf anlegen, kann sein, daß in dem Image von HifiBerry das schon gemacht wurde (in den Anleitungen von HifiBerry stand das naämlich auch irgendwo)... Heute Abend werde ich mal gucken.

    Es sind nur wav-Files, die abgespielt werden sollen, denn der Raspi ist der Controller für einen 8-Kanal digitalen Vorverstärker für mein Heimkino. Der ist dann auch gleich die Heimkinozentrale mit Universalfernbedienung (mit Funkverbindung, Touchscreen und optischem Drehgeber für Lautstärke usw.) für alle Geräte. Die digitale Soundverarbeitung werden FPGAs übernehmen, der Raspi liefert nur die Parameter dafür, ebenso kontrolliert er die sonstige Hardware. Da liegt ein imtegrierter Audioplayer auf der Hand, MP3 und andere verlustbehaftete komprimierte Formate kommen qualitätsmäßig nicht in Frage. Und für lossless wie z.B. FLAC lohnt es sich nicht sooo sehr, bringt nur knapp Faktor 2 und ich müße alle Soundfiles erst einmal dahin umcodieren. Abgespielt wird von externen USB-Speichern (es gibt einen USB-Hub mit eigener 5V-Versorgung), schon der 128GB-Stick reicht sehr lange, ansonsten gibt es auch handliche 1TB USB-Festplatten...

    Schade, daß nur Stereowiedergabe mit PCM geht, für 5.1 bräuchte ich 3 I²S-Ausgänge parallel, die hat der Raspi nicht. Das reicht aber auch, fast alle Musik ist ja Stereo. Für Surround werde ich später vielleicht mal ein anderes Gerät machen, das dann über 3 SP/DIF-Anschlüsse an den Vrverstärker angeschlossen ist (kann auch ein PC mit entaprechender Soundkarte sein, für Videoschnitt usw.).

    Gruß
    Andy

  • Du machst ja etwas ganz ähnliches wie ich, nur dass ich mich komplett auf Audio beschränke. flac ist mir aber aus vielen Gründen lieber als wav:

    • Halber Speicherplatzbedarf (meistens tendentiell sogar etwas weniger) ist imho ein nicht zu vernachlässigender Vorteil. Beim Raspberry zB auch weil sich alle Datenübertragungen einen Bus teilen müssen und wenn dann von USB/Netzwerk nur die halbe Datenrate daherkommt, verschafft das Spielraum. Der Rechenaufwand beim Dekodieren von flac spielt ja auch auf einem Raspberry keine wirklich große Rolle.
    • Es enthält eine Prüfsumme über die (dekodierten/unkomprimierten) Audiodaten. So lässt sich jederzeit die Integrität des Audioteils der flac-Dateien (nicht die Metadaten/Tags) überprüfen.
    • flac-Dateien lassen sich bequem taggen und das Format wird von sehr vielen Abspielern unterstützt.

    ________

    Momentan profitierst du davon, dass (laut »aplay -l«) der hifiberry die einzige Soundkarte und daher auch ohne Konfiguration der Default ist. aber das kann sich ändern. Immerhin sollte da ja normalerweise auch irgendwo der HDMI-Ausgang und der analoge Ausgang des Raspberry auftauchen, möglicherweise sind die Module dafür geblacklistet oä — jedenfalls könnte sich das mit einem neuen Image oder Kernel ändern.
    Mit der asound.conf oder gesetzten Umgebungsvariablen musst du also bei Änderungen vielleicht weniger lang nach dem Fehler suchen, wenn es plötzlich nicht mehr funktioniert.

    Das andere ist, dass in der Standardkonfiguration von Alsa der Ton auch noch einige Alsa-Plugins durchläuft, zB das dmix-Plugin, das, wenn es nicht anders konfiguriert wird, die Ausgaben mehrerer Anwendungen mit einer Samplerate von 48 kHz mischt → das Audiomaterial wird also uU geresampelt.

    Das gilt allerdings wieder für die normalem Linuxdistributionen, bei einem Image von Hifiberry kann das bereits anders konfiguriert sein...

  • Hallo,
    das Image von HifiBerry hat das offensichtlich schon alles gemacht. Das asound.conf war jedenfalls schon da, da steht nur "type hw card 0" stattdessen drin, das scheint ebenso zu passen. Das erklärt, warum der Aufruf von play auch gleich glückte.

    WAV bevorzuge ich, weil ich auch eigene Programme geschrieben habe, die WAV lesen und schreiben (reine C-Programme, in das Windows Betriebssystem will ich mich nicht einarbeiten, das würde Monate dauern...), z.B. zum generieren von Testsignalen oder auch einen Surroundmischer, da Videoschnittprogramme so etwas nicht oder nur unbrauchbar haben. Klangliche Gründe gibt es jedenfalls nicht, Hifiesoteriker hören da sicher Unterschiede, auch wenn bitgenau das gleiche zum DAC geht ;) Große sonstige Aktivitäten über USB gibt es nicht, Netzwerk ist gar nicht angeschlossen. Yußer dem Audioplayer läuft sondt nur mein eigenes Programm.

    Gruß
    Andy

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!