X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/e677ac4a7bf81391877c909a703e5918ce4a511b..a81eab44ddc3d7faad43f8434d04f3c55b81b880:/lib/service/servicedvb.cpp diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 06b6d97f..cb5b4b72 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -9,6 +9,51 @@ #include #include +#include +#include +#include + +class eStaticServiceDVBPVRInformation: public iStaticServiceInformation +{ + DECLARE_REF(eStaticServiceDVBPVRInformation); + eServiceReference m_ref; + eDVBMetaParser m_parser; +public: + eStaticServiceDVBPVRInformation(const eServiceReference &ref); + RESULT getName(const eServiceReference &ref, std::string &name); + int getLength(const eServiceReference &ref); +}; + +DEFINE_REF(eStaticServiceDVBPVRInformation); + +eStaticServiceDVBPVRInformation::eStaticServiceDVBPVRInformation(const eServiceReference &ref) +{ + m_ref = ref; + m_parser.parseFile(ref.path); +} + +RESULT eStaticServiceDVBPVRInformation::getName(const eServiceReference &ref, std::string &name) +{ + ASSERT(ref == m_ref); + name = m_parser.m_name.size() ? m_parser.m_name : ref.path; +} + +int eStaticServiceDVBPVRInformation::getLength(const eServiceReference &ref) +{ + ASSERT(ref == m_ref); + + eDVBTSTools tstools; + + if (tstools.openFile(ref.path.c_str())) + return 0; + + pts_t len; + if (tstools.calcLen(len)) + return 0; + + return len / 90000; +} + DEFINE_REF(eServiceFactoryDVB) eServiceFactoryDVB::eServiceFactoryDVB() @@ -76,17 +121,27 @@ RESULT eDVBServiceList::getContent(std::list &list) return 0; } +RESULT eDVBServiceList::getNext(eServiceReference &) +{ + /* implement me */ + return -1; +} + RESULT eServiceFactoryDVB::play(const eServiceReference &ref, ePtr &ptr) { + ePtr service; + int r = lookupService(service, ref); + if (r) + service = 0; // check resources... - ptr = new eDVBServicePlay(ref); + ptr = new eDVBServicePlay(ref, service); return 0; } -RESULT eServiceFactoryDVB::record(const eServiceReference &, ePtr &ptr) +RESULT eServiceFactoryDVB::record(const eServiceReference &ref, ePtr &ptr) { - ptr = 0; - return -1; + ptr = new eDVBServiceRecord((eServiceReferenceDVB&)ref); + return 0; } RESULT eServiceFactoryDVB::list(const eServiceReference &ref, ePtr &ptr) @@ -97,7 +152,25 @@ RESULT eServiceFactoryDVB::list(const eServiceReference &ref, ePtr &ptr) { - ptr = 0; + /* do we have a PVR service? */ + if (ref.path.size()) + { + ptr = new eStaticServiceDVBPVRInformation(ref); + return 0; + } else + { + ePtr service; + int r = lookupService(service, ref); + if (r) + return r; + /* eDVBService has the iStaticServiceInformation interface, so we pass it here. */ + ptr = service; + return 0; + } +} + +RESULT eServiceFactoryDVB::lookupService(ePtr &service, const eServiceReference &ref) +{ // TODO: handle the listing itself // if (ref.... == -1) .. return "... bouquets ..."; // could be also done in another serviceFactory (with seperate ID) to seperate actual services and lists @@ -117,23 +190,21 @@ RESULT eServiceFactoryDVB::info(const eServiceReference &ref, ePtr service; - /* we are sure to have a ..DVB reference as the info() call was forwarded here according to it's ID. */ if ((err = db->getService((eServiceReferenceDVB&)ref, service)) != 0) { eDebug("getService failed!"); return err; } - - /* eDVBService has the iStaticServiceInformation interface, so we pass it here. */ - ptr = service; + return 0; } -eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref): - m_reference(ref) +eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *service): + m_reference(ref), m_dvb_service(service) { + m_is_pvr = !ref.path.empty(); + CONNECT(m_service_handler.serviceEvent, eDVBServicePlay::serviceEvent); CONNECT(m_event_handler.m_eit_changed, eDVBServicePlay::gotNewEvent); eDebug("DVB start (play)"); @@ -146,6 +217,7 @@ eDVBServicePlay::~eDVBServicePlay() void eDVBServicePlay::gotNewEvent() { +#if 0 // debug only ePtr m_event_now, m_event_next; getEvent(m_event_now, 0); @@ -155,6 +227,8 @@ void eDVBServicePlay::gotNewEvent() 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); +#endif + m_event((iPlayableService*)this, evUpdatedEventInfo); } void eDVBServicePlay::serviceEvent(int event) @@ -231,8 +305,22 @@ void eDVBServicePlay::serviceEvent(int event) { m_decoder->setVideoPID(vpid); m_decoder->setAudioPID(apid, 0); - m_decoder->setSyncPCR(pcrpid); + if (!m_is_pvr) + m_decoder->setSyncPCR(pcrpid); + else + m_decoder->setSyncPCR(-1); m_decoder->start(); +// how we can do this better? +// update cache pid when the user changed the audio track or video track +// TODO handling of difference audio types.. default audio types.. + + /* don't worry about non-existing services, nor pvr services */ + if (m_dvb_service && !m_is_pvr) + { + m_dvb_service->setCachePID(eDVBService::cVPID, vpid); + m_dvb_service->setCachePID(eDVBService::cAPID, apid); + m_dvb_service->setCachePID(eDVBService::cPCRPID, pcrpid); + } } break; @@ -242,8 +330,10 @@ void eDVBServicePlay::serviceEvent(int event) RESULT eDVBServicePlay::start() { + int r; eDebug("starting DVB service"); - return m_service_handler.tune((eServiceReferenceDVB&)m_reference); + r = m_service_handler.tune((eServiceReferenceDVB&)m_reference); + m_event(this, evStart); } RESULT eDVBServicePlay::stop() @@ -254,7 +344,8 @@ RESULT eDVBServicePlay::stop() RESULT eDVBServicePlay::connectEvent(const Slot2 &event, ePtr &connection) { - return -1; + connection = new eConnection((iPlayableService*)this, m_event.connect(event)); + return 0; } RESULT eDVBServicePlay::pause(ePtr &ptr) @@ -264,15 +355,58 @@ RESULT eDVBServicePlay::pause(ePtr &ptr) return -1; } +RESULT eDVBServicePlay::seek(ePtr &ptr) +{ + if (m_is_pvr) + { + ptr = this; + return 0; + } + + ptr = 0; + return -1; +} + +RESULT eDVBServicePlay::getLength(pts_t &len) +{ + ePtr pvr_channel; + + if (m_service_handler.getPVRChannel(pvr_channel)) + { + eDebug("getPVRChannel failed!"); + return -1; + } + + return pvr_channel->getLength(len); +} + +RESULT eDVBServicePlay::seekTo(pts_t to) +{ + return -1; +} + +RESULT eDVBServicePlay::getPlayPosition(pts_t &pos) +{ + ePtr pvr_channel; + + if (m_service_handler.getPVRChannel(pvr_channel)) + return -1; + + return pvr_channel->getCurrentPosition(pos); +} + RESULT eDVBServicePlay::info(ePtr &ptr) { ptr = this; return 0; } -RESULT eDVBServicePlay::getName(const eServiceReference &ref, std::string &name) +RESULT eDVBServicePlay::getName(std::string &name) { - name = "DVB service"; + if (m_dvb_service) + m_dvb_service->getName(m_reference, name); + else + name = "DVB service"; return 0; }