Music Hub  ..
A session-wide music playback service
player_skeleton.cpp
Go to the documentation of this file.
1 /*
2  * Copyright © 2013-2015 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 
23 #include "player_skeleton.h"
24 
25 #include "dbus_property_notifier.h"
26 #include "engine.h"
27 #include "logging.h"
28 #include "mpris.h"
29 #include "player_implementation.h"
30 #include "xesam.h"
31 
32 #include "apparmor/lomiri.h"
33 
34 #include "util/uri_check.h"
35 
36 #include <QDBusArgument>
37 #include <QDBusMessage>
38 #include <QDateTime>
39 #include <QMetaEnum>
40 #include <QTimer>
41 
42 using namespace lomiri::MediaHubService;
43 
44 namespace lomiri {
45 namespace MediaHubService {
46 
47 enum class OpenUriCall {
48  OnlyUri,
50 };
51 
53 {
54 public:
56  PlayerSkeleton *q);
57 
58  void openUri(const QDBusMessage &in, const QDBusConnection &bus,
59  OpenUriCall callType);
60 
61 private:
62  friend class PlayerSkeleton;
63  PlayerImplementation *m_player;
64  QScopedPointer<DBusPropertyNotifier> m_propertyNotifier;
65  QDBusConnection m_connection;
66  apparmor::lomiri::RequestContextResolver::Ptr request_context_resolver;
67  apparmor::lomiri::RequestAuthenticator::Ptr request_authenticator;
68  QTimer m_bufferingTimer;
69  QDateTime m_bufferingLastEmission;
70  int m_bufferingValue;
71  PlayerSkeleton *q_ptr;
72 };
73 
74 }} // namespace
75 
78  PlayerSkeleton *q):
79  m_player(conf.player),
80  m_connection(conf.connection),
81  request_context_resolver{conf.request_context_resolver},
82  request_authenticator{conf.request_authenticator},
83  q_ptr(q)
84 {
85  auto impl = m_player;
86  QObject::connect(impl, &PlayerImplementation::seekedTo,
88  QObject::connect(impl, &PlayerImplementation::aboutToFinish,
90  QObject::connect(impl, &PlayerImplementation::endOfStream,
91  q, [q, impl]() {
92  /* For compatibility with the old media-hub (and the music
93  * app), do not emit the signal unless this is the very
94  * last track of the playlist.
95  */
96  if (!impl->canGoNext()) {
97  Q_EMIT q->EndOfStream();
98  }
99  });
100  QObject::connect(impl, &PlayerImplementation::playbackStatusChanged,
101  q, [q,impl]() {
102  Q_EMIT q->PlaybackStatusChanged(impl->playbackStatus());
103  });
104  QObject::connect(impl, &PlayerImplementation::videoDimensionChanged,
105  q, [q,impl]() {
106  const QSize size = impl->videoDimension();
107  Q_EMIT q->VideoDimensionChanged(size.height(), size.width());
108  });
109  QObject::connect(impl, &PlayerImplementation::errorOccurred,
110  q, [q](Player::Error error) {
111  Q_EMIT q->Error(error);
112  });
113  QObject::connect(impl, &PlayerImplementation::bufferingChanged,
114  q, [this, q](int buffering) {
115  QDateTime now = QDateTime::currentDateTime();
116  if (!m_bufferingLastEmission.isValid() ||
117  m_bufferingLastEmission.msecsTo(now) > 500) {
118  /* More than 0.5 seconds have passed, emit immediately */
119  Q_EMIT q->Buffering(buffering);
120  m_bufferingLastEmission = now;
121  } else {
122  /* wait 0.5 seconds since the previous emission */
123  QDateTime nextEmission = m_bufferingLastEmission.addMSecs(500);
124  m_bufferingValue = buffering;
125  m_bufferingTimer.start(now.msecsTo(nextEmission));
126  }
127  });
128  m_bufferingTimer.setSingleShot(true);
129  m_bufferingTimer.callOnTimeout(q, [this, q]() {
130  Q_EMIT q->Buffering(m_bufferingValue);
131  m_bufferingLastEmission = QDateTime::currentDateTime();
132  });
133 
134  QObject::connect(impl, &PlayerImplementation::volumeChanged,
136 
137  /* Property signals */
138  QObject::connect(impl, &PlayerImplementation::mprisPropertiesChanged,
140  QObject::connect(impl, &PlayerImplementation::mprisPropertiesChanged,
142  QObject::connect(impl, &PlayerImplementation::mprisPropertiesChanged,
144  QObject::connect(impl, &PlayerImplementation::mprisPropertiesChanged,
146  QObject::connect(impl, &PlayerImplementation::isVideoSourceChanged,
148  QObject::connect(impl, &PlayerImplementation::isAudioSourceChanged,
152  QObject::connect(impl, &PlayerImplementation::orientationChanged,
154 }
155 
156 void PlayerSkeletonPrivate::openUri(const QDBusMessage &in,
157  const QDBusConnection &bus,
158  OpenUriCall callType)
159 {
160  in.setDelayedReply(true);
161  request_context_resolver->resolve_context_for_dbus_name_async(in.service(),
162  [=](const apparmor::lomiri::Context& context)
163  {
164  using Headers = Player::HeadersType;
165 
166  const auto args = in.arguments();
167  QUrl uri = QUrl::fromUserInput(args.value(0).toString());
168  Headers headers;
169  if (callType == OpenUriCall::UriWithHeaders) {
170  const QDBusArgument dbusHeaders = args.value(1).value<QDBusArgument>();
171  dbusHeaders >> headers;
172  }
173 
174  QDBusMessage reply;
175  UriCheck uri_check(uri);
176  const bool valid_uri = !uri.isEmpty() and
177  (!uri_check.is_local_file() or uri_check.file_exists());
178  if (!valid_uri)
179  {
180  const QString err_str = {"Warning: Failed to open uri " + uri.toString() +
181  " because it can't be found."};
182  MH_ERROR("%s", qUtf8Printable(err_str));
183  reply = in.createErrorReply(
185  err_str);
186  }
187  else
188  {
189  // Make sure the client has adequate apparmor permissions to open the URI
190  const auto result = request_authenticator->authenticate_open_uri_request(context, uri);
191  if (std::get<0>(result))
192  {
193  reply = in.createReply();
194  reply << (std::get<0>(result) ? m_player->open_uri(uri, headers) : false);
195  }
196  else
197  {
198  const QString err_str = {"Warning: Failed to authenticate necessary "
199  "apparmor permissions to open uri: " + std::get<1>(result)};
200  MH_ERROR("%s", qUtf8Printable(err_str));
201  reply = in.createErrorReply(
203  err_str);
204  }
205  }
206 
207  /* Before sending the reply, emit any pending property notifications;
208  * in this way, by the time the client gets the reply, it will also
209  * have all the properties up to date.
210  */
211  m_propertyNotifier->notify();
212  bus.send(reply);
213  });
214 }
215 
216 PlayerSkeleton::PlayerSkeleton(const Configuration& configuration,
217  QObject *parent):
218  QObject(parent),
219  d_ptr(new PlayerSkeletonPrivate(configuration, this))
220 {
221 }
222 
224 
226  Q_D(PlayerSkeleton);
227  return d->m_player;
228 }
229 
231  Q_D(const PlayerSkeleton);
232  return d->m_player;
233 }
234 
236 {
237  Q_D(PlayerSkeleton);
238  d->m_propertyNotifier.reset(new DBusPropertyNotifier(d->m_connection,
239  objectPath, this));
240  return d->m_connection.registerObject(
241  objectPath,
242  this,
243  QDBusConnection::ExportAllSlots |
244  QDBusConnection::ExportScriptableSignals |
245  QDBusConnection::ExportAllProperties);
246 }
247 
249 {
250  return player()->canPlay();
251 }
252 
254 {
255  return player()->canPause();
256 }
257 
259 {
260  return player()->canSeek();
261 }
262 
264 {
265  return player()->canGoPrevious();
266 }
267 
269 {
270  return player()->canGoNext();
271 }
272 
274 {
275  return player()->isVideoSource();
276 }
277 
279 {
280  return player()->isAudioSource();
281 }
282 
284 {
286  switch (s) {
287  case Player::PlaybackStatus::playing:
288  return QStringLiteral("Playing");
289  case Player::PlaybackStatus::paused:
290  case Player::PlaybackStatus::ready:
291  return QStringLiteral("Paused");
292  default:
293  return QStringLiteral("Stopped");
294  }
295 }
296 
297 void PlayerSkeleton::setLoopStatus(const QString &status)
298 {
299  bool ok;
300  int value = QMetaEnum::fromType<LoopStatus>().
301  keyToValue(status.toUtf8().constData(), &ok);
302  if (!ok) {
303  MH_ERROR("Invalid loop status: %s", qUtf8Printable(status));
304  return;
305  }
306  player()->setLoopStatus(static_cast<Player::LoopStatus>(value));
307 }
308 
310 {
311  int value = static_cast<LoopStatus>(player()->loopStatus());
312  return QMetaEnum::fromType<LoopStatus>().valueToKey(value);
313 }
314 
316 {
317  player()->setLoopStatus(static_cast<Player::LoopStatus>(status));
318 }
319 
321 {
322  return static_cast<LoopStatus>(player()->loopStatus());
323 }
324 
326 {
327  return player()->setPlaybackRate(rate);
328 }
329 
331 {
332  return player()->playbackRate();
333 }
334 
335 void PlayerSkeleton::setShuffle(bool shuffle)
336 {
337  return player()->setShuffle(shuffle);
338 }
339 
341 {
342  return player()->shuffle();
343 }
344 
345 QVariantMap PlayerSkeleton::metadata() const
346 {
347  return player()->metadataForCurrentTrack();
348 }
349 
350 void PlayerSkeleton::setVolume(double volume)
351 {
352  player()->setVolume(volume);
353 }
354 
356 {
357  return player()->volume();
358 }
359 
361 {
362  return player()->minimumRate();
363 }
364 
366 {
367  return player()->maximumRate();
368 }
369 
371 {
372  return player()->position();
373 }
374 
376 {
377  return player()->duration();
378 }
379 
381 {
382  return player()->backend();
383 }
384 
386 {
387  return player()->orientation();
388 }
389 
391 {
392  return player()->lifetime();
393 }
394 
396 {
397  player()->setAudioStreamRole(static_cast<Player::AudioStreamRole>(role));
398 }
399 
401 {
402  return player()->audioStreamRole();
403 }
404 
406 {
407  player()->next();
408 }
409 
411 {
412  player()->previous();
413 }
414 
416 {
417  player()->pause();
418 }
419 
421 {
422  Q_D(PlayerSkeleton);
423 
424  PlayerImplementation *impl = player();
425  switch (impl->playbackStatus()) {
426  case lomiri::MediaHubService::Player::PlaybackStatus::ready:
427  case lomiri::MediaHubService::Player::PlaybackStatus::paused:
428  case lomiri::MediaHubService::Player::PlaybackStatus::stopped:
429  impl->play();
430  break;
431  case lomiri::MediaHubService::Player::PlaybackStatus::playing:
432  impl->pause();
433  break;
434  default:
435  break;
436  }
437 }
438 
440 {
441  player()->stop();
442 }
443 
445 {
446  player()->play();
447  /* FIXME: workaround for the client library: if we don't emit the signal
448  * right away, it gets confused and will pause the playback.
449  */
450  Q_EMIT PlaybackStatusChanged(Player::PlaybackStatus::playing);
451 }
452 
453 void PlayerSkeleton::Seek(quint64 microSeconds)
454 {
455  player()->seek_to(std::chrono::microseconds(microSeconds));
456 }
457 
458 void PlayerSkeleton::SetPosition(const QDBusObjectPath &, quint64)
459 {
460  // TODO: implement (this was never implemented in media-hub)
461 }
462 
463 void PlayerSkeleton::CreateVideoSink(quint32 textureId)
464 {
465  try
466  {
467  player()->create_gl_texture_video_sink(textureId);
468  }
470  {
471  sendErrorReply(
473  e.what());
474  }
475  catch (...)
476  {
477  sendErrorReply(
479  QString());
480  }
481 }
482 
483 uint32_t PlayerSkeleton::Key() const
484 {
485  return player()->key();
486 }
487 
488 void PlayerSkeleton::OpenUri(const QDBusMessage &)
489 {
490  Q_D(PlayerSkeleton);
491  d->openUri(message(), connection(), OpenUriCall::OnlyUri);
492 }
493 
494 void PlayerSkeleton::OpenUriExtended(const QDBusMessage &)
495 {
496  Q_D(PlayerSkeleton);
497  d->openUri(message(), connection(), OpenUriCall::UriWithHeaders);
498 }
lomiri::MediaHubService::PlayerImplementation::canSeek
bool canSeek() const
Definition: player_implementation.cpp:615
mpris.h
lomiri::MediaHubService::PlayerImplementation::shuffle
bool shuffle() const
Definition: player_implementation.cpp:673
QObject
lomiri::MediaHubService::UriCheck
Definition: uri_check.h:32
lomiri::MediaHubService::PlayerImplementation::seekedTo
void seekedTo(uint64_t offset)
lomiri::MediaHubService::PlayerImplementation::key
Player::PlayerKey key() const
Definition: player_implementation.cpp:784
lomiri::MediaHubService::PlayerSkeleton::canPauseChanged
void canPauseChanged()
lomiri::MediaHubService::OpenUriCall::UriWithHeaders
@ UriWithHeaders
lomiri::MediaHubService::PlayerImplementation::duration
uint64_t duration() const
Definition: player_implementation.cpp:734
dbus_property_notifier.h
lomiri::MediaHubService::Player::Error
Error
Definition: player.h:135
lomiri::MediaHubService::PlayerImplementation
Definition: player_implementation.h:44
lomiri::MediaHubService::PlayerImplementation::loopStatus
Player::LoopStatus loopStatus() const
Definition: player_implementation.cpp:661
lomiri::MediaHubService::PlayerImplementation::volume
double volume() const
Definition: player_implementation.cpp:686
lomiri::MediaHubService::PlayerImplementation::isAudioSourceChanged
void isAudioSourceChanged()
lomiri::MediaHubService::PlayerSkeleton::canPlay
bool canPlay() const
Definition: player_skeleton.cpp:248
lomiri::MediaHubService::Player::LoopStatus
LoopStatus
Definition: player.h:101
lomiri::MediaHubService::PlayerSkeleton::canGoNext
bool canGoNext() const
Definition: player_skeleton.cpp:268
lomiri::MediaHubService::PlayerImplementation::setShuffle
void setShuffle(bool shuffle)
Definition: player_implementation.cpp:667
mpris::objectPath
const QString objectPath
Definition: media_player2.cpp:39
lomiri::MediaHubService::PlayerImplementation::setVolume
void setVolume(double volume)
Definition: player_implementation.cpp:679
lomiri::MediaHubService::PlayerSkeleton::setAudioStreamRole
void setAudioStreamRole(qint16 role)
Definition: player_skeleton.cpp:395
lomiri::MediaHubService::PlayerImplementation::playbackStatusChanged
void playbackStatusChanged()
lomiri::MediaHubService::PlayerSkeleton::shuffle
bool shuffle() const
Definition: player_skeleton.cpp:340
lomiri::MediaHubService::PlayerImplementation::videoDimensionChanged
void videoDimensionChanged()
lomiri::MediaHubService::PlayerImplementation::minimumRate
double minimumRate() const
Definition: player_implementation.cpp:644
mpris::Player::Error::UriNotFound::name
static constexpr const char * name
Definition: mpris.h:207
lomiri::MediaHubService::PlayerSkeleton::Stop
void Stop()
Definition: player_skeleton.cpp:439
mpris::Player::Error::OutOfProcessBufferStreamingNotSupported::name
static constexpr const char * name
Definition: mpris.h:191
lomiri::MediaHubService::PlayerSkeleton::volumeChanged
void volumeChanged()
lomiri::MediaHubService::PlayerSkeleton::Configuration::request_context_resolver
apparmor::lomiri::RequestContextResolver::Ptr request_context_resolver
Definition: player_skeleton.h:97
lomiri::MediaHubService::PlayerSkeleton::SetPosition
void SetPosition(const QDBusObjectPath &trackObject, quint64 microSeconds)
Definition: player_skeleton.cpp:458
lomiri::MediaHubService::PlayerSkeleton::Pause
void Pause()
Definition: player_skeleton.cpp:415
lomiri::MediaHubService::PlayerImplementation::canGoPrevious
bool canGoPrevious() const
Definition: player_implementation.cpp:621
lomiri::MediaHubService::PlayerSkeleton::typedLoopStatus
qint16 typedLoopStatus() const
Definition: player_skeleton.cpp:320
lomiri::MediaHubService::PlayerSkeleton::AboutToFinish
Q_SCRIPTABLE void AboutToFinish()
lomiri::MediaHubService::PlayerSkeleton::canSeek
bool canSeek() const
Definition: player_skeleton.cpp:258
lomiri::MediaHubService::PlayerSkeleton::audioStreamRole
qint16 audioStreamRole() const
Definition: player_skeleton.cpp:400
lomiri::MediaHubService::PlayerSkeleton::position
qint64 position() const
Definition: player_skeleton.cpp:370
lomiri::MediaHubService::PlayerSkeleton::lifetime
qint16 lifetime() const
Definition: player_skeleton.cpp:390
lomiri::MediaHubService::PlayerSkeleton::Previous
void Previous()
Definition: player_skeleton.cpp:410
lomiri::MediaHubService::PlayerSkeleton::canPlayChanged
void canPlayChanged()
lomiri::MediaHubService::PlayerImplementation::errorOccurred
void errorOccurred(Player::Error error)
lomiri::MediaHubService::PlayerSkeleton::LoopStatus
LoopStatus
Definition: player_skeleton.h:84
lomiri::MediaHubService::PlayerSkeleton::setVolume
void setVolume(double volume)
Definition: player_skeleton.cpp:350
lomiri::MediaHubService::PlayerSkeleton::canPause
bool canPause() const
Definition: player_skeleton.cpp:253
lomiri::MediaHubService::OpenUriCall
OpenUriCall
Definition: player_skeleton.cpp:47
lomiri::MediaHubService::PlayerSkeleton::PlaybackStatusChanged
Q_SCRIPTABLE void PlaybackStatusChanged(qint16 status)
lomiri::MediaHubService::PlayerSkeleton::orientationChanged
void orientationChanged()
lomiri::MediaHubService::PlayerImplementation::aboutToFinish
void aboutToFinish()
lomiri::MediaHubService::PlayerImplementation::create_gl_texture_video_sink
void create_gl_texture_video_sink(std::uint32_t texture_id)
Definition: player_implementation.cpp:790
lomiri::MediaHubService::PlayerSkeleton::OpenUri
void OpenUri(const QDBusMessage &)
Definition: player_skeleton.cpp:488
lomiri::MediaHubService::PlayerSkeleton::setShuffle
void setShuffle(bool shuffle)
Definition: player_skeleton.cpp:335
lomiri::MediaHubService::PlayerSkeleton::playbackRate
double playbackRate() const
Definition: player_skeleton.cpp:330
lomiri::MediaHubService::PlayerImplementation::bufferingChanged
void bufferingChanged(int)
lomiri::MediaHubService::PlayerSkeleton::Configuration
Definition: player_skeleton.h:92
lomiri::MediaHubService::apparmor::lomiri::RequestAuthenticator::Ptr
QSharedPointer< RequestAuthenticator > Ptr
Definition: lomiri.h:122
lomiri::MediaHubService::PlayerImplementation::maximumRate
double maximumRate() const
Definition: player_implementation.cpp:649
lomiri::MediaHubService::Player::AudioStreamRole
AudioStreamRole
Definition: player.h:113
lomiri::MediaHubService::PlayerImplementation::canPause
bool canPause() const
Definition: player_implementation.cpp:609
player_implementation.h
lomiri::MediaHubService::PlayerImplementation::next
void next()
Definition: player_implementation.cpp:823
lomiri::MediaHubService::PlayerSkeleton::canGoNextChanged
void canGoNextChanged()
xesam.h
lomiri::MediaHubService::PlayerSkeleton::isAudioSourceChanged
void isAudioSourceChanged()
lomiri::MediaHubService::PlayerSkeleton::Key
quint32 Key() const
Definition: player_skeleton.cpp:483
lomiri::MediaHubService::PlayerSkeleton::playbackStatus
QString playbackStatus() const
Definition: player_skeleton.cpp:283
lomiri::MediaHubService::PlayerSkeleton::canGoPrevious
bool canGoPrevious() const
Definition: player_skeleton.cpp:263
lomiri::MediaHubService::PlayerSkeleton::backend
qint16 backend() const
Definition: player_skeleton.cpp:380
lomiri::MediaHubService::PlayerSkeleton::metadataChanged
void metadataChanged()
MH_ERROR
#define MH_ERROR(...)
Definition: logging.h:41
lomiri::MediaHubService::OpenUriCall::OnlyUri
@ OnlyUri
lomiri::MediaHubService::PlayerSkeleton::duration
qint64 duration() const
Definition: player_skeleton.cpp:375
lomiri::MediaHubService::PlayerImplementation::setLoopStatus
void setLoopStatus(Player::LoopStatus status)
Definition: player_implementation.cpp:654
lomiri::MediaHubService::PlayerSkeleton::registerAt
bool registerAt(const QString &objectPath)
Definition: player_skeleton.cpp:235
lomiri::MediaHubService::PlayerImplementation::metadataForCurrentTrack
Track::MetaData metadataForCurrentTrack() const
Definition: player_implementation.cpp:722
lomiri::MediaHubService::PlayerImplementation::stop
void stop()
Definition: player_implementation.cpp:854
lomiri::MediaHubService::PlayerSkeleton::canGoPreviousChanged
void canGoPreviousChanged()
lomiri::MediaHubService::PlayerSkeletonPrivate::PlayerSkeletonPrivate
PlayerSkeletonPrivate(const PlayerSkeleton::Configuration &conf, PlayerSkeleton *q)
Definition: player_skeleton.cpp:76
lomiri::MediaHubService::PlayerImplementation::volumeChanged
void volumeChanged()
lomiri::MediaHubService::PlayerSkeleton::metadata
QVariantMap metadata() const
Definition: player_skeleton.cpp:345
lomiri::MediaHubService::PlayerImplementation::lifetime
Player::Lifetime lifetime() const
Definition: player_implementation.cpp:758
lomiri::MediaHubService::PlayerImplementation::setPlaybackRate
void setPlaybackRate(double rate)
Definition: player_implementation.cpp:633
lomiri::MediaHubService::PlayerImplementation::isVideoSourceChanged
void isVideoSourceChanged()
lomiri::MediaHubService::PlayerSkeleton::loopStatus
QString loopStatus() const
Definition: player_skeleton.cpp:309
lomiri::MediaHubService::PlayerImplementation::endOfStream
void endOfStream()
lomiri::MediaHubService::PlayerSkeleton::Seek
void Seek(quint64 microSeconds)
Definition: player_skeleton.cpp:453
lomiri::MediaHubService::PlayerSkeleton::PlayPause
void PlayPause()
Definition: player_skeleton.cpp:420
lomiri::MediaHubService::PlayerSkeleton::maximumRate
double maximumRate() const
Definition: player_skeleton.cpp:365
lomiri::MediaHubService::PlayerSkeleton::setPlaybackRate
void setPlaybackRate(double rate)
Definition: player_skeleton.cpp:325
lomiri::MediaHubService::PlayerSkeleton::OpenUriExtended
void OpenUriExtended(const QDBusMessage &)
Definition: player_skeleton.cpp:494
lomiri::MediaHubService::PlayerImplementation::position
uint64_t position() const
Definition: player_implementation.cpp:728
lomiri::MediaHubService
Definition: context.h:28
lomiri::MediaHubService::PlayerImplementation::audioStreamRole
Player::AudioStreamRole audioStreamRole() const
Definition: player_implementation.cpp:746
lomiri::MediaHubService::PlayerSkeleton::minimumRate
double minimumRate() const
Definition: player_skeleton.cpp:360
lomiri::MediaHubService::Player::PlaybackStatus
PlaybackStatus
Definition: player.h:92
mpris::Player::Error::InsufficientAppArmorPermissions::name
static constexpr const char * name
Definition: mpris.h:199
lomiri::MediaHubService::PlayerImplementation::open_uri
bool open_uri(const QUrl &uri)
Definition: player_implementation.cpp:796
lomiri::MediaHubService::PlayerSkeleton::isAudioSource
bool isAudioSource() const
Definition: player_skeleton.cpp:278
lomiri::MediaHubService::PlayerSkeletonPrivate::openUri
void openUri(const QDBusMessage &in, const QDBusConnection &bus, OpenUriCall callType)
Definition: player_skeleton.cpp:156
lomiri::MediaHubService::apparmor::lomiri::Context
Definition: lomiri.h:52
lomiri::MediaHubService::PlayerImplementation::canGoNext
bool canGoNext() const
Definition: player_implementation.cpp:627
lomiri::MediaHubService::PlayerSkeleton::volume
double volume() const
Definition: player_skeleton.cpp:355
lomiri::MediaHubService::PlayerSkeleton::orientation
qint16 orientation() const
Definition: player_skeleton.cpp:385
lomiri::MediaHubService::PlayerImplementation::playbackStatus
Player::PlaybackStatus playbackStatus() const
Definition: player_implementation.cpp:692
lomiri::MediaHubService::PlayerSkeleton::isVideoSource
bool isVideoSource() const
Definition: player_skeleton.cpp:273
lomiri::MediaHubService::PlayerSkeleton
Definition: player_skeleton.h:48
lomiri::MediaHubService::PlayerImplementation::orientation
Player::Orientation orientation() const
Definition: player_implementation.cpp:716
lomiri.h
lomiri::MediaHubService::apparmor::lomiri::RequestContextResolver::Ptr
QSharedPointer< RequestContextResolver > Ptr
Definition: lomiri.h:85
lomiri::MediaHubService::PlayerImplementation::backend
AVBackend::Backend backend() const
Definition: player_implementation.cpp:592
lomiri::MediaHubService::PlayerImplementation::previous
void previous()
Definition: player_implementation.cpp:829
lomiri::MediaHubService::Player::Errors::OutOfProcessBufferStreamingNotSupported
Definition: player.h:79
lomiri::MediaHubService::PlayerImplementation::seek_to
void seek_to(const std::chrono::microseconds &offset)
Definition: player_implementation.cpp:861
lomiri::MediaHubService::PlayerSkeleton::CreateVideoSink
void CreateVideoSink(quint32 textureId)
Definition: player_skeleton.cpp:463
player_skeleton.h
lomiri::MediaHubService::PlayerSkeleton::Play
void Play()
Definition: player_skeleton.cpp:444
lomiri::MediaHubService::PlayerSkeleton::setTypedLoopStatus
void setTypedLoopStatus(qint16 status)
Definition: player_skeleton.cpp:315
lomiri::MediaHubService::PlayerSkeleton::setLoopStatus
void setLoopStatus(const QString &status)
Definition: player_skeleton.cpp:297
lomiri::MediaHubService::PlayerImplementation::playbackRate
double playbackRate() const
Definition: player_implementation.cpp:639
engine.h
lomiri::MediaHubService::PlayerImplementation::metadataForCurrentTrackChanged
void metadataForCurrentTrackChanged()
lomiri::MediaHubService::PlayerSkeleton::player
PlayerImplementation * player()
Definition: player_skeleton.cpp:225
lomiri::MediaHubService::PlayerImplementation::mprisPropertiesChanged
void mprisPropertiesChanged()
lomiri::MediaHubService::PlayerImplementation::orientationChanged
void orientationChanged()
DBusPropertyNotifier
Definition: dbus_property_notifier.h:28
lomiri
Definition: dbus_utils.h:24
lomiri::MediaHubService::PlayerSkeleton::~PlayerSkeleton
~PlayerSkeleton()
lomiri::MediaHubService::PlayerSkeleton::Next
void Next()
Definition: player_skeleton.cpp:405
lomiri::MediaHubService::PlayerSkeleton::Seeked
Q_SCRIPTABLE void Seeked(quint64 microSeconds)
uri_check.h
lomiri::MediaHubService::PlayerImplementation::pause
void pause()
Definition: player_implementation.cpp:847
lomiri::MediaHubService::PlayerImplementation::canPlay
bool canPlay() const
Definition: player_implementation.cpp:603
lomiri::MediaHubService::PlayerImplementation::isVideoSource
bool isVideoSource() const
Definition: player_implementation.cpp:698
lomiri::MediaHubService::PlayerSkeleton::isVideoSourceChanged
void isVideoSourceChanged()
lomiri::MediaHubService::PlayerImplementation::setAudioStreamRole
void setAudioStreamRole(Player::AudioStreamRole role)
Definition: player_implementation.cpp:740
lomiri::MediaHubService::PlayerImplementation::play
void play()
Definition: player_implementation.cpp:835
lomiri::MediaHubService::PlayerImplementation::isAudioSource
bool isAudioSource() const
Definition: player_implementation.cpp:704
logging.h
lomiri::MediaHubService::PlayerSkeletonPrivate
Definition: player_skeleton.cpp:52