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