summaryrefslogtreecommitdiff
path: root/daemon/musicmanager.cpp
diff options
context:
space:
mode:
authorJavier <dev.git@javispedro.com>2014-12-12 02:33:03 +0100
committerJavier <dev.git@javispedro.com>2014-12-12 02:33:03 +0100
commit617c632f245c44151f0e17917f9e158403c444c6 (patch)
treea1e9ed4bf8f5471a1ac2a4254efc0680feaee1dc /daemon/musicmanager.cpp
parent8c86d80504bec6524d9c5006d168438500130ca5 (diff)
move the mpris tracking into musicmanager
Diffstat (limited to 'daemon/musicmanager.cpp')
-rw-r--r--daemon/musicmanager.cpp159
1 files changed, 134 insertions, 25 deletions
diff --git a/daemon/musicmanager.cpp b/daemon/musicmanager.cpp
index abea715..e018e4c 100644
--- a/daemon/musicmanager.cpp
+++ b/daemon/musicmanager.cpp
@@ -4,28 +4,45 @@
MusicManager::MusicManager(WatchConnector *watch, QObject *parent)
: QObject(parent), watch(watch)
{
+ QDBusConnection bus = QDBusConnection::sessionBus();
+ QDBusConnectionInterface *bus_iface = bus.interface();
+
+ // Listen for MPRIS signals from every player
+ bus.connect("", "/org/mpris/MediaPlayer2", "org.freedesktop.DBus.Properties", "PropertiesChanged",
+ this, SLOT(handleMprisPropertiesChanged(QString,QMap<QString,QVariant>,QStringList)));
+
+ // Listen for D-Bus name registered signals to see if a MPRIS service comes up
+ connect(bus_iface, &QDBusConnectionInterface::serviceRegistered,
+ this, &MusicManager::handleServiceRegistered);
+ connect(bus_iface, &QDBusConnectionInterface::serviceUnregistered,
+ this, &MusicManager::handleServiceUnregistered);
+ connect(bus_iface, &QDBusConnectionInterface::serviceOwnerChanged,
+ this, &MusicManager::handleServiceOwnerChanged);
+
+ // But also try to find an already active MPRIS service
+ const QStringList &services = bus_iface->registeredServiceNames();
+ foreach (QString service, services) {
+ if (service.startsWith("org.mpris.MediaPlayer2.")) {
+ switchToService(service);
+ break;
+ }
+ }
+
+ // Set up watch endpoint handler
watch->setEndpointHandler(WatchConnector::watchMUSIC_CONTROL, [this](const QByteArray& data) {
musicControl(WatchConnector::MusicControl(data.at(0)));
return true;
});
-}
-
-void MusicManager::onMprisMetadataChanged(QVariantMap metadata)
-{
- QString track = metadata.value("xesam:title").toString();
- QString album = metadata.value("xesam:album").toString();
- QString artist = metadata.value("xesam:artist").toString();
- logger()->debug() << __FUNCTION__ << track << album << artist;
- watch->sendMusicNowPlaying(track, album, artist);
+ connect(watch, &WatchConnector::connectedChanged,
+ this, &MusicManager::handleWatchConnected);
}
void MusicManager::musicControl(WatchConnector::MusicControl operation)
{
- logger()->debug() << "Operation:" << operation;
+ logger()->debug() << "operation from watch:" << operation;
- QString mpris = parent()->property("mpris").toString();
- if (mpris.isEmpty()) {
- logger()->debug() << "No mpris interface active";
+ if (_curService.isEmpty()) {
+ logger()->info() << "No mpris interface active";
return;
}
@@ -50,11 +67,11 @@ void MusicManager::musicControl(WatchConnector::MusicControl operation)
case WatchConnector::musicVOLUME_UP:
case WatchConnector::musicVOLUME_DOWN: {
QDBusConnection bus = QDBusConnection::sessionBus();
- QDBusReply<QDBusVariant> VolumeReply = bus.call(
- QDBusMessage::createMethodCall(mpris, "/org/mpris/MediaPlayer2", "org.freedesktop.DBus.Properties", "Get")
- << "org.mpris.MediaPlayer2.Player" << "Volume");
- if (VolumeReply.isValid()) {
- double volume = VolumeReply.value().variant().toDouble();
+ QDBusMessage call = QDBusMessage::createMethodCall(_curService, "/org/mpris/MediaPlayer2", "org.freedesktop.DBus.Properties", "Get");
+ call << "org.mpris.MediaPlayer2.Player" << "Volume";
+ QDBusReply<QDBusVariant> volumeReply = bus.call(call);
+ if (volumeReply.isValid()) {
+ double volume = volumeReply.value().variant().toDouble();
if (operation == WatchConnector::musicVOLUME_UP) {
volume += 0.1;
}
@@ -62,22 +79,25 @@ void MusicManager::musicControl(WatchConnector::MusicControl operation)
volume -= 0.1;
}
logger()->debug() << "Setting volume" << volume;
- QDBusError err = QDBusConnection::sessionBus().call(
- QDBusMessage::createMethodCall(mpris, "/org/mpris/MediaPlayer2", "org.freedesktop.DBus.Properties", "Set")
- << "org.mpris.MediaPlayer2.Player" << "Volume" << QVariant::fromValue(QDBusVariant(volume)));
+
+ call = QDBusMessage::createMethodCall(_curService, "/org/mpris/MediaPlayer2", "org.freedesktop.DBus.Properties", "Set");
+ call << "org.mpris.MediaPlayer2.Player" << "Volume" << QVariant::fromValue(QDBusVariant(volume));
+
+ QDBusError err = QDBusConnection::sessionBus().call(call);
if (err.isValid()) {
logger()->error() << err.message();
}
} else {
- logger()->error() << VolumeReply.error().message();
+ logger()->error() << volumeReply.error().message();
}
}
return;
case WatchConnector::musicGET_NOW_PLAYING:
- onMprisMetadataChanged(parent()->property("mprisMetadata").toMap());
+ setMprisMetadata(_curMetadata);
return;
case WatchConnector::musicSEND_NOW_PLAYING:
+ default:
logger()->warn() << "Operation" << operation << "not supported";
return;
}
@@ -89,9 +109,98 @@ void MusicManager::musicControl(WatchConnector::MusicControl operation)
logger()->debug() << operation << "->" << method;
- QDBusError err = QDBusConnection::sessionBus().call(
- QDBusMessage::createMethodCall(mpris, "/org/mpris/MediaPlayer2", "org.mpris.MediaPlayer2.Player", method));
+ QDBusMessage call = QDBusMessage::createMethodCall(_curService, "/org/mpris/MediaPlayer2", "org.mpris.MediaPlayer2.Player", method);
+ QDBusError err = QDBusConnection::sessionBus().call(call);
if (err.isValid()) {
logger()->error() << err.message();
}
}
+
+void MusicManager::switchToService(const QString &service)
+{
+ if (_curService != service) {
+ logger()->debug() << "switching to mpris service" << service;
+ _curService = service;
+ }
+}
+
+void MusicManager::setMprisMetadata(const QVariantMap &metadata)
+{
+ _curMetadata = metadata;
+ QString track = metadata.value("xesam:title").toString();
+ QString album = metadata.value("xesam:album").toString();
+ QString artist = metadata.value("xesam:artist").toString();
+ logger()->debug() << "new mpris metadata:" << track << album << artist;
+
+ if (watch->isConnected()) {
+ watch->sendMusicNowPlaying(track, album, artist);
+ }
+}
+
+void MusicManager::handleServiceRegistered(const QString &service)
+{
+ if (service.startsWith("org.mpris.MediaPlayer2.")) {
+ if (_curService.isEmpty()) {
+ switchToService(service);
+ }
+ }
+}
+
+void MusicManager::handleServiceUnregistered(const QString &service)
+{
+ if (service == _curService) {
+ // Oops!
+ setMprisMetadata(QVariantMap());
+ switchToService(QString());
+ }
+}
+
+void MusicManager::handleServiceOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner)
+{
+ Q_UNUSED(oldOwner);
+ if (newOwner.isEmpty()) {
+ handleServiceUnregistered(name);
+ } else {
+ handleServiceRegistered(name);
+ }
+}
+
+void MusicManager::handleMprisPropertiesChanged(const QString &interface, const QMap<QString, QVariant> &changed, const QStringList &invalidated)
+{
+ Q_ASSERT(calledFromDBus());
+ Q_UNUSED(interface);
+ Q_UNUSED(invalidated);
+
+ if (changed.contains("Metadata")) {
+ QVariantMap metadata = qdbus_cast<QVariantMap>(changed.value("Metadata").value<QDBusArgument>());
+ logger()->debug() << "received new metadata" << metadata;
+ setMprisMetadata(metadata);
+ }
+
+ if (changed.contains("PlaybackStatus")) {
+ QString status = changed.value("PlaybackStatus").toString();
+ if (status == "Stopped") {
+ setMprisMetadata(QVariantMap());
+ }
+ }
+
+ switchToService(message().service());
+}
+
+void MusicManager::handleWatchConnected()
+{
+ if (watch->isConnected()) {
+ if (!_curService.isEmpty()) {
+ QDBusMessage call = QDBusMessage::createMethodCall(_curService, "/org/mpris/MediaPlayer2", "org.freedesktop.DBus.Properties", "Get");
+ call << "org.mpris.MediaPlayer2.Player" << "Metadata";
+ QDBusReply<QDBusVariant> metadata = QDBusConnection::sessionBus().call(call);
+ if (metadata.isValid()) {
+ setMprisMetadata(qdbus_cast<QVariantMap>(metadata.value().variant().value<QDBusArgument>()));
+ //
+ } else {
+ logger()->error() << metadata.error().message();
+ setMprisMetadata(QVariantMap());
+ }
+ }
+ }
+}