aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.net>2005-12-19 14:47:54 +0000
committerFelix Domke <tmbinc@elitedvb.net>2005-12-19 14:47:54 +0000
commit740ae9b4a03c13901e4f4ffc008e4c0cfd63d896 (patch)
tree148ab6985db0ea9f67380740f19d32b12b2e8c6d /lib
parentc9e02e35c9c420e16921f2bedcaf380477a24849 (diff)
downloadenigma2-740ae9b4a03c13901e4f4ffc008e4c0cfd63d896.tar.gz
enigma2-740ae9b4a03c13901e4f4ffc008e4c0cfd63d896.zip
decoder: switch off audio in trickmodes
Diffstat (limited to 'lib')
-rw-r--r--lib/dvb/decoder.cpp26
-rw-r--r--lib/dvb/decoder.h2
-rw-r--r--lib/dvb/idvb.h2
-rw-r--r--lib/python/Screens/InfoBarGenerics.py14
-rw-r--r--lib/service/iservice.h3
-rw-r--r--lib/service/servicedvb.cpp9
-rw-r--r--lib/service/servicedvb.h1
7 files changed, 53 insertions, 4 deletions
diff --git a/lib/dvb/decoder.cpp b/lib/dvb/decoder.cpp
index 6794a056..7bdb3062 100644
--- a/lib/dvb/decoder.cpp
+++ b/lib/dvb/decoder.cpp
@@ -306,6 +306,12 @@ DEFINE_REF(eTSMPEGDecoder);
int eTSMPEGDecoder::setState()
{
int res = 0;
+
+ int noaudio = m_is_sm || m_is_ff || m_is_trickmode;
+
+ if ((noaudio && m_audio) || (!m_audio && !noaudio))
+ m_changed |= changeAudio;
+
#if HAVE_DVB_API_VERSION < 3
if (m_changed & changeAudio && m_audio)
m_audio->stopPid();
@@ -399,7 +405,7 @@ int eTSMPEGDecoder::setState()
if (m_audio)
m_audio->stop();
m_audio = 0;
- if ((m_apid >= 0) && (m_apid < 0x1FFF))
+ if ((m_apid >= 0) && (m_apid < 0x1FFF) && !noaudio)
{
m_audio = new eDVBAudio(m_demux, 0);
if (m_audio->startPid(m_apid, m_atype))
@@ -417,7 +423,7 @@ int eTSMPEGDecoder::setState()
eTSMPEGDecoder::eTSMPEGDecoder(eDVBDemux *demux, int decoder): m_demux(demux), m_changed(0)
{
demux->connectEvent(slot(*this, &eTSMPEGDecoder::demux_event), m_demux_event);
- eDebug("eTSMPEGDecoder::eTSMPEGDecoder %p", this);
+ m_is_ff = m_is_sm = m_is_trickmode = 0;
}
eTSMPEGDecoder::~eTSMPEGDecoder()
@@ -425,7 +431,6 @@ eTSMPEGDecoder::~eTSMPEGDecoder()
m_vpid = m_apid = m_pcrpid = pidNone;
m_changed = -1;
setState();
- eDebug("~eTSMPEGDecoder %p", this);
}
RESULT eTSMPEGDecoder::setVideoPID(int vpid)
@@ -503,6 +508,10 @@ RESULT eTSMPEGDecoder::setPictureSkipMode(int what)
RESULT eTSMPEGDecoder::setFastForward(int frames_to_skip)
{
+ m_is_ff = frames_to_skip != 0;
+
+ setState();
+
if (m_video)
return m_video->setFastForward(frames_to_skip);
else
@@ -511,6 +520,10 @@ RESULT eTSMPEGDecoder::setFastForward(int frames_to_skip)
RESULT eTSMPEGDecoder::setSlowMotion(int repeat)
{
+ m_is_sm = repeat != 0;
+
+ setState();
+
if (m_video)
return m_video->setSlowMotion(repeat);
else
@@ -542,3 +555,10 @@ void eTSMPEGDecoder::demux_event(int event)
break;
}
}
+
+RESULT eTSMPEGDecoder::setTrickmode(int what)
+{
+ m_is_trickmode = what;
+ setState();
+ return 0;
+}
diff --git a/lib/dvb/decoder.h b/lib/dvb/decoder.h
index d1f040ec..fb543fed 100644
--- a/lib/dvb/decoder.h
+++ b/lib/dvb/decoder.h
@@ -78,6 +78,7 @@ private:
changePCR = 4
};
int m_changed;
+ int m_is_ff, m_is_sm, m_is_trickmode;
int setState();
ePtr<eConnection> m_demux_event;
@@ -99,5 +100,6 @@ public:
RESULT setSlowMotion(int repeat);
RESULT setZoom(int what);
RESULT flush();
+ RESULT setTrickmode(int what);
};
#endif
diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h
index c60f5698..6c45bb29 100644
--- a/lib/dvb/idvb.h
+++ b/lib/dvb/idvb.h
@@ -492,6 +492,8 @@ public:
enum { zoom_Normal, zoom_PanScan, zoom_Letterbox, zoom_Fullscreen };
/** Set Zoom. mode *must* be fitting. */
virtual RESULT setZoom(int what)=0;
+
+ virtual RESULT setTrickmode(int what) = 0;
};
#endif
diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py
index 77c4a415..5eda3381 100644
--- a/lib/python/Screens/InfoBarGenerics.py
+++ b/lib/python/Screens/InfoBarGenerics.py
@@ -509,6 +509,20 @@ class InfoBarPVR:
self.seekTimer.stop()
else:
self.seekTimer.start(500)
+
+ service = self.session.nav.getCurrentService()
+ if service is None:
+ return
+
+ seekable = service.seek()
+ if seekable is None:
+ return
+
+ if skipmode:
+ seekable.setTrickmode(1)
+ else:
+ seekable.setTrickmode(0)
+
def pauseService(self):
self.setSeekState(self.SEEK_STATE_PAUSE);
diff --git a/lib/service/iservice.h b/lib/service/iservice.h
index ed1cf3a5..378bdcc9 100644
--- a/lib/service/iservice.h
+++ b/lib/service/iservice.h
@@ -278,6 +278,9 @@ public:
enum { dirForward = +1, dirBackward = -1 };
virtual RESULT seekRelative(int direction, pts_t to)=0;
virtual RESULT getPlayPosition(pts_t &SWIG_OUTPUT)=0;
+ /* if you want to do several seeks in a row, you can enable the trickmode.
+ audio will be switched off, sync will be disabled etc. */
+ virtual RESULT setTrickmode(int trick=0)=0;
};
TEMPLATE_TYPEDEF(ePtr<iSeekableService>, iSeekableServicePtr);
diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp
index 790bfca6..fc35b521 100644
--- a/lib/service/servicedvb.cpp
+++ b/lib/service/servicedvb.cpp
@@ -669,7 +669,7 @@ RESULT eDVBServicePlay::setSlowMotion(int ratio)
RESULT eDVBServicePlay::setFastForward(int ratio)
{
if (m_decoder)
- m_decoder->setFastForward(ratio);
+ return m_decoder->setFastForward(ratio);
else
return -1;
}
@@ -758,6 +758,13 @@ RESULT eDVBServicePlay::getPlayPosition(pts_t &pos)
return pvr_channel->getCurrentPosition(demux, pos);
}
+RESULT eDVBServicePlay::setTrickmode(int trick=0)
+{
+ if (m_decoder)
+ m_decoder->setTrickmode(trick);
+ return 0;
+}
+
RESULT eDVBServicePlay::frontendStatusInfo(ePtr<iFrontendStatusInformation> &ptr)
{
ptr = this;
diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h
index e99faffd..b1df4cb7 100644
--- a/lib/service/servicedvb.h
+++ b/lib/service/servicedvb.h
@@ -84,6 +84,7 @@ public:
RESULT seekTo(pts_t to);
RESULT seekRelative(int direction, pts_t to);
RESULT getPlayPosition(pts_t &pos);
+ RESULT setTrickmode(int trick=0);
// iServiceInformation
RESULT getName(std::string &name);