save config (if changed) by "quit" from infobar
[enigma2.git] / lib / dvb / dvb.cpp
index d98aa2a81e861245751ef9f8bbea2aac9f1c7094..90df72677b8d7e67713189e01cfbf6cf2fe85f47 100644 (file)
@@ -382,6 +382,8 @@ eDVBChannel::~eDVBChannel()
        if (m_pvr_thread)
        {
                m_pvr_thread->stop();
+               ::close(m_pvr_fd_src);
+               ::close(m_pvr_fd_dst);
                delete m_pvr_thread;
        }
 }
@@ -515,29 +517,73 @@ RESULT eDVBChannel::playFile(const char *file)
                m_pvr_thread = 0;
        }
        
+       m_tstools.openFile(file);
+       
                /* DON'T EVEN THINK ABOUT FIXING THIS. FIX THE ATI SOURCES FIRST,
                   THEN DO A REAL FIX HERE! */
        
-       
                /* (this codepath needs to be improved anyway.) */
-       int dest = open("/dev/misc/pvr", O_WRONLY);
-       if (dest < 0)
+       m_pvr_fd_dst = open("/dev/misc/pvr", O_WRONLY);
+       if (m_pvr_fd_dst < 0)
        {
                eDebug("can't open /dev/misc/pvr - you need to buy the new(!) $$$ box! (%m)");
                return -ENODEV;
        }
        
-       int source = open(file, O_RDONLY);
-       if (source < 0)
+       m_pvr_fd_src = open(file, O_RDONLY);
+       if (m_pvr_fd_src < 0)
        {
-               eDebug("can't open PVR source file %s (%m)", file);
-               close(dest);
+               eDebug("can't open PVR m_pvr_fd_src file %s (%m)", file);
+               close(m_pvr_fd_dst);
                return -ENOENT;
        }
-
+       
        m_state = state_ok;
        m_stateChanged(this);
        
        m_pvr_thread = new eFilePushThread();
-       m_pvr_thread->start(source, dest);
+       m_pvr_thread->start(m_pvr_fd_src, m_pvr_fd_dst);
+}
+
+RESULT eDVBChannel::getLength(pts_t &len)
+{
+       return m_tstools.calcLen(len);
+}
+
+RESULT eDVBChannel::getCurrentPosition(pts_t &pos)
+{
+       off_t begin = 0;
+               /* getPTS for offset 0 is cached, so it doesn't harm. */
+       int r = m_tstools.getPTS(begin, pos);
+       if (r)
+       {
+               eDebug("tstools getpts(0) failed!");
+               return r;
+       }
+       
+       pts_t now;
+       
+       r = m_demux->get().getSTC(now);
+
+       if (r)
+       {
+               eDebug("demux getSTC failed");
+               return -1;
+       }
+       
+//     eDebug("STC: %08llx PTS: %08llx, diff %lld", now, pos, now - pos);
+               /* when we are less than 10 seconds before the start, return 0. */
+               /* (we're just waiting for the timespam to start) */
+       if ((now < pos) && ((pos - now) < 90000 * 10))
+       {
+               pos = 0;
+               return 0;
+       }
+       
+       if (now < pos) /* wrap around */
+               pos = now + ((pts_t)1)<<33 - pos;
+       else
+               pos = now - pos;
+       
+       return 0;
 }