ci fixes (TODO: build reel ci resource handling.. at moment the first service get...
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Thu, 24 Nov 2005 12:34:05 +0000 (12:34 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Thu, 24 Nov 2005 12:34:05 +0000 (12:34 +0000)
lib/dvb/pmt.cpp
lib/dvb_ci/dvbci.cpp
lib/dvb_ci/dvbci.h

index 017c31d..54d189f 100644 (file)
@@ -13,7 +13,6 @@ eDVBServicePMTHandler::eDVBServicePMTHandler(int record)
        eDVBResourceManager::getInstance(m_resourceManager);
        CONNECT(m_PMT.tableReady, eDVBServicePMTHandler::PMTready);
        CONNECT(m_PAT.tableReady, eDVBServicePMTHandler::PATready);
        eDVBResourceManager::getInstance(m_resourceManager);
        CONNECT(m_PMT.tableReady, eDVBServicePMTHandler::PMTready);
        CONNECT(m_PAT.tableReady, eDVBServicePMTHandler::PATready);
-       eDVBCIInterfaces::getInstance()->addPMTHandler(this);
        eDebug("new PMT handler record: %d", m_record);
 }
 
        eDebug("new PMT handler record: %d", m_record);
 }
 
@@ -28,8 +27,8 @@ eDVBServicePMTHandler::~eDVBServicePMTHandler()
                ePtr<eTable<ProgramMapSection> > ptr;
                m_PMT.getCurrent(ptr);
                eDVBCAService::unregister_service(m_reference, demux_num, ptr);
                ePtr<eTable<ProgramMapSection> > ptr;
                m_PMT.getCurrent(ptr);
                eDVBCAService::unregister_service(m_reference, demux_num, ptr);
+               eDVBCIInterfaces::getInstance()->removePMTHandler(this);
        }
        }
-       eDVBCIInterfaces::getInstance()->removePMTHandler(this);
 }
 
 void eDVBServicePMTHandler::channelStateChanged(iDVBChannel *channel)
 }
 
 void eDVBServicePMTHandler::channelStateChanged(iDVBChannel *channel)
@@ -74,13 +73,14 @@ void eDVBServicePMTHandler::PMTready(int error)
                serviceEvent(eventNewProgramInfo);
                if (!m_pvr_channel)
                {
                serviceEvent(eventNewProgramInfo);
                if (!m_pvr_channel)
                {
-                       eDVBCIInterfaces::getInstance()->gotPMT(this);
                        if(!m_ca_servicePtr)   // don't send campmt to camd.socket for playbacked services
                        {
                                uint8_t demux_num;
                                m_demux->getCADemuxID(demux_num);
                                eDVBCAService::register_service(m_reference, demux_num, m_ca_servicePtr);
                        if(!m_ca_servicePtr)   // don't send campmt to camd.socket for playbacked services
                        {
                                uint8_t demux_num;
                                m_demux->getCADemuxID(demux_num);
                                eDVBCAService::register_service(m_reference, demux_num, m_ca_servicePtr);
+                               eDVBCIInterfaces::getInstance()->addPMTHandler(this);
                        }
                        }
+                       eDVBCIInterfaces::getInstance()->gotPMT(this);
                }
                if (m_ca_servicePtr)
                {
                }
                if (m_ca_servicePtr)
                {
index e3fd938..8f1fcac 100644 (file)
@@ -143,45 +143,70 @@ void eDVBCIInterfaces::addPMTHandler(eDVBServicePMTHandler *pmthandler)
        eServiceReferenceDVB service;
        pmthandler->getService(service);
 
        eServiceReferenceDVB service;
        pmthandler->getService(service);
 
-       PMTHandlerSet::iterator it = m_pmt_handlers.begin();
-       while (it != m_pmt_handlers.end())
+       eDebug("[eDVBCIInterfaces] addPMTHandler %s", service.toString().c_str());
+
+       // HACK the first service get the CI..
+       eSmartPtrList<eDVBCISlot>::iterator ci_it(m_slots.begin());
+       for (; ci_it != m_slots.end(); ++ci_it)
        {
        {
-               eServiceReferenceDVB ref;
-               it->pmthandler->getService(ref);
-               if ( service == ref && it->usedby )
-                       new_handler.usedby = it->usedby;
-               break;
+               if (ci_it->use_count)
+                       continue;
+               ci_it->use_count=1;
+               new_handler.cislot = ci_it;
+               new_handler.cislot->resetPrevSentCAPMTVersion();
+       }
+
+       if (ci_it == m_slots.end())
+       {
+               PMTHandlerList::iterator it = m_pmt_handlers.begin();
+               while (it != m_pmt_handlers.end())
+               {
+                       eServiceReferenceDVB ref;
+                       it->pmthandler->getService(ref);
+                       if ( service == ref && it->cislot )
+                       {
+                               new_handler.cislot = it->cislot;
+                               ++new_handler.cislot->use_count;
+                               break;
+                       }
+                       ++it;
+               }
        }
        }
-       m_pmt_handlers.insert(new_handler);
+
+       m_pmt_handlers.push_back(new_handler);
 }
 
 void eDVBCIInterfaces::removePMTHandler(eDVBServicePMTHandler *pmthandler)
 {
 }
 
 void eDVBCIInterfaces::removePMTHandler(eDVBServicePMTHandler *pmthandler)
 {
-       PMTHandlerSet::iterator it=m_pmt_handlers.find(pmthandler);
+       PMTHandlerList::iterator it=std::find(m_pmt_handlers.begin(),m_pmt_handlers.end(),pmthandler);
        if (it != m_pmt_handlers.end())
        {
        if (it != m_pmt_handlers.end())
        {
-               eDVBCISlot *slot = it->usedby;
+               eDVBCISlot *slot = it->cislot;
                eDVBServicePMTHandler *pmthandler = it->pmthandler;
                m_pmt_handlers.erase(it);
                eDVBServicePMTHandler *pmthandler = it->pmthandler;
                m_pmt_handlers.erase(it);
-               if (slot)
+               if (slot && !--slot->use_count)
                {
                {
-                       eServiceReferenceDVB removed_service;
-                       pmthandler->getService(removed_service);
-                       PMTHandlerSet::iterator it=m_pmt_handlers.begin();
+#if 0
+                       eDebug("[eDVBCIInterfaces] remove last pmt handler for service %s send empty capmt");
+                       std::vector<uint16_t> caids;
+                       caids.push_back(0xFFFF);
+                       slot->resetPrevSentCAPMTVersion();
+                       slot->sendCAPMT(pmthandler, caids);
+#endif
+       // check if another service is running
+                       it = m_pmt_handlers.begin();
                        while (it != m_pmt_handlers.end())
                        {
                        while (it != m_pmt_handlers.end())
                        {
-                               eServiceReferenceDVB ref;
-                               it->pmthandler->getService(ref);
-                               if (ref == removed_service)
+                               if ( !it->cislot )
+                               {
+                                       it->cislot = slot;
+                                       ++slot->use_count;
+                                       slot->resetPrevSentCAPMTVersion();
+                                       slot->sendCAPMT(it->pmthandler);
                                        break;
                                        break;
+                               }
                                ++it;
                        }
                                ++it;
                        }
-                       if ( it == m_pmt_handlers.end() && slot->getPrevSentCAPMTVersion() != 0xFF  )
-                       {
-                               std::vector<uint16_t> caids;
-                               caids.push_back(0xFFFF);
-                               slot->sendCAPMT(pmthandler, caids);
-                       }
                }
        }
 }
                }
        }
 }
@@ -189,26 +214,10 @@ void eDVBCIInterfaces::removePMTHandler(eDVBServicePMTHandler *pmthandler)
 void eDVBCIInterfaces::gotPMT(eDVBServicePMTHandler *pmthandler)
 {
        eDebug("[eDVBCIInterfaces] gotPMT");
 void eDVBCIInterfaces::gotPMT(eDVBServicePMTHandler *pmthandler)
 {
        eDebug("[eDVBCIInterfaces] gotPMT");
-       PMTHandlerSet::iterator it=m_pmt_handlers.find(pmthandler);
+       PMTHandlerList::iterator it=std::find(m_pmt_handlers.begin(), m_pmt_handlers.end(), pmthandler);
        eServiceReferenceDVB service;
        eServiceReferenceDVB service;
-       if ( it != m_pmt_handlers.end() )
-       {
-               eDebug("[eDVBCIInterfaces] usedby %p", it->usedby);
-               if (!it->usedby)
-               {
-                       // HACK this assigns ALL RUNNING SERVICES to the first free CI !!!
-                       for (eSmartPtrList<eDVBCISlot>::iterator ci_it(m_slots.begin()); ci_it != m_slots.end(); ++ci_it)
-                       {
-/*                             eDVBCISlot **usedby = &it->usedby;
-                               *usedby = ci_it;
-                               (*usedby)->resetPrevSentCAPMTVersion();
-                               break;
-                               */
-                       }
-               }
-               if (it->usedby)
-                       it->usedby->sendCAPMT(pmthandler);
-       }
+       if ( it != m_pmt_handlers.end() && it->cislot)
+               it->cislot->sendCAPMT(pmthandler);
 }
 
 int eDVBCIInterfaces::getMMIState(int slotid)
 }
 
 int eDVBCIInterfaces::getMMIState(int slotid)
@@ -294,6 +303,7 @@ eDVBCISlot::eDVBCISlot(eMainloop *context, int nr)
        application_manager = 0;
        mmi_session = 0;
        ca_manager = 0;
        application_manager = 0;
        mmi_session = 0;
        ca_manager = 0;
+       use_count = 0;
        
        slotid = nr;
 
        
        slotid = nr;
 
index 1921ad7..0c1051b 100644 (file)
@@ -10,6 +10,7 @@ class eDVBCIApplicationManagerSession;
 class eDVBCICAManagerSession;
 class eDVBCIMMISession;
 class eDVBServicePMTHandler;
 class eDVBCICAManagerSession;
 class eDVBCIMMISession;
 class eDVBServicePMTHandler;
+class eDVBCISlot;
 
 class eDVBCISlot: public iObject, public Object
 {
 
 class eDVBCISlot: public iObject, public Object
 {
@@ -24,6 +25,8 @@ private:
        enum {stateRemoved, stateInserted};
        uint8_t prev_sent_capmt_version;
 public:
        enum {stateRemoved, stateInserted};
        uint8_t prev_sent_capmt_version;
 public:
+       int use_count;
+
        eDVBCISlot(eMainloop *context, int nr);
        ~eDVBCISlot();
        
        eDVBCISlot(eMainloop *context, int nr);
        ~eDVBCISlot();
        
@@ -50,20 +53,20 @@ public:
 struct CIPmtHandler
 {
        eDVBServicePMTHandler *pmthandler;
 struct CIPmtHandler
 {
        eDVBServicePMTHandler *pmthandler;
-       eDVBCISlot *usedby;
+       eDVBCISlot *cislot;
        CIPmtHandler()
        CIPmtHandler()
-               :pmthandler(NULL), usedby(NULL)
+               :pmthandler(NULL), cislot(NULL)
        {}
        CIPmtHandler( const CIPmtHandler &x )
        {}
        CIPmtHandler( const CIPmtHandler &x )
-               :pmthandler(x.pmthandler), usedby(x.usedby)
+               :pmthandler(x.pmthandler), cislot(x.cislot)
        {}
        CIPmtHandler( eDVBServicePMTHandler *ptr )
        {}
        CIPmtHandler( eDVBServicePMTHandler *ptr )
-               :pmthandler(ptr), usedby(NULL)
+               :pmthandler(ptr), cislot(NULL)
        {}
        {}
-       bool operator<(const CIPmtHandler &x) const { return x.pmthandler < pmthandler; }
+       bool operator==(const CIPmtHandler &x) const { return x.pmthandler == pmthandler; }
 };
 
 };
 
-typedef std::set<CIPmtHandler> PMTHandlerSet;
+typedef std::list<CIPmtHandler> PMTHandlerList;
 
 class eDVBCIInterfaces
 {
 
 class eDVBCIInterfaces
 {
@@ -73,7 +76,7 @@ private:
        eSmartPtrList<eDVBCISlot>       m_slots;
        eDVBCISlot *getSlot(int slotid);
 
        eSmartPtrList<eDVBCISlot>       m_slots;
        eDVBCISlot *getSlot(int slotid);
 
-       PMTHandlerSet m_pmt_handlers; 
+       PMTHandlerList m_pmt_handlers; 
 public:
        eDVBCIInterfaces();
        ~eDVBCIInterfaces();
 public:
        eDVBCIInterfaces();
        ~eDVBCIInterfaces();