summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Branson <andrew.branson@cern.ch>2015-04-17 10:13:10 +0200
committerAndrew Branson <andrew.branson@cern.ch>2015-04-17 19:11:42 +0200
commit3c506a45669f76628306c2e06653bc507e73627a (patch)
treecc90fbf1c2396f41c6ffe9bf1ff9ed9e90c1ff22
parent8bb7a35eedd431f707ca6fb9134c35bace8e4b24 (diff)
Switched volume control to control system volume via PulseAudio P2P
DBus. Enable volume controls when no MPRIS is available.
-rw-r--r--daemon/musicmanager.cpp75
1 files changed, 60 insertions, 15 deletions
diff --git a/daemon/musicmanager.cpp b/daemon/musicmanager.cpp
index 385abbf..130f39e 100644
--- a/daemon/musicmanager.cpp
+++ b/daemon/musicmanager.cpp
@@ -112,7 +112,8 @@ void MusicManager::handleMusicControl(WatchConnector::MusicControl operation)
{
qCDebug(l) << "operation from watch:" << operation;
- if (_curService.isEmpty()) {
+ if (_curService.isEmpty() &&
+ operation != WatchConnector::musicVOLUME_UP && operation != WatchConnector::musicVOLUME_DOWN) {
qCDebug(l) << "can't do any music operation, no mpris interface active";
return;
}
@@ -136,33 +137,77 @@ void MusicManager::handleMusicControl(WatchConnector::MusicControl operation)
case WatchConnector::musicVOLUME_UP:
case WatchConnector::musicVOLUME_DOWN: {
+ // Look up PulseAudio P2P Bus address
QDBusConnection bus = QDBusConnection::sessionBus();
- QDBusMessage call = QDBusMessage::createMethodCall(_curService, "/org/mpris/MediaPlayer2",
+ QDBusMessage call = QDBusMessage::createMethodCall("org.PulseAudio1", "/org/pulseaudio/server_lookup1", "org.freedesktop.DBus.Properties", "Get" );
+ call << "org.PulseAudio.ServerLookup1" << "Address";
+ QDBusReply<QDBusVariant> lookupReply = bus.call(call);
+ if (lookupReply.isValid()) {
+ //
+ qCDebug(l) << "PulseAudio Bus address: " << lookupReply.value().variant().toString();
+ bus = QDBusConnection::connectToPeer(lookupReply.value().variant().toString(), "org.PulseAudio1");
+ }
+ else {
+ qCDebug(l) << "Cannot find PulseAudio Bus address, cannot control system volume.";
+ break;
+ }
+
+ // Query max volume
+ call = QDBusMessage::createMethodCall("com.Meego.MainVolume2", "/com/meego/mainvolume2",
+ "org.freedesktop.DBus.Properties", "Get");
+ call << "com.Meego.MainVolume2" << "StepCount";
+ QDBusReply<QDBusVariant> volumeMaxReply = bus.call(call);
+ uint maxVolume;
+ if (volumeMaxReply.isValid()) {
+ maxVolume = volumeMaxReply.value().variant().toUInt();
+ }
+ else {
+ qCWarning(l) << "Could not read volume max, cannot adjust volume: " << volumeMaxReply.error().message();
+ maxVolume = 0;
+ }
+
+ // Query current volume
+ call = QDBusMessage::createMethodCall("com.Meego.MainVolume2", "/com/meego/mainvolume2",
"org.freedesktop.DBus.Properties", "Get");
- call << "org.mpris.MediaPlayer2.Player" << "Volume";
+ call << "com.Meego.MainVolume2" << "CurrentStep";
+
QDBusReply<QDBusVariant> volumeReply = bus.call(call);
if (volumeReply.isValid()) {
- double volume = volumeReply.value().variant().toDouble();
- if (operation == WatchConnector::musicVOLUME_UP) {
- volume += 0.1;
+ // Decide the new value for volume, taking limits into account
+ uint volume = volumeReply.value().variant().toUInt();
+ uint newVolume;
+ qCDebug(l) << "Current volume: " << volumeReply.value().variant().toUInt();
+ if (operation == WatchConnector::musicVOLUME_UP && volume < maxVolume-1 ) {
+ newVolume = volume + 1;
+ }
+ else if (operation == WatchConnector::musicVOLUME_DOWN && volume > 0) {
+ newVolume = volume - 1;
}
else {
- volume -= 0.1;
+ qCDebug(l) << "Volume already at limit";
+ newVolume = volume;
}
- qCDebug(l) << "Setting volume" << volume;
- call = QDBusMessage::createMethodCall(_curService, "/org/mpris/MediaPlayer2", "org.freedesktop.DBus.Properties", "Set");
- call << "org.mpris.MediaPlayer2.Player" << "Volume" << QVariant::fromValue(QDBusVariant(volume));
+ // If we have a new volume level, change it
+ if (newVolume != volume) {
+ qCDebug(l) << "Setting volume: " << newVolume;
- QDBusError err = QDBusConnection::sessionBus().call(call);
- if (err.isValid()) {
- qCWarning(l) << err.message();
+ call = QDBusMessage::createMethodCall("com.Meego.MainVolume2", "/com/meego/mainvolume2",
+ "org.freedesktop.DBus.Properties", "Set");
+ call << "com.Meego.MainVolume2" << "CurrentStep" << QVariant::fromValue(QDBusVariant(newVolume));
+
+ QDBusError err = bus.call(call);
+ if (err.isValid()) {
+ qCWarning(l) << err.message();
+ }
}
} else {
qCWarning(l) << volumeReply.error().message();
}
- }
- break;
+ QDBusConnection::disconnectFromBus("org.PulseAudio1");
+ }
+ break;
+
case WatchConnector::musicGET_NOW_PLAYING:
sendCurrentMprisMetadata();