diff --git a/src/dvb/dvb_adapter.c b/src/dvb/dvb_adapter.c index 00a53704..2db71b9c 100644 --- a/src/dvb/dvb_adapter.c +++ b/src/dvb/dvb_adapter.c @@ -23,7 +23,6 @@ #include #include #include -#include #include #include #include @@ -49,6 +48,13 @@ #include "diseqc.h" #include "atomic.h" +#ifdef ENABLE_EPOLL +#include +#elif ENABLE_KQUEUE +#include +#include +#endif + struct th_dvb_adapter_queue dvb_adapters; struct th_dvb_mux_instance_tree dvb_muxes; static void *dvb_adapter_input_dvr(void *aux); @@ -1020,11 +1026,17 @@ static void * dvb_adapter_input_dvr(void *aux) { th_dvb_adapter_t *tda = aux; - int fd = -1, i, r, c, efd, nfds, dmx = -1; + int fd = -1, i, r, c, nfds, dmx = -1; uint8_t tsb[188 * 10]; service_t *t; - struct epoll_event ev; +#ifdef ENABLE_EPOLL int delay = 10; + int efd; + struct epoll_event ev; +#elif ENABLE_KQUEUE + int kfd; + struct kevent ke; +#endif /* Install RAW demux */ if (tda->tda_rawmode) { @@ -1040,6 +1052,7 @@ dvb_adapter_input_dvr(void *aux) return NULL; } +#ifdef ENABLE_EPOLL /* Create poll */ efd = epoll_create(2); memset(&ev, 0, sizeof(ev)); @@ -1048,11 +1061,20 @@ dvb_adapter_input_dvr(void *aux) epoll_ctl(efd, EPOLL_CTL_ADD, tda->tda_dvr_pipe.rd, &ev); ev.data.fd = fd; epoll_ctl(efd, EPOLL_CTL_ADD, fd, &ev); +#elif ENABLE_KQUEUE + /* Create kqueue */ + kfd = kqueue(); + EV_SET(&ke, tda->tda_dvr_pipe.rd, EVFILT_READ, EV_ADD, 0, 0, NULL); + kevent(kfd, &ke, 1, NULL, 0, NULL); + EV_SET(&ke, fd, EVFILT_READ, EV_ADD, 0, 0, NULL); + kevent(kfd, &ke, 1, NULL, 0, NULL); +#endif r = i = 0; while(1) { /* Wait for input */ +#ifdef ENABLE_EPOLL nfds = epoll_wait(efd, &ev, 1, delay); /* No data */ @@ -1060,6 +1082,10 @@ dvb_adapter_input_dvr(void *aux) /* Exit */ if (ev.data.fd != fd) break; +#elif ENABLE_KQUEUE + nfds = kevent(kfd, NULL, 0, &ke, 1, NULL); + if (nfds < 1) continue; +#endif /* Read data */ c = read(fd, tsb+r, sizeof(tsb)-r); @@ -1140,7 +1166,11 @@ dvb_adapter_input_dvr(void *aux) if(dmx != -1) close(dmx); +#ifdef ENABLE_EPOLL close(efd); +#elif ENABLE_KQUEUE + close(kfd); +#endif close(fd); return NULL; }