25#include <QDBusAbstractAdaptor>
26#include <QDBusConnection>
27#include <QDBusContext>
28#include <QDBusObjectPath>
39const QString
objectPath = QStringLiteral(
"/org/mpris/MediaPlayer2");
47 Q_CLASSINFO(
"D-Bus Interface",
"org.mpris.MediaPlayer2")
63 QString
identity()
const {
return QStringLiteral(
"core::media::Hub"); }
66 QString
desktopEntry()
const {
return QStringLiteral(
"lomiri-mediaplayer-app"); }
69 return {
"audio/mpeg3",
"video/mpeg4"};
83 Q_CLASSINFO(
"D-Bus Interface",
"org.mpris.MediaPlayer2.Playlists")
93 QStringList
orderings()
const {
return {
"Alphabetical"}; }
103 Q_CLASSINFO(
"D-Bus Interface",
"org.mpris.MediaPlayer2.Player")
143 bool canPlay()
const {
return m_player ? m_player->canPlay() :
false; }
144 bool canPause()
const {
return m_player ? m_player->canPause() :
false; }
145 bool canSeek()
const {
return m_player ? m_player->canSeek() :
false; }
146 bool canGoPrevious()
const {
return m_player ? m_player->canGoPrevious() :
false; }
147 bool canGoNext()
const {
return m_player ? m_player->canGoNext() :
false; }
149 bool isVideoSource()
const {
return m_player ? m_player->isVideoSource() :
false; }
157 double playbackRate()
const {
return m_player ? m_player->playbackRate() : 1.0; }
159 bool shuffle()
const {
return m_player ? m_player->shuffle() :
false; }
160 QVariantMap
metadata()
const {
return m_player ? m_player->metadataForCurrentTrack() : QVariantMap(); }
162 double volume()
const {
return m_player ? m_player->volume() : 1.0; }
163 double minimumRate()
const {
return m_player ? m_player->minimumRate() : 1.0; }
164 double maximumRate()
const {
return m_player ? m_player->maximumRate() : 1.0; }
165 qint64
position()
const {
return m_player ? m_player->position() : 0; }
166 qint64
duration()
const {
return m_player ? m_player->duration() : 0; }
167 qint16
backend()
const {
return m_player ? m_player->backend() : 0; }
168 qint16
orientation()
const {
return m_player ? m_player->orientation() : 0; }
169 qint16
lifetime()
const {
return m_player ? m_player->lifetime() : 0; }
173 void Next() {
if (m_player) m_player->next(); }
174 void Previous() {
if (m_player) m_player->previous(); }
175 void Pause() {
if (m_player) m_player->
pause(); }
177 void Stop() {
if (m_player) m_player->stop(); }
178 void Play() {
if (m_player) m_player->
play(); }
179 void Seek(quint64 microSeconds);
180 void SetPosition(
const QDBusObjectPath &, quint64) {}
183 void OpenUri(
const QDBusMessage &);
205 QDBusConnection m_connection;
215 m_propertyNotifier(connection,
objectPath, this)
223 if (m_player == impl)
return;
226 m_player->disconnect(
this);
231 QObject::connect(impl, &PlayerImplementation::seekedTo,
235 QObject::connect(impl, &PlayerImplementation::mprisPropertiesChanged,
237 m_propertyNotifier.notify({
238 "CanPlay",
"CanPause",
"CanSeek",
239 "CanGoPrevious",
"CanGoNext",
242 QObject::connect(impl, &PlayerImplementation::playbackStatusChanged,
244 m_propertyNotifier.notify({
"PlaybackStatus" });
246 QObject::connect(impl, &PlayerImplementation::metadataForCurrentTrackChanged,
248 m_propertyNotifier.notify({
"Metadata" });
252 m_propertyNotifier.notify();
262 return QStringLiteral(
"Playing");
264 return QStringLiteral(
"Paused");
266 return QStringLiteral(
"Stopped");
274 int value = QMetaEnum::fromType<LoopStatus>().
275 keyToValue(status.toUtf8().constData(), &ok);
277 MH_ERROR(
"Invalid loop status: %s", qUtf8Printable(status));
286 return QMetaEnum::fromType<LoopStatus>().valueToKey(value);
302 if (!m_player)
return;
304 switch (m_player->playbackStatus()) {
330 m_connection(QDBusConnection::sessionBus()),
348 return d->m_playerAdaptor->setPlayer(impl);
354 return d->m_playerAdaptor->player();
360 return d->m_playerAdaptor->player();
366 return d->m_connection.registerObject(
objectPath,
this);
369#include "media_player2.moc"
qint16 orientation() const
media::PlayerImplementation * player()
double maximumRate() const
void setShuffle(bool shuffle)
double minimumRate() const
void setVolume(double volume)
void VideoDimensionChanged(quint32 height, quint32 width)
void OpenUri(const QDBusMessage &)
void setTypedLoopStatus(qint16 status)
void setLoopStatus(const QString &status)
qint16 audioStreamRole() const
double playbackRate() const
bool isAudioSource() const
QVariantMap metadata() const
void SetPosition(const QDBusObjectPath &, quint64)
bool canGoPrevious() const
void Buffering(int percent)
void setPlaybackRate(double rate)
bool isVideoSource() const
void setPlayer(media::PlayerImplementation *impl)
void PlaybackStatusChanged(quint16 status)
void Seeked(quint64 microSeconds)
QString playbackStatus() const
PlayerAdaptor(const QDBusConnection &connection, QObject *parent)
qint16 typedLoopStatus() const
void Seek(quint64 microSeconds)
QString loopStatus() const
const media::PlayerImplementation * player() const
virtual ~PlaylistsAdaptor()=default
PlaylistsAdaptor(QObject *parent)
quint32 playlistCount() const
QStringList orderings() const
QStringList supportedMimeTypes() const
RootAdaptor(QObject *parent)
virtual ~RootAdaptor()=default
QStringList SupportedMimeTypes
QStringList supportedUriSchemes() const
bool falseProperty() const
QStringList SupportedUriSchemes
QString desktopEntry() const
static constexpr const char * paused
static constexpr const char * playing
static constexpr const char * stopped