diff options
| author | Tomasz Sterna <tomek@xiaoka.com> | 2014-07-18 00:59:33 +0200 |
|---|---|---|
| committer | Tomasz Sterna <tomek@xiaoka.com> | 2014-07-18 00:59:33 +0200 |
| commit | 524a0a854c4cafad8ccbc645a858029bf97a045e (patch) | |
| tree | 3db75d07ea01f6647b975e7991325d381ed60b1b | |
| parent | 7d8f121652ceecc371a5f73986e2ef8fc2f1e4be (diff) | |
Implemented Music ControlRELASE_0.6
| -rw-r--r-- | daemon/manager.cpp | 2 | ||||
| -rw-r--r-- | daemon/manager.h | 4 | ||||
| -rw-r--r-- | daemon/watchcommands.cpp | 86 | ||||
| -rw-r--r-- | daemon/watchcommands.h | 3 | ||||
| -rw-r--r-- | daemon/watchconnector.cpp | 2 | ||||
| -rw-r--r-- | daemon/watchconnector.h | 4 | ||||
| -rw-r--r-- | pebble.pro | 1 |
7 files changed, 94 insertions, 8 deletions
diff --git a/daemon/manager.cpp b/daemon/manager.cpp index 496f6d8..a2365b4 100644 --- a/daemon/manager.cpp +++ b/daemon/manager.cpp @@ -26,7 +26,7 @@ Manager::Manager(watch::WatchConnector *watch, DBusConnector *dbus, VoiceCallMan connect(watch, SIGNAL(connectedChanged()), SLOT(onConnectedChanged())); - connect(watch, SIGNAL(messageDecoded(uint,uint,QByteArray)), commands, SLOT(processMessage(uint,uint,QByteArray))); + connect(watch, SIGNAL(messageDecoded(uint,QByteArray)), commands, SLOT(processMessage(uint,QByteArray))); connect(commands, SIGNAL(hangup()), SLOT(hangupAll())); // Set BT icon for notification diff --git a/daemon/manager.h b/daemon/manager.h index ba482bb..e967dae 100644 --- a/daemon/manager.h +++ b/daemon/manager.h @@ -27,6 +27,9 @@ class Manager : friend class PebbledProxy; + Q_PROPERTY(QString mpris READ mpris) + Q_PROPERTY(QVariantMap mprisMetadata READ getMprisMetadata WRITE setMprisMetadata NOTIFY mprisMetadataChanged) + QBluetoothLocalDevice btDevice; watch::WatchConnector *watch; @@ -50,6 +53,7 @@ public: Q_INVOKABLE void processUnreadMessages(GroupObject *group); Q_INVOKABLE QString mpris(); QVariantMap mprisMetadata; + QVariantMap getMprisMetadata() { return mprisMetadata; } signals: void mprisMetadataChanged(QVariantMap); diff --git a/daemon/watchcommands.cpp b/daemon/watchcommands.cpp index 1df811a..9cd95b5 100644 --- a/daemon/watchcommands.cpp +++ b/daemon/watchcommands.cpp @@ -1,15 +1,17 @@ #include "watchcommands.h" +#include <QDBusConnection> +#include <QDBusMessage> +#include <QDBusReply> + using namespace watch; WatchCommands::WatchCommands(WatchConnector *watch, QObject *parent) : QObject(parent), watch(watch) {} -void WatchCommands::processMessage(uint endpoint, uint datalen, QByteArray data) +void WatchCommands::processMessage(uint endpoint, QByteArray data) { - Q_UNUSED(datalen); - logger()->debug() << __FUNCTION__ << endpoint << "/" << data.length(); switch (endpoint) { case WatchConnector::watchPHONE_VERSION: @@ -22,6 +24,7 @@ void WatchCommands::processMessage(uint endpoint, uint datalen, QByteArray data) break; case WatchConnector::watchMUSIC_CONTROL: logger()->debug() << "MUSIC_CONTROL" << data.toHex(); + musicControl(WatchConnector::MusicControl(data.at(0))); break; default: @@ -37,3 +40,80 @@ void WatchCommands::onMprisMetadataChanged(QVariantMap metadata) logger()->debug() << __FUNCTION__ << track << album << artist; watch->sendMusicNowPlaying(track, album, artist); } + +void WatchCommands::musicControl(WatchConnector::MusicControl operation) +{ + logger()->debug() << "Operation:" << operation; + + QString mpris = parent()->property("mpris").toString(); + if (mpris.isEmpty()) { + logger()->debug() << "No mpris interface active"; + return; + } + + QString method; + + switch(operation) { + case WatchConnector::musicPLAY_PAUSE: + method = "PlayPause"; + break; + case WatchConnector::musicPAUSE: + method = "Pause"; + break; + case WatchConnector::musicPLAY: + method = "Play"; + break; + case WatchConnector::musicNEXT: + method = "Next"; + break; + case WatchConnector::musicPREVIOUS: + method = "Previous"; + break; + case WatchConnector::musicVOLUME_UP: + case WatchConnector::musicVOLUME_DOWN: { + QDBusReply<QDBusVariant> VolumeReply = QDBusConnection::sessionBus().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(); + if (operation == WatchConnector::musicVOLUME_UP) { + volume += 0.1; + } + else { + 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))); + if (err.isValid()) { + logger()->error() << err.message(); + } + } + else { + logger()->error() << VolumeReply.error().message(); + } + } + return; + case WatchConnector::musicGET_NOW_PLAYING: + onMprisMetadataChanged(parent()->property("mprisMetadata").toMap()); + return; + + case WatchConnector::musicSEND_NOW_PLAYING: + logger()->warn() << "Operation" << operation << "not supported"; + return; + } + + if (method.isEmpty()) { + logger()->error() << "Requested unsupported operation" << operation; + return; + } + + logger()->debug() << operation << "->" << method; + + QDBusError err = QDBusConnection::sessionBus().call( + QDBusMessage::createMethodCall(mpris, "/org/mpris/MediaPlayer2", "org.mpris.MediaPlayer2.Player", method)); + if (err.isValid()) { + logger()->error() << err.message(); + } +} diff --git a/daemon/watchcommands.h b/daemon/watchcommands.h index 6ce70bb..4bd8f3d 100644 --- a/daemon/watchcommands.h +++ b/daemon/watchcommands.h @@ -20,10 +20,11 @@ signals: void hangup(); public slots: - void processMessage(uint endpoint, uint datalen, QByteArray data); + void processMessage(uint endpoint, QByteArray data); protected slots: void onMprisMetadataChanged(QVariantMap metadata); + void musicControl(watch::WatchConnector::MusicControl operation); }; diff --git a/daemon/watchconnector.cpp b/daemon/watchconnector.cpp index 89d504b..1bdec8d 100644 --- a/daemon/watchconnector.cpp +++ b/daemon/watchconnector.cpp @@ -98,7 +98,7 @@ void WatchConnector::decodeMsg(QByteArray data) logger()->debug() << "Length:" << datalen << " Endpoint:" << decodeEndpoint(endpoint); logger()->debug() << "Data:" << data.mid(index).toHex(); - emit messageDecoded(endpoint, datalen, data); + emit messageDecoded(endpoint, data.mid(index, datalen)); } void WatchConnector::onReadSocket() diff --git a/daemon/watchconnector.h b/daemon/watchconnector.h index dafaa83..936deff 100644 --- a/daemon/watchconnector.h +++ b/daemon/watchconnector.h @@ -88,7 +88,7 @@ public: callSTART = 8, callEND = 9 }; - enum { + enum MusicControl { musicPLAY_PAUSE = 1, musicPAUSE = 2, musicPLAY = 3, @@ -137,7 +137,7 @@ public: signals: void messageReceived(QString peer, QString msg); - void messageDecoded(uint endpoint, uint datalen, QByteArray data); + void messageDecoded(uint endpoint, QByteArray data); void nameChanged(); void connectedChanged(); @@ -2,5 +2,6 @@ TEMPLATE = subdirs CONFIG += ordered SUBDIRS = ext daemon app OTHER_FILES += \ + README.md \ rpm/pebble.spec \ rpm/pebble.yaml |
