summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--eepg.c36
-rw-r--r--eit2.c83
-rw-r--r--eit2.h8
-rw-r--r--util.c2
4 files changed, 71 insertions, 58 deletions
diff --git a/eepg.c b/eepg.c
index b319a46..1b6c9f0 100644
--- a/eepg.c
+++ b/eepg.c
@@ -274,7 +274,7 @@ void cFilterEEPG::Trigger (void)
void cFilterEEPG::SetStatus (bool On)
{
- LogI(0, prep("setstatus %d\n"), On);
+ // LogI(0, prep("setstatus %d\n"), On);
if (!On) {
FreeSummaries ();
FreeTitles ();
@@ -2779,7 +2779,7 @@ void cFilterEEPG::AddFilter (u_short Pid, u_char Tid)
{
if (!Matches (Pid, Tid)) {
Add (Pid, Tid);
- esyslog (prep("Filter Pid:0x%x,Tid:0x%x added."), Pid, Tid);
+ //esyslog (prep("Filter Pid:0x%x,Tid:0x%x added."), Pid, Tid);
}
}
@@ -2787,7 +2787,7 @@ void cFilterEEPG::AddFilter (u_short Pid, u_char Tid, unsigned char Mask)
{
if (!Matches (Pid, Tid)) {
Add (Pid, Tid, Mask);
- esyslog (prep("Filter Pid:0x%x,Tid:0x%x,Mask:0x%x added."), Pid, Tid, Mask);
+ //esyslog (prep("Filter Pid:0x%x,Tid:0x%x,Mask:0x%x added."), Pid, Tid, Mask);
}
}
@@ -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)
diff --git a/eit2.c b/eit2.c
index a8b0561..9ee190d 100644
--- a/eit2.c
+++ b/eit2.c
@@ -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,44 @@ 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
+ cStateKey ChannelsStateKey;
+ cChannels *Channels = cChannels::GetChannelsWrite(ChannelsStateKey, 10);
+ if (!Channels) {
+ LogD(3, prep("Error obtaining channels lock"));
+ return;
+ }
+ cStateKey SchedulesStateKey;
+ cSchedules *Schedules = cSchedules::GetSchedulesWrite(SchedulesStateKey, 10);
+ if (!Schedules) {
+ ChannelsStateKey.Remove(false);
+ 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;
@@ -583,6 +625,8 @@ cEIT2::cEIT2 (cChannels* Channels, cSchedules * Schedules, int Source, u_char Ti
if (Tid == 0x4E)
pSchedule->SetPresentSeen ();
if (OnlyRunningStatus) {
+ SchedulesStateKey.Remove(false);
+ ChannelsStateKey.Remove(false);
LogD(4, prep("OnlyRunningStatus"));
return;
}
@@ -591,6 +635,8 @@ cEIT2::cEIT2 (cChannels* Channels, cSchedules * Schedules, int Source, u_char Ti
pSchedule->DropOutdated (SegmentStart, SegmentEnd, Tid, getVersionNumber ());
sortSchedules(Schedules, channel->GetChannelID());
}
+ SchedulesStateKey.Remove(Modified);
+ ChannelsStateKey.Remove(Modified);
LogD(4, prep("end of cEIT2"));
}
@@ -602,7 +648,6 @@ cEIT2::cEIT2 (cSchedule * Schedule, EFormat format)
, OnlyRunningStatus(false)
, SegmentStart(0)
, SegmentEnd(0)
-, Schedules(NULL)
, Format(format)
{
//LogD(2, prep("cEIT2::cEIT2"));
diff --git a/eit2.h b/eit2.h
index 65d4b82..9a46e7c 100644
--- a/eit2.h
+++ b/eit2.h
@@ -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;
};
diff --git a/util.c b/util.c
index b41faf8..1109181 100644
--- a/util.c
+++ b/util.c
@@ -403,7 +403,7 @@ char *freesat_huffman_decode (const unsigned char *src, size_t size)
bit++;
}
} else {
- LogE (0, prep("Missing table %d entry: <%s>"), tableid + 1, uncompressed);
+ //LogE (0, prep("Missing table %d entry: <%s>"), tableid + 1, uncompressed);
// Entry missing in table.
return uncompressed;
}