summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog1
-rw-r--r--src/input/input_pvr.c111
2 files changed, 59 insertions, 53 deletions
diff --git a/ChangeLog b/ChangeLog
index 1ef03b96e..cbe0d5d7a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -33,6 +33,7 @@ xine-lib (1.1.9) (unreleased)
* Always enable a52dec capabilities for external a52dec, this makes it
possible to use the DJB accelerated FFT when using the external a52dec
liba52 library.
+ * Fixed an input_pvr issue with 'set input' for ivtv versions 0.10.6+
xine-lib (1.1.8)
* Send a channel-changed event to the frontend when receiving the SYNC
diff --git a/src/input/input_pvr.c b/src/input/input_pvr.c
index b8baffdbe..f07e98133 100644
--- a/src/input/input_pvr.c
+++ b/src/input/input_pvr.c
@@ -987,69 +987,74 @@ static void pvr_event_handler (pvr_input_plugin_t *this) {
/* make sure we are not paused */
_x_set_speed(this->stream, XINE_SPEED_NORMAL);
- if( v4l2_data->session_id != this->session ) {
- /* if session changes -> closes the old one */
- pthread_mutex_lock(&this->lock);
- pvr_finish_recording(this);
- time(&this->start_time);
- this->show_time = this->start_time;
- this->session = v4l2_data->session_id;
- this->new_session = 1;
- this->pvr_play_paused = 0;
- this->scr_tunning = 0;
- pvrscr_speed_tunning(this->scr, 1.0 );
- pvr_break_rec_page(this);
- pthread_mutex_unlock(&this->lock);
- _x_demux_flush_engine (this->stream);
- } else {
- /* no session change, break the page and store a new show_time */
- pthread_mutex_lock(&this->lock);
- pvr_break_rec_page(this);
- this->show_page = this->rec_page;
- pthread_mutex_unlock(&this->lock);
- time(&this->show_time);
+ if ( v4l2_data->session_id != -1) {
+ if( v4l2_data->session_id != this->session ) {
+ /* if session changes -> closes the old one */
+ pthread_mutex_lock(&this->lock);
+ pvr_finish_recording(this);
+ time(&this->start_time);
+ this->show_time = this->start_time;
+ this->session = v4l2_data->session_id;
+ this->new_session = 1;
+ this->pvr_play_paused = 0;
+ this->scr_tunning = 0;
+ pvrscr_speed_tunning(this->scr, 1.0 );
+ pvr_break_rec_page(this);
+ pthread_mutex_unlock(&this->lock);
+ _x_demux_flush_engine (this->stream);
+ } else {
+ /* no session change, break the page and store a new show_time */
+ pthread_mutex_lock(&this->lock);
+ pvr_break_rec_page(this);
+ this->show_page = this->rec_page;
+ pthread_mutex_unlock(&this->lock);
+ time(&this->show_time);
+ }
}
-
- if( (v4l2_data->input != -1 && v4l2_data->input != this->input) ||
- (v4l2_data->channel != -1 && v4l2_data->channel != this->channel) ||
- (v4l2_data->frequency != -1 && v4l2_data->frequency != this->frequency) ) {
- struct v4l2_frequency vf;
+ pthread_mutex_lock(&this->dev_lock);
+
+ /* change input */
+ if (v4l2_data->input != -1 && v4l2_data->input != this->input) {
+ lprintf("change input to:%d\n", v4l2_data->input);
this->input = v4l2_data->input;
+
+ /* as of ivtv 0.10.6: must close and reopen to set input */
+ close(this->dev_fd);
+ this->dev_fd = open (this->class->devname, O_RDWR);
+ if (this->dev_fd == -1) {
+ xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
+ "input_pvr: error opening device %s\n", this->class->devname );
+ } else {
+ if( ioctl(this->dev_fd, VIDIOC_S_INPUT, &this->input) )
+ xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
+ "input_pvr: error setting v4l2 input\n");
+ }
+ }
+
+ /* change channel */
+ if (v4l2_data->channel != -1 && v4l2_data->channel != this->channel) {
+ lprintf("change channel to:%d\n", v4l2_data->channel);
this->channel = v4l2_data->channel;
- this->frequency = v4l2_data->frequency;
+ }
- lprintf("switching to input:%d chan:%d freq:%.2f\n",
- v4l2_data->input,
- v4l2_data->channel,
- (float)v4l2_data->frequency * 62.5);
-
- pthread_mutex_lock(&this->dev_lock);
- if( ioctl(this->dev_fd, VIDIOC_S_INPUT, &this->input) )
- xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
- "input_pvr: error setting v4l2 input\n");
-
+ /* change frequency */
+ if (v4l2_data->frequency != -1 && v4l2_data->frequency != this->frequency) {
+ lprintf("changing frequency to:%.2f\n", (float)v4l2_data->frequency * 62.5);
+ struct v4l2_frequency vf;
+ this->frequency = v4l2_data->frequency;
vf.frequency = this->frequency;
vf.tuner = 0;
if( ioctl(this->dev_fd, VIDIOC_S_FREQUENCY, &vf) )
- xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
- "input_pvr: error setting v4l2 frequency\n");
+ xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
+ "input_pvr: error setting v4l2 frequency\n");
+ }
- /* workaround an ivtv bug where stream gets bad mpeg2 artifacts
- * after changing inputs. reopening the device fixes it.
- */
- close(this->dev_fd);
- this->dev_fd = open (this->class->devname, O_RDWR);
- if (this->dev_fd == -1) {
- xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
- "input_pvr: error opening device %s\n", this->class->devname );
- return;
- }
- pthread_mutex_unlock(&this->dev_lock);
+ pthread_mutex_unlock(&this->dev_lock);
- /* FIXME: also flush the device */
- /* _x_demux_flush_engine(this->stream); */
- }
+ /* FIXME: also flush the device */
+ /* _x_demux_flush_engine(this->stream); */
+
break;