aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.net>2006-01-27 01:05:05 +0000
committerFelix Domke <tmbinc@elitedvb.net>2006-01-27 01:05:05 +0000
commit8fc0752931ad7a8efa802b0a0f0246a2b50eca6b (patch)
tree2dcf004cd57c89915779653817058d4d2e8830e9 /lib
parenta2705e2beab9649b7ad70d0873aba014778e5d20 (diff)
downloadenigma2-8fc0752931ad7a8efa802b0a0f0246a2b50eca6b.tar.gz
enigma2-8fc0752931ad7a8efa802b0a0f0246a2b50eca6b.zip
fix locking in dvb file player
Diffstat (limited to 'lib')
-rw-r--r--lib/base/elock.h32
-rw-r--r--lib/dvb/dvb.cpp58
-rw-r--r--lib/dvb/dvb.h3
-rw-r--r--lib/dvb/idvb.h4
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);