X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/66fb1ae9101fc20911a7a1585b333b2333cf697a..0cb7bd236d96662117bf8928cedd953b7b68579f:/lib/dvb/epgcache.h diff --git a/lib/dvb/epgcache.h b/lib/dvb/epgcache.h index bc25692e..5dea4630 100644 --- a/lib/dvb/epgcache.h +++ b/lib/dvb/epgcache.h @@ -1,8 +1,6 @@ #ifndef __epgcache_h_ #define __epgcache_h_ -#ifndef SWIG - #include #include #include @@ -75,15 +73,16 @@ struct uniqueEPGKey //timeMap is sorted by beginTime #define timeMap std::map +#define channelMapIterator std::map::iterator + #define tmpMap std::map > +#define updateMap std::map #if defined(__GNUC__) && ((__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || __GNUC__ == 4 ) // check if gcc version >= 3.1 #define eventCache __gnu_cxx::hash_map, __gnu_cxx::hash, uniqueEPGKey::equal> - #define updateMap __gnu_cxx::hash_map, uniqueEPGKey::equal > namespace __gnu_cxx #else // for older gcc use following #define eventCache std::hash_map, std::hash, uniqueEPGKey::equal > - #define updateMap std::hash_map, uniqueEPGKey::equal > namespace std #endif { @@ -91,9 +90,7 @@ template<> struct hash { inline size_t operator()( const uniqueEPGKey &x) const { - int v=(x.onid^x.sid); - v^=v>>8; - return v&0xFF; + return (x.tsid << 16) | x.onid; } }; } @@ -139,32 +136,44 @@ public: EITdata[4], EITdata[5], EITdata[6]); } }; -#else - #include -#endif class eEPGCache: public eMainloop, private eThread, public Object { DECLARE_REF(eEPGCache) + struct channel_data: public Object + { + channel_data(eEPGCache*); + eEPGCache *cache; + eTimer abortTimer, zapTimer; + __u8 state, isRunning, haveData, can_delete; + ePtr channel; + ePtr m_stateChangedConn, m_NowNextConn, m_ScheduleConn, m_ScheduleOtherConn; + ePtr m_NowNextReader, m_ScheduleReader, m_ScheduleOtherReader; + void readData(const __u8 *data); + void startChannel(); + void startEPG(); + bool finishEPG(); + void abortEPG(); + void abortNonAvail(); + }; public: -#ifndef SWIG - enum {NOWNEXT, SCHEDULE, SCHEDULE_OTHER}; + enum {NOWNEXT=1, SCHEDULE=2, SCHEDULE_OTHER=4}; struct Message { enum { flush, - startService, + startChannel, leaveChannel, pause, restart, updated, isavail, quit, - timeChanged, - leaveChannelFinished + timeChanged }; int type; + iDVBChannel *channel; uniqueEPGKey service; union { int err; @@ -177,78 +186,53 @@ public: :type(type) {} Message(int type, bool b) :type(type), avail(b) {} + Message(int type, iDVBChannel *channel, int err=0) + :type(type), channel(channel), err(err) {} Message(int type, const eServiceReferenceDVB& service, int err=0) :type(type), service(service), err(err) {} Message(int type, time_t time) :type(type), time(time) {} }; eFixedMessagePump messages; - eFixedMessagePump back_messages; private: - static pthread_mutex_t cache_lock; - eServiceReferenceDVB next_service; - uniqueEPGKey current_service; - int paused; - - int state; - __u8 isRunning, haveData; - - ePtr m_currentChannel; - ePtr m_NowNextConn, m_ScheduleConn, m_ScheduleOtherConn; - ePtr m_NowNextReader, m_ScheduleReader, m_ScheduleOtherReader; - - int sectionRead(const __u8 *data, int source); - void readNowNextData(const __u8 *data); - void readScheduleData(const __u8 *data); - void readScheduleOtherData(const __u8 *data); - + friend class channel_data; static eEPGCache *instance; + eTimer cleanTimer; + std::map m_knownChannels; + ePtr m_chanAddedConn; + eventCache eventDB; - updateMap serviceLastUpdated; - tmpMap temp; - eTimer CleanTimer; - eTimer zapTimer; - eTimer abortTimer; - bool finishEPG(); - void abortNonAvail(); - void flushEPG(const uniqueEPGKey & s=uniqueEPGKey()); - void startEPG(); + updateMap channelLastUpdated; + static pthread_mutex_t cache_lock, channel_map_lock; - void changedService(const uniqueEPGKey &); - void abortEPG(); + void thread(); // thread function - void cleanLoop(); - void pauseEPG(); - void restartEPG(); - void thread(); - void gotMessage(const Message &message); - void gotBackMessage(const Message &message); - void timeUpdated(); +// called from epgcache thread void save(); void load(); - void leaveChannel(iDVBChannel *); -#endif + int sectionRead(const __u8 *data, int source, channel_data *channel); + void gotMessage(const Message &message); + void flushEPG(const uniqueEPGKey & s=uniqueEPGKey()); + void cleanLoop(); + +// called from main thread + void timeUpdated(); + void DVBChannelAdded(eDVBChannel*); + void DVBChannelStateChanged(iDVBChannel*); + void DVBChannelRunning(iDVBChannel *); public: static RESULT getInstance(ePtr &ptr); - // called from other thread context !! - void startCache(const eServiceReferenceDVB &); - Event *lookupEvent(const eServiceReferenceDVB &service, int event_id, bool plain=false ); - Event *lookupEvent(const eServiceReferenceDVB &service, time_t=0, bool plain=false ); -#ifndef SWIG eEPGCache(); ~eEPGCache(); + // called from main thread inline void Lock(); inline void Unlock(); - + Event *lookupEvent(const eServiceReferenceDVB &service, int event_id, bool plain=false ); + Event *lookupEvent(const eServiceReferenceDVB &service, time_t=0, bool plain=false ); const eventMap* getEventMap(const eServiceReferenceDVB &service); const timeMap* getTimeMap(const eServiceReferenceDVB &service); - tmpMap* getUpdatedMap() { return &temp; } - - Signal1 EPGAvail; - Signal0 EPGUpdated; -#endif }; TEMPLATE_TYPEDEF(ePtr,eEPGCachePtr); @@ -271,30 +255,6 @@ inline const timeMap* eEPGCache::getTimeMap(const eServiceReferenceDVB &service) return 0; } -inline void eEPGCache::readNowNextData( const __u8 *data) -{ - if ( !data || state == 2 ) - m_NowNextReader->stop(); - else - sectionRead(data, eEPGCache::NOWNEXT); -} - -inline void eEPGCache::readScheduleData(const __u8 *data) -{ - if ( !data || state == 2 ) - m_ScheduleReader->stop(); - else - sectionRead(data, eEPGCache::SCHEDULE); -} - -inline void eEPGCache::readScheduleOtherData(const __u8 *data) -{ - if ( !data || state == 2 ) - m_ScheduleOtherReader->stop(); - else - sectionRead(data, eEPGCache::SCHEDULE_OTHER); -} - inline void eEPGCache::Lock() { pthread_mutex_lock(&cache_lock);