diff options
| author | Felix Domke <tmbinc@elitedvb.net> | 2005-12-17 02:56:52 +0000 |
|---|---|---|
| committer | Felix Domke <tmbinc@elitedvb.net> | 2005-12-17 02:56:52 +0000 |
| commit | 2601ee77efe1f10be7cbeb8af94e2fb229cc1ec1 (patch) | |
| tree | dee02f1a965266cfc29d96ae664f71ecc889e879 /lib/service | |
| parent | 654f9ddcbd850acbd23cb0b568632268cfd26f22 (diff) | |
| download | enigma2-2601ee77efe1f10be7cbeb8af94e2fb229cc1ec1.tar.gz enigma2-2601ee77efe1f10be7cbeb8af94e2fb229cc1ec1.zip | |
timer: add name/description, factor out "parse from epg event", fix some cases where demux was not available at that time, add timeshift framework, fix movielist (not all movies are great!)
Diffstat (limited to 'lib/service')
| -rw-r--r-- | lib/service/iservice.h | 16 | ||||
| -rw-r--r-- | lib/service/service.cpp | 10 | ||||
| -rw-r--r-- | lib/service/servicedvb.cpp | 67 | ||||
| -rw-r--r-- | lib/service/servicedvb.h | 9 | ||||
| -rw-r--r-- | lib/service/servicedvbrecord.cpp | 60 | ||||
| -rw-r--r-- | lib/service/servicemp3.h | 3 |
6 files changed, 131 insertions, 34 deletions
diff --git a/lib/service/iservice.h b/lib/service/iservice.h index 962e4a95..285063ec 100644 --- a/lib/service/iservice.h +++ b/lib/service/iservice.h @@ -180,6 +180,9 @@ public: virtual SWIG_VOID(RESULT) getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &SWIG_OUTPUT, time_t start_time=0); // returns true when not implemented virtual bool isPlayable(const eServiceReference &ref, const eServiceReference &ignore); + + virtual int getInfo(const eServiceReference &ref, int w); + virtual std::string getInfoString(const eServiceReference &ref,int w); }; TEMPLATE_TYPEDEF(ePtr<iStaticServiceInformation>, iStaticServiceInformationPtr); @@ -216,6 +219,9 @@ public: sTSID, sNamespace, sProvider, + + sDescription, + sTimeCreate, // unix time or string }; enum { resNA = -1, resIsString = -2 }; @@ -293,6 +299,15 @@ public: TEMPLATE_TYPEDEF(ePtr<iSubserviceList>, iSubserviceListPtr); +class iTimeshiftService: public iObject +{ +public: + virtual RESULT startTimeshift()=0; + virtual RESULT stopTimeshift()=0; +}; + +TEMPLATE_TYPEDEF(ePtr<iTimeshiftService>, iTimeshiftServicePtr); + class iPlayableService: public iObject { friend class iServiceHandler; @@ -316,6 +331,7 @@ public: virtual SWIG_VOID(RESULT) audioTracks(ePtr<iAudioTrackSelection> &SWIG_OUTPUT)=0; virtual SWIG_VOID(RESULT) subServices(ePtr<iSubserviceList> &SWIG_OUTPUT)=0; virtual SWIG_VOID(RESULT) frontendStatusInfo(ePtr<iFrontendStatusInformation> &SWIG_OUTPUT)=0; + virtual SWIG_VOID(RESULT) timeshift(ePtr<iTimeshiftService> &SWIG_OUTPUT)=0; }; TEMPLATE_TYPEDEF(ePtr<iPlayableService>, iPlayableServicePtr); diff --git a/lib/service/service.cpp b/lib/service/service.cpp index cc8a9315..150a0cd3 100644 --- a/lib/service/service.cpp +++ b/lib/service/service.cpp @@ -155,6 +155,16 @@ RESULT iServiceInformation::getEvent(ePtr<eServiceEvent> &evt, int m_nownext) return -1; } +int iStaticServiceInformation::getInfo(const eServiceReference &ref, int w) +{ + return -1; +} + +std::string iStaticServiceInformation::getInfoString(const eServiceReference &ref, int w) +{ + return ""; +} + int iServiceInformation::getInfo(int w) { return -1; diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index a9d235ec..790bfca6 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -127,6 +127,9 @@ public: eStaticServiceDVBPVRInformation(const eServiceReference &ref); RESULT getName(const eServiceReference &ref, std::string &name); int getLength(const eServiceReference &ref); + + int getInfo(const eServiceReference &ref, int w); + std::string getInfoString(const eServiceReference &ref,int w); }; DEFINE_REF(eStaticServiceDVBPVRInformation); @@ -160,7 +163,32 @@ int eStaticServiceDVBPVRInformation::getLength(const eServiceReference &ref) return len / 90000; } +int eStaticServiceDVBPVRInformation::getInfo(const eServiceReference &ref, int w) +{ + switch (w) + { + case iServiceInformation::sDescription: + return iServiceInformation::resIsString; + case iServiceInformation::sTimeCreate: + if (m_parser.m_time_create) + return m_parser.m_time_create; + else + return iServiceInformation::resNA; + default: + return iServiceInformation::resNA; + } +} +std::string eStaticServiceDVBPVRInformation::getInfoString(const eServiceReference &ref,int w) +{ + switch (w) + { + case iServiceInformation::sDescription: + return m_parser.m_description; + default: + return ""; + } +} class eDVBPVRServiceOfflineOperations: public iServiceOfflineOperations { @@ -459,6 +487,7 @@ eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *serv m_reference(ref), m_dvb_service(service), m_service_handler(0), m_is_paused(0) { m_is_pvr = !ref.path.empty(); + m_timeshift_enabled = 0; CONNECT(m_service_handler.serviceEvent, eDVBServicePlay::serviceEvent); CONNECT(m_event_handler.m_eit_changed, eDVBServicePlay::gotNewEvent); @@ -619,14 +648,14 @@ RESULT eDVBServicePlay::connectEvent(const Slot2<void,iPlayableService*,int> &ev RESULT eDVBServicePlay::pause(ePtr<iPauseableService> &ptr) { - if (m_is_pvr) + if (!m_is_pvr) { - ptr = this; - return 0; + ptr = 0; + return -1; } - ptr = 0; - return -1; + ptr = this; + return 0; } RESULT eDVBServicePlay::setSlowMotion(int ratio) @@ -753,6 +782,17 @@ RESULT eDVBServicePlay::subServices(ePtr<iSubserviceList> &ptr) return 0; } +RESULT eDVBServicePlay::timeshift(ePtr<iTimeshiftService> &ptr) +{ + if (m_timeshift_enabled || !m_is_pvr) + { + ptr = this; + return 0; + } + ptr = 0; + return -1; +} + RESULT eDVBServicePlay::getName(std::string &name) { if (m_dvb_service) @@ -939,6 +979,23 @@ RESULT eDVBServicePlay::getSubservice(eServiceReference &sub, unsigned int n) return -1; } +RESULT eDVBServicePlay::startTimeshift() +{ + if (m_timeshift_enabled) + return -1; + eDebug("TIMESHIFT - start!"); + return 0; +} + +RESULT eDVBServicePlay::stopTimeshift() +{ + if (!m_timeshift_enabled) + return -1; + m_timeshift_enabled = 0; + eDebug("timeshift disabled"); + return 0; +} + DEFINE_REF(eDVBServicePlay) eAutoInitPtr<eServiceFactoryDVB> init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB"); diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h index 6b93469d..e99faffd 100644 --- a/lib/service/servicedvb.h +++ b/lib/service/servicedvb.h @@ -55,7 +55,7 @@ private: class eDVBServicePlay: public iPlayableService, public iPauseableService, public iSeekableService, public Object, public iServiceInformation, public iAudioTrackSelection, public iFrontendStatusInformation, - public iSubserviceList + public iSubserviceList, public iTimeshiftService { DECLARE_REF(eDVBServicePlay); public: @@ -71,6 +71,7 @@ public: RESULT audioTracks(ePtr<iAudioTrackSelection> &ptr); RESULT frontendStatusInfo(ePtr<iFrontendStatusInformation> &ptr); RESULT subServices(ePtr<iSubserviceList> &ptr); + RESULT timeshift(ePtr<iTimeshiftService> &ptr); // iPauseableService RESULT pause(); @@ -102,6 +103,10 @@ public: int getNumberOfSubservices(); RESULT getSubservice(eServiceReference &subservice, unsigned int n); + // iTimeshiftService + RESULT startTimeshift(); + RESULT stopTimeshift(); + private: friend class eServiceFactoryDVB; eServiceReference m_reference; @@ -120,7 +125,7 @@ private: void serviceEvent(int event); Signal2<void,iPlayableService*,int> m_event; - int m_is_pvr, m_is_paused; + int m_is_pvr, m_is_paused, m_timeshift_enabled; int m_current_audio_stream; int selectAudioStream(int n); diff --git a/lib/service/servicedvbrecord.cpp b/lib/service/servicedvbrecord.cpp index 2f1dea0e..f05a35a3 100644 --- a/lib/service/servicedvbrecord.cpp +++ b/lib/service/servicedvbrecord.cpp @@ -20,6 +20,33 @@ void eDVBServiceRecord::serviceEvent(int event) case eDVBServicePMTHandler::eventTuned: { eDebug("tuned.."); + if (!m_record) + { + eDebug("Recording to %s...", m_filename.c_str()); + ::remove(m_filename.c_str()); + int fd = ::open(m_filename.c_str(), O_WRONLY|O_CREAT, 0644); + if (fd == -1) + { + eDebug("eDVBServiceRecord - can't open hardcoded recording file!"); + return; +// return -1; + } + ePtr<iDVBDemux> demux; + if (m_service_handler.getDemux(demux)) + { + eDebug("eDVBServiceRecord - NO DEMUX available!"); + return; +// return -2; + } + demux->createTSRecorder(m_record); + if (!m_record) + { + eDebug("eDVBServiceRecord - no ts recorder available."); + return; +// return -3; + } + m_record->setTargetFD(fd); + } break; } case eDVBServicePMTHandler::eventNewProgramInfo: @@ -38,7 +65,7 @@ RESULT eDVBServiceRecord::prepare(const char *filename) { m_filename = filename; if (m_state == stateIdle) - return m_service_handler.tune(m_ref); + doPrepare(); else return -1; } @@ -74,33 +101,9 @@ int eDVBServiceRecord::doPrepare() /* allocate a ts recorder if we don't already have one. */ if (m_state == stateIdle) { - eDebug("Recording to %s...", m_filename.c_str()); - ::remove(m_filename.c_str()); - int fd = ::open(m_filename.c_str(), O_WRONLY|O_CREAT, 0644); - if (fd == -1) - { - eDebug("eDVBServiceRecord - can't open hardcoded recording file!"); - return -1; - } - ePtr<iDVBDemux> demux; - if (m_service_handler.getDemux(demux)) - { - eDebug("eDVBServiceRecord - NO DEMUX available!"); - return -2; - } - demux->createTSRecorder(m_record); - if (!m_record) - { - eDebug("eDVBServiceRecord - no ts recorder available."); - return -3; - } - m_record->setTargetFD(fd); m_pids_active.clear(); m_state = statePrepared; - } else if ((m_state == statePrepared) || (m_state == stateRecording)) - { - /* when we're already recording, we already have a recorder allocated. */ - assert(m_record); + m_service_handler.tune(m_ref); } return 0; } @@ -111,6 +114,11 @@ int eDVBServiceRecord::doRecord() if (err) return err; + if (!m_record) + { + eDebug("demux not available (tune failed?). cannot record."); + return -1; + } eDebug("starting recording.."); eDVBServicePMTHandler::program program; diff --git a/lib/service/servicemp3.h b/lib/service/servicemp3.h index ac174c41..c08278b8 100644 --- a/lib/service/servicemp3.h +++ b/lib/service/servicemp3.h @@ -64,7 +64,8 @@ public: RESULT audioTracks(ePtr<iAudioTrackSelection> &ptr) { ptr = 0; return -1; } RESULT frontendStatusInfo(ePtr<iFrontendStatusInformation> &ptr) { ptr = 0; return -1; } RESULT subServices(ePtr<iSubserviceList> &ptr) { ptr = 0; return -1; } - + RESULT timeshift(ePtr<iTimeshiftService> &ptr) { ptr = 0; return -1; } + // iPausableService RESULT pause(); RESULT unpause(); |
