aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLoïc Collignon <loic.collignon@iot.bzh>2018-12-19 15:30:09 +0100
committerzheng_wenlong <wenlong_zheng@nexty-ele.com>2019-04-05 15:18:47 +0900
commitdb6cb3b82fe3441e0237da3e7578c17c17744902 (patch)
treea0ac797f199687eda5f2e1f09f4a829286ad2359
parent45f880a670f5fffef72925ecae59c41cd2603e48 (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--.gitmodules3
m---------homescreen/helpers0
-rw-r--r--homescreen/homescreen.pro6
-rw-r--r--homescreen/qml/MediaAreaBlank.qml9
-rw-r--r--homescreen/src/main.cpp1
-rw-r--r--homescreen/src/mastervolume.cpp83
-rw-r--r--homescreen/src/mastervolume.h53
-rw-r--r--package/config.xml2
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>