Bind the slider volume to the 4a active role
[apps/homescreen.git] / homescreen / src / mastervolume.cpp
index 9fb92a9..35b47fc 100644 (file)
  */
 
 #include "mastervolume.h"
+#include <QJsonObject>
+#include <QTimer>
+#include <QtDebug>
 
-void MasterVolume::setVolume(int volume)
+MasterVolume::MasterVolume(QObject* parent)
+       : QObject(parent)
+       , m_volume{50}
 {
-       int volume_delta = volume - m_volume;
-       m_volume = volume;
-       emit sliderVolumeChanged(volume_delta);
+       connect(&m_client, SIGNAL(connected()), this, SLOT(onClientConnected()));
+       connect(&m_client, SIGNAL(disconnected()), this, SLOT(onClientDisconnected()));
+       connect(&m_client, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onClientError(QAbstractSocket::SocketError)));
+       connect(&m_client, SIGNAL(eventReceived(QString, const QJsonValue&)), this, SLOT(onClientEventReceived(QString, const QJsonValue&)));
+}
+
+void MasterVolume::open(const QUrl& url)
+{
+       m_url = url;
+       TryOpen();
+}
+
+qint32 MasterVolume::getVolume() const
+{
+       return m_volume;
+}
+
+void MasterVolume::setVolume(qint32 volume)
+{
+       if (m_volume != volume)
+       {
+               m_volume = volume;
+               QJsonObject arg;
+               arg.insert("action", "volume");
+               arg.insert("value", volume);
+               m_client.call("ahl-4a", "activerole", arg, [](bool, const QJsonValue&) {
+                       // Nothing to do, events will update sliders
+               });
+       }
+}
 
+void MasterVolume::onClientConnected()
+{
+       // Subscribe to 4a events
+       m_client.call("ahl-4a", "subscribe", QJsonValue(), [this](bool r, const QJsonValue&) {
+               if (r) qDebug() << "MasterVolume::onClientConnected - subscribed to 4a events!";
+               else qCritical () << "MasterVolume::onClientConnected - Failed to subscribe to 4a events!";
+       });
+}
+
+void MasterVolume::onClientDisconnected()
+{
+       qDebug() << "MasterVolume::onClientDisconnected!";
+       QTimer::singleShot(1000, this, SLOT(TryOpen()));
+}
+
+void MasterVolume::onClientError(QAbstractSocket::SocketError se)
+{
+       qDebug() << "MasterVolume::onClientError: " << se;
+}
+
+void MasterVolume::onClientEventReceived(QString name, const QJsonValue& data)
+{
+       qDebug() << "MasterVolume::onClientEventReceived[" << name << "]: " << data;
+       if (name == "ahl-4a/volume_changed")
+       {
+               QJsonObject arg = data.toObject();
+               bool active = arg["active"].toBool();
+               if (active)
+               {
+                       // QString role = arg["role"].toString();
+                       int volume = arg["volume"].toInt();
+                       if (m_volume != volume)
+                       {
+                               m_volume = volume;
+                               emit VolumeChanged();
+                       }
+               }
+       }
 }
 
-void MasterVolume::changeExternalVolume(int volume)
+void MasterVolume::TryOpen()
 {
-       m_volume = volume;
-       emit volumeChanged();
+       m_client.open(m_url);
 }