From 2601ee77efe1f10be7cbeb8af94e2fb229cc1ec1 Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Sat, 17 Dec 2005 02:56:52 +0000 Subject: [PATCH] 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!) --- Navigation.py | 4 +- RecordTimer.py | 73 ++++++++++++++------------- lib/dvb/metaparser.cpp | 3 ++ lib/dvb/metaparser.h | 1 + lib/python/Components/MovieList.py | 16 ++++-- lib/python/Components/TimerList.py | 5 +- lib/python/Screens/EpgSelection.py | 21 +++----- lib/python/Screens/EventView.py | 21 +------- lib/python/Screens/InfoBarGenerics.py | 16 ++++-- lib/python/Screens/TimerEdit.py | 38 +++++--------- lib/python/Screens/TimerEntry.py | 3 ++ lib/service/iservice.h | 16 ++++++ lib/service/service.cpp | 10 ++++ lib/service/servicedvb.cpp | 67 ++++++++++++++++++++++-- lib/service/servicedvb.h | 9 +++- lib/service/servicedvbrecord.cpp | 60 ++++++++++++---------- lib/service/servicemp3.h | 3 +- 17 files changed, 226 insertions(+), 140 deletions(-) diff --git a/Navigation.py b/Navigation.py index 09daff34..751aca89 100644 --- a/Navigation.py +++ b/Navigation.py @@ -77,10 +77,10 @@ class Navigation: def pause(self, p): return self.pnav.pause(p) - def recordWithTimer(self, begin, end, ref, epg, description): + def recordWithTimer(self, ref, begin, end, name, description, eit): if isinstance(ref, eServiceReference): ref = ServiceReference.ServiceReference(ref) - entry = RecordTimer.RecordTimerEntry(begin, end, ref, epg, description) + entry = RecordTimer.RecordTimerEntry(ref, begin, end, name, description, eit) self.RecordTimer.record(entry) return entry diff --git a/RecordTimer.py b/RecordTimer.py index 85e9d172..f1b33592 100644 --- a/RecordTimer.py +++ b/RecordTimer.py @@ -12,21 +12,34 @@ import NavigationInstance from Tools.XMLTools import elementsWithTag from ServiceReference import ServiceReference +# ok, for descriptions etc we have: +# service reference (to get the service name) +# name (title) +# description (description) +# event data (ONLY for time adjustments etc.) + + +# parses an event, and gives out a (begin, end, name, duration, eit)-tuple. +def parseEvent(ev): + name = ev.getEventName() + description = ev.getShortDescription() + begin = ev.getBeginTime() + end = begin + ev.getDuration() + eit = None + return (begin, end, name, description, eit) + class RecordTimerEntry(timer.TimerEntry): - def __init__(self, begin, end, serviceref, epg, description): + def __init__(self, serviceref, begin, end, name, description, eit): timer.TimerEntry.__init__(self, int(begin), int(end)) assert isinstance(serviceref, ServiceReference) self.service_ref = serviceref - if epg is not None: - self.epg_data = "" - #str(epg.m_event_name) - else: - self.epg_data = "" + self.eit = eit self.dontSave = False + self.name = name self.description = description self.timer = None self.record_service = None @@ -37,26 +50,15 @@ class RecordTimerEntry(timer.TimerEntry): service_name = self.service_ref.getServiceName() # begin_date = datetime.fromtimestamp(begin).strf... begin_date = "" - if self.epg_data is not None: - description = " - " + self.epg_data - else: - description = "" - print "begin_date: " + str(begin_date) - print "service_name: " + str(service_name) - print "description: " + str(description) + print "begin_date: ", begin_date + print "service_name: ", service_name + print "name:", self.name + print "description: ", self.description + self.Filename = Directories.getRecordingFilename(service_name) #begin_date + " - " + service_name + description) - # build filename from epg - - # pff das geht noch nicht... -# if epg == None: -# self.Filename = "recording.ts" -# else: -# self.Filename = "record_" + str(epg.m_event_name) + ".ts" -# -# print "------------ record filename: %s" % (self.Filename) def tryPrepare(self): self.calculateFilename() @@ -70,7 +72,9 @@ class RecordTimerEntry(timer.TimerEntry): f = open(self.Filename + ".ts.meta", "w") f.write(str(self.service_ref) + "\n") - f.write(self.epg_data + "\n") + f.write(self.name + "\n") + f.write(self.description + "\n") + f.write(str(self.begin) + "\n") del f return True @@ -116,11 +120,12 @@ def createTimer(xml): begin = int(xml.getAttribute("begin")) end = int(xml.getAttribute("end")) serviceref = ServiceReference(str(xml.getAttribute("serviceref"))) - description = xml.getAttribute("description") - repeated = xml.getAttribute("repeated") - epgdata = xml.getAttribute("epgdata") - #filename = xml.getAttribute("filename") - entry = RecordTimerEntry(begin, end, serviceref, epgdata, description) + description = xml.getAttribute("description").encode("utf-8") + repeated = xml.getAttribute("repeated").encode("utf-8") + eit = xml.getAttribute("eit").encode("utf-8") + name = xml.getAttribute("name").encode("utf-8") + #filename = xml.getAttribute("filename").encode("utf-8") + entry = RecordTimerEntry(serviceref, begin, end, name, description, eit) entry.repeated = int(repeated) return entry @@ -132,7 +137,7 @@ class RecordTimer(timer.Timer): try: self.loadTimer() - except: + except IOError: print "unable to load timers from file!" def isRecording(self): @@ -168,14 +173,16 @@ class RecordTimer(timer.Timer): t.setAttribute("end", str(timer.end)) t.setAttribute("serviceref", str(timer.service_ref)) t.setAttribute("repeated", str(timer.repeated)) - #t.setAttribute("epgdata", timer.) - t.setAttribute("description", "no description") # timer.description) + t.setAttribute("name", timer.name) + t.setAttribute("description", timer.description) + t.setAttribute("eit", str(timer.eit)) + root_element.appendChild(t) t = doc.createTextNode("\n") root_element.appendChild(t) file = open(self.Filename, "w") - doc.writexml(codecs.getwriter('UTF-8')(file)) + doc.writexml(file) file.write("\n") file.close() @@ -189,8 +196,6 @@ class RecordTimer(timer.Timer): entry.repeated = False - entry.repeated = False - if entry.state == timer.TimerEntry.StateRunning: print "remove running timer." entry.end = time.time() diff --git a/lib/dvb/metaparser.cpp b/lib/dvb/metaparser.cpp index 90b02c06..5c098150 100644 --- a/lib/dvb/metaparser.cpp +++ b/lib/dvb/metaparser.cpp @@ -34,6 +34,9 @@ int eDVBMetaParser::parseFile(const std::string &tsname) case 2: m_description = line; break; + case 3: + m_time_create = atoi(line); + break; default: break; } diff --git a/lib/dvb/metaparser.h b/lib/dvb/metaparser.h index 7e2b6779..60329ace 100644 --- a/lib/dvb/metaparser.h +++ b/lib/dvb/metaparser.h @@ -11,6 +11,7 @@ public: eServiceReferenceDVB m_ref; std::string m_name, m_description; + int m_time_create; }; #endif diff --git a/lib/python/Components/MovieList.py b/lib/python/Components/MovieList.py index 9ab58704..2e010ab6 100644 --- a/lib/python/Components/MovieList.py +++ b/lib/python/Components/MovieList.py @@ -1,7 +1,8 @@ from HTMLComponent import * from GUIComponent import * +from Tools.FuzzyDate import FuzzyTime -from enigma import eListboxPythonMultiContent, eListbox, gFont +from enigma import eListboxPythonMultiContent, eListbox, gFont, iServiceInformation from enigma import eServiceReference, eServiceCenter, \ eServiceCenterPtr, iListableServicePtr, \ @@ -38,8 +39,17 @@ def MovieListEntry(serviceref, serviceHandler): len = "?:??" res.append((0, 0, 400, 30, 0, RT_HALIGN_LEFT, info.getName(serviceref))) - res.append((0, 30, 200, 20, 1, RT_HALIGN_LEFT, "Toller Film")) - res.append((0, 50, 200, 20, 1, RT_HALIGN_LEFT, "Aufgenommen: irgendwann")) + + description = info.getInfoString(serviceref, iServiceInformation.sDescription) + begin = info.getInfo(serviceref, iServiceInformation.sTimeCreate) + + begin_string = "" + if begin > 0: + t = FuzzyTime(begin) + begin_string = t[0] + ", " + t[1] + + res.append((0, 30, 200, 20, 1, RT_HALIGN_LEFT, description)) + res.append((0, 50, 200, 20, 1, RT_HALIGN_LEFT, begin_string)) res.append((200, 50, 200, 20, 1, RT_HALIGN_RIGHT, len)) return res diff --git a/lib/python/Components/TimerList.py b/lib/python/Components/TimerList.py index b1e8bf45..f4176fad 100644 --- a/lib/python/Components/TimerList.py +++ b/lib/python/Components/TimerList.py @@ -26,9 +26,6 @@ RT_WRAP = 32 def TimerEntryComponent(timer, processed): res = [ timer ] - print time.strftime("%c", time.localtime(timer.begin)) - print time.strftime("%c", time.localtime(timer.end)) - res.append((0, 0, 400, 30, 0, RT_HALIGN_LEFT, timer.service_ref.getServiceName())) repeatedtext = "" days = [ "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" ] @@ -46,7 +43,7 @@ def TimerEntryComponent(timer, processed): else: res.append((0, 30, 200, 20, 1, RT_HALIGN_LEFT, repeatedtext + ("%s, %s ... %s" % (FuzzyTime(timer.begin) + FuzzyTime(timer.end)[1:])))) - res.append((300, 0, 200, 20, 1, RT_HALIGN_RIGHT, timer.description)) + res.append((300, 0, 200, 20, 1, RT_HALIGN_RIGHT, timer.name)) if not processed: if timer.state == TimerEntry.StateWait: diff --git a/lib/python/Screens/EpgSelection.py b/lib/python/Screens/EpgSelection.py index db8be2e1..4d288b00 100644 --- a/lib/python/Screens/EpgSelection.py +++ b/lib/python/Screens/EpgSelection.py @@ -5,7 +5,7 @@ from Components.ActionMap import ActionMap from Screens.EventView import EventView from enigma import eServiceReference, eServiceEventPtr from Screens.FixedMenu import FixedMenu -from RecordTimer import RecordTimerEntry +from RecordTimer import RecordTimerEntry, parseEvent from TimerEdit import TimerEditList from TimerEntry import TimerEntry from ServiceReference import ServiceReference @@ -49,24 +49,15 @@ class EPGSelection(Screen): self.session.open(EventView, event, self.currentService, self.eventViewCallback) def timerAdd(self): - epg = self["list"].getCurrent() + event = self["list"].getCurrent() + + if event is None: + return - if (epg == None): - description = "unknown event" - else: - description = epg.getEventName() - # FIXME we need a timestamp here: - begin = epg.getBeginTime() - - print begin - print epg.getDuration() - end = begin + epg.getDuration() - - # FIXME only works if already playing a service serviceref = ServiceReference(self.session.nav.getCurrentlyPlayingServiceReference()) - newEntry = RecordTimerEntry(begin, end, serviceref, epg, description) + newEntry = RecordTimerEntry(serviceref, *parseEvent(event)) self.session.openWithCallback(self.timerEditFinished, TimerEntry, newEntry) def timerEditFinished(self, answer): diff --git a/lib/python/Screens/EventView.py b/lib/python/Screens/EventView.py index 79d548af..e3585b67 100644 --- a/lib/python/Screens/EventView.py +++ b/lib/python/Screens/EventView.py @@ -4,7 +4,7 @@ from Components.Label import Label from Components.ScrollLabel import ScrollLabel from enigma import eServiceEventPtr from ServiceReference import ServiceReference -from RecordTimer import RecordTimerEntry +from RecordTimer import RecordTimerEntry, parseEvent from TimerEntry import TimerEntry class EventView(Screen): @@ -38,24 +38,7 @@ class EventView(Screen): self.cbFunc(self.setEvent, +1) def timerAdd(self): - epg = self.event - - if (epg == None): - description = "unknown event" - else: - description = epg.getEventName() - # FIXME we need a timestamp here: - begin = epg.getBeginTime() - - print begin - print epg.getDuration() - end = begin + epg.getDuration() - - - # FIXME only works if already playing a service - serviceref = ServiceReference(self.session.nav.getCurrentlyPlayingServiceReference()) - - newEntry = RecordTimerEntry(begin, end, serviceref, epg, description) + newEntry = RecordTimerEntry(self.currentService, *parseEvent(self.event)) self.session.openWithCallback(self.timerEditFinished, TimerEntry, newEntry) def timerEditFinished(self, answer): diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py index efcb0dad..77c4a415 100644 --- a/lib/python/Screens/InfoBarGenerics.py +++ b/lib/python/Screens/InfoBarGenerics.py @@ -562,6 +562,8 @@ class InfoBarPVR: } self.setSeekState(lookup[self.seekstate]); +from RecordTimer import parseEvent + class InfoBarInstantRecord: """Instant Record - handles the instantRecord action in order to start/stop instant records""" @@ -582,19 +584,25 @@ class InfoBarInstantRecord: def startInstantRecording(self): serviceref = self.session.nav.getCurrentlyPlayingServiceReference() - + # try to get event info - epg = None + event = None try: service = self.session.nav.getCurrentService() info = service.info() ev = info.getEvent(0) - epg = ev + event = ev except: pass + if event is not None: + data = parseEvent(event) + data = (data[0], data[1] + 3600 * 10, data[2], data[3], data[4]) + else: + data = (time.time(), time.time() + 3600 * 10, "instant record", "", None) + # fix me, description. - self.recording = self.session.nav.recordWithTimer(time.time(), time.time() + 3600 * 10, serviceref, epg, "instant record") + self.recording = self.session.nav.recordWithTimer(serviceref, *data) self.recording.dontSave = True #self["BlinkingPoint"].setConnect(lambda: self.recording.isRunning()) diff --git a/lib/python/Screens/TimerEdit.py b/lib/python/Screens/TimerEdit.py index 5233da9b..73733913 100644 --- a/lib/python/Screens/TimerEdit.py +++ b/lib/python/Screens/TimerEdit.py @@ -6,7 +6,7 @@ from Components.Label import Label from Components.Button import Button from Components.TextInput import TextInput from TimerEntry import TimerEntry -from RecordTimer import RecordTimerEntry +from RecordTimer import RecordTimerEntry, parseEvent from time import * from ServiceReference import ServiceReference from Components.config import * @@ -54,34 +54,22 @@ class TimerEditList(Screen): self["timerlist"].invalidate() def addCurrentTimer(self): - begin = time() - end = time() + 60 - - epg = None - try: - service = self.session.nav.getCurrentService() + event = None + service = self.session.nav.getCurrentService() + if service is not None: info = service.info() - ev = info.getEvent(0) - epg = ev - except: - pass - - if (epg == None): - description = "unknown event" - else: - description = ev.getEventName() - # FIXME we need a timestamp here: - begin = ev.getBeginTime() - - print begin - print ev.getDuration() - end = begin + ev.getDuration() - + if info is not None: + event = info.getEvent(0) # FIXME only works if already playing a service serviceref = ServiceReference(self.session.nav.getCurrentlyPlayingServiceReference()) - self.addTimer(RecordTimerEntry(begin, end, serviceref, epg, description)) + if event is None: + data = (int(time()), int(time() + 60), "unknown event", "", None) + else: + data = parseEvent(event) + + self.addTimer(RecordTimerEntry(serviceref, *data)) def addTimer(self, timer): self.session.openWithCallback(self.finishedAdd, TimerEntry, timer) @@ -103,4 +91,4 @@ class TimerEditList(Screen): def leave(self): self.session.nav.RecordTimer.saveTimer() - self.close() \ No newline at end of file + self.close() diff --git a/lib/python/Screens/TimerEntry.py b/lib/python/Screens/TimerEntry.py index a7cbad9b..966bbab4 100644 --- a/lib/python/Screens/TimerEntry.py +++ b/lib/python/Screens/TimerEntry.py @@ -78,6 +78,7 @@ class TimerEntry(Screen): repeated = 0 config.timerentry.type = configElement_nonSave("config.timerentry.type", configSelection, type, (_("once"), _("repeated"))) + config.timerentry.name = configElement_nonSave("config.timerentry.name", configText, self.timer.name, (configText.extendableSize, self.keyRightCallback)) config.timerentry.description = configElement_nonSave("config.timerentry.description", configText, self.timer.description, (configText.extendableSize, self.keyRightCallback)) config.timerentry.repeated = configElement_nonSave("config.timerentry.repeated", configSelection, repeated, (_("daily"), _("weekly"), _("Mon-Fri"), _("user defined"))) @@ -126,6 +127,7 @@ class TimerEntry(Screen): def createSetup(self): self.list = [] + self.list.append(getConfigListEntry(_("Name"), config.timerentry.name)) self.list.append(getConfigListEntry(_("Description"), config.timerentry.description)) self.timerTypeEntry = getConfigListEntry(_("Timer Type"), config.timerentry.type) self.list.append(self.timerTypeEntry) @@ -227,6 +229,7 @@ class TimerEntry(Screen): return int(mktime(dt.timetuple())) def keyGo(self): + self.timer.name = config.timerentry.name.value self.timer.description = config.timerentry.description.value self.timer.resetRepeated() 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 &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, 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, iSubserviceListPtr); +class iTimeshiftService: public iObject +{ +public: + virtual RESULT startTimeshift()=0; + virtual RESULT stopTimeshift()=0; +}; + +TEMPLATE_TYPEDEF(ePtr, iTimeshiftServicePtr); + class iPlayableService: public iObject { friend class iServiceHandler; @@ -316,6 +331,7 @@ public: virtual SWIG_VOID(RESULT) audioTracks(ePtr &SWIG_OUTPUT)=0; virtual SWIG_VOID(RESULT) subServices(ePtr &SWIG_OUTPUT)=0; virtual SWIG_VOID(RESULT) frontendStatusInfo(ePtr &SWIG_OUTPUT)=0; + virtual SWIG_VOID(RESULT) timeshift(ePtr &SWIG_OUTPUT)=0; }; TEMPLATE_TYPEDEF(ePtr, 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 &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 &ev RESULT eDVBServicePlay::pause(ePtr &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 &ptr) return 0; } +RESULT eDVBServicePlay::timeshift(ePtr &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 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 &ptr); RESULT frontendStatusInfo(ePtr &ptr); RESULT subServices(ePtr &ptr); + RESULT timeshift(ePtr &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 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 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 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 &ptr) { ptr = 0; return -1; } RESULT frontendStatusInfo(ePtr &ptr) { ptr = 0; return -1; } RESULT subServices(ePtr &ptr) { ptr = 0; return -1; } - + RESULT timeshift(ePtr &ptr) { ptr = 0; return -1; } + // iPausableService RESULT pause(); RESULT unpause(); -- 2.30.2