diff options
| author | Andrew Branson <andrew.branson@cern.ch> | 2015-04-17 10:13:10 +0200 |
|---|---|---|
| committer | Andrew Branson <andrew.branson@cern.ch> | 2015-04-17 19:11:42 +0200 |
| commit | 3c506a45669f76628306c2e06653bc507e73627a (patch) | |
| tree | cc90fbf1c2396f41c6ffe9bf1ff9ed9e90c1ff22 | |
| parent | 8bb7a35eedd431f707ca6fb9134c35bace8e4b24 (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.cpp | 75 |
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(); |
