diff options
-rw-r--r-- | eepg.c | 30 | ||||
-rw-r--r-- | eit2.c | 76 | ||||
-rw-r--r-- | eit2.h | 8 |
3 files changed, 60 insertions, 54 deletions
@@ -2917,36 +2917,8 @@ void cFilterEEPG::ProccessContinuous(u_short Pid, u_char Tid, int Length, const { //0x39 Viasat, 0x0300 Dish Network EEPG, 0x0441 Bell ExpressVU EEPG LogD(4, prep("Pid: 0x%02x Tid: %d Length: %d"), Pid, Tid, Length); -#if APIVERSNUM >= 20300 - LOCK_CHANNELS_WRITE; - LOCK_SCHEDULES_WRITE; -// cStateKey SchedulesStateKey; -// cSchedules *Schedules = cSchedules::GetSchedulesWrite(SchedulesStateKey, 10); -#else - cSchedulesLock SchedulesLock(true, 10); - cSchedules *Schedules = (cSchedules*)(cSchedules::Schedules(SchedulesLock)); -#endif //Look for other satelite positions only if Dish/Bell ExpressVU for the moment hardcoded pid check - if(Channels && Schedules) - SI::cEIT2 EIT(Channels, Schedules, Source(), Tid, Data, Format, Pid == EIT_PID); - -#if APIVERSNUM < 20300 - else//cEIT EIT (Schedules, Source (), Tid, Data); - { - // If we don't get a write lock, let's at least get a read lock, so - // that we can set the running status and 'seen' timestamp (well, actually - // with a read lock we shouldn't be doing that, but it's only integers that - // get changed, so it should be ok) - cChannelsLock ChannelsLock; - cChannels *Channels = (cSchedules*)(cSchedules::Schedules(SchedulesLock)); - cSchedulesLock SchedulesLock; - cSchedules *Schedules = (cSchedules*)(cSchedules::Schedules(SchedulesLock)); - if(Channels && Schedules) - SI::cEIT2 EIT(Channels, Schedules, Source(), Tid, Data, Format, Pid == EIT_PID, true); - - //cEIT EIT (Schedules, Source (), Tid, Data, true); - } -#endif + SI::cEIT2 EIT(Source(), Tid, Data, Format, Pid == EIT_PID); } void cFilterEEPG::Process (u_short Pid, u_char Tid, const u_char * Data, int Length) @@ -90,18 +90,17 @@ cEvent* cEIT2::ProcessEitEvent(cSchedule* pSchedule,const SI::EIT::Event* EitEve pEvent->SetVersion (versionNumber); ProcessEventDescriptors(ExternalData, channel->Source(), Tid, EitEvent, - pEvent, Schedules, channel->GetChannelID()); + pEvent, channel->GetChannelID()); Modified = true; return pEvent; } -void cEIT2::ProcessEventDescriptors(bool ExternalData, int Source, - u_char Tid, const SI::EIT::Event* SiEitEvent, cEvent* pEvent, - cSchedules* Schedules, const tChannelID& channelId) +void cEIT2::ProcessEventDescriptors(bool ExternalData, int Source, u_char Tid, + const SI::EIT::Event* SiEitEvent, cEvent* pEvent, const tChannelID& channelId) { - cEvent *rEvent = NULL; + const cEvent *rEvent = NULL; int LanguagePreferenceShort = -1; int LanguagePreferenceExt = -1; unsigned char nDescriptorTag; @@ -114,14 +113,14 @@ void cEIT2::ProcessEventDescriptors(bool ExternalData, int Source, //uchar DishTheme = 0, DishCategory = 0; - cLinkChannels *LinkChannels = NULL; + //cLinkChannels *LinkChannels = NULL; cComponents *Components = NULL; -#if APIVERSNUM >= 20300 +/*#if APIVERSNUM >= 20300 cChannel *channel = Channels->GetByChannelID(channelId); #else cChannel *channel = Channels.GetByChannelID(channelId); -#endif +#endif*/ DescriptorLoop dl = SiEitEvent->eventDescriptors; for (SI::Loop::Iterator it2; (d = dl.getNext(it2)); ) @@ -232,13 +231,19 @@ void cEIT2::ProcessEventDescriptors(bool ExternalData, int Source, } break; case SI::TimeShiftedEventDescriptorTag: { +#if APIVERSNUM >= 20300 + LOCK_SCHEDULES_READ; +#else + cSchedulesLock SchedulesLock; + cSchedules *Schedules = (cSchedules*)(cSchedules::Schedules(SchedulesLock)); +#endif if (Schedules) { SI::TimeShiftedEventDescriptor * tsed = (SI::TimeShiftedEventDescriptor *) d; - cSchedule *rSchedule = (cSchedule *) Schedules->GetSchedule( + const cSchedule *rSchedule = Schedules->GetSchedule( tChannelID(Source, channel->Nid(), channel->Tid(), tsed->getReferenceServiceId())); if (!rSchedule) break; - rEvent = (cEvent *) rSchedule->GetEvent(tsed->getReferenceEventId()); + rEvent = rSchedule->GetEvent(tsed->getReferenceEventId()); if (!rEvent) break; pEvent->SetTitle(rEvent->Title()); @@ -248,7 +253,8 @@ void cEIT2::ProcessEventDescriptors(bool ExternalData, int Source, } break; case SI::LinkageDescriptorTag: { - SI::LinkageDescriptor * ld = (SI::LinkageDescriptor *) d; + //Leave channel linking to VDR +/* SI::LinkageDescriptor * ld = (SI::LinkageDescriptor *) d; tChannelID linkID(Source, ld->getOriginalNetworkId(), ld->getTransportStreamId(), ld->getServiceId()); if (ld->getLinkageType() == 0xB0) { // Premiere World @@ -290,7 +296,7 @@ void cEIT2::ProcessEventDescriptors(bool ExternalData, int Source, else channel->SetPortalName(linkName); } - } + }*/ } break; case SI::ComponentDescriptorTag: { @@ -455,15 +461,13 @@ void cEIT2::ProcessEventDescriptors(bool ExternalData, int Source, if (Format != DISH_BEV) pEvent->FixEpgBugs(); - if (LinkChannels) - channel->SetLinkChannels (LinkChannels); + //if (LinkChannels) + //channel->SetLinkChannels (LinkChannels); } -cEIT2::cEIT2 (cChannels* Channels, cSchedules * Schedules, int Source, u_char Tid, const u_char * Data, EFormat format, bool isEITPid, bool OnlyRunningStatus) +cEIT2::cEIT2 (int Source, u_char Tid, const u_char * Data, EFormat format, bool isEITPid) : SI::EIT (Data, false) -, OnlyRunningStatus(OnlyRunningStatus) -, Channels(Channels) -, Schedules(Schedules) +, OnlyRunningStatus(false) , Format(format) { @@ -486,6 +490,41 @@ cEIT2::cEIT2 (cChannels* Channels, cSchedules * Schedules, int Source, u_char Ti //LogD(5, prep("channelID: %s format:%d"), *channel->GetChannelID().ToString(), Format); +#if APIVERSNUM >= 20300 + LOCK_CHANNELS_WRITE; + if (!Channels) { + LogD(3, prep("Error obtaining channels lock")); + return; + } + LOCK_SCHEDULES_WRITE; + if (!Schedules) { + LogD(3, prep("Error obtaining schedules lock")); + return; + } +#else + cChannelsLock ChannelsLock(true, 10), ChannelsLockR; + cChannels *Channels = (cChannels*)(cChannels::Channels(ChannelsLock)); + cSchedulesLock SchedulesLock(true, 10), SchedulesLockR; + cSchedules *Schedules = (cSchedules*)(cSchedules::Schedules(SchedulesLock)); + if (!Channels) { + LogD(3, prep("Error obtaining channels lock")); + OnlyRunningStatus = true; + cChannels *Channels = (cChannels*)(cChannels::Channels(ChannelsLockR)); + } + if (!Schedules) { + // If we don't get a write lock, let's at least get a read lock, so + // that we can set the running status and 'seen' timestamp (well, actually + // with a read lock we shouldn't be doing that, but it's only integers that + // get changed, so it should be ok) + LogD(3, prep("Error obtaining schedules lock")); + OnlyRunningStatus = true; + cSchedules *Schedules = (cSchedules*)(cSchedules::Schedules(SchedulesLockR)); + } + if (!Schedules || !Channels) { + LogD(3, prep("Error obtaining read lock")); + return; + } +#endif cSchedule *pSchedule = (cSchedule *) Schedules->GetSchedule (channel, true); Empty = true; @@ -602,7 +641,6 @@ cEIT2::cEIT2 (cSchedule * Schedule, EFormat format) , OnlyRunningStatus(false) , SegmentStart(0) , SegmentEnd(0) -, Schedules(NULL) , Format(format) { //LogD(2, prep("cEIT2::cEIT2")); @@ -51,9 +51,7 @@ extern bool SystemCharacterTableIsSingleByte;*/ class cEIT2:public SI::EIT { public: - cEIT2(cChannels* Channels, cSchedules * Schedules, int Source, u_char Tid, const u_char * Data, - EFormat format, bool isEITPid = false, - bool OnlyRunningStatus = false); + cEIT2 (int Source, u_char Tid, const u_char * Data, EFormat format, bool isEITPid = false); cEIT2 (cSchedule * Schedule, EFormat format); //protected: // void updateEquivalent(cSchedules * Schedules, tChannelID channelID, cEvent *pEvent); @@ -62,7 +60,7 @@ public: private: void ProcessEventDescriptors(bool ExternalData, int Source, u_char Tid, const SI::EIT::Event* SiEitEvent, cEvent* pEvent, - cSchedules* Schedules, const tChannelID& channelID); + const tChannelID& channelID); private: bool Empty; @@ -71,8 +69,6 @@ private: bool OnlyRunningStatus; time_t SegmentStart; time_t SegmentEnd; - cChannels* Channels; - cSchedules* Schedules; EFormat Format; const cChannel* channel; }; |