+ m_state = statePrepared;
+ } else
+ eDebug("(was not recording)");
+ if (m_state == statePrepared)
+ {
+ m_record = 0;
+ m_state = stateIdle;
+ }
+ m_event((iRecordableService*)this, evRecordStopped);
+ return 0;
+}
+
+
+int eDVBServiceRecord::doPrepare()
+{
+ /* allocate a ts recorder if we don't already have one. */
+ if (m_state == stateIdle)
+ {
+ m_pids_active.clear();
+ m_state = statePrepared;
+ return m_service_handler.tune(m_ref, 0);
+ }
+ return 0;
+}
+
+int eDVBServiceRecord::doRecord()
+{
+ int err = doPrepare();
+ if (err)
+ {
+ m_error = errTuneFailed;
+ m_event((iRecordableService*)this, evRecordFailed);
+ return err;
+ }
+
+ if (!m_tuned)
+ return 0; /* try it again when we are tuned in */
+
+ if (!m_record && m_tuned && !m_streaming)
+ {
+ eDebug("Recording to %s...", m_filename.c_str());
+ ::remove(m_filename.c_str());
+ int fd = ::open(m_filename.c_str(), O_WRONLY|O_CREAT|O_LARGEFILE, 0644);
+ if (fd == -1)
+ {
+ eDebug("eDVBServiceRecord - can't open recording file!");
+ m_error = errOpenRecordFile;
+ m_event((iRecordableService*)this, evRecordFailed);
+ return errOpenRecordFile;
+ }
+
+ /* turn off kernel caching strategies */
+ posix_fadvise(fd, 0, 0, POSIX_FADV_RANDOM);
+
+ ePtr<iDVBDemux> demux;
+ if (m_service_handler.getDataDemux(demux))
+ {
+ eDebug("eDVBServiceRecord - NO DEMUX available!");
+ m_error = errNoDemuxAvailable;
+ m_event((iRecordableService*)this, evRecordFailed);
+ return errNoDemuxAvailable;
+ }
+ demux->createTSRecorder(m_record);
+ if (!m_record)
+ {
+ eDebug("eDVBServiceRecord - no ts recorder available.");
+ m_error = errNoTsRecorderAvailable;
+ m_event((iRecordableService*)this, evRecordFailed);
+ return errNoTsRecorderAvailable;
+ }
+ 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;
+ }
+
+ if (m_streaming)
+ {
+ m_state = stateRecording;
+ eDebug("start streaming...");
+ } else
+ {
+ eDebug("start recording...");