From 643ebe816466891354cf511e9a570236a8884d7e Mon Sep 17 00:00:00 2001 From: Lars Hanisch Date: Wed, 9 Jun 2010 21:09:39 +0200 Subject: reopen video device if select reports an error --- device.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) mode change 100644 => 100755 device.c (limited to 'device.c') diff --git a/device.c b/device.c old mode 100644 new mode 100755 index 049f553..c707fa2 --- 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]); -- cgit v1.2.3