X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/5264f2cd003271ba2c426e21d62d13025dba177b..a9f7393e1d00eb89b8282aae0ddc4f6da33d9ca1:/lib/service/servicedvbrecord.cpp diff --git a/lib/service/servicedvbrecord.cpp b/lib/service/servicedvbrecord.cpp index 62f3a126..b63776d4 100644 --- a/lib/service/servicedvbrecord.cpp +++ b/lib/service/servicedvbrecord.cpp @@ -14,6 +14,7 @@ eDVBServiceRecord::eDVBServiceRecord(const eServiceReferenceDVB &ref): m_ref(ref m_target_fd = -1; m_error = 0; m_streaming = 0; + m_simulate = false; } void eDVBServiceRecord::serviceEvent(int event) @@ -45,6 +46,14 @@ void eDVBServiceRecord::serviceEvent(int event) m_event((iRecordableService*)this, evNewProgramInfo); break; } + case eDVBServicePMTHandler::eventMisconfiguration: + m_error = errMisconfiguration; + m_event((iRecordableService*)this, evTuneFailed); + break; + case eDVBServicePMTHandler::eventNoResources: + m_error = errNoResources; + m_event((iRecordableService*)this, evTuneFailed); + break; } } @@ -111,21 +120,22 @@ RESULT eDVBServiceRecord::prepareStreaming() m_streaming = 1; if (m_state == stateIdle) return doPrepare(); + return -1; } -RESULT eDVBServiceRecord::start() +RESULT eDVBServiceRecord::start(bool simulate) { + m_simulate = simulate; m_want_record = 1; /* when tune wasn't yet successfully, doRecord stays in "prepared"-state which is fine. */ m_event((iRecordableService*)this, evStart); return doRecord(); } - RESULT eDVBServiceRecord::stop() { - eDebug("stop recording!!"); - m_event((iRecordableService*)this, evStop); + if (!m_simulate) + eDebug("stop recording!"); if (m_state == stateRecording) { if (m_record) @@ -136,8 +146,8 @@ RESULT eDVBServiceRecord::stop() m_target_fd = -1; } m_state = statePrepared; - } - + } else if (!m_simulate) + eDebug("(was not recording)"); if (m_state == statePrepared) { m_record = 0; @@ -147,7 +157,6 @@ RESULT eDVBServiceRecord::stop() return 0; } - int eDVBServiceRecord::doPrepare() { /* allocate a ts recorder if we don't already have one. */ @@ -155,7 +164,7 @@ int eDVBServiceRecord::doPrepare() { m_pids_active.clear(); m_state = statePrepared; - return m_service_handler.tune(m_ref, 0); + return m_service_handler.tune(m_ref, 0, 0, m_simulate); } return 0; } @@ -173,7 +182,7 @@ int eDVBServiceRecord::doRecord() if (!m_tuned) return 0; /* try it again when we are tuned in */ - if (!m_record && m_tuned && !m_streaming) + if (!m_record && m_tuned && !m_streaming && !m_simulate) { eDebug("Recording to %s...", m_filename.c_str()); ::remove(m_filename.c_str()); @@ -207,6 +216,8 @@ int eDVBServiceRecord::doRecord() } m_record->setTargetFD(fd); m_record->setTargetFilename(m_filename.c_str()); + m_record->connectEvent(slot(*this, &eDVBServiceRecord::recordEvent), m_con_record_event); + m_target_fd = fd; } @@ -346,39 +357,44 @@ RESULT eDVBServiceRecord::connectEvent(const Slot2 return 0; } -static PyObject *createTuple(int pid, const char *type) -{ - PyObject *r = PyTuple_New(2); - PyTuple_SetItem(r, 0, PyInt_FromLong(pid)); - PyTuple_SetItem(r, 1, PyString_FromString(type)); - return r; -} - RESULT eDVBServiceRecord::stream(ePtr &ptr) { ptr = this; return 0; } +extern void PutToDict(ePyObject &dict, const char*key, ePyObject item); // defined in dvb/frontend.cpp + PyObject *eDVBServiceRecord::getStreamingData() { eDVBServicePMTHandler::program program; if (!m_tuned || m_service_handler.getProgramInfo(program)) { - Py_INCREF(Py_None); - return Py_None; + Py_RETURN_NONE; } - PyObject *r = program.createPythonObject(); + ePyObject r = program.createPythonObject(); ePtr demux; if (!m_service_handler.getDataDemux(demux)) { uint8_t demux_id; - demux->getCADemuxID(demux_id); - - PyDict_SetItemString(r, "demux", PyInt_FromLong(demux_id)); + if (!demux->getCADemuxID(demux_id)) + PutToDict(r, "demux", PyInt_FromLong(demux_id)); } return r; } +void eDVBServiceRecord::recordEvent(int event) +{ + switch (event) + { + case iDVBTSRecorder::eventWriteError: + eWarning("[eDVBServiceRecord] record write error"); + stop(); + m_event((iRecordableService*)this, evRecordWriteError); + return; + default: + eDebug("unhandled record event %d", event); + } +}