seekAbsolute with a negative number is a seek relative to the end
[vuplus_dvbapp] / lib / dvb / dvb.cpp
index c3c0a02..cf0bc9e 100644 (file)
@@ -52,6 +52,13 @@ RESULT eDVBResourceManager::getInstance(ePtr<eDVBResourceManager> &ptr)
        return -1;
 }
 
+ePtr<eDVBResourceManager> NewResourceManagerPtr(void)
+{
+       ePtr<eDVBResourceManager> ptr;
+       eDVBResourceManager::getInstance(ptr);
+       return ptr;
+}
+
 eDVBResourceManager::eDVBResourceManager()
        :m_releaseCachedChannelTimer(eApp)
 {
@@ -529,7 +536,7 @@ int eDVBResourceManager::canAllocateFrontend(ePtr<iDVBFrontendParameters> &fepar
 
 int eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, const eDVBChannelID& ignore)
 {
-       bool ret=true;
+       int ret=30000;
        if (m_cached_channel)
        {
                eDVBChannel *cache_chan = (eDVBChannel*)&(*m_cached_channel);
@@ -615,14 +622,14 @@ int eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, cons
        if (!m_list)
        {
                eDebug("no channel list set!");
-               ret = false;
+               ret = 0;
                goto error;
        }
 
        if (m_list->getChannelFrontendData(channelid, feparm))
        {
                eDebug("channel not found!");
-               ret = false;
+               ret = 0;
                goto error;
        }
 
@@ -840,6 +847,18 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off
                                eDebug("seekTo: getCurrentPosition failed!");
                                continue;
                        }
+               } else if (pts < 0) /* seek relative to end */
+               {
+                       pts_t len;
+                       if (!getLength(len))
+                       {
+                               eDebug("seeking relative to end. len=%lld, seek = %lld", len, pts);
+                               pts += len;
+                       } else
+                       {
+                               eWarning("getLength failed - can't seek relative to end!");
+                               continue;
+                       }
                }
                
                if (relative == 1) /* pts relative */
@@ -870,7 +889,10 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off
                
                off_t offset = 0;
                if (m_tstools.getOffset(offset, pts))
+               {
+                       eDebug("get offset for pts=%lld failed!", pts);
                        continue;
+               }
 
                eDebug("ok, resolved skip (rel: %d, diff %lld), now at %08llx", relative, pts, offset);
                current_offset = offset;
@@ -1203,7 +1225,7 @@ eCueSheet::eCueSheet()
 void eCueSheet::seekTo(int relative, const pts_t &pts)
 {
        {
-               eSingleLock l(m_lock);
+               eSingleLocker l(m_lock);
                m_seek_requests.push_back(std::pair<int, pts_t>(relative, pts));
        }
        m_event(evtSeek);
@@ -1211,14 +1233,14 @@ void eCueSheet::seekTo(int relative, const pts_t &pts)
        
 void eCueSheet::clear()
 {
-       eSingleLock l(m_lock);
+       eSingleLocker l(m_lock);
        m_spans.clear();
 }
 
 void eCueSheet::addSourceSpan(const pts_t &begin, const pts_t &end)
 {
        {
-               eSingleLock l(m_lock);
+               eSingleLocker l(m_lock);
                m_spans.push_back(std::pair<pts_t, pts_t>(begin, end));
        }
 }
@@ -1231,7 +1253,7 @@ void eCueSheet::commitSpans()
 void eCueSheet::setSkipmode(const pts_t &ratio)
 {
        {
-               eSingleLock l(m_lock);
+               eSingleLocker l(m_lock);
                m_skipmode_ratio = ratio;
        }
        m_event(evtSkipmode);