MythTV  master
tv_play.h
Go to the documentation of this file.
1 // -*- Mode: c++ -*-
2 
3 #ifndef TVPLAY_H
4 #define TVPLAY_H
5 
6 // C++
7 #include <cstdint>
8 #include <utility>
9 #include <vector>
10 
11 // Qt
12 #include <QReadWriteLock>
13 #include <QWaitCondition>
14 #include <QStringList>
15 #include <QDateTime>
16 #include <QObject>
17 #include <QString>
18 #include <QMutex>
19 #include <QMap>
20 #include <QRecursiveMutex>
21 #include <QVector>
22 
23 // MythTV
25 #include "libmythbase/mythdeque.h"
26 #include "libmythbase/mythtimer.h"
28 
29 #include "channelgroup.h"
30 #include "channelinfo.h"
31 #include "decoders/decoderbase.h"
32 #include "inputinfo.h"
33 #include "mythtvmenu.h"
34 #include "osd.h"
35 #include "playercontext.h"
36 #include "tv.h"
37 #include "tvbrowsehelper.h"
38 #include "tvplaybackstate.h"
39 #include "videoouttypes.h"
40 
41 class QEvent;
42 class QKeyEvent;
43 class QTimerEvent;
44 class QDateTime;
45 class QDomDocument;
46 class QDomNode;
47 class OSD;
48 class RemoteEncoder;
49 class MythPlayer;
50 class MythPlayerUI;
51 class MythMediaBuffer;
52 class ProgramInfo;
53 class TvPlayWindow;
54 class TV;
55 class MythMainWindow;
56 struct osdInfo;
57 
58 using EMBEDRETURNVOID = void (*) (void *, bool);
59 using EMBEDRETURNVOIDEPG = void (*) (uint, const QString &, const QDateTime, TV *, bool, bool, int);
60 using EMBEDRETURNVOIDFINDER = void (*) (TV *, bool, bool);
61 using EMBEDRETURNVOIDSCHEDIT = void (*) (const ProgramInfo *, void *);
62 
63 // Locking order
64 //
65 // playerLock -> askAllowLock -> osdLock
66 // -> progListLock -> osdLock
67 // -> chanEditMapLock -> osdLock
68 // -> lastProgramLock
69 // -> recorderPlaybackInfoLock
70 // -> timerIdLock
71 // -> mainLoopCondLock
72 // -> channelGroupLock
73 //
74 // When holding one of these locks, you may lock any lock of the locks to
75 // the right of the current lock, but may not lock any lock to the left of
76 // this lock (which will cause a deadlock). Nor should you lock any other
77 // lock in the TV class without first adding it to the locking order list
78 // above.
79 //
80 // Note: Taking a middle lock such as askAllowLock, without taking a
81 // playerLock first does not violate these rules, but once you are
82 // holding it, you cannot later lock playerLock.
83 //
84 // It goes without saying that any locks outside of this class should only
85 // be taken one at a time, and should be taken last and released first of
86 // all the locks required for any algorithm. (Unless you use tryLock and
87 // release all locks if it can't gather them all at once, see the
88 // "multi_lock()" function as an example; but this is not efficient nor
89 // desirable and should be avoided when possible.)
90 //
91 
98 };
99 
104 {
107  kNoTuners = 2,
108 };
109 
110 enum {
117 };
118 
120 {
121  public:
122  AskProgramInfo() = default;
123  AskProgramInfo(QDateTime e, bool r, bool l, ProgramInfo *i) :
124  m_expiry(std::move(e)), m_hasRec(r), m_hasLater(l), m_info(i) {}
125 
126  QDateTime m_expiry;
127  bool m_hasRec {false};
128  bool m_hasLater {false};
129  bool m_isInSameInputGroup {false};
130  bool m_isConflicting {false};
131  ProgramInfo *m_info {nullptr};
132 };
133 
153 {
154  friend class PlaybackBox;
155  friend class GuideGrid;
156  friend class TVBrowseHelper;
157 
158  Q_OBJECT
159 
160  public:
161  static bool IsTVRunning();
162  static bool StartTV(ProgramInfo* TVRec, uint Flags, const ChannelInfoList& Selection = ChannelInfoList());
163  static bool IsPaused();
164  static void InitKeys();
165  static void SetFuncPtr(const char* Name, void* Pointer);
166  static int ConfiguredTunerCards();
167  static bool IsTunable(uint ChanId);
168  void ReloadKeys();
169 
170  bool IsSameProgram(const ProgramInfo* ProgInfo) const;
171 
172  public slots:
173  bool event(QEvent* Event) override;
174  bool eventFilter(QObject* Object, QEvent* Event) override;
175  void timerEvent(QTimerEvent* Event) override;
176  void StopPlayback();
177  void HandleOSDClosed(int OSDType);
178 
179  signals:
180  void PlaybackExiting(TV* Player);
181 
182  protected slots:
183  void onApplicationStateChange(Qt::ApplicationState State);
184  void customEvent(QEvent* Event) override;
185  void VolumeChange(bool Up, int NewVolume = -1);
186 
187  private slots:
188  void Embed(bool Embed, QRect Rect = {}, const QStringList& Data = {});
189 
190  private:
191  static inline QStringList lastProgramStringList = {};
192  static inline EMBEDRETURNVOID RunPlaybackBoxPtr = nullptr;
193  static inline EMBEDRETURNVOID RunViewScheduledPtr = nullptr;
194  static inline EMBEDRETURNVOIDEPG RunProgramGuidePtr = nullptr;
195  static inline EMBEDRETURNVOIDFINDER RunProgramFinderPtr = nullptr;
196  static inline EMBEDRETURNVOIDSCHEDIT RunScheduleEditorPtr = nullptr;
197 
198  explicit TV(MythMainWindow* MainWindow);
199  ~TV() override;
200  PlayerContext* GetPlayerContext();
201  bool CreatePlayer(TVState State, bool Muted = false);
202  bool StartPlaying(std::chrono::milliseconds MaxWait = -1ms);
203 
204  // Private initialisation
205  static TV* AcquireRelease(int& RefCount, bool Acquire, bool Create = false);
206  bool Init();
207  void InitFromDB();
208  static QList<QKeyEvent*> ConvertScreenPressKeyMap(const QString& KeyList);
209 
210  // Top level playback methods
211  bool LiveTV(bool ShowDialogs, const ChannelInfoList &Selection);
212  int Playback(const ProgramInfo &ProgInfo);
213  void PlaybackLoop();
214 
215  // Private event handling
216  bool ProcessKeypressOrGesture(QEvent* Event);
217  bool TranslateKeyPressOrGesture(const QString& Context, QEvent* Event,
218  QStringList& Actions, bool IsLiveTV,
219  bool AllowJumps = true);
220  bool TranslateGesture(const QString &Context, MythGestureEvent *Event,
221  QStringList& Actions, bool IsLiveTV);
222  void ProcessNetworkControlCommand(const QString& Command);
223 
224  bool HandleTrackAction(const QString& Action);
225  bool ActiveHandleAction(const QStringList& Actions, bool IsDVD, bool IsDVDStillFrame);
226  bool BrowseHandleAction(const QStringList& Actions);
227  void OSDDialogEvent(int Result, const QString& Text, QString Action);
228  bool ToggleHandleAction(const QStringList& Actions, bool IsDVD);
229  bool FFRewHandleAction(const QStringList& Actions);
230  bool ActivePostQHandleAction(const QStringList& Actions);
231  bool HandleJumpToProgramAction(const QStringList& Actions);
232  bool SeekHandleAction(const QStringList& Actions, bool IsDVD);
233  bool TimeStretchHandleAction(const QStringList& Actions);
234  bool DiscMenuHandleAction(const QStringList& Actions) const;
235 
236  // Timers and timer events
237  int StartTimer(std::chrono::milliseconds Interval, int Line);
238  void KillTimer(int Id);
239 
240  void SetSpeedChangeTimer(std::chrono::milliseconds When, int Line);
241  void HandleEndOfPlaybackTimerEvent();
242  void HandleEndOfRecordingExitPromptTimerEvent();
243  void HandleVideoExitDialogTimerEvent();
244  void HandlePseudoLiveTVTimerEvent();
245  void HandleSpeedChangeTimerEvent();
246  void ToggleSleepTimer();
247  void ToggleSleepTimer(const QString& Time);
248  bool HandleLCDTimerEvent();
249  void HandleLCDVolumeTimerEvent();
250  void HandleSaveLastPlayPosEvent();
251 
252  // Commands used by frontend UI screens (PlaybackBox, GuideGrid etc)
253  void EditSchedule(int EditType = kScheduleProgramGuide);
254  bool IsTunablePriv(uint ChanId);
255  static QVector<uint> IsTunableOn(PlayerContext* Context, uint ChanId);
256  void ChangeChannel(const ChannelInfoList& Options);
257  void DoEditSchedule(int EditType = kScheduleProgramGuide);
258  QString GetRecordingGroup() const;
259  void UpdateChannelList(int GroupID);
260 
261  // Lock handling
262  OSD* GetOSDL();
263  void ReturnOSDLock() const;
264  void GetPlayerWriteLock() const;
265  void GetPlayerReadLock() const;
266  void ReturnPlayerLock() const;
267 
268  // Other toggles
269  void ToggleAutoExpire();
270  void QuickRecord();
271 
272  // General TV state
273  static bool StateIsRecording(TVState State);
274  static bool StateIsPlaying(TVState State);
275  static bool StateIsLiveTV(TVState State);
276 
277  TVState GetState() const;
278  void HandleStateChange();
279  void GetStatus();
280  void ForceNextStateNone();
281  void ScheduleStateChange();
282  void ScheduleInputChange();
283  void SetErrored();
284  void SetInPlayList(bool InPlayList) { m_inPlaylist = InPlayList; }
285  void setUnderNetworkControl(bool setting) { m_underNetworkControl = setting; }
286  void PrepToSwitchToRecordedProgram(const ProgramInfo& ProgInfo);
290  kBookmarkAuto // set iff db_playback_exit_prompt==2
291  };
292  void PrepareToExitPlayer(int Line);
293  void SetExitPlayer(bool SetIt, bool WantsTo);
294 
295  bool RequestNextRecorder(bool ShowDialogs, const ChannelInfoList &Selection = ChannelInfoList());
296  void DeleteRecorder();
297 
298  bool StartRecorder(std::chrono::milliseconds MaxWait = -1ms);
299  void StopStuff(bool StopRingBuffer, bool StopPlayer, bool StopRecorder);
300  bool StartPlayer(TVState desiredState);
301 
303  bool IsSwitchingCards() const { return m_switchToRec; }
305  bool GetAllowRerecord() const { return m_allowRerecord; }
308  bool GetEndOfRecording() const { return m_endOfRecording; }
311  bool GetJumpToProgram() const { return m_jumpToProgram; }
312  bool IsDeleteAllowed();
313 
314  // Channels
315  static void ToggleChannelFavorite();
316  void ToggleChannelFavorite(const QString &ChangroupName) const;
317  void ChangeChannel(ChannelChangeDirection Direction);
318  void ChangeChannel(uint Chanid, const QString& Channum);
319 
320  void ShowPreviousChannel();
321  void PopPreviousChannel(bool ImmediateChange);
322 
323  // key queue commands
324  void AddKeyToInputQueue(char Key);
325  void ClearInputQueues(bool Hideosd);
326  bool CommitQueuedInput();
327  bool ProcessSmartChannel(QString &InputStr);
328 
329  // query key queues
330  bool HasQueuedInput() const { return !GetQueuedInput().isEmpty(); }
331  bool HasQueuedChannel() const { return m_queuedChanID || !GetQueuedChanNum().isEmpty(); }
332 
333  // get queued up input
334  QString GetQueuedInput() const;
335  int GetQueuedInputAsInt(bool *OK = nullptr, int Base = 10) const;
336  QString GetQueuedChanNum() const;
337  uint GetQueuedChanID() const { return m_queuedChanID; }
338 
339  // Source and input
340  void SwitchSource(uint Direction);
341  void SwitchInputs(uint ChanID = 0, QString ChanNum = "", uint InputID = 0);
342 
343  // Pause/play
344  void PauseLiveTV();
345  void UnpauseLiveTV(bool Quietly = false);
346  void DoPlay();
347  float DoTogglePauseStart();
348  void DoTogglePauseFinish(float Time, bool ShowOSD);
349  void DoTogglePause(bool ShowOSD);
350  bool DoSetPauseState(bool Pause);
351  bool ContextIsPaused(const char* File, int Location);
352 
353  // Program jumping stuff
354  void SetLastProgram(const ProgramInfo* ProgInfo);
355  ProgramInfo *GetLastProgram() const;
356 
357  // Seek, skip, jump, speed
358  void DoSeek(float Time, const QString &Msg, bool TimeIsOffset, bool HonorCutlist);
359  void DoSeek(std::chrono::seconds TimeInSec, const QString &Msg, bool TimeIsOffset, bool HonorCutlist) {
360  DoSeek(TimeInSec.count(), Msg, TimeIsOffset, HonorCutlist); };
361  bool DoPlayerSeek(float Time);
362  bool DoPlayerSeekToFrame(uint64_t FrameNum);
363  enum ArbSeekWhence { ARBSEEK_SET = 0, ARBSEEK_REWIND, ARBSEEK_FORWARD, ARBSEEK_END };
364  void DoSeekAbsolute(long long Seconds, bool HonorCutlist);
365  void DoArbSeek(ArbSeekWhence Whence, bool HonorCutlist);
366  void DoJumpFFWD();
367  void DoJumpRWND();
368  void DoSeekFFWD();
369  void DoSeekRWND();
370  void NormalSpeed();
371  void ChangeSpeed(int Direction);
372  void ToggleTimeStretch();
373  void ChangeTimeStretch(int Dir, bool AllowEdit = true);
374  void DVDJumpBack();
375  void DVDJumpForward();
376  float StopFFRew();
377  void ChangeFFRew(int Direction);
378  void SetFFRew(int Index);
379 
380  // Private audio methods
381  bool AudioSyncHandleAction(const QStringList& Actions);
382 
383  // Chapters, titles and angles
384  int GetNumChapters();
385  void GetChapterTimes(QList<std::chrono::seconds> &Times);
386  int GetCurrentChapter();
387  int GetNumTitles();
388  int GetCurrentTitle();
389  std::chrono::seconds GetTitleDuration(int Title);
390  QString GetTitleName(int Title);
391  void DoSwitchTitle(int Title);
392  int GetNumAngles();
393  int GetCurrentAngle();
394  QString GetAngleName(int Angle);
395  void DoSwitchAngle(int Angle);
396  void DoJumpChapter(int Chapter);
397 
398  // Commercial skipping
399  void DoSkipCommercials(int Direction);
400  void SetAutoCommercialSkip(CommSkipMode SkipMode = kCommSkipOff);
401 
402  // Transcode
403  void DoQueueTranscode(const QString& Profile);
404 
405  // Bookmarks
406  bool IsBookmarkAllowed();
407  void SetBookmark(bool Clear = false);
408 
409  // OSD
410  void ClearOSD();
411  void ToggleOSD( bool IncludeStatusOSD);
412  void UpdateOSDProgInfo(const char *WhichInfo);
413  void UpdateOSDStatus(const QString& Title, const QString& Desc,
414  const QString& Value, int Type, const QString& Units,
415  int Position = 0, enum OSDTimeout Timeout = kOSDTimeout_Med);
416  void UpdateOSDStatus(osdInfo &Info, int Type, enum OSDTimeout Timeout);
417  void UpdateOSDSeekMessage(const QString &Msg, enum OSDTimeout Timeout);
418  void UpdateOSDInput();
419  void UpdateOSDSignal(const QStringList &List);
420  void UpdateOSDTimeoutMessage();
421  bool CalcPlayerSliderPosition(osdInfo &info, bool paddedFields = false) const;
422  void HideOSDWindow(const char *window);
423 
424  // Captions/subtitles
425  bool SubtitleZoomHandleAction(const QStringList& Actions);
426  bool SubtitleDelayHandleAction(const QStringList &Actions);
427 
428  // Video controls
429  void DoTogglePictureAttribute(PictureAdjustType Type);
430  bool PictureAttributeHandleAction(const QStringList &Actions);
431  PictureAttribute NextPictureAdjustType(PictureAdjustType Type, PictureAttribute Attr);
432  void OverrideScan(FrameScanType Scan);
433 
434  // Sundry on screen
435  void ITVRestart(bool IsLive);
436 
437  // Manual zoom mode
438  void SetManualZoom(bool ZoomON, const QString& Desc);
439  bool ManualZoomHandleAction(const QStringList &Actions);
440 
441  // Channel editing support
442  void StartChannelEditMode();
443  bool HandleOSDChannelEdit(const QString& Action);
444  void ChannelEditAutoFill(InfoMap &Info);
445  void ChannelEditXDSFill(InfoMap &Info);
446 
447  // General dialog handling
448  bool DialogIsVisible(const QString &Dialog);
449  void HandleOSDInfo(const QString& Action);
450  void ShowNoRecorderDialog(NoRecorderMsg MsgType = kNoRecorders);
451 
452  // AskAllow dialog handling
453  void ShowOSDAskAllow();
454  void HandleOSDAskAllow(const QString& Action);
455  void AskAllowRecording(const QStringList &Msg, int Timeuntil, bool HasRec, bool HasLater);
456 
457  // Program editing support
458  void ShowOSDCutpoint(const QString &Type);
459  bool HandleOSDCutpoint(const QString& Action);
460  void StartProgramEditMode();
461 
462  // Already editing dialog
463  void ShowOSDAlreadyEditing();
464  void HandleOSDAlreadyEditing(const QString& Action, bool WasPaused);
465 
466  // Sleep dialog handling
467  void ShowOSDSleep();
468  void HandleOSDSleep(const QString& Action);
469  void SleepDialogTimeout();
470 
471  // Idle dialog handling
472  void ShowOSDIdle();
473  void HandleOSDIdle(const QString& Action);
474  void IdleDialogTimeout();
475 
476  // Exit/delete dialog handling
477  void ShowOSDStopWatchingRecording();
478  void ShowOSDPromptDeleteRecording(const QString& Title, bool Force = false);
479  bool HandleOSDVideoExit(const QString& Action);
480 
481  // Navigation Dialog
482  void StartOsdNavigation();
483 
484  // Menu dialog
485  void ShowOSDMenu(bool isCompact = false);
486  void FillOSDMenuJumpRec(const QString &Category = "", int Level = 0, const QString &Selected = "");
487  void PlaybackMenuShow(const MythTVMenu &Menu, const QDomNode &Node, const QDomNode &Selected);
488  bool MenuItemDisplay(const MythTVMenuItemContext& Context, MythOSDDialogData* Menu) override;
489  bool MenuItemDisplayPlayback(const MythTVMenuItemContext& Context, MythOSDDialogData* Menu);
490  bool MenuItemDisplayCutlist(const MythTVMenuItemContext& Context, MythOSDDialogData* Menu);
491  void PlaybackMenuInit(const MythTVMenu& Menu);
492  void PlaybackMenuDeinit(const MythTVMenu& Menu);
493  static void MenuStrings();
494  void MenuLazyInit(void* Field);
495  const MythTVMenu& getMenuFromId(MenuTypeId id);
496 
497  // LCD
498  void UpdateLCD();
499  void ShowLCDChannelInfo();
500  void ShowLCDDVDInfo();
501 
502  private:
503  MythMainWindow* m_mainWindow { nullptr };
504 
505  // Configuration variables from database
506  QString m_dbChannelFormat {"<num> <sign>"};
507  std::chrono::milliseconds m_dbIdleTimeout {0ms};
508  int m_dbPlaybackExitPrompt {0};
509  uint m_dbAutoexpireDefault {0};
510  bool m_dbAutoSetWatched {false};
511  bool m_dbEndOfRecExitPrompt {false};
512  bool m_dbJumpPreferOsd {true};
513  bool m_dbUseGuiSizeForTv {false};
514  bool m_dbUseVideoModes {false};
515  bool m_dbRunJobsOnRemote {false};
516  bool m_dbContinueEmbedded {false};
517  bool m_dbBrowseAlways {false};
518  bool m_dbBrowseAllTuners {false};
519  bool m_dbUseChannelGroups {false};
520  bool m_dbRememberLastChannelGroup {false};
522 
523  bool m_smartForward {false};
524  float m_ffRewRepos {1.0F};
525  bool m_ffRewReverse {false};
526  std::vector<int> m_ffRewSpeeds;
527 
528  uint m_vbimode {VBIMode::None};
529  uint m_switchToInputId {0};
530 
533  mutable bool m_wantsToQuit {true};
534  bool m_stretchAdjustment {false};
535  bool m_audiosyncAdjustment {false};
536  bool m_subtitleZoomAdjustment {false};
537  bool m_subtitleDelayAdjustment {false};
538  bool m_zoomMode {false};
539  bool m_sigMonMode {false};
540  bool m_endOfRecording {false};
541  bool m_requestDelete {false};
542  bool m_allowRerecord {false};
543  bool m_doSmartForward {false};
544  bool m_queuedTranscode {false};
545  bool m_savePosOnExit {false};
546  bool m_clearPosOnExit {false};
547  PictureAdjustType m_adjustingPicture {kAdjustingPicture_None};
550  PictureAttribute m_adjustingPictureAttribute {kPictureAttribute_None};
551 
552  // Ask Allow state
553  QMap<QString,AskProgramInfo> m_askAllowPrograms;
554  QRecursiveMutex m_askAllowLock;
555 
557  QMap<QString,ProgramList> m_progLists;
558 
559  mutable QRecursiveMutex m_chanEditMapLock;
561 
563  static const std::vector<SleepTimerInfo> s_sleepTimes;
564  uint m_sleepIndex {0};
565  std::chrono::milliseconds m_sleepTimerTimeout {0ms};
566  int m_sleepTimerId {0};
567  int m_sleepDialogTimerId {0};
568  int m_idleTimerId {0};
570  int m_idleDialogTimerId {0};
571 
574 
575  // CC/Teletex input state variables
577  bool m_ccInputMode {false};
578 
579  // Arbitrary Seek input state variables
581  bool m_asInputMode {false};
582 
583  // Channel changing state variables
585  QString m_queuedInput;
587  mutable QString m_queuedChanNum;
589  uint m_queuedChanID {0};
591  uint m_initialChanID {0};
592 
598  static const int kScreenPressRegionCount = 12;
599  QList<QKeyEvent*> m_screenPressKeyMapPlayback;
600  QList<QKeyEvent*> m_screenPressKeyMapLiveTV;
601 
602  // Channel changing timeout notification variables
603  QElapsedTimer m_lockTimer;
604  bool m_lockTimerOn {false};
606 
607  // Program Info for currently playing video
608  // (or next video if InChangeState() is true)
609  mutable QMutex m_lastProgramLock;
610  ProgramInfo *m_lastProgram {nullptr};
611  bool m_inPlaylist {false};
612  bool m_underNetworkControl {false};
613 
614  // Program Jumping
615  bool m_jumpToProgram {false};
616 
617  // Video Player
618  PlayerContext m_playerContext { kPlayerInUseID };
619  // Ugly temporary workaround. We need a full MythPlayerInterface object but
620  // avoid endless casts
621  MythPlayerUI* m_player { nullptr };
623  mutable QReadWriteLock m_playerLock;
624 
625  bool m_noHardwareDecoders {false};
626 
627  // Remote Encoders
629  RemoteEncoder *m_switchToRec {nullptr};
630 
631  // LCD Info
632  QString m_lcdTitle;
633  QString m_lcdSubtitle;
634  QString m_lcdCallsign;
635 
636  // Window info (GUI is optional, transcoding, preview img, etc)
637  TvPlayWindow *m_myWindow {nullptr};
638  QRect m_playerBounds;
643  bool m_weDisabledGUI {false};
644 
645  // embedded and suspended status
646  bool m_ignoreKeyPresses {false};
647  bool m_savedPause {false};
648 
649  // Channel group stuff
653  mutable QMutex m_channelGroupLock;
654  volatile int m_channelGroupId {-1};
656 
657  // Network Control stuff
659 
660  // Timers
661  volatile int m_lcdTimerId {0};
662  volatile int m_lcdVolumeTimerId {0};
663  volatile int m_networkControlTimerId {0};
664  volatile int m_ccInputTimerId {0};
665  volatile int m_asInputTimerId {0};
666  volatile int m_queueInputTimerId {0};
667  volatile int m_endOfPlaybackTimerId {0};
668  volatile int m_endOfRecPromptTimerId {0};
669  volatile int m_videoExitDialogTimerId {0};
670  volatile int m_pseudoChangeChanTimerId {0};
671  volatile int m_speedChangeTimerId {0};
672  volatile int m_errorRecoveryTimerId {0};
673  mutable volatile int m_exitPlayerTimerId {0};
674  volatile int m_saveLastPlayPosTimerId {0};
675  volatile int m_signalMonitorTimerId {0};
676 
677  // Various tracks
678  // XXX This ignores kTrackTypeTextSubtitle which is greater than
679  // kTrackTypeCount, and it unnecessarily includes
680  // kTrackTypeUnknown.
681  QStringList m_tvmTracks[kTrackTypeCount];
682  int m_tvmCurtrack[kTrackTypeCount] {};
683 
684  // Audio
685  bool m_tvmAvsync {true};
686 
687  // Video
688  bool m_tvmFillAutoDetect {false};
689 
690  // Playback
691  int m_tvmSpeedX100 {100};
692  TVState m_tvmState {kState_None};
693  bool m_tvmIsRecording {false};
694  bool m_tvmIsRecorded {false};
695  bool m_tvmIsVideo {false};
696  CommSkipMode m_tvmCurSkip {kCommSkipOff};
697  bool m_tvmIsPaused {false};
698  int m_tvmFreeRecorderCount {-1};
699  bool m_tvmIsDvd {false};
700  bool m_tvmIsBd {false};
701  bool m_tvmJump {false};
702  bool m_tvmIsLiveTv {false};
703  bool m_tvmPreviousChan {false};
704 
705  // Navigate
706  int m_tvmNumChapters {0};
707  int m_tvmCurrentChapter {0};
708  QList<std::chrono::seconds> m_tvmChapterTimes;
709  int m_tvmNumAngles {0};
710  int m_tvmCurrentAngle {0};
711  int m_tvmNumTitles {0};
712  int m_tvmCurrentTitle {0};
713  // Subtitles
714  bool m_tvmSubsForcedOn {true};
715  bool m_tvmSubsHaveSubs {false};
716 
717  bool m_tvmIsOn {false};
718  bool m_tvmTranscoding {false};
719 
721  // End of playback menu state caching
722 
727 
728  public:
729  static inline const int kInitFFRWSpeed = 0; // 1x, default to normal speed
730  static inline const uint kInputKeysMax = 6; // When to start discarding early keys
731  static inline const uint kNextSource = 1;
732  static inline const uint kPreviousSource = 2;
733 
734  static inline const std::chrono::milliseconds kInputModeTimeout = 5s;
735  static inline const std::chrono::milliseconds kLCDTimeout = 1s;
736  static inline const std::chrono::milliseconds kBrowseTimeout = 30s;
737  static inline const std::chrono::milliseconds kKeyRepeatTimeout = 300ms;
738  static inline const std::chrono::milliseconds kPrevChanTimeout = 750ms;
739  static inline const std::chrono::milliseconds kSleepTimerDialogTimeout = 45s;
740  static inline const std::chrono::milliseconds kIdleTimerDialogTimeout = 45s;
741  static inline const std::chrono::milliseconds kVideoExitDialogTimeout = 2min;
742  static inline const std::chrono::milliseconds kEndOfPlaybackCheckFrequency = 250ms;
743  static inline const std::chrono::milliseconds kEmbedCheckFrequency = 250ms;
744  static inline const std::chrono::milliseconds kSpeedChangeCheckFrequency = 250ms;
745  static inline const std::chrono::milliseconds kErrorRecoveryCheckFrequency = 250ms;
746  static inline const std::chrono::milliseconds kEndOfRecPromptCheckFrequency = 250ms;
747  static inline const std::chrono::milliseconds kSaveLastPlayPosTimeout = 5s;
748 #ifdef USING_VALGRIND
749  static inline const std::chrono::milliseconds kEndOfPlaybackFirstCheckTimer = 1min;
750 #else
751  static inline const std::chrono::milliseconds kEndOfPlaybackFirstCheckTimer = 5s;
752 #endif
753 };
754 
755 #endif
kPictureAttribute_None
@ kPictureAttribute_None
Definition: videoouttypes.h:105
TV::IsSwitchingCards
bool IsSwitchingCards() const
Returns true if we are currently in the process of switching recorders.
Definition: tv_play.h:303
MythTVMenuItemDisplayer
Definition: mythtvmenu.h:76
CommSkipMode
CommSkipMode
Definition: tv.h:130
kViewSchedule
@ kViewSchedule
Definition: tv_play.h:96
TVPlaybackState
Tracks current playback state, as signalled by the player, and requests changes to the current state.
Definition: tvplaybackstate.h:12
bool
bool
Definition: pxsup2dast.c:30
TV::m_lastProgramLock
QMutex m_lastProgramLock
Definition: tv_play.h:609
tv.h
kStartTVIgnoreProgStart
@ kStartTVIgnoreProgStart
Definition: tv_play.h:115
osdInfo
Definition: playercontext.h:34
TV::m_playerLock
QReadWriteLock m_playerLock
lock on player and playerActive changes
Definition: tv_play.h:623
ChannelChangeDirection
ChannelChangeDirection
ChannelChangeDirection is an enumeration of possible channel changing directions.
Definition: tv.h:28
TV::m_ffRewSpeeds
std::vector< int > m_ffRewSpeeds
Definition: tv_play.h:526
kScheduleProgramFinder
@ kScheduleProgramFinder
Definition: tv_play.h:94
kTrackTypeCount
@ kTrackTypeCount
Definition: decoderbase.h:38
MythTimer
A QElapsedTimer based timer to replace use of QTime as a timer.
Definition: mythtimer.h:13
PictureAdjustType
PictureAdjustType
Definition: tv.h:120
TV::m_cutlistMenu
MythTVMenu m_cutlistMenu
Definition: tv_play.h:725
TV::m_keyRepeatTimer
MythTimer m_keyRepeatTimer
Queue of unprocessed key presses.
Definition: tv_play.h:573
ReloadKeys
static void ReloadKeys(void)
Definition: mythfrontend.cpp:1680
TV::DoSeek
void DoSeek(std::chrono::seconds TimeInSec, const QString &Msg, bool TimeIsOffset, bool HonorCutlist)
Definition: tv_play.h:359
TV::kBookmarkAlways
@ kBookmarkAlways
Definition: tv_play.h:288
MythTVMenuItemContext
Definition: mythtvmenu.h:49
TV::ArbSeekWhence
ArbSeekWhence
Definition: tv_play.h:363
TV::GetEndOfRecording
bool GetEndOfRecording() const
This is set to true if the player reaches the end of the recording without the user explicitly exitin...
Definition: tv_play.h:308
kStartTVInPlayList
@ kStartTVInPlayList
Definition: tv_play.h:112
TV::m_screenPressKeyMapPlayback
QList< QKeyEvent * > m_screenPressKeyMapPlayback
Definition: tv_play.h:599
kStartTVNoFlags
@ kStartTVNoFlags
Definition: tv_play.h:111
TV::HasQueuedChannel
bool HasQueuedChannel() const
Definition: tv_play.h:331
FrameScanType
FrameScanType
Definition: videoouttypes.h:94
EMBEDRETURNVOID
void(*)(void *, bool) EMBEDRETURNVOID
Definition: tv_play.h:58
osd.h
MythMediaBuffer
Definition: mythmediabuffer.h:50
VBIMode::None
@ None
Definition: tv.h:11
MythPlayer
Definition: mythplayer.h:83
TV::m_queuedInput
QString m_queuedInput
Input key presses queued up so far...
Definition: tv_play.h:585
AskProgramInfo::m_info
ProgramInfo * m_info
Definition: tv_play.h:131
mythdeque.h
TV::m_progLists
QMap< QString, ProgramList > m_progLists
Definition: tv_play.h:557
TV::kBookmarkNever
@ kBookmarkNever
Definition: tv_play.h:289
RemoteEncoder
Definition: remoteencoder.h:24
Action
An action (for this plugin) consists of a description, and a set of key sequences.
Definition: action.h:40
NoRecorderMsg
NoRecorderMsg
Type of message displayed in ShowNoRecorderDialog()
Definition: tv_play.h:103
InfoMap
QHash< QString, QString > InfoMap
Definition: mythtypes.h:15
TV::m_lockTimer
QElapsedTimer m_lockTimer
Definition: tv_play.h:603
kState_None
@ kState_None
None State, this is the initial state in both TV and TVRec, it indicates that we are ready to change ...
Definition: tv.h:58
tvbrowsehelper.h
EMBEDRETURNVOIDFINDER
void(*)(TV *, bool, bool) EMBEDRETURNVOIDFINDER
Definition: tv_play.h:60
MythPlayerUI
Definition: mythplayerui.h:10
TV::m_tvmChapterTimes
QList< std::chrono::seconds > m_tvmChapterTimes
Definition: tv_play.h:708
TV::m_dbChannelGroups
ChannelGroupList m_dbChannelGroups
Definition: tv_play.h:521
TV::m_channelGroupChannelList
ChannelInfoList m_channelGroupChannelList
Definition: tv_play.h:655
AskProgramInfo::AskProgramInfo
AskProgramInfo(QDateTime e, bool r, bool l, ProgramInfo *i)
Definition: tv_play.h:123
Command
Definition: gamesettings.cpp:233
TV::BookmarkAction
BookmarkAction
Definition: tv_play.h:287
TV::m_cutlistCompactMenu
MythTVMenu m_cutlistCompactMenu
Definition: tv_play.h:726
OSDTimeout
OSDTimeout
Definition: osd.h:55
kScheduleProgramGuide
@ kScheduleProgramGuide
Definition: tv_play.h:93
MythOSDDialogData
Definition: osd.h:64
TV::m_chanEditMap
InfoMap m_chanEditMap
Channel Editing initial map.
Definition: tv_play.h:560
AskProgramInfo::m_isConflicting
bool m_isConflicting
Definition: tv_play.h:130
videoouttypes.h
tvplaybackstate.h
EMBEDRETURNVOIDSCHEDIT
void(*)(const ProgramInfo *, void *) EMBEDRETURNVOIDSCHEDIT
Definition: tv_play.h:61
TV::m_chanEditMapLock
QRecursiveMutex m_chanEditMapLock
Lock for chanEditMap and ddMap.
Definition: tv_play.h:559
Event
Event details.
Definition: zmdefines.h:26
kPlaybackBox
@ kPlaybackBox
Definition: tv_play.h:97
kStartTVIgnoreBookmark
@ kStartTVIgnoreBookmark
Definition: tv_play.h:114
TV::setUnderNetworkControl
void setUnderNetworkControl(bool setting)
Definition: tv_play.h:285
TV::SleepTimerInfo
Definition: tv_play.cpp:938
AskProgramInfo::m_expiry
QDateTime m_expiry
Definition: tv_play.h:126
TVBrowseHelper::m_dbUseChannelGroups
bool m_dbUseChannelGroups
Definition: tvbrowsehelper.h:78
kScheduledRecording
@ kScheduledRecording
Definition: tv_play.h:95
State
State
Definition: zmserver.h:68
TVBrowseHelper::m_dbBrowseAllTuners
bool m_dbBrowseAllTuners
Definition: tvbrowsehelper.h:77
kNoRecorders
@ kNoRecorders
No free recorders.
Definition: tv_play.h:105
TV::m_playbackCompactMenu
MythTVMenu m_playbackCompactMenu
Definition: tv_play.h:724
GuideGrid
Definition: guidegrid.h:101
TV::m_queuedChanNum
QString m_queuedChanNum
Input key presses queued up so far to form a valid ChanNum.
Definition: tv_play.h:587
TV::m_savedGuiBounds
QRect m_savedGuiBounds
Definition: tv_play.h:641
GetState
#define GetState(a, b)
Definition: audiooutputopensles.cpp:55
ChannelGroupList
std::vector< ChannelGroupItem > ChannelGroupList
Definition: channelgroup.h:31
scheduleEditTypes
scheduleEditTypes
Definition: tv_play.h:92
uint
unsigned int uint
Definition: compat.h:81
EMBEDRETURNVOIDEPG
void(*)(uint, const QString &, const QDateTime, TV *, bool, bool, int) EMBEDRETURNVOIDEPG
Definition: tv_play.h:59
MenuTypeId
MenuTypeId
Definition: mythtvmenu.h:36
TVBrowseHelper
Definition: tvbrowsehelper.h:45
TV::m_askAllowLock
QRecursiveMutex m_askAllowLock
Definition: tv_play.h:554
referencecounter.h
PictureAttribute
PictureAttribute
Definition: videoouttypes.h:103
volumebase.h
TV::HasQueuedInput
bool HasQueuedInput() const
Definition: tv_play.h:330
MTV_PUBLIC
#define MTV_PUBLIC
Definition: mythtvexp.h:15
AskProgramInfo::m_hasLater
bool m_hasLater
Definition: tv_play.h:128
channelinfo.h
PlaybackBox
Definition: playbackbox.h:63
Channum
Definition: channelsettings.cpp:81
ProgramInfo
Holds information on recordings and videos.
Definition: programinfo.h:67
channelgroup.h
TV::s_sleepTimes
static const std::vector< SleepTimerInfo > s_sleepTimes
Definition: tv_play.h:562
AskProgramInfo::AskProgramInfo
AskProgramInfo()=default
TV::m_lastLockSeenTime
QDateTime m_lastLockSeenTime
Definition: tv_play.h:605
TV::m_progListsLock
QMutex m_progListsLock
Definition: tv_play.h:556
TVState
TVState
TVState is an enumeration of the states used by TV and TVRec.
Definition: tv.h:50
MythTVMenuItemDisplayer::MenuItemDisplay
virtual bool MenuItemDisplay(const MythTVMenuItemContext &Context, MythOSDDialogData *Menu)=0
Clear
#define Clear(a)
Definition: audiooutputopensles.cpp:54
playercontext.h
kPlayerInUseID
const QString kPlayerInUseID
Definition: programtypes.cpp:16
AskProgramInfo::m_hasRec
bool m_hasRec
Definition: tv_play.h:127
mythtvmenu.h
Name
Definition: channelsettings.cpp:71
TV::m_tvmJumprecBackHack
QVariant m_tvmJumprecBackHack
Definition: tv_play.h:720
MythDeque< QString >
std
Definition: mythchrono.h:23
ProgInfo
Definition: programdata.h:226
TVRec
This is the coordinating class of the Recorder Subsystem.
Definition: tv_rec.h:142
AskProgramInfo::m_isInSameInputGroup
bool m_isInSameInputGroup
Definition: tv_play.h:129
TV::m_lcdCallsign
QString m_lcdCallsign
Definition: tv_play.h:634
kStartTVIgnoreLastPlayPos
@ kStartTVIgnoreLastPlayPos
Definition: tv_play.h:116
MythTVMenu
Definition: mythtvmenu.h:83
decoderbase.h
TVBrowseHelper::TV
friend class TV
Definition: tvbrowsehelper.h:47
TV::m_lcdTitle
QString m_lcdTitle
Definition: tv_play.h:632
OK
static constexpr int OK
Definition: dvbci.cpp:69
TV::m_channelGroupLock
QMutex m_channelGroupLock
Lock necessary when modifying channel group variables.
Definition: tv_play.h:653
PlayerContext
Definition: playercontext.h:49
inputinfo.h
TV::m_screenPressKeyMapLiveTV
QList< QKeyEvent * > m_screenPressKeyMapLiveTV
Definition: tv_play.h:600
TV::m_playbackMenu
MythTVMenu m_playbackMenu
Definition: tv_play.h:723
mythtimer.h
TV::SetInPlayList
void SetInPlayList(bool InPlayList)
Definition: tv_play.h:284
MythGestureEvent
A custom event that represents a mouse gesture.
Definition: mythgesture.h:39
kCommSkipOff
@ kCommSkipOff
Definition: tv.h:132
Player
Definition: zmliveplayer.h:34
TV::GetAllowRerecord
bool GetAllowRerecord() const
Returns true if the user told Mythtv to allow re-recording of the show.
Definition: tv_play.h:305
TvPlayWindow
Simple screen shown while the video player is starting up.
Definition: tv_play_win.h:12
kStartTVByNetworkCommand
@ kStartTVByNetworkCommand
Definition: tv_play.h:113
kAdjustingPicture_None
@ kAdjustingPicture_None
Definition: tv.h:122
TV::m_networkControlCommands
MythDeque< QString > m_networkControlCommands
Definition: tv_play.h:658
TV::m_lcdSubtitle
QString m_lcdSubtitle
Definition: tv_play.h:633
kOSDTimeout_Med
@ kOSDTimeout_Med
Definition: osd.h:60
TV::GetQueuedChanID
uint GetQueuedChanID() const
Definition: tv_play.h:337
OSD
Definition: osd.h:93
MythMainWindow
Definition: mythmainwindow.h:28
ReferenceCounter
General purpose reference counter.
Definition: referencecounter.h:26
kNoCurrRec
@ kNoCurrRec
No current recordings.
Definition: tv_play.h:106
TV::GetJumpToProgram
bool GetJumpToProgram() const
This is set if the user asked MythTV to jump to the previous recording in the playlist.
Definition: tv_play.h:311
TV::m_askAllowPrograms
QMap< QString, AskProgramInfo > m_askAllowPrograms
Definition: tv_play.h:553
InitKeys
static void InitKeys(void)
Definition: mythfrontend.cpp:1628
TV
Control TV playback.
Definition: tv_play.h:152
ChannelInfoList
std::vector< ChannelInfo > ChannelInfoList
Definition: channelinfo.h:131
AskProgramInfo
Definition: tv_play.h:119
kNoTuners
@ kNoTuners
No capture cards configured.
Definition: tv_play.h:107