summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Branson <andrew.branson@cern.ch>2015-04-17 11:39:31 +0200
committerAndrew Branson <andrew.branson@cern.ch>2015-04-17 19:11:42 +0200
commitd9f2e79eff8744bd5bd422133117693d42ee52da (patch)
treeb8ba17fb4114476af90df71b47e93936132798b6
parent3c506a45669f76628306c2e06653bc507e73627a (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.cpp128
-rw-r--r--daemon/musicmanager.h3
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