aboutsummaryrefslogtreecommitdiff
path: root/lib/dvb/dvb.cpp
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2007-06-14 12:46:29 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2007-06-14 12:46:29 +0000
commitbe7160f4c15f23e853a3a0ad7b0ad54107ed9ca1 (patch)
tree769958d29a0b694b28c37c3b2d3f75921f10bbaa /lib/dvb/dvb.cpp
parenta7df600c514e420df8a7774c6ea8aafb91569a23 (diff)
downloadenigma2-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.cpp38
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);
}