diff options
Diffstat (limited to 'patches')
-rw-r--r-- | patches/dvbapi-1.0.2-git526bb16b-dynamite.patch | 345 |
1 files changed, 345 insertions, 0 deletions
diff --git a/patches/dvbapi-1.0.2-git526bb16b-dynamite.patch b/patches/dvbapi-1.0.2-git526bb16b-dynamite.patch new file mode 100644 index 0000000..17e0b0b --- /dev/null +++ b/patches/dvbapi-1.0.2-git526bb16b-dynamite.patch @@ -0,0 +1,345 @@ +diff --git a/SCCIAdapter.cpp b/SCCIAdapter.cpp +index f18b5c6..f141fa7 100644 +--- a/SCCIAdapter.cpp ++++ b/SCCIAdapter.cpp +@@ -38,7 +38,7 @@ + #define T_RCV 0x81 + #define T_DATA_LAST 0xA0 + +-SCCIAdapter::SCCIAdapter(cDevice *Device, int cardIndex, int cafd) ++SCCIAdapter::SCCIAdapter(cDevice *Device, int Adapter, int Frontend, int cardIndex, int cafd) + { + for (int i = 0; i < MAX_SOCKETS; i++) + { +@@ -50,6 +50,11 @@ SCCIAdapter::SCCIAdapter(cDevice *Device, int cardIndex, int cafd) + device = Device; + capmt = new CAPMT; + fd_ca = cafd; ++// BEGIN vdr-plugin-dynamite ++ idle = false; ++ adapter = Adapter; ++ frontend = Frontend; ++// END vdr-plugin-dynamite + decsa = new DeCSA(cardIndex); + UDPSocket::bindx(this); + +@@ -254,6 +259,9 @@ SCCIAdapter::~SCCIAdapter() + if (capmt != 0) + delete capmt; + capmt = 0; ++// BEGIN vdr-plugin-dynamite ++ CloseCa(); ++// END vdr-plugin-dynamite + } + + bool SCCIAdapter::Reset(int Slot) +@@ -396,3 +404,37 @@ bool SCCIAdapter::DeCSASetCaPid(ca_pid_t *ca_pid) + } + return decsa->SetCaPid(ca_pid); + } ++ ++// BEGIN vdr-plugin-dynamite ++bool SCCIAdapter::OpenCa(void) ++{ ++ if (fd_ca >= 0) ++ return true; ++ cMutexLock lock(&cafdMutex); ++ fd_ca = cDvbDevice::DvbOpen(DEV_DVB_CA, adapter, frontend, O_RDWR); ++ return (fd_ca >= 0); ++} ++ ++void SCCIAdapter::CloseCa(void) ++{ ++ if (fd_ca < 0) ++ return; ++ cMutexLock lock(&cafdMutex); ++ close(fd_ca); ++ fd_ca = -1; ++} ++ ++bool SCCIAdapter::SetIdle(bool Idle, bool TestOnly) ++{ ++ if ((adapter < 0) || (frontend < 0)) ++ return false; ++ if (TestOnly || (idle == Idle)) ++ return true; ++ if (Idle) ++ CloseCa(); ++ else ++ OpenCa(); ++ idle = Idle; ++ return true; ++} ++// END vdr-plugin-dynamite +diff --git a/SCCIAdapter.h b/SCCIAdapter.h +index 8f87417..bd661b6 100644 +--- a/SCCIAdapter.h ++++ b/SCCIAdapter.h +@@ -66,7 +66,7 @@ private: + int addCaid(int offset, int limit, unsigned short caid); + + public: +- SCCIAdapter(cDevice *Device, int CardIndex, int cafd); ++ SCCIAdapter(cDevice *Device, int Adapter, int Frontend, int CardIndex, int cafd); + ~SCCIAdapter(); + int Adapter() + { +@@ -85,6 +85,18 @@ public: + bool DeCSASetCaDescr(ca_descr_t *ca_descr); + bool DeCSASetCaPid(ca_pid_t *ca_pid); + void ProcessSIDRequest(int card_index, int sid, int ca_lm, const unsigned char *vdr_caPMT, int vdr_caPMTLen); ++ ++// BEGIN vdr-plugin-dynamite ++private: ++ int adapter, frontend; ++ bool idle; ++ ++ bool OpenCa(void); ++ void CloseCa(void); ++public: ++ virtual bool SetIdle(bool Idle, bool TestOnly); ++ virtual bool IsIdle(void) const { return idle; } ++// END vdr-plugin-dynamite + }; + + #endif // ___SCCIADAPTER_H +diff --git a/device-tmpl.cpp b/device-tmpl.cpp +index ff6ea51..80e554b 100644 +--- a/device-tmpl.cpp ++++ b/device-tmpl.cpp +@@ -29,7 +29,7 @@ private: + cScDevicePlugin *devplugin; + cTimeMs lastDump; + SCCIAdapter *sCCIAdapter; +- int fd_dvr, fd_ca, fd_ca2; ++ int fd_dvr, fd_ca; //, fd_ca2; // fd_ca2 is not used, copy&paste relict? + bool softcsa; + char devId[8]; + bool ScActive(void); +@@ -48,6 +48,15 @@ public: + virtual bool HasCi(void); + void LateInit(void); + void EarlyShutdown(void); ++ ++// BEGIN vdr-plugin-dynamite ++private: ++ bool lateInit; ++public: ++#ifdef __DYNAMIC_DEVICE_PROBE ++ virtual bool SetIdleDevice(bool Idle, bool TestOnly); ++#endif ++// END vdr-plugin-dynamite + }; + + SCDEVICE::SCDEVICE(cScDevicePlugin *DevPlugin, int Adapter, int Frontend, int cafd) +@@ -57,28 +66,47 @@ SCDEVICE::SCDEVICE(cScDevicePlugin *DevPlugin, int Adapter, int Frontend, int ca + : DVBDEVICE(Adapter, Frontend) + #endif //OWN_DEVPARAMS + { ++// BEGIN vdr-plugin-dynamite ++ lateInit = false; ++// END vdr-plugin-dynamite + DEBUGLOG("%s: adapter=%d frontend=%d", __FUNCTION__, Adapter, Frontend); + tsBuffer = 0; + devplugin = DevPlugin; + softcsa = false; + fd_ca = cafd; +- fd_ca2 = dup(fd_ca); ++ //fd_ca2 = dup(fd_ca); // is not used, copy&paste relict? + fd_dvr = -1; + snprintf(devId, sizeof(devId), "%d/%d", Adapter, Frontend); +- sCCIAdapter = new SCCIAdapter(this, Adapter, cafd); ++// BEGIN vdr-plugin-dynamite ++#ifdef __DYNAMIC_DEVICE_PROBE ++ cDevice *cidev = parentDevice ? parentDevice : this; ++#else ++ cDevice *cidev = this; ++#endif ++ sCCIAdapter = new SCCIAdapter(cidev, Adapter, Frontend, Adapter, cafd); + DEBUGLOG("%s: done", __FUNCTION__); ++// BEGIN vdr-plugin-dynamite ++ cScDevices::AddScDevice(this); ++ if (cScDevices::AutoLateInit()) ++ LateInit(); ++// END vdr-plugin-dynamite + } + + SCDEVICE::~SCDEVICE() + { ++// BEGIN vdr-plugin-dynamite ++ cScDevices::DelScDevice(this); ++// END vdr-plugin-dynamite + DEBUGLOG("%s", __FUNCTION__); + DetachAllReceivers(); + Cancel(3); + EarlyShutdown(); +- if (fd_ca >= 0) +- close(fd_ca); +- if (fd_ca2 >= 0) +- close(fd_ca2); ++ // fd_ca will be closed by SCCIAdapter ++ //if (fd_ca >= 0) ++ // close(fd_ca); ++ // fd_ca2 is not used, copy&paste relict? ++ //if (fd_ca2 >= 0) ++ // close(fd_ca2); + } + + void SCDEVICE::EarlyShutdown(void) +@@ -92,6 +120,9 @@ void SCDEVICE::EarlyShutdown(void) + + void SCDEVICE::LateInit(void) + { ++ if (lateInit) ++ return; ++ lateInit = true; + DEBUGLOG("%s", __FUNCTION__); + int n = CardIndex(); + if (DeviceNumber() != n) +@@ -190,6 +221,27 @@ bool SCDEVICE::GetTSPacket(uchar *&Data) + return false; + } + ++// BEGIN vdr-plugin-dynamite ++#ifdef __DYNAMIC_DEVICE_PROBE ++bool SCDEVICE::SetIdleDevice(bool Idle, bool TestOnly) ++{ ++ if (TestOnly) { ++ if (sCCIAdapter) ++ return sCCIAdapter->SetIdle(Idle, true); ++ return DVBDEVICE::SetIdleDevice(Idle, true); ++ } ++ if (sCCIAdapter && !sCCIAdapter->SetIdle(Idle, false)) ++ return false; ++ if (!DVBDEVICE::SetIdleDevice(Idle, false)) { ++ if (sCCIAdapter) ++ sCCIAdapter->SetIdle(!Idle, false); ++ return false; ++ } ++ return true; ++} ++#endif ++// END vdr-plugin-dynamite ++ + #undef SCDEVICE + #undef DVBDEVICE + #undef OWN_DEVPARAMS +diff --git a/device.cpp b/device.cpp +index 8e61b60..e6e701b 100644 +--- a/device.cpp ++++ b/device.cpp +@@ -61,6 +61,58 @@ bool cScDvbDevicePlugin::EarlyShutdown(cDevice *dev) + + int cScDevices::budget = 0; + ++// BEGIN vdr-plugin-dynamite ++// dynamite fills the vdr::cDevice::device array with vdr::plugin::dynamite::cDynamicDevice ++// we have to maintain our own list of sc-devices ++int cScDevices::numScDevices = 0; ++cDevice *cScDevices::scdevice[MAXDEVICES] = { NULL }; ++bool cScDevices::autoLateInit = false; ++ ++int cScDevices::NumScDevices(void) ++{ ++ return numScDevices; ++} ++ ++cDevice *cScDevices::GetScDevice(int CardIndex) ++{ ++ for (int n = 0; n < numScDevices; n++) { ++ if (scdevice[n] && (scdevice[n]->CardIndex() == CardIndex)) ++ return scdevice[n]; ++ } ++ return NULL; ++} ++ ++void cScDevices::AddScDevice(cDevice *Device) ++{ ++ if (Device == NULL) ++ return; ++ int i = 0; ++ while ((i < numScDevices) && (i < MAXDEVICES) && (scdevice[i] != Device)) ++ i++; ++ if (i < MAXDEVICES) { ++ scdevice[i] = Device; ++ if (i == numScDevices) ++ numScDevices++; ++ } ++ else ++ esyslog("too many sc-devices!"); ++} ++ ++void cScDevices::DelScDevice(cDevice *Device) ++{ ++ if (Device == NULL) ++ return; ++ int i = 0; ++ while ((i < numScDevices) && (i < MAXDEVICES)) { ++ if (scdevice[i] == Device) { ++ scdevice[i] = NULL; ++ break; ++ } ++ i++; ++ } ++} ++// END vdr-plugin-dynamite ++ + void cScDevices::DvbName(const char *Name, int a, int f, char *buffer, int len) + { + snprintf(buffer, len, "%s/%s%d/%s%d", DEV_DVB_BASE, DEV_DVB_ADAPTER, a, Name, f); +@@ -95,20 +147,25 @@ bool cScDevices::Initialize(void) + + void cScDevices::Startup(void) + { +- for (int n = cDevice::NumDevices(); --n >= 0;) ++// BEGIN vdr-plugin-dynamite ++ for(int n = NumScDevices(); --n >= 0;) + { +- cDevice *dev = cDevice::GetDevice(n); ++ cDevice *dev = GetScDevice(n); + for (cScDevicePlugin *dp = devplugins.First(); dp; dp = devplugins.Next(dp)) + if (dp->LateInit(dev)) + break; + } ++ autoLateInit = true; ++// END vdr-plugin-dynamite + } + + void cScDevices::Shutdown(void) + { +- for (int n = cDevice::NumDevices(); --n >= 0;) ++// BEGIN vdr-plugin-dynamite ++ for(int n = NumScDevices(); --n >= 0;) + { +- cDevice *dev = cDevice::GetDevice(n); ++ cDevice *dev = GetScDevice(n); ++// END vdr-plugin-dynamite + for (cScDevicePlugin *dp = devplugins.First(); dp; dp = devplugins.Next(dp)) + if (dp->EarlyShutdown(dev)) + break; +diff --git a/device.h b/device.h +index 60c218f..c9a7bfe 100644 +--- a/device.h ++++ b/device.h +@@ -49,6 +49,21 @@ public: + static bool ForceBudget(int n); + static void DvbName(const char *Name, int a, int f, char *buffer, int len); + static int DvbOpen(const char *Name, int a, int f, int Mode, bool ReportError = false); ++ ++// BEGIN vdr-plugin-dynamite ++// dynamite fills the vdr::cDevice::device array with vdr::plugin::dynamite::cDynamicDevice ++// we have to maintain our own list of sc-devices ++private: ++ static int numScDevices; ++ static cDevice *scdevice[MAXDEVICES]; ++ static bool autoLateInit; ++public: ++ static int NumScDevices(void); ++ static cDevice *GetScDevice(int CardIndex); ++ static void AddScDevice(cDevice *Device); ++ static void DelScDevice(cDevice *Device); ++ static bool AutoLateInit() { return autoLateInit; }; ++// END vdr-plugin-dynamite + }; + + #endif // ___DEVICE_H |