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