1 #ifndef MANAGER_H
2 #define MANAGER_H
3 // A simple playback manager designed to control the MainWindow like it were a
4 // widget.  Due to needing to communicate with the playlists, it sort of takes
5 // control of the mpv widget away from its host.
6 
7 
8 #include <QObject>
9 #include <QList>
10 #include <QUrl>
11 #include <QUuid>
12 #include <QSize>
13 #include <QVariant>
14 #include "helpers.h"
15 
16 class MpvObject;
17 class PlaylistWindow;
18 
19 class PlaybackManager : public QObject
20 {
21     Q_OBJECT
22 public:
23     enum PlaybackState { StoppedState, PausedState, PlayingState,
24                          BufferingState, WaitingState };
25     enum PlaybackType { None, File, Disc, Stream, Device };
26 
27     explicit PlaybackManager(QObject *parent = nullptr);
28     void setMpvObject(MpvObject *mpvObject, bool makeConnections = false);
29     void setPlaylistWindow(PlaylistWindow *playlistWindow);
30     QUrl nowPlaying();
31     PlaybackState playbackState();
32 
33 signals:
34     void playerSettingsRequested();
35     void timeChanged(double time, double length);
36     void titleChanged(QString title);
37     void chapterTitleChanged(QString title);
38     void videoSizeChanged(QSize size);
39     void stateChanged(PlaybackManager::PlaybackState state);
40     void typeChanged(PlaybackManager::PlaybackType type);
41     // Transmit a map of chapter index to time,description pairs
42     void chaptersAvailable(QList<QPair<double,QString>> chapters);
43     // These signals transmit a list of (id, description) pairs
44     void audioTracksAvailable(QList<QPair<int64_t,QString>> tracks);
45     void videoTracksAvailable(QList<QPair<int64_t,QString>> tracks);
46     void subtitleTracksAvailable(QList<QPair<int64_t,QString>> tracks);
47     void hasNoVideo(bool empty);
48     void hasNoAudio(bool empty);
49     void hasNoSubtitles(bool empty);
50     void subtitlesVisibile(bool visible);
51     void nowPlayingChanged(QUrl itemUrl, QUuid listUuid, QUuid itemUuid);
52     void finishedPlaying(QUuid item);
53     void afterPlaybackReset();
54     void instanceShouldClose();
55     void systemShouldShutdown();
56     void systemShouldLogOff();
57     void systemShouldLock();
58     void systemShouldStandby();
59     void systemShouldHibernate();
60     void currentTrackInfo(TrackInfo track);
61 
62     void fpsChanged(double fps);
63     void avsyncChanged(double sync);
64     void displayFramedropsChanged(int64_t count);
65     void decoderFramedropsChanged(int64_t count);
66     void audioBitrateChanged(double bitrate);
67     void videoBitrateChanged(double bitrate);
68 
69 public slots:
70     // load functions
71     void openSeveralFiles(QList<QUrl> what, bool important = false);
72     void openFile(QUrl what, QUrl with = QUrl());
73 
74     void playDiscFiles(QUrl where);             // from dvd/bd open
75     void playStream(QUrl stream);               // from menu
76     void playItem(QUuid playlist, QUuid item);  // called by playlistwindow
77     void playDevice(QUrl device);   // I don't have a device to test this
78 
79     void loadSubtitle(QUrl with);
80 
81     // control functions
82     void playPlayer();
83     void startPlayer();
84     void playPausePlayer();
85     void pausePlayer();
86     void unpausePlayer();
87     void stopPlayer();
88     void stepBackward();
89     void stepForward();
90     void navigateToNextChapter();
91     void navigateToPrevChapter();
92     void playNext();
93     void playPrev();
94     void repeatThisFile();
95     void deltaExtraPlaytimes(int delta);
96     void navigateToChapter(int64_t chapter);
97     void navigateToTime(double time);
98     void speedUp();
99     void speedDown();
100     void speedReset();
101     void relativeSeek(bool forwards, bool isSmall);
102 
103     // output functions
104     void setPlaybackSpeed(double speed);
105     void setSpeedStep(double step);
106     void setSpeedStepAdditive(bool isAdditive);
107     void setStepTimeLarge(int largeMsec);
108     void setStepTimeSmall(int smallMsec);
109     void setAudioTrack(int64_t id);
110     void setSubtitleTrack(int64_t id);
111     void setVideoTrack(int64_t id);
112     void setSubtitleEnabled(bool enabled);
113     void selectNextSubtitle();
114     void selectPrevSubtitle();
115     void setVolume(int64_t volume);
116     void setMute(bool muted);
117     void setAfterPlaybackOnce(Helpers::AfterPlayback mode);
118     void setAfterPlaybackAlways(Helpers::AfterPlayback mode);
119     void setSubtitlesPreferDefaultForced(bool forced);
120     void setSubtitlesPreferExternal(bool external);
121     void setSubtitlesIgnoreEmbedded(bool ignore);
122 
123     // playback options
124     void setPlaybackPlayTimes(int times);
125     void setPlaybackForever(bool yes);
126     void setFolderFallback(bool yes);
127 
128     // misc functions
129     void sendCurrentTrackInfo();
130 
131 private:
132     void startPlayWithUuid(QUrl what, QUuid playlistUuid, QUuid itemUuid,
133                            bool isRepeating, QUrl with = QUrl());
134     void selectDesiredTracks();
135     void updateSubtitleTrack();
136     void checkAfterPlayback(bool playlistMode);
137     void playNextTrack();
138     void playPrevTrack();
139     bool playNextFileUrl(QUrl url, int delta = 1);
140     void playNextFile(int delta = 1);
141     void playPrevFile();
142     void playHalt();
143 
144 private slots:
145     void mpvw_playTimeChanged(double time);
146     void mpvw_playLengthChanged(double length);
147     void mpvw_seekableChanged(bool yes);
148     void mpvw_playbackLoading();
149     void mpvw_playbackStarted();
150     void mpvw_pausedChanged(bool yes);
151     void mpvw_playbackIdling();
152     void mpvw_mediaTitleChanged(QString title);
153     void mpvw_chapterDataChanged(QVariantMap metadata);
154     void mpvw_chaptersChanged(QVariantList chapters);
155     void mpvw_tracksChanged(QVariantList tracks);
156     void mpvw_videoSizeChanged(QSize size);
157     void mpvw_fpsChanged(double fps);
158     void mpvw_avsyncChanged(double sync);
159     void mpvw_displayFramedropsChanged(int64_t count);
160     void mpvw_decoderFramedropsChanged(int64_t count);
161     void mpvw_metadataChanged(QVariantMap metadata);
162     void mpvw_playlistChanged(const QVariantList &playlist);
163     void mpvw_audioBitrateChanged(double bitrate);
164     void mpvw_videoBitrateChanged(double bitrate);
165 
166 private:
167     MpvObject *mpvObject_ = nullptr;
168     PlaylistWindow *playlistWindow_ = nullptr;
169     QUrl  nowPlaying_;
170     QUuid nowPlayingList;
171     QUuid nowPlayingItem;
172     QString nowPlayingTitle;
173 
174     double mpvStartTime = -1.0;
175     double mpvTime = 0.0;
176     double mpvLength = 0.0;
177     double mpvSpeed = 1.0;
178     double speedStep = 2.0;
179     bool speedStepAdditive = true;
180     double stepTimeLarge = 5.0;
181     double stepTimeSmall = 1.0;
182     PlaybackState playbackState_ = StoppedState;
183     PlaybackState playbackStartState = PlayingState;
184 
185     QList<QPair<int64_t,QString>> videoList;
186     QList<QPair<int64_t,QString>> audioList;
187     QList<QPair<int64_t,QString>> subtitleList;
188     QMap<int64_t,QVariantMap> subtitleListData;
189 
190     QString videoListSelected;
191     QString audioListSelected;
192     QString subtitleListSelected;
193     int64_t subtitleTrackSelected = 1;
194     bool subtitleEnabled = true;
195     bool subtitlesIgnoreEmbedded = false;
196     bool subtitlesPreferDefaultForced = false;
197     bool subtitlesPreferExternal = false;
198     int numChapters = 0;
199 
200     int playbackPlayTimes = 1;
201     bool playbackStartPaused = false;
202     bool playbackForever = false;
203     bool folderFallback = false;
204 
205     Helpers::AfterPlayback afterPlaybackOnce = Helpers::DoNothingAfter;
206     Helpers::AfterPlayback afterPlaybackAlways = Helpers::DoNothingAfter;
207 };
208 
209 #endif // MANAGER_H
210