Audio devices im OE 2.0 ?

  • Hi !


    Wo sind eigentlich im OE 2.0 die Standard Audio device Files /dev/audio und oder /dev/dsp hingekommen ?


    Das audio0 im /dev/dvb/adapter0 kann man nicht verwenden, selbst bei gestopptem enigma2 sagt er device is beschäftigt wenn man ein audio file drauf schreiben will.


    Hintergrund ist das ich derzeit eine text2speech engine auf der Dreambox teste, fertige wav files die sie erstellt abspielen mit enigma2 geht prima, aber wenn die text2 spech engine diese noch erstellt und ich starte das Abspielen bevor das file fertig ist wird es nur bis zu dem Zeitpunkt abgespielt wo das file schon erstellt wurde, und da man in wav/mp3 nicht spulen kann komme ich über das falsche Ende nicht sauber hinweg.


    Wegen der schwachen Broadcom CPUs ist die tex2speech Engine nur ungefähr 2x so schnell wie das Vorlesen im Erstellen des wav files und das dauert dann einfach zu lange wenn es längere Texte wie EPG infos sind um drauf zu warten bis die fertig sind.


    Das direkte Schreiben ins ALSA device File wäre daher meines Erachtens die einzige Lösung, um das wav file bereits während es erstellt wird abzuspielen. Mit OE 1.6 hat das noch funktioniert audio files so abzuspielen (da habe ich mit diversen mp3 player binaries herumgespielt).


    Bitte um Aufklärung wie und ob das im OE 2.0 gelöst ist.


    LG
    gutemine

    • Offizieller Beitrag

    Hi,


    hmm /dev/dspX müsste OSS gewesen sein. Also der alte Linux Standard für audio (PCM) devices.


    Der Nachfolger ist ALSA.. und die alsa devices sind vorhanden.. die sind in /dev/snd .. also das pcm device.


    Imho gibts aber auch einen OSS compatibility layer der ist als kernel module gebaut.. und ist default nicht auf der Box..


    Müsste man aber nachinstallieren können. Dann sollte es wieder /dev/dspX geben.


    Allerdings keine Ahnung ob das auch funktioniert.


    cu

  • Danke für die Suchhilfe.


    Das müsste dann das kernel-module-snd-mixer-oss ipk von www.dreamboxupdate.com sein ?


    Ja, das kann man installieren und mit modprobe auch laden, /dev/dsp* gibt es dann aber auch keine.


    Aber das Testbinary ist eh gegen die alsa library gelinked, daher sollte es auch ohne OSS compatibility gehen.


    Der Tipp mit dem /dev/snd Pfad hat mir aber schon geholfen, jetzt spielt das binary endlich was ab.


    ABER nach ungefähr einer Zeile Text ist schluss und die Schallplatte bleibt hängen:-(


    Das sind die Fehler die das binary (bzw. die alsa lib) ausgiebt:


    LSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.front
    ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
    ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
    ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
    ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround40
    ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround41
    ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround50
    ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround51
    ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.surround71
    ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.iec958
    ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.iec958
    ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.iec958
    ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi
    ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi
    ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem
    ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem
    ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline
    ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline
    ALSA lib pcm_dmix.c:957:(snd_pcm_dmix_open) The dmix plugin supports only playback stream
    ALSA lib pcm_direct.c:877:(snd1_pcm_direct_initialize_slave) slave plugin does not support mmap interleaved or mmap noninterleaved access
    ALSA lib pcm_dmix.c:1030:(snd_pcm_dmix_open) unable to initialize slave


    Sollte doch eigentlich klein Problem sein, weil ich ja eh nur playback streamen will.


    Aber dann bleibt das sound device nach einem Satz hängen wie eine alte hängende Schallplatte und sprich immer die letzte Silbe nochmals statt den Rest auszugeben.


    dmesg zeigt mir aber keine Fehlermeldung :frowning_face:


    [ 885.159000] bcm_pcm_playback_open
    [ 885.164000] bcm_pcm_playback_close
    [ 885.184000] bcm_pcm_playback_open
    [ 885.196000] bcm_pcm_playback_close
    [ 885.211000] bcm_pcm_playback_open
    [ 885.223000] bcm_pcm_playback_close
    [ 885.242000] bcm_pcm_playback_open
    [ 885.247000] bcm_pcm_playback_close
    [ 885.258000] bcm_pcm_playback_open
    [ 885.270000] bcm_pcm_hw_params 32768
    [ 885.274000] bcm_pcm_playback_prepare 16000
    [ 885.278000] bcm_pcm_rate_set(16000)
    [ 885.285000] bcm_pcm_playback_prepare 16000
    [ 885.289000] bcm_pcm_rate_set(16000)
    [ 885.294000] play
    [ 888.934000] bcm_pcm_playback_close
    [ 888.934000] stop


    Wenn ich den selben text in ein wav file schreiben lasse geht das anstandslos vom enigma2 abspielen sofern das wav file bereits komplett geschrieben wurde.


    Irgendwo scheint da ein buffer vollgeschrieben zu werden und dann ist es vorbei mit der Ausgabe.


    Ziemlich ärgerlich, weil jetzt habe ich eine kommerzielle Text 2 Speech Engine die aus jedem Text auf der Dreambox (Menus, EPG,..) mit sehr guter Stimme und Qualität (kein Vergleich mit dem espak Open Source Sachen die ich vorher verwendet hatte) den Output produziert und das mit nur 15-45MB Memory und erträglichem CPU Verbrauch und ich kann das Ergebnis leider nicht ausgeben ohne warten zu müssen bis der gesamte Text konvertiert ist was für die User einfach zu lange dauert.


    Damit habe ich praktisch das selbe Verhalten wie wenn ich das wav file bereits während es von der text2speech engine geschrieben wird dem enigma2 zum abspielen gebe, sobald im File beim Abspielen der Punkt erreicht wird bei dem das File gestartet/geöffnet wurde kommt EOF und das Abspielen stoppt obwohl das file längst weiter geschrieben wurde - sprich ich kann in beiden Varianten nur ein paar Worte abspielen bevor es wieder vorbei ist


    Eine der beiden Ansätze müsste doch zum Laufen zu bringen sein, normale Aufnahmen werden ja auch abgespielt wenn sie noch laufen ???


    Könnte sich das bitte wer ansehen warum das PCM device dieses komische Verhalten zeigt oder das Abspielen von wav dateien die weiter wachsen nicht durchläuft, oder mir mit weiteren Tipps helfen es zum Laufen zu bringen, weil am Linux PC geht das anstandslos mit dem Audio device, sonst hätte ich die Portierung der Text2speech Engine auf die Broadcom CPU gar nicht erst in Auftrag gegeben.


    LG
    gutemine


    PS: Details zur sprechenden Dreambox gerne auch per PM.


    PPS: Habe noch ein bisschen getestet, der Alsa Output funktioniert sogar bei laufendem enigma2 während der TV Ton läuft, Respekt, wenn der Output daher länger als die paar Sekunden funktionieren würde wäre ich schon ziemlich happy. Noch ein kleiner input zum Problem: Breche ich wenn das alsa output testbinary im Schallplattenmodus ist dieses mit CTRL+C ab so ist dann auch der TV Ton vom enigma2 weg, und zwar solange bis ich das binary wieder starte oder auf anderen Sender zappe.

    11 Mal editiert, zuletzt von Lost in Translation ()

  • Noch ein kleiner update - kann es sein dass das enigma2 beim starten eines wav files die Größe aus dem header liest und dann gnadenlos wenn die erreicht wird ein EOF auslöst ?


    Das würde erklären das obwohl der header am schluss nochmals mit der finalen Größe geschrieben wird das enigma2 diese info ignoriert.


    Und statt einem EOF löst das dann wenn das wav file ins streaming device geschrieben wird den komischen hängenden Schallplatteneffekt aus ?


    Weil die text2 speech engine buffert erst ein paar Worte die erkannt und konvertiert wurden bevor es beginnt sein wav file zu schreiben und auf dem alsa device dürfte es genauso funkltionieren, und es könnte daher sein das diese Latenzzeit bevor mit dem Schreiben begonnen wird ca. dem einen Satz entspricht der noch sauber gesprochen wird bevor es 'hängt' ?


    Nur dann müsste man das wahrscheinlich im Treiber fixen bzw. im closed source enigma2 für das wav abspielen eines weiter wachsenden files :frowning_face:


    Womit wir dann aber wieder beim Bitte helfen wären, weil beides außerhalb meiner Möglichkeiten liegt.

    Einmal editiert, zuletzt von Lost in Translation ()

  • Dass du eine Lizenz Zahlen muss wenn du sie benutzen willst und dir so wie ich einen SDK kaufen musst wenn du was damit entwickeln willst.


    Nachdem die sprechende Dreambox aber für Blinde und sehschwache User gedacht ist reden wir hier über einen eher minimalen Betrag wo du dir beim Anbieter der Engine kostenpflichtig das Lizenzfile holen musst, so wie am PC auch wenn du die Engine dort zur Sprachausgabe benutzt.


    Das Plugin und der Skinn selbst werden aber der GPL unterliegen und quelloffen sein, sowie die fixen mp3 files die ich für die statischen Sachen wie Menus und Messages benutze der CC Lizenz, können also auch frei für nicht kommerzielle Sachen benutzt werden.

    2 Mal editiert, zuletzt von Lost in Translation ()

  • Nachdem kein weiterer Input gekommen ist habe ich ein bisschen weiter geforscht, indem ich mir erlaubt habe bevor ich das wav file dem enigma2 zum Abspielen übergebe im wav file Header die chunk size mit FFFF zu befüllen:


    fileIn = open(cp_wave, 'r+')
    bufHeader = fileIn.read(4)
    fileIn.write("FFFF")
    fileIn.close()


    Wenn man dann den Header des wav files ausliest wird es als ziemlich groß angezeigt :smiling_face:


    Trotzdem bleibt enigma2 an der Stelle stehen wo mit dem Abspielen begonnen wurde, obwohl das File dann noch weiterwächst, die filesize wird also scheinbar beim starten des files mit stat geholt und nicht aus dem Header und es bringt daher leider auch nichts beim Header zu lügen um es zur Gänze abgespielt zu bekommen :frowning_face:

  • Versuch mal das Programm aplay aus alsa zu übersetzen. Das verwendet das alsa-Interface und spielt wave files ab. Wenn aplay in der Lage ist längere wav files abzuspielen,
    kannst Du aplay so modifizieren, wie Du es brauchst.

  • Danke für den Vorschlag, aber du hast meine Problemmeldung nicht verstanden. Ich habe 0 probleme fertige wav files abzuspielen, weder mit enigma2 und jetzt nach Ghost's Tipp auch nicht mehr mit dem alsa interface. NUR wenn ich aufs alsa interface schreibe während das wav file noch weitergeschrieben wird tritt das Problem auf, und genauso wenn ich via enigma2 so ein weiterwachsendes File abspielen will. Insofern hilft mir aplay als standalone binary nicht das Problem zu lösen, weil es genauso wunderbar (nur) fertige wav files abspielen wird.


    PS: Im Debian gibt es im alsa-utils Paket ein fertiges aplay, da muss ich mir nicht die Arbeit machen es zu compilieren, aber wie gesagt das löst nicht das Problem.

    4 Mal editiert, zuletzt von Lost in Translation ()

    • Offizieller Beitrag

    Hi,


    hmm und du scheinst auch nicht verstanden zu haben :winking_face:


    Also das ALSA device will einfach nur PCM daten haben. WAV ist ja nur ein Container...


    Naja und egal welcher Player.. die werden alle den WAV Header nur einmal lesen.


    Also wäre die richtigere alternative die, dass du das Alsa device selber konfigurierst, und die PCM Daten dann selber da rein schreibst.. immer wenn du welche hast.


    Anders wird das nicht funktionieren.


    Einen Nachteil ander ganzen Geschichte hab ich aber noch nicht erwähnt.. Bzw.. das ist technisch nicht anders möglich. Wenn man AC3 native ausgibt.. dann wird kein PCM abgespielt. Kann ja auch nicht gehen. Denn das Endgerät, was dann ggf. am SPDIF oder HDMI Ausgang hängt erwartet dann ja AC3 daten. Sprich eine parallele PCM Ausgabe zum laufenden TV ist über ALSA nur möglich wenn Entweder ein Sender geschaut wird mit normalem MPEG Ton.. oder aber bei AC3 der Downmix eingeschaltet ist.


    cu

  • Danke für die Warnung was die ac3 Ausgabe angeht, weil viele der Blinden sind (zwangsweise) Audio Fanatiker und haben entsprechende Ausgabegeräte die sie auch über die Dreambox nutzen wollen.


    Ich versuche ja zu verstehen warum das nicht geht über das alsa Interface einen längeren PCM stream reinzuschreiben :frowning_face:


    Sobald is den Text "eins zwei drei vier fünf" reinschreibe bleibt es bei vier hängen und wiederholt das bis ins unendliche. Mache ich das nur bis drei kann ich mein Testprogramm praktisch unbegrenzt oft laufen lassen.


    Lasse ich daraus ein wav file erstellen kann ich es mit enigma2 (und auch mit mit dem aplay binary, gerade ausprobiert) problemlos bis zum Ende lesen lassen.


    Auch wenn ich ein cat *.wav | aplay mache list es brav zuende, es liegt also nicht daran ob die Daten kontinuierlich geschrieben werden oder das fertige file gelesen.


    Wenn ich jetzt deswegen den Text in einzelne wav files für jedes Wort zerteile und einzeln abspiele hört sich das aber total abgehackt an, das kann doch nicht die Lösung sein.


    Scheinbar bin ich zu blöde zu erkennen was ich falsch mache :frowning_face:

    • Offizieller Beitrag

    Hi,


    also hmm ich hab gerade nur mal grob gelesen.. also es scheint so, als geht das einfach so nicht. Also wenn ein alsa (pcm) device offen ist.. und im playstate.. dann müssen da kontinuierlich auch daten geschrieben werden. Ansonsten kommt es zu diesen Effekten.


    Sprich wenn du gerade keine richtigen daten hast die du ins device schreiben kannst.. dann könntest Du einfach "still frames" schreiben.. solange bis wieder etwas da ist.. also sollten wohl einfach 00en sein .. immer ein frame lang. Das kannste ja ausrechnen.


    cu

  • OK, das erklärt aber auch nicht ganz was ich gerade ausprobiert habe, nämlich die gesprochenen einzeln schreiben lassen, das geht auch nur bis 6 und dann hängt es wieder.


    Die Jungs von der Sprachengine haben sich ziemlich angestrengt das so hinzukriegen dass die Engine schneller als das Vorlesen ist, es sollte also nie passieren das der PCM Buffer leerläuft, sondern eher andersrum der läuft scheinbar voll nach ein paar Sekunden und dann entsteht das komische Verhalten :frowning_face: Ich müsste mir jetzt mühsam die worte einzeln in wav files schreiben und das nächste immer erst abspielen wenn das vorherige einen EOF Event ausgelöst bekommt, und das alles nur weil enigma2 nicht einfach ein wav file das noch wächst weiter abspielt.


    Aber machen wir mal nur zu Sicherheit einen Schritt zurück, im Moment spiele ich die files so ab wenn sie fertig sind:


    speak_ref = eServiceReference(4097, 0, wavfile)
    self.session.nav.playService(speak_ref)


    Könnte man nicht statt 4097 eine id machen die wav files wie ts files einfach vom Anfang bis ende durchspielt und damit weiterläuft wenn sie noch wachsen ?


    Weil selbst wenn wir das alsa davice zum laufen kriegen ist das sehr mühsam zu synchronisieren mit dem TV output und das AC3 Problem wäre auch ungelöst, insofern wäre es mir schon lieber sauber mit enigma2 abzuspielen, schon weil die Sprachengine eventgesteuert feuern kann sobald es das erste wort umgewandlet hat und ich müsste in den Eventhandler nur obigen code machen so wie es jetzt ist.

    Einmal editiert, zuletzt von Lost in Translation ()

    • Offizieller Beitrag

    Hi,


    e2 benutzt aber gstreamer zum abspielen.. dann müsstest Du gstreamer patchen...


    Und hmm dann wiederrum gibts auch noch einen Unterschied.. wenn du über e2 (gstreamer) wav abspielst.. dann wird nicht zwangsläufig dort ALSA benutzt.


    Unser audiodecoder kann auch synchronized PCM.. das läuft aber dann anders.. also nicht über ALSA.. das wiederrum geht aber nicht parallel zum normalen TV Ton.


    Also so wird das nichts werden :winking_face:


    cu

  • Den TV Ton muss ich letzendlich sowieso abdrehen während der Audioausgabe, nichts ist für einen Blinden User lästiger als wenn 2 Leute gleichzeitig reden. Da hat mich nur interessiert ob es auch so funktioniert. Im Moment macht das Plugin immer brav einen stop der aktuellen serviceref, spielt das wav file ab und startet dann wieder was vorher gelaufen ist. Es ist halt bei langen texten wie der EPG Beschreibung nur nicht akzeptabel so lange zu warten bis das wav file fertig ist, weswegen eben die Suche nach Alternativen (alsa,...) losging wo man sofort Ton kriegen könnte während die Text2Seppech engine noch brav weiterarbeitet.


    Synchronzed PCM heisst wohl das das write ins device file erst dann weitergeht wenn das geschrieben auch ausgegeben wurde ?


    Aber das Plugin soll möglichst simpel bleiben, wenn ich auch noch eigene Soundroutinen und soundhandling machen muss sprengt es eigentlich schon den Rahmen - Dr. Best hat sich zwar auch eigene lib/so gemacht weil Ihm Sachen beim MP3 abspielen abgegangen sind (wie spulen, fehlende Anfänge der Files,...) nur so weit mag ich eigentlich nicht gehen.


    Insofern gehen mir langsam die Ideen aus - was eigentlich schade ist, weil so viel scheint da nicht zu fehlen.


    Und Ihr wisst wie gerne ich ein 'geht nicht' höre :smiling_face:

  • @gutemine Klasse Sache was du da vor hast da kann ich nur sagen Daumen Hoch habe auch einen Bekannten der so gut wie nichts sieht und für den wäre ein Sprachausgabe genau das Richtige


    vieleicht ist ja mittlerweile eine Lösung gefunden worden ist ja mittlerweile eine Zeit vergangen.


    mfg. August

  • Ja, aber sie funktioniert nicht so wie ich es gerne hätte :loudly_crying_face:

  • gutemine schlug vor:
    >im wav file Header die chunk size mit FFFF zu befüllen
    >fileIn.write("FFFF")
    Das reicht bestimmt nicht. Ein wav, also ein RIFF oder AIFF ist mehrfach geschachtelt, die Chunks haben jeweils nochmal Längenangaben. Außerdem könntest Du mit solch einem faulen Trick Abstürze produzieren; die Methode erinnert an Hacker-Angriffe durch manipulierte Größenangaben in Bilddateien, um Schadcode einzuschleusen :smiling_face_with_horns:


    Solltest Du das trotzdem weiter verfolgen wollen, vergleiche mal die 4 Byte nach "RIFF" mit den 4 nach "data" im .wav...


    >die Schallplatte bleibt hängen
    Was Du erlebst ist ganz normales Verhalten... ALSA arbeitet mit Puffern fester Größe (je nach HW, i. d. R. kleiner als 1 Sekunde) und wenn das Abtasten des PCM-Puffers am Ende angekommen ist, geht's wieder von vorne los. Das ist Deine Schallplatte :grinning_face_with_smiling_eyes:


    >Auch wenn ich ein cat *.wav | aplay mache list es brav zuende
    aplay füttert die PCM-Puffer mit der im wav-Header angegebenen (oder von ALSA verlangten?) Geschwindigkeit, so dass Musik ausgegeben werden kann, die nicht in den Puffer passt. Das 1x1 des Streaming.


    Ich meine, eine saubere Lösung sollte weg von Abspielen unfertiger wav Dateien kommen, hin zu dem, was hier das eigentliche Problem ist, nämlich Streamen. Die Dreambox beinhaltet ja gstreamer, also sollte das prinzipiell gehen. Nur leider bin ich zu neu hier, um mit den Feinheiten von "closed source enigma2" vertraut zu sein oder um zu wissen, wie man gstreamer in enigma ansteuert. Grundsätzlich bieten alle Streaming-API an, außer dem Abspielen fertiger Dateien (der eher langweilige Fall) das Abspielen dynamisch erzeugter Samples als source, egal ob sie über Antenne oder text2speech kamen, mittels Callbacks o. ä. durchzuführen. Stehen die dem Python-Code in enigma nicht zur Verfügung?


    Mir ist nicht klar geworden, ob Du zwecks Integration gstreamer brauchst. Du könntest auch ALSA per Callbacks mit PCM füttern. Was für Ausgabemöglichkeiten hat text2speech denn überhaupt?

  • Wenn du im enigma2 abspielen willst musst du halt gstreamer verwenden sonst bleibt nur ein externes binary wo do dann die synchrionisationsproblematik hast.


    Dr. Best hat mir gezeigt wie man das Wav weiter abspielen kann (im Prinzip stop and Go, also wenn man zum Ende kommt welches beim Starten das Ende war einfach abspielen neustarten und sofort zum alten Ende springen, das geht bis auf ein kleines Ruckeln leicht zu lösen, wird dir aber beim Streamen nichts helfen.

  • Hallo,


    gibt es zu diesem Thema noch Bestrebungen? Ich selbst bin blind, habe eine VUDuo4K und würde gern so viel wie möglich auch selbst einstellen. TV Streamen und einige Einstellungen funktionieren zwar über apps und OpenWebIf, aber die Box selbst kann ja noch viel mehr über ihr eigenes Menü