22#include "mythprotorecorder.h"
23#include "../private/debug.h"
24#include "../private/os/threads/latch.h"
25#include "../private/builtin.h"
33ProtoRecorder::ProtoRecorder(
int num,
const std::string& server,
unsigned port)
37, m_liveRecording(false)
39 ProtoPlayback::Open();
42ProtoRecorder::~ProtoRecorder()
46 ProtoPlayback::Close();
49int ProtoRecorder::GetNum()
const
54bool ProtoRecorder::IsPlaying()
const
64bool ProtoRecorder::IsTunable(
const Channel& channel)
67 CardInputListPtr inputlist = GetFreeInputs();
68 for (CardInputList::const_iterator it = inputlist->begin(); it != inputlist->end(); ++it)
70 const CardInput *input = (*it).get();
71 if (input->sourceId != channel.sourceId)
73 DBG(DBG_DEBUG,
"%s: skip input, source id differs (channel: %" PRIu32
", input: %" PRIu32
")\n",
74 __FUNCTION__, channel.sourceId, input->sourceId);
77 if (input->mplexId && input->mplexId != channel.mplexId)
79 DBG(DBG_DEBUG,
"%s: skip input, multiplex id differs (channel: %" PRIu32
", input: %" PRIu32
")\n",
80 __FUNCTION__, channel.mplexId, input->mplexId);
83 DBG(DBG_DEBUG,
"%s: using recorder, input is tunable: source id: %" PRIu32
", multiplex id: %" PRIu32
", channel: %" PRIu32
", input: %" PRIu32
")\n",
84 __FUNCTION__, channel.sourceId, channel.mplexId, channel.chanId, input->inputId);
90 DBG(DBG_INFO,
"%s: recorder is not tunable\n", __FUNCTION__);
95void ProtoRecorder::DoneRecordingCallback()
97 OS::WriteLock lock(*m_latch);
98 m_liveRecording =
false;
99 DBG(DBG_DEBUG,
"%s: completed\n", __FUNCTION__);
102bool ProtoRecorder::SpawnLiveTV75(
const std::string& chainid,
const std::string& channum)
107 OS::WriteLock lock(*m_latch);
110 std::string cmd(
"QUERY_RECORDER ");
111 int32_to_string((int32_t)m_num, &buf);
112 cmd.append(buf.data);
113 cmd.append(PROTO_STR_SEPARATOR);
114 cmd.append(
"SPAWN_LIVETV");
115 cmd.append(PROTO_STR_SEPARATOR);
117 cmd.append(PROTO_STR_SEPARATOR).append(
"0").append(PROTO_STR_SEPARATOR);
120 DBG(DBG_DEBUG,
"%s: starting ...\n", __FUNCTION__);
122 if (!SendCommand(cmd.c_str()))
126 else if (!
ReadField(field) || !IsMessageOK(field))
131 DBG(DBG_DEBUG,
"%s: %s\n", __FUNCTION__, (m_playing ?
"succeeded" :
"failed"));
135bool ProtoRecorder::StopLiveTV75()
140 OS::WriteLock lock(*m_latch);
143 std::string cmd(
"QUERY_RECORDER ");
144 int32_to_string((int32_t)m_num, &buf);
145 cmd.append(buf.data);
146 cmd.append(PROTO_STR_SEPARATOR);
147 cmd.append(
"STOP_LIVETV");
149 if (!SendCommand(cmd.c_str()))
151 if (!
ReadField(field) || !IsMessageOK(field))
160bool ProtoRecorder::CheckChannel75(
const std::string& channum)
165 OS::WriteLock lock(*m_latch);
168 std::string cmd(
"QUERY_RECORDER ");
169 int32_to_string((int32_t)m_num, &buf);
170 cmd.append(buf.data);
171 cmd.append(PROTO_STR_SEPARATOR);
172 cmd.append(
"CHECK_CHANNEL");
173 cmd.append(PROTO_STR_SEPARATOR);
176 if (!SendCommand(cmd.c_str()))
180 DBG(DBG_DEBUG,
"%s: %s\n", __FUNCTION__, field.c_str());
187ProgramPtr ProtoRecorder::GetCurrentRecording75()
192 OS::WriteLock lock(*m_latch);
195 std::string cmd(
"QUERY_RECORDER ");
196 int32_to_string((int32_t)m_num, &buf);
197 cmd.append(buf.data);
198 cmd.append(PROTO_STR_SEPARATOR);
199 cmd.append(
"GET_CURRENT_RECORDING");
201 if (!SendCommand(cmd.c_str()))
204 if (!(program = RcvProgramInfo()))
209 DBG(DBG_ERROR,
"%s: failed\n", __FUNCTION__);
214int64_t ProtoRecorder::GetFilePosition75()
220 OS::WriteLock lock(*m_latch);
221 if (!IsOpen() || !IsPlaying())
223 std::string cmd(
"QUERY_RECORDER ");
224 int32_to_string((int32_t)m_num, &buf);
225 cmd.append(buf.data);
226 cmd.append(PROTO_STR_SEPARATOR);
227 cmd.append(
"GET_FILE_POSITION");
229 if (!SendCommand(cmd.c_str()))
232 if (!
ReadField(field) || string_to_int64(field.c_str(), &pos))
243CardInputListPtr ProtoRecorder::GetFreeInputs75()
245 CardInputListPtr list = CardInputListPtr(
new CardInputList());
249 OS::WriteLock lock(*m_latch);
252 std::string cmd(
"QUERY_RECORDER ");
253 int32_to_string((int32_t)m_num, &buf);
254 cmd.append(buf.data);
255 cmd.append(PROTO_STR_SEPARATOR);
256 cmd.append(
"GET_FREE_INPUTS");
258 if (!SendCommand(cmd.c_str()))
261 while (m_msgConsumed < m_msgLength)
263 CardInputPtr input(
new CardInput());
266 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->sourceId)))
268 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->inputId)))
270 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->cardId)))
272 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->mplexId)))
274 if (!
ReadField(field) || string_to_uint8(field.c_str(), &(input->liveTVOrder)))
276 list->push_back(input);
282CardInputListPtr ProtoRecorder::GetFreeInputs79()
284 CardInputListPtr list = CardInputListPtr(
new CardInputList());
288 OS::WriteLock lock(*m_latch);
291 std::string cmd(
"QUERY_RECORDER ");
292 int32_to_string((int32_t)m_num, &buf);
293 cmd.append(buf.data);
294 cmd.append(PROTO_STR_SEPARATOR);
295 cmd.append(
"GET_FREE_INPUTS");
297 if (!SendCommand(cmd.c_str()))
300 while (m_msgConsumed < m_msgLength)
302 CardInputPtr input(
new CardInput());
305 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->sourceId)))
307 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->inputId)))
309 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->cardId)))
311 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->mplexId)))
313 if (!
ReadField(field) || string_to_uint8(field.c_str(), &(input->liveTVOrder)))
323 list->push_back(input);
329CardInputListPtr ProtoRecorder::GetFreeInputs81()
331 CardInputListPtr list = CardInputListPtr(
new CardInputList());
335 OS::WriteLock lock(*m_latch);
338 std::string cmd(
"QUERY_RECORDER ");
339 int32_to_string((int32_t)m_num, &buf);
340 cmd.append(buf.data);
341 cmd.append(PROTO_STR_SEPARATOR);
342 cmd.append(
"GET_FREE_INPUTS");
344 if (!SendCommand(cmd.c_str()))
347 while (m_msgConsumed < m_msgLength)
349 CardInputPtr input(
new CardInput());
352 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->sourceId)))
354 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->inputId)))
356 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->cardId)))
358 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->mplexId)))
360 if (!
ReadField(field) || string_to_uint8(field.c_str(), &(input->liveTVOrder)))
372 list->push_back(input);
378CardInputListPtr ProtoRecorder::GetFreeInputs87()
380 CardInputListPtr list = CardInputListPtr(
new CardInputList());
383 OS::WriteLock lock(*m_latch);
386 std::string cmd(
"GET_FREE_INPUT_INFO 0");
388 if (!SendCommand(cmd.c_str()))
391 while (m_msgConsumed < m_msgLength)
393 CardInputPtr input(
new CardInput());
396 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->sourceId)))
398 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->inputId)))
400 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->cardId)))
402 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->mplexId)))
404 if (!
ReadField(field) || string_to_uint8(field.c_str(), &(input->liveTVOrder)))
416 if (input->cardId ==
static_cast<unsigned>(m_num))
417 list->push_back(input);
423CardInputListPtr ProtoRecorder::GetFreeInputs89()
425 CardInputListPtr list = CardInputListPtr(
new CardInputList());
428 OS::WriteLock lock(*m_latch);
431 std::string cmd(
"GET_FREE_INPUT_INFO 0");
433 if (!SendCommand(cmd.c_str()))
436 while (m_msgConsumed < m_msgLength)
438 CardInputPtr input(
new CardInput());
441 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->sourceId)))
443 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->inputId)))
445 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->cardId)))
447 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->mplexId)))
449 if (!
ReadField(field) || string_to_uint8(field.c_str(), &(input->liveTVOrder)))
463 if (input->cardId ==
static_cast<unsigned>(m_num))
464 list->push_back(input);
470CardInputListPtr ProtoRecorder::GetFreeInputs90()
472 CardInputListPtr list = CardInputListPtr(
new CardInputList());
475 OS::WriteLock lock(*m_latch);
478 std::string cmd(
"GET_FREE_INPUT_INFO 0");
480 if (!SendCommand(cmd.c_str()))
483 while (m_msgConsumed < m_msgLength)
485 CardInputPtr input(
new CardInput());
488 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->sourceId)))
490 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->inputId)))
492 input->cardId = input->inputId;
495 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->mplexId)))
497 if (!
ReadField(field) || string_to_uint8(field.c_str(), &(input->liveTVOrder)))
511 if (input->cardId ==
static_cast<unsigned>(m_num))
512 list->push_back(input);
518CardInputListPtr ProtoRecorder::GetFreeInputs91()
520 CardInputListPtr list = CardInputListPtr(
new CardInputList());
523 OS::WriteLock lock(*m_latch);
526 std::string cmd(
"GET_FREE_INPUT_INFO 0");
528 if (!SendCommand(cmd.c_str()))
531 while (m_msgConsumed < m_msgLength)
533 CardInputPtr input(
new CardInput());
536 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->sourceId)))
538 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->inputId)))
540 input->cardId = input->inputId;
541 if (!
ReadField(field) || string_to_uint32(field.c_str(), &(input->mplexId)))
543 if (!
ReadField(field) || string_to_uint8(field.c_str(), &(input->liveTVOrder)))
555 if (input->cardId ==
static_cast<unsigned>(m_num))
556 list->push_back(input);
562bool ProtoRecorder::IsLiveRecording()
564 OS::ReadLock lock(*m_latch);
565 return m_liveRecording;
568bool ProtoRecorder::SetLiveRecording75(
bool keep)
573 OS::WriteLock lock(*m_latch);
576 std::string cmd(
"QUERY_RECORDER ");
577 int32_to_string((int32_t)m_num, &buf);
578 cmd.append(buf.data);
579 cmd.append(PROTO_STR_SEPARATOR);
580 cmd.append(
"SET_LIVE_RECORDING").append(PROTO_STR_SEPARATOR);
586 if (!SendCommand(cmd.c_str()))
589 if (!
ReadField(field) || !IsMessageOK(field))
591 DBG(DBG_DEBUG,
"%s: succeeded (%d)\n", __FUNCTION__, keep);
594 DBG(DBG_ERROR,
"%s: failed\n", __FUNCTION__);
599bool ProtoRecorder::FinishRecording75()
604 OS::WriteLock lock(*m_latch);
607 std::string cmd(
"QUERY_RECORDER ");
608 int32_to_string((int32_t)m_num, &buf);
609 cmd.append(buf.data);
610 cmd.append(PROTO_STR_SEPARATOR);
611 cmd.append(
"FINISH_RECORDING");
613 if (!SendCommand(cmd.c_str()))
616 if (!
ReadField(field) || !IsMessageOK(field))
618 DBG(DBG_DEBUG,
"%s: succeeded\n", __FUNCTION__);
621 DBG(DBG_ERROR,
"%s: failed\n", __FUNCTION__);
bool ReadField(std::string &field)
This is the main namespace that encloses all public classes.