diff options
| author | Andrew Branson <andrew.branson@cern.ch> | 2015-04-17 11:39:31 +0200 |
|---|---|---|
| committer | Andrew Branson <andrew.branson@cern.ch> | 2015-04-17 19:11:42 +0200 |
| commit | d9f2e79eff8744bd5bd422133117693d42ee52da (patch) | |
| tree | b8ba17fb4114476af90df71b47e93936132798b6 | |
| parent | 3c506a45669f76628306c2e06653bc507e73627a (diff) | |
Connect to PulseAudio and read maximum volume in the constructor instead
of every time a volume button is pressed. Disconnect in destructor.
| -rw-r--r-- | daemon/musicmanager.cpp | 128 | ||||
| -rw-r--r-- | daemon/musicmanager.h | 3 |
2 files changed, 69 insertions, 62 deletions
diff --git a/daemon/musicmanager.cpp b/daemon/musicmanager.cpp index 130f39e..b9b217f 100644 --- a/daemon/musicmanager.cpp +++ b/daemon/musicmanager.cpp @@ -4,7 +4,7 @@ MusicManager::MusicManager(WatchConnector *watch, QObject *parent) : QObject(parent), l(metaObject()->className()), - watch(watch), _watcher(new QDBusServiceWatcher(this)) + watch(watch), _watcher(new QDBusServiceWatcher(this)), _pulseBus(NULL), _maxVolume(0) { QDBusConnection bus = QDBusConnection::sessionBus(); QDBusConnectionInterface *bus_iface = bus.interface(); @@ -33,6 +33,32 @@ MusicManager::MusicManager(WatchConnector *watch, QObject *parent) bus.connect("", "/org/mpris/MediaPlayer2", "org.freedesktop.DBus.Properties", "PropertiesChanged", this, SLOT(handleMprisPropertiesChanged(QString,QMap<QString,QVariant>,QStringList))); + // Locate and connect to the PulseAudio DBus to control system volume + // Look up PulseAudio P2P Bus address + 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(); + _pulseBus = new QDBusConnection(QDBusConnection::connectToPeer(lookupReply.value().variant().toString(), "org.PulseAudio1")); + } + else { + qCDebug(l) << "Cannot find PulseAudio Bus address, cannot control system volume."; + } + + // 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 = _pulseBus->call(call); + if (volumeMaxReply.isValid()) { + _maxVolume = volumeMaxReply.value().variant().toUInt(); + } + else { + qCWarning(l) << "Could not read volume max, cannot adjust volume: " << volumeMaxReply.error().message(); + } + // Now set up the Pebble endpoint handler for music control commands watch->setEndpointHandler(WatchConnector::watchMUSIC_CONTROL, [this](const QByteArray& data) { handleMusicControl(WatchConnector::MusicControl(data.at(0))); @@ -44,6 +70,13 @@ MusicManager::MusicManager(WatchConnector *watch, QObject *parent) this, &MusicManager::handleWatchConnected); } +MusicManager::~MusicManager() +{ + qCDebug(l) << "Disconnecting from PulseAudio P2P DBus"; + QDBusConnection::disconnectFromBus("org.PulseAudio1"); + delete(_pulseBus); +} + void MusicManager::switchToService(const QString &service) { if (_curService != service) { @@ -136,76 +169,47 @@ void MusicManager::handleMusicControl(WatchConnector::MusicControl operation) break; case WatchConnector::musicVOLUME_UP: - case WatchConnector::musicVOLUME_DOWN: { - // Look up PulseAudio P2P Bus address - QDBusConnection bus = QDBusConnection::sessionBus(); - 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", + case WatchConnector::musicVOLUME_DOWN: + if (_pulseBus != NULL) { + // Query current volume + QDBusMessage 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 << "com.Meego.MainVolume2" << "CurrentStep"; - - QDBusReply<QDBusVariant> volumeReply = bus.call(call); - if (volumeReply.isValid()) { - // 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 { + call << "com.Meego.MainVolume2" << "CurrentStep"; + + QDBusReply<QDBusVariant> volumeReply = _pulseBus->call(call); + if (volumeReply.isValid()) { + // 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 { qCDebug(l) << "Volume already at limit"; newVolume = volume; - } + } - // If we have a new volume level, change it - if (newVolume != volume) { - qCDebug(l) << "Setting volume: " << newVolume; + // If we have a new volume level, change it + if (newVolume != volume) { + qCDebug(l) << "Setting volume: " << newVolume; - call = QDBusMessage::createMethodCall("com.Meego.MainVolume2", "/com/meego/mainvolume2", - "org.freedesktop.DBus.Properties", "Set"); - call << "com.Meego.MainVolume2" << "CurrentStep" << QVariant::fromValue(QDBusVariant(newVolume)); + 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(); + QDBusError err = _pulseBus->call(call); + if (err.isValid()) { + qCWarning(l) << err.message(); + } } + } else { + qCWarning(l) << volumeReply.error().message(); } - } else { - qCWarning(l) << volumeReply.error().message(); } - QDBusConnection::disconnectFromBus("org.PulseAudio1"); - } break; diff --git a/daemon/musicmanager.h b/daemon/musicmanager.h index 14aa6fb..4ad03a8 100644 --- a/daemon/musicmanager.h +++ b/daemon/musicmanager.h @@ -13,6 +13,7 @@ class MusicManager : public QObject, protected QDBusContext public: explicit MusicManager(WatchConnector *watch, QObject *parent = 0); + virtual ~MusicManager(); private: void switchToService(const QString &service); @@ -31,6 +32,8 @@ private: QDBusServiceWatcher *_watcher; QString _curService; QVariantMap _curMetadata; + QDBusConnection *_pulseBus; + uint _maxVolume; }; #endif // MUSICMANAGER_H |
