aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/dvb/Makefile.am2
-rw-r--r--lib/dvb/eit.cpp50
-rw-r--r--lib/dvb/eit.h28
-rw-r--r--lib/dvb/pmt.cpp2
-rw-r--r--lib/dvb/pmt.h4
-rw-r--r--lib/dvb/specs.h22
-rw-r--r--lib/nav/pcore.cpp38
-rw-r--r--lib/nav/pcore.h27
-rw-r--r--lib/service/Makefile.am3
-rw-r--r--lib/service/event.cpp27
-rw-r--r--lib/service/event.h21
-rw-r--r--lib/service/iservice.h9
-rw-r--r--lib/service/service.cpp9
-rw-r--r--lib/service/servicedvb.cpp41
-rw-r--r--lib/service/servicedvb.h7
15 files changed, 278 insertions, 12 deletions
diff --git a/lib/dvb/Makefile.am b/lib/dvb/Makefile.am
index a3b81bc7..41ce1748 100644
--- a/lib/dvb/Makefile.am
+++ b/lib/dvb/Makefile.am
@@ -4,5 +4,5 @@ INCLUDES = \
noinst_LIBRARIES = libenigma_dvb.a
libenigma_dvb_a_SOURCES = dvb.cpp demux.cpp frontend.cpp esection.cpp db.cpp \
- sec.cpp scan.cpp crc32.cpp pmt.cpp decoder.cpp
+ sec.cpp scan.cpp crc32.cpp pmt.cpp decoder.cpp eit.cpp
\ No newline at end of file
diff --git a/lib/dvb/eit.cpp b/lib/dvb/eit.cpp
new file mode 100644
index 00000000..2462d333
--- /dev/null
+++ b/lib/dvb/eit.cpp
@@ -0,0 +1,50 @@
+#include <lib/dvb/eit.h>
+#include <lib/dvb/specs.h>
+#include <lib/base/eerror.h>
+#include <lib/service/event.h>
+
+void eDVBServiceEITHandler::EITready(int error)
+{
+ if (!error)
+ {
+ ePtr<eTable<EventInformationTable> > ptr;
+ if (!m_EIT.getCurrent(ptr))
+ {
+ int a = 0;
+ for (EventInformationTableConstIterator i = ptr->getSections().begin();
+ i != ptr->getSections().end(); ++i)
+ {
+ for (EventConstIterator ev = (*i)->getEvents()->begin(); ev != (*i)->getEvents()->end(); ++ev)
+ {
+ ePtr<eServiceEvent> evt = new eServiceEvent();
+ evt->parseFrom(*ev);
+ if (!a)
+ m_event_now = evt;
+ else
+ m_event_next = evt;
+ ++a;
+ }
+ }
+ }
+ }
+
+ m_eit_changed();
+}
+
+eDVBServiceEITHandler::eDVBServiceEITHandler()
+{
+ CONNECT(m_EIT.tableReady, eDVBServiceEITHandler::EITready);
+}
+
+void eDVBServiceEITHandler::start(iDVBDemux *demux, int sid)
+{
+ m_EIT.begin(eApp, eDVBEITSpec(sid), demux);
+}
+
+RESULT eDVBServiceEITHandler::getEvent(ePtr<eServiceEvent> &event, int nownext)
+{
+ event = nownext ? m_event_next : m_event_now;
+ if (!event)
+ return -1;
+ return 0;
+}
diff --git a/lib/dvb/eit.h b/lib/dvb/eit.h
new file mode 100644
index 00000000..7ec16bc8
--- /dev/null
+++ b/lib/dvb/eit.h
@@ -0,0 +1,28 @@
+#ifndef __lib_dvb_eit_h
+#define __lib_dvb_eit_h
+
+#include <lib/dvb/isection.h>
+#include <lib/dvb/esection.h>
+#include <lib/dvb_si/eit.h>
+#include <lib/service/event.h>
+
+class eDVBServiceEITHandler: public Object
+{
+ ePtr<iDVBDemux> m_demux;
+ eAUTable<eTable<EventInformationTable> > m_EIT;
+ void EITready(int error);
+
+ RESULT parseEvent(ePtr<eServiceEvent> &serviceevent, const Event &dvbevent);
+
+ ePtr<eServiceEvent> m_event_now, m_event_next;
+public:
+ eDVBServiceEITHandler();
+
+ void start(iDVBDemux *demux, int sid);
+
+ RESULT getEvent(ePtr<eServiceEvent> &event, int nownext);
+
+ PSignal0<void> m_eit_changed;
+};
+
+#endif
diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp
index 292012e1..8c4388a4 100644
--- a/lib/dvb/pmt.cpp
+++ b/lib/dvb/pmt.cpp
@@ -24,6 +24,8 @@ void eDVBServicePMTHandler::channelStateChanged(iDVBChannel *channel)
if (m_channel->getDemux(m_demux))
eDebug("shit it failed.. again.");
+ serviceEvent(eventTuned);
+
if (m_demux)
{
eDebug("ok ... now we start!!");
diff --git a/lib/dvb/pmt.h b/lib/dvb/pmt.h
index ee2040af..b3a0a538 100644
--- a/lib/dvb/pmt.h
+++ b/lib/dvb/pmt.h
@@ -26,7 +26,6 @@ class eDVBServicePMTHandler: public Object
void PMTready(int error);
void PATready(int error);
-
public:
eDVBServicePMTHandler();
@@ -36,7 +35,8 @@ public:
eventNoPAT, // no pat could be received (timeout)
eventNoPATEntry, // no pat entry for the corresponding SID could be found
eventNoPMT, // no pmt could be received (timeout)
- eventNewProgramInfo // we just received a PMT
+ eventNewProgramInfo, // we just received a PMT
+ eventTuned // a channel was sucessfully (re-)tuned in, you may start additional filters now
};
Signal1<void,int> serviceEvent;
diff --git a/lib/dvb/specs.h b/lib/dvb/specs.h
index 3c6908c2..54457342 100644
--- a/lib/dvb/specs.h
+++ b/lib/dvb/specs.h
@@ -8,6 +8,7 @@
#include <lib/dvb_si/nit.h>
#include <lib/dvb_si/bat.h>
#include <lib/dvb_si/pat.h>
+#include <lib/dvb_si/eit.h>
struct eDVBPMTSpec
{
@@ -105,4 +106,25 @@ public:
}
};
+class eDVBEITSpec
+{
+ eDVBTableSpec m_spec;
+public:
+ /* this is for now&next on actual transponder. */
+ eDVBEITSpec(int sid)
+ {
+ m_spec.pid = EventInformationTable::PID;
+ m_spec.tid = EventInformationTable::TID;
+ m_spec.tidext = sid;
+ m_spec.timeout = EventInformationTable::TIMEOUT;
+ m_spec.flags = eDVBTableSpec::tfAnyVersion |
+ eDVBTableSpec::tfHaveTID | eDVBTableSpec::tfHaveTIDExt |
+ eDVBTableSpec::tfCheckCRC | eDVBTableSpec::tfHaveTimeout;
+ }
+ operator eDVBTableSpec &()
+ {
+ return m_spec;
+ }
+};
+
#endif
diff --git a/lib/nav/pcore.cpp b/lib/nav/pcore.cpp
new file mode 100644
index 00000000..7b61ce5c
--- /dev/null
+++ b/lib/nav/pcore.cpp
@@ -0,0 +1,38 @@
+#include <lib/nav/pcore.h>
+#include <lib/service/service.h>
+
+DEFINE_REF(pNavigation);
+
+pNavigation::pNavigation()
+{
+ ePtr<eServiceCenter> service_center;
+ eServiceCenter::getInstance(service_center);
+
+ assert(service_center);
+ m_core = new eNavigation(service_center);
+}
+
+RESULT pNavigation::playService(const eServiceReference &service)
+{
+ return m_core->playService(service);
+}
+
+RESULT pNavigation::enqueueService(const eServiceReference &service)
+{
+ return m_core->enqueueService(service);
+}
+
+RESULT pNavigation::getCurrentService(ePtr<iPlayableService> &service)
+{
+ return m_core->getCurrentService(service);
+}
+
+RESULT pNavigation::getPlaylist(ePtr<ePlaylist> &playlist)
+{
+ return m_core->getPlaylist(playlist);
+}
+
+RESULT pNavigation::pause(int p)
+{
+ return m_core->pause(p);
+}
diff --git a/lib/nav/pcore.h b/lib/nav/pcore.h
new file mode 100644
index 00000000..3bb8f4ef
--- /dev/null
+++ b/lib/nav/pcore.h
@@ -0,0 +1,27 @@
+#ifndef __lib_nav_pcore_h
+#define __lib_nav_pcore_h
+
+#include <lib/nav/core.h>
+#include <lib/python/connections.h>
+
+/* a subset of eNavigation */
+
+class pNavigation: public iObject
+{
+DECLARE_REF;
+private:
+ ePtr<eNavigation> m_core;
+public:
+ PSignal1<void, int> event;
+
+ pNavigation();
+
+ RESULT playService(const eServiceReference &service);
+ RESULT enqueueService(const eServiceReference &service);
+ RESULT getCurrentService(ePtr<iPlayableService> &service);
+ RESULT getPlaylist(ePtr<ePlaylist> &playlist);
+
+ RESULT pause(int p);
+};
+
+#endif
diff --git a/lib/service/Makefile.am b/lib/service/Makefile.am
index a3c05cfa..f8cf6d52 100644
--- a/lib/service/Makefile.am
+++ b/lib/service/Makefile.am
@@ -4,5 +4,6 @@ INCLUDES = \
noinst_LIBRARIES = libenigma_service.a
libenigma_service_a_SOURCES = \
- listboxservice.cpp service.cpp servicemp3.cpp servicedvb.cpp servicefs.cpp
+ listboxservice.cpp service.cpp servicemp3.cpp servicedvb.cpp servicefs.cpp \
+ event.cpp
diff --git a/lib/service/event.cpp b/lib/service/event.cpp
new file mode 100644
index 00000000..7ea16560
--- /dev/null
+++ b/lib/service/event.cpp
@@ -0,0 +1,27 @@
+#include <lib/service/event.h>
+#include <lib/dvb_si/eit.h>
+#include <lib/dvb_si/short_event_descriptor.h>
+#include <lib/dvb_si/descriptor_tag.h>
+
+DEFINE_REF(eServiceEvent);
+
+RESULT eServiceEvent::parseFrom(Event *evt)
+{
+ m_begin = 0; // ich bin FAUL
+ m_duration = evt->getDuration();
+
+
+ for (DescriptorConstIterator desc = evt->getDescriptors()->begin(); desc != evt->getDescriptors()->end(); ++desc)
+ {
+ switch ((*desc)->getTag())
+ {
+ case SHORT_EVENT_DESCRIPTOR:
+ {
+ const ShortEventDescriptor *sed = (ShortEventDescriptor*)*desc;
+ m_event_name = sed->getEventName();
+ m_description = sed->getText();
+ break;
+ }
+ }
+ }
+}
diff --git a/lib/service/event.h b/lib/service/event.h
new file mode 100644
index 00000000..967f9efa
--- /dev/null
+++ b/lib/service/event.h
@@ -0,0 +1,21 @@
+#ifndef __service_ievent_h
+#define __service_ievent_h
+
+#include <time.h>
+#include <lib/base/object.h>
+#include <string>
+class Event;
+
+class eServiceEvent: public iObject
+{
+DECLARE_REF;
+public:
+ time_t m_begin;
+ int m_duration;
+ std::string m_event_name, m_description;
+ // .. additional info
+
+ RESULT parseFrom(Event *evt);
+};
+
+#endif
diff --git a/lib/service/iservice.h b/lib/service/iservice.h
index 5a8a0627..f699bdb9 100644
--- a/lib/service/iservice.h
+++ b/lib/service/iservice.h
@@ -155,10 +155,12 @@ public:
TEMPLATE_TYPEDEF(ePtr<iStaticServiceInformation>, iStaticServiceInformationPtr);
+class eServiceEvent;
+
class iServiceInformation: public iStaticServiceInformation
{
public:
-
+ virtual RESULT getEvent(ePtr<eServiceEvent> &evt, int nownext);
};
TEMPLATE_TYPEDEF(ePtr<iServiceInformation>, iServiceInformationPtr);
@@ -179,7 +181,10 @@ public:
enum
{
evStart,
- evEnd
+ evEnd,
+
+ // when iServiceInformation is implemented:
+ evNewEvent
};
virtual RESULT connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection)=0;
virtual RESULT start()=0;
diff --git a/lib/service/service.cpp b/lib/service/service.cpp
index 75d4987b..0a4a8012 100644
--- a/lib/service/service.cpp
+++ b/lib/service/service.cpp
@@ -120,4 +120,13 @@ RESULT iServiceHandler::info(const eServiceReference &, ePtr<iStaticServiceInfor
return -1;
}
+#include <lib/service/event.h>
+
+RESULT iServiceInformation::getEvent(ePtr<eServiceEvent> &evt, int m_nownext)
+{
+ evt = 0;
+ return -1;
+}
+
+
eAutoInitPtr<eServiceCenter> init_eServiceCenter(eAutoInitNumbers::service, "eServiceCenter");
diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp
index d1ebeb30..06b6d97f 100644
--- a/lib/service/servicedvb.cpp
+++ b/lib/service/servicedvb.cpp
@@ -134,7 +134,8 @@ RESULT eServiceFactoryDVB::info(const eServiceReference &ref, ePtr<iStaticServic
eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref):
m_reference(ref)
{
- CONNECT(m_serviceHandler.serviceEvent, eDVBServicePlay::serviceEvent);
+ CONNECT(m_service_handler.serviceEvent, eDVBServicePlay::serviceEvent);
+ CONNECT(m_event_handler.m_eit_changed, eDVBServicePlay::gotNewEvent);
eDebug("DVB start (play)");
}
@@ -143,16 +144,41 @@ eDVBServicePlay::~eDVBServicePlay()
eDebug("DVB stop (play)");
}
+void eDVBServicePlay::gotNewEvent()
+{
+ // debug only
+ ePtr<eServiceEvent> m_event_now, m_event_next;
+ getEvent(m_event_now, 0);
+ getEvent(m_event_next, 1);
+
+ if (m_event_now)
+ eDebug("now running: %s (%d seconds :)", m_event_now->m_event_name.c_str(), m_event_now->m_duration);
+ if (m_event_next)
+ eDebug("next running: %s (%d seconds :)", m_event_next->m_event_name.c_str(), m_event_next->m_duration);
+}
+
void eDVBServicePlay::serviceEvent(int event)
{
eDebug("service event %d", event);
switch (event)
{
+ case eDVBServicePMTHandler::eventTuned:
+ {
+ ePtr<iDVBDemux> m_demux;
+ if (!m_service_handler.getDemux(m_demux))
+ {
+// eventStartedEventAcquisition
+ m_event_handler.start(m_demux, ((eServiceReferenceDVB&)m_reference).getServiceID().get());
+ } else
+ eDebug("no event data available :( ");
+// eventNoEvent
+ break;
+ }
case eDVBServicePMTHandler::eventNewProgramInfo:
{
int vpid = -1, apid = -1, pcrpid = -1;
eDVBServicePMTHandler::program program;
- if (m_serviceHandler.getProgramInfo(program))
+ if (m_service_handler.getProgramInfo(program))
eDebug("getting program info failed.");
else
{
@@ -196,7 +222,7 @@ void eDVBServicePlay::serviceEvent(int event)
if (!m_decoder)
{
ePtr<iDVBDemux> demux;
- m_serviceHandler.getDemux(demux);
+ m_service_handler.getDemux(demux);
if (demux)
demux->getMPEGDecoder(m_decoder);
}
@@ -208,7 +234,7 @@ void eDVBServicePlay::serviceEvent(int event)
m_decoder->setSyncPCR(pcrpid);
m_decoder->start();
}
-
+
break;
}
}
@@ -217,7 +243,7 @@ void eDVBServicePlay::serviceEvent(int event)
RESULT eDVBServicePlay::start()
{
eDebug("starting DVB service");
- return m_serviceHandler.tune((eServiceReferenceDVB&)m_reference);
+ return m_service_handler.tune((eServiceReferenceDVB&)m_reference);
}
RESULT eDVBServicePlay::stop()
@@ -250,6 +276,11 @@ RESULT eDVBServicePlay::getName(const eServiceReference &ref, std::string &name)
return 0;
}
+RESULT eDVBServicePlay::getEvent(ePtr<eServiceEvent> &evt, int nownext)
+{
+ return m_event_handler.getEvent(evt, nownext);
+}
+
DEFINE_REF(eDVBServicePlay)
eAutoInitPtr<eServiceFactoryDVB> init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB");
diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h
index 94659ed1..941ad7bd 100644
--- a/lib/service/servicedvb.h
+++ b/lib/service/servicedvb.h
@@ -5,6 +5,7 @@
#include <lib/dvb/idvb.h>
#include <lib/dvb/pmt.h>
+#include <lib/dvb/eit.h>
class eServiceFactoryDVB: public iServiceHandler
{
@@ -42,10 +43,13 @@ private:
ePtr<iTSMPEGDecoder> m_decoder;
- eDVBServicePMTHandler m_serviceHandler;
+ eDVBServicePMTHandler m_service_handler;
+ eDVBServiceEITHandler m_event_handler;
eDVBServicePlay(const eServiceReference &ref);
+ void gotNewEvent();
+
void serviceEvent(int event);
public:
virtual ~eDVBServicePlay();
@@ -59,6 +63,7 @@ public:
// iServiceInformation
RESULT getName(const eServiceReference &ref, std::string &name);
+ RESULT getEvent(ePtr<eServiceEvent> &evt, int nownext);
};
#endif