DEFINE_REF(eDVBServiceRecord);
-eDVBServiceRecord::eDVBServiceRecord(const eServiceReferenceDVB &ref): m_ref(ref), m_service_handler(1)
+eDVBServiceRecord::eDVBServiceRecord(const eServiceReferenceDVB &ref): m_ref(ref)
{
CONNECT(m_service_handler.serviceEvent, eDVBServiceRecord::serviceEvent);
m_state = stateIdle;
m_want_record = 0;
+ m_tuned = 0;
}
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);
- }
+ m_tuned = 1;
+ if (m_state == stateRecording && m_want_record)
+ doRecord();
break;
}
case eDVBServicePMTHandler::eventNewProgramInfo:
}
}
-
RESULT eDVBServiceRecord::prepare(const char *filename)
{
m_filename = filename;
if (m_state == stateIdle)
- {
- doPrepare();
- return 0;
- }
+ return doPrepare();
else
return -1;
}
eDebug("stop recording!!");
if (m_state == stateRecording)
{
- m_record->stop();
+ if (m_record)
+ m_record->stop();
m_state = statePrepared;
}
{
m_pids_active.clear();
m_state = statePrepared;
- m_service_handler.tune(m_ref);
+ return m_service_handler.tune(m_ref, 0);
}
return 0;
}
if (err)
return err;
- if (!m_record)
+ if (!m_tuned)
+ return 0; /* try it again when we are tuned in */
+
+ if (!m_record && m_tuned)
{
- eDebug("demux not available (tune failed?). cannot record.");
- return -1;
+
+ 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 hardcoded recording file!");
+ return -1;
+ }
+ ePtr<iDVBDemux> demux;
+ if (m_service_handler.getDataDemux(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);
}
eDebug("starting recording..");
}
eDebugNoNewLine(")");
}
- eDebug(", and the pcr pid is %04x", program.pcrPid);
+ eDebugNoNewLine(", and the pcr pid is %04x", program.pcrPid);
if (program.pcrPid != 0x1fff)
pids_to_record.insert(program.pcrPid);
-
+ eDebug(", and the text pid is %04x", program.textPid);
+ if (program.textPid != -1)
+ pids_to_record.insert(program.textPid); // Videotext
+
/* find out which pids are NEW and which pids are obsolete.. */
std::set<int> new_pids, obsolete_pids;
m_record->removePID(*i);
}
+ m_pids_active = pids_to_record;
+
if (m_state != stateRecording)
{
m_record->start();