From: Felix Domke Date: Thu, 16 Feb 2006 03:39:55 +0000 (+0000) Subject: load and save cutlists X-Git-Tag: 2.6.0~4158 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/eda995a9610c94750384dd5ab9152c75a9ca9882 load and save cutlists --- diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 76abbd38..3487c3e6 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -17,6 +17,13 @@ #include +#include +#include + +#ifndef BYTE_ORDER +#error no byte order defined! +#endif + #define TSPATH "/media/hdd" class eStaticServiceDVBInformation: public iStaticServiceInformation @@ -529,12 +536,18 @@ eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *serv m_reference(ref), m_dvb_service(service), m_is_paused(0) { m_is_pvr = !ref.path.empty(); + m_timeshift_enabled = m_timeshift_active = 0; m_skipmode = 0; CONNECT(m_service_handler.serviceEvent, eDVBServicePlay::serviceEvent); CONNECT(m_service_handler_timeshift.serviceEvent, eDVBServicePlay::serviceEventTimeshift); CONNECT(m_event_handler.m_eit_changed, eDVBServicePlay::gotNewEvent); + + m_cuesheet_changed = 0; + + if (m_is_pvr) + loadCuesheet(); } eDVBServicePlay::~eDVBServicePlay() @@ -632,14 +645,13 @@ RESULT eDVBServicePlay::start() RESULT eDVBServicePlay::stop() { - eDebug("stop timeshift"); stopTimeshift(); /* in case timeshift was enabled, remove buffer etc. */ - - eDebug("free ts handler"); + m_service_handler_timeshift.free(); - eDebug("stop service handler"); m_service_handler.free(); - eDebug("ok"); + + if (m_is_pvr && m_cuesheet_changed) + saveCuesheet(); return 0; } @@ -1183,17 +1195,52 @@ PyObject *eDVBServicePlay::getCutList() { PyObject *list = PyList_New(0); + for (std::multiset::iterator i(m_cue_entries.begin()); i != m_cue_entries.end(); ++i) + { + PyObject *tuple = PyTuple_New(2); + PyTuple_SetItem(tuple, 0, PyLong_FromLongLong(i->where)); + PyTuple_SetItem(tuple, 1, PyInt_FromLong(i->what)); + PyList_Append(list, tuple); + Py_DECREF(tuple); + } + return list; } -RESULT eDVBServicePlay::addCut(const pts_t &when, int what) +void eDVBServicePlay::setCutList(PyObject *list) { - return -1; -} - -RESULT eDVBServicePlay::removeCut(const pts_t &when, int what) -{ - return -1; + if (!PyList_Check(list)) + return; + int size = PyList_Size(list); + int i; + + m_cue_entries.clear(); + + for (i=0; i 2) + break; + + m_cue_entries.insert(cueEntry(where, what)); + } + fclose(f); + eDebug("%d entries", m_cue_entries.size()); + } else + eDebug("cutfile not found!"); + + m_cuesheet_changed = 0; +} + +void eDVBServicePlay::saveCuesheet() +{ + std::string filename = m_reference.path + ".cuts"; + + FILE *f = fopen(filename.c_str(), "wb"); + + if (f) + { + unsigned long long where; + int what; + + for (std::multiset::iterator i(m_cue_entries.begin()); i != m_cue_entries.end(); ++i) + { +#if BYTE_ORDER == BIG_ENDIAN + where = i->where; +#else + where = bswap_64(i->where); +#endif + what = htonl(i->what); + fwrite(&where, sizeof(where), 1, f); + fwrite(&what, sizeof(what), 1, f); + + } + fclose(f); + } + + m_cuesheet_changed = 0; +} + DEFINE_REF(eDVBServicePlay) eAutoInitPtr init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB"); diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h index e27f7ffd..2785ce2a 100644 --- a/lib/service/servicedvb.h +++ b/lib/service/servicedvb.h @@ -119,8 +119,7 @@ public: // iCueSheet PyObject *getCutList(); - RESULT addCut(const pts_t &when, int what); - RESULT removeCut(const pts_t &when, int what); + void setCutList(PyObject *); private: friend class eServiceFactoryDVB; @@ -164,6 +163,27 @@ private: int m_skipmode; ePtr m_cue; + + struct cueEntry + { + pts_t where; + unsigned int what; + + bool operator < (const struct cueEntry &o) const + { + return what < o.what; + } + cueEntry(const pts_t &where, unsigned int what) : + where(where), what(what) + { + } + }; + + std::multiset m_cue_entries; + int m_cuesheet_changed; + + void loadCuesheet(); + void saveCuesheet(); }; #endif