lib/dvb/tstools.h/cpp: make eDVBTSTool thread safe (i.e. this fixes seeking in timesh...
authorghost <andreas.monzner@multimedia-labs.de>
Thu, 17 Dec 2009 13:58:54 +0000 (14:58 +0100)
committerghost <andreas.monzner@multimedia-labs.de>
Thu, 17 Dec 2009 14:23:07 +0000 (15:23 +0100)
lib/dvb/tstools.cpp
lib/dvb/tstools.h

index 2e5c5665d9e7a01bb15508078dbc2c5264e55ca6..dafd70fef76293bece98a5b549161314ce0fb0c0 100644 (file)
@@ -7,6 +7,7 @@
 #include <stdio.h>
 
 eDVBTSTools::eDVBTSTools()
 #include <stdio.h>
 
 eDVBTSTools::eDVBTSTools()
+       :m_file_lock(true)
 {
        m_pid = -1;
        m_maxrange = 256*1024;
 {
        m_pid = -1;
        m_maxrange = 256*1024;
@@ -47,6 +48,7 @@ int eDVBTSTools::openFile(const char *filename, int nostreaminfo)
        
        m_samples_taken = 0;
 
        
        m_samples_taken = 0;
 
+       eSingleLocker l(m_file_lock);
        if (m_file.open(filename, 1) < 0)
                return -1;
        return 0;
        if (m_file.open(filename, 1) < 0)
                return -1;
        return 0;
@@ -54,6 +56,7 @@ int eDVBTSTools::openFile(const char *filename, int nostreaminfo)
 
 void eDVBTSTools::closeFile()
 {
 
 void eDVBTSTools::closeFile()
 {
+       eSingleLocker l(m_file_lock);
        m_file.close();
 }
 
        m_file.close();
 }
 
@@ -78,7 +81,8 @@ int eDVBTSTools::getPTS(off_t &offset, pts_t &pts, int fixed)
                return -1;
 
        offset -= offset % 188;
                return -1;
 
        offset -= offset % 188;
-       
+
+       eSingleLocker l(m_file_lock);
        if (m_file.lseek(offset, SEEK_SET) < 0)
        {
                eDebug("lseek failed");
        if (m_file.lseek(offset, SEEK_SET) < 0)
        {
                eDebug("lseek failed");
@@ -355,7 +359,8 @@ void eDVBTSTools::calcEnd()
 {
        if (!m_file.valid())
                return;
 {
        if (!m_file.valid())
                return;
-       
+
+       eSingleLocker l(m_file_lock);
        off_t end = m_file.lseek(0, SEEK_END);
        
        if (llabs(end - m_last_filelength) > 1*1024*1024)
        off_t end = m_file.lseek(0, SEEK_END);
        
        if (llabs(end - m_last_filelength) > 1*1024*1024)
@@ -504,6 +509,7 @@ int eDVBTSTools::findPMT(int &pmt_pid, int &service_id)
                return -1;
        }
 
                return -1;
        }
 
+       eSingleLocker l(m_file_lock);
        if (m_file.lseek(0, SEEK_SET) < 0)
        {
                eDebug("seek failed");
        if (m_file.lseek(0, SEEK_SET) < 0)
        {
                eDebug("seek failed");
index c230a341e580f8e914de48cda41370f7681153a4..ed8b9241f285c74189a6078cc778621dc8ecc8ae 100644 (file)
@@ -4,6 +4,7 @@
 #include <sys/types.h>
 #include <lib/dvb/pvrparse.h>
 #include <lib/base/rawfile.h>
 #include <sys/types.h>
 #include <lib/dvb/pvrparse.h>
 #include <lib/base/rawfile.h>
+#include <lib/base/elock.h>
 
 /*
  * Note: we're interested in PTS values, not STC values.
 
 /*
  * Note: we're interested in PTS values, not STC values.
@@ -75,9 +76,10 @@ public:
 private:
        int m_pid;
        int m_maxrange;
 private:
        int m_pid;
        int m_maxrange;
-       
+
+       eSingleLock m_file_lock;
        eRawFile m_file;
        eRawFile m_file;
-       
+
        int m_begin_valid, m_end_valid;
        pts_t m_pts_begin, m_pts_end;
        off_t m_offset_begin, m_offset_end;
        int m_begin_valid, m_end_valid;
        pts_t m_pts_begin, m_pts_end;
        off_t m_offset_begin, m_offset_end;