DAB+ Linux Software

Alles zum Thema DAB(+) Digitalradio.
Stefan Heimers

Re: DAB+ Linux Software

Beitrag von Stefan Heimers »

So, das Grundgerüst der Library ist erstellt, der schwierige Teil kommt aber erst noch. Bis jetzt werden noch keine ETI Frames erzeugt.

Das Projekt ist jetzt auf Github. Es enthält nur die neuen Teile, dabtools muss zusätzlich separat heruntergeladen werden. Die Verzeichnisse dabtools und libdabplus müssen im gleichen übergeordneten Verzeichnis liegen. Die Library benutzt dann direkt die Sourcefiles aus dem dabtools verzeichnis.

https://github.com/sheimers/libdabplus
Makki1

Re: DAB+ Linux Software

Beitrag von Makki1 »

Nur eine Zwischenmeldung; ich lese gerne mit und bin begeistert was sich da gerade tut!
Meine DAB-Antenne wartet leider noch auf die Montage..

Makki
Stefan Heimers

Re: DAB+ Linux Software

Beitrag von Stefan Heimers »

Eine erste Version der Library ist jetzt fertig. Das Beispielprogramm (example.cpp) schafft es auch damit dem USB Tuner ein paar ETI Frames zu entlocken, mit einer Pipe auf stdin von dablin_gtk werden aber nur Stationsnamen angezeigt, für Audio reicht es nicht.

Die aktuelle Version ist auf https://github.com/sheimers/libdabplus
Stefan Heimers

Re: DAB+ Linux Software

Beitrag von Stefan Heimers »

Nun geht's auch mit Audio, über den Umweg ./example | dablin_gtk.
Stefan Heimers

Re: DAB+ Linux Software

Beitrag von Stefan Heimers »

@Basic.Master: Nach erneuter Lektüre des Threads habe ich dich wohl falsch verstanden. Meine Library stellt eine Funktion zur Verfügung, die man aufrufen kann und dann einen ETI Frame zurück erhält.

Ich glaub Du hast es umgekehrt gemeint: Die Library soll wenn ein Frame bereit ist eine Funktion aufrufen, die dann im Client implementiert wird.

Das ist anders als in meinem Beispielprogramm, sollte aber auch gehen. Dazu brauchst Du die Vererbung der C++ Klassen. Deine C++-Klasse muss die Klasse dab2eti erben, und dann die Funktion void dab2eti::eti_callback(uint8_t* eti) "überladen", also neu implementieren und somit ersetzen.

Noch einen Mangel hat meine Library: Frequenz und Gain lassen sich noch nicht zur Laufzeit umschalten, nur bevor der erste Frame abgefragt wird. Das ist eine Kleinigkeit, das werde ich heute Abend nach Feierabend noch implementieren.
Basic.Master

Re: DAB+ Linux Software

Beitrag von Basic.Master »

Genau; sobald ein Frame fertig ist, sollte es an eine Callback-Funktion übergeben werden, die man vorher an die Lib übergeben hat. Dabei könntest du einfach noch als Bedingung festlegen, dass die Funktion schnellmöglichst wieder zurückspringt. Das hieße, dass die Callback-Funktion eigentlich nur den Frame zwischenspeichern darf und mehr nicht (wie genau sie das Frame zwischenspeichert, könnte dir dann egal sein) - die Verarbeitung der Frames muss dann in einem anderen Thread passieren. Damit kann dann die Callback-Funktion direkt von den eingebauten Demod-Thread aufgerufen werden, ohne dass du mit einer Queue die Frames puffern müsstest und über einen separaten Thread weitergibst.

Callback-Funktion wäre C-Stil, aber Vererbung ist hier in C++ wirklich eleganter, da hast du Recht. Dann kann man einfach die entsprechende Methode überschreiben (Überladen wäre der Fall, wenn man eine neue Methode mit demselben Funktionsnamen hinzufügen würde, die andere Parameter bekommt - das bringt in dem Fall hier nichts). Das Problem ist, dass eti_callback eine statische Funktion ist, aber die nicht (via virtual) überschreibbar sind - wenn ich nichts übersehen habe.

Ich habe eti_callback deswegen mal testweise von Klassen- zu Objektmethode gemacht ("static" entfernt). Jetzt bekommt init_dab_state ja eti_callback übergeben. Theoretisch bräuchte init_dab_state ab sofort noch die Info, auf welchem Objekt eti_callback aufgerufen werden soll. Normalerweise kann man in C++ an std::bind eine Funktion sowie ein Objekt übergeben, und erhält eine gebundene Funktion zurück - so dass man dieses Objekt nicht mehr extra übergeben muss. Bei mir hat das hier jetzt nicht geklappt (in anderen Fällen schon); ich weiß nicht genau warum. Vielleicht weil init_dab_state eine reine C-Funktion ist...?

Hattest du eigentlich noch etwas spezielles gemacht, damit example die Lib findet? Weil ich musste die libdabplus.so nach /usr/lib kopieren - dachte eigentlich, er sucht nach ihr auch im aktuellen Ordner (diesen testweise zu $PATH hinzuzufügen hat nicht gereicht).

Momentan besteht auch noch das Problem, dass man als Lib-Nutzer nicht weiß, ab wann exakt nach einem Frequenzwechsel die ETI-Frames nicht mehr zum alten Kanal, sondern zum neuen gehören. Das wäre sehr wichtig, damit dann z.B. nicht irgendwelche Sender eingelesen werden, die eigentlich im alten Kanal senden.
Stefan Heimers

Re: DAB+ Linux Software

Beitrag von Stefan Heimers »

Basic.Master hat geschrieben: Hattest du eigentlich noch etwas spezielles gemacht, damit example die Lib findet? Weil ich musste die libdabplus.so nach /usr/lib kopieren - dachte eigentlich, er sucht nach ihr auch im aktuellen Ordner (diesen testweise zu $PATH hinzuzufügen hat nicht gereicht).
Ich habe erst die Umgebungsvariable LD_LIBRARY_PATH auf das aktuelle Verzeichnis gesetzt, dann wird die Lib gefunden.

Das mit dem Callback scheint komplizierter, als ich dachte. Bei mir hat es nur funktioniert wenn ich eti_callback als statisch deklariert habe. Dass sich die Funktion dann nicht mehr überschreiben lässt habe ich nicht gewusst.

Heute komme ich wohl nicht mehr dazu. Falls Du eine Lösung findest kannst Du sie ja auf github pushen. Sonst schaue ich mir die Sache am Wochenende nochmal an.
Stefan Heimers

Re: DAB+ Linux Software

Beitrag von Stefan Heimers »

Die Library wurde nun so ergänzt, dass ein callback im Client implementiert und als Funktionspointer an die Library übergeben werden kann. Siehe das Beispielprogramm example2.cpp.

https://github.com/sheimers/libdabplus/ ... ample2.cpp
Basic.Master

Re: DAB+ Linux Software

Beitrag von Basic.Master »

Alles klar; jetzt bräuchte man nur noch einen Weg, den Empfang über die Lib selbst zu beenden.

In der Zwischenzeit habe ich mal die Möglichkeit umgesetzt, übergangsweise dab2eti per popen/pclose als Quelle zu nutzen. Entsprechend gibt es jetzt ein Auswahlfeld für den gewünschten Kanal. Dazu muss man den Pfad zum dab2eti-Binary als Parameter angeben (sonst bleibt das Feld grau und das alte Verhalten mit stdin bzw. Datei wird aktiv).
Einen gewünschten Startkanal kann man auch wählen; bei der Konsolenversion ist er natürlich Pflicht.
Bei der GTK-Version kann man außerdem optional diejenigen Kanäle angeben, die in der Kanalliste erscheinen sollen [weil man sie empfangen kann] - ansonsten wird die komplette Liste mit allen potentiellen DAB-Kanälen benutzt, was normalerweise wenig Sinn macht.
Stefan Heimers

Re: DAB+ Linux Software

Beitrag von Stefan Heimers »

Sehr schön, die Kanalwahl im GUI macht die Bedienung doch schon viel bequemer.

Ich habe noch festgestellt, dass bei meinem TrekStor Stick der Autogain trotz E4000 Tuner sehr schleicht funktioniert. Ich habe den Gain dann fest auf 4dB gestellt und benutze eine regelbare Zimmerantenne (Digitenne TT1), damit ist der Empfang recht gut, es gehen alle ortsüblichen Ensembles.

Bei der Library gab es noch ein paar kleine Änderungen: Die Funktion stopReceiver() beendet den Empfang. Das Beispielprogramm example2 wurde so erweitert, dass es als erstes Kommandozeilenargument entweder einen Kanal oder eine Frequenz akzeptiert. Somit funktioniert nun auch dablin_gtk -d example2 oder example2 12C | dablin_gtk.

Ich habe noch nicht herausgefunden, wie man feststellen kann, ab wann ein neuer Frame zum neuen Kanal gehört. Aber vielleicht braucht es das auch gar nicht, wenn man den Empfang mit stopReceiver() beendet, den Kanal wechselt, und dann mit startReceiver() wieder startet sollten doch alle folgenden ETI Frames zum neuen Kanal gehören.
Basic.Master

Re: DAB+ Linux Software

Beitrag von Basic.Master »

Die Alternative zu stopReceiver() + startReceiver() wäre, zwischendurch im Betrieb den internen Status irgendwie zurückzusetzen, zusammen mit einem Frequenzwechsel. Dazu müsste man wohl aber einiges im dab2eti-Code mitändern. Insofern ist der Kanalwechsel mit stopReceiver/startReceiver momentan die beste Option.

Ein bißchen problematisch ist noch, dass es kein Pendant zu init_dab_state() gibt und dann deswegen beim Kanalwechsel ein gewisses Speicherleck bleibt.
newspaperman

Re: DAB+ Linux Software

Beitrag von newspaperman »

Also mit dem R820T2 schafft dab2eti gar keinen Lock, wenn man den passenden Gain nicht manuell setzt. Bei meinem Terratec Stick mit E4000 Tuner klappt das AutoGain immerhin halbwegs.
white_gecko

Re: DAB+ Linux Software

Beitrag von white_gecko »

Ich wollte mich auch mal hier einmischen. Ich höre gerade erfolgreich mit meinem generischen RTL2832U stick mit R820T Tuner in Kombination mit dab2eti und dablin_gtk. Außerdem habe ich noch einen NOXON DAB Stick, der ja einen E4000 Tuner mit auto gain hat.
Allerdings habe ich sowohl mit dem R820T als auch dem E4000 oft Probleme einen lock zu bekommen. Aus dem Grund probiere ich dann immer etwas ziellos den gain Parameter von dab2eti aus.
Daher wollte ich auch mal zwei bis drei Sachen fragen:
  1. was genau macht der gain? So weit ich weiß ist es der Verstärker, aber warum stelle ich den dann nicht einfach auf Maximum? Kann es sein, dass das Ziel der richtig gain Einstellung ist die Rauschvarianz zu senken? So etwa wie in den drei Bildern hier: https://de.wikipedia.org/wiki/Quadratur ... nsdiagramm (4-QAM-Empfangssymbole mit additivem Gauß'schen Rauschen (AWGN) der Varianzen 0,01, 0,1 und 0,3) dargestellt? (Bitte verzeiht mir hier mein mangelhaftes Fachwissen, das ist vermutlich eine etwas plakative und dumme Frage, aber doch etwas fundamental für das gesamte Verständnis)
  2. Gäbe es eine Möglichkeit z.B. direkt von dab2eti einen Wert ausgegeben zu bekommen, der mir hilft den richtigen gain zu finden? Z.B. so was wie Empfangsbalken oder ein float wert von 0 bis 1 oder etwas ähnliches
  3. Gibt es eine Möglichkeit einen autogain software-seitig zu implementieren indem der gain in Abhängigkeit das Wertes der in 2. ausgegeben wird gesetzt wird?
Ansonsten bin ich sehr zufrieden mit der Richtung, in die die Entwicklung für Linux in dem Bereich geht :-) (Cool wäre natürlich auch noch, wenn dab2eti sub-channel filter implementiert)
Mani007

Re: DAB+ Linux Software

Beitrag von Mani007 »

Hallo zusammen,

ich habe hier gelesen das der R820T Chip wenn man den Gain richtig einstellne mit dab2eti zum laufen zu bekommen ist.

Bloß leider wurde hier nicht erwähnt auf welchen wert der einzustellen ist.

Es würde mich freuen wenn mir jemand einen kleinen tip geben könnte.


Kann dablin jetzt auch schon Sender wechseln ??
Basic.Master

Re: DAB+ Linux Software

Beitrag von Basic.Master »

white_gecko hat geschrieben: Ansonsten bin ich sehr zufrieden mit der Richtung, in die die Entwicklung für Linux in dem Bereich geht :-) (Cool wäre natürlich auch noch, wenn dab2eti sub-channel filter implementiert)
Bei den dabtools gibt es dafür schon ein Tool namens eti2mpa, das den gewünschten Subchannel extrahiert.
Mani007 hat geschrieben: Kann dablin jetzt auch schon Sender wechseln ??
Ja, wobei dablin dazu auch nur dab2eti mit der entsprechenden Frequenz aufruft und es vor dem Senderwechsel dann einfach killt. Sauber ist das nicht, aber momentan am einfachsten.
Antworten