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