<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://sundtek.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=194.96.9.215&amp;*</id>
	<title>Sundtek Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://sundtek.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=194.96.9.215&amp;*"/>
	<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=Special:Contributions/194.96.9.215"/>
	<updated>2026-04-20T12:10:17Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.33.0</generator>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=46</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=46"/>
		<updated>2019-07-29T10:33:34Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* Developer C API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player for X86-64 Bit Linux:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-x86_64-2019-07-28_07_05.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Developer C API ===&lt;br /&gt;
&lt;br /&gt;
This API works with Linux and MacOS. The Application needs to be linked against libmcsimple.[so/dylib] which connects via unix domain sockets to the driver service which runs as a server. The driver accesses the native USB userspace interface on each system and does not need any kernel driver.&lt;br /&gt;
It can be found in /opt/lib&lt;br /&gt;
&lt;br /&gt;
The driver package uses LD_PRELOAD, /etc/ld.so.preload, for developers and integrators who directly access the driver this is not needed, be sure you install the driver with the -service flag ./sundtek_netinst.sh -service, full driver releases (no netinst versions) can be downloaded from https://sundtek.de/media&lt;br /&gt;
The driver package also includes drivers for Sundtek TV devices.&lt;br /&gt;
&lt;br /&gt;
All devices come with a unique serial number, the serial numbers can be used for handling multiple devices and storing unique channel lists.&lt;br /&gt;
&lt;br /&gt;
Basically the API needs only a few commands:&lt;br /&gt;
&lt;br /&gt;
FM Radio:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fd = net_open(&amp;quot;/dev/radio0&amp;quot;, O_RDWR); // open device node&lt;br /&gt;
net_ioctl(fd, command, parameter);&lt;br /&gt;
net_close(fd);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For DAB/DAB+&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fd = net_open(&amp;quot;/dev/dab0&amp;quot;, O_RDWR);&lt;br /&gt;
net_ioctl(fd, command, parameter);&lt;br /&gt;
net_close(fd);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to access the PCM samples directly you can use net_read(fd, buffer, buflen); on the corresponding device. The driver server has the option to play back the samples directly so no audio handling is needed by the application. It also has the advantage that audio can stay in the background even if the application is closed.&lt;br /&gt;
&lt;br /&gt;
The access to the dab / fm radio node is exclusive, if dab is used fm will be locked and vice versa. Care needs to be taken that some commands might introduce a delay eg. switching the radio mode and changing channels (eg. for DAB/DAB+). Switching from FM&amp;lt;-&amp;gt;DAB needs around 4 seconds, changing FM radio station takes less than 100ms, changing DAB Services less than 1 second as long as they're available on the same Ensemble.&lt;br /&gt;
&lt;br /&gt;
Switching the radio mode between DAB and FM will also mute the audio stream, audio has to be unmuted manually by the application.&lt;br /&gt;
&lt;br /&gt;
Additional features are available, eg. detect connect/disconnect devices dynamically. Headers are available in /opt/include, libraries in /opt/lib&lt;br /&gt;
&lt;br /&gt;
Also to note, there might be some other libraries using net_xxx commands, in case you're running into a collision please contact sundtek via email.&lt;br /&gt;
&lt;br /&gt;
==== DAB Scan for Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Scan for Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Tune Service ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_dab_channel(int fd, uint32_t frequency, uint32_t sid, uint8_t sid_set, uint32_t comp, uint8_t comp_set) {&lt;br /&gt;
        struct dab_frequency dabf;&lt;br /&gt;
        memset(&amp;amp;dabf, 0x0, sizeof(struct dab_frequency));&lt;br /&gt;
        if (sid_set &amp;amp;&amp;amp; comp_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x, 0x%x\n&amp;quot;, frequency, sid, comp);&lt;br /&gt;
        else if (sid_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x\n&amp;quot;, frequency, sid);&lt;br /&gt;
        else&lt;br /&gt;
                printf(&amp;quot;Tuning: %d\n&amp;quot;, frequency);&lt;br /&gt;
&lt;br /&gt;
        dabf.frequency = frequency;&lt;br /&gt;
        if (sid_set) {&lt;br /&gt;
                dabf.sid_set = 1;&lt;br /&gt;
                dabf.sid = sid;&lt;br /&gt;
        }&lt;br /&gt;
        if (comp_set) {&lt;br /&gt;
                dabf.comp = comp;&lt;br /&gt;
                dabf.comp_set = 1;&lt;br /&gt;
        }&lt;br /&gt;
        net_ioctl(fd, DAB_SET_FREQUENCY, &amp;amp;dabf);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM/DAB Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Scan Frequencies ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_fmfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else {&lt;br /&gt;
                printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct fm_scan_setup setup;&lt;br /&gt;
                struct fm_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct fm_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct fm_scan_setup));&lt;br /&gt;
                printf(&amp;quot;SCAN SETUP\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, FM_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, FM_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
        //              printf(&amp;quot;LOCK STAT: %x - %d - %d\n&amp;quot;, parameters.status, parameters.VALID, parameters.READFREQ);&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case FM_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        printf(&amp;quot;FREQUENCY: %d &amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%d [LOCKED]\n&amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case FM_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case FM_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != FM_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Set Radio Frequency ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_radio_channel(int fd, int frequency, int tuner) {&lt;br /&gt;
        struct v4l2_frequency freq;&lt;br /&gt;
        memset(&amp;amp;freq, 0x0, sizeof(struct v4l2_frequency));&lt;br /&gt;
        freq.frequency = frequency/1000*16;&lt;br /&gt;
        freq.type = V4L2_TUNER_RADIO;&lt;br /&gt;
        freq.tuner = tuner;&lt;br /&gt;
&lt;br /&gt;
        net_ioctl(fd, VIDIOC_S_FREQUENCY, &amp;amp;freq);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Read RDS Data ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
net_ioctl(rdsfd, FM_RDS_STATUS, &amp;amp;data);&lt;br /&gt;
struct fm_rds_data {&lt;br /&gt;
        uint8_t rdssync; /* rds synchronized */&lt;br /&gt;
        uint8_t pivalid; /* program identification */&lt;br /&gt;
        uint8_t tpptyvalid; /* traffic program  / program type*/&lt;br /&gt;
        uint16_t PI; /* program identification */&lt;br /&gt;
        uint8_t PTY; /* program type */&lt;br /&gt;
        uint8_t data[8]; /* representing the RDS blocks */&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=44</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=44"/>
		<updated>2019-07-29T10:26:40Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* Developer C API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player for X86-64 Bit Linux:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-x86_64-2019-07-28_07_05.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Developer C API ===&lt;br /&gt;
&lt;br /&gt;
This API works with Linux and MacOS. The Application needs to be linked against libmcsimple.[so/dylib] which connects via unix domain sockets to the driver service which runs as a server. The driver accesses the native USB userspace interface on each system and does not need any kernel driver.&lt;br /&gt;
It can be found in /opt/lib&lt;br /&gt;
&lt;br /&gt;
The driver package uses LD_PRELOAD, /etc/ld.so.preload, for developers and integrators who directly access the driver this is not needed, be sure you install the driver with the -service flag ./sundtek_netinst.sh -service, full driver releases (no netinst versions) can be downloaded from https://sundtek.de/media&lt;br /&gt;
The driver package also includes drivers for Sundtek TV devices.&lt;br /&gt;
&lt;br /&gt;
All devices come with a unique serial number, the serial numbers can be used for handling multiple devices and storing unique channel lists.&lt;br /&gt;
&lt;br /&gt;
Basically the API needs only a few commands:&lt;br /&gt;
&lt;br /&gt;
FM Radio:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fd = net_open(&amp;quot;/dev/radio0&amp;quot;, O_RDWR); // open device node&lt;br /&gt;
net_ioctl(fd, command, parameter);&lt;br /&gt;
net_close(fd);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For DAB/DAB+&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fd = net_open(&amp;quot;/dev/dab0&amp;quot;, O_RDWR);&lt;br /&gt;
net_ioctl(fd, command, parameter);&lt;br /&gt;
net_close(fd);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to access the PCM samples directly you can use net_read(fd, buffer, buflen); on the corresponding device. The driver server has the option to play back the samples directly so no audio handling is needed by the application. It also has the advantage that audio can stay in the background even if the application is closed.&lt;br /&gt;
&lt;br /&gt;
The access to the dab / fm radio node is exclusive, if dab is used fm will be locked and vice versa. Care needs to be taken that some commands might introduce a delay eg. switching the radio mode and changing channels (eg. for DAB/DAB+). Switching from FM&amp;lt;-&amp;gt;DAB needs around 4 seconds, changing FM radio station takes less than 100ms, changing DAB Services less than 1 second as long as they're available on the same Ensemble.&lt;br /&gt;
&lt;br /&gt;
Switching the radio mode between DAB and FM will also mute the audio stream, audio has to be unmuted manually by the application.&lt;br /&gt;
&lt;br /&gt;
Additional features are available, eg. detect connect/disconnect devices dynamically. Headers are available in /opt/include, libraries in /opt/lib&lt;br /&gt;
&lt;br /&gt;
==== DAB Scan for Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Scan for Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Tune Service ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_dab_channel(int fd, uint32_t frequency, uint32_t sid, uint8_t sid_set, uint32_t comp, uint8_t comp_set) {&lt;br /&gt;
        struct dab_frequency dabf;&lt;br /&gt;
        memset(&amp;amp;dabf, 0x0, sizeof(struct dab_frequency));&lt;br /&gt;
        if (sid_set &amp;amp;&amp;amp; comp_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x, 0x%x\n&amp;quot;, frequency, sid, comp);&lt;br /&gt;
        else if (sid_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x\n&amp;quot;, frequency, sid);&lt;br /&gt;
        else&lt;br /&gt;
                printf(&amp;quot;Tuning: %d\n&amp;quot;, frequency);&lt;br /&gt;
&lt;br /&gt;
        dabf.frequency = frequency;&lt;br /&gt;
        if (sid_set) {&lt;br /&gt;
                dabf.sid_set = 1;&lt;br /&gt;
                dabf.sid = sid;&lt;br /&gt;
        }&lt;br /&gt;
        if (comp_set) {&lt;br /&gt;
                dabf.comp = comp;&lt;br /&gt;
                dabf.comp_set = 1;&lt;br /&gt;
        }&lt;br /&gt;
        net_ioctl(fd, DAB_SET_FREQUENCY, &amp;amp;dabf);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM/DAB Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Scan Frequencies ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_fmfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else {&lt;br /&gt;
                printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct fm_scan_setup setup;&lt;br /&gt;
                struct fm_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct fm_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct fm_scan_setup));&lt;br /&gt;
                printf(&amp;quot;SCAN SETUP\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, FM_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, FM_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
        //              printf(&amp;quot;LOCK STAT: %x - %d - %d\n&amp;quot;, parameters.status, parameters.VALID, parameters.READFREQ);&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case FM_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        printf(&amp;quot;FREQUENCY: %d &amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%d [LOCKED]\n&amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case FM_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case FM_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != FM_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Set Radio Frequency ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_radio_channel(int fd, int frequency, int tuner) {&lt;br /&gt;
        struct v4l2_frequency freq;&lt;br /&gt;
        memset(&amp;amp;freq, 0x0, sizeof(struct v4l2_frequency));&lt;br /&gt;
        freq.frequency = frequency/1000*16;&lt;br /&gt;
        freq.type = V4L2_TUNER_RADIO;&lt;br /&gt;
        freq.tuner = tuner;&lt;br /&gt;
&lt;br /&gt;
        net_ioctl(fd, VIDIOC_S_FREQUENCY, &amp;amp;freq);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Read RDS Data ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
net_ioctl(rdsfd, FM_RDS_STATUS, &amp;amp;data);&lt;br /&gt;
struct fm_rds_data {&lt;br /&gt;
        uint8_t rdssync; /* rds synchronized */&lt;br /&gt;
        uint8_t pivalid; /* program identification */&lt;br /&gt;
        uint8_t tpptyvalid; /* traffic program  / program type*/&lt;br /&gt;
        uint16_t PI; /* program identification */&lt;br /&gt;
        uint8_t PTY; /* program type */&lt;br /&gt;
        uint8_t data[8]; /* representing the RDS blocks */&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=Main_Page&amp;diff=43</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=Main_Page&amp;diff=43"/>
		<updated>2019-07-29T10:17:33Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;Sundtek Wiki&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sundtek SkyTV related topics [[DVB-S/S2/S2X]]&lt;br /&gt;
* Sundtek FM/DAB/DAB+ related topics [[DAB/DAB+]]&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=Main_Page&amp;diff=42</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=Main_Page&amp;diff=42"/>
		<updated>2019-07-29T10:17:17Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;Sundtek Wiki&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sundtek SkyTV related topics [[DVB-S/S2/S2X]]&lt;br /&gt;
* Sundtek FM/DAB/DAB+ related topics [[DAB/DAB+]]&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=41</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=41"/>
		<updated>2019-07-29T10:16:43Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* C API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player for X86-64 Bit Linux:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-x86_64-2019-07-28_07_05.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Developer C API ===&lt;br /&gt;
&lt;br /&gt;
This API works with Linux and MacOS. The Application needs to be linked against libmcsimple.[so/dylib] which connects via unix domain sockets to the driver service which runs as a server. The driver accesses the native USB userspace interface on each system and does not need any kernel driver.&lt;br /&gt;
It can be found in /opt/lib&lt;br /&gt;
&lt;br /&gt;
The driver package uses LD_PRELOAD, /etc/ld.so.preload, for developers and integrators who directly access the driver this is not needed, be sure you install the driver with the -service flag ./sundtek_netinst.sh -service, full driver releases (no netinst versions) can be downloaded from https://sundtek.de/media&lt;br /&gt;
The driver package also includes drivers for Sundtek TV devices.&lt;br /&gt;
&lt;br /&gt;
All devices come with a unique serial number, the serial numbers can be used for handling multiple devices and storing unique channel lists.&lt;br /&gt;
&lt;br /&gt;
Basically the API needs only a few commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fd = net_open(&amp;quot;/dev/radio0&amp;quot;, O_RDWR); // open device node&lt;br /&gt;
net_ioctl(fd, command, parameter);&lt;br /&gt;
net_close(fd);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additional features are available, eg. detect connect/disconnect devices dynamically. Headers are available in /opt/include, libraries in /opt/lib&lt;br /&gt;
&lt;br /&gt;
==== DAB Scan for Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Scan for Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Tune Service ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_dab_channel(int fd, uint32_t frequency, uint32_t sid, uint8_t sid_set, uint32_t comp, uint8_t comp_set) {&lt;br /&gt;
        struct dab_frequency dabf;&lt;br /&gt;
        memset(&amp;amp;dabf, 0x0, sizeof(struct dab_frequency));&lt;br /&gt;
        if (sid_set &amp;amp;&amp;amp; comp_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x, 0x%x\n&amp;quot;, frequency, sid, comp);&lt;br /&gt;
        else if (sid_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x\n&amp;quot;, frequency, sid);&lt;br /&gt;
        else&lt;br /&gt;
                printf(&amp;quot;Tuning: %d\n&amp;quot;, frequency);&lt;br /&gt;
&lt;br /&gt;
        dabf.frequency = frequency;&lt;br /&gt;
        if (sid_set) {&lt;br /&gt;
                dabf.sid_set = 1;&lt;br /&gt;
                dabf.sid = sid;&lt;br /&gt;
        }&lt;br /&gt;
        if (comp_set) {&lt;br /&gt;
                dabf.comp = comp;&lt;br /&gt;
                dabf.comp_set = 1;&lt;br /&gt;
        }&lt;br /&gt;
        net_ioctl(fd, DAB_SET_FREQUENCY, &amp;amp;dabf);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM/DAB Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Scan Frequencies ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_fmfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else {&lt;br /&gt;
                printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct fm_scan_setup setup;&lt;br /&gt;
                struct fm_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct fm_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct fm_scan_setup));&lt;br /&gt;
                printf(&amp;quot;SCAN SETUP\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, FM_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, FM_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
        //              printf(&amp;quot;LOCK STAT: %x - %d - %d\n&amp;quot;, parameters.status, parameters.VALID, parameters.READFREQ);&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case FM_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        printf(&amp;quot;FREQUENCY: %d &amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%d [LOCKED]\n&amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case FM_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case FM_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != FM_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Set Radio Frequency ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_radio_channel(int fd, int frequency, int tuner) {&lt;br /&gt;
        struct v4l2_frequency freq;&lt;br /&gt;
        memset(&amp;amp;freq, 0x0, sizeof(struct v4l2_frequency));&lt;br /&gt;
        freq.frequency = frequency/1000*16;&lt;br /&gt;
        freq.type = V4L2_TUNER_RADIO;&lt;br /&gt;
        freq.tuner = tuner;&lt;br /&gt;
&lt;br /&gt;
        net_ioctl(fd, VIDIOC_S_FREQUENCY, &amp;amp;freq);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Read RDS Data ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
net_ioctl(rdsfd, FM_RDS_STATUS, &amp;amp;data);&lt;br /&gt;
struct fm_rds_data {&lt;br /&gt;
        uint8_t rdssync; /* rds synchronized */&lt;br /&gt;
        uint8_t pivalid; /* program identification */&lt;br /&gt;
        uint8_t tpptyvalid; /* traffic program  / program type*/&lt;br /&gt;
        uint16_t PI; /* program identification */&lt;br /&gt;
        uint8_t PTY; /* program type */&lt;br /&gt;
        uint8_t data[8]; /* representing the RDS blocks */&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=40</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=40"/>
		<updated>2019-07-29T10:16:13Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* C API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player for X86-64 Bit Linux:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-x86_64-2019-07-28_07_05.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
This API works with Linux and MacOS. The Application needs to be linked against libmcsimple.[so/dylib] which connects via unix domain sockets to the driver service which runs as a server. The driver accesses the native USB userspace interface on each system and does not need any kernel driver.&lt;br /&gt;
It can be found in /opt/lib&lt;br /&gt;
&lt;br /&gt;
The driver package uses LD_PRELOAD, /etc/ld.so.preload, for developers and integrators who directly access the driver this is not needed, be sure you install the driver with the -service flag ./sundtek_netinst.sh -service, full driver releases (no netinst versions) can be downloaded from https://sundtek.de/media&lt;br /&gt;
The driver package also includes drivers for Sundtek TV devices.&lt;br /&gt;
&lt;br /&gt;
All devices come with a unique serial number, the serial numbers can be used for handling multiple devices and storing unique channel lists.&lt;br /&gt;
&lt;br /&gt;
Basically the API needs only a few commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fd = net_open(&amp;quot;/dev/radio0&amp;quot;, O_RDWR); // open device node&lt;br /&gt;
net_ioctl(fd, command, parameter);&lt;br /&gt;
net_close(fd);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additional features are available, eg. detect connect/disconnect devices dynamically. Headers are available in /opt/include, libraries in /opt/lib&lt;br /&gt;
&lt;br /&gt;
==== DAB Scan for Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Scan for Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Tune Service ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_dab_channel(int fd, uint32_t frequency, uint32_t sid, uint8_t sid_set, uint32_t comp, uint8_t comp_set) {&lt;br /&gt;
        struct dab_frequency dabf;&lt;br /&gt;
        memset(&amp;amp;dabf, 0x0, sizeof(struct dab_frequency));&lt;br /&gt;
        if (sid_set &amp;amp;&amp;amp; comp_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x, 0x%x\n&amp;quot;, frequency, sid, comp);&lt;br /&gt;
        else if (sid_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x\n&amp;quot;, frequency, sid);&lt;br /&gt;
        else&lt;br /&gt;
                printf(&amp;quot;Tuning: %d\n&amp;quot;, frequency);&lt;br /&gt;
&lt;br /&gt;
        dabf.frequency = frequency;&lt;br /&gt;
        if (sid_set) {&lt;br /&gt;
                dabf.sid_set = 1;&lt;br /&gt;
                dabf.sid = sid;&lt;br /&gt;
        }&lt;br /&gt;
        if (comp_set) {&lt;br /&gt;
                dabf.comp = comp;&lt;br /&gt;
                dabf.comp_set = 1;&lt;br /&gt;
        }&lt;br /&gt;
        net_ioctl(fd, DAB_SET_FREQUENCY, &amp;amp;dabf);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM/DAB Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Scan Frequencies ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_fmfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else {&lt;br /&gt;
                printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct fm_scan_setup setup;&lt;br /&gt;
                struct fm_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct fm_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct fm_scan_setup));&lt;br /&gt;
                printf(&amp;quot;SCAN SETUP\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, FM_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, FM_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
        //              printf(&amp;quot;LOCK STAT: %x - %d - %d\n&amp;quot;, parameters.status, parameters.VALID, parameters.READFREQ);&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case FM_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        printf(&amp;quot;FREQUENCY: %d &amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%d [LOCKED]\n&amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case FM_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case FM_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != FM_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Set Radio Frequency ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_radio_channel(int fd, int frequency, int tuner) {&lt;br /&gt;
        struct v4l2_frequency freq;&lt;br /&gt;
        memset(&amp;amp;freq, 0x0, sizeof(struct v4l2_frequency));&lt;br /&gt;
        freq.frequency = frequency/1000*16;&lt;br /&gt;
        freq.type = V4L2_TUNER_RADIO;&lt;br /&gt;
        freq.tuner = tuner;&lt;br /&gt;
&lt;br /&gt;
        net_ioctl(fd, VIDIOC_S_FREQUENCY, &amp;amp;freq);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Read RDS Data ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
net_ioctl(rdsfd, FM_RDS_STATUS, &amp;amp;data);&lt;br /&gt;
struct fm_rds_data {&lt;br /&gt;
        uint8_t rdssync; /* rds synchronized */&lt;br /&gt;
        uint8_t pivalid; /* program identification */&lt;br /&gt;
        uint8_t tpptyvalid; /* traffic program  / program type*/&lt;br /&gt;
        uint16_t PI; /* program identification */&lt;br /&gt;
        uint8_t PTY; /* program type */&lt;br /&gt;
        uint8_t data[8]; /* representing the RDS blocks */&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=39</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=39"/>
		<updated>2019-07-29T10:15:59Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* C API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player for X86-64 Bit Linux:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-x86_64-2019-07-28_07_05.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
This API works with Linux and MacOS. The Application needs to be linked against libmcsimple.[so/dylib] which connects via unix domain sockets to the driver service which runs as a server. The driver accesses the native USB userspace interface on each system.&lt;br /&gt;
It can be found in /opt/lib.&lt;br /&gt;
&lt;br /&gt;
The driver package uses LD_PRELOAD, /etc/ld.so.preload, for developers and integrators who directly access the driver this is not needed, be sure you install the driver with the -service flag ./sundtek_netinst.sh -service, full driver releases (no netinst versions) can be downloaded from https://sundtek.de/media&lt;br /&gt;
The driver package also includes drivers for Sundtek TV devices.&lt;br /&gt;
&lt;br /&gt;
All devices come with a unique serial number, the serial numbers can be used for handling multiple devices and storing unique channel lists.&lt;br /&gt;
&lt;br /&gt;
Basically the API needs only a few commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fd = net_open(&amp;quot;/dev/radio0&amp;quot;, O_RDWR); // open device node&lt;br /&gt;
net_ioctl(fd, command, parameter);&lt;br /&gt;
net_close(fd);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additional features are available, eg. detect connect/disconnect devices dynamically. Headers are available in /opt/include, libraries in /opt/lib&lt;br /&gt;
&lt;br /&gt;
==== DAB Scan for Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Scan for Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Tune Service ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_dab_channel(int fd, uint32_t frequency, uint32_t sid, uint8_t sid_set, uint32_t comp, uint8_t comp_set) {&lt;br /&gt;
        struct dab_frequency dabf;&lt;br /&gt;
        memset(&amp;amp;dabf, 0x0, sizeof(struct dab_frequency));&lt;br /&gt;
        if (sid_set &amp;amp;&amp;amp; comp_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x, 0x%x\n&amp;quot;, frequency, sid, comp);&lt;br /&gt;
        else if (sid_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x\n&amp;quot;, frequency, sid);&lt;br /&gt;
        else&lt;br /&gt;
                printf(&amp;quot;Tuning: %d\n&amp;quot;, frequency);&lt;br /&gt;
&lt;br /&gt;
        dabf.frequency = frequency;&lt;br /&gt;
        if (sid_set) {&lt;br /&gt;
                dabf.sid_set = 1;&lt;br /&gt;
                dabf.sid = sid;&lt;br /&gt;
        }&lt;br /&gt;
        if (comp_set) {&lt;br /&gt;
                dabf.comp = comp;&lt;br /&gt;
                dabf.comp_set = 1;&lt;br /&gt;
        }&lt;br /&gt;
        net_ioctl(fd, DAB_SET_FREQUENCY, &amp;amp;dabf);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM/DAB Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Scan Frequencies ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_fmfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else {&lt;br /&gt;
                printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct fm_scan_setup setup;&lt;br /&gt;
                struct fm_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct fm_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct fm_scan_setup));&lt;br /&gt;
                printf(&amp;quot;SCAN SETUP\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, FM_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, FM_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
        //              printf(&amp;quot;LOCK STAT: %x - %d - %d\n&amp;quot;, parameters.status, parameters.VALID, parameters.READFREQ);&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case FM_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        printf(&amp;quot;FREQUENCY: %d &amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%d [LOCKED]\n&amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case FM_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case FM_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != FM_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Set Radio Frequency ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_radio_channel(int fd, int frequency, int tuner) {&lt;br /&gt;
        struct v4l2_frequency freq;&lt;br /&gt;
        memset(&amp;amp;freq, 0x0, sizeof(struct v4l2_frequency));&lt;br /&gt;
        freq.frequency = frequency/1000*16;&lt;br /&gt;
        freq.type = V4L2_TUNER_RADIO;&lt;br /&gt;
        freq.tuner = tuner;&lt;br /&gt;
&lt;br /&gt;
        net_ioctl(fd, VIDIOC_S_FREQUENCY, &amp;amp;freq);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Read RDS Data ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
net_ioctl(rdsfd, FM_RDS_STATUS, &amp;amp;data);&lt;br /&gt;
struct fm_rds_data {&lt;br /&gt;
        uint8_t rdssync; /* rds synchronized */&lt;br /&gt;
        uint8_t pivalid; /* program identification */&lt;br /&gt;
        uint8_t tpptyvalid; /* traffic program  / program type*/&lt;br /&gt;
        uint16_t PI; /* program identification */&lt;br /&gt;
        uint8_t PTY; /* program type */&lt;br /&gt;
        uint8_t data[8]; /* representing the RDS blocks */&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=38</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=38"/>
		<updated>2019-07-29T10:15:04Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* C API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player for X86-64 Bit Linux:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-x86_64-2019-07-28_07_05.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
This API works with Linux and MacOS. The Application needs to be linked against libmcsimple.[so/dylib] which connects via unix domain sockets to the driver service which runs as a server. &lt;br /&gt;
It can be found in /opt/lib.&lt;br /&gt;
&lt;br /&gt;
The driver package uses LD_PRELOAD, /etc/ld.so.preload, for developers and integrators who directly access the driver this is not needed, be sure you install the driver with the -service flag ./sundtek_netinst.sh -service, full driver releases (no netinst versions) can be downloaded from https://sundtek.de/media&lt;br /&gt;
The driver package also includes drivers for Sundtek TV devices.&lt;br /&gt;
&lt;br /&gt;
All devices come with a unique serial number, the serial numbers can be used for handling multiple devices and storing unique channel lists.&lt;br /&gt;
&lt;br /&gt;
Basically the API needs only a few commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fd = net_open(&amp;quot;/dev/radio0&amp;quot;, O_RDWR); // open device node&lt;br /&gt;
net_ioctl(fd, command, parameter);&lt;br /&gt;
net_close(fd);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additional features are available, eg. detect connect/disconnect devices dynamically. Headers are available in /opt/include, libraries in /opt/lib&lt;br /&gt;
&lt;br /&gt;
==== DAB Scan for Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Scan for Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Tune Service ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_dab_channel(int fd, uint32_t frequency, uint32_t sid, uint8_t sid_set, uint32_t comp, uint8_t comp_set) {&lt;br /&gt;
        struct dab_frequency dabf;&lt;br /&gt;
        memset(&amp;amp;dabf, 0x0, sizeof(struct dab_frequency));&lt;br /&gt;
        if (sid_set &amp;amp;&amp;amp; comp_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x, 0x%x\n&amp;quot;, frequency, sid, comp);&lt;br /&gt;
        else if (sid_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x\n&amp;quot;, frequency, sid);&lt;br /&gt;
        else&lt;br /&gt;
                printf(&amp;quot;Tuning: %d\n&amp;quot;, frequency);&lt;br /&gt;
&lt;br /&gt;
        dabf.frequency = frequency;&lt;br /&gt;
        if (sid_set) {&lt;br /&gt;
                dabf.sid_set = 1;&lt;br /&gt;
                dabf.sid = sid;&lt;br /&gt;
        }&lt;br /&gt;
        if (comp_set) {&lt;br /&gt;
                dabf.comp = comp;&lt;br /&gt;
                dabf.comp_set = 1;&lt;br /&gt;
        }&lt;br /&gt;
        net_ioctl(fd, DAB_SET_FREQUENCY, &amp;amp;dabf);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM/DAB Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Scan Frequencies ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_fmfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else {&lt;br /&gt;
                printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct fm_scan_setup setup;&lt;br /&gt;
                struct fm_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct fm_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct fm_scan_setup));&lt;br /&gt;
                printf(&amp;quot;SCAN SETUP\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, FM_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, FM_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
        //              printf(&amp;quot;LOCK STAT: %x - %d - %d\n&amp;quot;, parameters.status, parameters.VALID, parameters.READFREQ);&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case FM_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        printf(&amp;quot;FREQUENCY: %d &amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%d [LOCKED]\n&amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case FM_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case FM_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != FM_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Set Radio Frequency ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_radio_channel(int fd, int frequency, int tuner) {&lt;br /&gt;
        struct v4l2_frequency freq;&lt;br /&gt;
        memset(&amp;amp;freq, 0x0, sizeof(struct v4l2_frequency));&lt;br /&gt;
        freq.frequency = frequency/1000*16;&lt;br /&gt;
        freq.type = V4L2_TUNER_RADIO;&lt;br /&gt;
        freq.tuner = tuner;&lt;br /&gt;
&lt;br /&gt;
        net_ioctl(fd, VIDIOC_S_FREQUENCY, &amp;amp;freq);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Read RDS Data ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
net_ioctl(rdsfd, FM_RDS_STATUS, &amp;amp;data);&lt;br /&gt;
struct fm_rds_data {&lt;br /&gt;
        uint8_t rdssync; /* rds synchronized */&lt;br /&gt;
        uint8_t pivalid; /* program identification */&lt;br /&gt;
        uint8_t tpptyvalid; /* traffic program  / program type*/&lt;br /&gt;
        uint16_t PI; /* program identification */&lt;br /&gt;
        uint8_t PTY; /* program type */&lt;br /&gt;
        uint8_t data[8]; /* representing the RDS blocks */&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=37</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=37"/>
		<updated>2019-07-29T10:11:47Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* C API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player for X86-64 Bit Linux:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-x86_64-2019-07-28_07_05.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
This API works with Linux and MacOS. The Application needs to be linked against libmcsimple.[so/dylib] which connects via unix domain sockets to the driver service which runs as a server.&lt;br /&gt;
&lt;br /&gt;
The driver package uses LD_PRELOAD / /etc/ld.so.preload, for developers and integrators who directly access the driver this is not needed, be sure you install the driver with the -service flag ./sundtek_netinst.sh -service, full driver releases (no netinst versions) can be downloaded from https://sundtek.de/media&lt;br /&gt;
&lt;br /&gt;
Basically the API needs only a few commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fd = net_open(&amp;quot;/dev/radio0&amp;quot;, O_RDWR); // open device node&lt;br /&gt;
net_ioctl(fd, command, parameter);&lt;br /&gt;
net_close(fd);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additional features are available, eg. detect connect/disconnect devices dynamically. Headers are available in /opt/include, libraries in /opt/lib&lt;br /&gt;
&lt;br /&gt;
==== DAB Scan for Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Scan for Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Tune Service ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_dab_channel(int fd, uint32_t frequency, uint32_t sid, uint8_t sid_set, uint32_t comp, uint8_t comp_set) {&lt;br /&gt;
        struct dab_frequency dabf;&lt;br /&gt;
        memset(&amp;amp;dabf, 0x0, sizeof(struct dab_frequency));&lt;br /&gt;
        if (sid_set &amp;amp;&amp;amp; comp_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x, 0x%x\n&amp;quot;, frequency, sid, comp);&lt;br /&gt;
        else if (sid_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x\n&amp;quot;, frequency, sid);&lt;br /&gt;
        else&lt;br /&gt;
                printf(&amp;quot;Tuning: %d\n&amp;quot;, frequency);&lt;br /&gt;
&lt;br /&gt;
        dabf.frequency = frequency;&lt;br /&gt;
        if (sid_set) {&lt;br /&gt;
                dabf.sid_set = 1;&lt;br /&gt;
                dabf.sid = sid;&lt;br /&gt;
        }&lt;br /&gt;
        if (comp_set) {&lt;br /&gt;
                dabf.comp = comp;&lt;br /&gt;
                dabf.comp_set = 1;&lt;br /&gt;
        }&lt;br /&gt;
        net_ioctl(fd, DAB_SET_FREQUENCY, &amp;amp;dabf);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM/DAB Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Scan Frequencies ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_fmfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else {&lt;br /&gt;
                printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct fm_scan_setup setup;&lt;br /&gt;
                struct fm_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct fm_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct fm_scan_setup));&lt;br /&gt;
                printf(&amp;quot;SCAN SETUP\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, FM_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, FM_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
        //              printf(&amp;quot;LOCK STAT: %x - %d - %d\n&amp;quot;, parameters.status, parameters.VALID, parameters.READFREQ);&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case FM_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        printf(&amp;quot;FREQUENCY: %d &amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%d [LOCKED]\n&amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case FM_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case FM_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != FM_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Set Radio Frequency ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_radio_channel(int fd, int frequency, int tuner) {&lt;br /&gt;
        struct v4l2_frequency freq;&lt;br /&gt;
        memset(&amp;amp;freq, 0x0, sizeof(struct v4l2_frequency));&lt;br /&gt;
        freq.frequency = frequency/1000*16;&lt;br /&gt;
        freq.type = V4L2_TUNER_RADIO;&lt;br /&gt;
        freq.tuner = tuner;&lt;br /&gt;
&lt;br /&gt;
        net_ioctl(fd, VIDIOC_S_FREQUENCY, &amp;amp;freq);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Read RDS Data ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
net_ioctl(rdsfd, FM_RDS_STATUS, &amp;amp;data);&lt;br /&gt;
struct fm_rds_data {&lt;br /&gt;
        uint8_t rdssync; /* rds synchronized */&lt;br /&gt;
        uint8_t pivalid; /* program identification */&lt;br /&gt;
        uint8_t tpptyvalid; /* traffic program  / program type*/&lt;br /&gt;
        uint16_t PI; /* program identification */&lt;br /&gt;
        uint8_t PTY; /* program type */&lt;br /&gt;
        uint8_t data[8]; /* representing the RDS blocks */&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=36</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=36"/>
		<updated>2019-07-29T10:04:00Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* C API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player for X86-64 Bit Linux:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-x86_64-2019-07-28_07_05.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
This API works with Linux and MacOS. The Application needs to be linked against libmcsimple.[so/dylib] which connects via unix domain sockets to the driver service which runs as a server.&lt;br /&gt;
Basically the API needs only a few commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fd = net_open(&amp;quot;/dev/radio0&amp;quot;, O_RDWR); // open device node&lt;br /&gt;
net_ioctl(fd, command, parameter);&lt;br /&gt;
net_close(fd);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additional features are available, eg. detect connect/disconnect devices dynamically. Headers are available in /opt/include, libraries in /opt/lib&lt;br /&gt;
&lt;br /&gt;
==== DAB Scan for Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Scan for Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Tune Service ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_dab_channel(int fd, uint32_t frequency, uint32_t sid, uint8_t sid_set, uint32_t comp, uint8_t comp_set) {&lt;br /&gt;
        struct dab_frequency dabf;&lt;br /&gt;
        memset(&amp;amp;dabf, 0x0, sizeof(struct dab_frequency));&lt;br /&gt;
        if (sid_set &amp;amp;&amp;amp; comp_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x, 0x%x\n&amp;quot;, frequency, sid, comp);&lt;br /&gt;
        else if (sid_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x\n&amp;quot;, frequency, sid);&lt;br /&gt;
        else&lt;br /&gt;
                printf(&amp;quot;Tuning: %d\n&amp;quot;, frequency);&lt;br /&gt;
&lt;br /&gt;
        dabf.frequency = frequency;&lt;br /&gt;
        if (sid_set) {&lt;br /&gt;
                dabf.sid_set = 1;&lt;br /&gt;
                dabf.sid = sid;&lt;br /&gt;
        }&lt;br /&gt;
        if (comp_set) {&lt;br /&gt;
                dabf.comp = comp;&lt;br /&gt;
                dabf.comp_set = 1;&lt;br /&gt;
        }&lt;br /&gt;
        net_ioctl(fd, DAB_SET_FREQUENCY, &amp;amp;dabf);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM/DAB Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Scan Frequencies ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_fmfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else {&lt;br /&gt;
                printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct fm_scan_setup setup;&lt;br /&gt;
                struct fm_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct fm_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct fm_scan_setup));&lt;br /&gt;
                printf(&amp;quot;SCAN SETUP\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, FM_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, FM_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
        //              printf(&amp;quot;LOCK STAT: %x - %d - %d\n&amp;quot;, parameters.status, parameters.VALID, parameters.READFREQ);&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case FM_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        printf(&amp;quot;FREQUENCY: %d &amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%d [LOCKED]\n&amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case FM_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case FM_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != FM_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Set Radio Frequency ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_radio_channel(int fd, int frequency, int tuner) {&lt;br /&gt;
        struct v4l2_frequency freq;&lt;br /&gt;
        memset(&amp;amp;freq, 0x0, sizeof(struct v4l2_frequency));&lt;br /&gt;
        freq.frequency = frequency/1000*16;&lt;br /&gt;
        freq.type = V4L2_TUNER_RADIO;&lt;br /&gt;
        freq.tuner = tuner;&lt;br /&gt;
&lt;br /&gt;
        net_ioctl(fd, VIDIOC_S_FREQUENCY, &amp;amp;freq);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Read RDS Data ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
net_ioctl(rdsfd, FM_RDS_STATUS, &amp;amp;data);&lt;br /&gt;
struct fm_rds_data {&lt;br /&gt;
        uint8_t rdssync; /* rds synchronized */&lt;br /&gt;
        uint8_t pivalid; /* program identification */&lt;br /&gt;
        uint8_t tpptyvalid; /* traffic program  / program type*/&lt;br /&gt;
        uint16_t PI; /* program identification */&lt;br /&gt;
        uint8_t PTY; /* program type */&lt;br /&gt;
        uint8_t data[8]; /* representing the RDS blocks */&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=35</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=35"/>
		<updated>2019-07-29T10:00:44Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* C API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player for X86-64 Bit Linux:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-x86_64-2019-07-28_07_05.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
This API works with Linux and MacOS. The Application needs to be linked against libmcsimple.[so/dylib] which connects via unix domain sockets to the driver service which runs as a server.&lt;br /&gt;
&lt;br /&gt;
==== DAB Scan for Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Scan for Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Tune Service ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_dab_channel(int fd, uint32_t frequency, uint32_t sid, uint8_t sid_set, uint32_t comp, uint8_t comp_set) {&lt;br /&gt;
        struct dab_frequency dabf;&lt;br /&gt;
        memset(&amp;amp;dabf, 0x0, sizeof(struct dab_frequency));&lt;br /&gt;
        if (sid_set &amp;amp;&amp;amp; comp_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x, 0x%x\n&amp;quot;, frequency, sid, comp);&lt;br /&gt;
        else if (sid_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x\n&amp;quot;, frequency, sid);&lt;br /&gt;
        else&lt;br /&gt;
                printf(&amp;quot;Tuning: %d\n&amp;quot;, frequency);&lt;br /&gt;
&lt;br /&gt;
        dabf.frequency = frequency;&lt;br /&gt;
        if (sid_set) {&lt;br /&gt;
                dabf.sid_set = 1;&lt;br /&gt;
                dabf.sid = sid;&lt;br /&gt;
        }&lt;br /&gt;
        if (comp_set) {&lt;br /&gt;
                dabf.comp = comp;&lt;br /&gt;
                dabf.comp_set = 1;&lt;br /&gt;
        }&lt;br /&gt;
        net_ioctl(fd, DAB_SET_FREQUENCY, &amp;amp;dabf);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM/DAB Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Scan Frequencies ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_fmfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else {&lt;br /&gt;
                printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct fm_scan_setup setup;&lt;br /&gt;
                struct fm_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct fm_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct fm_scan_setup));&lt;br /&gt;
                printf(&amp;quot;SCAN SETUP\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, FM_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, FM_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
        //              printf(&amp;quot;LOCK STAT: %x - %d - %d\n&amp;quot;, parameters.status, parameters.VALID, parameters.READFREQ);&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case FM_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        printf(&amp;quot;FREQUENCY: %d &amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%d [LOCKED]\n&amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case FM_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case FM_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != FM_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Set Radio Frequency ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_radio_channel(int fd, int frequency, int tuner) {&lt;br /&gt;
        struct v4l2_frequency freq;&lt;br /&gt;
        memset(&amp;amp;freq, 0x0, sizeof(struct v4l2_frequency));&lt;br /&gt;
        freq.frequency = frequency/1000*16;&lt;br /&gt;
        freq.type = V4L2_TUNER_RADIO;&lt;br /&gt;
        freq.tuner = tuner;&lt;br /&gt;
&lt;br /&gt;
        net_ioctl(fd, VIDIOC_S_FREQUENCY, &amp;amp;freq);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Read RDS Data ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
net_ioctl(rdsfd, FM_RDS_STATUS, &amp;amp;data);&lt;br /&gt;
struct fm_rds_data {&lt;br /&gt;
        uint8_t rdssync; /* rds synchronized */&lt;br /&gt;
        uint8_t pivalid; /* program identification */&lt;br /&gt;
        uint8_t tpptyvalid; /* traffic program  / program type*/&lt;br /&gt;
        uint16_t PI; /* program identification */&lt;br /&gt;
        uint8_t PTY; /* program type */&lt;br /&gt;
        uint8_t data[8]; /* representing the RDS blocks */&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=34</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=34"/>
		<updated>2019-07-29T09:58:55Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* DAB Get Date */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player for X86-64 Bit Linux:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-x86_64-2019-07-28_07_05.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== DAB Scan for Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Scan for Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Tune Service ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_dab_channel(int fd, uint32_t frequency, uint32_t sid, uint8_t sid_set, uint32_t comp, uint8_t comp_set) {&lt;br /&gt;
        struct dab_frequency dabf;&lt;br /&gt;
        memset(&amp;amp;dabf, 0x0, sizeof(struct dab_frequency));&lt;br /&gt;
        if (sid_set &amp;amp;&amp;amp; comp_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x, 0x%x\n&amp;quot;, frequency, sid, comp);&lt;br /&gt;
        else if (sid_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x\n&amp;quot;, frequency, sid);&lt;br /&gt;
        else&lt;br /&gt;
                printf(&amp;quot;Tuning: %d\n&amp;quot;, frequency);&lt;br /&gt;
&lt;br /&gt;
        dabf.frequency = frequency;&lt;br /&gt;
        if (sid_set) {&lt;br /&gt;
                dabf.sid_set = 1;&lt;br /&gt;
                dabf.sid = sid;&lt;br /&gt;
        }&lt;br /&gt;
        if (comp_set) {&lt;br /&gt;
                dabf.comp = comp;&lt;br /&gt;
                dabf.comp_set = 1;&lt;br /&gt;
        }&lt;br /&gt;
        net_ioctl(fd, DAB_SET_FREQUENCY, &amp;amp;dabf);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM/DAB Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Scan Frequencies ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_fmfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else {&lt;br /&gt;
                printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct fm_scan_setup setup;&lt;br /&gt;
                struct fm_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct fm_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct fm_scan_setup));&lt;br /&gt;
                printf(&amp;quot;SCAN SETUP\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, FM_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, FM_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
        //              printf(&amp;quot;LOCK STAT: %x - %d - %d\n&amp;quot;, parameters.status, parameters.VALID, parameters.READFREQ);&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case FM_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        printf(&amp;quot;FREQUENCY: %d &amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%d [LOCKED]\n&amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case FM_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case FM_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != FM_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Set Radio Frequency ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_radio_channel(int fd, int frequency, int tuner) {&lt;br /&gt;
        struct v4l2_frequency freq;&lt;br /&gt;
        memset(&amp;amp;freq, 0x0, sizeof(struct v4l2_frequency));&lt;br /&gt;
        freq.frequency = frequency/1000*16;&lt;br /&gt;
        freq.type = V4L2_TUNER_RADIO;&lt;br /&gt;
        freq.tuner = tuner;&lt;br /&gt;
&lt;br /&gt;
        net_ioctl(fd, VIDIOC_S_FREQUENCY, &amp;amp;freq);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Read RDS Data ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
net_ioctl(rdsfd, FM_RDS_STATUS, &amp;amp;data);&lt;br /&gt;
struct fm_rds_data {&lt;br /&gt;
        uint8_t rdssync; /* rds synchronized */&lt;br /&gt;
        uint8_t pivalid; /* program identification */&lt;br /&gt;
        uint8_t tpptyvalid; /* traffic program  / program type*/&lt;br /&gt;
        uint16_t PI; /* program identification */&lt;br /&gt;
        uint8_t PTY; /* program type */&lt;br /&gt;
        uint8_t data[8]; /* representing the RDS blocks */&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=33</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=33"/>
		<updated>2019-07-29T09:58:22Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* Scan for DAB Frequencies */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player for X86-64 Bit Linux:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-x86_64-2019-07-28_07_05.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== DAB Scan for Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Scan for Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Tune Service ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_dab_channel(int fd, uint32_t frequency, uint32_t sid, uint8_t sid_set, uint32_t comp, uint8_t comp_set) {&lt;br /&gt;
        struct dab_frequency dabf;&lt;br /&gt;
        memset(&amp;amp;dabf, 0x0, sizeof(struct dab_frequency));&lt;br /&gt;
        if (sid_set &amp;amp;&amp;amp; comp_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x, 0x%x\n&amp;quot;, frequency, sid, comp);&lt;br /&gt;
        else if (sid_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x\n&amp;quot;, frequency, sid);&lt;br /&gt;
        else&lt;br /&gt;
                printf(&amp;quot;Tuning: %d\n&amp;quot;, frequency);&lt;br /&gt;
&lt;br /&gt;
        dabf.frequency = frequency;&lt;br /&gt;
        if (sid_set) {&lt;br /&gt;
                dabf.sid_set = 1;&lt;br /&gt;
                dabf.sid = sid;&lt;br /&gt;
        }&lt;br /&gt;
        if (comp_set) {&lt;br /&gt;
                dabf.comp = comp;&lt;br /&gt;
                dabf.comp_set = 1;&lt;br /&gt;
        }&lt;br /&gt;
        net_ioctl(fd, DAB_SET_FREQUENCY, &amp;amp;dabf);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM/DAB Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Scan Frequencies ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_fmfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else {&lt;br /&gt;
                printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct fm_scan_setup setup;&lt;br /&gt;
                struct fm_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct fm_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct fm_scan_setup));&lt;br /&gt;
                printf(&amp;quot;SCAN SETUP\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, FM_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, FM_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
        //              printf(&amp;quot;LOCK STAT: %x - %d - %d\n&amp;quot;, parameters.status, parameters.VALID, parameters.READFREQ);&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case FM_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        printf(&amp;quot;FREQUENCY: %d &amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%d [LOCKED]\n&amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case FM_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case FM_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != FM_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Set Radio Frequency ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_radio_channel(int fd, int frequency, int tuner) {&lt;br /&gt;
        struct v4l2_frequency freq;&lt;br /&gt;
        memset(&amp;amp;freq, 0x0, sizeof(struct v4l2_frequency));&lt;br /&gt;
        freq.frequency = frequency/1000*16;&lt;br /&gt;
        freq.type = V4L2_TUNER_RADIO;&lt;br /&gt;
        freq.tuner = tuner;&lt;br /&gt;
&lt;br /&gt;
        net_ioctl(fd, VIDIOC_S_FREQUENCY, &amp;amp;freq);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Read RDS Data ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
net_ioctl(rdsfd, FM_RDS_STATUS, &amp;amp;data);&lt;br /&gt;
struct fm_rds_data {&lt;br /&gt;
        uint8_t rdssync; /* rds synchronized */&lt;br /&gt;
        uint8_t pivalid; /* program identification */&lt;br /&gt;
        uint8_t tpptyvalid; /* traffic program  / program type*/&lt;br /&gt;
        uint16_t PI; /* program identification */&lt;br /&gt;
        uint8_t PTY; /* program type */&lt;br /&gt;
        uint8_t data[8]; /* representing the RDS blocks */&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=32</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=32"/>
		<updated>2019-07-29T09:58:05Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* Scan for DAB Services */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player for X86-64 Bit Linux:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-x86_64-2019-07-28_07_05.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== DAB Scan for Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Tune Service ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_dab_channel(int fd, uint32_t frequency, uint32_t sid, uint8_t sid_set, uint32_t comp, uint8_t comp_set) {&lt;br /&gt;
        struct dab_frequency dabf;&lt;br /&gt;
        memset(&amp;amp;dabf, 0x0, sizeof(struct dab_frequency));&lt;br /&gt;
        if (sid_set &amp;amp;&amp;amp; comp_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x, 0x%x\n&amp;quot;, frequency, sid, comp);&lt;br /&gt;
        else if (sid_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x\n&amp;quot;, frequency, sid);&lt;br /&gt;
        else&lt;br /&gt;
                printf(&amp;quot;Tuning: %d\n&amp;quot;, frequency);&lt;br /&gt;
&lt;br /&gt;
        dabf.frequency = frequency;&lt;br /&gt;
        if (sid_set) {&lt;br /&gt;
                dabf.sid_set = 1;&lt;br /&gt;
                dabf.sid = sid;&lt;br /&gt;
        }&lt;br /&gt;
        if (comp_set) {&lt;br /&gt;
                dabf.comp = comp;&lt;br /&gt;
                dabf.comp_set = 1;&lt;br /&gt;
        }&lt;br /&gt;
        net_ioctl(fd, DAB_SET_FREQUENCY, &amp;amp;dabf);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM/DAB Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Scan Frequencies ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_fmfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else {&lt;br /&gt;
                printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct fm_scan_setup setup;&lt;br /&gt;
                struct fm_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct fm_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct fm_scan_setup));&lt;br /&gt;
                printf(&amp;quot;SCAN SETUP\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, FM_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, FM_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
        //              printf(&amp;quot;LOCK STAT: %x - %d - %d\n&amp;quot;, parameters.status, parameters.VALID, parameters.READFREQ);&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case FM_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        printf(&amp;quot;FREQUENCY: %d &amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%d [LOCKED]\n&amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case FM_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case FM_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != FM_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Set Radio Frequency ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_radio_channel(int fd, int frequency, int tuner) {&lt;br /&gt;
        struct v4l2_frequency freq;&lt;br /&gt;
        memset(&amp;amp;freq, 0x0, sizeof(struct v4l2_frequency));&lt;br /&gt;
        freq.frequency = frequency/1000*16;&lt;br /&gt;
        freq.type = V4L2_TUNER_RADIO;&lt;br /&gt;
        freq.tuner = tuner;&lt;br /&gt;
&lt;br /&gt;
        net_ioctl(fd, VIDIOC_S_FREQUENCY, &amp;amp;freq);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Read RDS Data ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
net_ioctl(rdsfd, FM_RDS_STATUS, &amp;amp;data);&lt;br /&gt;
struct fm_rds_data {&lt;br /&gt;
        uint8_t rdssync; /* rds synchronized */&lt;br /&gt;
        uint8_t pivalid; /* program identification */&lt;br /&gt;
        uint8_t tpptyvalid; /* traffic program  / program type*/&lt;br /&gt;
        uint16_t PI; /* program identification */&lt;br /&gt;
        uint8_t PTY; /* program type */&lt;br /&gt;
        uint8_t data[8]; /* representing the RDS blocks */&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=31</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=31"/>
		<updated>2019-07-29T09:57:43Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* Read RDS Data */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player for X86-64 Bit Linux:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-x86_64-2019-07-28_07_05.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Tune Service ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_dab_channel(int fd, uint32_t frequency, uint32_t sid, uint8_t sid_set, uint32_t comp, uint8_t comp_set) {&lt;br /&gt;
        struct dab_frequency dabf;&lt;br /&gt;
        memset(&amp;amp;dabf, 0x0, sizeof(struct dab_frequency));&lt;br /&gt;
        if (sid_set &amp;amp;&amp;amp; comp_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x, 0x%x\n&amp;quot;, frequency, sid, comp);&lt;br /&gt;
        else if (sid_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x\n&amp;quot;, frequency, sid);&lt;br /&gt;
        else&lt;br /&gt;
                printf(&amp;quot;Tuning: %d\n&amp;quot;, frequency);&lt;br /&gt;
&lt;br /&gt;
        dabf.frequency = frequency;&lt;br /&gt;
        if (sid_set) {&lt;br /&gt;
                dabf.sid_set = 1;&lt;br /&gt;
                dabf.sid = sid;&lt;br /&gt;
        }&lt;br /&gt;
        if (comp_set) {&lt;br /&gt;
                dabf.comp = comp;&lt;br /&gt;
                dabf.comp_set = 1;&lt;br /&gt;
        }&lt;br /&gt;
        net_ioctl(fd, DAB_SET_FREQUENCY, &amp;amp;dabf);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM/DAB Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Scan Frequencies ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_fmfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else {&lt;br /&gt;
                printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct fm_scan_setup setup;&lt;br /&gt;
                struct fm_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct fm_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct fm_scan_setup));&lt;br /&gt;
                printf(&amp;quot;SCAN SETUP\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, FM_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, FM_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
        //              printf(&amp;quot;LOCK STAT: %x - %d - %d\n&amp;quot;, parameters.status, parameters.VALID, parameters.READFREQ);&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case FM_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        printf(&amp;quot;FREQUENCY: %d &amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%d [LOCKED]\n&amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case FM_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case FM_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != FM_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Set Radio Frequency ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_radio_channel(int fd, int frequency, int tuner) {&lt;br /&gt;
        struct v4l2_frequency freq;&lt;br /&gt;
        memset(&amp;amp;freq, 0x0, sizeof(struct v4l2_frequency));&lt;br /&gt;
        freq.frequency = frequency/1000*16;&lt;br /&gt;
        freq.type = V4L2_TUNER_RADIO;&lt;br /&gt;
        freq.tuner = tuner;&lt;br /&gt;
&lt;br /&gt;
        net_ioctl(fd, VIDIOC_S_FREQUENCY, &amp;amp;freq);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Read RDS Data ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
net_ioctl(rdsfd, FM_RDS_STATUS, &amp;amp;data);&lt;br /&gt;
struct fm_rds_data {&lt;br /&gt;
        uint8_t rdssync; /* rds synchronized */&lt;br /&gt;
        uint8_t pivalid; /* program identification */&lt;br /&gt;
        uint8_t tpptyvalid; /* traffic program  / program type*/&lt;br /&gt;
        uint16_t PI; /* program identification */&lt;br /&gt;
        uint8_t PTY; /* program type */&lt;br /&gt;
        uint8_t data[8]; /* representing the RDS blocks */&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=30</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=30"/>
		<updated>2019-07-29T09:57:34Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* Set FM Radio Frequency */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player for X86-64 Bit Linux:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-x86_64-2019-07-28_07_05.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Tune Service ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_dab_channel(int fd, uint32_t frequency, uint32_t sid, uint8_t sid_set, uint32_t comp, uint8_t comp_set) {&lt;br /&gt;
        struct dab_frequency dabf;&lt;br /&gt;
        memset(&amp;amp;dabf, 0x0, sizeof(struct dab_frequency));&lt;br /&gt;
        if (sid_set &amp;amp;&amp;amp; comp_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x, 0x%x\n&amp;quot;, frequency, sid, comp);&lt;br /&gt;
        else if (sid_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x\n&amp;quot;, frequency, sid);&lt;br /&gt;
        else&lt;br /&gt;
                printf(&amp;quot;Tuning: %d\n&amp;quot;, frequency);&lt;br /&gt;
&lt;br /&gt;
        dabf.frequency = frequency;&lt;br /&gt;
        if (sid_set) {&lt;br /&gt;
                dabf.sid_set = 1;&lt;br /&gt;
                dabf.sid = sid;&lt;br /&gt;
        }&lt;br /&gt;
        if (comp_set) {&lt;br /&gt;
                dabf.comp = comp;&lt;br /&gt;
                dabf.comp_set = 1;&lt;br /&gt;
        }&lt;br /&gt;
        net_ioctl(fd, DAB_SET_FREQUENCY, &amp;amp;dabf);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM/DAB Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Scan Frequencies ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_fmfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else {&lt;br /&gt;
                printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct fm_scan_setup setup;&lt;br /&gt;
                struct fm_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct fm_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct fm_scan_setup));&lt;br /&gt;
                printf(&amp;quot;SCAN SETUP\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, FM_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, FM_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
        //              printf(&amp;quot;LOCK STAT: %x - %d - %d\n&amp;quot;, parameters.status, parameters.VALID, parameters.READFREQ);&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case FM_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        printf(&amp;quot;FREQUENCY: %d &amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%d [LOCKED]\n&amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case FM_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case FM_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != FM_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Set Radio Frequency ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_radio_channel(int fd, int frequency, int tuner) {&lt;br /&gt;
        struct v4l2_frequency freq;&lt;br /&gt;
        memset(&amp;amp;freq, 0x0, sizeof(struct v4l2_frequency));&lt;br /&gt;
        freq.frequency = frequency/1000*16;&lt;br /&gt;
        freq.type = V4L2_TUNER_RADIO;&lt;br /&gt;
        freq.tuner = tuner;&lt;br /&gt;
&lt;br /&gt;
        net_ioctl(fd, VIDIOC_S_FREQUENCY, &amp;amp;freq);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Read RDS Data ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
net_ioctl(rdsfd, FM_RDS_STATUS, &amp;amp;data);&lt;br /&gt;
struct fm_rds_data {&lt;br /&gt;
        uint8_t rdssync; /* rds synchronized */&lt;br /&gt;
        uint8_t pivalid; /* program identification */&lt;br /&gt;
        uint8_t tpptyvalid; /* traffic program  / program type*/&lt;br /&gt;
        uint16_t PI; /* program identification */&lt;br /&gt;
        uint8_t PTY; /* program type */&lt;br /&gt;
        uint8_t data[8]; /* representing the RDS blocks */&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=29</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=29"/>
		<updated>2019-07-29T09:57:22Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* Scan FM Frequencies */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player for X86-64 Bit Linux:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-x86_64-2019-07-28_07_05.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Tune Service ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_dab_channel(int fd, uint32_t frequency, uint32_t sid, uint8_t sid_set, uint32_t comp, uint8_t comp_set) {&lt;br /&gt;
        struct dab_frequency dabf;&lt;br /&gt;
        memset(&amp;amp;dabf, 0x0, sizeof(struct dab_frequency));&lt;br /&gt;
        if (sid_set &amp;amp;&amp;amp; comp_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x, 0x%x\n&amp;quot;, frequency, sid, comp);&lt;br /&gt;
        else if (sid_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x\n&amp;quot;, frequency, sid);&lt;br /&gt;
        else&lt;br /&gt;
                printf(&amp;quot;Tuning: %d\n&amp;quot;, frequency);&lt;br /&gt;
&lt;br /&gt;
        dabf.frequency = frequency;&lt;br /&gt;
        if (sid_set) {&lt;br /&gt;
                dabf.sid_set = 1;&lt;br /&gt;
                dabf.sid = sid;&lt;br /&gt;
        }&lt;br /&gt;
        if (comp_set) {&lt;br /&gt;
                dabf.comp = comp;&lt;br /&gt;
                dabf.comp_set = 1;&lt;br /&gt;
        }&lt;br /&gt;
        net_ioctl(fd, DAB_SET_FREQUENCY, &amp;amp;dabf);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM/DAB Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM Scan Frequencies ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_fmfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else {&lt;br /&gt;
                printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct fm_scan_setup setup;&lt;br /&gt;
                struct fm_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct fm_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct fm_scan_setup));&lt;br /&gt;
                printf(&amp;quot;SCAN SETUP\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, FM_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, FM_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
        //              printf(&amp;quot;LOCK STAT: %x - %d - %d\n&amp;quot;, parameters.status, parameters.VALID, parameters.READFREQ);&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case FM_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        printf(&amp;quot;FREQUENCY: %d &amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%d [LOCKED]\n&amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case FM_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case FM_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != FM_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Set FM Radio Frequency ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_radio_channel(int fd, int frequency, int tuner) {&lt;br /&gt;
        struct v4l2_frequency freq;&lt;br /&gt;
        memset(&amp;amp;freq, 0x0, sizeof(struct v4l2_frequency));&lt;br /&gt;
        freq.frequency = frequency/1000*16;&lt;br /&gt;
        freq.type = V4L2_TUNER_RADIO;&lt;br /&gt;
        freq.tuner = tuner;&lt;br /&gt;
&lt;br /&gt;
        net_ioctl(fd, VIDIOC_S_FREQUENCY, &amp;amp;freq);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Read RDS Data ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
net_ioctl(rdsfd, FM_RDS_STATUS, &amp;amp;data);&lt;br /&gt;
struct fm_rds_data {&lt;br /&gt;
        uint8_t rdssync; /* rds synchronized */&lt;br /&gt;
        uint8_t pivalid; /* program identification */&lt;br /&gt;
        uint8_t tpptyvalid; /* traffic program  / program type*/&lt;br /&gt;
        uint16_t PI; /* program identification */&lt;br /&gt;
        uint8_t PTY; /* program type */&lt;br /&gt;
        uint8_t data[8]; /* representing the RDS blocks */&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=28</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=28"/>
		<updated>2019-07-29T09:57:12Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* Mute */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player for X86-64 Bit Linux:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-x86_64-2019-07-28_07_05.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Tune Service ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_dab_channel(int fd, uint32_t frequency, uint32_t sid, uint8_t sid_set, uint32_t comp, uint8_t comp_set) {&lt;br /&gt;
        struct dab_frequency dabf;&lt;br /&gt;
        memset(&amp;amp;dabf, 0x0, sizeof(struct dab_frequency));&lt;br /&gt;
        if (sid_set &amp;amp;&amp;amp; comp_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x, 0x%x\n&amp;quot;, frequency, sid, comp);&lt;br /&gt;
        else if (sid_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x\n&amp;quot;, frequency, sid);&lt;br /&gt;
        else&lt;br /&gt;
                printf(&amp;quot;Tuning: %d\n&amp;quot;, frequency);&lt;br /&gt;
&lt;br /&gt;
        dabf.frequency = frequency;&lt;br /&gt;
        if (sid_set) {&lt;br /&gt;
                dabf.sid_set = 1;&lt;br /&gt;
                dabf.sid = sid;&lt;br /&gt;
        }&lt;br /&gt;
        if (comp_set) {&lt;br /&gt;
                dabf.comp = comp;&lt;br /&gt;
                dabf.comp_set = 1;&lt;br /&gt;
        }&lt;br /&gt;
        net_ioctl(fd, DAB_SET_FREQUENCY, &amp;amp;dabf);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== FM/DAB Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Scan FM Frequencies ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_fmfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else {&lt;br /&gt;
                printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct fm_scan_setup setup;&lt;br /&gt;
                struct fm_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct fm_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct fm_scan_setup));&lt;br /&gt;
                printf(&amp;quot;SCAN SETUP\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, FM_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, FM_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
        //              printf(&amp;quot;LOCK STAT: %x - %d - %d\n&amp;quot;, parameters.status, parameters.VALID, parameters.READFREQ);&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case FM_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        printf(&amp;quot;FREQUENCY: %d &amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%d [LOCKED]\n&amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case FM_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case FM_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != FM_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Set FM Radio Frequency ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_radio_channel(int fd, int frequency, int tuner) {&lt;br /&gt;
        struct v4l2_frequency freq;&lt;br /&gt;
        memset(&amp;amp;freq, 0x0, sizeof(struct v4l2_frequency));&lt;br /&gt;
        freq.frequency = frequency/1000*16;&lt;br /&gt;
        freq.type = V4L2_TUNER_RADIO;&lt;br /&gt;
        freq.tuner = tuner;&lt;br /&gt;
&lt;br /&gt;
        net_ioctl(fd, VIDIOC_S_FREQUENCY, &amp;amp;freq);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Read RDS Data ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
net_ioctl(rdsfd, FM_RDS_STATUS, &amp;amp;data);&lt;br /&gt;
struct fm_rds_data {&lt;br /&gt;
        uint8_t rdssync; /* rds synchronized */&lt;br /&gt;
        uint8_t pivalid; /* program identification */&lt;br /&gt;
        uint8_t tpptyvalid; /* traffic program  / program type*/&lt;br /&gt;
        uint16_t PI; /* program identification */&lt;br /&gt;
        uint8_t PTY; /* program type */&lt;br /&gt;
        uint8_t data[8]; /* representing the RDS blocks */&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=27</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=27"/>
		<updated>2019-07-29T09:57:02Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* Tune DAB Service */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player for X86-64 Bit Linux:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-x86_64-2019-07-28_07_05.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Tune Service ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_dab_channel(int fd, uint32_t frequency, uint32_t sid, uint8_t sid_set, uint32_t comp, uint8_t comp_set) {&lt;br /&gt;
        struct dab_frequency dabf;&lt;br /&gt;
        memset(&amp;amp;dabf, 0x0, sizeof(struct dab_frequency));&lt;br /&gt;
        if (sid_set &amp;amp;&amp;amp; comp_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x, 0x%x\n&amp;quot;, frequency, sid, comp);&lt;br /&gt;
        else if (sid_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x\n&amp;quot;, frequency, sid);&lt;br /&gt;
        else&lt;br /&gt;
                printf(&amp;quot;Tuning: %d\n&amp;quot;, frequency);&lt;br /&gt;
&lt;br /&gt;
        dabf.frequency = frequency;&lt;br /&gt;
        if (sid_set) {&lt;br /&gt;
                dabf.sid_set = 1;&lt;br /&gt;
                dabf.sid = sid;&lt;br /&gt;
        }&lt;br /&gt;
        if (comp_set) {&lt;br /&gt;
                dabf.comp = comp;&lt;br /&gt;
                dabf.comp_set = 1;&lt;br /&gt;
        }&lt;br /&gt;
        net_ioctl(fd, DAB_SET_FREQUENCY, &amp;amp;dabf);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Scan FM Frequencies ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_fmfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else {&lt;br /&gt;
                printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct fm_scan_setup setup;&lt;br /&gt;
                struct fm_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct fm_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct fm_scan_setup));&lt;br /&gt;
                printf(&amp;quot;SCAN SETUP\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, FM_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, FM_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
        //              printf(&amp;quot;LOCK STAT: %x - %d - %d\n&amp;quot;, parameters.status, parameters.VALID, parameters.READFREQ);&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case FM_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        printf(&amp;quot;FREQUENCY: %d &amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%d [LOCKED]\n&amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case FM_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case FM_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != FM_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Set FM Radio Frequency ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_radio_channel(int fd, int frequency, int tuner) {&lt;br /&gt;
        struct v4l2_frequency freq;&lt;br /&gt;
        memset(&amp;amp;freq, 0x0, sizeof(struct v4l2_frequency));&lt;br /&gt;
        freq.frequency = frequency/1000*16;&lt;br /&gt;
        freq.type = V4L2_TUNER_RADIO;&lt;br /&gt;
        freq.tuner = tuner;&lt;br /&gt;
&lt;br /&gt;
        net_ioctl(fd, VIDIOC_S_FREQUENCY, &amp;amp;freq);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Read RDS Data ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
net_ioctl(rdsfd, FM_RDS_STATUS, &amp;amp;data);&lt;br /&gt;
struct fm_rds_data {&lt;br /&gt;
        uint8_t rdssync; /* rds synchronized */&lt;br /&gt;
        uint8_t pivalid; /* program identification */&lt;br /&gt;
        uint8_t tpptyvalid; /* traffic program  / program type*/&lt;br /&gt;
        uint16_t PI; /* program identification */&lt;br /&gt;
        uint8_t PTY; /* program type */&lt;br /&gt;
        uint8_t data[8]; /* representing the RDS blocks */&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=26</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=26"/>
		<updated>2019-07-29T09:56:29Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* DAB get Ensemble Info */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player for X86-64 Bit Linux:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-x86_64-2019-07-28_07_05.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Tune DAB Service ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_dab_channel(int fd, uint32_t frequency, uint32_t sid, uint8_t sid_set, uint32_t comp, uint8_t comp_set) {&lt;br /&gt;
        struct dab_frequency dabf;&lt;br /&gt;
        memset(&amp;amp;dabf, 0x0, sizeof(struct dab_frequency));&lt;br /&gt;
        if (sid_set &amp;amp;&amp;amp; comp_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x, 0x%x\n&amp;quot;, frequency, sid, comp);&lt;br /&gt;
        else if (sid_set)&lt;br /&gt;
                printf(&amp;quot;Tuning: %d, 0x%x\n&amp;quot;, frequency, sid);&lt;br /&gt;
        else&lt;br /&gt;
                printf(&amp;quot;Tuning: %d\n&amp;quot;, frequency);&lt;br /&gt;
&lt;br /&gt;
        dabf.frequency = frequency;&lt;br /&gt;
        if (sid_set) {&lt;br /&gt;
                dabf.sid_set = 1;&lt;br /&gt;
                dabf.sid = sid;&lt;br /&gt;
        }&lt;br /&gt;
        if (comp_set) {&lt;br /&gt;
                dabf.comp = comp;&lt;br /&gt;
                dabf.comp_set = 1;&lt;br /&gt;
        }&lt;br /&gt;
        net_ioctl(fd, DAB_SET_FREQUENCY, &amp;amp;dabf);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Scan FM Frequencies ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_fmfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else {&lt;br /&gt;
                printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct fm_scan_setup setup;&lt;br /&gt;
                struct fm_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct fm_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct fm_scan_setup));&lt;br /&gt;
                printf(&amp;quot;SCAN SETUP\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, FM_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, FM_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
        //              printf(&amp;quot;LOCK STAT: %x - %d - %d\n&amp;quot;, parameters.status, parameters.VALID, parameters.READFREQ);&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case FM_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        printf(&amp;quot;FREQUENCY: %d &amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%d [LOCKED]\n&amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case FM_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case FM_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != FM_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Set FM Radio Frequency ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_radio_channel(int fd, int frequency, int tuner) {&lt;br /&gt;
        struct v4l2_frequency freq;&lt;br /&gt;
        memset(&amp;amp;freq, 0x0, sizeof(struct v4l2_frequency));&lt;br /&gt;
        freq.frequency = frequency/1000*16;&lt;br /&gt;
        freq.type = V4L2_TUNER_RADIO;&lt;br /&gt;
        freq.tuner = tuner;&lt;br /&gt;
&lt;br /&gt;
        net_ioctl(fd, VIDIOC_S_FREQUENCY, &amp;amp;freq);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Read RDS Data ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
net_ioctl(rdsfd, FM_RDS_STATUS, &amp;amp;data);&lt;br /&gt;
struct fm_rds_data {&lt;br /&gt;
        uint8_t rdssync; /* rds synchronized */&lt;br /&gt;
        uint8_t pivalid; /* program identification */&lt;br /&gt;
        uint8_t tpptyvalid; /* traffic program  / program type*/&lt;br /&gt;
        uint16_t PI; /* program identification */&lt;br /&gt;
        uint8_t PTY; /* program type */&lt;br /&gt;
        uint8_t data[8]; /* representing the RDS blocks */&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=25</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=25"/>
		<updated>2019-07-29T09:55:42Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* Set FM Radio Frequency */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player for X86-64 Bit Linux:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-x86_64-2019-07-28_07_05.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Scan FM Frequencies ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_fmfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else {&lt;br /&gt;
                printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct fm_scan_setup setup;&lt;br /&gt;
                struct fm_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct fm_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct fm_scan_setup));&lt;br /&gt;
                printf(&amp;quot;SCAN SETUP\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, FM_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, FM_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
        //              printf(&amp;quot;LOCK STAT: %x - %d - %d\n&amp;quot;, parameters.status, parameters.VALID, parameters.READFREQ);&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case FM_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        printf(&amp;quot;FREQUENCY: %d &amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%d [LOCKED]\n&amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case FM_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case FM_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != FM_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Set FM Radio Frequency ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_radio_channel(int fd, int frequency, int tuner) {&lt;br /&gt;
        struct v4l2_frequency freq;&lt;br /&gt;
        memset(&amp;amp;freq, 0x0, sizeof(struct v4l2_frequency));&lt;br /&gt;
        freq.frequency = frequency/1000*16;&lt;br /&gt;
        freq.type = V4L2_TUNER_RADIO;&lt;br /&gt;
        freq.tuner = tuner;&lt;br /&gt;
&lt;br /&gt;
        net_ioctl(fd, VIDIOC_S_FREQUENCY, &amp;amp;freq);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Read RDS Data ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
net_ioctl(rdsfd, FM_RDS_STATUS, &amp;amp;data);&lt;br /&gt;
struct fm_rds_data {&lt;br /&gt;
        uint8_t rdssync; /* rds synchronized */&lt;br /&gt;
        uint8_t pivalid; /* program identification */&lt;br /&gt;
        uint8_t tpptyvalid; /* traffic program  / program type*/&lt;br /&gt;
        uint16_t PI; /* program identification */&lt;br /&gt;
        uint8_t PTY; /* program type */&lt;br /&gt;
        uint8_t data[8]; /* representing the RDS blocks */&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=24</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=24"/>
		<updated>2019-07-29T09:55:22Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* Read RDS Data */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player for X86-64 Bit Linux:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-x86_64-2019-07-28_07_05.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Scan FM Frequencies ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_fmfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else {&lt;br /&gt;
                printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct fm_scan_setup setup;&lt;br /&gt;
                struct fm_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct fm_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct fm_scan_setup));&lt;br /&gt;
                printf(&amp;quot;SCAN SETUP\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, FM_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, FM_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
        //              printf(&amp;quot;LOCK STAT: %x - %d - %d\n&amp;quot;, parameters.status, parameters.VALID, parameters.READFREQ);&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case FM_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        printf(&amp;quot;FREQUENCY: %d &amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%d [LOCKED]\n&amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case FM_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case FM_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != FM_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Set FM Radio Frequency ====&lt;br /&gt;
&lt;br /&gt;
int set_radio_channel(int fd, int frequency, int tuner) {&lt;br /&gt;
        struct v4l2_frequency freq;&lt;br /&gt;
        memset(&amp;amp;freq, 0x0, sizeof(struct v4l2_frequency));&lt;br /&gt;
        freq.frequency = frequency/1000*16;&lt;br /&gt;
        freq.type = V4L2_TUNER_RADIO;&lt;br /&gt;
        freq.tuner = tuner;&lt;br /&gt;
&lt;br /&gt;
        net_ioctl(fd, VIDIOC_S_FREQUENCY, &amp;amp;freq);&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Read RDS Data ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
net_ioctl(rdsfd, FM_RDS_STATUS, &amp;amp;data);&lt;br /&gt;
struct fm_rds_data {&lt;br /&gt;
        uint8_t rdssync; /* rds synchronized */&lt;br /&gt;
        uint8_t pivalid; /* program identification */&lt;br /&gt;
        uint8_t tpptyvalid; /* traffic program  / program type*/&lt;br /&gt;
        uint16_t PI; /* program identification */&lt;br /&gt;
        uint8_t PTY; /* program type */&lt;br /&gt;
        uint8_t data[8]; /* representing the RDS blocks */&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=23</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=23"/>
		<updated>2019-07-29T09:54:45Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* Dab get Ensemble Info */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player for X86-64 Bit Linux:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-x86_64-2019-07-28_07_05.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Scan FM Frequencies ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_fmfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else {&lt;br /&gt;
                printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct fm_scan_setup setup;&lt;br /&gt;
                struct fm_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct fm_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct fm_scan_setup));&lt;br /&gt;
                printf(&amp;quot;SCAN SETUP\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, FM_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, FM_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
        //              printf(&amp;quot;LOCK STAT: %x - %d - %d\n&amp;quot;, parameters.status, parameters.VALID, parameters.READFREQ);&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case FM_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        printf(&amp;quot;FREQUENCY: %d &amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%d [LOCKED]\n&amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case FM_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case FM_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != FM_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Read RDS Data ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
net_ioctl(rdsfd, FM_RDS_STATUS, &amp;amp;data);&lt;br /&gt;
struct fm_rds_data {&lt;br /&gt;
        uint8_t rdssync; /* rds synchronized */&lt;br /&gt;
        uint8_t pivalid; /* program identification */&lt;br /&gt;
        uint8_t tpptyvalid; /* traffic program  / program type*/&lt;br /&gt;
        uint16_t PI; /* program identification */&lt;br /&gt;
        uint8_t PTY; /* program type */&lt;br /&gt;
        uint8_t data[8]; /* representing the RDS blocks */&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=22</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=22"/>
		<updated>2019-07-29T09:54:22Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* Mute */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player for X86-64 Bit Linux:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-x86_64-2019-07-28_07_05.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Dab get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Scan FM Frequencies ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_fmfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else {&lt;br /&gt;
                printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct fm_scan_setup setup;&lt;br /&gt;
                struct fm_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct fm_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct fm_scan_setup));&lt;br /&gt;
                printf(&amp;quot;SCAN SETUP\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, FM_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, FM_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
        //              printf(&amp;quot;LOCK STAT: %x - %d - %d\n&amp;quot;, parameters.status, parameters.VALID, parameters.READFREQ);&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case FM_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        printf(&amp;quot;FREQUENCY: %d &amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%d [LOCKED]\n&amp;quot;, parameters.READFREQ);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case FM_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case FM_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != FM_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Read RDS Data ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
net_ioctl(rdsfd, FM_RDS_STATUS, &amp;amp;data);&lt;br /&gt;
struct fm_rds_data {&lt;br /&gt;
        uint8_t rdssync; /* rds synchronized */&lt;br /&gt;
        uint8_t pivalid; /* program identification */&lt;br /&gt;
        uint8_t tpptyvalid; /* traffic program  / program type*/&lt;br /&gt;
        uint16_t PI; /* program identification */&lt;br /&gt;
        uint8_t PTY; /* program type */&lt;br /&gt;
        uint8_t data[8]; /* representing the RDS blocks */&lt;br /&gt;
} __attribute__((packed));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=21</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=21"/>
		<updated>2019-07-28T07:07:38Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* Installation Linux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player for X86-64 Bit Linux:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-x86_64-2019-07-28_07_05.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Dab get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=20</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=20"/>
		<updated>2019-07-28T07:06:34Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* Installation Linux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-x86_64-2019-07-28_07_05.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Dab get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=19</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=19"/>
		<updated>2019-07-28T01:53:48Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* Installation MacOSX */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-fcc2a03-x86_64.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0349.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Dab get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=18</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=18"/>
		<updated>2019-07-28T01:18:47Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* Installation MacOSX */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-fcc2a03-x86_64.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190728.0317.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Dab get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=17</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=17"/>
		<updated>2019-07-28T00:54:32Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* Installation MacOSX */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-fcc2a03-x86_64.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190727.1744.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
The split driver also allows other application developer to integrate and use those devices.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Dab get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=16</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=16"/>
		<updated>2019-07-28T00:53:47Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* Installation MacOSX */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-fcc2a03-x86_64.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190727.1744.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_dab_fm_player_190728.0245.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards run the DAB Player.&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Dab get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=15</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=15"/>
		<updated>2019-07-27T23:42:48Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* Installation Linux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to use our DAB/DAB+ Player:&lt;br /&gt;
&lt;br /&gt;
http://sundtek.de/media/Sundtek_DAB_FM_Radio-fcc2a03-x86_64.AppImage&lt;br /&gt;
&lt;br /&gt;
Be sure you set the downloaded binary to executable before trying to run it (right mouse click, permissions, check executable)&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190727.1744.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/dablet_v0.1.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards dablet_v0.1.dmg&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Dab get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=14</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=14"/>
		<updated>2019-07-27T23:39:34Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* C API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190727.1744.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/dablet_v0.1.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards dablet_v0.1.dmg&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Frequencies ====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Scan for DAB Services ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== DAB Get Date ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Dab get Ensemble Info ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mute ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== etc. ====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=13</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=13"/>
		<updated>2019-07-27T23:38:50Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* scan for DAB/DAB Frequencies */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190727.1744.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/dablet_v0.1.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards dablet_v0.1.dmg&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== scan for DAB/DAB Frequencies ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Scan for DAB Frequencies =====&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Scan for DAB Services =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabservices(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int i=0;&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_service service;&lt;br /&gt;
                printf(&amp;quot;Service Name, Service ID, Component ID\n&amp;quot;);&lt;br /&gt;
                while(1) {&lt;br /&gt;
                        service.id=i++;&lt;br /&gt;
                        rv = net_ioctl(fd, DAB_GET_SERVICE, &amp;amp;service);&lt;br /&gt;
                        if (rv == -1)&lt;br /&gt;
                                break;&lt;br /&gt;
                        printf(&amp;quot;%16s\t0x%x\t0x%x\n&amp;quot;, service.service_name, service.sid, service.comp[0]);&lt;br /&gt;
                }&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== DAB Get Date =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
int media_dab_get_date(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_time t;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        memset(&amp;amp;t, 0x0, sizeof(struct dab_time));&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET DAB TIME:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_TIME, &amp;amp;t);&lt;br /&gt;
                printf(&amp;quot;%d-%d-%d %d:%d:%d\n&amp;quot;, t.year, t.months, t.days, t.hours, t.minutes, t.seconds);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Dab get Ensemble Info =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_dab_get_ensemble_info(char *device) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        struct dab_ensemble_info info;&lt;br /&gt;
        printf(&amp;quot;opening device: %s\n&amp;quot;, device);&lt;br /&gt;
        fd = net_open(device, O_RDWR);&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                printf(&amp;quot;GET ENSEMBLE INFO:\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, DAB_GET_ENSEMBLE_INFO, &amp;amp;info);&lt;br /&gt;
                printf(&amp;quot;Ensemble Label: %s\n&amp;quot;, info.label);&lt;br /&gt;
                net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Mute =====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int set_mute(int fd, char *arg) {&lt;br /&gt;
        int type = 0;&lt;br /&gt;
        struct v4l2_control control;&lt;br /&gt;
        if (strcmp(arg, &amp;quot;off&amp;quot;) == 0) {&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 0;&lt;br /&gt;
                fprintf(stdout, &amp;quot;Enabling audiostream\n&amp;quot;);&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else if (strcmp(arg, &amp;quot;on&amp;quot;) == 0) {&lt;br /&gt;
                fprintf(stdout, &amp;quot;Disabling audiostream\n&amp;quot;);&lt;br /&gt;
                control.id = V4L2_CID_AUDIO_MUTE;&lt;br /&gt;
                control.value = 1;&lt;br /&gt;
                net_ioctl(fd, VIDIOC_S_CTRL, &amp;amp;control);&lt;br /&gt;
        } else&lt;br /&gt;
                fprintf(stdout, &amp;quot;Wrong argument [%s] choose between on|off\n&amp;quot;, arg);&lt;br /&gt;
&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== etc. =====&lt;br /&gt;
&lt;br /&gt;
There are a few more features, in case you need more details just contact us.&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=12</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=12"/>
		<updated>2019-07-27T23:34:28Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
 - https://www.sundtek.de/media/sundtek_driver_macosx_190727.1744.dmg&lt;br /&gt;
 - https://www.sundtek.de/media/dablet_v0.1.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards dablet_v0.1.dmg&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== scan for DAB/DAB Frequencies ====&lt;br /&gt;
&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=11</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=11"/>
		<updated>2019-07-27T23:34:14Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* Installation Raspberry PI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
- https://www.sundtek.de/media/sundtek_driver_macosx_190727.1744.dmg&lt;br /&gt;
- https://www.sundtek.de/media/dablet_v0.1.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards dablet_v0.1.dmg&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
In case you don't want to use our radio application, the installation is the same as on a regular linux system&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
sudo apt-get install qt5-default&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== scan for DAB/DAB Frequencies ====&lt;br /&gt;
&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=10</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=10"/>
		<updated>2019-07-27T23:33:04Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation Linux ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installation MacOSX ===&lt;br /&gt;
&lt;br /&gt;
MacOSX:&lt;br /&gt;
- https://www.sundtek.de/media/sundtek_driver_macosx_190727.1744.dmg&lt;br /&gt;
- https://www.sundtek.de/media/dablet_v0.1.dmg&lt;br /&gt;
&lt;br /&gt;
First install the driver, afterwards dablet_v0.1.dmg&lt;br /&gt;
&lt;br /&gt;
=== Installation Raspberry PI ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Radio Application:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd $HOME&lt;br /&gt;
wget http://sundtek.de/media/dablet_raspbian.tar.gz&lt;br /&gt;
tar xf dablet_raspbian.tar.gz&lt;br /&gt;
./dablet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== scan for DAB/DAB Frequencies ====&lt;br /&gt;
&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=9</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=9"/>
		<updated>2019-07-25T13:25:00Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== C API ===&lt;br /&gt;
&lt;br /&gt;
==== scan for DAB/DAB Frequencies ====&lt;br /&gt;
&lt;br /&gt;
example:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int media_scan_dabfrequencies(char *device, int devfd, int console, int running) {&lt;br /&gt;
        int fd;&lt;br /&gt;
        int rv;&lt;br /&gt;
        int nlen;&lt;br /&gt;
        char tmp[30];&lt;br /&gt;
        if (devfd&amp;gt;=0)&lt;br /&gt;
                fd = devfd;&lt;br /&gt;
        else&lt;br /&gt;
                fd = net_open(device, O_RDWR);&lt;br /&gt;
&lt;br /&gt;
        if (fd&amp;gt;=0) {&lt;br /&gt;
                struct dab_frequency dabf;&lt;br /&gt;
                struct dab_tuner dabt;&lt;br /&gt;
                int i;&lt;br /&gt;
                int e;&lt;br /&gt;
                int current_scan_index=-1;&lt;br /&gt;
                struct dab_scan_setup setup;&lt;br /&gt;
                struct dab_scan_parameters parameters;&lt;br /&gt;
                memset(&amp;amp;parameters, 0x0, sizeof(struct dab_scan_parameters));&lt;br /&gt;
                memset(&amp;amp;setup, 0x0, sizeof(struct dab_scan_setup));&lt;br /&gt;
                net_ioctl(fd, DAB_SCAN_SETUP, &amp;amp;setup);&lt;br /&gt;
&lt;br /&gt;
                do {&lt;br /&gt;
                        net_ioctl(fd, DAB_SCAN_NEXT_FREQUENCY, &amp;amp;parameters);&lt;br /&gt;
                        if (current_scan_index != parameters.scan_index) {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        sprintf(tmp, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        rv=write(console, tmp, nlen);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;%s %d\n&amp;quot;, dab_frequency_list[parameters.scan_index].channel, dab_frequency_list[parameters.scan_index].freq*1000);&lt;br /&gt;
                                        fflush(stdout);&lt;br /&gt;
                                }&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        switch(parameters.status) {&lt;br /&gt;
                        case DAB_SCAN_LOCKED:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[LOCKED]\n&amp;quot;, 9);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;[LOCKED]\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        case DAB_SCAN_SEARCHING:&lt;br /&gt;
                                usleep(10000);&lt;br /&gt;
                                break;&lt;br /&gt;
                        case DAB_SCAN_COMPLETE:&lt;br /&gt;
                        {&lt;br /&gt;
                                if (console&amp;gt;=0) {&lt;br /&gt;
                                        rv=write(console, &amp;quot;[FINISHED]\n&amp;quot;, 11);&lt;br /&gt;
                                } else {&lt;br /&gt;
                                        fprintf(stdout, &amp;quot;\nScan completed\n&amp;quot;);&lt;br /&gt;
                                }&lt;br /&gt;
                                break;&lt;br /&gt;
                        }&lt;br /&gt;
                        }&lt;br /&gt;
                        current_scan_index = parameters.scan_index;&lt;br /&gt;
                        if (console&amp;gt;=0 &amp;amp;&amp;amp; running == 0)&lt;br /&gt;
                                break;&lt;br /&gt;
                } while (parameters.status != DAB_SCAN_COMPLETE);&lt;br /&gt;
&lt;br /&gt;
                if (devfd == -1)&lt;br /&gt;
                        net_close(fd);&lt;br /&gt;
        }&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=8</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=8"/>
		<updated>2019-07-25T13:21:33Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
Currently Linux and MacOS are supported.&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
open a terminal and enter following commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo -s&lt;br /&gt;
wget http://sundtek.de/media/sundtek_netinst.sh&lt;br /&gt;
chmod 777 sundtek_netinst.sh&lt;br /&gt;
./sundtek_netinst.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case you want to distribute the local stations digitally you can also install our streaming server (again on the commandline)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
just run following commands:&lt;br /&gt;
sudo -s&lt;br /&gt;
/opt/bin/mediaclient --installstreamer&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=7</id>
		<title>DAB/DAB+</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DAB/DAB%2B&amp;diff=7"/>
		<updated>2019-07-25T13:20:02Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: Created page with &amp;quot;== DAB/DAB+ ==  The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.  === DAB/DAB+ commandline interface ===...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
The DAB/DAB+ USB Stick decodes DAB/DAB+ onchip and transfers the decoded audio data fully digital to the host system.&lt;br /&gt;
&lt;br /&gt;
=== DAB/DAB+ commandline interface ===&lt;br /&gt;
&lt;br /&gt;
scan for transponders:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabfrequencies /dev/dab0 &lt;br /&gt;
scanning: 5A / 174928000&lt;br /&gt;
scanning: 5B / 176640000&lt;br /&gt;
scanning: 5C / 178352000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 5D / 180064000&lt;br /&gt;
scanning: 6A / 181936000&lt;br /&gt;
scanning: 6B / 183648000&lt;br /&gt;
scanning: 6C / 185360000&lt;br /&gt;
scanning: 6D / 187072000&lt;br /&gt;
scanning: 7A / 188928000&lt;br /&gt;
scanning: 7B / 190640000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 7C / 192352000&lt;br /&gt;
scanning: 7D / 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
scanning: 8A / 195936000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
tune to a transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
turn on direct audio playback in the driver (the driver will try to play back audio via alsa, pulseaudio or oss:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -g off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
scan a dab transponder:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --scandabservices /dev/dab0 &lt;br /&gt;
Service Name, Service ID, Component ID&lt;br /&gt;
BR-Klassik         0xd314   0xb&lt;br /&gt;
Inforadio          0xd335   0x8&lt;br /&gt;
FH Europa          0xd496   0x3&lt;br /&gt;
radioeins          0xd332   0x1&lt;br /&gt;
radioBERLIN 88 8   0xd321   0x6&lt;br /&gt;
kulturradio        0xd323   0x5&lt;br /&gt;
Fritz              0xd333   0x7&lt;br /&gt;
Antenne            0xd431   0x0&lt;br /&gt;
SWR3               0xd3a3   0x4&lt;br /&gt;
Bayern 2           0xd412   0xc&lt;br /&gt;
WDR2               0xd392   0x2&lt;br /&gt;
MDR JUMP           0xd3c2   0xd&lt;br /&gt;
rbb TPEG           0xe0d11019   0xc00a&lt;br /&gt;
rbb EPG            0xe0d01019   0xc009&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tune to a specific DAB station:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DAB -f 194064000 --sid 0xd321&lt;br /&gt;
Using device: /dev/dab0&lt;br /&gt;
Tuning: 194064000, 0xd321&lt;br /&gt;
[LOCKED]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Read signal statistics:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --readsignal=0 -d /dev/dab0&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 14&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 172  SNR:  10 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:  10 FIC_QUALITY: 100 CNR: 13&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
FREQUENCY: 178352000  LOCKED: YES  RSSI: 173  SNR:   9 FIC_QUALITY: 100 CNR: 12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=Main_Page&amp;diff=6</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=Main_Page&amp;diff=6"/>
		<updated>2019-07-25T13:14:54Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;Sundtek Wiki&amp;lt;/strong&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Sundtek SkyTV related topics [[DVB-S/S2/S2X]]&lt;br /&gt;
* Sundtek DAB/DAB+ related topics [[DAB/DAB+]]&lt;br /&gt;
&lt;br /&gt;
== Getting started ==&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
	<entry>
		<id>https://sundtek.com/wiki/index.php?title=DVB-S/S2/S2X&amp;diff=5</id>
		<title>DVB-S/S2/S2X</title>
		<link rel="alternate" type="text/html" href="https://sundtek.com/wiki/index.php?title=DVB-S/S2/S2X&amp;diff=5"/>
		<updated>2019-07-25T13:14:10Z</updated>

		<summary type="html">&lt;p&gt;194.96.9.215: /* DAB/DAB+ via Satellite */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== DAB/DAB+ ==&lt;br /&gt;
&lt;br /&gt;
DAB/DAB+ channels can be found on satellite 7.0 east.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Frequency:12572 MHz&lt;br /&gt;
Symbolrate: 10215000&lt;br /&gt;
Modulation: DVB-S2/QPSK&lt;br /&gt;
Polarization: Vertical&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Locking on Transponder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient -m DVBS2 -f 12572000 -M QPSK -S 10215000 -V V -E 3/4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FileOutput ===&lt;br /&gt;
&lt;br /&gt;
capturing and replaying the stream:&lt;br /&gt;
&lt;br /&gt;
/opt/bin/mediaclient --cat /dev/dvb/adapter0/dvr0 | ../eti-tools/fedi2eti 101 239.16.242.17 60017 | ./odr-dabmod -C doc/example.ini &amp;gt; test.iq&lt;br /&gt;
&lt;br /&gt;
hackrf_transfer -t test.iq -f 180064000  -x  47 -a 1 -s 2048000 -b 1750000&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
example.ini (parts of it):&lt;br /&gt;
&lt;br /&gt;
[output]&lt;br /&gt;
; choose output: possible values: uhd, file, zmq, soapysdr&lt;br /&gt;
output=file&lt;br /&gt;
[fileoutput]&lt;br /&gt;
; Two output formats are supported: In the default mode,&lt;br /&gt;
; the file output writes I/Q float values (i.e. complex&lt;br /&gt;
; float) to the file. The I and Q samples can take values up&lt;br /&gt;
; to 810000 in absolute magnitude with gainmode FIX. With&lt;br /&gt;
; gainmode VAR and FIX, they should never exceed 50000.&lt;br /&gt;
;format=complexf&lt;br /&gt;
;&lt;br /&gt;
; The complexf_normalised format applies a compensation factor to the complexf&lt;br /&gt;
; output to bring the range of the I and Q components to [-1.0 .. 1.0]. The&lt;br /&gt;
; digital_gain is still applied on top of that normalisation.&lt;br /&gt;
;format=complexf_normalised&lt;br /&gt;
;&lt;br /&gt;
; When the format is set to s8, the output writes I/Q 8-bit&lt;br /&gt;
; signed integers, where the magnitude is multiplied by 128/50000&lt;br /&gt;
; effectively mapping the gainmode VAR range of -50000 -- 50000&lt;br /&gt;
; to -128 -- 128. For other gainmodes, use the digital_gain setting&lt;br /&gt;
; to make sure you don't create clipping.&lt;br /&gt;
;&lt;br /&gt;
; The format u8 is the same as s8, except that the values are mapped&lt;br /&gt;
; between 0 and 255. Use u8 for welle.io, qt-dab or other tools.&lt;br /&gt;
;&lt;br /&gt;
; Also supported is s16, with system endianness (little endian on x86_64 and ARM)&lt;br /&gt;
format=s8&lt;br /&gt;
&lt;br /&gt;
; The output file:&lt;br /&gt;
filename=/dev/stdout&lt;br /&gt;
&lt;br /&gt;
show_metadata=0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Soapy Output ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/bin/mediaclient --cat /dev/dvb/adapter0/dvr0 | ../eti-tools/fedi2eti 101 239.16.242.17 60017 | ./odr-dabmod -C doc/example.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[soapyoutput]&lt;br /&gt;
; These options are given to the SoapySDR library:&lt;br /&gt;
device=driver=hackrf&lt;br /&gt;
;master_clock_rate=32768000&lt;br /&gt;
txgain=47&lt;br /&gt;
frequency=180064000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Soapy Config ====&lt;br /&gt;
&lt;br /&gt;
Full Sample configuration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
; Sample configuration file for ODR-DabMod&lt;br /&gt;
&lt;br /&gt;
[remotecontrol]&lt;br /&gt;
; The RC feature is described in detail in doc/README-RC.md&lt;br /&gt;
&lt;br /&gt;
; enable the telnet remote control on localhost:2121&lt;br /&gt;
telnet=1&lt;br /&gt;
telnetport=2121&lt;br /&gt;
&lt;br /&gt;
; Enable zmq remote control.&lt;br /&gt;
zmqctrl=1&lt;br /&gt;
zmqctrlendpoint=tcp://127.0.0.1:9400&lt;br /&gt;
; accepted formats according to man zmq_bind, i.e.&lt;br /&gt;
; tcp://&amp;lt;interface&amp;gt;:&amp;lt;port&amp;gt;, e.g. tcp://lo:9400&lt;br /&gt;
; and tcp://&amp;lt;ipaddress&amp;gt;:&amp;lt;port&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[log]&lt;br /&gt;
; Write to a logfile or to syslog.&lt;br /&gt;
; Setting filename to stderr is not necessary, as all messages are&lt;br /&gt;
; automatically written to stderr.&lt;br /&gt;
syslog=0&lt;br /&gt;
filelog=0&lt;br /&gt;
filename=odr-dabmod.log&lt;br /&gt;
&lt;br /&gt;
[input]&lt;br /&gt;
; A file or fifo input is using transport=file&lt;br /&gt;
transport=file&lt;br /&gt;
source=/dev/stdin&lt;br /&gt;
&lt;br /&gt;
; When the end of file is reached, it is possible to rewind it&lt;br /&gt;
loop=0&lt;br /&gt;
&lt;br /&gt;
; ETI-over-TCP example:&lt;br /&gt;
;transport=tcp&lt;br /&gt;
;source=localhost:9200&lt;br /&gt;
&lt;br /&gt;
; When recieving data using ZeroMQ, the source is the URI to be used&lt;br /&gt;
;transport=zeromq&lt;br /&gt;
;source=tcp://localhost:9100&lt;br /&gt;
; The option max_frames_queued defines the maximum number of ETI frames&lt;br /&gt;
; (frame duration: 24ms) that can be in the input queue&lt;br /&gt;
;max_frames_queued=100&lt;br /&gt;
&lt;br /&gt;
; EDI input.&lt;br /&gt;
; Listen for EDI data on a given UDP port, unicast or multicast.&lt;br /&gt;
;transport=edi&lt;br /&gt;
;&lt;br /&gt;
; EDI over TCP:&lt;br /&gt;
;&lt;br /&gt;
; Connect to TCP server on a given host&lt;br /&gt;
;source=tcp://localhost:9201&lt;br /&gt;
;&lt;br /&gt;
; EDI over UDP:&lt;br /&gt;
;&lt;br /&gt;
; Supported syntax for the source setting:&lt;br /&gt;
;  Bind to default interface and receive data from port 12000&lt;br /&gt;
;source=udp://:12000&lt;br /&gt;
;&lt;br /&gt;
;  Bind to interface with IP:192.168.1.22 and receive data from port 12000&lt;br /&gt;
;source=udp://192.168.1.22:12000&lt;br /&gt;
;&lt;br /&gt;
;  Bind to interface with IP:192.168.1.22 and join multicast group:&lt;br /&gt;
;  239.100.101.22 and receive data from port 12000&lt;br /&gt;
;source=udp://192.168.1.22@239.100.101.22:12000&lt;br /&gt;
;&lt;br /&gt;
;  Bind to default interface (which routes to multicast) and join multicast&lt;br /&gt;
;  group: 239.100.101.22 and receive data from port 12000&lt;br /&gt;
;source=udp://@239.100.101.22:12000&lt;br /&gt;
;&lt;br /&gt;
; Maximum delay in milliseconds that the EDI input is willing to wait&lt;br /&gt;
; before it timeouts&lt;br /&gt;
;edi_max_delay=240&lt;br /&gt;
; This EDI implementation does not support EDI Packet Resend&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[modulator]&lt;br /&gt;
;   Mode 'fix' uses a fixed factor and is really not recommended. It is more&lt;br /&gt;
; useful on an academic perspective for people trying to understand the DAB&lt;br /&gt;
; modulation.&lt;br /&gt;
;&lt;br /&gt;
;   Mode 'max' is the normalization of every OFDM symbol. No overshoot, no&lt;br /&gt;
; truncating, but varying output power (around 3dB) which might not be the best&lt;br /&gt;
; for some power amplifier. The output samples are limited to a magnitude&lt;br /&gt;
; of 32768.&lt;br /&gt;
;&lt;br /&gt;
;   Mode 'var' uses the method specified in ETSI 300 798 Clause 5.3. This method&lt;br /&gt;
; normalizes to 4 times the standard deviation for an approximation of the RMS&lt;br /&gt;
; power. So around 6/100000 samples will be truncated and will introduce some&lt;br /&gt;
; really minor distortion. But this mode also maximizes the output power. This&lt;br /&gt;
; is the gain mode recommended for real world operation as it is based on a DAB&lt;br /&gt;
; standard; the only difference is that ODR-DabMod internally calculates this with&lt;br /&gt;
; 32-bit floats instead of 8 bits.&lt;br /&gt;
gainmode=var&lt;br /&gt;
;&lt;br /&gt;
;   In mode var, you can choose to normalise the samples to something else than&lt;br /&gt;
; 4 times the standard deviation.&lt;br /&gt;
;normalise_variance=4&lt;br /&gt;
&lt;br /&gt;
; Transmission mode&lt;br /&gt;
; If not defined, use Transmission Mode 1&lt;br /&gt;
;mode=1&lt;br /&gt;
&lt;br /&gt;
; The digital gain is a value that is multiplied to each sample. It is used&lt;br /&gt;
; to tune the chain to make sure that no non-linearities appear up to the&lt;br /&gt;
; USRP daughterboard programmable gain amplifier (PGA).&lt;br /&gt;
; If there is clipping, the spectral quality of the signal will quickly deteriorate,&lt;br /&gt;
; and wide-band noise will be generated.&lt;br /&gt;
;&lt;br /&gt;
; Be aware that there is a dependency with resampling.&lt;br /&gt;
digital_gain=0.8&lt;br /&gt;
&lt;br /&gt;
; Output sample rate. Values other than 2048000 enable&lt;br /&gt;
; resampling.&lt;br /&gt;
; Warning! digital_gain settings are different if resampling&lt;br /&gt;
; is enabled or not !&lt;br /&gt;
rate=2048000&lt;br /&gt;
&lt;br /&gt;
; (DEPRECATED) CIC equaliser for USRP1 and USRP2&lt;br /&gt;
; These USRPs have an upsampler in FPGA that does not have a flat frequency&lt;br /&gt;
; response. The CIC equaliser compensates this. This setting is specific to&lt;br /&gt;
; the USRP1 and USRP2 devices.&lt;br /&gt;
; Set to 0 to disable CicEqualiser&lt;br /&gt;
;dac_clk_rate=0&lt;br /&gt;
&lt;br /&gt;
; The USRP1 does not have flexible clocking, you will need&lt;br /&gt;
;rate=3200000&lt;br /&gt;
; and&lt;br /&gt;
;dac_clk_rate=128000000&lt;br /&gt;
&lt;br /&gt;
; When nonzero, overlap ofdmwindowing samples from each OFDM symbol&lt;br /&gt;
; onto the previous and next symbol, using a raised cosine window function.&lt;br /&gt;
; This has the effect of smoothing the transition from one symbol to the next,&lt;br /&gt;
; which improves spectrum shape.&lt;br /&gt;
; In Transmission Mode I, every data symbol is composed of 2552 samples.&lt;br /&gt;
;ofdmwindowing=10&lt;br /&gt;
&lt;br /&gt;
; Settings for crest factor reduction. Statistics for ratio of&lt;br /&gt;
; samples that were clipped are available through the RC.&lt;br /&gt;
[cfr]&lt;br /&gt;
enable=0&lt;br /&gt;
&lt;br /&gt;
; At what amplitude the signal should be clipped&lt;br /&gt;
clip=50.0&lt;br /&gt;
&lt;br /&gt;
; How much to clip the error signal used to compensate the effect&lt;br /&gt;
; of clipping&lt;br /&gt;
error_clip=0.1&lt;br /&gt;
&lt;br /&gt;
[firfilter]&lt;br /&gt;
; The FIR Filter can be used to create a better spectral quality.&lt;br /&gt;
enabled=1&lt;br /&gt;
&lt;br /&gt;
; The filter taps can be calculated with the python script&lt;br /&gt;
; doc/fir-filter/generate-filter.py&lt;br /&gt;
; If filtertapsfile is not given, the default taps are used.&lt;br /&gt;
;filtertapsfile=simple_taps.txt&lt;br /&gt;
&lt;br /&gt;
[poly]&lt;br /&gt;
;Predistortion using memoryless polynom, see dpd/ folder for more info&lt;br /&gt;
enabled=0&lt;br /&gt;
polycoeffile=polyCoefs&lt;br /&gt;
&lt;br /&gt;
[output]&lt;br /&gt;
; choose output: possible values: uhd, file, zmq, soapysdr&lt;br /&gt;
output=soapysdr&lt;br /&gt;
&lt;br /&gt;
[fileoutput]&lt;br /&gt;
; Two output formats are supported: In the default mode,&lt;br /&gt;
; the file output writes I/Q float values (i.e. complex&lt;br /&gt;
; float) to the file. The I and Q samples can take values up&lt;br /&gt;
; to 810000 in absolute magnitude with gainmode FIX. With&lt;br /&gt;
; gainmode VAR and FIX, they should never exceed 50000.&lt;br /&gt;
;format=complexf&lt;br /&gt;
;&lt;br /&gt;
; The complexf_normalised format applies a compensation factor to the complexf&lt;br /&gt;
; output to bring the range of the I and Q components to [-1.0 .. 1.0]. The&lt;br /&gt;
; digital_gain is still applied on top of that normalisation.&lt;br /&gt;
;format=complexf_normalised&lt;br /&gt;
;&lt;br /&gt;
; When the format is set to s8, the output writes I/Q 8-bit&lt;br /&gt;
; signed integers, where the magnitude is multiplied by 128/50000&lt;br /&gt;
; effectively mapping the gainmode VAR range of -50000 -- 50000&lt;br /&gt;
; to -128 -- 128. For other gainmodes, use the digital_gain setting&lt;br /&gt;
; to make sure you don't create clipping.&lt;br /&gt;
;&lt;br /&gt;
; The format u8 is the same as s8, except that the values are mapped&lt;br /&gt;
; between 0 and 255. Use u8 for welle.io, qt-dab or other tools.&lt;br /&gt;
;&lt;br /&gt;
; Also supported is s16, with system endianness (little endian on x86_64 and ARM)&lt;br /&gt;
format=s8&lt;br /&gt;
&lt;br /&gt;
; The output file:&lt;br /&gt;
filename=/dev/stdout&lt;br /&gt;
&lt;br /&gt;
show_metadata=0&lt;br /&gt;
&lt;br /&gt;
[uhdoutput]&lt;br /&gt;
; The UHD output can be directly used with the Ettus USRP devices&lt;br /&gt;
;&lt;br /&gt;
; You have to set master_clock_rate to a multiple of the&lt;br /&gt;
; sample_rate. Ideally, it should be&lt;br /&gt;
;   master_clock_rate = 4 * sample_rate&lt;br /&gt;
; or even a higher factor.&lt;br /&gt;
;&lt;br /&gt;
; Settings for the B200:&lt;br /&gt;
device=&lt;br /&gt;
master_clock_rate=32768000&lt;br /&gt;
type=b200&lt;br /&gt;
txgain=40&lt;br /&gt;
; The B200 needs larger gains (up to 89dB) but,&lt;br /&gt;
; &amp;quot;Gain settings are application specific, but it is recommended that users&lt;br /&gt;
; consider using at least half of the available gain to get reasonable dynamic&lt;br /&gt;
; range.&amp;quot;&lt;br /&gt;
;    From the B200 User Manual&lt;br /&gt;
;    http://files.ettus.com/uhd_docs/manual/html/usrp_b200.html&lt;br /&gt;
;&lt;br /&gt;
; More information and measurements available on:&lt;br /&gt;
; http://wiki.opendigitalradio.org/index.php/USRP_B200_Measurements&lt;br /&gt;
&lt;br /&gt;
; You can set what TX and RX antennas to use. This will depend on the&lt;br /&gt;
; USRP model you are using.&lt;br /&gt;
;tx_antenna=&lt;br /&gt;
;rx_antenna=RX2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; Settings for a USRP B100:&lt;br /&gt;
;device=&lt;br /&gt;
; you can put additional UHD device settings here&lt;br /&gt;
;master_clock_rate=32768000&lt;br /&gt;
;type=b100&lt;br /&gt;
;txgain=2.0&lt;br /&gt;
; Try first with small gain values&lt;br /&gt;
; Also set rate to 2048000&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; For the USRP1&lt;br /&gt;
;device=&lt;br /&gt;
;type=usrp1&lt;br /&gt;
; the usrp1 can have two daughterboards, the subdevice parameter allows you&lt;br /&gt;
; to choose which one to use&lt;br /&gt;
;subdevice=A:0&lt;br /&gt;
; The USRP1 doesn't support master_clock_rate, you need to enable resampling&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
; You must specify either frequency or channel, but not both.&lt;br /&gt;
;frequency=234208000&lt;br /&gt;
channel=13C&lt;br /&gt;
&lt;br /&gt;
; Override automatic analog frontend bandwidth calculation. Units: Hz&lt;br /&gt;
;bandwidth=2000000&lt;br /&gt;
&lt;br /&gt;
; Some USRP boards/frontends support setting an LO offset that has the&lt;br /&gt;
; effect of shifting DC out of the signal bandwidth. This should also&lt;br /&gt;
; improve IQ imbalance effects, because the mirror will centered on another&lt;br /&gt;
; frequency (it should be on frequency + 2*lo_offset)&lt;br /&gt;
;&lt;br /&gt;
; The value can be negative, and its absolute value must be smaller than&lt;br /&gt;
; master_clock_rate/2.&lt;br /&gt;
;lo_offset=2048000&lt;br /&gt;
&lt;br /&gt;
; The reference clock to use. The gpsdo is the ODR LEA-M8F board, the&lt;br /&gt;
; official Ettus GPSDO is selected with gpsdo-ettus&lt;br /&gt;
; possible values : internal, external, MIMO, gpsdo, gpsdo-ettus&lt;br /&gt;
refclk_source=internal&lt;br /&gt;
&lt;br /&gt;
; The reference one pulse-per second to use&lt;br /&gt;
; possible values : none, external, MIMO, gpsdo&lt;br /&gt;
pps_source=none&lt;br /&gt;
&lt;br /&gt;
; Behaviour when external clock reference lock lost&lt;br /&gt;
; possible values: ignore, crash&lt;br /&gt;
behaviour_refclk_lock_lost=ignore&lt;br /&gt;
&lt;br /&gt;
; The maximum accepted holdover time for the gpsdo once it&lt;br /&gt;
; started operating. Initial check interval for GPSDO lock&lt;br /&gt;
; at startup is always 180s.&lt;br /&gt;
; Valid only if the refclk and pps_source are set to gpsdo.&lt;br /&gt;
; Units: seconds&lt;br /&gt;
; Set to 0 to disable holdover check&lt;br /&gt;
; default value: 0&lt;br /&gt;
max_gps_holdover_time=600&lt;br /&gt;
&lt;br /&gt;
; Enable the TCP server to communicate TX and RX feedback for&lt;br /&gt;
; digital predistortion.&lt;br /&gt;
; Set to 0 to disable&lt;br /&gt;
;dpd_port=50055&lt;br /&gt;
&lt;br /&gt;
; section defining ZeroMQ output properties&lt;br /&gt;
[zmqoutput]&lt;br /&gt;
&lt;br /&gt;
; on which port to listen for connections&lt;br /&gt;
; please see the Transports section in man zmq&lt;br /&gt;
; for more information regarding the syntax&lt;br /&gt;
listen=tcp://*:54001&lt;br /&gt;
&lt;br /&gt;
; what ZMQ socket type to use. Valid values: PUB, REP&lt;br /&gt;
; Please see man zmq_socket for documentation&lt;br /&gt;
socket_type=pub&lt;br /&gt;
&lt;br /&gt;
; section defining the SoapySDR output settings.&lt;br /&gt;
[soapyoutput]&lt;br /&gt;
; These options are given to the SoapySDR library:&lt;br /&gt;
device=driver=hackrf&lt;br /&gt;
;master_clock_rate=32768000&lt;br /&gt;
txgain=61&lt;br /&gt;
; 47&lt;br /&gt;
frequency=180064000&lt;br /&gt;
; channel=5D&lt;br /&gt;
; 13C&lt;br /&gt;
;lo_offset=2048000&lt;br /&gt;
&lt;br /&gt;
; Override automatic analog frontend bandwidth calculation. Units: Hz&lt;br /&gt;
;bandwidth=2000000&lt;br /&gt;
&lt;br /&gt;
; You can set what TX antenna to use. This will depend on the&lt;br /&gt;
; SDR device you are using.&lt;br /&gt;
;tx_antenna=&lt;br /&gt;
&lt;br /&gt;
; Enable the TCP server to communicate TX and RX feedback for&lt;br /&gt;
; digital predistortion.&lt;br /&gt;
; Set to 0 to disable&lt;br /&gt;
;dpd_port=50055&lt;br /&gt;
&lt;br /&gt;
; Used for running single-frequency networks&lt;br /&gt;
[delaymanagement]&lt;br /&gt;
; Enable handling of timestamps for SFN&lt;br /&gt;
synchronous=0&lt;br /&gt;
&lt;br /&gt;
; Whether to mute the TX when incoming frames have no timestamp&lt;br /&gt;
mutenotimestamps=0&lt;br /&gt;
&lt;br /&gt;
; This offset is added to the TIST, and the sum defines the&lt;br /&gt;
; TX time of the transmission frame. It can by changed at runtime&lt;br /&gt;
; through the remote control.&lt;br /&gt;
offset=0.002&lt;br /&gt;
&lt;br /&gt;
; The way the timestamps are interpreted in ODR-DabMod up to v1.1.0 was not&lt;br /&gt;
; specified, and you should not assume that two different versions will&lt;br /&gt;
; transmit synchronously given the same settings. Always run SFNs with&lt;br /&gt;
; identical versions!&lt;br /&gt;
; Furthermore, when combining ODR-DabMod with third-party modulators, always&lt;br /&gt;
; measure!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[tii]&lt;br /&gt;
; If these options are set, TII transmission is enabled.&lt;br /&gt;
; DAB modes I and II are supported, and must be set explicitly in&lt;br /&gt;
; this file. Reading DAB mode from ETI is not supported.&lt;br /&gt;
enable=0&lt;br /&gt;
; comb is also known as sub-identifier.&lt;br /&gt;
comb=1&lt;br /&gt;
; pattern is also known as main-identifier. If you run several transmitters&lt;br /&gt;
; in SFN, it is better to use the same pattern for all, and vary the comb.&lt;br /&gt;
; Otherwise identification of the transmitters may be more difficult.&lt;br /&gt;
pattern=11&lt;br /&gt;
; There are two variants of TII being used. The old variant that uses the wrong&lt;br /&gt;
; phase on the second carrier in each carrier pairs and is therefore not&lt;br /&gt;
; conforming to the specification. Modern analysers can decode both variants,&lt;br /&gt;
; while others, like the Philips DAB752 and the VAD v2 monitor are known to&lt;br /&gt;
; decode only the old non-conforming variant.&lt;br /&gt;
old_variant=0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Further Links ===&lt;br /&gt;
&lt;br /&gt;
* https://radioempfang.digital/dab-ueber-satellit&lt;br /&gt;
* https://github.com/piratfm/eti-tools&lt;/div&gt;</summary>
		<author><name>194.96.9.215</name></author>
		
	</entry>
</feed>