File indexing completed on 2024-05-12 16:21:27
0001 /** 0002 * SPDX-FileCopyrightText: 2017 (c) Matthieu Gallien <matthieu_gallien@yahoo.fr> 0003 * SPDX-FileCopyrightText: 2021-2023 Bart De Vries <bart@mogwai.be> 0004 * 0005 * SPDX-License-Identifier: LGPL-3.0-or-later 0006 */ 0007 0008 #pragma once 0009 0010 #include <kmediasession/kmediasession.h> 0011 #include <memory> 0012 0013 #include <QObject> 0014 #include <QString> 0015 #include <QUrl> 0016 0017 #include <KFormat> 0018 0019 #include "entry.h" 0020 #include "error.h" 0021 0022 class AudioManagerPrivate; 0023 0024 class AudioManager : public QObject 0025 { 0026 Q_OBJECT 0027 0028 Q_PROPERTY(KMediaSession::MediaBackends currentBackend READ currentBackend WRITE setCurrentBackend NOTIFY currentBackendChanged) 0029 Q_PROPERTY(QList<KMediaSession::MediaBackends> availableBackends READ availableBackends CONSTANT) 0030 0031 Q_PROPERTY(Entry *entry READ entry WRITE setEntry NOTIFY entryChanged) 0032 Q_PROPERTY(bool muted READ muted WRITE setMuted NOTIFY mutedChanged) 0033 Q_PROPERTY(qreal volume READ volume WRITE setVolume NOTIFY volumeChanged) 0034 Q_PROPERTY(KMediaSession::MediaStatus status READ status NOTIFY statusChanged) 0035 Q_PROPERTY(KMediaSession::PlaybackState playbackState READ playbackState NOTIFY playbackStateChanged) 0036 Q_PROPERTY(qreal playbackRate READ playbackRate WRITE setPlaybackRate NOTIFY playbackRateChanged) 0037 Q_PROPERTY(KMediaSession::Error error READ error NOTIFY errorChanged) 0038 Q_PROPERTY(qint64 duration READ duration NOTIFY durationChanged) 0039 Q_PROPERTY(qint64 position READ position WRITE setPosition NOTIFY positionChanged) 0040 Q_PROPERTY(bool seekable READ seekable NOTIFY seekableChanged) 0041 Q_PROPERTY(bool canPlay READ canPlay NOTIFY canPlayChanged) 0042 Q_PROPERTY(bool canSkipForward READ canSkipForward NOTIFY canSkipForwardChanged) 0043 Q_PROPERTY(bool canSkipBackward READ canSkipBackward NOTIFY canSkipBackwardChanged) 0044 Q_PROPERTY(bool canGoNext READ canGoNext NOTIFY canGoNextChanged) 0045 Q_PROPERTY(QString formattedLeftDuration READ formattedLeftDuration NOTIFY positionChanged) 0046 Q_PROPERTY(QString formattedDuration READ formattedDuration NOTIFY durationChanged) 0047 Q_PROPERTY(QString formattedPosition READ formattedPosition NOTIFY positionChanged) 0048 Q_PROPERTY(qint64 sleepTime READ sleepTime WRITE setSleepTimer RESET stopSleepTimer NOTIFY sleepTimerChanged) 0049 Q_PROPERTY(qint64 remainingSleepTime READ remainingSleepTime NOTIFY remainingSleepTimeChanged) 0050 Q_PROPERTY(QString formattedRemainingSleepTime READ formattedRemainingSleepTime NOTIFY remainingSleepTimeChanged) 0051 Q_PROPERTY(bool isStreaming READ isStreaming NOTIFY isStreamingChanged) 0052 0053 public: 0054 static AudioManager &instance() 0055 { 0056 static AudioManager _instance; 0057 return _instance; 0058 } 0059 0060 ~AudioManager() override; 0061 0062 [[nodiscard]] Q_INVOKABLE QString backendName(KMediaSession::MediaBackends backend) const; 0063 [[nodiscard]] KMediaSession::MediaBackends currentBackend() const; 0064 [[nodiscard]] QList<KMediaSession::MediaBackends> availableBackends() const; 0065 0066 [[nodiscard]] Entry *entry() const; 0067 [[nodiscard]] bool muted() const; 0068 [[nodiscard]] qreal volume() const; 0069 [[nodiscard]] QUrl source() const; 0070 [[nodiscard]] KMediaSession::MediaStatus status() const; 0071 [[nodiscard]] KMediaSession::PlaybackState playbackState() const; 0072 [[nodiscard]] qreal playbackRate() const; 0073 [[nodiscard]] qreal minimumPlaybackRate() const; 0074 [[nodiscard]] qreal maximumPlaybackRate() const; 0075 [[nodiscard]] KMediaSession::Error error() const; 0076 [[nodiscard]] qint64 duration() const; 0077 [[nodiscard]] qint64 position() const; 0078 [[nodiscard]] bool seekable() const; 0079 [[nodiscard]] bool canPlay() const; 0080 [[nodiscard]] bool canPause() const; 0081 [[nodiscard]] bool canSkipForward() const; 0082 [[nodiscard]] bool canSkipBackward() const; 0083 [[nodiscard]] bool canGoNext() const; 0084 0085 QString formattedDuration() const; 0086 QString formattedLeftDuration() const; 0087 QString formattedPosition() const; 0088 0089 qint64 sleepTime() const; // returns originally set sleep time 0090 qint64 remainingSleepTime() const; // returns remaining sleep time 0091 QString formattedRemainingSleepTime() const; 0092 0093 bool isStreaming() const; 0094 0095 Q_SIGNALS: 0096 void currentBackendChanged(KMediaSession::MediaBackends backend); 0097 0098 void entryChanged(Entry *entry); 0099 void mutedChanged(bool muted); 0100 void volumeChanged(); 0101 void sourceChanged(); 0102 void statusChanged(KMediaSession::MediaStatus status); 0103 void playbackStateChanged(KMediaSession::PlaybackState state); 0104 void playbackRateChanged(qreal rate); 0105 void errorChanged(KMediaSession::Error error); 0106 void durationChanged(qint64 duration); 0107 void positionChanged(qint64 position); 0108 void seekableChanged(bool seekable); 0109 void canPlayChanged(); 0110 void canPauseChanged(); 0111 void canSkipForwardChanged(); 0112 void canSkipBackwardChanged(); 0113 void canGoNextChanged(); 0114 0115 void sleepTimerChanged(qint64 duration); 0116 void remainingSleepTimeChanged(qint64 duration); 0117 0118 void isStreamingChanged(); 0119 0120 void logError(Error::Type type, const QString &url, const QString &id, const int errorId, const QString &errorString, const QString &title); 0121 0122 // mpris2 signals 0123 void raiseWindowRequested(); 0124 void quitRequested(); 0125 0126 public Q_SLOTS: 0127 void setCurrentBackend(KMediaSession::MediaBackends backend); 0128 0129 void setEntry(Entry *entry); 0130 void setMuted(bool muted); 0131 void setVolume(qreal volume); 0132 void setPosition(qint64 position); 0133 void setPlaybackRate(qreal rate); 0134 void play(); 0135 void pause(); 0136 void playPause(); 0137 void stop(); 0138 void seek(qint64 position); 0139 void skipBackward(); 0140 void skipForward(); 0141 void next(); 0142 0143 void setSleepTimer(qint64 duration); 0144 void stopSleepTimer(); 0145 0146 private Q_SLOTS: 0147 0148 void mediaStatusChanged(); 0149 void playerDurationChanged(qint64 duration); 0150 void playerMutedChanged(); 0151 void playerVolumeChanged(); 0152 void savePlayPosition(); 0153 void setEntryInfo(Entry *entry); 0154 void prepareAudio(const QUrl &loadUrl); 0155 void checkForPendingSeek(); 0156 void updateMetaData(); 0157 0158 private: 0159 explicit AudioManager(QObject *parent = nullptr); 0160 0161 friend class AudioManagerPrivate; 0162 0163 std::unique_ptr<AudioManagerPrivate> d; 0164 KFormat m_kformat; 0165 };