diff options
Diffstat (limited to 'patches/.svn/text-base/reelvdr-device-handling-patch.diff.svn-base')
-rw-r--r-- | patches/.svn/text-base/reelvdr-device-handling-patch.diff.svn-base | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/patches/.svn/text-base/reelvdr-device-handling-patch.diff.svn-base b/patches/.svn/text-base/reelvdr-device-handling-patch.diff.svn-base new file mode 100644 index 0000000..d0592aa --- /dev/null +++ b/patches/.svn/text-base/reelvdr-device-handling-patch.diff.svn-base @@ -0,0 +1,158 @@ +Index: device.c +=================================================================== +--- device.c (Revision 10504) ++++ device.c (Arbeitskopie) +@@ -270,14 +270,19 @@ + for (int i = 0; i < MAXRECEIVERS; i++) + receiver[i] = NULL; + +- if (numDevices < MAXDEVICES) +- device[numDevices++] = this; +- else +- esyslog("ERROR: too many devices!"); ++ for (int i = 0; i < MAXDEVICES; i++) ++ if (!device[i]) { ++ device[i] = this; ++ numDevices++; ++ return; ++ } ++ esyslog("ERROR: too many devices!"); + } + + cDevice::~cDevice() + { ++ numDevices--; ++ device[DeviceNumber()] = NULL; + Detach(player); + for (int i = 0; i < MAXRECEIVERS; i++) + Detach(receiver[i]); +@@ -290,7 +295,7 @@ + { + for (time_t t0 = time(NULL); time(NULL) - t0 < Timeout; ) { + bool ready = true; +- for (int i = 0; i < numDevices; i++) { ++ for (int i = 0; i < MAXDEVICES; i++) { + if (device[i] && !device[i]->Ready()) + ready = false; + } +@@ -322,7 +327,7 @@ + + int cDevice::DeviceNumber(void) const + { +- for (int i = 0; i < numDevices; i++) { ++ for (int i = 0; i < MAXDEVICES; i++) { + if (device[i] == this) + return i; + } +@@ -336,7 +341,7 @@ + bool cDevice::SetPrimaryDevice(int n) + { + n--; +- if (0 <= n && n < numDevices && device[n]) { ++ if (0 <= n && n < MAXDEVICES && device[n]) { + isyslog("setting primary device to %d", n + 1); + if (primaryDevice) + primaryDevice->MakePrimaryDevice(false); +@@ -369,15 +374,17 @@ + + cDevice *cDevice::GetDevice(int Index) + { +- return (0 <= Index && Index < numDevices) ? device[Index] : NULL; ++ return (0 <= Index && Index < MAXDEVICES) ? device[Index] : NULL; + } + + cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers) + { + cDevice *d = NULL; + uint Impact = 0xFFFFFFFF; // we're looking for a device with the least impact +- for (int i = 0; i < numDevices; i++) { ++ for (int i = 0; i < MAXDEVICES; i++) { + bool ndr; ++ if (device[i] == NULL) ++ continue; // this device was not allocated + #ifdef DETACH_UNUSED_DEVICES + if(!device[i]->Receiving()) { + isyslog("device %d (%p) not receiving", i, device[i]); +@@ -419,10 +426,11 @@ + void cDevice::Shutdown(void) + { + primaryDevice = NULL; +- for (int i = 0; i < numDevices; i++) { +- delete device[i]; +- device[i] = NULL; ++ for (int i = 0; i < MAXDEVICES; i++) { ++ if( device[i]) { ++ delete device[i]; + } ++ } + } + + uchar *cDevice::GrabImage(int &Size, bool Jpeg, int Quality, int SizeX, int SizeY) +@@ -724,6 +732,16 @@ + return -1; + } + ++int cDevice::ReadFilter(int Handle, void *Buffer, size_t Length) ++{ ++ return safe_read(Handle, Buffer, Length); ++} ++ ++void cDevice::CloseFilter(int Handle) ++{ ++ close(Handle); ++} ++ + void cDevice::AttachFilter(cFilter *Filter) + { + if (sectionHandler) +@@ -753,7 +771,7 @@ + + bool cDevice::ProvidesTransponderExclusively(const cChannel *Channel) const + { +- for (int i = 0; i < numDevices; i++) { ++ for (int i = 0; i < MAXDEVICES; i++) { + if (device[i] && device[i] != this && device[i]->ProvidesTransponder(Channel)) + return false; + } +Index: device.h +=================================================================== +--- device.h (Revision 10504) ++++ device.h (Arbeitskopie) +@@ -326,6 +326,15 @@ + ///< Opens a file handle for the given filter data. + ///< A derived device that provides section data must + ///< implement this function. ++ virtual int ReadFilter(int Handle, void *Buffer, size_t Length); ++ ///< Read from a handle for the given filter data. ++ ///< a derived class need not implement this function, because this ++ ///< is done by the default implementation. ++ virtual void CloseFilter(int Handle); ++ ///< Closes a file handle that has previously been opened ++ ///< by OpenFilter(). If this is as simple as calling close(Handle), ++ ///< a derived class need not implement this function, because this ++ ///< is done by the default implementation. + void AttachFilter(cFilter *Filter); + ///< Attaches the given filter to this device. + void Detach(cFilter *Filter); +Index: sections.c +=================================================================== +--- sections.c (Revision 10504) ++++ sections.c (Arbeitskopie) +@@ -105,7 +105,7 @@ + for (fh = filterHandles.First(); fh; fh = filterHandles.Next(fh)) { + if (fh->filterData.Is(FilterData->pid, FilterData->tid, FilterData->mask)) { + if (--fh->used <= 0) { +- close(fh->handle); ++ device->CloseFilter(fh->handle); + filterHandles.Del(fh); + break; + } +@@ -198,7 +198,7 @@ + if (fh) { + // Read section data: + unsigned char buf[4096]; // max. allowed size for any EIT section +- int r = safe_read(fh->handle, buf, sizeof(buf)); ++ int r = device->ReadFilter(fh->handle, buf, sizeof(buf)); + if (!DeviceHasLock) + continue; // we do the read anyway, to flush any data that might have come from a different transponder + if (r > 3) { // minimum number of bytes necessary to get section length |