From: Felix Domke Date: Fri, 11 Nov 2005 15:41:18 +0000 (+0000) Subject: add pause support X-Git-Tag: 2.6.0~5323 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/f94f8561a13e8666dd43e803d45325d1a9347cb2 add pause support --- diff --git a/data/keymap.xml b/data/keymap.xml index b8f234c0..fa252fcc 100644 --- a/data/keymap.xml +++ b/data/keymap.xml @@ -83,6 +83,9 @@ + + + diff --git a/lib/dvb/decoder.cpp b/lib/dvb/decoder.cpp index b7118558..751796ae 100644 --- a/lib/dvb/decoder.cpp +++ b/lib/dvb/decoder.cpp @@ -183,6 +183,18 @@ void eDVBVideo::flush() eDebug("video: VIDEO_CLEAR_BUFFER: %m"); } +void eDVBVideo::freeze() +{ + if (::ioctl(m_fd, VIDEO_FREEZE) < 0) + eDebug("video: VIDEO_FREEZE: %m"); +} + +void eDVBVideo::unfreeze() +{ + if (::ioctl(m_fd, VIDEO_CONTINUE) < 0) + eDebug("video: VIDEO_CONTINUE: %m"); +} + eDVBVideo::~eDVBVideo() { if (m_fd >= 0) @@ -407,12 +419,20 @@ RESULT eTSMPEGDecoder::start() RESULT eTSMPEGDecoder::freeze(int cont) { - return -1; + if (m_video) + m_video->freeze(); + else + return -1; + return 0; } RESULT eTSMPEGDecoder::unfreeze() { - return -1; + if (m_video) + m_video->unfreeze(); + else + return -1; + return 0; } RESULT eTSMPEGDecoder::setSinglePictureMode(int when) diff --git a/lib/dvb/decoder.h b/lib/dvb/decoder.h index a26d6cf5..68262fe0 100644 --- a/lib/dvb/decoder.h +++ b/lib/dvb/decoder.h @@ -37,6 +37,8 @@ public: void stopPid(); #endif void flush(); + void freeze(); + void unfreeze(); virtual ~eDVBVideo(); }; diff --git a/lib/python/Screens/InfoBar.py b/lib/python/Screens/InfoBar.py index 065097f8..bf1d904b 100644 --- a/lib/python/Screens/InfoBar.py +++ b/lib/python/Screens/InfoBar.py @@ -115,7 +115,10 @@ class InfoBar(Screen): "8": self.keyNumberGlobal, "9": self.keyNumberGlobal, "0": self.keyNumberGlobal, - "showEPGList": self.showEPGList + "showEPGList": self.showEPGList, + + "pauseService": self.pauseService, + "unPauseService": self.unPauseService, }) # self["okbutton"] = Button("mainMenu", [self.mainMenu]) @@ -240,7 +243,7 @@ class InfoBar(Screen): pass # fix me, description. - self.recording = self.session.nav.recordWithTimer(time.time(), time.time() + 30, serviceref, epg, "instant record") + self.recording = self.session.nav.recordWithTimer(time.time(), time.time() + 3600, serviceref, epg, "instant record") def recordQuestionCallback(self, answer): if answer == False: @@ -259,3 +262,9 @@ class InfoBar(Screen): def showMovies(self): self.session.open(MovieSelection) + + def pauseService(self): + self.session.nav.pause(1) + + def unPauseService(self): + self.session.nav.pause(0) diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index fdf93d76..f3215d82 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -365,7 +365,7 @@ RESULT eServiceFactoryDVB::lookupService(ePtr &service, const eServ } eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *service): - m_reference(ref), m_dvb_service(service), m_service_handler(0) + m_reference(ref), m_dvb_service(service), m_service_handler(0), m_is_paused(0) { m_is_pvr = !ref.path.empty(); @@ -518,7 +518,12 @@ RESULT eDVBServicePlay::connectEvent(const Slot2 &ev RESULT eDVBServicePlay::pause(ePtr &ptr) { - // not yet possible, maybe later... + if (m_is_pvr) + { + ptr = this; + return 0; + } + ptr = 0; return -1; } @@ -548,6 +553,26 @@ RESULT eDVBServicePlay::getLength(pts_t &len) return pvr_channel->getLength(len); } +RESULT eDVBServicePlay::pause() +{ + if (!m_is_paused && m_decoder) + { + m_is_paused = 1; + return m_decoder->freeze(0); + } else + return -1; +} + +RESULT eDVBServicePlay::unpause() +{ + if (m_is_paused && m_decoder) + { + m_is_paused = 0; + return m_decoder->unfreeze(); + } else + return -1; +} + RESULT eDVBServicePlay::seekTo(pts_t to) { return -1; diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h index 57dca9a0..f47c3906 100644 --- a/lib/service/servicedvb.h +++ b/lib/service/servicedvb.h @@ -41,28 +41,9 @@ private: ePtr m_query; }; -class eDVBServicePlay: public iPlayableService, iSeekableService, public Object, public iServiceInformation +class eDVBServicePlay: public iPlayableService, public iPauseableService, public iSeekableService, public Object, public iServiceInformation { DECLARE_REF(eDVBServicePlay); -private: - friend class eServiceFactoryDVB; - eServiceReference m_reference; - - ePtr m_dvb_service; - - ePtr m_decoder; - - eDVBServicePMTHandler m_service_handler; - eDVBServiceEITHandler m_event_handler; - - eDVBServicePlay(const eServiceReference &ref, eDVBService *service); - - void gotNewEvent(); - - void serviceEvent(int event); - Signal2 m_event; - - int m_is_pvr; public: virtual ~eDVBServicePlay(); @@ -74,6 +55,10 @@ public: RESULT pause(ePtr &ptr); RESULT info(ePtr &ptr); + // iPauseableService + RESULT pause(); + RESULT unpause(); + // iSeekableService RESULT getLength(pts_t &len); RESULT seekTo(pts_t to); @@ -82,6 +67,26 @@ public: // iServiceInformation RESULT getName(std::string &name); RESULT getEvent(ePtr &evt, int nownext); + +private: + friend class eServiceFactoryDVB; + eServiceReference m_reference; + + ePtr m_dvb_service; + + ePtr m_decoder; + + eDVBServicePMTHandler m_service_handler; + eDVBServiceEITHandler m_event_handler; + + eDVBServicePlay(const eServiceReference &ref, eDVBService *service); + + void gotNewEvent(); + + void serviceEvent(int event); + Signal2 m_event; + + int m_is_pvr, m_is_paused; }; #endif