scan: add allocateFrontendByIndex, so ServiceScan uses a fixed frontend ID - currentl...
[enigma2.git] / lib / dvb / dvb.cpp
index 04c2b40eaf2f7edf49e49dcfb11d4c2718453a36..5315c0e5fb215e2ff502544a72f358d9f8ebd639 100644 (file)
@@ -206,7 +206,7 @@ void eDVBResourceManager::addAdapter(iDVBAdapter *adapter)
        }
 }
 
-RESULT eDVBResourceManager::allocateFrontend(ePtr<iDVBFrontendParameters> &feparm, ePtr<eDVBAllocatedFrontend> &fe)
+RESULT eDVBResourceManager::allocateFrontend(ePtr<eDVBAllocatedFrontend> &fe, ePtr<iDVBFrontendParameters> &feparm)
 {
        ePtr<eDVBRegisteredFrontend> best;
        int bestval = 0;
@@ -233,6 +233,19 @@ RESULT eDVBResourceManager::allocateFrontend(ePtr<iDVBFrontendParameters> &fepar
        return -1;
 }
 
+RESULT eDVBResourceManager::allocateFrontendByIndex(ePtr<eDVBAllocatedFrontend> &fe, int nr)
+{
+       for (eSmartPtrList<eDVBRegisteredFrontend>::iterator i(m_frontend.begin()); i != m_frontend.end(); ++i, --nr)
+               if ((!nr) && !i->m_inuse)
+               {
+                       fe = new eDVBAllocatedFrontend(i);
+                       return 0;
+               }
+       
+       fe = 0;
+       return -1;
+}
+
 RESULT eDVBResourceManager::allocateDemux(eDVBRegisteredFrontend *fe, ePtr<eDVBAllocatedDemux> &demux, int cap)
 {
                /* find first unused demux which is on same adapter as frontend (or any, if PVR)
@@ -317,15 +330,9 @@ RESULT eDVBResourceManager::allocateChannel(const eDVBChannelID &channelid, eUse
        
        ePtr<eDVBAllocatedFrontend> fe;
        
-       if (allocateFrontend(feparm, fe))
+       if (allocateFrontend(fe, feparm))
                return errNoFrontend;
        
-// will be allocated on demand:
-//     ePtr<eDVBAllocatedDemux> demux;
-//     
-//     if (allocateDemux(*fe, demux))
-//             return errNoDemux;
-
        RESULT res;
        ePtr<eDVBChannel> ch;
        ch = new eDVBChannel(this, fe);
@@ -341,20 +348,13 @@ RESULT eDVBResourceManager::allocateChannel(const eDVBChannelID &channelid, eUse
        return 0;
 }
 
-RESULT eDVBResourceManager::allocateRawChannel(eUsePtr<iDVBChannel> &channel)
+RESULT eDVBResourceManager::allocateRawChannel(eUsePtr<iDVBChannel> &channel, int frontend_index)
 {
        ePtr<eDVBAllocatedFrontend> fe;
 
-#warning FIXME allocateRawChannel
-
-//     if (allocateFrontend(eDVBChannelID(), fe))
+       if (allocateFrontendByIndex(fe, frontend_index))
                return errNoFrontend;
        
-//     ePtr<eDVBAllocatedDemux> demux;
-       //
-//     if (allocateDemux(*fe, demux))
-//             return errNoDemux;
-       
        eDVBChannel *ch;
        ch = new eDVBChannel(this, fe);
 
@@ -367,9 +367,6 @@ RESULT eDVBResourceManager::allocatePVRChannel(eUsePtr<iDVBPVRChannel> &channel)
 {
        ePtr<eDVBAllocatedDemux> demux;
        
-//     if (allocateDemux(0, demux))
-//             return errNoDemux;
-       
        eDVBChannel *ch;
        ch = new eDVBChannel(this, 0);