static void pvr2_dvb_stream_end(struct pvr2_dvb_adapter *adap) { unsigned int idx; struct pvr2_stream *stream; if (adap->thread) { kthread_stop(adap->thread); adap->thread = NULL; } if (adap->channel.stream) { stream = adap->channel.stream->stream; } else { stream = NULL; } if (stream) { pvr2_hdw_set_streaming(adap->channel.hdw, 0); pvr2_stream_set_callback(stream, NULL, NULL); pvr2_stream_kill(stream); pvr2_stream_set_buffer_count(stream, 0); pvr2_channel_claim_stream(&adap->channel, NULL); } if (adap->stream_run) { for (idx = 0; idx < PVR2_DVB_BUFFER_COUNT; idx++) { if (!(adap->buffer_storage[idx])) continue; kfree(adap->buffer_storage[idx]); adap->buffer_storage[idx] = NULL; } adap->stream_run = 0; } }
static int pvr2_dvb_stream_do_start(struct pvr2_dvb_adapter *adap) { struct pvr2_context *pvr = adap->channel.mc_head; unsigned int idx; int ret; struct pvr2_buffer *bp; struct pvr2_stream *stream = NULL; if (adap->stream_run) return -EIO; ret = pvr2_channel_claim_stream(&adap->channel, &pvr->video_stream); /* */ if (ret < 0) return ret; stream = adap->channel.stream->stream; for (idx = 0; idx < PVR2_DVB_BUFFER_COUNT; idx++) { adap->buffer_storage[idx] = kmalloc(PVR2_DVB_BUFFER_SIZE, GFP_KERNEL); if (!(adap->buffer_storage[idx])) return -ENOMEM; } pvr2_stream_set_callback(pvr->video_stream.stream, (pvr2_stream_callback) pvr2_dvb_notify, adap); ret = pvr2_stream_set_buffer_count(stream, PVR2_DVB_BUFFER_COUNT); if (ret < 0) return ret; for (idx = 0; idx < PVR2_DVB_BUFFER_COUNT; idx++) { bp = pvr2_stream_get_buffer(stream, idx); pvr2_buffer_set_buffer(bp, adap->buffer_storage[idx], PVR2_DVB_BUFFER_SIZE); } ret = pvr2_hdw_set_streaming(adap->channel.hdw, 1); if (ret < 0) return ret; while ((bp = pvr2_stream_get_idle_buffer(stream)) != NULL) { ret = pvr2_buffer_queue(bp); if (ret < 0) return ret; } adap->thread = kthread_run(pvr2_dvb_feed_thread, adap, "pvrusb2-dvb"); if (IS_ERR(adap->thread)) { ret = PTR_ERR(adap->thread); adap->thread = NULL; return ret; } adap->stream_run = !0; return 0; }
int pvr2_ioread_setup(struct pvr2_ioread *cp,struct pvr2_stream *sp) { int ret; unsigned int idx; struct pvr2_buffer *bp; mutex_lock(&cp->mutex); do { if (cp->stream) { pvr2_trace(PVR2_TRACE_START_STOP, "/*---TRACE_READ---*/ pvr2_ioread_setup (tear-down) id=%p", cp); pvr2_ioread_stop(cp); pvr2_stream_kill(cp->stream); if (pvr2_stream_get_buffer_count(cp->stream)) { pvr2_stream_set_buffer_count(cp->stream,0); } cp->stream = NULL; } if (sp) { pvr2_trace(PVR2_TRACE_START_STOP, "/*---TRACE_READ---*/ pvr2_ioread_setup (setup) id=%p", cp); pvr2_stream_kill(sp); ret = pvr2_stream_set_buffer_count(sp,BUFFER_COUNT); if (ret < 0) { mutex_unlock(&cp->mutex); return ret; } for (idx = 0; idx < BUFFER_COUNT; idx++) { bp = pvr2_stream_get_buffer(sp,idx); pvr2_buffer_set_buffer(bp, cp->buffer_storage[idx], BUFFER_SIZE); } cp->stream = sp; } } while (0); mutex_unlock(&cp->mutex); return 0; }