summaryrefslogtreecommitdiff
path: root/patches
diff options
context:
space:
mode:
authorLars Hanisch <dvb@flensrocker.de>2011-11-09 23:52:00 +0100
committerLars Hanisch <dvb@flensrocker.de>2011-11-09 23:52:00 +0100
commitf56577250ffac3ed2aa04b75ea4cfe2d0bf1d0e8 (patch)
treeb98985cb1c005a57b8b19dbc257cb9607e74d533 /patches
parent5edf265967405823db2912b1ef7b7d6b7b89b8fb (diff)
downloadvdr-plugin-dynamite-f56577250ffac3ed2aa04b75ea4cfe2d0bf1d0e8.tar.gz
vdr-plugin-dynamite-f56577250ffac3ed2aa04b75ea4cfe2d0bf1d0e8.tar.bz2
add vdr-patch for Cine-C/T cards with multiple frontends and only one shared demux/dvr
Diffstat (limited to 'patches')
-rw-r--r--patches/vdr-1.7.21-cine_ct.patch102
1 files changed, 102 insertions, 0 deletions
diff --git a/patches/vdr-1.7.21-cine_ct.patch b/patches/vdr-1.7.21-cine_ct.patch
new file mode 100644
index 0000000..bd45ce9
--- /dev/null
+++ b/patches/vdr-1.7.21-cine_ct.patch
@@ -0,0 +1,102 @@
+diff --git a/dvbdevice.c b/dvbdevice.c
+index a97f274..459bf9a 100644
+--- a/dvbdevice.c
++++ b/dvbdevice.c
+@@ -781,7 +781,7 @@ const char *DeliverySystems[] = {
+ cDvbDevice::cDvbDevice(int Adapter, int Frontend)
+ {
+ adapter = Adapter;
+- frontend = Frontend;
++ demux = dvr = frontend = Frontend;
+ ciAdapter = NULL;
+ dvbTuner = NULL;
+ frontendType = SYS_UNDEFINED;
+@@ -804,6 +804,26 @@ cDvbDevice::cDvbDevice(int Adapter, int Frontend)
+ // We only check the devices that must be present - the others will be checked before accessing them://XXX
+
+ if (fd_frontend >= 0) {
++ // workaround vor Cine-C/T-cards which creates multiple mutually exclusive frontends with only one demux/dvr
++ while ((demux >= 0) && !Exists(DEV_DVB_DEMUX, adapter, demux))
++ demux--;
++ if (demux < 0) {
++ demux = frontend;
++ esyslog("frontend %d/%d has no demux device", adapter, frontend);
++ }
++ else if (demux != frontend)
++ isyslog("frontend %d/%d will use demux%d", adapter, frontend, demux);
++
++ while ((dvr >= 0) && !Exists(DEV_DVB_DVR, adapter, dvr))
++ dvr--;
++ if (dvr < 0) {
++ dvr = frontend;
++ esyslog("frontend %d/%d has no dvr device", adapter, frontend);
++ }
++ else if (dvr != frontend)
++ isyslog("frontend %d/%d will use dvr%d", adapter, frontend, dvr);
++ // end workaround
++
+ if (ioctl(fd_frontend, FE_GET_INFO, &frontendInfo) >= 0) {
+ switch (frontendInfo.type) {
+ case FE_QPSK: frontendType = (frontendInfo.caps & FE_CAN_2G_MODULATION) ? SYS_DVBS2 : SYS_DVBS; break;
+@@ -869,7 +889,12 @@ int cDvbDevice::DvbOpen(const char *Name, int Adapter, int Frontend, int Mode, b
+
+ bool cDvbDevice::Exists(int Adapter, int Frontend)
+ {
+- cString FileName = DvbName(DEV_DVB_FRONTEND, Adapter, Frontend);
++ return Exists(DEV_DVB_FRONTEND, Adapter, Frontend);
++}
++
++bool cDvbDevice::Exists(const char *Name, int Adapter, int Frontend)
++{
++ cString FileName = DvbName(Name, Adapter, Frontend);
+ if (access(FileName, F_OK) == 0) {
+ int f = open(FileName, O_RDONLY);
+ if (f >= 0) {
+@@ -952,7 +977,7 @@ bool cDvbDevice::SetPid(cPidHandle *Handle, int Type, bool On)
+ memset(&pesFilterParams, 0, sizeof(pesFilterParams));
+ if (On) {
+ if (Handle->handle < 0) {
+- Handle->handle = DvbOpen(DEV_DVB_DEMUX, adapter, frontend, O_RDWR | O_NONBLOCK, true);
++ Handle->handle = DvbOpen(DEV_DVB_DEMUX, adapter, demux, O_RDWR | O_NONBLOCK, true);
+ if (Handle->handle < 0) {
+ LOG_ERROR;
+ return false;
+@@ -987,7 +1012,7 @@ bool cDvbDevice::SetPid(cPidHandle *Handle, int Type, bool On)
+
+ int cDvbDevice::OpenFilter(u_short Pid, u_char Tid, u_char Mask)
+ {
+- cString FileName = DvbName(DEV_DVB_DEMUX, adapter, frontend);
++ cString FileName = DvbName(DEV_DVB_DEMUX, adapter, demux);
+ int f = open(FileName, O_RDWR | O_NONBLOCK);
+ if (f >= 0) {
+ dmx_sct_filter_params sctFilterParams;
+@@ -1131,7 +1156,7 @@ void cDvbDevice::SetTransferModeForDolbyDigital(int Mode)
+ bool cDvbDevice::OpenDvr(void)
+ {
+ CloseDvr();
+- fd_dvr = DvbOpen(DEV_DVB_DVR, adapter, frontend, O_RDONLY | O_NONBLOCK, true);
++ fd_dvr = DvbOpen(DEV_DVB_DVR, adapter, dvr, O_RDONLY | O_NONBLOCK, true);
+ if (fd_dvr >= 0)
+ tsBuffer = new cTSBuffer(fd_dvr, MEGABYTE(2), CardIndex() + 1);
+ return fd_dvr >= 0;
+diff --git a/dvbdevice.h b/dvbdevice.h
+index e1842b7..1eb8cf2 100644
+--- a/dvbdevice.h
++++ b/dvbdevice.h
+@@ -106,6 +106,7 @@ protected:
+ static cString DvbName(const char *Name, int Adapter, int Frontend);
+ static int DvbOpen(const char *Name, int Adapter, int Frontend, int Mode, bool ReportError = false);
+ private:
++ static bool Exists(const char *Name, int Adapter, int Frontend);
+ static bool Exists(int Adapter, int Frontend);
+ ///< Checks whether the given adapter/frontend exists.
+ static bool Probe(int Adapter, int Frontend);
+@@ -116,7 +117,7 @@ public:
+ ///< Must be called before accessing any DVB functions.
+ ///< \return True if any devices are available.
+ protected:
+- int adapter, frontend;
++ int adapter, frontend, demux, dvr;
+ private:
+ dvb_frontend_info frontendInfo;
+ int numProvidedSystems;