Go to the documentation of this file.
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((
int)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;
bool isActive(void) const
bool next(void)
Wrap QSqlQuery::next() so we can display the query results.
QSqlQuery wrapper that fetches a DB connection from the connection pool.
std::chrono::milliseconds elapsed(void)
Returns milliseconds elapsed since last start() or restart()
void FinishRecording(void)
std::chrono::milliseconds SetSignalMonitoringRate(std::chrono::milliseconds rate, int notifyFrontend=1)
Sets the signal monitoring rate.
bool SetChannelInfo(const InfoMap &infoMap)
ProgramInfo * GetRecording(void)
int GetRecorderNumber(void) const
virtual int DecrRef(void)
Decrements reference count and deletes on 0.
void ToggleChannelFavorite(const QString &changroupname)
void FillDurationMap(int64_t start, int64_t end, frm_pos_map_t &durationMap)
MythSocket * m_controlSock
void CancelNextRecording(bool cancel)
QVariant value(int i) const
bool isRunning(void) const
Returns true if start() or restart() has been called at least once since construction and since any c...
@ kPictureAttribute_Contrast
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...
bool exec(void)
Wrap QSqlQuery::exec() so we can display SQL.
static constexpr std::chrono::milliseconds MAX_SIZE_CHECK
long long GetFramesWritten(void)
Returns number of frames written to disk by TVRec's RecorderBase instance.
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
QMap< QString, uint > m_cachedTimeout
bool IsValidRecorder(void) const
int ChangePictureAttribute(PictureAdjustType type, PictureAttribute attr, bool up)
Changes brightness/contrast/colour/hue of a recording.
bool ShouldSwitchToAnotherCard(const QString &channelid)
Checks if named channel exists on current tuner, or another tuner. This only works on local recorders...
QHash< QString, QString > InfoMap
static bool IsRequired(const QString &cardtype)
Returns true iff the card type supports signal monitoring.
bool IsRecording(bool *ok=nullptr)
long long GetMaxBitrate()
Returns the maximum bits per second this recorder can produce.
bool WriteStringList(const QStringList &list)
float GetFrameRate(void)
Returns recordering frame rate set by nvr.
void SpawnLiveTV(const QString &chainid, bool pip, const QString &startchan)
Tells TVRec to Spawn a "Live TV" recorder.
static MSqlQueryInfo InitCon(ConnectionReuse _reuse=kNormalConnection)
Only use this in combination with MSqlQuery constructor.
bool SendReceiveStringList(QStringList &strlist, uint min_reply_length=0)
static void DBError(const QString &where, const MSqlQuery &query)
void ChangeChannel(int channeldirection)
void SetLiveRecording(bool recording)
std::chrono::milliseconds restart(void)
Returns milliseconds elapsed since last start() or restart() and resets the count.
long long m_cachedFramesWritten
uint GetSignalLockTimeout(const QString &input)
@ kPictureAttribute_Brightness
static constexpr std::chrono::milliseconds kShortTimeout
MythSocket * ConnectCommandSocket(const QString &hostname, int port, const QString &announcement, bool *proto_mismatch=nullptr, int maxConnTry=-1, std::chrono::milliseconds setup_timeout=-1ms)
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
static QString cleanup(const QString &str)
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.
QMap< long long, long long > frm_pos_map_t
Frame # -> File offset map.
Holds information on recordings and videos.
void SetChannel(const QString &channel)
void bindValue(const QString &placeholder, const QVariant &val)
Add a single binding.
void StopLiveTV(void)
Tells TVRec to stop a "Live TV" recorder.
void GetChannelInfo(InfoMap &infoMap, uint chanid=0)
void FillPositionMap(int64_t start, int64_t end, frm_pos_map_t &positionMap)
static QString make_safe(const QString &str)
QString SetInput(const QString &input)
bool CheckChannel(const QString &channel)
Checks if named channel exists on current tuner.
long long GetFilePosition(void)
Returns total number of bytes written by TVRec's RingBuffer.
QString GetHostName(void)
int GetPictureAttribute(PictureAttribute attr)
MythTimer m_lastTimeCheck
void PauseRecorder(void)
Tells TVRec to pause a recorder, used for channel and input changes.
bool ReadStringList(QStringList &list, std::chrono::milliseconds timeoutMS=kShortTimeout)
void ChangeDeinterlacer(int deint_mode)
int64_t GetKeyframePosition(uint64_t desired)
Returns byte position in RingBuffer of a keyframe.
void StopPlaying(void)
Tells TVRec to stop streaming a recording to the frontend.
bool prepare(const QString &query)
QSqlQuery::prepare() is not thread safe in Qt <= 3.3.2.
@ kPictureAttribute_Colour