/* ** Test program for channel event reporting: opens the VBI device given ** by DEVICE_PATH, puts it in event reporting mode via ioctl S_CHNEVENT ** and then starts waiting for events via select() at a 60 seconds timeout. ** When an event occurs it's type mask is queried via G_CHNEVENT and ** printed to stdout. ** ** Author: Tom Zoerner (tomzo at nefkom net), June 14th 2003 ** http://nxtvepg.sourceforge.net/v4l2 */ #include #include #include #include #include #include #include #define DEVICE_PATH "/dev/vbi" /* videodev2.h extensions */ enum v4l2_chn_event_bit { V4L2_CHN_EV_STD, V4L2_CHN_EV_INP, V4L2_CHN_EV_AUD, V4L2_CHN_EV_PRIO, V4L2_CHN_EV_COUNT }; typedef __u32 v4l2_chn_event_mask; #define V4L2_CHN_EV_MASK_ALL ((1 << V4L2_CHN_EV_COUNT) - 1) #define BASE_VIDIOCPRIVATE 192 /* 192-255 are private */ #define VIDIOC_G_CHNEVENT _IOR('V' , BASE_VIDIOCPRIVATE+12, v4l2_chn_event_mask) #define VIDIOC_S_CHNEVENT _IOW('V' , BASE_VIDIOCPRIVATE+13, v4l2_chn_event_mask) int main( int argc, char ** argv ) { struct timeval timeout; v4l2_chn_event_mask ev_mask; fd_set rd; int fd; int ret; printf("Opening %s\n", DEVICE_PATH); fd = open(DEVICE_PATH, O_RDWR | O_NONBLOCK); if (fd != -1) { ev_mask = V4L2_CHN_EV_MASK_ALL; if (ioctl(fd, VIDIOC_S_CHNEVENT, &ev_mask) != 0) { perror("VIDIOC_S_CHNEVENT setup"); exit(1); } while (1) { FD_ZERO(&rd); FD_SET(fd, &rd); timeout.tv_sec = 60; timeout.tv_usec = 0; ret = select(fd + 1, &rd, NULL, NULL, &timeout); if (ret == 0) { fprintf(stderr, "timeout, check G_CHNEVENT: returns %d, errno %d\n", ioctl(fd, VIDIOC_G_CHNEVENT, &ev_mask), errno); } else if (ret <= 0) { fprintf(stderr, "select: %d: %s\n", errno, strerror(errno)); if ((errno != EAGAIN) && (errno != EINTR)) break; } else if (ret > 0) { ret = ioctl(fd, VIDIOC_G_CHNEVENT, &ev_mask); if (ret == 0) { printf("G_CHNEVENT: %d\n", (int)ev_mask); sleep(1); } else { fprintf(stderr, "ioctl G_CHNEVENT: %d: %s\n", errno, strerror(errno)); if ((errno != EAGAIN) && (errno != EINTR)) break; } } } close(fd); } else perror("open " DEVICE_PATH); return 0; }