load and save cutlists
authorFelix Domke <tmbinc@elitedvb.net>
Thu, 16 Feb 2006 03:39:55 +0000 (03:39 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Thu, 16 Feb 2006 03:39:55 +0000 (03:39 +0000)
lib/service/servicedvb.cpp
lib/service/servicedvb.h

index 76abbd3805120669c331898da1420e9ff533d08d..3487c3e64bfceda28d0cb0bb34f829a61a02bea6 100644 (file)
 
 #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");
index e27f7ffda98d69a04cde6e74a86ac1628003e8fe..2785ce2a567bae6993371af2d9fe6177747e283a 100644 (file)
@@ -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