aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.net>2006-01-18 02:35:18 +0000
committerFelix Domke <tmbinc@elitedvb.net>2006-01-18 02:35:18 +0000
commitcedb8844dbefb4723e47ba0610582100b5362409 (patch)
tree7d622d690e255c171425f7b470d6064894436121 /lib
parent69382ab48558b9305b27e464857deebdfa52b6b9 (diff)
downloadenigma2-cedb8844dbefb4723e47ba0610582100b5362409.tar.gz
enigma2-cedb8844dbefb4723e47ba0610582100b5362409.zip
add isTimeshiftActive, activateTimeshift functions
Diffstat (limited to 'lib')
-rw-r--r--lib/service/iservice.h7
-rw-r--r--lib/service/servicedvb.cpp42
-rw-r--r--lib/service/servicedvb.h2
3 files changed, 42 insertions, 9 deletions
diff --git a/lib/service/iservice.h b/lib/service/iservice.h
index 5a5a6cee..2b42510d 100644
--- a/lib/service/iservice.h
+++ b/lib/service/iservice.h
@@ -365,6 +365,10 @@ class iTimeshiftService: public iObject
public:
virtual RESULT startTimeshift()=0;
virtual RESULT stopTimeshift()=0;
+
+ virtual int isTimeshiftActive()=0;
+ /* this essentially seeks to the relative end of the timeshift buffer */
+ virtual RESULT activateTimeshift()=0;
};
TEMPLATE_TYPEDEF(ePtr<iTimeshiftService>, iTimeshiftServicePtr);
@@ -386,6 +390,9 @@ public:
// when iServiceInformation is implemented:
evUpdatedEventInfo,
evUpdatedInfo,
+
+ /* when seek() is implemented: */
+ evSeekableStatusChanged, /* for example when timeshifting */
evEOF
};
diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp
index ed6544f5..85647ff7 100644
--- a/lib/service/servicedvb.cpp
+++ b/lib/service/servicedvb.cpp
@@ -553,7 +553,10 @@ void eDVBServicePlay::serviceEvent(int event)
break;
}
case eDVBServicePMTHandler::eventEOF:
+ {
m_event((iPlayableService*)this, evEnd);
+ break;
+ }
}
}
@@ -565,6 +568,9 @@ void eDVBServicePlay::serviceEventTimeshift(int event)
if (m_timeshift_active)
updateDecoder();
break;
+ case eDVBServicePMTHandler::eventEOF:
+ switchToLive();
+ break;
}
}
@@ -620,7 +626,7 @@ RESULT eDVBServicePlay::setFastForward(int ratio)
RESULT eDVBServicePlay::seek(ePtr<iSeekableService> &ptr)
{
- if (m_is_pvr || m_timeshift_enabled)
+ if (m_is_pvr || m_timeshift_active)
{
ptr = this;
return 0;
@@ -645,11 +651,6 @@ RESULT eDVBServicePlay::getLength(pts_t &len)
RESULT eDVBServicePlay::pause()
{
- if (m_timeshift_enabled && !m_timeshift_active)
- {
- switchToTimeshift();
- return 0;
- }
if (!m_is_paused && m_decoder)
{
m_is_paused = 1;
@@ -677,7 +678,7 @@ RESULT eDVBServicePlay::seekTo(pts_t to)
ePtr<iDVBPVRChannel> pvr_channel;
- if (m_service_handler.getPVRChannel(pvr_channel))
+ if ((m_timeshift_enabled ? m_service_handler_timeshift : m_service_handler).getPVRChannel(pvr_channel))
return -1;
return pvr_channel->seekTo(m_decode_demux, 0, to);
@@ -692,7 +693,7 @@ RESULT eDVBServicePlay::seekRelative(int direction, pts_t to)
ePtr<iDVBPVRChannel> pvr_channel;
- if (m_service_handler.getPVRChannel(pvr_channel))
+ if ((m_timeshift_enabled ? m_service_handler_timeshift : m_service_handler).getPVRChannel(pvr_channel))
return -1;
to *= direction;
@@ -707,7 +708,7 @@ RESULT eDVBServicePlay::getPlayPosition(pts_t &pos)
if (!m_decode_demux)
return -1;
- if (m_service_handler.getPVRChannel(pvr_channel))
+ if ((m_timeshift_enabled ? m_service_handler_timeshift : m_service_handler).getPVRChannel(pvr_channel))
return -1;
return pvr_channel->getCurrentPosition(m_decode_demux, pos, 1);
@@ -1030,6 +1031,25 @@ RESULT eDVBServicePlay::stopTimeshift()
return 0;
}
+int eDVBServicePlay::isTimeshiftActive()
+{
+ return m_timeshift_enabled && m_timeshift_active;
+}
+
+RESULT eDVBServicePlay::activateTimeshift()
+{
+ if (!m_timeshift_enabled)
+ return -1;
+
+ if (!m_timeshift_active)
+ {
+ switchToTimeshift();
+ return 0;
+ }
+
+ return -2;
+}
+
void eDVBServicePlay::updateTimeshiftPids()
{
if (!m_record)
@@ -1090,6 +1110,8 @@ void eDVBServicePlay::switchToLive()
m_service_handler_timeshift.free();
m_timeshift_active = 0;
+ m_event((iPlayableService*)this, evSeekableStatusChanged);
+
updateDecoder();
}
@@ -1103,6 +1125,8 @@ void eDVBServicePlay::switchToTimeshift()
m_decoder = 0;
m_timeshift_active = 1;
+
+ m_event((iPlayableService*)this, evSeekableStatusChanged);
eServiceReferenceDVB r = (eServiceReferenceDVB&)m_reference;
r.path = m_timeshift_file;
diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h
index c7c36e1c..61baf6a2 100644
--- a/lib/service/servicedvb.h
+++ b/lib/service/servicedvb.h
@@ -107,6 +107,8 @@ public:
// iTimeshiftService
RESULT startTimeshift();
RESULT stopTimeshift();
+ int isTimeshiftActive();
+ RESULT activateTimeshift();
private:
friend class eServiceFactoryDVB;