X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=homescreen%2Fsrc%2Fmastervolume.cpp;h=43beaefeba60cf46a3d1d2e0ae657c74038998a7;hb=refs%2Ftags%2F11.0.5;hp=46985eebc5728cb50c7849b3527f90ea96c48907;hpb=fbdd80c3c6fd9b27ce1cbe21941baa8a643050fe;p=apps%2Fhomescreen.git diff --git a/homescreen/src/mastervolume.cpp b/homescreen/src/mastervolume.cpp index 46985ee..43beaef 100644 --- a/homescreen/src/mastervolume.cpp +++ b/homescreen/src/mastervolume.cpp @@ -15,19 +15,99 @@ */ #include "mastervolume.h" +#include +#include +#include -#include +#define MASTER_CONTROL "Master Playback" -void MasterVolume::setVolume(pa_volume_t 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("control", MASTER_CONTROL); + double v = (double) volume / 100.0; + arg.insert("value", v); + m_client.call("audiomixer", "volume", arg); + } +} + +void MasterVolume::onClientConnected() +{ + QJsonObject arg; + arg.insert("control", MASTER_CONTROL); + m_client.call("audiomixer", "volume", arg, [this](bool r, const QJsonValue& v) { + if (r && v.isObject()) { + int volume = v.toObject()["response"].toObject()["volume"].toDouble() * 100; + volume = qBound(0, volume, 100); + if (m_volume != volume) + { + m_volume = volume; + emit VolumeChanged(); + } + } + + QJsonObject arg; + arg.insert("event", "volume_changed"); + m_client.call("audiomixer", "subscribe", arg); + }); +} + +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 == "audiomixer/volume_changed") + { + QString ctlName = data.toObject()["control"].toString(); + + if (ctlName != MASTER_CONTROL) + return; + int volume = data.toObject()["value"].toDouble() * 100; + volume = qBound(0, volume, 100); + 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); }