static int set_demux(int dmxfd, int pid, int pes_type, int dvr) { struct dmx_pes_filter_params pesfilter; if (pid < 0 || pid >= 0x1fff) /* ignore this pid to allow radio services */ { syslog(LOG_INFO, "Ignore PID: %d", pid); return TRUE; } if (dvr) { int buffersize = 64 * 1024; if (ioctl(dmxfd, DMX_SET_BUFFER_SIZE, buffersize) == -1) syslog(LOG_ERR, "DMX_SET_BUFFER_SIZE failed"); } pesfilter.pid = pid; pesfilter.input = DMX_IN_FRONTEND; pesfilter.output = dvr ? DMX_OUT_TS_TAP : DMX_OUT_DECODER; pesfilter.pes_type = pes_type; pesfilter.flags = DMX_IMMEDIATE_START; if (ioctl(dmxfd, DMX_SET_PES_FILTER, &pesfilter) == -1) { syslog(LOG_ERR, "DMX_SET_PES_FILTER failed " "(PID = 0x%04x): %d %m", pid, errno); return FALSE; } return TRUE; } void setup_demuxer(channel_t *channel) { int i; for(i = 0; i < 5; i++) { if(channel->apids[i].apid != 0) { syslog(LOG_INFO, "Add APID: %d", channel->apids[i].apid); if(!set_demux(audioFD[i], channel->apids[i].apid, DMX_PES_OTHER, 1)) syslog(LOG_ERR, "Failed to set up APID : %d", channel->apids[i].apid); } } }