File indexing completed on 2025-03-16 05:18:27
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