From 06f7820d3c5fff95b0609c1e5830cc234a0b2741 Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Wed, 22 Nov 2006 15:09:29 +0000 Subject: [PATCH] recording service events now working TODO: add record specific events like diskfull, demux errors, a.o. --- Navigation.py | 20 ++++++++++-- RecordTimer.py | 2 +- lib/nav/core.cpp | 53 ++++++++++++++++++++++++++++++-- lib/nav/core.h | 16 +++++++--- lib/nav/pcore.cpp | 29 +++++++++++++---- lib/nav/pcore.h | 18 ++++++----- lib/python/enigma_python.i | 12 ++++++++ lib/service/iservice.h | 9 +++++- lib/service/servicedvbrecord.cpp | 11 +++++-- 9 files changed, 143 insertions(+), 27 deletions(-) diff --git a/Navigation.py b/Navigation.py index 7c1cdd42..53e9ed42 100644 --- a/Navigation.py +++ b/Navigation.py @@ -22,19 +22,26 @@ class Navigation: Nav.navcore = self self.pnav = pNavigation() - self.pnav.m_event.get().append(self.callEvent) + self.pnav.m_event.get().append(self.dispatchEvent) + self.pnav.m_record_event.get().append(self.dispatchRecordEvent) self.event = [ ] + self.record_event = [ ] self.currentlyPlayingServiceReference = None self.currentlyPlayingService = None self.state = 0 self.RecordTimer = RecordTimer.RecordTimer() self.SleepTimer = SleepTimer.SleepTimer() - - def callEvent(self, i): + + def dispatchEvent(self, i): self.state = i != 1 for x in self.event: x(i) + def dispatchRecordEvent(self, rec_service, event): +# print "record_event", rec_service, event + for x in self.record_event: + x(rec_service, event) + def playService(self, ref, checkParentalControl = True): print "playing", ref and ref.toString() self.currentlyPlayingServiceReference = None @@ -66,6 +73,13 @@ class Navigation: else: return service + def stopRecordService(self, service): + ret = self.pnav and self.pnav.stopRecordService(service) + return ret + + def getRecordings(self): + return self.pnav and self.pnav.getRecordings() + def getCurrentService(self): if self.state: if not self.currentlyPlayingService: diff --git a/RecordTimer.py b/RecordTimer.py index b438910e..21ad99d9 100644 --- a/RecordTimer.py +++ b/RecordTimer.py @@ -198,7 +198,7 @@ class RecordTimerEntry(timer.TimerEntry): elif next_state == self.StateEnded: self.log(12, "stop recording") if not self.justplay: - self.record_service.stop() + NavigationInstance.instance.stopRecordService(self.record_service) self.record_service = None if self.afterEvent == AFTEREVENT.STANDBY: if self.session is not None: diff --git a/lib/nav/core.cpp b/lib/nav/core.cpp index edc63c18..7f76fa3f 100644 --- a/lib/nav/core.cpp +++ b/lib/nav/core.cpp @@ -1,5 +1,6 @@ #include #include +#include void eNavigation::serviceEvent(iPlayableService* service, int event) { @@ -8,8 +9,17 @@ void eNavigation::serviceEvent(iPlayableService* service, int event) eDebug("nav: event for other service"); return; } + m_event(event); +} - m_event(this, event); +void eNavigation::recordEvent(iRecordableService* service, int event) +{ + if (m_recordings.find(service) == m_recordings.end()) + { + eDebug("nav: event for non registered recording service"); + return; + } + m_record_event(service, event); } RESULT eNavigation::playService(const eServiceReference &service) @@ -26,12 +36,18 @@ RESULT eNavigation::playService(const eServiceReference &service) return res; } -RESULT eNavigation::connectEvent(const Slot2 &event, ePtr &connection) +RESULT eNavigation::connectEvent(const Slot1 &event, ePtr &connection) { connection = new eConnection(this, m_event.connect(event)); return 0; } +RESULT eNavigation::connectRecordEvent(const Slot2,int> &event, ePtr &connection) +{ + connection = new eConnection(this, m_record_event.connect(event)); + return 0; +} + RESULT eNavigation::getCurrentService(ePtr &service) { service = m_runningService; @@ -44,7 +60,7 @@ RESULT eNavigation::stopService(void) if (!m_runningService) return 1; /* send stop event */ - m_event(this, iPlayableService::evEnd); + m_event(iPlayableService::evEnd); m_runningService->stop(); /* kill service. */ @@ -60,9 +76,40 @@ RESULT eNavigation::recordService(const eServiceReference &ref, ePtr conn; + service->connectEvent(slot(*this, &eNavigation::recordEvent), conn); + m_recordings[service]=conn; + } return res; } +RESULT eNavigation::stopRecordService(ePtr &service) +{ + service->stop(); + std::map, ePtr >::iterator it = + m_recordings.find(service); + if (it != m_recordings.end()) + { + m_recordings.erase(it); + return 0; + } + eDebug("try to stop non running recording!!"); // this should not happen + return -1; +} + +extern PyObject *New_iRecordableServicePtr(const ePtr &ref); // defined in enigma_python.i + +PyObject *eNavigation::getRecordings(void) +{ + PyObject *result = PyList_New(m_recordings.size()); + int pos=0; + for (std::map, ePtr >::iterator it(m_recordings.begin()); it != m_recordings.end(); ++it) + PyList_SET_ITEM(result, pos++, New_iRecordableServicePtr(it->first)); + return result; +} + RESULT eNavigation::pause(int dop) { if (!m_runningService) diff --git a/lib/nav/core.h b/lib/nav/core.h index fbcd566d..b82d2fbd 100644 --- a/lib/nav/core.h +++ b/lib/nav/core.h @@ -4,26 +4,34 @@ #include #include #include +#include class eNavigation: public iObject, public Object { DECLARE_REF(eNavigation); private: - ePtr m_runningService; - ePtr m_servicehandler; - Signal2 m_event; + + ePtr m_runningService; + Signal1 m_event; ePtr m_service_event_conn; void serviceEvent(iPlayableService* service, int event); + + std::map, ePtr, std::less > m_recordings; + Signal2,int> m_record_event; + void recordEvent(iRecordableService* service, int event); public: RESULT playService(const eServiceReference &service); - RESULT connectEvent(const Slot2 &event, ePtr &connection); + RESULT connectEvent(const Slot1 &event, ePtr &connection); + RESULT connectRecordEvent(const Slot2,int> &event, ePtr &connection); /* int connectServiceEvent(const Slot1 &event, ePtr &connection); */ RESULT getCurrentService(ePtr &service); RESULT stopService(void); RESULT recordService(const eServiceReference &ref, ePtr &service); + RESULT stopRecordService(ePtr &service); + PyObject *getRecordings(void); RESULT pause(int p); eNavigation(iServiceHandler *serviceHandler); diff --git a/lib/nav/pcore.cpp b/lib/nav/pcore.cpp index fdcb385e..a6ed35f6 100644 --- a/lib/nav/pcore.cpp +++ b/lib/nav/pcore.cpp @@ -14,6 +14,7 @@ pNavigation::pNavigation() m_core = new eNavigation(service_center); m_core->connectEvent(slot(*this, &pNavigation::navEvent), m_nav_event_connection); + m_core->connectRecordEvent(slot(*this, &pNavigation::navRecordEvent), m_nav_record_event_connection); } RESULT pNavigation::playService(const eServiceReference &service) @@ -21,11 +22,6 @@ RESULT pNavigation::playService(const eServiceReference &service) return m_core->playService(service); } -RESULT pNavigation::recordService(const eServiceReference &ref, ePtr &service) -{ - return m_core->recordService(ref, service); -} - RESULT pNavigation::getCurrentService(ePtr &service) { return m_core->getCurrentService(service); @@ -41,8 +37,29 @@ RESULT pNavigation::stopService() return m_core->stopService(); } -void pNavigation::navEvent(eNavigation *nav, int event) +RESULT pNavigation::recordService(const eServiceReference &ref, ePtr &service) +{ + return m_core->recordService(ref, service); +} + +RESULT pNavigation::stopRecordService(ePtr &service) +{ + return m_core->stopRecordService(service); +} + +PyObject *pNavigation::getRecordings(void) +{ + return m_core->getRecordings(); +} + +void pNavigation::navEvent(int event) { /* just relay the events here. */ m_event(event); } + +void pNavigation::navRecordEvent(ePtr service, int event) +{ + /* just relay the events here. */ + m_record_event(service, event); +} diff --git a/lib/nav/pcore.h b/lib/nav/pcore.h index e9a06403..c485f7d0 100644 --- a/lib/nav/pcore.h +++ b/lib/nav/pcore.h @@ -11,20 +11,24 @@ class pNavigation: public iObject, public Object DECLARE_REF(pNavigation); public: PSignal1 m_event; - + PSignal2&, int> m_record_event; + pNavigation(); RESULT playService(const eServiceReference &service); - SWIG_VOID(RESULT) recordService(const eServiceReference &ref, ePtr &SWIG_OUTPUT); - - SWIG_VOID(RESULT) getCurrentService(ePtr &SWIG_OUTPUT); RESULT stopService(); - RESULT pause(int p); + SWIG_VOID(RESULT) getCurrentService(ePtr &SWIG_OUTPUT); + + SWIG_VOID(RESULT) recordService(const eServiceReference &ref, ePtr &SWIG_OUTPUT); + RESULT stopRecordService(ePtr &service); + PyObject *getRecordings(void); + private: ePtr m_core; - ePtr m_nav_event_connection; - void navEvent(eNavigation *nav, int event); + ePtr m_nav_event_connection, m_nav_record_event_connection; + void navEvent(int event); + void navRecordEvent(ePtr, int event); }; #endif diff --git a/lib/python/enigma_python.i b/lib/python/enigma_python.i index 3772a23d..21c0664a 100644 --- a/lib/python/enigma_python.i +++ b/lib/python/enigma_python.i @@ -155,6 +155,7 @@ typedef long time_t; %immutable eComponentScan::statusChanged; %immutable eComponentScan::newService; %immutable pNavigation::m_event; +%immutable pNavigation::m_record_event; %immutable eListbox::selectionChanged; %immutable eDVBCI_UI::ciStateChanged; %immutable eDVBResourceManager::frontendUseMaskChanged; @@ -252,6 +253,12 @@ public: PyObject *get(); }; +%template(PSignal2VoidIRecordableServiceInt) PSignal2&,int>; + +%typemap(out) PSignal2VoidIRecordableServiceInt { + $1 = $input->get(); +} + /************** temp *****************/ /* need a better place for this, i agree. */ @@ -290,4 +297,9 @@ PyObject *New_eServiceReference(const eServiceReference &ref) eServiceReference *result = new eServiceReference(ref); return SWIG_NewPointerObj((void*)(result), SWIGTYPE_p_eServiceReference, 1); } +PyObject *New_iRecordableServicePtr(const ePtr &ptr) +{ + ePtr *result = new ePtr(ptr); + return SWIG_NewPointerObj((void*)(result), SWIGTYPE_p_ePtrTiRecordableService_t, 1); +} %} diff --git a/lib/service/iservice.h b/lib/service/iservice.h index 73a0f4ef..1dd419c1 100644 --- a/lib/service/iservice.h +++ b/lib/service/iservice.h @@ -512,7 +512,9 @@ public: evUpdatedRadioText }; +#ifndef SWIG virtual RESULT connectEvent(const Slot2 &event, ePtr &connection)=0; +#endif virtual RESULT start()=0; virtual RESULT stop()=0; /* might have to be changed... */ @@ -547,6 +549,7 @@ public: evTunedIn, evTuneFailed, evRecordRunning, + evRecordStopped, evNewProgramInfo, evRecordFailed // evDiskFull @@ -560,8 +563,10 @@ public: errDiskFull=-4, errTuneFailed=-255 }; - virtual RESULT getError(int &)=0; +#ifndef SWIG virtual RESULT connectEvent(const Slot2 &event, ePtr &connection)=0; +#endif + virtual RESULT getError(int &)=0; virtual RESULT prepare(const char *filename, time_t begTime=-1, time_t endTime=-1, int eit_event_id=-1)=0; virtual RESULT start()=0; virtual RESULT stop()=0; @@ -570,6 +575,8 @@ public: TEMPLATE_TYPEDEF(ePtr, iRecordableServicePtr); +PyObject *PyFrom(ePtr&); // implemented in servicedvbrecord.cpp + // TEMPLATE_TYPEDEF(std::list, eServiceReferenceList); class iMutableServiceList: public iObject diff --git a/lib/service/servicedvbrecord.cpp b/lib/service/servicedvbrecord.cpp index fb3ae2ba..6164ca17 100644 --- a/lib/service/servicedvbrecord.cpp +++ b/lib/service/servicedvbrecord.cpp @@ -1,11 +1,17 @@ #include #include #include - #include DEFINE_REF(eDVBServiceRecord); +extern PyObject *New_iRecordableServicePtr(const ePtr &ref); // defined in enigma_python.i + +PyObject *PyFrom(ePtr &c) +{ + return New_iRecordableServicePtr(c); +} + eDVBServiceRecord::eDVBServiceRecord(const eServiceReferenceDVB &ref): m_ref(ref) { CONNECT(m_service_handler.serviceEvent, eDVBServiceRecord::serviceEvent); @@ -115,6 +121,7 @@ RESULT eDVBServiceRecord::start() RESULT eDVBServiceRecord::stop() { eDebug("stop recording!!"); + m_event((iRecordableService*)this, evStop); if (m_state == stateRecording) { if (m_record) @@ -132,7 +139,7 @@ RESULT eDVBServiceRecord::stop() m_record = 0; m_state = stateIdle; } - m_event((iRecordableService*)this, evStop); + m_event((iRecordableService*)this, evRecordStopped); return 0; } -- 2.30.2