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;