X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/391f7559e77cf98ea3b5a1fba94a8fa6f4307da8..740ae9b4a03c13901e4f4ffc008e4c0cfd63d896:/lib/service/servicedvb.cpp diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 9e77a7a7..fc35b521 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -25,9 +25,40 @@ DEFINE_REF(eStaticServiceDVBInformation); RESULT eStaticServiceDVBInformation::getName(const eServiceReference &ref, std::string &name) { + eServiceReferenceDVB &service = (eServiceReferenceDVB&)ref; if ( !ref.name.empty() ) { - name = ref.name; + if (service.getParentTransportStreamID().get()) // linkage subservice + { + ePtr service_center; + if (!eServiceCenter::getInstance(service_center)) + { + eServiceReferenceDVB parent = service; + parent.setTransportStreamID( service.getParentTransportStreamID() ); + parent.setServiceID( service.getParentServiceID() ); + parent.setParentTransportStreamID(eTransportStreamID(0)); + parent.setParentServiceID(eServiceID(0)); + parent.name=""; + ePtr service_info; + if (!service_center->info(parent, service_info)) + { + if (!service_info->getName(parent, name)) + { + // just show short name + unsigned int pos = name.find("\xc2\x86"); + if ( pos != std::string::npos ) + name.erase(0, pos+2); + pos = name.find("\xc2\x87"); + if ( pos != std::string::npos ) + name.erase(pos); + name+=" - "; + } + } + } + } + else + name=""; + name += ref.name; return 0; } else @@ -75,7 +106,7 @@ RESULT eStaticServiceDVBBouquetInformation::getName(const eServiceReference &ref if ( bouquet && bouquet->m_bouquet_name.length() ) { - name = "[Bouquet] " + bouquet->m_bouquet_name; + name = bouquet->m_bouquet_name; return 0; } else @@ -96,6 +127,9 @@ public: eStaticServiceDVBPVRInformation(const eServiceReference &ref); RESULT getName(const eServiceReference &ref, std::string &name); int getLength(const eServiceReference &ref); + + int getInfo(const eServiceReference &ref, int w); + std::string getInfoString(const eServiceReference &ref,int w); }; DEFINE_REF(eStaticServiceDVBPVRInformation); @@ -129,7 +163,32 @@ int eStaticServiceDVBPVRInformation::getLength(const eServiceReference &ref) return len / 90000; } +int eStaticServiceDVBPVRInformation::getInfo(const eServiceReference &ref, int w) +{ + switch (w) + { + case iServiceInformation::sDescription: + return iServiceInformation::resIsString; + case iServiceInformation::sTimeCreate: + if (m_parser.m_time_create) + return m_parser.m_time_create; + else + return iServiceInformation::resNA; + default: + return iServiceInformation::resNA; + } +} +std::string eStaticServiceDVBPVRInformation::getInfoString(const eServiceReference &ref,int w) +{ + switch (w) + { + case iServiceInformation::sDescription: + return m_parser.m_description; + default: + return ""; + } +} class eDVBPVRServiceOfflineOperations: public iServiceOfflineOperations { @@ -365,24 +424,19 @@ RESULT eServiceFactoryDVB::info(const eServiceReference &ref, ePtr service; - int r = lookupService(service, ref); - if (r) // no eDVBService avail for this reference ( Linkage Services... ) + if (lookupService(service, ref)) // no eDVBService avail for this reference ( Linkage Services... ) ptr = new eStaticServiceDVBInformation; else /* eDVBService has the iStaticServiceInformation interface, so we pass it here. */ ptr = service; - return 0; } + return 0; } RESULT eServiceFactoryDVB::offlineOperations(const eServiceReference &ref, ePtr &ptr) @@ -433,6 +487,7 @@ eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *serv m_reference(ref), m_dvb_service(service), m_service_handler(0), m_is_paused(0) { m_is_pvr = !ref.path.empty(); + m_timeshift_enabled = 0; CONNECT(m_service_handler.serviceEvent, eDVBServicePlay::serviceEvent); CONNECT(m_event_handler.m_eit_changed, eDVBServicePlay::gotNewEvent); @@ -467,10 +522,16 @@ void eDVBServicePlay::serviceEvent(int event) ePtr m_demux; if (!m_service_handler.getDemux(m_demux)) { -// eventStartedEventAcquisition - m_event_handler.start(m_demux, ((eServiceReferenceDVB&)m_reference).getServiceID().get()); + eServiceReferenceDVB &ref = (eServiceReferenceDVB&) m_reference; + int sid = ref.getParentServiceID().get(); + if (!sid) + sid = ref.getServiceID().get(); + if ( ref.getParentTransportStreamID().get() && + ref.getParentTransportStreamID() != ref.getTransportStreamID() ) + m_event_handler.startOther(m_demux, sid); + else + m_event_handler.start(m_demux, sid); } -// eventNoEvent break; } case eDVBServicePMTHandler::eventTuneFailed: @@ -587,16 +648,32 @@ RESULT eDVBServicePlay::connectEvent(const Slot2 &ev RESULT eDVBServicePlay::pause(ePtr &ptr) { - if (m_is_pvr) + if (!m_is_pvr) { - ptr = this; - return 0; + ptr = 0; + return -1; } - ptr = 0; - return -1; + ptr = this; + return 0; } +RESULT eDVBServicePlay::setSlowMotion(int ratio) +{ + if (m_decoder) + return m_decoder->setSlowMotion(ratio); + else + return -1; +} + +RESULT eDVBServicePlay::setFastForward(int ratio) +{ + if (m_decoder) + return m_decoder->setFastForward(ratio); + else + return -1; +} + RESULT eDVBServicePlay::seek(ePtr &ptr) { if (m_is_pvr) @@ -681,6 +758,13 @@ RESULT eDVBServicePlay::getPlayPosition(pts_t &pos) return pvr_channel->getCurrentPosition(demux, pos); } +RESULT eDVBServicePlay::setTrickmode(int trick=0) +{ + if (m_decoder) + m_decoder->setTrickmode(trick); + return 0; +} + RESULT eDVBServicePlay::frontendStatusInfo(ePtr &ptr) { ptr = this; @@ -699,6 +783,23 @@ RESULT eDVBServicePlay::audioTracks(ePtr &ptr) return 0; } +RESULT eDVBServicePlay::subServices(ePtr &ptr) +{ + ptr = this; + return 0; +} + +RESULT eDVBServicePlay::timeshift(ePtr &ptr) +{ + if (m_timeshift_enabled || !m_is_pvr) + { + ptr = this; + return 0; + } + ptr = 0; + return -1; +} + RESULT eDVBServicePlay::getName(std::string &name) { if (m_dvb_service) @@ -706,7 +807,10 @@ RESULT eDVBServicePlay::getName(std::string &name) m_dvb_service->getName(m_reference, name); if (name.empty()) name = "(...)"; - } else + } + else if (!m_reference.name.empty()) + eStaticServiceDVBInformation().getName(m_reference, name); + else name = "DVB service"; return 0; } @@ -789,9 +893,20 @@ RESULT eDVBServicePlay::getTrackInfo(struct iAudioTrackInfo &info, unsigned int info.m_description = "DTS"; else info.m_description = "???"; - - /* CHECK here for component tag override. */ - info.m_language = program.audioStreams[i].language_code; + + if (program.audioStreams[i].component_tag != -1) + { + ePtr evt; + if (!m_event_handler.getEvent(evt, 0)) + { + ePtr data; + if (!evt->getComponentData(data, program.audioStreams[i].component_tag)) + info.m_language = data->getText(); + } + } + + if (info.m_language.empty()) + info.m_language = program.audioStreams[i].language_code; return 0; } @@ -803,7 +918,7 @@ int eDVBServicePlay::selectAudioStream(int i) if (m_service_handler.getProgramInfo(program)) return -1; - if (i >= program.audioStreams.size()) + if ((unsigned int)i >= program.audioStreams.size()) return -2; if (!m_decoder) @@ -819,6 +934,8 @@ int eDVBServicePlay::selectAudioStream(int i) int eDVBServicePlay::getFrontendInfo(int w) { + if (m_is_pvr) + return 0; eUsePtr channel; if(m_service_handler.getChannel(channel)) return 0; @@ -828,6 +945,64 @@ int eDVBServicePlay::getFrontendInfo(int w) return fe->readFrontendData(w); } +int eDVBServicePlay::getNumberOfSubservices() +{ + ePtr evt; + if (!m_event_handler.getEvent(evt, 0)) + return evt->getNumOfLinkageServices(); + return 0; +} + +RESULT eDVBServicePlay::getSubservice(eServiceReference &sub, unsigned int n) +{ + ePtr evt; + if (!m_event_handler.getEvent(evt, 0)) + { + if (!evt->getLinkageService(sub, n)) + { + eServiceReferenceDVB &subservice = (eServiceReferenceDVB&) sub; + eServiceReferenceDVB ¤t = (eServiceReferenceDVB&) m_reference; + subservice.setDVBNamespace(current.getDVBNamespace()); + if ( current.getParentTransportStreamID().get() ) + { + subservice.setParentTransportStreamID( current.getParentTransportStreamID() ); + subservice.setParentServiceID( current.getParentServiceID() ); + } + else + { + subservice.setParentTransportStreamID( current.getTransportStreamID() ); + subservice.setParentServiceID( current.getServiceID() ); + } + if ( subservice.getParentTransportStreamID() == subservice.getTransportStreamID() && + subservice.getParentServiceID() == subservice.getServiceID() ) + { + subservice.setParentTransportStreamID( eTransportStreamID(0) ); + subservice.setParentServiceID( eServiceID(0) ); + } + return 0; + } + } + sub.type=eServiceReference::idInvalid; + return -1; +} + +RESULT eDVBServicePlay::startTimeshift() +{ + if (m_timeshift_enabled) + return -1; + eDebug("TIMESHIFT - start!"); + return 0; +} + +RESULT eDVBServicePlay::stopTimeshift() +{ + if (!m_timeshift_enabled) + return -1; + m_timeshift_enabled = 0; + eDebug("timeshift disabled"); + return 0; +} + DEFINE_REF(eDVBServicePlay) eAutoInitPtr init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB");