add own demux policy for dm8000 which now have 5 demux devices one for each
[enigma2.git] / lib / dvb / dvb.cpp
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());
-       
+
+       int n=0;
+
        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)
-                               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;
 }