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 };