pass more information about why a channel alloc fails, and display proper error messa...
authorFelix Domke <tmbinc@elitedvb.net>
Thu, 24 Jan 2008 00:42:20 +0000 (00:42 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Thu, 24 Jan 2008 00:42:20 +0000 (00:42 +0000)
lib/dvb/dvb.cpp
lib/dvb/dvb.h
lib/dvb/pmt.cpp
lib/dvb/pmt.h
lib/python/Screens/InfoBarGenerics.py
lib/service/servicedvb.cpp

index b7d278ccfa4accf21a5b841d1b0b4df59cceb133..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);
 
index e09f0faec16d55f3427cc1c8a329090aface4145..c71a4d1b9a399f9f1d505bc9d7a86a7e0b2b66d1 100644 (file)
@@ -196,9 +196,13 @@ public:
        RESULT getChannelList(ePtr<iDVBChannelList> &list);
        
        enum {
-               errNoFrontend = -1,
+                       /* errNoFrontend = -1 replaced by more spcific messages */
                errNoDemux    = -2,
-               errChidNotFound = -3
+               errChidNotFound = -3,
+               errNoChannelList = -4,
+               errChannelNotInList = -5,
+               errAllSourcesBusy = -6,
+               errNoSourceFound = -7,
        };
        
        RESULT connectChannelAdded(const Slot1<void,eDVBChannel*> &channelAdded, ePtr<eConnection> &connection);
index fc4333862f715f75f00c6133e0186af8c43e7037..f6f33b52da7f09c81d1befe977208f2a79536af4 100644 (file)
@@ -566,7 +566,10 @@ int eDVBServicePMTHandler::tune(eServiceReferenceDVB &ref, int use_decode_demux,
                }
        } else
        {
-               serviceEvent(eventNoResources);
+               if (res == eDVBResourceManager::errAllSourcesBusy)
+                       serviceEvent(eventNoResources);
+               else /* errChidNotFound, errNoChannelList, errChannelNotInList, errNoSourceFound */
+                       serviceEvent(eventMisconfiguration);
                return res;
        }
 
index eae05bb18cd6c15c1e1773cce725a6aad6f06b0a..f34d761aee58ed330bbb5c39879e685ead95c5e5 100644 (file)
@@ -123,6 +123,8 @@ public:
                
                eventSOF,          // seek pre start
                eventEOF,          // a file playback did end
+               
+               eventMisconfiguration, // a channel was not found in any list, or no frontend was found which could provide this channel
        };
 #ifndef SWIG
        Signal1<void,int> serviceEvent;
index 9191729bce5d8604fe88a818c76f83a0d0f218dd..e222b4e13257a22308d7af0957ab5ac8c8c565e6 100644 (file)
@@ -2087,7 +2087,8 @@ class InfoBarServiceErrorPopupSupport:
                        eDVBServicePMTHandler.eventNewProgramInfo: None,
                        eDVBServicePMTHandler.eventTuned: None,
                        eDVBServicePMTHandler.eventSOF: None,
-                       eDVBServicePMTHandler.eventEOF: None
+                       eDVBServicePMTHandler.eventEOF: None,
+                       eDVBServicePMTHandler.eventMisconfiguration: _("Service unavailable!\nCheck tuner configuration!"),
                }
 
                error = errors.get(error) #this returns None when the key not exist in the dict
index 53bc17a8d8c82fe7699520a1c6ec98fa16477a8f..2d770fb05eb2486bcce401a284a106af238859b2 100644 (file)
@@ -1103,6 +1103,7 @@ void eDVBServicePlay::serviceEvent(int event)
        case eDVBServicePMTHandler::eventNoPATEntry:
        case eDVBServicePMTHandler::eventNoPMT:
        case eDVBServicePMTHandler::eventTuneFailed:
+       case eDVBServicePMTHandler::eventMisconfiguration:
        {
                eDebug("DVB service failed to tune - error %d", event);
                m_event((iPlayableService*)this, evTuneFailed);