15#define LOC QString("RemoteEncoder(%1): ").arg(m_recordernum)
32 LOG(VB_NETWORK, LOG_DEBUG,
"RemoteEncoder::Setup(): Connecting...");
34 QString ann = QString(
"ANN Playback %1 %2")
42 LOG(VB_NETWORK, LOG_DEBUG,
"RemoteEncoder::Setup(): Connected");
46 LOG(VB_GENERAL, LOG_ERR,
47 "RemoteEncoder::Setup(): Failed to connect to backend");
52 LOG(VB_NETWORK, LOG_DEBUG,
"RemoteEncoder::Setup(): Already connected");
68 QStringList &strlist,
uint min_reply_length)
70 QMutexLocker locker(&
m_lock);
78 LOG(VB_GENERAL, LOG_ERR,
"RemoteEncoder::SendReceiveStringList(): "
79 "Failed to reconnect with backend.");
86 LOG(VB_GENERAL, LOG_ERR,
"RemoteEncoder::SendReceiveStringList(): "
87 "Failed to write data.");
94 LOG(VB_GENERAL, LOG_ERR,
95 "RemoteEncoder::SendReceiveStringList(): No response.");
100 min_reply_length && ((
uint)strlist.size() < min_reply_length))
102 LOG(VB_GENERAL, LOG_ERR,
103 "RemoteEncoder::SendReceiveStringList(): Response too short");
119 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum) );
120 strlist <<
"IS_RECORDING";
134 return strlist[0].toInt() != 0;
139 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum) );
140 strlist <<
"GET_RECORDING";
145 if (proginfo->GetChanID())
161 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum));
162 strlist <<
"GET_FRAMERATE";
165 float retval = 30.0F;
169 retval = strlist[0].toFloat(&ok);
173 LOG(VB_GENERAL, LOG_ERR,
LOC +
174 QString(
"GetFrameRate() failed to parse response '%1'")
180 LOG(VB_GENERAL, LOG_ERR,
LOC +
181 "GetFrameRate(): SendReceiveStringList() failed");
184 return (ok) ? retval : 30.0F;
201 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum));
202 strlist <<
"GET_FRAMES_WRITTEN";
206 LOG(VB_GENERAL, LOG_ERR,
LOC +
"GetFramesWritten() -- network error");
225 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum));
226 strlist <<
"GET_FILE_POSITION";
229 return strlist[0].toLongLong();
240 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum));
241 strlist <<
"GET_MAX_BITRATE";
244 return strlist[0].toLongLong();
258 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum) );
259 strlist <<
"GET_KEYFRAME_POS";
260 strlist << QString::number(desired);
263 return strlist[0].toLongLong();
271 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum));
272 strlist <<
"FILL_POSITION_MAP";
273 strlist << QString::number(start);
274 strlist << QString::number(end);
279 for (
auto it = strlist.cbegin(); it != strlist.cend(); ++it)
282 uint64_t index = (*it).toLongLong(&ok);
283 if (++it == strlist.cend() || !ok)
286 uint64_t pos = (*it).toLongLong(&ok);
290 positionMap[index] = pos;
297 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum));
298 strlist <<
"FILL_DURATION_MAP";
299 strlist << QString::number(start);
300 strlist << QString::number(end);
305 for (
auto it = strlist.cbegin(); it != strlist.cend(); ++it)
308 uint64_t index = (*it).toLongLong(&ok);
309 if (++it == strlist.cend() || !ok)
312 uint64_t pos = (*it).toLongLong(&ok);
316 durationMap[index] = pos;
322 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum));
323 strlist <<
"CANCEL_NEXT_RECORDING";
324 strlist << QString::number((cancel) ? 1 : 0);
331 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum));
332 strlist <<
"FRONTEND_READY";
343 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum) );
344 strlist <<
"STOP_PLAYING";
356 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum));
357 strlist <<
"SPAWN_LIVETV";
359 strlist << QString::number((
int)pip);
360 strlist << startchan;
372 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum) );
373 strlist <<
"STOP_LIVETV";
385 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum) );
394 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum) );
395 strlist <<
"FINISH_RECORDING";
402 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum) );
403 strlist <<
"SET_LIVE_RECORDING";
404 strlist << QString::number(static_cast<int>(recording));
414 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum) );
415 strlist <<
"GET_INPUT";
428 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum) );
429 strlist <<
"SET_INPUT";
444 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum) );
445 strlist <<
"TOGGLE_CHANNEL_FAVORITE";
446 strlist << changroupname;
453 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum) );
454 strlist <<
"CHANGE_CHANNEL";
455 strlist << QString::number(channeldirection);
466 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum) );
467 strlist <<
"SET_CHANNEL";
495 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum) );
496 strlist <<
"SET_SIGNAL_MONITORING_RATE";
497 strlist << QString::number(rate.count());
498 strlist << QString::number(notifyFrontend);
501 return std::chrono::milliseconds(strlist[0].toInt());
508 QMutexLocker locker(&
m_lock);
510 QMap<QString,uint>::const_iterator it =
m_cachedTimeout.constFind(input);
518 "SELECT channel_timeout, cardtype "
520 "WHERE capturecard.inputname = :INNAME AND "
521 " capturecard.cardid = :CARDID");
526 else if (query.
next() &&
531 LOG(VB_PLAYBACK, LOG_DEBUG,
"RemoteEncoder: " +
532 QString(
"GetSignalLockTimeout(%1): Set lock timeout to %2 ms")
542 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum) );
545 strlist <<
"GET_CONTRAST";
547 strlist <<
"GET_BRIGHTNESS";
549 strlist <<
"GET_COLOUR";
551 strlist <<
"GET_HUE";
556 return strlist[0].toInt();
571 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum) );
574 strlist <<
"CHANGE_CONTRAST";
576 strlist <<
"CHANGE_BRIGHTNESS";
578 strlist <<
"CHANGE_COLOUR";
580 strlist <<
"CHANGE_HUE";
584 strlist << QString::number(
type);
585 strlist << QString::number((
int)up);
588 return strlist[0].toInt();
595 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum) );
596 strlist <<
"CHANGE_DEINTERLACER";
597 strlist << QString::number(deint_mode);
613 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum) );
614 strlist <<
"CHECK_CHANNEL";
618 return strlist[0].toInt() != 0;
637 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum) );
638 strlist <<
"SHOULD_SWITCH_CARD";
639 strlist << channelid;
642 return strlist[0].toInt() != 0;
655 uint &complete_valid_channel_on_rec,
656 bool &is_extra_char_useful,
657 QString &needed_spacer)
659 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum) );
660 strlist <<
"CHECK_CHANNEL_PREFIX";
666 complete_valid_channel_on_rec = strlist[1].toInt();
667 is_extra_char_useful = (strlist[2].toInt() != 0);
668 needed_spacer = (strlist[3] ==
"X") ?
"" : strlist[3];
670 return strlist[0].toInt() != 0;
694 QString &title, QString &subtitle,
695 QString &desc, QString &category,
696 QString &starttime, QString &endtime,
697 QString &callsign, QString &iconpath,
698 QString &channelname, QString &chanid,
699 QString &seriesid, QString &programid)
701 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum) );
702 strlist <<
"GET_NEXT_PROGRAM_INFO";
703 strlist << channelname;
705 strlist << QString::number(direction);
706 strlist << starttime;
712 subtitle =
cleanup(strlist[1]);
714 category =
cleanup(strlist[3]);
715 starttime =
cleanup(strlist[4]);
717 callsign =
cleanup(strlist[6]);
718 iconpath =
cleanup(strlist[7]);
719 channelname =
cleanup(strlist[8]);
721 seriesid =
cleanup(strlist[10]);
722 programid =
cleanup(strlist[11]);
727 QStringList strlist( QString(
"QUERY_RECORDER %1").arg(
m_recordernum));
728 strlist <<
"GET_CHANNEL_INFO";
729 strlist << QString::number(chanid);
734 infoMap[
"chanid"] =
cleanup(strlist[0]);
735 infoMap[
"sourceid"] =
cleanup(strlist[1]);
736 infoMap[
"callsign"] =
cleanup(strlist[2]);
737 infoMap[
"channum"] =
cleanup(strlist[3]);
738 infoMap[
"channame"] =
cleanup(strlist[4]);
739 infoMap[
"XMLTV"] =
cleanup(strlist[5]);
741 infoMap[
"oldchannum"] = infoMap[
"channum"];
746 QStringList strlist(
"SET_CHANNEL_INFO" );
748 strlist <<
make_safe(infoMap[
"sourceid"]);
749 strlist <<
make_safe(infoMap[
"oldchannum"]);
750 strlist <<
make_safe(infoMap[
"callsign"]);
751 strlist <<
make_safe(infoMap[
"channum"]);
752 strlist <<
make_safe(infoMap[
"channame"]);
756 return strlist[0].toInt() != 0;
QSqlQuery wrapper that fetches a DB connection from the connection pool.
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
QVariant value(int i) const
bool isActive(void) const
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
QString GetHostName(void)
MythSocket * ConnectCommandSocket(const QString &hostname, int port, const QString &announcement, bool *proto_mismatch=nullptr, int maxConnTry=-1, std::chrono::milliseconds setup_timeout=-1ms)
static void DBError(const QString &where, const MSqlQuery &query)
bool ReadStringList(QStringList &list, std::chrono::milliseconds timeoutMS=kShortTimeout)
static constexpr std::chrono::milliseconds kShortTimeout
bool WriteStringList(const QStringList &list)
std::chrono::milliseconds restart(void)
Returns milliseconds elapsed since last start() or restart() and resets the count.
std::chrono::milliseconds elapsed(void)
Returns milliseconds elapsed since last start() or restart()
bool isRunning(void) const
Returns true if start() or restart() has been called at least once since construction and since any c...
Holds information on recordings and videos.
virtual int DecrRef(void)
Decrements reference count and deletes on 0.
long long m_cachedFramesWritten
std::chrono::milliseconds SetSignalMonitoringRate(std::chrono::milliseconds rate, int notifyFrontend=1)
Sets the signal monitoring rate.
ProgramInfo * GetRecording(void)
void StopLiveTV(void)
Tells TVRec to stop a "Live TV" recorder.
void StopPlaying(void)
Tells TVRec to stop streaming a recording to the frontend.
bool ShouldSwitchToAnotherCard(const QString &channelid)
Checks if named channel exists on current tuner, or another tuner.
void SpawnLiveTV(const QString &chainid, bool pip, const QString &startchan)
Tells TVRec to Spawn a "Live TV" recorder.
void ChangeChannel(int channeldirection)
QMap< QString, uint > m_cachedTimeout
void SetLiveRecording(bool recording)
void FillPositionMap(int64_t start, int64_t end, frm_pos_map_t &positionMap)
int ChangePictureAttribute(PictureAdjustType type, PictureAttribute attr, bool up)
Changes brightness/contrast/colour/hue of a recording.
int GetPictureAttribute(PictureAttribute attr)
bool IsValidRecorder(void) const
void GetChannelInfo(InfoMap &infoMap, uint chanid=0)
bool CheckChannelPrefix(const QString &prefix, uint &complete_valid_channel_on_rec, bool &is_extra_char_useful, QString &needed_spacer)
Checks a prefix against the channels in the DB.
float GetFrameRate(void)
Returns recordering frame rate set by nvr.
long long GetFramesWritten(void)
Returns number of frames written to disk by TVRec's RecorderBase instance.
long long GetFilePosition(void)
Returns total number of bytes written by TVRec's RingBuffer.
void PauseRecorder(void)
Tells TVRec to pause a recorder, used for channel and input changes.
void ChangeDeinterlacer(int deint_mode)
bool SendReceiveStringList(QStringList &strlist, uint min_reply_length=0)
void SetChannel(const QString &channel)
uint GetSignalLockTimeout(const QString &input)
QString SetInput(const QString &input)
bool SetChannelInfo(const InfoMap &infoMap)
MythTimer m_lastTimeCheck
void FillDurationMap(int64_t start, int64_t end, frm_pos_map_t &durationMap)
bool CheckChannel(const QString &channel)
Checks if named channel exists on current tuner.
void FinishRecording(void)
int64_t GetKeyframePosition(uint64_t desired)
Returns byte position in RingBuffer of a keyframe.
void CancelNextRecording(bool cancel)
int GetRecorderNumber(void) const
void ToggleChannelFavorite(const QString &changroupname)
long long GetMaxBitrate()
Returns the maximum bits per second this recorder can produce.
bool IsRecording(bool *ok=nullptr)
void GetNextProgram(int direction, QString &title, QString &subtitle, QString &desc, QString &category, QString &starttime, QString &endtime, QString &callsign, QString &iconpath, QString &channelname, QString &chanid, QString &seriesid, QString &programid)
Returns information about the program that would be seen if we changed the channel using ChangeChanne...
MythSocket * m_controlSock
static bool IsRequired(const QString &cardtype)
Returns true iff the card type supports signal monitoring.
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
QHash< QString, QString > InfoMap
QMap< long long, long long > frm_pos_map_t
Frame # -> File offset map.
static QString make_safe(const QString &str)
static constexpr std::chrono::milliseconds MAX_SIZE_CHECK
static QString cleanup(const QString &str)
@ kPictureAttribute_Contrast
@ kPictureAttribute_Brightness
@ kPictureAttribute_Colour