Music Hub  ..
A session-wide music playback service
engine.h
Go to the documentation of this file.
1 /*
2  * Copyright © 2013-2014 Canonical Ltd.
3  * Copyright © 2022 UBports Foundation.
4  *
5  * Contact: Alberto Mardegan <mardy@users.sourceforge.net>
6  *
7  * This program is free software: you can redistribute it and/or modify it
8  * under the terms of the GNU Lesser General Public License version 3,
9  * as published by the Free Software Foundation.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this program. If not, see <http://www.gnu.org/licenses/>.
18  *
19  * Authored by: Thomas Voß <thomas.voss@canonical.com>
20  * Jim Hodapp <jim.hodapp@canonical.com>
21  */
22 #ifndef LOMIRI_MEDIAHUBSERVICE_ENGINE_H
23 #define LOMIRI_MEDIAHUBSERVICE_ENGINE_H
24 
25 #include "player.h"
26 #include "track.h"
27 
28 #include <QObject>
29 #include <QPair>
30 #include <QSharedPointer>
31 #include <QSize>
32 #include <QUrl>
33 #include <QVariantMap>
34 
35 #include <chrono>
36 
37 class QSize;
38 
39 namespace lomiri
40 {
41 namespace MediaHubService
42 {
43 class EnginePrivate;
44 class Engine: public QObject
45 {
46  Q_OBJECT
47 
48 public:
49 
50  enum class State
51  {
52  no_media,
53  ready,
54  busy,
55  playing,
56  paused,
57  stopped
58  };
59  Q_ENUM(State)
60 
62  {
63  public:
64  typedef std::function<void(const QVariantMap &)> Callback;
65  virtual void meta_data_for_track_with_uri(const QUrl &uri,
66  const Callback &cb) = 0;
67 
68  protected:
69  MetaDataExtractor() = default;
70  MetaDataExtractor(const MetaDataExtractor&) = delete;
71  virtual ~MetaDataExtractor() = default;
72 
73  MetaDataExtractor& operator=(const MetaDataExtractor&) = delete;
74  };
75 
76  Engine(QObject *parent = nullptr);
77  virtual ~Engine();
78 
79  const QSharedPointer<MetaDataExtractor> &metadataExtractor() const;
80 
81  virtual bool open_resource_for_uri(const QUrl &uri, bool do_pipeline_reset) = 0;
82  virtual bool open_resource_for_uri(const QUrl &uri, const Player::HeadersType&) = 0;
83  // Throws lomiri::MediaHubService::Player::Error::OutOfProcessBufferStreamingNotSupported if the implementation does not
84  // support this feature.
85  virtual void create_video_sink(uint32_t texture_id) = 0;
86 
87  virtual bool play() = 0;
88  virtual bool stop() = 0;
89  virtual bool pause() = 0;
90  virtual bool seek_to(const std::chrono::microseconds& ts) = 0;
91 
92  State state() const;
93 
94  bool isVideoSource() const;
95  bool isAudioSource() const;
96 
97  virtual uint64_t position() const = 0;
98  virtual uint64_t duration() const = 0;
99 
102 
104  Player::Lifetime lifetime() const;
105 
107  QPair<QUrl,Track::MetaData> trackMetadata() const;
109  QSize videoDimension() const;
110 
111  void setVolume(double volume);
112  double volume() const;
113 
114  virtual void reset() = 0;
115 
116 Q_SIGNALS:
117  void stateChanged();
118 
119  void isVideoSourceChanged();
120  void isAudioSourceChanged();
121 
122  // TODO These two are actually not emitted, decide whether to remove them
123  void positionChanged();
124  void durationChanged();
125 
126  void orientationChanged();
127 
128  void trackMetadataChanged();
129 
130  void aboutToFinish();
131  void seekedTo(uint64_t offset);
132  void clientDisconnected();
133  void endOfStream();
134  void playbackStatusChanged();
135  void videoDimensionChanged();
136  void errorOccurred(Player::Error error);
137  void bufferingChanged(int);
138 
139 protected:
140  void setMetadataExtractor(const QSharedPointer<MetaDataExtractor> &extractor);
141  void setState(State state);
142  void setIsVideoSource(bool value);
143  void setIsAudioSource(bool value);
145  void setTrackMetadata(const QPair<QUrl,Track::MetaData> &metadata);
146  void setVideoDimension(const QSize &size);
148 
149  virtual void doSetAudioStreamRole(Player::AudioStreamRole role) = 0;
150  virtual void doSetLifetime(Player::Lifetime lifetime) = 0;
151  virtual void doSetVolume(double volume) = 0;
152 
153 private:
154  Q_DECLARE_PRIVATE(Engine)
155  QScopedPointer<EnginePrivate> d_ptr;
156 };
157 
158 }
159 }
160 
161 #endif // LOMIRI_MEDIAHUBSERVICE_ENGINE_H
lomiri::MediaHubService::Engine::State
State
Definition: engine.h:50
lomiri::MediaHubService::Engine::errorOccurred
void errorOccurred(Player::Error error)
lomiri::MediaHubService::Engine::setVolume
void setVolume(double volume)
Definition: engine.cpp:218
lomiri::MediaHubService::Engine::doSetLifetime
virtual void doSetLifetime(Player::Lifetime lifetime)=0
lomiri::MediaHubService::Engine::doSetAudioStreamRole
virtual void doSetAudioStreamRole(Player::AudioStreamRole role)=0
QObject
lomiri::MediaHubService::Engine::setState
void setState(State state)
Definition: engine.cpp:93
lomiri::MediaHubService::Engine::play
virtual bool play()=0
lomiri::MediaHubService::Engine::trackMetadataChanged
void trackMetadataChanged()
lomiri::MediaHubService::Engine::volume
double volume() const
Definition: engine.cpp:225
lomiri::MediaHubService::Player::Error
Error
Definition: player.h:135
lomiri::MediaHubService::Engine::stop
virtual bool stop()=0
lomiri::MediaHubService::Engine::videoDimension
QSize videoDimension() const
Definition: engine.cpp:212
lomiri::MediaHubService::Engine::~Engine
virtual ~Engine()
lomiri::MediaHubService::Engine::clientDisconnected
void clientDisconnected()
lomiri::MediaHubService::Engine::metadataExtractor
const QSharedPointer< MetaDataExtractor > & metadataExtractor() const
Definition: engine.cpp:87
lomiri::MediaHubService::Engine::State::busy
@ busy
lomiri::MediaHubService::Engine::lifetime
Player::Lifetime lifetime() const
Definition: engine.cpp:171
lomiri::MediaHubService::Engine::seek_to
virtual bool seek_to(const std::chrono::microseconds &ts)=0
lomiri::MediaHubService::Engine::orientationChanged
void orientationChanged()
lomiri::MediaHubService::Engine::State::no_media
@ no_media
lomiri::MediaHubService::Player::HeadersType
QMap< QString, QString > HeadersType
Definition: player.h:57
lomiri::MediaHubService::Engine::setIsVideoSource
void setIsVideoSource(bool value)
Definition: engine.cpp:107
lomiri::MediaHubService::Engine::durationChanged
void durationChanged()
track.h
lomiri::MediaHubService::Engine::State::stopped
@ stopped
lomiri::MediaHubService::Engine::bufferingChanged
void bufferingChanged(int)
lomiri::MediaHubService::Player::AudioStreamRole
AudioStreamRole
Definition: player.h:113
lomiri::MediaHubService::Engine::setVideoDimension
void setVideoDimension(const QSize &size)
Definition: engine.cpp:204
lomiri::MediaHubService::Engine::duration
virtual uint64_t duration() const =0
lomiri::MediaHubService::Engine::videoDimensionChanged
void videoDimensionChanged()
lomiri::MediaHubService::Engine::create_video_sink
virtual void create_video_sink(uint32_t texture_id)=0
lomiri::MediaHubService::Engine::Engine
Engine(QObject *parent=nullptr)
Definition: engine.cpp:73
lomiri::MediaHubService::Engine::playbackStatusChanged
void playbackStatusChanged()
lomiri::MediaHubService::Engine::seekedTo
void seekedTo(uint64_t offset)
lomiri::MediaHubService::Engine::setAudioStreamRole
void setAudioStreamRole(Player::AudioStreamRole role)
Definition: engine.cpp:149
lomiri::MediaHubService::Engine::reset
virtual void reset()=0
lomiri::MediaHubService::Engine::setMetadataExtractor
void setMetadataExtractor(const QSharedPointer< MetaDataExtractor > &extractor)
Definition: engine.cpp:81
lomiri::MediaHubService::Engine::setIsAudioSource
void setIsAudioSource(bool value)
Definition: engine.cpp:121
lomiri::MediaHubService::Engine::playbackStatus
Player::PlaybackStatus playbackStatus() const
Definition: engine.cpp:198
lomiri::MediaHubService::Engine::MetaDataExtractor
Definition: engine.h:61
lomiri::MediaHubService::Engine::orientation
Player::Orientation orientation() const
Definition: engine.cpp:143
lomiri::MediaHubService::Engine::position
virtual uint64_t position() const =0
lomiri::MediaHubService::Engine::audioStreamRole
Player::AudioStreamRole audioStreamRole() const
Definition: engine.cpp:157
lomiri::MediaHubService::Engine::stateChanged
void stateChanged()
lomiri::MediaHubService::Engine::State::ready
@ ready
lomiri::MediaHubService::Engine::endOfStream
void endOfStream()
lomiri::MediaHubService::Engine::setLifetime
void setLifetime(Player::Lifetime lifetime)
Definition: engine.cpp:163
lomiri::MediaHubService::Engine::state
State state() const
Definition: engine.cpp:101
lomiri::MediaHubService::Engine::setOrientation
void setOrientation(Player::Orientation o)
Definition: engine.cpp:135
lomiri::MediaHubService::Player::PlaybackStatus
PlaybackStatus
Definition: player.h:92
lomiri::MediaHubService::Engine::MetaDataExtractor::Callback
std::function< void(const QVariantMap &)> Callback
Definition: engine.h:64
lomiri::MediaHubService::Engine::positionChanged
void positionChanged()
lomiri::MediaHubService::Player::Lifetime
Lifetime
Definition: player.h:129
lomiri::MediaHubService::Engine::isVideoSource
bool isVideoSource() const
Definition: engine.cpp:115
lomiri::MediaHubService::Engine::isAudioSource
bool isAudioSource() const
Definition: engine.cpp:129
player.h
lomiri::MediaHubService::Engine::setTrackMetadata
void setTrackMetadata(const QPair< QUrl, Track::MetaData > &metadata)
Definition: engine.cpp:177
lomiri::MediaHubService::Engine
Definition: engine.h:44
lomiri::MediaHubService::Engine::trackMetadata
QPair< QUrl, Track::MetaData > trackMetadata() const
Definition: engine.cpp:184
lomiri::MediaHubService::Engine::isVideoSourceChanged
void isVideoSourceChanged()
lomiri::MediaHubService::Engine::State::playing
@ playing
lomiri::MediaHubService::Engine::doSetVolume
virtual void doSetVolume(double volume)=0
lomiri::MediaHubService::Engine::isAudioSourceChanged
void isAudioSourceChanged()
lomiri
Definition: dbus_utils.h:24
lomiri::MediaHubService::Engine::aboutToFinish
void aboutToFinish()
lomiri::MediaHubService::Engine::pause
virtual bool pause()=0
lomiri::MediaHubService::Engine::setPlaybackStatus
void setPlaybackStatus(Player::PlaybackStatus status)
Definition: engine.cpp:190
lomiri::MediaHubService::Engine::open_resource_for_uri
virtual bool open_resource_for_uri(const QUrl &uri, bool do_pipeline_reset)=0
lomiri::MediaHubService::Player::Orientation
Orientation
Definition: player.h:121
lomiri::MediaHubService::Engine::State::paused
@ paused