diff options
| author | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2007-06-14 12:46:29 +0000 |
|---|---|---|
| committer | Andreas Monzner <andreas.monzner@multimedia-labs.de> | 2007-06-14 12:46:29 +0000 |
| commit | be7160f4c15f23e853a3a0ad7b0ad54107ed9ca1 (patch) | |
| tree | 769958d29a0b694b28c37c3b2d3f75921f10bbaa /lib/dvb/dvb.cpp | |
| parent | a7df600c514e420df8a7774c6ea8aafb91569a23 (diff) | |
| download | enigma2-be7160f4c15f23e853a3a0ad7b0ad54107ed9ca1.tar.gz enigma2-be7160f4c15f23e853a3a0ad7b0ad54107ed9ca1.zip | |
use read/write lock for eCueSheet
Diffstat (limited to 'lib/dvb/dvb.cpp')
| -rw-r--r-- | lib/dvb/dvb.cpp | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index 0184347b..6e87585e 100644 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -891,8 +891,10 @@ void eDVBChannel::cueSheetEvent(int event) case eCueSheet::evtSkipmode: { { - eSingleLocker l(m_cue->m_lock); + m_cue->m_lock.WrLock(); m_cue->m_seek_requests.push_back(std::pair<int, pts_t>(1, 0)); /* resync */ + m_cue->m_lock.Unlock(); + eRdLocker l(m_cue->m_lock); if (m_cue->m_skipmode_ratio) { int bitrate = m_tstools.calcBitrate(); /* in bits/s */ @@ -975,13 +977,13 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off return; } - eSingleLocker l(m_cue->m_lock); - + m_cue->m_lock.RdLock(); if (!m_cue->m_decoding_demux) { start = current_offset; size = max; eDebug("getNextSourceSpan, no decoding demux. forcing normal play"); + m_cue->m_lock.Unlock(); return; } @@ -998,7 +1000,11 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off while (!m_cue->m_seek_requests.empty()) { std::pair<int, pts_t> seek = m_cue->m_seek_requests.front(); + m_cue->m_lock.Unlock(); + m_cue->m_lock.WrLock(); m_cue->m_seek_requests.pop_front(); + m_cue->m_lock.Unlock(); + m_cue->m_lock.RdLock(); int relative = seek.first; pts_t pts = seek.second; @@ -1071,6 +1077,8 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off current_offset = align(offset, blocksize); /* in case tstools return non-aligned offset */ } + m_cue->m_lock.Unlock(); + for (std::list<std::pair<off_t, off_t> >::const_iterator i(m_source_span.begin()); i != m_source_span.end(); ++i) { long long aligned_start = align(i->first, blocksize); @@ -1404,25 +1412,24 @@ eCueSheet::eCueSheet() void eCueSheet::seekTo(int relative, const pts_t &pts) { - { - eSingleLocker l(m_lock); - m_seek_requests.push_back(std::pair<int, pts_t>(relative, pts)); - } + m_lock.WrLock(); + m_seek_requests.push_back(std::pair<int, pts_t>(relative, pts)); + m_lock.Unlock(); m_event(evtSeek); } void eCueSheet::clear() { - eSingleLocker l(m_lock); + m_lock.WrLock(); m_spans.clear(); + m_lock.Unlock(); } void eCueSheet::addSourceSpan(const pts_t &begin, const pts_t &end) { - { - eSingleLocker l(m_lock); - m_spans.push_back(std::pair<pts_t, pts_t>(begin, end)); - } + m_lock.WrLock(); + m_spans.push_back(std::pair<pts_t, pts_t>(begin, end)); + m_lock.Unlock(); } void eCueSheet::commitSpans() @@ -1432,10 +1439,9 @@ void eCueSheet::commitSpans() void eCueSheet::setSkipmode(const pts_t &ratio) { - { - eSingleLocker l(m_lock); - m_skipmode_ratio = ratio; - } + m_lock.WrLock(); + m_skipmode_ratio = ratio; + m_lock.Unlock(); m_event(evtSkipmode); } |
