add own demux policy for dm8000 which now have 5 demux devices one for each
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Thu, 17 Jul 2008 21:11:30 +0000 (21:11 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Thu, 17 Jul 2008 21:11:30 +0000 (21:11 +0000)
tuner and one for playback

lib/dvb/demux.cpp
lib/dvb/demux.h
lib/dvb/dvb.cpp

index 6a7e50db4cd6c53cc5da7973d6eb4a75be5364f6..29bbf264c7f6fa71dea0ae40e6a43af7a7db486e 100644 (file)
@@ -76,11 +76,12 @@ RESULT eDVBDemux::setSourceFrontend(int fenum)
 {
 #if HAVE_DVB_API_VERSION >= 3
        int fd = openDemux();
 {
 #if HAVE_DVB_API_VERSION >= 3
        int fd = openDemux();
-       
        int n = DMX_SOURCE_FRONT0 + fenum;
        int res = ::ioctl(fd, DMX_SET_SOURCE, &n);
        if (res)
                eDebug("DMX_SET_SOURCE failed! - %m");
        int n = DMX_SOURCE_FRONT0 + fenum;
        int res = ::ioctl(fd, DMX_SET_SOURCE, &n);
        if (res)
                eDebug("DMX_SET_SOURCE failed! - %m");
+       else
+               source = fenum;
        ::close(fd);
        return res;
 #endif
        ::close(fd);
        return res;
 #endif
@@ -93,6 +94,7 @@ RESULT eDVBDemux::setSourcePVR(int pvrnum)
        int fd = openDemux();
        int n = DMX_SOURCE_DVR0 + pvrnum;
        int res = ::ioctl(fd, DMX_SET_SOURCE, &n);
        int fd = openDemux();
        int n = DMX_SOURCE_DVR0 + pvrnum;
        int res = ::ioctl(fd, DMX_SET_SOURCE, &n);
+       source = -1;
        ::close(fd);
        return res;
 #endif
        ::close(fd);
        return res;
 #endif
index 3541974e9a39df7666f9b694c6f68a8e5ffa4738..1c0da47c6f6b27f188b5a5f615f3a66b9a623740 100644 (file)
@@ -15,6 +15,7 @@ public:
        virtual ~eDVBDemux();
        
        RESULT setSourceFrontend(int fenum);
        virtual ~eDVBDemux();
        
        RESULT setSourceFrontend(int fenum);
+       int getSource() { return source; }
        RESULT setSourcePVR(int pvrnum);
        
        RESULT createSectionReader(eMainloop *context, ePtr<iDVBSectionReader> &reader);
        RESULT setSourcePVR(int pvrnum);
        
        RESULT createSectionReader(eMainloop *context, ePtr<iDVBSectionReader> &reader);
@@ -28,7 +29,7 @@ public:
        
        int getRefCount() { return ref; }
 private:
        
        int getRefCount() { return ref; }
 private:
-       int adapter, demux;
+       int adapter, demux, source;
        
        int m_dvr_busy;
        friend class eDVBSectionReader;
        
        int m_dvr_busy;
        friend class eDVBSectionReader;
index 23a9d5a9c268518e810519ff975023f7183e8eb0..119025073a10e7c4fcce60300cff830a8a53b4c3 100644 (file)
@@ -374,40 +374,80 @@ RESULT eDVBResourceManager::allocateDemux(eDVBRegisteredFrontend *fe, ePtr<eDVBA
 
        eDebug("allocate demux");
        eSmartPtrList<eDVBRegisteredDemux>::iterator i(m_demux.begin());
 
        eDebug("allocate demux");
        eSmartPtrList<eDVBRegisteredDemux>::iterator i(m_demux.begin());
-       
+
+       int n=0;
+
        if (i == m_demux.end())
                return -1;
        if (i == m_demux.end())
                return -1;
-               
-       int n=0;
-               /* FIXME: hardware demux policy */
-       if (!(cap & iDVBChannel::capDecode))
+       
+       ePtr<eDVBRegisteredDemux> unused;
+       
+       if (m_demux.length() < 5)
        {
        {
-               if (m_demux.size() > 2)  /* assumed to be true, otherwise we have lost anyway */
+               /* FIXME: hardware demux policy */
+               if (!(cap & iDVBChannel::capDecode))
                {
                {
-                       ++i, ++n;
-                       ++i, ++n;
+                       if (m_demux.size() > 2)  /* assumed to be true, otherwise we have lost anyway */
+                       {
+                               ++i, ++n;
+                               ++i, ++n;
+                       }
                }
                }
-       }
-       
-       for (; i != m_demux.end(); ++i, ++n)
-       {
-               int is_decode = n < 2;
+
+               for (; i != m_demux.end(); ++i, ++n)
+               {
+                       int is_decode = n < 2;
                
                
-               int in_use = is_decode ? (i->m_demux->getRefCount() != 2) : i->m_inuse;
+                       int in_use = is_decode ? (i->m_demux->getRefCount() != 2) : i->m_inuse;
                
                
-               if ((!in_use) && ((!fe) || (i->m_adapter == fe->m_adapter)))
+                       if ((!in_use) && ((!fe) || (i->m_adapter == fe->m_adapter)))
+                       {
+                               if ((cap & iDVBChannel::capDecode) && !is_decode)
+                                       continue;
+                               unused = i;     
+                               break;
+                       }
+               }
+       }
+       else // we asume dm8000
+       {
+               for (; i != m_demux.end(); ++i, ++n)
                {
                {
-                       if ((cap & iDVBChannel::capDecode) && !is_decode)
-                               continue;
-                       
-                       demux = new eDVBAllocatedDemux(i);
                        if (fe)
                        if (fe)
-                               demux->get().setSourceFrontend(fe->m_frontend->getDVBID());
-                       else
-                               demux->get().setSourcePVR(0);
-                       return 0;
+                       {
+                               if (!i->m_inuse)
+                               {
+                                       if (!unused)
+                                               unused = i;
+                               }
+                               else if (i->m_adapter == fe->m_adapter && 
+                                   i->m_demux->getSource() == fe->m_frontend->getDVBID())
+                               {
+                                       demux = new eDVBAllocatedDemux(i);
+                                       return 0;
+                               }
+                       }
+                       else if (n == 4) // always use demux4 for PVR (demux 4 can not descramble...)
+                       {
+                               if (i->m_inuse) {
+                                       demux = new eDVBAllocatedDemux(i);
+                                       return 0;
+                               }
+                               unused = i;
+                       }
                }
        }
                }
        }
+
+       if (unused)
+       {
+               demux = new eDVBAllocatedDemux(unused);
+               if (fe)
+                       demux->get().setSourceFrontend(fe->m_frontend->getDVBID());
+               else
+                       demux->get().setSourcePVR(0);
+               return 0;
+       }
+
        eDebug("demux not found");
        return -1;
 }
        eDebug("demux not found");
        return -1;
 }