MythTV  master
playbacksock.cpp
Go to the documentation of this file.
1 // C++
2 #include <utility>
3 
4 // Qt
5 #include <QStringList>
6 
7 // MythTV
8 #include "libmyth/programinfo.h"
9 #include "libmythbase/compat.h"
11 #include "libmythbase/mythdate.h"
13 #include "libmythtv/inputinfo.h"
14 
15 // MythBackend
16 #include "mainserver.h"
17 #include "playbacksock.h"
18 
19 #define LOC QString("PlaybackSock: ")
20 #define LOC_ERR QString("PlaybackSock, Error: ")
21 
23  MainServer *parent, MythSocket *lsock,
24  QString lhostname, PlaybackSockEventsMode eventsMode) :
25  ReferenceCounter("PlaybackSock")
26 {
27  m_parent = parent;
28  QString localhostname = gCoreContext->GetHostName();
29 
30  m_sock = lsock;
31  m_hostname = std::move(lhostname);
33  m_ip = "";
34 
35  m_local = (m_hostname == localhostname);
36 }
37 
39 {
40  m_sock->DecrRef();
41  m_sock = nullptr;
42 }
43 
44 bool PlaybackSock::wantsEvents(void) const
45 {
46  return (m_eventsMode != kPBSEvents_None);
47 }
48 
50 {
51  return ((m_eventsMode == kPBSEvents_Normal) ||
53 }
54 
56 {
57  return ((m_eventsMode == kPBSEvents_Normal) ||
59 }
60 
62 {
64 }
65 
67 {
68  return m_eventsMode;
69 }
70 
71 bool PlaybackSock::ReadStringList(QStringList &list)
72 {
73  m_sock->IncrRef();
74  ReferenceLocker rlocker(m_sock);
75  QMutexLocker locker(&m_sockLock);
76  if (!m_sock->IsDataAvailable())
77  {
78  LOG(VB_GENERAL, LOG_DEBUG,
79  "PlaybackSock::ReadStringList(): Data vanished !!!");
80  return false;
81  }
82  return m_sock->ReadStringList(list);
83 }
84 
86  QStringList &strlist, uint min_reply_length)
87 {
88  bool ok = false;
89 
90  m_sock->IncrRef();
91 
92  {
93  QMutexLocker locker(&m_sockLock);
95 
96  ok = m_sock->SendReceiveStringList(strlist);
97  while (ok && strlist[0] == "BACKEND_MESSAGE")
98  {
99  // oops, not for us
100  if (strlist.size() >= 2)
101  {
102  QString message = strlist[1];
103  strlist.pop_front();
104  strlist.pop_front();
105  MythEvent me(message, strlist);
106  gCoreContext->dispatch(me);
107  }
108 
109  ok = m_sock->ReadStringList(strlist);
110  }
112  }
113 
114  m_sock->DecrRef();
115 
116  if (!ok)
117  {
118  LOG(VB_GENERAL, LOG_ERR,
119  "PlaybackSock::SendReceiveStringList(): No response.");
120  return false;
121  }
122 
123  if (min_reply_length && ((uint)strlist.size() < min_reply_length))
124  {
125  LOG(VB_GENERAL, LOG_ERR,
126  "PlaybackSock::SendReceiveStringList(): Response too short");
127  return false;
128  }
129 
130  return true;
131 }
132 
136 {
137  QStringList strlist(QString("GO_TO_SLEEP"));
138 
139  return SendReceiveStringList(strlist, 1) && (strlist[0] == "OK");
140 }
141 
145 void PlaybackSock::GetDiskSpace(QStringList &o_strlist)
146 {
147  QStringList strlist(QString("QUERY_FREE_SPACE"));
148 
149  if (SendReceiveStringList(strlist, 8))
150  {
151  o_strlist += strlist;
152  }
153 }
154 
156 {
157  QStringList strlist(QString("CHECK_RECORDING"));
158  pginfo->ToStringList(strlist);
159 
160  if (SendReceiveStringList(strlist, 1))
161  return strlist[0].toInt();
162 
163  return 0;
164 }
165 
166 int PlaybackSock::DeleteFile(const QString &filename, const QString &sgroup)
167 {
168  QStringList strlist("DELETE_FILE");
169  strlist << filename;
170  strlist << sgroup;
171 
172  if (SendReceiveStringList(strlist, 1))
173  return strlist[0].toInt();
174 
175  return 0;
176 }
177 
179 {
180  QStringList strlist(QString("STOP_RECORDING"));
181  pginfo->ToStringList(strlist);
182 
183  if (SendReceiveStringList(strlist, 1))
184  return strlist[0].toInt();
185 
186  return 0;
187 }
188 
190  bool forceMetadataDelete)
191 {
192  QStringList strlist;
193 
194  if (forceMetadataDelete)
195  strlist = QStringList( QString("FORCE_DELETE_RECORDING"));
196  else
197  strlist = QStringList( QString("DELETE_RECORDING"));
198 
199  pginfo->ToStringList(strlist);
200 
201  if (SendReceiveStringList(strlist, 1))
202  return strlist[0].toInt();
203 
204  return 0;
205 }
206 
208  const QString &playbackhost)
209 {
210  QStringList strlist(QString("FILL_PROGRAM_INFO"));
211  strlist << playbackhost;
212  pginfo.ToStringList(strlist);
213 
214  if (SendReceiveStringList(strlist))
215  {
216  ProgramInfo tmp(strlist);
217  if (tmp.HasPathname() || tmp.GetChanID())
218  {
219  pginfo.clone(tmp, true);
220  return true;
221  }
222  }
223 
224  return false;
225 }
226 
227 QStringList PlaybackSock::GetSGFileList(const QString &host, const QString &groupname,
228  const QString &directory, bool fileNamesOnly)
229 {
230  QStringList strlist(QString("QUERY_SG_GETFILELIST"));
231  strlist << host;
232  strlist << groupname;
233  strlist << directory;
234  strlist << QString::number(static_cast<int>(fileNamesOnly));
235 
236  SendReceiveStringList(strlist);
237 
238  return strlist;
239 }
240 
241 QStringList PlaybackSock::GetSGFileQuery(const QString &host, const QString &groupname,
242  const QString &filename)
243 {
244  QStringList strlist(QString("QUERY_SG_FILEQUERY"));
245  strlist << host;
246  strlist << groupname;
247  strlist << filename;
248 
249  SendReceiveStringList(strlist);
250 
251  return strlist;
252 }
253 
254 QString PlaybackSock::GetFileHash(const QString& filename, const QString& storageGroup)
255 {
256  QStringList strlist(QString("QUERY_FILE_HASH"));
257  strlist << filename
258  << storageGroup;
259 
260  SendReceiveStringList(strlist);
261  return strlist[0];
262 }
263 
264 QStringList PlaybackSock::GetFindFile(const QString &host, const QString &filename,
265  const QString &storageGroup, bool useRegex)
266 {
267  QStringList strlist(QString("QUERY_FINDFILE"));
268  strlist << host
269  << storageGroup
270  << filename
271  << (useRegex ? "1" : "0")
272  << "0";
273 
274  SendReceiveStringList(strlist);
275  return strlist;
276 }
277 
278 QStringList PlaybackSock::GenPreviewPixmap(const QString &token,
279  const ProgramInfo *pginfo)
280 {
281  QStringList strlist(QString("QUERY_GENPIXMAP2"));
282  strlist += token;
283  pginfo->ToStringList(strlist);
284 
285  SendReceiveStringList(strlist);
286 
287  return strlist;
288 }
289 
290 QStringList PlaybackSock::GenPreviewPixmap(const QString &token,
291  const ProgramInfo *pginfo,
292  std::chrono::seconds time,
293  long long frame,
294  const QString &outputFile,
295  const QSize outputSize)
296 {
297  QStringList strlist(QString("QUERY_GENPIXMAP2"));
298  strlist += token;
299  pginfo->ToStringList(strlist);
300  if (time != std::chrono::seconds::max())
301  {
302  strlist.push_back("s");
303  strlist.push_back(QString::number(time.count()));
304  }
305  else
306  {
307  strlist.push_back("f");
308  strlist.push_back(QString::number(frame));
309  }
310  strlist.push_back((outputFile.isEmpty()) ? "<EMPTY>" : outputFile);
311  strlist.push_back(QString::number(outputSize.width()));
312  strlist.push_back(QString::number(outputSize.height()));
313 
314  SendReceiveStringList(strlist);
315 
316  return strlist;
317 }
318 
320 {
321  QStringList strlist(QString("QUERY_PIXMAP_LASTMODIFIED"));
322  pginfo->ToStringList(strlist);
323 
324  SendReceiveStringList(strlist);
325 
326  if (!strlist.empty() && !strlist[0].isEmpty() && (strlist[0] != "BAD"))
327  {
328  return MythDate::fromSecsSinceEpoch(strlist[0].toLongLong());
329  }
330 
331  return {};
332 }
333 
335 {
336  QStringList strlist("QUERY_CHECKFILE");
337  strlist << QString::number(0); // don't check slaves
338  pginfo->ToStringList(strlist);
339 
340  if (SendReceiveStringList(strlist, 2))
341  {
342  pginfo->SetPathname(strlist[1]);
343  return strlist[0].toInt() != 0;
344  }
345 
346  return false;
347 }
348 
349 bool PlaybackSock::IsBusy(int capturecardnum, InputInfo *busy_input,
350  std::chrono::seconds time_buffer)
351 {
352  QStringList strlist(QString("QUERY_REMOTEENCODER %1").arg(capturecardnum));
353 
354  strlist << "IS_BUSY";
355  strlist << QString::number(time_buffer.count());
356 
357  if (!SendReceiveStringList(strlist, 1))
358  {
359  LOG(VB_GENERAL, LOG_ERR, LOC + "IsBusy: " +
360  QString("QUERY_REMOTEENCODER %1").arg(capturecardnum) +
361  " gave us no response.");
362  }
363 
364  bool state = false;
365 
366  if (!strlist.isEmpty())
367  {
368  QStringList::const_iterator it = strlist.cbegin();
369  state = ((*it).toInt() != 0);
370 
371  if (busy_input)
372  {
373  ++it;
374  if (!busy_input->FromStringList(it, strlist.cend()))
375  {
376  LOG(VB_GENERAL, LOG_ERR, LOC + "IsBusy: "
377  "Failed to parse response to " +
378  QString("QUERY_REMOTEENCODER %1").arg(capturecardnum));
379  state = false;
380  // pretend it's not busy if we can't parse response
381  }
382  }
383  }
384 
385  return state;
386 }
387 
392 int PlaybackSock::GetEncoderState(int capturecardnum)
393 {
394  QStringList strlist(QString("QUERY_REMOTEENCODER %1").arg(capturecardnum));
395  strlist << "GET_STATE";
396 
397  if (!SendReceiveStringList(strlist, 1))
398  {
399  LOG(VB_GENERAL, LOG_ERR, LOC + "GetEncoderState: " +
400  QString("QUERY_REMOTEENCODER %1").arg(capturecardnum) +
401  " gave us no response.");
402 
403  return kState_Error;
404  }
405 
406  return strlist[0].toInt();
407 }
408 
409 long long PlaybackSock::GetMaxBitrate(int capturecardnum)
410 {
411  QStringList strlist(QString("QUERY_REMOTEENCODER %1").arg(capturecardnum));
412  strlist << "GET_MAX_BITRATE";
413 
414  if (SendReceiveStringList(strlist, 1))
415  return strlist[0].toLongLong();
416 
417  return 20200000LL; // Peak bit rate for HD-PVR
418 }
419 
425 {
426  QStringList strlist(QString("QUERY_REMOTEENCODER %1").arg(cardid));
427  strlist << "GET_CURRENT_RECORDING";
428 
429  if (!SendReceiveStringList(strlist))
430  return nullptr;
431 
432  auto *pginfo = new ProgramInfo(strlist);
433  if (!pginfo->HasPathname() && !pginfo->GetChanID())
434  {
435  delete pginfo;
436  pginfo = nullptr;
437  }
438 
439  return pginfo;
440 }
441 
442 bool PlaybackSock::EncoderIsRecording(int capturecardnum,
443  const ProgramInfo *pginfo)
444 {
445  QStringList strlist(QString("QUERY_REMOTEENCODER %1").arg(capturecardnum));
446  strlist << "MATCHES_RECORDING";
447  pginfo->ToStringList(strlist);
448 
449  if (SendReceiveStringList(strlist, 1))
450  return (bool) strlist[0].toInt();
451 
452  return false;
453 }
454 
456  ProgramInfo *pginfo)
457 {
458  QStringList strlist(QString("QUERY_REMOTEENCODER %1").arg(capturecardnum));
459  strlist << "START_RECORDING";
460  pginfo->ToStringList(strlist);
461 
462  if (SendReceiveStringList(strlist, 3))
463  {
464  pginfo->SetRecordingID(strlist[1].toUInt());
465  pginfo->SetRecordingStartTime(
466  MythDate::fromSecsSinceEpoch(strlist[2].toLongLong()));
467  return RecStatus::Type(strlist[0].toInt());
468  }
469 
470  return RecStatus::Unknown;
471 }
472 
474 {
475  QStringList strlist(QString("QUERY_REMOTEENCODER %1").arg(capturecardnum));
476  strlist << "GET_RECORDING_STATUS";
477 
478  if (!SendReceiveStringList(strlist, 1))
479  {
480  LOG(VB_GENERAL, LOG_ERR, LOC + "GetRecordingStatus: " +
481  QString("QUERY_REMOTEENCODER %1").arg(capturecardnum) +
482  " did not respond.");
483 
484  return RecStatus::Unknown;
485  }
486 
487  return RecStatus::Type(strlist[0].toInt());
488 }
489 
490 void PlaybackSock::RecordPending(int capturecardnum, const ProgramInfo *pginfo,
491  std::chrono::seconds secsleft, bool hasLater)
492 {
493  QStringList strlist(QString("QUERY_REMOTEENCODER %1").arg(capturecardnum));
494  strlist << "RECORD_PENDING";
495  strlist << QString::number(secsleft.count());
496  strlist << QString::number(static_cast<int>(hasLater));
497  pginfo->ToStringList(strlist);
498 
499  SendReceiveStringList(strlist);
500 }
501 
502 std::chrono::milliseconds PlaybackSock::SetSignalMonitoringRate(int capturecardnum,
503  std::chrono::milliseconds rate, int notifyFrontend)
504 {
505  QStringList strlist(QString("QUERY_REMOTEENCODER %1").arg(capturecardnum));
506  strlist << "SET_SIGNAL_MONITORING_RATE";
507  strlist << QString::number(rate.count());
508  strlist << QString::number(notifyFrontend);
509 
510  if (SendReceiveStringList(strlist, 1))
511  return std::chrono::milliseconds(strlist[0].toInt());
512 
513  return -1ms;
514 }
515 
516 void PlaybackSock::SetNextLiveTVDir(int capturecardnum, const QString& dir)
517 {
518  QStringList strlist(QString("SET_NEXT_LIVETV_DIR %1 %2")
519  .arg(capturecardnum)
520  .arg(dir));
521 
522  SendReceiveStringList(strlist);
523 }
524 
525 void PlaybackSock::CancelNextRecording(int capturecardnum, bool cancel)
526 {
527  QStringList strlist(QString("QUERY_REMOTEENCODER %1")
528  .arg(capturecardnum));
529 
530  strlist << "CANCEL_NEXT_RECORDING";
531  strlist << QString::number(static_cast<int>(cancel));
532 
533  SendReceiveStringList(strlist);
534 }
535 
536 QStringList PlaybackSock::ForwardRequest(const QStringList &slist)
537 {
538  QStringList strlist = slist;
539 
540  if (SendReceiveStringList(strlist))
541  return strlist;
542 
543  return {};
544 }
545 
549 {
550  QStringList strlist(QString("ADD_CHILD_INPUT %1").arg(childid));
551  return SendReceiveStringList(strlist, 1) && (strlist[0] == "OK");
552 }
553 
554 /* vim: set expandtab tabstop=4 shiftwidth=4: */
ReferenceLocker
This decrements the reference on destruction.
Definition: referencecounter.h:66
RecStatus::Type
Type
Definition: recordingstatus.h:16
kPBSEvents_SystemOnly
@ kPBSEvents_SystemOnly
Definition: playbacksock.h:24
kPBSEvents_None
@ kPBSEvents_None
Definition: playbacksock.h:21
PlaybackSock::GetDiskSpace
void GetDiskSpace(QStringList &o_strlist)
Appends host's dir's total and used space in kilobytes.
Definition: playbacksock.cpp:145
PlaybackSock::wantsOnlySystemEvents
bool wantsOnlySystemEvents(void) const
Definition: playbacksock.cpp:61
PlaybackSock::RecordPending
void RecordPending(int capturecardnum, const ProgramInfo *pginfo, std::chrono::seconds secsleft, bool hasLater)
Definition: playbacksock.cpp:490
PlaybackSock::m_hostname
QString m_hostname
Definition: playbacksock.h:118
PlaybackSock::m_sock
MythSocket * m_sock
Definition: playbacksock.h:117
ReferenceCounter::DecrRef
virtual int DecrRef(void)
Decrements reference count and deletes on 0.
Definition: referencecounter.cpp:125
PlaybackSock::EncoderIsRecording
bool EncoderIsRecording(int capturecardnum, const ProgramInfo *pginfo)
Definition: playbacksock.cpp:442
PlaybackSock::wantsSystemEvents
bool wantsSystemEvents(void) const
Definition: playbacksock.cpp:55
PlaybackSock::~PlaybackSock
~PlaybackSock() override
Definition: playbacksock.cpp:38
PlaybackSock::PlaybackSock
PlaybackSock(MainServer *parent, MythSocket *lsock, QString lhostname, PlaybackSockEventsMode eventsMode)
Definition: playbacksock.cpp:22
PlaybackSock::m_eventsMode
PlaybackSockEventsMode m_eventsMode
Definition: playbacksock.h:122
ProgramInfo::SetRecordingID
virtual void SetRecordingID(uint _recordedid)
Definition: programinfo.h:578
kPBSEvents_Normal
@ kPBSEvents_Normal
Definition: playbacksock.h:22
PlaybackSock::m_ip
QString m_ip
Definition: playbacksock.h:119
ProgramInfo::clone
virtual void clone(const ProgramInfo &other, bool ignore_non_serialized_data=false)
Copies important fields from other ProgramInfo.
Definition: programinfo.cpp:836
MythEvent
This class is used as a container for messages.
Definition: mythevent.h:16
PlaybackSock::FillProgramInfo
bool FillProgramInfo(ProgramInfo &pginfo, const QString &playbackhost)
Definition: playbacksock.cpp:207
MainServer
Definition: mainserver.h:115
RecStatus::Unknown
@ Unknown
Definition: recordingstatus.h:32
playbacksock.h
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
kPBSEvents_NonSystem
@ kPBSEvents_NonSystem
Definition: playbacksock.h:23
PlaybackSock::eventsMode
PlaybackSockEventsMode eventsMode(void) const
Definition: playbacksock.cpp:66
PlaybackSock::m_sockLock
QMutex m_sockLock
Definition: playbacksock.h:128
kState_Error
@ kState_Error
Error State, if we ever try to enter this state errored is set.
Definition: tv.h:54
PlaybackSock::GenPreviewPixmap
QStringList GenPreviewPixmap(const QString &token, const ProgramInfo *pginfo)
Definition: playbacksock.cpp:278
PlaybackSock::DeleteFile
int DeleteFile(const QString &filename, const QString &sgroup)
Definition: playbacksock.cpp:166
tmp
static guint32 * tmp
Definition: goom_core.cpp:26
MythSocket
Class for communcating between myth backends and frontends.
Definition: mythsocket.h:25
PlaybackSock::StopRecording
int StopRecording(const ProgramInfo *pginfo)
Definition: playbacksock.cpp:178
mythdate.h
ProgramInfo::SetPathname
void SetPathname(const QString &pn)
Definition: programinfo.cpp:2438
MythDate::fromSecsSinceEpoch
MBASE_PUBLIC QDateTime fromSecsSinceEpoch(int64_t seconds)
This function takes the number of seconds since the start of the epoch and returns a QDateTime with t...
Definition: mythdate.cpp:72
programinfo.h
PlaybackSock::SendReceiveStringList
bool SendReceiveStringList(QStringList &strlist, uint min_reply_length=0)
Definition: playbacksock.cpp:85
PlaybackSock::m_local
bool m_local
Definition: playbacksock.h:121
PlaybackSock::AddChildInput
bool AddChildInput(uint childid)
Tells a slave to add a child input.
Definition: playbacksock.cpp:548
compat.h
PlaybackSock::GetRecordingStatus
RecStatus::Type GetRecordingStatus(int capturecardnum)
Definition: playbacksock.cpp:473
PlaybackSock::CancelNextRecording
void CancelNextRecording(int capturecardnum, bool cancel)
Definition: playbacksock.cpp:525
PlaybackSock::GetFileHash
QString GetFileHash(const QString &filename, const QString &storageGroup)
Definition: playbacksock.cpp:254
PlaybackSock::CheckFile
bool CheckFile(ProgramInfo *pginfo)
Definition: playbacksock.cpp:334
PlaybackSock::wantsNonSystemEvents
bool wantsNonSystemEvents(void) const
Definition: playbacksock.cpp:49
PlaybackSock::SetNextLiveTVDir
void SetNextLiveTVDir(int capturecardnum, const QString &dir)
Definition: playbacksock.cpp:516
MythSocket::SetReadyReadCallbackEnabled
void SetReadyReadCallbackEnabled(bool enabled)
Definition: mythsocket.h:48
uint
unsigned int uint
Definition: compat.h:79
PlaybackSock::GetEncoderState
int GetEncoderState(int capturecardnum)
Definition: playbacksock.cpp:392
gCoreContext
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
Definition: mythcorecontext.cpp:55
PlaybackSock::SetSignalMonitoringRate
std::chrono::milliseconds SetSignalMonitoringRate(int capturecardnum, std::chrono::milliseconds rate, int notifyFrontend)
Definition: playbacksock.cpp:502
PlaybackSock::StartRecording
RecStatus::Type StartRecording(int capturecardnum, ProgramInfo *pginfo)
Definition: playbacksock.cpp:455
PlaybackSock::GoToSleep
bool GoToSleep(void)
Tells a slave to go to sleep.
Definition: playbacksock.cpp:135
referencecounter.h
PlaybackSock::wantsEvents
bool wantsEvents(void) const
Definition: playbacksock.cpp:44
PlaybackSock::GetSGFileQuery
QStringList GetSGFileQuery(const QString &host, const QString &groupname, const QString &filename)
Definition: playbacksock.cpp:241
PlaybackSock::GetRecording
ProgramInfo * GetRecording(uint cardid)
Returns the ProgramInfo being used by any current recording.
Definition: playbacksock.cpp:424
ProgramInfo
Holds information on recordings and videos.
Definition: programinfo.h:67
ProgramInfo::ToStringList
void ToStringList(QStringList &list) const
Serializes ProgramInfo into a QStringList which can be passed over a socket.
Definition: programinfo.cpp:1267
mythcorecontext.h
PlaybackSock::CheckRecordingActive
int CheckRecordingActive(const ProgramInfo *pginfo)
Definition: playbacksock.cpp:155
PlaybackSock::GetSGFileList
QStringList GetSGFileList(const QString &host, const QString &groupname, const QString &directory, bool fileNamesOnly)
Definition: playbacksock.cpp:227
MythSocket::IsDataAvailable
bool IsDataAvailable(void)
Definition: mythsocket.cpp:563
inputinfo.h
InputInfo
Definition: inputinfo.h:14
mainserver.h
MythCoreContext::GetHostName
QString GetHostName(void)
Definition: mythcorecontext.cpp:838
PlaybackSock::GetFindFile
QStringList GetFindFile(const QString &host, const QString &filename, const QString &storageGroup, bool useRegex)
Definition: playbacksock.cpp:264
PlaybackSock::DeleteRecording
int DeleteRecording(const ProgramInfo *pginfo, bool forceMetadataDelete=false)
Definition: playbacksock.cpp:189
PlaybackSock::ForwardRequest
QStringList ForwardRequest(const QStringList &slist)
Definition: playbacksock.cpp:536
PlaybackSock::ReadStringList
bool ReadStringList(QStringList &list)
Definition: playbacksock.cpp:71
PlaybackSockEventsMode
PlaybackSockEventsMode
Definition: playbacksock.h:20
ReferenceCounter::IncrRef
virtual int IncrRef(void)
Increments reference count.
Definition: referencecounter.cpp:101
build_compdb.filename
filename
Definition: build_compdb.py:21
PlaybackSock::IsBusy
bool IsBusy(int capturecardnum, InputInfo *busy_input=nullptr, std::chrono::seconds time_buffer=5s)
Definition: playbacksock.cpp:349
MythCoreContext::dispatch
void dispatch(const MythEvent &event)
Definition: mythcorecontext.cpp:1725
LOC
#define LOC
Definition: playbacksock.cpp:19
MythSocket::ReadStringList
bool ReadStringList(QStringList &list, std::chrono::milliseconds timeoutMS=kShortTimeout)
Definition: mythsocket.cpp:319
PlaybackSock::m_parent
MainServer * m_parent
Definition: playbacksock.h:132
ReferenceCounter
General purpose reference counter.
Definition: referencecounter.h:26
PlaybackSock::GetMaxBitrate
long long GetMaxBitrate(int capturecardnum)
Definition: playbacksock.cpp:409
MythSocket::SendReceiveStringList
bool SendReceiveStringList(QStringList &list, uint min_reply_length=0, std::chrono::milliseconds timeoutMS=kLongTimeout)
Definition: mythsocket.cpp:332
PlaybackSock::PixmapLastModified
QDateTime PixmapLastModified(const ProgramInfo *pginfo)
Definition: playbacksock.cpp:319
ProgramInfo::SetRecordingStartTime
void SetRecordingStartTime(const QDateTime &dt)
Definition: programinfo.h:525
InputInfo::FromStringList
virtual bool FromStringList(QStringList::const_iterator &it, const QStringList::const_iterator &end)
Definition: inputinfo.cpp:14