diff options
author | Loïc Collignon <loic.collignon@iot.bzh> | 2018-12-19 15:30:09 +0100 |
---|---|---|
committer | zheng_wenlong <wenlong_zheng@nexty-ele.com> | 2019-04-05 15:18:47 +0900 |
commit | db6cb3b82fe3441e0237da3e7578c17c17744902 (patch) | |
tree | a0ac797f199687eda5f2e1f09f4a829286ad2359 | |
parent | 45f880a670f5fffef72925ecae59c41cd2603e48 (diff) |
Bind the slider volume to the 4a active role
4a now expose an active role, which is the opened role with the higher
priority. This binds the slider to the active role.
Bug: 1313
Change-Id: I73766163fc0b8ef1e6b70e9c13e28d3642be858a
Signed-off-by: Loïc Collignon <loic.collignon@iot.bzh>
-rw-r--r-- | .gitmodules | 3 | ||||
m--------- | homescreen/helpers | 0 | ||||
-rw-r--r-- | homescreen/homescreen.pro | 6 | ||||
-rw-r--r-- | homescreen/qml/MediaAreaBlank.qml | 9 | ||||
-rw-r--r-- | homescreen/src/main.cpp | 1 | ||||
-rw-r--r-- | homescreen/src/mastervolume.cpp | 83 | ||||
-rw-r--r-- | homescreen/src/mastervolume.h | 53 | ||||
-rw-r--r-- | package/config.xml | 2 |
8 files changed, 119 insertions, 38 deletions
diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..7a441d4 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "homescreen/helpers"] + path = homescreen/helpers + url = https://gerrit.automotivelinux.org/gerrit/apps/app-afb-helpers-submodule diff --git a/homescreen/helpers b/homescreen/helpers new file mode 160000 +Subproject b3a54dd8653fa672650229dd2498308ffcc3e94 diff --git a/homescreen/homescreen.pro b/homescreen/homescreen.pro index 9c36660..ad44748 100644 --- a/homescreen/homescreen.pro +++ b/homescreen/homescreen.pro @@ -31,7 +31,8 @@ SOURCES += \ src/applicationlauncher.cpp \ src/mastervolume.cpp \ src/homescreenhandler.cpp \ - src/toucharea.cpp + src/toucharea.cpp \ + helpers/qafbwebsocketclient.cpp HEADERS += \ src/statusbarmodel.h \ @@ -39,7 +40,8 @@ HEADERS += \ src/applicationlauncher.h \ src/mastervolume.h \ src/homescreenhandler.h \ - src/toucharea.h + src/toucharea.h \ + helpers/qafbwebsocketclient.h OTHER_FILES += \ README.md diff --git a/homescreen/qml/MediaAreaBlank.qml b/homescreen/qml/MediaAreaBlank.qml index 2b888c8..a2fd473 100644 --- a/homescreen/qml/MediaAreaBlank.qml +++ b/homescreen/qml/MediaAreaBlank.qml @@ -72,6 +72,9 @@ Image { id: mv objectName: "mv" onVolumeChanged: slider.value = volume + Component.onCompleted: { + mv.open(bindingAddress); + } } Item { @@ -84,7 +87,7 @@ Image { font.pixelSize: 36 anchors.horizontalCenter: parent.horizontalCenter color: "white" - text: qsTr("Master Volume") + text: qsTr("Active Volume") } RowLayout { @@ -101,8 +104,8 @@ Image { id: slider Layout.fillWidth: true from: 0 - to: 65536 - stepSize: 256 + to: 100 + stepSize: 1 snapMode: Slider.SnapOnRelease onValueChanged: mv.volume = value Component.onCompleted: value = mv.volume diff --git a/homescreen/src/main.cpp b/homescreen/src/main.cpp index fe17ceb..6cf2e3d 100644 --- a/homescreen/src/main.cpp +++ b/homescreen/src/main.cpp @@ -119,6 +119,7 @@ int main(int argc, char *argv[]) // mail.qml loading QQmlApplicationEngine engine; + engine.rootContext()->setContextProperty("bindingAddress", bindingAddress); engine.rootContext()->setContextProperty("layoutHandler", layoutHandler); engine.rootContext()->setContextProperty("homescreenHandler", homescreenHandler); engine.rootContext()->setContextProperty("touchArea", touchArea); diff --git a/homescreen/src/mastervolume.cpp b/homescreen/src/mastervolume.cpp index 5e1e450..35b47fc 100644 --- a/homescreen/src/mastervolume.cpp +++ b/homescreen/src/mastervolume.cpp @@ -15,17 +15,86 @@ */ #include "mastervolume.h" +#include <QJsonObject> +#include <QTimer> +#include <QtDebug> -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("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); } diff --git a/homescreen/src/mastervolume.h b/homescreen/src/mastervolume.h index 645968a..e23e8d1 100644 --- a/homescreen/src/mastervolume.h +++ b/homescreen/src/mastervolume.h @@ -16,33 +16,34 @@ #include <QtCore/QObject> #include <QQmlEngine> +#include "../helpers/qafbwebsocketclient.h" -#include <pulse/pulseaudio.h> - -class MasterVolume : public QObject +class MasterVolume + : public QObject { Q_OBJECT - Q_PROPERTY (uint32_t volume READ getVolume WRITE setVolume NOTIFY volumeChanged) - - public: - MasterVolume(QObject *parent = 0) - : QObject(parent), m_volume(32768) - { - } - - ~MasterVolume() {} - - uint32_t getVolume() const { return m_volume; } - void setVolume(pa_volume_t volume); - - public slots: - void changeExternalVolume(int volume); - - signals: - void volumeChanged(void); - void sliderVolumeChanged(int volume_delta); - void externalVolumeChanged(uint32_t volume); - - private: - uint32_t m_volume; + Q_PROPERTY (uint32_t volume READ getVolume WRITE setVolume NOTIFY VolumeChanged) + +private: + QAfbWebsocketClient m_client; + QUrl m_url; + qint32 m_volume; + +public: + MasterVolume(QObject* parent = nullptr); + ~MasterVolume() = default; + + Q_INVOKABLE void open(const QUrl& url); + Q_INVOKABLE qint32 getVolume() const; + Q_INVOKABLE void setVolume(qint32 val); + +private slots: + void onClientConnected(); + void onClientDisconnected(); + void onClientError(QAbstractSocket::SocketError se); + void onClientEventReceived(QString name, const QJsonValue& data); + void TryOpen(); + +signals: + void VolumeChanged(); }; diff --git a/package/config.xml b/package/config.xml index 32d19fd..a15baee 100644 --- a/package/config.xml +++ b/package/config.xml @@ -12,10 +12,12 @@ <param name="weather" value="ws" /> <param name="Bluetooth-Manager" value="ws" /> <param name="windowmanager" value="ws" /> + <param name="ahl-4a" value="ws" /> </feature> <feature name="urn:AGL:widget:required-permission"> <param name="urn:AGL:permission::public:no-htdocs" value="required" /> <param name="urn:AGL:permission::system:run-by-default" value="required" /> <param name="http://tizen.org/privilege/internal/dbus" value="required" /> + <param name="urn:AGL:permission::public:4a-audio-mixer" value="required" /> </feature> </widget> |