fix locking in dvb file player
authorFelix Domke <tmbinc@elitedvb.net>
Fri, 27 Jan 2006 01:05:05 +0000 (01:05 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Fri, 27 Jan 2006 01:05:05 +0000 (01:05 +0000)
lib/base/elock.h
lib/dvb/dvb.cpp
lib/dvb/dvb.h
lib/dvb/idvb.h

index 6a47f8c..f886473 100644 (file)
@@ -7,7 +7,7 @@ class singleLock
 {
        pthread_mutex_t &lock;
 public:
-       singleLock( pthread_mutex_t &m )
+       singleLock(pthread_mutex_t &m )
                :lock(m)
        {
                pthread_mutex_lock(&lock);
@@ -18,6 +18,36 @@ public:
        }
 };
 
+class eSingleLock
+{
+       friend class eSingleLocker;
+       pthread_mutex_t m_lock;
+public:
+       eSingleLock()
+       {
+               pthread_mutex_init(&m_lock, 0);
+       }
+       ~eSingleLock()
+       {
+               pthread_mutex_destroy(&m_lock);
+       }
+};
+
+class eSingleLocker
+{
+       eSingleLock &m_lock;
+public:
+       eSingleLocker(eSingleLock &m)
+               : m_lock(m)
+       {
+               pthread_mutex_lock(&m_lock.m_lock);
+       }
+       ~eSingleLocker()
+       {
+               pthread_mutex_unlock(&m_lock.m_lock);
+       }
+};
+
 class eLock
 {
        pthread_mutex_t mutex;
index cac5a67..601e627 100644 (file)
@@ -630,9 +630,6 @@ void eDVBChannel::pvrEvent(int event)
 
 void eDVBChannel::cueSheetEvent(int event)
 {
-               /* we need proper locking here! */
-       eDebug("CUE SHEET EVENT %d", event);
-       
        switch (event)
        {
        case eCueSheet::evtSeek:
@@ -641,27 +638,30 @@ void eDVBChannel::cueSheetEvent(int event)
                break;
        case eCueSheet::evtSkipmode:
        {
-               m_cue->m_seek_requests.push_back(std::pair<int, pts_t>(1, 0)); /* resync */
-               if (m_cue->m_skipmode_ratio)
                {
-                       int bitrate = m_tstools.calcBitrate(); /* in bits/s */
-                       eDebug("skipmode ratio is %lld:90000, bitrate is %d bit/s", m_cue->m_skipmode_ratio, bitrate);
-                                       /* i agree that this might look a bit like black magic. */
-                       m_skipmode_n = 512*1024; /* must be 1 iframe at least. */
-                       m_skipmode_m = bitrate / 8 / 90000 * m_cue->m_skipmode_ratio;
-
-                       eDebug("resolved to: %d %d", m_skipmode_m, m_skipmode_n);
-                       
-                       if (abs(m_skipmode_m) < abs(m_skipmode_n))
+                       eSingleLocker l(m_cue->m_lock);
+                       m_cue->m_seek_requests.push_back(std::pair<int, pts_t>(1, 0)); /* resync */
+                       if (m_cue->m_skipmode_ratio)
                        {
-                               eFatal("damn, something is wrong with this calculation");
+                               int bitrate = m_tstools.calcBitrate(); /* in bits/s */
+                               eDebug("skipmode ratio is %lld:90000, bitrate is %d bit/s", m_cue->m_skipmode_ratio, bitrate);
+                                               /* i agree that this might look a bit like black magic. */
+                               m_skipmode_n = 512*1024; /* must be 1 iframe at least. */
+                               m_skipmode_m = bitrate / 8 / 90000 * m_cue->m_skipmode_ratio;
+       
+                               eDebug("resolved to: %d %d", m_skipmode_m, m_skipmode_n);
+                               
+                               if (abs(m_skipmode_m) < abs(m_skipmode_n))
+                               {
+                                       eFatal("damn, something is wrong with this calculation");
+                                       m_skipmode_n = m_skipmode_m = 0;
+                               }
+                               
+                       } else
+                       {
+                               eDebug("skipmode ratio is 0, normal play");
                                m_skipmode_n = m_skipmode_m = 0;
                        }
-                       
-               } else
-               {
-                       eDebug("skipmode ratio is 0, normal play");
-                       m_skipmode_n = m_skipmode_m = 0;
                }
                flushPVR(m_cue->m_decoding_demux);
                break;
@@ -685,6 +685,8 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off
                size = max;
                return;
        }
+
+       eSingleLocker l(m_cue->m_lock);
        
        if (!m_cue->m_decoding_demux)
        {
@@ -1021,24 +1023,34 @@ eCueSheet::eCueSheet()
 
 void eCueSheet::seekTo(int relative, const pts_t &pts)
 {
-       m_seek_requests.push_back(std::pair<int, pts_t>(relative, pts));
+       {
+               eSingleLock l(m_lock);
+               m_seek_requests.push_back(std::pair<int, pts_t>(relative, pts));
+       }
        m_event(evtSeek);
 }
        
 void eCueSheet::clear()
 {
+       eSingleLock l(m_lock);
        m_spans.clear();
 }
 
 void eCueSheet::addSourceSpan(const pts_t &begin, const pts_t &end)
 {
-       m_spans.push_back(std::pair<pts_t, pts_t>(begin, end));
+       {
+               eSingleLock l(m_lock);
+               m_spans.push_back(std::pair<pts_t, pts_t>(begin, end));
+       }
        m_event(evtSpanChanged);
 }
 
 void eCueSheet::setSkipmode(const pts_t &ratio)
 {
-       m_skipmode_ratio = ratio;
+       {
+               eSingleLock l(m_lock);
+               m_skipmode_ratio = ratio;
+       }
        m_event(evtSkipmode);
 }
 
index 0c652e3..0e44914 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <lib/base/ebase.h>
 #include <lib/base/filepush.h>
+#include <lib/base/elock.h>
 #include <lib/dvb/idvb.h>
 #include <lib/dvb/demux.h>
 #include <lib/dvb/frontend.h>
@@ -256,6 +257,8 @@ private:
        std::list<std::pair<off_t, off_t> > m_source_span;
        void getNextSourceSpan(off_t current_offset, size_t bytes_read, off_t &start, size_t &size);
        void flushPVR(iDVBDemux *decoding_demux=0);
+       
+       eSingleLock m_cuesheet_lock;
 
        friend class eUsePtr<eDVBChannel>;
                /* use count */
index 7dbad78..f20de19 100644 (file)
@@ -11,6 +11,7 @@
 #include <lib/dvb/frontendparms.h>
 #include <lib/base/object.h>
 #include <lib/base/ebase.h>
+#include <lib/base/elock.h>
 #include <lib/service/service.h>
 #include <libsig_comp.h>
 #include <connection.h>
@@ -444,6 +445,9 @@ public:
        void setSkipmode(const pts_t &ratio); /* 90000 is 1:1 */
        void setDecodingDemux(iDVBDemux *demux);
        
+                       /* frontend and backend */
+       eSingleLock m_lock;
+       
                        /* backend */
        enum { evtSeek, evtSkipmode, evtSpanChanged };
        RESULT connectEvent(const Slot1<void, int> &event, ePtr<eConnection> &connection);