mirror of
https://github.com/kavishdevar/librepods.git
synced 2026-02-01 07:39:11 +00:00
[Linux] DBus fixes
This commit is contained in:
committed by
Tim Gromeyer
parent
48ae249405
commit
91ffaaa972
77
linux/playerstatuswatcher.cpp
Normal file
77
linux/playerstatuswatcher.cpp
Normal file
@@ -0,0 +1,77 @@
|
||||
#include "media/playerstatuswatcher.h"
|
||||
#include <QDBusConnection>
|
||||
#include <QDBusPendingReply>
|
||||
#include <QVariantMap>
|
||||
#include <QDBusReply>
|
||||
|
||||
PlayerStatusWatcher::PlayerStatusWatcher(const QString &playerService, QObject *parent)
|
||||
: QObject(parent),
|
||||
m_playerService(playerService),
|
||||
m_iface(new QDBusInterface(playerService, "/org/mpris/MediaPlayer2",
|
||||
"org.mpris.MediaPlayer2.Player", QDBusConnection::sessionBus(), this)),
|
||||
m_serviceWatcher(new QDBusServiceWatcher(playerService, QDBusConnection::sessionBus(),
|
||||
QDBusServiceWatcher::WatchForOwnerChange, this))
|
||||
{
|
||||
// Register this object on the session bus to receive D-Bus messages
|
||||
QDBusConnection::sessionBus().registerObject("/PlayerStatusWatcher", this,
|
||||
QDBusConnection::ExportAllSlots);
|
||||
|
||||
QDBusConnection::sessionBus().connect(
|
||||
playerService, "/org/mpris/MediaPlayer2", "org.freedesktop.DBus.Properties",
|
||||
"PropertiesChanged", this, SLOT(onPropertiesChanged(QString,QVariantMap,QStringList))
|
||||
);
|
||||
connect(m_serviceWatcher, &QDBusServiceWatcher::serviceOwnerChanged,
|
||||
this, &PlayerStatusWatcher::onServiceOwnerChanged);
|
||||
updateStatus();
|
||||
}
|
||||
|
||||
void PlayerStatusWatcher::onPropertiesChanged(const QString &interface,
|
||||
const QVariantMap &changed,
|
||||
const QStringList &)
|
||||
{
|
||||
// Get the service name of the sender
|
||||
QString sender = message().service();
|
||||
|
||||
// Skip if it's a KDE Connect player
|
||||
if (sender.contains("kdeconnect", Qt::CaseInsensitive)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (interface == "org.mpris.MediaPlayer2.Player" && changed.contains("PlaybackStatus")) {
|
||||
emit playbackStatusChanged(changed.value("PlaybackStatus").toString());
|
||||
}
|
||||
}
|
||||
|
||||
void PlayerStatusWatcher::updateStatus() {
|
||||
QVariant reply = m_iface->property("PlaybackStatus");
|
||||
if (reply.isValid()) {
|
||||
emit playbackStatusChanged(reply.toString());
|
||||
}
|
||||
}
|
||||
|
||||
void PlayerStatusWatcher::onServiceOwnerChanged(const QString &name, const QString &, const QString &newOwner)
|
||||
{
|
||||
if (name == m_playerService && newOwner.isEmpty()) {
|
||||
emit playbackStatusChanged(""); // player disappeared
|
||||
} else if (name == m_playerService && !newOwner.isEmpty()) {
|
||||
updateStatus(); // player appeared/reappeared
|
||||
}
|
||||
}
|
||||
|
||||
QString PlayerStatusWatcher::getCurrentPlaybackStatus(const QString &playerService)
|
||||
{
|
||||
QDBusInterface iface(
|
||||
playerService,
|
||||
"/org/mpris/MediaPlayer2",
|
||||
"org.mpris.MediaPlayer2.Player",
|
||||
QDBusConnection::sessionBus());
|
||||
QVariant reply = iface.property("PlaybackStatus");
|
||||
if (reply.isValid())
|
||||
{
|
||||
return reply.toString(); // "Playing", "Paused", "Stopped"
|
||||
}
|
||||
else
|
||||
{
|
||||
return QString(); // or handle error as needed
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user