DAB+ Linux Software

Alles zum Thema DAB(+) Digitalradio.
Günter Lorenz

Re: DAB+ Linux Software

Beitrag von Günter Lorenz »

DANKE !!!! :cheers:
Es spielt - und sogar akustisch. Das alles mit Ubuntu 14 vom USB Stick aus, auf einem HP Compaq nc6320, eine tolle Sache. Naja, der alte Notebook wird den Pinguin jetzt wohl dauerhaft bekommen.
Danke nochmals!
73,
Günter
andimik

Re: DAB+ Linux Software

Beitrag von andimik »

Das freut mich, wenn jemand seine Hardware auf Punguin umstellt, denn ich surfe auch grad unter Ubuntu :)
newspaperman

Re: DAB+ Linux Software

Beitrag von newspaperman »

@Basic.Master: danke für dein DABlin Tool :)
Bisher bin ich über ni2http und einem Icecast Server gegangen, aber diese Lösung ist natürlich viel komfortabler.
Eine Frage hätte ich noch an dich:
Wann macht es Sinn den FDK-AAC Codec zu verwenden?
dh5ym

Re: DAB+ Linux Software

Beitrag von dh5ym »

Ich hatte auch die Noxon-Player unter Wine mit Fake-DLL Variante versucht. Ich hatte Probleme das Audio aus Wine an Pulseaudio zu leiten und das Alsa Device war durch das System blockiert. MOT/SLS ging aber zumindest. Den Player von Andi habe ich noch nicht versucht.
Mir ist allerdings die Variante dab2eti+dablin auch lieber ;)
Basic.Master

Re: DAB+ Linux Software

Beitrag von Basic.Master »

Es freut mich, dass DABlib zu passe kommt.:)

@newspaperman:
Der standardmäßige FAAD2 funktioniert hier seit längerem problemlos und kann bequemer als Paket installiert werden. FDK-AAC ist hier eher zum Ausprobieren gedacht und nicht mit allen möglichen Eingabeformat-Kombis getestet. Im Ausgabeformat ist er außerdem auf 16bit Integer festgelegt (bei FAAD2 benutze ich 32bit Float), wobei ich bezweifle, dass man da einen Unterschied heraushört (höchstens misst).
Stefan Heimers

Re: DAB+ Linux Software

Beitrag von Stefan Heimers »

Vielen Dank für die tolle Software.

DABlin funktioniert bei mir mit dem Trekstor DAB/FM/DVB-T Stick (RTL2838UHIDIR, E4000 tuner). System: Debian 8.0 auf einem Laptop mit Core2Duo Prozessor.

Schön wäre, wenn man die Kanäle im BABlin umschalten könnte. Dazu müsste man dab2eti aus DABlin heraus mit einem popen()-Befehl starten, statt auf der Kommandozeile. Es ist recht mühsam die Frequenzen 9-Stellig auf der Kommandozeile einzugeben.
Basic.Master

Re: DAB+ Linux Software

Beitrag von Basic.Master »

Die Kanäle innerhalb vom Programm umschalten wäre relativ praktisch. popen() habe ich mir mal angesehen. Das Problem ist, dass die PID vom dab2eti-Kindprozess dann nicht abgefragt werden kann, man aber für einen Kanalwechsel die Möglichkeit bräuchte, ihn zu killen. Es gibt da aber ein paar Beispiele, die das alles von Hand mit fork(), exec() etc. machen, das werde ich mir dann demnächst mal ansehen.
Stefan Heimers

Re: DAB+ Linux Software

Beitrag von Stefan Heimers »

Hier gibt's einen Workaround: http://stackoverflow.com/questions/5480 ... with-popen

Aber vielleicht wäre es besser, gleich die dabtools in eine C oder C++ Library umzuschreiben, die nachher in verschiedenen Programmen sauber und ohne externen Prozess eingebunden werden könnte. Das würde auch weitere Funktionen wie das periodische Abfragen der Signalstärke ermöglichen.
newspaperman

Re: DAB+ Linux Software

Beitrag von newspaperman »

Stefan Heimers hat geschrieben: Hier gibt's einen Workaround: http://stackoverflow.com/questions/5480 ... with-popen
Als Quick and Dirty Ansatz würde wohl auch ein system("killall dabtools"); evtl mit -9 helfen, normalerweise läuft ja eh nur eine Einstanz davon.
Aber vielleicht wäre es besser, gleich die dabtools in eine C oder C++ Library umzuschreiben, die nachher in verschiedenen Programmen sauber und ohne externen Prozess eingebunden werden könnte. Das würde auch weitere Funktionen wie das periodische Abfragen der Signalstärke ermöglichen.
Das wäre natürlich die saubere Lösung.

Ich würde mich dennoch sehr freuen, wenn DABlin weiterhin die Möglichkeit bietet einen DAB ETI-NI Strom zu dekodieren, welcher von Stdin kommt, wenn beim Start ein bestimmter Übergabeparameter gesetzt wurde.

Ich habe übrigens als Workaround ein kleines Shell Skript geschrieben in welchem die Frequenzen hinterlegt sind.
Basic.Master

Re: DAB+ Linux Software

Beitrag von Basic.Master »

Dieses Beispiel auf StackOverflow hatte ich mir auch schon mal angesehen. Eine Lib wäre aber natürlich das Optimum. Wer macht es?:D
Als Zwischenlösung ist killall zum Abschießen eine Option (auch wenn das nicht gerade sauber ist), weil dab2eti in der aktuellen Version tatsächlich hardkodiert das RTL-SDR Gerät mit Index 0 verwendet.
Ich werde mal ein bißchen rumbasteln.

Die Möglichkeit, direkt einen ETI-NI-Stream per stdin oder Datei abzuspielen, wird auf jeden Fall drinbleiben. Wahrscheinlich baue ich für das Pseudo-Umschalten mit dab2eti einen Parameter ein, der diesen Modus aktiviert und worüber man dann ggf. den Pfad zum dab2eti-Binary übergibt.

@newspaperman:
Wenn nicht, dann stelle dein Skript gerne online bzw. mache einen Pull Request auf GitHub.
newspaperman

Re: DAB+ Linux Software

Beitrag von newspaperman »

Anbei mein kleines dab.sh Skript. Als Übergabeparamter einfach den DAB Kanalnamen angeben.

Code: Alles auswählen

#!/bin/sh

DAB2ETI=~/dab-software/dabtools/src/dab2eti
DABLIN=~/dab-software/dablin/dablin_gtk

case "$1" in
  5a) freq=174928000;;
  5b) freq=176640000;;
  5c) freq=178352000;;
  5d) freq=180064000;;
  6a) freq=181936000;;
  6b) freq=183648000;;
  6c) freq=185360000;;
  6d) freq=187072000;;
  7a) freq=188928000;;
  7b) freq=190640000;;
  7c) freq=192352000;;
  7d) freq=194064000;;
  8a) freq=195936000;;
  8b) freq=197648000;;
  8c) freq=199360000;;
  8d) freq=201072000;;
  9a) freq=202928000;;
  9b) freq=204640000;;
  9c) freq=206352000;;
  9d) freq=208064000;;
  10a) freq=209936000;;
  10b) freq=211648000;;
  10c) freq=213360000;;
  10d) freq=215072000;;
  11a) freq=216928000;;
  11b) freq=218640000;;
  11c) freq=220352000;;
  11d) freq=222064000;;
  12a) freq=223936000;;
  12b) freq=225648000;;
  12c) freq=227360000;;
  12d) freq=229072000;;
  13a) freq=230784000;;
  13b) freq=232496000;;
  13c) freq=234208000;;
  13d) freq=235776000;;
  13e) freq=237488000;;
  13f) freq=239200000;;
  *)  echo "Usage	: ./dab.sh DAB-channel"
      echo "e. g.: # ./dab.sh 5a"
      exit 1;;
esac

$DAB2ETI $freq | $DABLIN
Stefan Heimers

Re: DAB+ Linux Software

Beitrag von Stefan Heimers »

Basic.Master hat geschrieben: Eine Lib wäre aber natürlich das Optimum. Wer macht es?:D
Ich kanns mal versuchen, weiss aber noch nicht ob ich es schaffe.

Ich denke mal ich ersetze dab2eti.c aus den dabtools durch einen C++ Wrapper und übernehme die anderen Files wie sie sind.

Das Headerfile wird voraussichtlich so ähnlich wie unten aussehen. setChannel() und setFrequency() werden beide die Frequenz setzen, wobei setChannel() den Kanal (z.B. 5C) aus einer Tabelle liest und dann die entsprechende Frequenz setzt.

Code: Alles auswählen

class dab2eti {
public:
  dab2eti();
  ~dab2eti();
  bool setGain(std::string channel);  
  bool setChannel(std::string channel);
  bool setFrequency(float frequency);
  std:: ostream getEtiStream();
private:
  int frequency; // receiving frequency in Hz
  int gain;
};
Basic.Master

Re: DAB+ Linux Software

Beitrag von Basic.Master »

Alles klar, sehr gut. Im Lib-Benutzen bin ich gut, im Lib-Schreiben nicht;)

Zwei Sachen sind mir aufgefallen:
Die Frequenz ist (zumindest bei RTLSDR) vom Typ uint32_t; das könnte man dann eigentlich 1:1 bei setFrequency übernehmen.

Bei getEtiStream() weiß ich nicht, ob es so optimal wäre, den Austausch über einen stream zu machen.
Wenn ich das richtig sehe, kann man den nicht pollen, man könnte also höchstens blockierend lesen, was beim Beenden Probleme machen würde.
Und anscheinend gibt es keine Zusicherung, dass streams threadsafe sind.
Ich fände es einfacher, wenn man der Lib eine Callback-Funktion übergibt, über die man dann einfach jedes Mal ein fertiges ETI-Frame bekäme.:)
andimik

Re: DAB+ Linux Software

Beitrag von andimik »

Die Kanalangaben müssen anscheinend in Kleinbuchstaben verwendet werden ... (vielleicht etwas unüblich)
Stefan Heimers

Re: DAB+ Linux Software

Beitrag von Stefan Heimers »

OK, ich versuche es mit einem Callback für einzelne ETI Frames. Da muss ich dann wohl noch einen internen fifo-Buffer einbauen. Aber das sollte sich machen lassen.
Antworten