pass more information about why a channel alloc fails, and display proper error messa...
[enigma2.git] / lib / dvb / dvb.cpp
index 03c2aab6167e3a301133614e6e8275ef8126bc5b..0eb614db0626d34aa9181f1a0d626e16e8b9f339 100644 (file)
@@ -280,31 +280,42 @@ RESULT eDVBResourceManager::allocateFrontend(ePtr<eDVBAllocatedFrontend> &fe, eP
 {
        ePtr<eDVBRegisteredFrontend> best;
        int bestval = 0;
+       int foundone = 0;
 
        for (eSmartPtrList<eDVBRegisteredFrontend>::iterator i(m_frontend.begin()); i != m_frontend.end(); ++i)
+       {
+               int c = i->m_frontend->isCompatibleWith(feparm);
+
+               if (c)  /* if we have at least one frontend which is compatible with the source, flag this. */
+                       foundone = 1;
+
                if (!i->m_inuse)
                {
-                       int c = i->m_frontend->isCompatibleWith(feparm);
                        if (c > bestval)
                        {
                                bestval = c;
                                best = i;
                        }
                }
+       }
 
        if (best)
        {
                fe = new eDVBAllocatedFrontend(best);
                return 0;
        }
-       
+
        fe = 0;
-       
-       return -1;
+
+       if (foundone)
+               return errAllSourcesBusy;
+       else
+               return errNoSourceFound;
 }
 
 RESULT eDVBResourceManager::allocateFrontendByIndex(ePtr<eDVBAllocatedFrontend> &fe, int slot_index)
 {
+       int err = errNoSourceFound;
        for (eSmartPtrList<eDVBRegisteredFrontend>::iterator i(m_frontend.begin()); i != m_frontend.end(); ++i)
                if (!i->m_inuse && i->m_frontend->getSlotID() == slot_index)
                {
@@ -316,6 +327,7 @@ RESULT eDVBResourceManager::allocateFrontendByIndex(ePtr<eDVBAllocatedFrontend>
                                if (satpos_depends_to_fe->m_inuse)
                                {
                                        eDebug("another satpos depending frontend is in use.. so allocateFrontendByIndex not possible!");
+                                       err = errAllSourcesBusy;
                                        goto alloc_fe_by_id_not_possible;
                                }
                        }
@@ -328,6 +340,7 @@ RESULT eDVBResourceManager::allocateFrontendByIndex(ePtr<eDVBAllocatedFrontend>
                                        if (next->m_inuse)
                                        {
                                                eDebug("another linked frontend is in use.. so allocateFrontendByIndex not possible!");
+                                               err = errAllSourcesBusy;
                                                goto alloc_fe_by_id_not_possible;
                                        }
                                        next = (eDVBRegisteredFrontend *)next->m_frontend->m_data[eDVBFrontend::LINKED_NEXT_PTR];
@@ -339,6 +352,7 @@ RESULT eDVBResourceManager::allocateFrontendByIndex(ePtr<eDVBAllocatedFrontend>
                                        if (prev->m_inuse)
                                        {
                                                eDebug("another linked frontend is in use.. so allocateFrontendByIndex not possible!");
+                                               err = errAllSourcesBusy;
                                                goto alloc_fe_by_id_not_possible;
                                        }
                                        prev = (eDVBRegisteredFrontend *)prev->m_frontend->m_data[eDVBFrontend::LINKED_PREV_PTR];
@@ -349,7 +363,7 @@ RESULT eDVBResourceManager::allocateFrontendByIndex(ePtr<eDVBAllocatedFrontend>
                }
 alloc_fe_by_id_not_possible:
        fe = 0;
-       return -1;
+       return err;
 }
 
 RESULT eDVBResourceManager::allocateDemux(eDVBRegisteredFrontend *fe, ePtr<eDVBAllocatedDemux> &demux, int cap)
@@ -447,22 +461,23 @@ RESULT eDVBResourceManager::allocateChannel(const eDVBChannelID &channelid, eUse
        if (!m_list)
        {
                eDebug("no channel list set!");
-               return -ENOENT;
+               return errNoChannelList;
        }
 
        ePtr<iDVBFrontendParameters> feparm;
        if (m_list->getChannelFrontendData(channelid, feparm))
        {
                eDebug("channel not found!");
-               return -ENOENT;
+               return errChannelNotInList;
        }
 
        /* allocate a frontend. */
        
        ePtr<eDVBAllocatedFrontend> fe;
-       
-       if (allocateFrontend(fe, feparm))
-               return errNoFrontend;
+
+       int err = allocateFrontend(fe, feparm);
+       if (err)
+               return err;
 
        RESULT res;
        ePtr<eDVBChannel> ch;
@@ -522,9 +537,10 @@ RESULT eDVBResourceManager::allocateRawChannel(eUsePtr<iDVBChannel> &channel, in
                m_releaseCachedChannelTimer.stop();
        }
 
-       if (allocateFrontendByIndex(fe, slot_index))
-               return errNoFrontend;
-       
+       int err = allocateFrontendByIndex(fe, slot_index);
+       if (err)
+               return err;
+
        eDVBChannel *ch;
        ch = new eDVBChannel(this, fe);
 
@@ -597,14 +613,41 @@ int eDVBResourceManager::canAllocateFrontend(ePtr<iDVBFrontendParameters> &fepar
        return bestval;
 }
 
+int tuner_type_channel_default(ePtr<iDVBChannelList> &channellist, const eDVBChannelID &chid)
+{
+       if (channellist)
+       {
+               ePtr<iDVBFrontendParameters> feparm;
+               if (!channellist->getChannelFrontendData(chid, feparm))
+               {
+                       int system;
+                       if (!feparm->getSystem(system))
+                       {
+                               switch(system)
+                               {
+                                       case iDVBFrontend::feSatellite:
+                                               return 50000;
+                                       case iDVBFrontend::feCable:
+                                               return 40000;
+                                       case iDVBFrontend::feTerrestrial:
+                                               return 30000;
+                                       default:
+                                               break;
+                               }
+                       }
+               }
+       }
+       return 0;
+}
+
 int eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, const eDVBChannelID& ignore)
 {
-       int ret=30000;
+       int ret=0;
        if (m_cached_channel)
        {
                eDVBChannel *cache_chan = (eDVBChannel*)&(*m_cached_channel);
                if(channelid==cache_chan->getChannelID())
-                       return ret;
+                       return tuner_type_channel_default(m_list, channelid);
        }
 
                /* first, check if a channel is already existing. */
@@ -615,7 +658,7 @@ int eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, cons
                if (i->m_channel_id == channelid)
                {
 //                     eDebug("found shared channel..");
-                       return ret;
+                       return tuner_type_channel_default(m_list, channelid);
                }
        }
 
@@ -685,14 +728,12 @@ int eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, cons
        if (!m_list)
        {
                eDebug("no channel list set!");
-               ret = 0;
                goto error;
        }
 
        if (m_list->getChannelFrontendData(channelid, feparm))
        {
                eDebug("channel not found!");
-               ret = 0;
                goto error;
        }