10 #include <linux/videodev2.h>
20 unsigned char pi_received = 0;
21 unsigned char sid_received = 0;
23 void test_rds_PI_cb(unsigned short PI, unsigned char ccode, unsigned char ptype, unsigned char pref, void *udata)
25 printf("New PI=%d ccode=%X ptype=%X '%s' '%s' pref=%d\n", PI, ccode, ptype, ptype_stext[ptype], ptype_ltext[ptype], pref);
29 void test_rds_sname_cb(char *sname, void *udata)
31 printf("RDS sname='%s'\n", sname);
36 void station_scan(int fd)
39 struct v4l2_frequency v4lfreq;
40 struct v4l2_tuner v4ltuner;
41 unsigned short rdsgroup[4];
44 ret = ioctl(fd, VIDIOC_G_TUNER, &v4ltuner);
47 printf("tuner=%d\n", v4ltuner.index);
48 if (v4ltuner.type == V4L2_TUNER_RADIO)
49 printf(" is a radio tuner\n");
50 printf("name='%s'\n", v4ltuner.name);
52 v4lfreq.tuner = v4ltuner.index;
53 memset(&v4lfreq.reserved, 0, 32);
54 ret = ioctl(fd, VIDIOC_G_FREQUENCY, &v4lfreq);
58 v4lfreq.frequency = v4ltuner.rangelow;
59 while (v4lfreq.frequency <= v4ltuner.rangehigh) {
60 ret = ioctl(fd, VIDIOC_S_FREQUENCY, &v4lfreq);
63 ret = ioctl(fd, VIDIOC_G_FREQUENCY, &v4lfreq);
66 ret = ioctl(fd, VIDIOC_G_TUNER, &v4ltuner);
69 printf("%lf %d %d %s %s\n", (double)v4lfreq.frequency * 62.5 / 1000000,
72 v4ltuner.rxsubchans & V4L2_TUNER_SUB_STEREO ? "stereo" : "mono",
73 v4ltuner.rxsubchans & V4L2_TUNER_SUB_RDS ? "RDS" : "noRDS");
75 if (v4ltuner.signal > 30000) {
76 /* seems to be a strong signal, so try RDS */
80 while (pi_received == 0 || sid_received == 0) {
81 if (rds_receive_group(fd, rdsgroup)) {
82 /* group complete, start decode */
83 rds_decode_group(rdsgroup);
88 v4lfreq.frequency += 1600; /* 1600 for .1MHz steps, 800 for 0.05MHz */
93 int main(int argc, char **argv)
96 struct v4l2_capability v4lcap;
97 struct v4l2_frequency v4lfreq;
98 struct v4l2_tuner v4ltuner;
100 fd = open ("/dev/radio0", O_RDONLY);
102 printf("error opening fd\n");
107 ret = ioctl(fd, VIDIOC_QUERYCAP, &v4lcap);
111 printf("driver = '%s'\n", v4lcap.driver);
112 printf("card = '%s'\n", v4lcap.card);
113 printf("bus_info = '%s'\n", v4lcap.bus_info);
114 printf("cap && RADIO = %s\n", (v4lcap.capabilities & V4L2_CAP_RADIO) ? "yes" : "no");
115 printf("cap && TUNER = %s\n", (v4lcap.capabilities & V4L2_CAP_TUNER) ? "yes" : "no");
116 printf("cap && RDS = %s\n", (v4lcap.capabilities & V4L2_CAP_RDS_CAPTURE) ? "yes" : "no");
119 ret = ioctl(fd, VIDIOC_G_TUNER, &v4ltuner);
122 printf("tuner=%d\n", v4ltuner.index);
123 if (v4ltuner.type == V4L2_TUNER_RADIO)
124 printf(" is a radio tuner\n");
125 printf("name='%s'\n", v4ltuner.name);
127 v4lfreq.tuner = v4ltuner.index;
128 memset(&v4lfreq.reserved, 0, 32);
129 ret = ioctl(fd, VIDIOC_G_FREQUENCY, &v4lfreq);
132 if (v4ltuner.capability & V4L2_TUNER_CAP_LOW) {
133 printf("range %3.2lf MHz - %3.2lf MHz\n", (double)v4ltuner.rangelow * 62.5 / 1000000, (double)v4ltuner.rangehigh * 62.5 / 1000000);
134 printf("freq = %3.2lf MHz\n", (double)v4lfreq.frequency * 62.5 / 1000000);
136 printf("freq = %lf kHz\n", (double)v4lfreq.frequency * 62.5);
138 printf("signal: %d %s\n", v4ltuner.signal, v4ltuner.rxsubchans & V4L2_TUNER_SUB_STEREO ? "stereo" : "mono");
139 printf("RDS signal present: %s\n", v4ltuner.rxsubchans & V4L2_TUNER_SUB_RDS ? "yes" : "no");
141 if (argc > 1 && strcmp(argv[1], "-s")==0) {
144 rds_set_sname_cb(test_rds_sname_cb, NULL);
145 rds_set_PI_cb(test_rds_PI_cb, NULL);