00001
00008
00009 #include "hdhrstreamhandler.h"
00010 #include "atscstreamdata.h"
00011 #include "hdhrrecorder.h"
00012 #include "hdhrchannel.h"
00013 #include "tv_rec.h"
00014 #include "mythlogging.h"
00015
00016 #define LOC QString("HDHRRec(%1): ").arg(tvrec->GetCaptureCardNum())
00017
00018 HDHRRecorder::HDHRRecorder(TVRec *rec, HDHRChannel *channel)
00019 : DTVRecorder(rec), _channel(channel), _stream_handler(NULL)
00020 {
00021 }
00022
00023 bool HDHRRecorder::Open(void)
00024 {
00025 if (IsOpen())
00026 {
00027 LOG(VB_GENERAL, LOG_WARNING, LOC + "Card already open");
00028 return true;
00029 }
00030
00031 ResetForNewFile();
00032
00033 _stream_handler = HDHRStreamHandler::Get(_channel->GetDevice());
00034
00035 LOG(VB_RECORD, LOG_INFO, LOC + "HDHR opened successfully");
00036
00037 return true;
00038 }
00039
00040 void HDHRRecorder::Close(void)
00041 {
00042 LOG(VB_RECORD, LOG_INFO, LOC + "Close() -- begin");
00043
00044 if (IsOpen())
00045 HDHRStreamHandler::Return(_stream_handler);
00046
00047 LOG(VB_RECORD, LOG_INFO, LOC + "Close() -- end");
00048 }
00049
00050 void HDHRRecorder::run(void)
00051 {
00052 LOG(VB_RECORD, LOG_INFO, LOC + "run -- begin");
00053
00054
00055 if (!Open())
00056 {
00057 _error = "Failed to open HDHRRecorder device";
00058 LOG(VB_GENERAL, LOG_ERR, LOC + _error);
00059 return;
00060 }
00061
00062 {
00063 QMutexLocker locker(&pauseLock);
00064 request_recording = true;
00065 recording = true;
00066 recordingWait.wakeAll();
00067 }
00068
00069
00070 bool tmp = _wait_for_keyframe_option;
00071 _wait_for_keyframe_option = false;
00072 HandleSingleProgramPAT(_stream_data->PATSingleProgram());
00073 HandleSingleProgramPMT(_stream_data->PMTSingleProgram());
00074 _wait_for_keyframe_option = tmp;
00075
00076 _stream_data->AddAVListener(this);
00077 _stream_data->AddWritingListener(this);
00078 _stream_handler->AddListener(_stream_data);
00079
00080 while (IsRecordingRequested() && !IsErrored())
00081 {
00082 if (PauseAndWait())
00083 continue;
00084
00085 if (!IsRecordingRequested())
00086 break;
00087
00088 {
00089
00090 QMutexLocker locker(&pauseLock);
00091 if (!request_recording || request_pause)
00092 continue;
00093 unpauseWait.wait(&pauseLock, 100);
00094 }
00095
00096 if (!_input_pmt)
00097 {
00098 LOG(VB_GENERAL, LOG_WARNING, LOC +
00099 "Recording will not commence until a PMT is set.");
00100 usleep(5000);
00101 continue;
00102 }
00103
00104 if (!_stream_handler->IsRunning())
00105 {
00106 _error = "Stream handler died unexpectedly.";
00107 LOG(VB_GENERAL, LOG_ERR, LOC + _error);
00108 }
00109 }
00110
00111 LOG(VB_RECORD, LOG_INFO, LOC + "run -- ending...");
00112
00113 _stream_handler->RemoveListener(_stream_data);
00114 _stream_data->RemoveWritingListener(this);
00115 _stream_data->RemoveAVListener(this);
00116
00117 Close();
00118
00119 FinishRecording();
00120
00121 QMutexLocker locker(&pauseLock);
00122 recording = false;
00123 recordingWait.wakeAll();
00124
00125 LOG(VB_RECORD, LOG_INFO, LOC + "run -- end");
00126 }
00127
00128 bool HDHRRecorder::PauseAndWait(int timeout)
00129 {
00130 QMutexLocker locker(&pauseLock);
00131 if (request_pause)
00132 {
00133 if (!IsPaused(true))
00134 {
00135 _stream_handler->RemoveListener(_stream_data);
00136
00137 paused = true;
00138 pauseWait.wakeAll();
00139 if (tvrec)
00140 tvrec->RecorderPaused();
00141 }
00142
00143 unpauseWait.wait(&pauseLock, timeout);
00144 }
00145
00146 if (!request_pause && IsPaused(true))
00147 {
00148 paused = false;
00149 _stream_handler->AddListener(_stream_data);
00150 unpauseWait.wakeAll();
00151 }
00152
00153 return IsPaused(true);
00154 }
00155
00156 QString HDHRRecorder::GetSIStandard(void) const
00157 {
00158 return _channel->GetSIStandard();
00159 }
00160
00161