diff options
| author | Felix Domke <tmbinc@elitedvb.net> | 2006-01-27 01:05:05 +0000 |
|---|---|---|
| committer | Felix Domke <tmbinc@elitedvb.net> | 2006-01-27 01:05:05 +0000 |
| commit | 8fc0752931ad7a8efa802b0a0f0246a2b50eca6b (patch) | |
| tree | 2dcf004cd57c89915779653817058d4d2e8830e9 | |
| parent | a2705e2beab9649b7ad70d0873aba014778e5d20 (diff) | |
| download | enigma2-8fc0752931ad7a8efa802b0a0f0246a2b50eca6b.tar.gz enigma2-8fc0752931ad7a8efa802b0a0f0246a2b50eca6b.zip | |
fix locking in dvb file player
| -rw-r--r-- | lib/base/elock.h | 32 | ||||
| -rw-r--r-- | lib/dvb/dvb.cpp | 58 | ||||
| -rw-r--r-- | lib/dvb/dvb.h | 3 | ||||
| -rw-r--r-- | lib/dvb/idvb.h | 4 |
4 files changed, 73 insertions, 24 deletions
diff --git a/lib/base/elock.h b/lib/base/elock.h index 6a47f8c9..f886473b 100644 --- a/lib/base/elock.h +++ b/lib/base/elock.h @@ -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; diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index cac5a679..601e6279 100644 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -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); } diff --git a/lib/dvb/dvb.h b/lib/dvb/dvb.h index 0c652e35..0e449144 100644 --- a/lib/dvb/dvb.h +++ b/lib/dvb/dvb.h @@ -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 */ diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h index 7dbad780..f20de190 100644 --- a/lib/dvb/idvb.h +++ b/lib/dvb/idvb.h @@ -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); |
