X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/ec7c78fd405d7d6579eb40ac52a56e904ee1e21f..3dfafb8052158a04e3f2316bf3b63a5a79ab331e:/lib/service/servicedvb.cpp diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 3008a9d2..9da276e5 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -312,6 +313,9 @@ eServiceFactoryDVB::eServiceFactoryDVB() eServiceCenter::getPrivInstance(sc); if (sc) sc->addServiceFactory(eServiceFactoryDVB::id, this); + + m_StaticServiceDVBInfo = new eStaticServiceDVBInformation; + m_StaticServiceDVBBouquetInfo = new eStaticServiceDVBBouquetInformation; } eServiceFactoryDVB::~eServiceFactoryDVB() @@ -392,6 +396,7 @@ RESULT eDVBServiceList::getContent(std::list &list, bool sort // useable format options are // R = Service Reference (as swig object .. this is very slow) // S = Service Reference (as python string object .. same as ref.toString()) +// C = Service Reference (as python string object .. same as ref.toCompareString()) // N = Service Name (as python string object) // when exactly one return value per service is selected in the format string, // then each value is directly a list entry @@ -431,6 +436,9 @@ PyObject *eDVBServiceList::getContent(const char* format, bool sorted) case 'R': // service reference (swig)object tmp = New_eServiceReference(ref); break; + case 'C': // service reference compare string + tmp = PyString_FromString(ref.toCompareString().c_str()); + break; case 'S': // service reference string tmp = PyString_FromString(ref.toString().c_str()); break; @@ -584,9 +592,9 @@ RESULT eServiceFactoryDVB::info(const eServiceReference &ref, ePtr service; if (lookupService(service, ref)) // no eDVBService avail for this reference ( Linkage Services... ) - ptr = new eStaticServiceDVBInformation; + ptr = m_StaticServiceDVBInfo; else /* eDVBService has the iStaticServiceInformation interface, so we pass it here. */ ptr = service; @@ -823,7 +831,12 @@ RESULT eDVBServicePlay::stop() m_service_handler.free(); if (m_is_pvr && m_cuesheet_changed) - saveCuesheet(); + { + struct stat s; + /* save cuesheet only when main file is accessible. */ + if (!::stat(m_reference.path.c_str(), &s)) + saveCuesheet(); + } return 0; } @@ -1191,7 +1204,7 @@ int eDVBServicePlay::getInfo(int w) case sIsCrypted: return program.isCrypted(); case sVideoPID: if (program.videoStreams.empty()) return -1; return program.videoStreams[0].pid; case sVideoType: if (program.videoStreams.empty()) return -1; return program.videoStreams[0].type; - case sAudioPID: if (program.audioStreams.empty()) return -1; return program.audioStreams[m_current_audio_stream].pid; + case sAudioPID: if (program.audioStreams.empty()) return -1; return program.audioStreams[0].pid; case sPCRPID: return program.pcrPid; case sPMTPID: return program.pmtPid; case sTXTPID: return program.textPid; @@ -1319,8 +1332,6 @@ int eDVBServicePlay::selectAudioStream(int i) } } - m_current_audio_stream = i; - return 0; } @@ -1629,9 +1640,11 @@ void eDVBServicePlay::switchToLive() m_decode_demux = 0; m_teletext_parser = 0; m_radiotext_parser = 0; + m_subtitle_parser = 0; + m_new_dvb_subtitle_region_connection = 0; m_new_subtitle_page_connection = 0; m_radiotext_updated_connection = 0; - + /* free the timeshift service handler, we need the resources */ m_service_handler_timeshift.free(); m_timeshift_active = 0; @@ -1650,7 +1663,9 @@ void eDVBServicePlay::switchToTimeshift() m_decoder = 0; m_teletext_parser = 0; m_radiotext_parser = 0; + m_subtitle_parser = 0; m_new_subtitle_page_connection = 0; + m_new_dvb_subtitle_region_connection = 0; m_radiotext_updated_connection = 0; m_timeshift_active = 1; @@ -1675,7 +1690,7 @@ void eDVBServicePlay::updateDecoder() std::string default_ac3; if (!ePythonConfigQuery::getConfigValue("config.av.defaultac3", default_ac3)) - defaultac3 = default_ac3 == "enable"; + defaultac3 = default_ac3 == "True"; eDVBServicePMTHandler::program program; if (h.getProgramInfo(program)) @@ -1740,6 +1755,8 @@ void eDVBServicePlay::updateDecoder() m_teletext_parser = new eDVBTeletextParser(m_decode_demux); m_teletext_parser->connectNewPage(slot(*this, &eDVBServicePlay::newSubtitlePage), m_new_subtitle_page_connection); #endif + m_subtitle_parser = new eDVBSubtitleParser(m_decode_demux); + m_subtitle_parser->connectNewRegion(slot(*this, &eDVBServicePlay::newDVBSubtitleRegion), m_new_dvb_subtitle_region_connection); } if (m_decoder) @@ -1779,18 +1796,18 @@ void eDVBServicePlay::updateDecoder() m_decoder->setPCMDelay(pcm_delay == -1 ? 0 : pcm_delay); m_decoder->setVideoPID(vpid, vpidtype); - m_current_audio_stream = 0; m_decoder->setAudioPID(apid, apidtype); if (!(m_is_pvr || m_timeshift_active || !m_is_primary)) { m_decoder->setSyncPCR(pcrpid); - if (apid != 1) + if (apid != -1) { ePtr data_demux; - if (h.getDataDemux(data_demux)) + if (!h.getDataDemux(data_demux)) { m_radiotext_parser = new eDVBRadioTextParser(data_demux); m_radiotext_parser->connectUpdatedRadiotext(slot(*this, &eDVBServicePlay::radioTextUpdated), m_radiotext_updated_connection); + m_radiotext_parser->start(apid); } } } @@ -1802,8 +1819,8 @@ void eDVBServicePlay::updateDecoder() if (m_teletext_parser) m_teletext_parser->start(tpid); - if (m_radiotext_parser) - m_radiotext_parser->start(apid); + if (m_subtitle_parser && program.subtitleStreams.size() > 0) + m_subtitle_parser->start(program.subtitleStreams[0].pid); if (!m_is_primary) m_decoder->setTrickmode(1); @@ -2067,6 +2084,16 @@ void eDVBServicePlay::checkSubtitleTiming() } } +void eDVBServicePlay::newDVBSubtitleRegion(const eDVBSubtitleRegion &p) +{ + eDebug("new dvb subtitle region"); +} + +void eDVBServicePlay::checkDvbSubtitleTiming() +{ + eDebug("check dvb subtitle timing"); +} + int eDVBServicePlay::getAC3Delay() { if (m_dvb_service)