summaryrefslogtreecommitdiff
path: root/device.c
diff options
context:
space:
mode:
authorLars Hanisch <dvb@flensrocker.de>2010-08-12 18:21:59 +0200
committerLars Hanisch <dvb@flensrocker.de>2010-08-12 18:21:59 +0200
commit2c3fec5ac120b88c17633ff8a0dfae0091a4964a (patch)
treecc8bd2a0a64db3a97f549b432dc924d828035369 /device.c
parentb856f4fb464607fe195f34cb3523429d7d3f4d2f (diff)
parent643ebe816466891354cf511e9a570236a8884d7e (diff)
downloadvdr-plugin-pvrinput-2c3fec5ac120b88c17633ff8a0dfae0091a4964a.tar.gz
vdr-plugin-pvrinput-2c3fec5ac120b88c17633ff8a0dfae0091a4964a.tar.bz2
Merge branch 'reader-with-select'
Use select before read with timeout and reopen v4l2-device if select reports an error. Reading from the Hauppauge HD PVR hangs sometimes on bad video input and forces vdr to restart. With this workaround the vdr doesn't stop and there's only a few seconds missing in the recording.
Diffstat (limited to 'device.c')
-rwxr-xr-x[-rw-r--r--]device.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/device.c b/device.c
index 049f553..c707fa2 100644..100755
--- a/device.c
+++ b/device.c
@@ -345,6 +345,29 @@ cPvrDevice *cPvrDevice::Get(int index)
return NULL;
}
+int cPvrDevice::ReOpen(void)
+{
+ log(pvrDEBUG1, "cPvrDevice::ReOpen /dev/video%d = %s (%s)", number, CARDNAME[cardname], DRIVERNAME[driver]);
+ int retry_count = 5;
+ cString devName = cString::sprintf("/dev/video%d", number);
+ retry:
+ close(v4l2_fd);
+ v4l2_fd = open(devName, O_RDWR);
+ if (v4l2_fd < 0) {
+ log(pvrERROR, "cPvrDevice::ReOpen: error reopening %s (%s): %d:%s",
+ CARDNAME[cardname], *devName, errno, strerror(errno));
+ retry_count--;
+ if (retry_count > 0) {
+ usleep(1000000);
+ goto retry;
+ }
+ }
+ else {
+ log(pvrDEBUG2, "cPvrDevice::ReOpen: %s (%s) successfully re-opened", *devName, CARDNAME[cardname]);
+ }
+ return v4l2_fd;
+}
+
void cPvrDevice::ReInit(void)
{
log(pvrDEBUG1, "cPvrDevice::ReInit /dev/video%d = %s (%s)", number, CARDNAME[cardname], DRIVERNAME[driver]);