X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/95b51db3cdbe17f0ff80f8155155ae2fb5b8a11d..60ec3eac7d6877da641494e76d043651a048aea7:/lib/service/servicedvb.cpp diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 3d551016..542e6359 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -20,6 +21,8 @@ #include #include +#include + #ifndef BYTE_ORDER #error no byte order defined! #endif @@ -248,6 +251,7 @@ RESULT eDVBPVRServiceOfflineOperations::getListOfFilenames(std::list -1 ) + { + __u8 buf[4096]; + int rd = ::read(fd, buf, 4096); + ::close(fd); + if ( rd > 12 /*EIT_LOOP_SIZE*/ ) + { + Event ev(buf); + ePtr event = new eServiceEvent; + ePtr empty; + event->parseFrom(&ev, (service.getTransportStreamID().get()<<16)|service.getOriginalNetworkID().get()); + m_event_handler.inject(event, 0); + m_event_handler.inject(empty, 1); + eDebug("injected"); + } + } + } + + if (m_is_pvr) + loadCuesheet(); + m_event(this, evStart); m_event((iPlayableService*)this, evSeekableStatusChanged); return 0; @@ -804,12 +837,18 @@ RESULT eDVBServicePlay::seekRelative(int direction, pts_t to) if ((m_timeshift_enabled ? m_service_handler_timeshift : m_service_handler).getPVRChannel(pvr_channel)) return -1; + int mode = 1; + + /* HACK until we have skip-AP api */ + if ((to > 0) && (to < 100)) + mode = 2; + to *= direction; if (!m_cue) return 0; - m_cue->seekTo(1, to); + m_cue->seekTo(mode, to); return 0; } @@ -1113,6 +1152,52 @@ int eDVBServicePlay::getFrontendInfo(int w) return fe->readFrontendData(w); } +PyObject *eDVBServicePlay::getFrontendData(bool original) +{ + PyObject *ret=0; + + eUsePtr channel; + if(!m_service_handler.getChannel(channel)) + { + ePtr fe; + if(!channel->getFrontend(fe)) + { + ret = fe->readTransponderData(original); + if (ret) + { + ePtr feparm; + channel->getCurrentFrontendParameters(feparm); + if (feparm) + { + eDVBFrontendParametersSatellite osat; + if (!feparm->getDVBS(osat)) + { + void PutToDict(PyObject *, const char*, long); + void PutToDict(PyObject *, const char*, const char*); + PutToDict(ret, "orbital_position", osat.orbital_position); + const char *tmp = "UNKNOWN"; + switch(osat.polarisation) + { + case eDVBFrontendParametersSatellite::Polarisation::Horizontal: tmp="HORIZONTAL"; break; + case eDVBFrontendParametersSatellite::Polarisation::Vertical: tmp="VERTICAL"; break; + case eDVBFrontendParametersSatellite::Polarisation::CircularLeft: tmp="CIRCULAR_LEFT"; break; + case eDVBFrontendParametersSatellite::Polarisation::CircularRight: tmp="CIRCULAR_RIGHT"; break; + default:break; + } + PutToDict(ret, "polarization", tmp); + } + } + } + } + } + if (!ret) + { + ret = Py_None; + Py_INCREF(ret); + } + return ret; +} + int eDVBServicePlay::getNumberOfSubservices() { ePtr evt; @@ -1261,9 +1346,16 @@ void eDVBServicePlay::setCutList(PyObject *list) } m_cuesheet_changed = 1; + cutlistToCuesheet(); m_event((iPlayableService*)this, evCuesheetChanged); } +void eDVBServicePlay::setCutListEnable(int enable) +{ + m_cutlist_enabled = enable; + cutlistToCuesheet(); +} + void eDVBServicePlay::updateTimeshiftPids() { if (!m_record) @@ -1478,6 +1570,7 @@ void eDVBServicePlay::loadCuesheet() eDebug("cutfile not found!"); m_cuesheet_changed = 0; + cutlistToCuesheet(); m_event((iPlayableService*)this, evCuesheetChanged); } @@ -1510,6 +1603,57 @@ void eDVBServicePlay::saveCuesheet() m_cuesheet_changed = 0; } +void eDVBServicePlay::cutlistToCuesheet() +{ + if (!m_cue) + { + eDebug("no cue sheet"); + return; + } + m_cue->clear(); + + if (!m_cutlist_enabled) + { + m_cue->commitSpans(); + eDebug("cutlists where disabled"); + return; + } + + pts_t in = 0, out = 0, length = 0; + + getLength(length); + + std::multiset::iterator i(m_cue_entries.begin()); + + while (1) + { + if (i == m_cue_entries.end()) + out = length; + else { + if (i->what == 0) /* in */ + { + in = i++->where; + continue; + } else if (i->what == 1) /* out */ + out = i++->where; + else /* mark */ + { + i++; + continue; + } + } + + if (in != out) + m_cue->addSourceSpan(in, out); + + in = length; + + if (i == m_cue_entries.end()) + break; + } + m_cue->commitSpans(); +} + DEFINE_REF(eDVBServicePlay) eAutoInitPtr init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB");