aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.net>2006-02-16 03:39:55 +0000
committerFelix Domke <tmbinc@elitedvb.net>2006-02-16 03:39:55 +0000
commiteda995a9610c94750384dd5ab9152c75a9ca9882 (patch)
tree6afbc7ab2306ba316f6049ed09da24b604775fe8 /lib
parent47fe375aef171c91915625d5f48a4e5a39b6e3b7 (diff)
downloadenigma2-eda995a9610c94750384dd5ab9152c75a9ca9882.tar.gz
enigma2-eda995a9610c94750384dd5ab9152c75a9ca9882.zip
load and save cutlists
Diffstat (limited to 'lib')
-rw-r--r--lib/service/servicedvb.cpp139
-rw-r--r--lib/service/servicedvb.h24
2 files changed, 149 insertions, 14 deletions
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 <sys/vfs.h>
+#include <byteswap.h>
+#include <netinet/in.h>
+
+#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<struct cueEntry>::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<size; ++i)
+ {
+ PyObject *tuple = PyList_GetItem(list, i);
+ if (!PyTuple_Check(tuple))
+ {
+ eDebug("non-tuple in cutlist");
+ continue;
+ }
+ if (PyTuple_Size(tuple) != 2)
+ {
+ eDebug("cutlist entries need to be a 2-tuple");
+ continue;
+ }
+ PyObject *ppts = PyTuple_GetItem(tuple, 0), *ptype = PyTuple_GetItem(tuple, 1);
+ if (!(PyLong_Check(ppts) && PyInt_Check(ptype)))
+ {
+ eDebug("cutlist entries need to be (pts, type)-tuples (%d %d)", PyLong_Check(ppts), PyInt_Check(ptype));
+ continue;
+ }
+ pts_t pts = PyLong_AsLongLong(ppts);
+ int type = PyInt_AsLong(ptype);
+ m_cue_entries.insert(cueEntry(pts, type));
+ eDebug("adding %08llx, %d", pts, type);
+ }
+ m_cuesheet_changed = 1;
}
void eDVBServicePlay::updateTimeshiftPids()
@@ -1373,6 +1420,74 @@ void eDVBServicePlay::updateDecoder()
}
}
+void eDVBServicePlay::loadCuesheet()
+{
+ std::string filename = m_reference.path + ".cuts";
+
+ m_cue_entries.clear();
+
+ FILE *f = fopen(filename.c_str(), "rb");
+
+ if (f)
+ {
+ eDebug("loading cuts..");
+ while (1)
+ {
+ unsigned long long where;
+ unsigned int what;
+
+ if (!fread(&where, sizeof(where), 1, f))
+ break;
+ if (!fread(&what, sizeof(what), 1, f))
+ break;
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+ where = bswap_64(where);
+#endif
+ what = ntohl(what);
+
+ if (what > 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<cueEntry>::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<eServiceFactoryDVB> 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<eCueSheet> 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<cueEntry> m_cue_entries;
+ int m_cuesheet_changed;
+
+ void loadCuesheet();
+ void saveCuesheet();
};
#endif