summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitar Petrovski <dimeptr@gmail.com>2018-08-21 10:35:07 +0200
committerDimitar Petrovski <dimeptr@gmail.com>2018-08-21 10:35:07 +0200
commitc46be443988489780f993a47d23a42936b49d6c0 (patch)
tree8c40e0fdbe87e54b34461f67010c8a278c04b016
parentefbf22b18d2509ca8c5bccdb1894661fe8d888d1 (diff)
parent27fbd9ec01e5fc69f83a0649a631223b655b3a7a (diff)
downloadvdr-plugin-eepg-c46be443988489780f993a47d23a42936b49d6c0.tar.gz
vdr-plugin-eepg-c46be443988489780f993a47d23a42936b49d6c0.tar.bz2
Merge branch 'experimental'
-rw-r--r--eepg.c30
-rw-r--r--eit2.c76
-rw-r--r--eit2.h8
3 files changed, 60 insertions, 54 deletions
diff --git a/eepg.c b/eepg.c
index b319a46..ebcd745 100644
--- a/eepg.c
+++ b/eepg.c
@@ -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..5aeb60d 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,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"));
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;
};