staticint alloc_channel(struct firedtv *fdtv)
{ int i;
for (i = 0; i < 16; i++) if (!__test_and_set_bit(i, &fdtv->channel_active)) break; return i;
}
staticvoid collect_channels(struct firedtv *fdtv, int *pidc, u16 pid[])
{ int i, n;
for (i = 0, n = 0; i < 16; i++) if (test_bit(i, &fdtv->channel_active))
pid[n++] = fdtv->channel_pid[i];
*pidc = n;
}
staticinlinevoid dealloc_channel(struct firedtv *fdtv, int i)
{
__clear_bit(i, &fdtv->channel_active);
}
int fdtv_start_feed(struct dvb_demux_feed *dvbdmxfeed)
{ struct firedtv *fdtv = dvbdmxfeed->demux->priv; int pidc, c, ret;
u16 pids[16];
switch (dvbdmxfeed->type) { case DMX_TYPE_TS: case DMX_TYPE_SEC: break; default:
dev_err(fdtv->device, "can't start dmx feed: invalid type %u\n",
dvbdmxfeed->type); return -EINVAL;
}
if (mutex_lock_interruptible(&fdtv->demux_mutex)) return -EINTR;
if (dvbdmxfeed->type == DMX_TYPE_TS) { switch (dvbdmxfeed->pes_type) { case DMX_PES_VIDEO: case DMX_PES_AUDIO: case DMX_PES_TELETEXT: case DMX_PES_PCR: case DMX_PES_OTHER:
c = alloc_channel(fdtv); break; default:
dev_err(fdtv->device, "can't start dmx feed: invalid pes type %u\n",
dvbdmxfeed->pes_type);
ret = -EINVAL; goto out;
}
} else {
c = alloc_channel(fdtv);
}
if (c > 15) {
dev_err(fdtv->device, "can't start dmx feed: busy\n");
ret = -EBUSY; goto out;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.