summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomasz Sterna <tomek@xiaoka.com>2014-07-18 00:59:33 +0200
committerTomasz Sterna <tomek@xiaoka.com>2014-07-18 00:59:33 +0200
commit524a0a854c4cafad8ccbc645a858029bf97a045e (patch)
tree3db75d07ea01f6647b975e7991325d381ed60b1b
parent7d8f121652ceecc371a5f73986e2ef8fc2f1e4be (diff)
Implemented Music ControlRELASE_0.6
-rw-r--r--daemon/manager.cpp2
-rw-r--r--daemon/manager.h4
-rw-r--r--daemon/watchcommands.cpp86
-rw-r--r--daemon/watchcommands.h3
-rw-r--r--daemon/watchconnector.cpp2
-rw-r--r--daemon/watchconnector.h4
-rw-r--r--pebble.pro1
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();
diff --git a/pebble.pro b/pebble.pro
index b3df9cf..9c9fd13 100644
--- a/pebble.pro
+++ b/pebble.pro
@@ -2,5 +2,6 @@ TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS = ext daemon app
OTHER_FILES += \
+ README.md \
rpm/pebble.spec \
rpm/pebble.yaml