File indexing completed on 2024-05-19 05:49:39

0001 /*
0002  * Copyright 2023 by Aditya Mehra <aix.m@outlook.com>
0003  *
0004  * Licensed under the Apache License, Version 2.0 (the "License");
0005  * you may not use this file except in compliance with the License.
0006  * You may obtain a copy of the License at
0007  *
0008  *    http://www.apache.org/licenses/LICENSE-2.0
0009  *
0010  * Unless required by applicable law or agreed to in writing, software
0011  * distributed under the License is distributed on an "AS IS" BASIS,
0012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
0013  * See the License for the specific language governing permissions and
0014  * limitations under the License.
0015  *
0016  */
0017 
0018 #ifndef MEDIASERVICE_H
0019 #define MEDIASERVICE_H
0020 
0021 #include <QObject>
0022 #include <QVariant>
0023 #include <QNetworkAccessManager>
0024 #include <QNetworkRequest>
0025 #include <QNetworkReply>
0026 #include <QEventLoop>
0027 
0028 #include <QVideoSink>
0029 #include <QQmlEngine>
0030 
0031 #include "mycroftcontroller.h"
0032 #include "mediaproviders/audioproviderservice.h"
0033 #include "mediaproviders/videoproviderservice.h"
0034 
0035 class MediaService : public QObject
0036 {
0037     Q_OBJECT
0038     Q_PROPERTY(MediaService::MediaState mediaState READ serviceMediaState NOTIFY mediaStateChanged)
0039     Q_PROPERTY(MediaService::PlaybackState playbackState READ servicePlayBackState NOTIFY playbackStateChanged)
0040     Q_PROPERTY(QVector<double> spectrum READ spectrum NOTIFY spectrumChanged)
0041 
0042 public:
0043     enum PlaybackState {
0044         PlayingState = 1,
0045         PausedState = 2,
0046         StoppedState = 0
0047     };
0048 
0049     enum MediaState {
0050         NoMedia = 0,
0051         LoadingMedia = 1,
0052         LoadedMedia = 2,
0053         StalledMedia = 3,
0054         BufferingMedia = 4,
0055         BufferedMedia = 5,
0056         EndOfMedia = 6,
0057         InvalidMedia = 7
0058     };
0059 
0060     enum ProviderServiceType {
0061         AudioProvider = 102,
0062         VideoProvider = 101,
0063         NoProvider = 100
0064     };
0065 
0066     enum UnloadStateReason {
0067         MediaFinished = 0,
0068         MediaChanged = 1,
0069         MediaStopped = 2,
0070         ServiceUnloaded = 3
0071     };
0072 
0073     Q_ENUM(PlaybackState)
0074     Q_ENUM(MediaState)
0075     Q_ENUM(ProviderServiceType)
0076     Q_ENUM(UnloadStateReason)
0077 
0078     explicit MediaService(QObject *parent = nullptr);
0079     void initializeAudioProvider();
0080     void initializeVideoProvider();
0081     void unloadAudioProvider(MediaService::UnloadStateReason reason);
0082     void unloadVideoProvider(MediaService::UnloadStateReason reason);
0083     void changeProvider(MediaService::ProviderServiceType serviceType);
0084     void syncStates();
0085     bool evaluateUrl(const QString &url);
0086     Q_INVOKABLE MediaService::PlaybackState servicePlayBackState() const;
0087     Q_INVOKABLE MediaService::MediaState serviceMediaState() const;
0088     QVideoSink* videoSink() const;
0089     void setVideoSink(QVideoSink *newVideoSink);
0090     QObject* videoOutput() const;
0091     void setVideoOutput(QObject *newVideoOutput);
0092 
0093     // AudioProvider Specific Expose To QML
0094     QVector<double> spectrum() const;
0095 
0096 public Q_SLOTS:
0097     void mediaLoadUrl(const QString &url, MediaService::ProviderServiceType serviceType);
0098     void mediaStop();
0099     void mediaPause();
0100     void mediaContinue();
0101     void mediaRestart();
0102     void mediaNext();
0103     void mediaPrevious();
0104     void mediaShuffle();
0105     void mediaRepeat();
0106     void mediaSeek(qint64 seekValue);
0107     QVariant requestServiceInfo(QString &serviceInfoType);
0108     QVariantMap requestServiceMetaData();
0109     QVariantMap requestCommonPlayMetaData();
0110     void updateDuration(qint64 duration);
0111     void updatePosition(qint64 position);
0112 
0113     // AudioProvider Specific Expose To QML
0114     void updateSpectrum(QVector<double> spectrum);
0115     void audioServiceEndOfMedia();
0116     void emitEndOfMedia();
0117 
0118     // VideoProvider Specific Expose To QML
0119     void videoServiceEndOfMedia();
0120 
0121 signals:
0122     void videoSinkChanged();
0123     void videoOutputChanged();
0124 
0125 Q_SIGNALS:
0126     void playbackStateChanged(MediaService::PlaybackState playbackState);
0127     void mediaStateChanged(MediaService::MediaState mediaState);
0128     void providerServiceTypeChanged(MediaService::ProviderServiceType serviceType);
0129     void mediaLoadUrlRequested();
0130     void mediaPauseRequested();
0131     void mediaStopRequested();
0132     void mediaContinueRequested();
0133     void mediaRestartRequested();
0134     void mediaNextRequested();
0135     void mediaPreviousRequested();
0136     void mediaShuffleRequested();
0137     void mediaRepeatRequested();
0138     void metaDataReceived();
0139     void metaDataUpdated();
0140     void audioProviderInitialized();
0141     void videoProviderInitialized();
0142     void audioProviderUnloaded();
0143     void videoProviderUnloaded();
0144     void durationChanged(qint64 dur);
0145     void positionChanged(qint64 pos);
0146 
0147     // AudioProvider Specific Expose To QML
0148     void spectrumChanged(QVector<double> spectrum);
0149 
0150 private slots:
0151     void updatePlaybackStateAudioProvider(AudioProviderService::PlaybackState playbackState);
0152     void updateMediaStateAudioProvider(AudioProviderService::MediaState mediaState);
0153     void updatePlaybackStateVideoProvider(VideoProviderService::PlaybackState playbackState);
0154     void updateMediaStateVideoProvider(VideoProviderService::MediaState mediaState);
0155 
0156 private:
0157     ProviderServiceType m_selectedProviderService;
0158     PlaybackState m_currentPlaybackState;
0159     MediaState m_currentMediaState;
0160     AudioProviderService *m_audioProviderService;
0161     VideoProviderService *m_videoProviderService;
0162     UnloadStateReason m_unloadReason;
0163     QPointer<QVideoSink> m_videoSink;
0164     QPointer<QObject> m_videoOutput;
0165 
0166     MycroftController *m_controller;
0167     void onMainSocketIntentReceived(const QString &type, const QVariantMap &data);
0168 
0169     QString m_loadedUrl;
0170     QString m_receivedUrl;
0171     QString m_artist;
0172     QString m_album;
0173     QString m_title;
0174     QString m_thumbnail;
0175     bool m_repeat;
0176     QVariantMap m_emptyData;
0177     QVariantMap m_serviceMetaData;
0178     QVariantMap m_playbackStateSync;
0179     QVariantMap m_mediaStateSync;
0180 
0181     // AudioProvider Specific Expose To QML
0182     QVector<double> m_spectrum;
0183 
0184     bool m_audioServiceProviderInitialized;
0185     bool m_videoServiceProviderInitialized;
0186     bool m_unloadingAudioService;
0187     bool m_unloadingVideoService;
0188 };
0189 
0190 #endif // MEDIASERVICE_H