aboutsummaryrefslogtreecommitdiff
path: root/lib/service/servicedvbrecord.cpp
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.net>2006-01-15 12:08:42 +0000
committerFelix Domke <tmbinc@elitedvb.net>2006-01-15 12:08:42 +0000
commit17b07b8ab4f698dfbef69fcf77b8f8d86c440f39 (patch)
tree978e954987fd714456b83765493c3fb86bdf4b39 /lib/service/servicedvbrecord.cpp
parent98efaa152afc767093651fc0a2316d90a19f757a (diff)
downloadenigma2-17b07b8ab4f698dfbef69fcf77b8f8d86c440f39.tar.gz
enigma2-17b07b8ab4f698dfbef69fcf77b8f8d86c440f39.zip
better error/retry handling for recorder
Diffstat (limited to 'lib/service/servicedvbrecord.cpp')
-rw-r--r--lib/service/servicedvbrecord.cpp70
1 files changed, 36 insertions, 34 deletions
diff --git a/lib/service/servicedvbrecord.cpp b/lib/service/servicedvbrecord.cpp
index cfcfe8b4..10ab8ae7 100644
--- a/lib/service/servicedvbrecord.cpp
+++ b/lib/service/servicedvbrecord.cpp
@@ -5,11 +5,12 @@
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)
@@ -20,33 +21,9 @@ 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|O_LARGEFILE, 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:
@@ -60,7 +37,6 @@ void eDVBServiceRecord::serviceEvent(int event)
}
}
-
RESULT eDVBServiceRecord::prepare(const char *filename)
{
m_filename = filename;
@@ -83,7 +59,8 @@ RESULT eDVBServiceRecord::stop()
eDebug("stop recording!!");
if (m_state == stateRecording)
{
- m_record->stop();
+ if (m_record)
+ m_record->stop();
m_state = statePrepared;
}
@@ -103,7 +80,7 @@ int eDVBServiceRecord::doPrepare()
{
m_pids_active.clear();
m_state = statePrepared;
- return m_service_handler.tune(m_ref);
+ return m_service_handler.tune(m_ref, 0);
}
return 0;
}
@@ -114,10 +91,33 @@ int eDVBServiceRecord::doRecord()
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..");
@@ -191,6 +191,8 @@ int eDVBServiceRecord::doRecord()
m_record->removePID(*i);
}
+ m_pids_active = pids_to_record;
+
if (m_state != stateRecording)
{
m_record->start();