bp = pvr2_stream_get_ready_buffer(stream); if (bp != NULL) {
count = pvr2_buffer_get_count(bp); if (count) {
dvb_dmx_swfilter(
&adap->demux,
adap->buffer_storage[
pvr2_buffer_get_id(bp)],
count);
} else {
ret = pvr2_buffer_get_status(bp); if (ret < 0) break;
}
ret = pvr2_buffer_queue(bp); if (ret < 0) break;
/* Since we know we did something to a buffer, just go back and try again. No point in blocking unless we really ran out of
buffers to process. */ continue;
}
/* Wait until more buffers become available or we're
told not to wait any longer. */
ret = wait_event_freezable(adap->buffer_wait_data,
(pvr2_stream_get_ready_count(stream) > 0) ||
kthread_should_stop()); if (ret < 0) break;
}
/* If we get here and ret is < 0, then an error has occurred.
Probably would be a good idea to communicate that to DVB core... */
staticint pvr2_dvb_frontend_init(struct pvr2_dvb_adapter *adap)
{ struct pvr2_hdw *hdw = adap->channel.hdw; conststruct pvr2_dvb_props *dvb_props = hdw->hdw_desc->dvb_props; int ret = 0;
if (dvb_props == NULL) {
pvr2_trace(PVR2_TRACE_ERROR_LEGS, "fe_props not defined!"); return -EINVAL;
}
ret = pvr2_channel_limit_inputs(
&adap->channel,
(1 << PVR2_CVAL_INPUT_DTV)); if (ret) {
pvr2_trace(PVR2_TRACE_ERROR_LEGS, "failed to grab control of dtv input (code=%d)",
ret); return ret;
}
if (dvb_props->frontend_attach == NULL) {
pvr2_trace(PVR2_TRACE_ERROR_LEGS, "frontend_attach not defined!");
ret = -EINVAL; goto done;
}
if (dvb_props->frontend_attach(adap) == 0 && adap->fe[0]) { if (dvb_register_frontend(&adap->dvb_adap, adap->fe[0])) {
pvr2_trace(PVR2_TRACE_ERROR_LEGS, "frontend registration failed!");
ret = -ENODEV; goto fail_frontend0;
} if (adap->fe[0]->ops.analog_ops.standby)
adap->fe[0]->ops.analog_ops.standby(adap->fe[0]);
pvr2_trace(PVR2_TRACE_INFO, "transferring fe[%d] ts_bus_ctrl() to pvr2_dvb_bus_ctrl()",
adap->fe[0]->id);
adap->fe[0]->ops.ts_bus_ctrl = pvr2_dvb_bus_ctrl;
} else {
pvr2_trace(PVR2_TRACE_ERROR_LEGS, "no frontend was attached!");
ret = -ENODEV; return ret;
}
if (dvb_props->tuner_attach && dvb_props->tuner_attach(adap)) {
pvr2_trace(PVR2_TRACE_ERROR_LEGS, "tuner attach failed");
ret = -ENODEV; goto fail_tuner;
}
struct pvr2_dvb_adapter *pvr2_dvb_create(struct pvr2_context *pvr)
{ int ret = 0; struct pvr2_dvb_adapter *adap; if (!pvr->hdw->hdw_desc->dvb_props) { /* Device lacks a digital interface so don't set up
the DVB side of the driver either. For now. */ return NULL;
}
adap = kzalloc(sizeof(*adap), GFP_KERNEL); if (!adap) return adap;
pvr2_channel_init(&adap->channel, pvr);
adap->channel.check_func = pvr2_dvb_internal_check;
init_waitqueue_head(&adap->buffer_wait_data);
mutex_init(&adap->lock);
ret = pvr2_dvb_adapter_init(adap); if (ret < 0) goto fail1;
ret = pvr2_dvb_frontend_init(adap); if (ret < 0) goto fail2; return adap;
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.