Listing 4
#!/usr/bin/python3
import evdev, ...
class Radio(object):
Radio._VOLUME = 0
Radio._TUNER = 1
def process_events(self):
devices = [evdev.InputDevice(fn) for fn in evdev.list_devices()]
devices = {dev.fd: dev for dev in devices}
while not self.done:
fds, _1, _2 = select.select(devices, [], [])
for fd in fds:
for event in devices[fd].read():
event = evdev.util.categorize(event)
if isinstance(event, evdev.events.RelEvent):
# Rotation: Wert ändern, Update-Funktion aufrufen
self._value[self._state] += event.event.value
if self._state == Radio._TUNER:
self._update_tuner()
else:
self._update_volume()
elif isinstance(event, evdev.events.KeyEvent):
if event.keycode == "KEY_ENTER" and event.keystate == event.key_up:
# Push: Umschalten zwischen Tuner/Volume
self._state = 1 -- self._stat.
Die Zeilen 11 und 12 sammeln die Daten für alle Eingabegeräte. In der Endlosschleife ab Zeile 14 wartet das Programm dann in Zeile 15 auf Änderungen (Events) an einem der Geräte. Dank des Systemcalls select gelingt das sehr effizient.
Die Folgezeilen untersuchen dann den Event. Handelt es sich um einen Rotations-Event, aktualisiert das Skript den intern gespeicherten Wert des Drehknopfs und ruft danach die passende Update-Funktion auf (Zeilen 21 bis 25). Die Update-Funktionen rufen dann Radio_cli mit den richtigen Parametern auf.
Analog verhält sich das Programm bei einem Tasten-Event: Hier fragt die Zeile 27 den Keycode für die Eingabe ab, der genau dem Wert 28 aus der config.txt (Listing 3, Zeile 2) entspricht.
Mehr Flexibilität
Die Ausgabe über die analoge Audiobuchse des Boards funktioniert zwar problemlos, aber mehr Qualität und Möglichkeiten eröffnet die I2S-Schnittstelle. Dazu übernimmt der RasPi die Rolle der I2S-Senke, nimmt also die Daten des Si68x entgegen.
Es bietet sich an, dazu den Audiosense-Treiber zu verwenden, der einigermaßen aktuellen Versionen von Raspbian und Raspberry Pi OS beiliegt. Listing 5 zeigt die notwendigen Zeilen für die Konfiguration. Nach einem Neustart verfügt das System über eine neue virtuelle Soundkarte, wie das Aplay-Kommando in Abbildung 5 demonstriert.
Listing 5
dtparam=i2s=on dtparam=audio=on dtoverlay=audiosense-pi

Abbildung 5: Haben Sie die I2S-Schnittstelle aktiviert, verfügt der RasPi über eine zusätzliche virtuelle Soundkarte, die Sie etwa mit Aplay ansteuern.
Listing 6 zeigt die Kommandos, die danach den gewählten Sender über die eingebaute Soundkarte des RasPi (HDMI oder Buchse, je nach Einstellung) abspielen. Zeile 1 schaltet dabei mit der Option -o in den I2S-Modus. Das klappt nur, wenn der Chip noch nicht auf einen Sender eingestellt ist; im Zweifel benötigt der Rechner also vorher noch einen Kaltstart. Die Lautstärke regulieren Sie hier nicht über die Option -l von Radio_cli, sondern wie üblich über den Mixer (je nach Präferenz Alsamixer oder Amixer).
Listing 6
$ radio_cli -b D -o 1 $ radio_cli -c 9 -e 54036 -f 29 -p $ arecord -D hw:1 -c 2 -r 48000 -f S16_LE | aplay -D hw:0 $ arecord -D sysdefault:CARD=audiosensepi -c 2 -r 48000 -f S16_LE -vv | aplay -D sysdefault:CARD=ALSA $ aplay -D bluealsa:DEV=32:54:03:BB:CC:28,PROFILE=a2dp
Sowohl bei Arecord (Aufnahme) als auch bei Aplay (Wiedergabe) geben Sie dabei die Soundkarte mit der Device-Option -D an. Wer sich auf die Nummern nicht verlassen will, verwendet als Alternative die sprechenden Namen (Zeile 4). Die Wahl des Ausgabegeräts steht Ihnen frei: Mit Unterstützung von Bluealsa kann Aplay den Ton auch auf Bluetooth-Lautsprecher ausgeben (Zeile 5).
Um eine Sendung aufzunehmen, geben Sie Arecord statt der Umleitung einen Dateinamen mit. Das Tool ist dazu in der Lage, die Datei automatisch nach Datum und Uhrzeit zu benennen; die Manpage hilft hier weiter.
Beim Einsatz hochwertiger I2S-DACs, wie etwa den HATs von HiFiBerry, lässt sich der I2S-Datenstrom direkt vom DAB Board an den HAT durchreichen. Wie das im Detail funktioniert, beschreibt die Dokumentation zum DAB Board.
Fazit
Das uGreen DAB Board eröffnet viele Möglichkeiten für eigene Radioprojekte, und sei es nur das Nachrüsten eines Empfängers für den heimischen AV-Receiver. Als Alternativen zum Board gibt spezielle USB-Empfänger, die Sie unter dem Stichwort “Software Defined Radio” etwa bei Amazon finden. Preislich liegen diese bei entsprechender Qualität in demselben Bereich wie die hier besprochene Platine, kranken aber an der im Vergleich hohen Leistungsaufnahme.
Im stationären Betrieb bietet Internet-Radio mehr Sender als DAB+ sowie die Möglichkeit, Sendungen direkt als MP3 aufzunehmen – solange nicht eine spontane Videokonferenz eines Mitbewohners die verfügbare Bandbreite schmälert. Im Freien spielt DAB+ seine Stärken jedoch voll aus. Der Empfang funktioniert in der Regel selbst noch dort, wo es weiße Flecken auf der Mobilfunkversorgungskarte gibt. (agr/jlu)





