use cached pts/offsets when available, clean up
[enigma2.git] / lib / dvb / dvb.cpp
index 8b442e3d28cf70d3d05bd90095f5c7964d79a083..11b1285a702d7cbec6dd6b8ed41137bbe0db1d56 100644 (file)
@@ -310,7 +310,9 @@ RESULT eDVBResourceManager::allocateChannel(const eDVBChannelID &channelid, eUse
                        channel = m_cached_channel;
                        return 0;
                }
+               m_cached_channel_state_changed_conn.disconnect();
                m_cached_channel=0;
+               m_releaseCachedChannelTimer.stop();
        }
 
 //     eDebug("allocate channel.. %04x:%04x", channelid.transport_stream_id.get(), channelid.original_network_id.get());
@@ -358,7 +360,8 @@ RESULT eDVBResourceManager::allocateChannel(const eDVBChannelID &channelid, eUse
                return errChidNotFound;
        }
        m_cached_channel = channel = ch;
-       CONNECT(ch->m_stateChanged,eDVBResourceManager::DVBChannelStateChanged);
+       m_cached_channel_state_changed_conn =
+               CONNECT(ch->m_stateChanged,eDVBResourceManager::DVBChannelStateChanged);
 
        return 0;
 }
@@ -369,6 +372,7 @@ void eDVBResourceManager::DVBChannelStateChanged(iDVBChannel *chan)
        chan->getState(state);
        switch (state)
        {
+               case iDVBChannel::state_release:
                case iDVBChannel::state_ok:
                {
                        eDebug("stop release channel timer");
@@ -388,7 +392,7 @@ void eDVBResourceManager::DVBChannelStateChanged(iDVBChannel *chan)
 
 void eDVBResourceManager::releaseCachedChannel()
 {
-       eDebug("release cached channel");
+       eDebug("release cached channel (timer timeout)");
        m_cached_channel=0;
 }
 
@@ -397,7 +401,11 @@ RESULT eDVBResourceManager::allocateRawChannel(eUsePtr<iDVBChannel> &channel, in
        ePtr<eDVBAllocatedFrontend> fe;
 
        if (m_cached_channel)
+       {
+               m_cached_channel_state_changed_conn.disconnect();
                m_cached_channel=0;
+               m_releaseCachedChannelTimer.stop();
+       }
 
        if (allocateFrontendByIndex(fe, frontend_index))
                return errNoFrontend;
@@ -414,9 +422,6 @@ RESULT eDVBResourceManager::allocatePVRChannel(eUsePtr<iDVBPVRChannel> &channel)
 {
        ePtr<eDVBAllocatedDemux> demux;
 
-       if (m_cached_channel)
-               m_cached_channel=0;
-
        eDVBChannel *ch;
        ch = new eDVBChannel(this, 0);
        
@@ -814,7 +819,10 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off
 void eDVBChannel::AddUse()
 {
        if (++m_use_count > 1 && m_state == state_last_instance)
+       {
                m_state = state_ok;
+               m_stateChanged(this);
+       }
 }
 
 void eDVBChannel::ReleaseUse()
@@ -988,17 +996,8 @@ RESULT eDVBChannel::getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos, in
        if (!decoding_demux)
                return -1;
        
-       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;
-       
+       int r;
                        /* TODO: this is a gross hack. */
        r = decoding_demux->getSTC(now, mode ? 128 : 0);
 
@@ -1008,19 +1007,15 @@ RESULT eDVBChannel::getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos, in
                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))
+       off_t off = 0; /* TODO: fixme */
+       r = m_tstools.fixupPTS(off, now);
+       if (r)
        {
-               pos = 0;
-               return 0;
+               eDebug("fixup PTS failed");
+               return -1;
        }
        
-       if (now < pos) /* wrap around */
-               pos = now + ((pts_t)1)<<33 - pos;
-       else
-               pos = now - pos;
+       pos = now;
        
        return 0;
 }