summaryrefslogtreecommitdiffstats
path: root/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service
diff options
context:
space:
mode:
authortakeshi_hoshina <takeshi_hoshina@mail.toyota.co.jp>2020-10-22 14:58:56 +0900
committertakeshi_hoshina <takeshi_hoshina@mail.toyota.co.jp>2020-10-22 14:58:56 +0900
commit4204309872da5cb401cbb2729d9e2d4869a87f42 (patch)
treec7415e8600205e40ff7e91e8e5f4c411f30329f2 /meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service
parent5b80bfd7bffd4c20d80b7c70a7130529e9a755dd (diff)
Diffstat (limited to 'meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service')
-rw-r--r--meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voice-high-config/voice-high.json1
-rw-r--r--meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voice-high-config_1.0.bb20
-rw-r--r--meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-config/AlexaAutoCoreEngineConfig.json.in184
-rw-r--r--meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-config_1.0.bb40
-rw-r--r--meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0001-remove-library-dependency-copying.patch15
-rw-r--r--meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0005-fix-segmentation-fault-for-release-build-mode.patch33
-rw-r--r--meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0006-fix-event-argument-json.patch183
-rw-r--r--meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/alexa.json14
-rw-r--r--meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service_git.bb25
9 files changed, 509 insertions, 6 deletions
diff --git a/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voice-high-config/voice-high.json b/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voice-high-config/voice-high.json
new file mode 100644
index 00000000..f460ccfc
--- /dev/null
+++ b/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voice-high-config/voice-high.json
@@ -0,0 +1 @@
+{ "default": "VA-001" }
diff --git a/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voice-high-config_1.0.bb b/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voice-high-config_1.0.bb
new file mode 100644
index 00000000..736a7ce5
--- /dev/null
+++ b/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voice-high-config_1.0.bb
@@ -0,0 +1,20 @@
+SUMMARY = "High level voice service binding default voiceagent configuration for Alexa"
+DESCRIPTION = "Alexa default voiceagent JSON configuration file for agl-service-voice-high binding"
+HOMEPAGE = "https://gerrit.automotivelinux.org/gerrit/apps/agl-service-voice-high"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+SRC_URI = "file://voice-high.json"
+
+inherit allarch
+
+do_compile[noexec] = "1"
+
+do_install () {
+ install -D -m 644 ${WORKDIR}/voice-high.json ${D}${sysconfdir}/xdg/AGL/voice-high.json
+}
+
+RPROVIDES_${PN} += "virtual/voice-high-config"
+
diff --git a/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-config/AlexaAutoCoreEngineConfig.json.in b/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-config/AlexaAutoCoreEngineConfig.json.in
new file mode 100644
index 00000000..9ead4893
--- /dev/null
+++ b/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-config/AlexaAutoCoreEngineConfig.json.in
@@ -0,0 +1,184 @@
+{
+ "deviceInfo":
+ {
+ "clientId":"@@ALEXA_CLIENTID@@",
+ "deviceSerialNumber":"@@ALEXA_SERIALNUMBER@@",
+ "productId":"@@ALEXA_PRODUCTID@@"
+ },
+ "libcurlUtils":
+ {
+ "CURLOPT_CAPATH":"/etc/ssl/certs"
+ },
+ "miscDatabase":
+ {
+ "databaseFilePath":"./miscDatabase.db"
+ },
+ "certifiedSender":
+ {
+ "databaseFilePath":"./certifiedSender.db"
+ },
+ "alertsCapabilityAgent":
+ {
+ "databaseFilePath":"./alertsCapabilityAgent.db"
+ },
+ "notifications":
+ {
+ "databaseFilePath":"./notifications.db"
+ },
+ "settings":
+ {
+ "databaseFilePath":"./settings.db",
+ "defaultAVSClientSettings":
+ {
+ "locale":"en-US"
+ }
+ },
+ "aace.storage": {
+ "localStoragePath": "./sample-aace.db",
+ "storageType": "sqlite"
+ },
+ "aace.vehicle": {
+ "info": {
+ "make": "Amazon",
+ "model": "AACE",
+ "year": "2018",
+ "trim": "aac",
+ "geography": "US",
+ "version": "1.2.3",
+ "os": "sample-aace",
+ "arch": "sample-aace",
+ "language": "en_US",
+ "microphone": "SingleArray",
+ "countries": "US,GB,IE,CA,DE,AT,IN,JP,AU,NZ,FR"
+ },
+ "operatingCountry": "US",
+ "currentLocation": "36.1363,-115.1513"
+ },
+ "aace.audio.input": {
+ "voice": "Default"
+ },
+ "aace.audio.output": {
+ "tts": "Speech-High",
+ "music": "Speech-Low"
+ },
+ "aace.wakeword": {
+ "enabled":@@WAKEWORD@@
+ },
+ "aace.cbl": {
+ "enabled": true
+ },
+ "aace.localmediasource": {
+ "enabled":false,
+ "sources": {
+ "bluetooth":false,
+ "usb":false,
+ "fmRadio":false,
+ "amRadio":false,
+ "satelliteRadio":false,
+ "lineIn":false,
+ "compactDisc":false
+ }
+ },
+ "aace.localvoicecontrol": {
+ "enabled":false,
+ "socketRootDirectory":"/var/"
+ },
+ "aace.localskills": {
+ "aace.carcontrol": {
+ "enabled": false,
+ "cannedzones": [
+ {
+ "name" : "zone.all",
+ "enabled": true,
+ "climate": {
+ "syncController": false,
+ "recirculationController": false
+ },
+ "airconditioner" : {
+ "modes": {
+ "AUTO": true,
+ "ECONOMY": false,
+ "MANUAL": false,
+ "MAXIMIUM": false
+ }
+ },
+ "heater" : {
+ "minimum": 60.0,
+ "maximum": 80.0,
+ "precision": 1.0,
+ "unit": "FAHRENHEIT"
+ },
+ "fan" : {
+ "minimum": 0.0,
+ "maximium": 10.0,
+ "precision": 1.0
+ },
+ "vent": {
+ "positions" : {
+ "BODY": true,
+ "MIX": false,
+ "FLOOR": false,
+ "WINDSHIELD": false
+ }
+ },
+ "window" : {
+ "defrost": true
+ },
+ "light" : {
+ "type": "LIGHT",
+ "colors" : {
+ "WHITE": true,
+ "RED": true,
+ "ORANGE": true,
+ "YELLOW": true,
+ "GREEN": true,
+ "BLUE": true,
+ "INDIGO": true,
+ "VIOLET": true
+ }
+ }
+ },
+ {
+ "name" : "zone.back.driver",
+ "enabled": false
+ },
+ {
+ "name" : "zone.back.passenger",
+ "enabled": false
+ },
+ {
+ "name" : "zone.driver",
+ "enabled": false
+ },
+ {
+ "name" : "zone.first.row",
+ "enabled": false
+ },
+ {
+ "name" : "zone.fourth.row",
+ "enabled": false
+ },
+ {
+ "name" : "zone.front",
+ "enabled": false
+ },
+ {
+ "name" : "zone.passenger",
+ "enabled": false
+ },
+ {
+ "name" : "zone.rear",
+ "enabled": false
+ },
+ {
+ "name" : "zone.second.row",
+ "enabled": false
+ },
+ {
+ "name" : "zone.third.row",
+ "enabled": false
+ }
+ ]
+ }
+ }
+}
diff --git a/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-config_1.0.bb b/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-config_1.0.bb
new file mode 100644
index 00000000..7e5992bb
--- /dev/null
+++ b/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-config_1.0.bb
@@ -0,0 +1,40 @@
+SUMMARY = "Alexa service binding default configuration to connect to Alexa"
+DESCRIPTION = "Alexa alexa-voiceagent-service binding configuration files"
+HOMEPAGE = "https://github.com/alexa/alexa-auto-sdk/tree/master/platforms/agl/alexa-voiceagent-service"
+SECTION = "apps"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
+
+SRC_URI = "file://AlexaAutoCoreEngineConfig.json.in"
+
+inherit allarch
+
+ALEXA_WAKEWORD ??= "false"
+
+do_compile () {
+
+ if test x"${ALEXA_CLIENTID}" == x"" ; then
+ bbfatal "ALEXA CLIENTID not defined in your environment e.g. conf/local.conf"
+ fi
+
+ if test x"${ALEXA_SERIALNUMBER}" == x"" ; then
+ bbfatal "ALEXA SERIALNUMBER not defined in your environment e.g. conf/local.conf"
+ fi
+
+ if test x"${ALEXA_PRODUCTID}" == x"" ; then
+ bbfatal "ALEXA PRODUCTID not defined in your environment e.g. conf/local.conf"
+ fi
+
+}
+
+do_install () {
+ #replace
+ sed -e "s/@@ALEXA_CLIENTID@@/${ALEXA_CLIENTID}/" -e "s/@@ALEXA_SERIALNUMBER@@/${ALEXA_SERIALNUMBER}/" -e "s/@@ALEXA_PRODUCTID@@/${ALEXA_PRODUCTID}/" -e "s/@@WAKEWORD@@/${ALEXA_WAKEWORD}/" ${WORKDIR}/AlexaAutoCoreEngineConfig.json.in > ${WORKDIR}/AlexaAutoCoreEngineConfig.json
+
+ # install
+ install -D -m 644 ${WORKDIR}/AlexaAutoCoreEngineConfig.json ${D}${sysconfdir}/xdg/AGL/AlexaAutoCoreEngineConfig.json
+}
+
+RPROVIDES_${PN} += "virtual/alexa-voiceagent-config"
+
diff --git a/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0001-remove-library-dependency-copying.patch b/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0001-remove-library-dependency-copying.patch
index 7b0141c4..3e45c527 100644
--- a/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0001-remove-library-dependency-copying.patch
+++ b/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0001-remove-library-dependency-copying.patch
@@ -9,11 +9,11 @@ Upstream-Status: Inappropriate [embedded specific]
Signed-off-by: Scott Murray <scott.murray@konsulko.com>
-diff --git a/platforms/agl/alexa-voiceagent-service/libs/CMakeLists.txt b/platforms/agl/alexa-voiceagent-service/libs/CMakeLists.txt
-index 4732e7b..ffc149d 100644
+diff --git a/libs/CMakeLists.txt b/libs/CMakeLists.txt
+index 4732e7b..938e5f3 100644
--- a/libs/CMakeLists.txt
+++ b/libs/CMakeLists.txt
-@@ -70,14 +70,6 @@ add_avs_library(SpeechEncoder ${AAC_HOME}/lib/libSpeechEncoder.so)
+@@ -70,22 +70,13 @@ add_avs_library(SpeechEncoder ${AAC_HOME}/lib/libSpeechEncoder.so)
add_avs_library(OpusEncoderContext ${AAC_HOME}/lib/libOpusEncoderContext.so)
add_avs_library(SpeechSynthesizer ${AAC_HOME}/lib/libSpeechSynthesizer.so)
add_avs_library(TemplateRuntime ${AAC_HOME}/lib/libTemplateRuntime.so)
@@ -28,3 +28,12 @@ index 4732e7b..ffc149d 100644
add_avs_library(equalizer ${AAC_HOME}/lib/libEqualizer.so)
add_avs_library(EqualizerImplementations ${AAC_HOME}/lib/libEqualizerImplementations.so)
+-if(EXISTS ${AAC_HOME}/lib/libpryon_lite.so.1.13)
++if(EXISTS ${AAC_HOME}/lib/libAACEAmazonLiteEngine.so)
+ add_aace_library(AACEAmazonLiteEngine)
+ add_avs_library(AMAZONLITE ${AAC_HOME}/lib/libAMAZONLITE.so)
+ add_avs_library(KeywordDetectorProvider ${AAC_HOME}/lib/libKeywordDetectorProvider.so)
+- add_avs_library(pryon_lite ${AAC_HOME}/lib/libpryon_lite.so.1.13)
+ endif()
+
+ if(EXISTS ${AAC_HOME}/lib/libAACEGStreamerEngine.so)
diff --git a/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0005-fix-segmentation-fault-for-release-build-mode.patch b/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0005-fix-segmentation-fault-for-release-build-mode.patch
new file mode 100644
index 00000000..5012dfe8
--- /dev/null
+++ b/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0005-fix-segmentation-fault-for-release-build-mode.patch
@@ -0,0 +1,33 @@
+Fix segmentation fault for release build mode
+
+'int IAFBApi::callSync(...)' is missing a return
+statement. When the sdk is compiled in release mode
+executing this code results in a segmentation fault.
+
+According to the C++ standard, a return statement is
+required on a function that returns a non-void value.
+Specifically: <<Flowing off the end of a function is
+equivalent to a return with no value; this results in
+undefined behaviour in a value-returning function.>>
+
+The proposed fix provides the missing return statement
+for IAFBApi's callSync method.
+
+Upstream-Status: Pending
+
+Signed-off-by: Raquel Medina <raquel.medina@konsulko.com>
+
+diff --git a/platforms/agl/alexa-voiceagent-service/src/plugins/afb/AFBApiImpl.cpp b/platforms/agl/alexa-voiceagent-service/src/plugins/afb/AFBApiImpl.cpp
+index 5ed9bce..e68ef7f 100644
+--- a/src/plugins/afb/AFBApiImpl.cpp
++++ b/src/plugins/afb/AFBApiImpl.cpp
+@@ -77,6 +77,8 @@ int AFBApiImpl::callSync(
+ info = infoStr;
+ free(infoStr);
+ }
++
++ return rc;
+ }
+
+ /// Shim to transfer C++ function to C callback using void*
+
diff --git a/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0006-fix-event-argument-json.patch b/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0006-fix-event-argument-json.patch
new file mode 100644
index 00000000..8c6f1e4b
--- /dev/null
+++ b/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0006-fix-event-argument-json.patch
@@ -0,0 +1,183 @@
+Fix event argument JSON
+
+It was discovered while trying to use some of the capabilities events
+that the argument JSON was incorrectly formatted, with instances of
+all or part of it being double-quoted as strings with escaping. A
+couple instances of this had previously been worked around by hacks
+involving reparsing all or some parts of the arguments a second time
+with a JSON parser, but it seems better to fix it at the source so
+that the events match documentation and are usable as is.
+
+Note that it is ATM not clear if all affected event argument payloads
+are correct, e.g. LocalMediaSource may need some more work.
+
+Upstream-Status: Pending
+
+Signed-off-by: Scott Murray <scott.murray@konsulko.com>
+
+diff --git a/src/plugins/aasb-client/AlexaCapabilityDirectiveRouterImpl.cpp b/src/plugins/aasb-client/AlexaCapabilityDirectiveRouterImpl.cpp
+index 6aea920..23ed90c 100644
+--- a/src/plugins/aasb-client/AlexaCapabilityDirectiveRouterImpl.cpp
++++ b/src/plugins/aasb-client/AlexaCapabilityDirectiveRouterImpl.cpp
+@@ -17,6 +17,8 @@
+
+ #include <sstream>
+
++#include <json-c/json.h>
++
+ #include <aasb/Consts.h>
+
+ #include "AlexaConsts.h"
+@@ -322,7 +324,16 @@ void AlexaCapabilityDirectiveRouterImpl::processTemplateRuntimeAction(
+
+ json_object* argsJ = json_object_new_object();
+ json_object* actionJ = json_object_new_string(vshlCapabilityAction.c_str());
+- json_object* payloadJ = json_object_new_string(payload.c_str());
++ json_object* payloadJ = NULL;
++ if(payload.length()) {
++ payloadJ = json_tokener_parse(payload.c_str());
++ } else {
++ payloadJ = json_object_new_string("");
++ }
++ if(!payloadJ) {
++ m_logger->log(Level::ERROR, TAG, "Unable to parse payload JSON: " + payload);
++ return;
++ }
+ json_object_object_add(argsJ, agl::alexa::JSON_ATTR_ACTION.c_str(), actionJ);
+ json_object_object_add(argsJ, agl::alexa::JSON_ATTR_PAYLOAD.c_str(), payloadJ);
+
+@@ -343,24 +354,40 @@ void AlexaCapabilityDirectiveRouterImpl::processCBLAction(
+ const std::string& payload) {
+ m_logger->log(Level::DEBUG, TAG, "Processing CBL action: " + action);
+
+- json_object* eventDataJ = json_object_new_object();
++ json_object* payloadJ = NULL;
++ if(payload.length()) {
++ payloadJ = json_tokener_parse(payload.c_str());
++ } else {
++ payloadJ = json_object_new_string("");
++ }
++ if(!payloadJ) {
++ m_logger->log(Level::ERROR, TAG, "Unable to parse payload JSON: " + payload);
++ return;
++ }
++ // The payload string may already be of the form of a document like
++ // "{ "payload" : { ... } }", the simplest way to handle that is to use
++ // it as the event json_object if that's the case, that way we avoid
++ // having to worry about copying.
++ json_object* eventDataJ = NULL;
++ if(json_object_object_get_ex(payloadJ, "payload", NULL)) {
++ eventDataJ = payloadJ;
++ } else {
++ eventDataJ = json_object_new_object();
++ json_object_object_add(eventDataJ, JSON_ATTR_PAYLOAD.c_str(), payloadJ);
++ }
+ json_object* vaIdJ = json_object_new_string(m_alexaVoiceAgentId.c_str());
+-
+ json_object_object_add(eventDataJ, JSON_ATTR_VOICEAGENT_ID.c_str(), vaIdJ);
+
+ int observers = 0;
+ if (action == aasb::bridge::ACTION_CBL_CODEPAIR_RECEIVED) {
+ m_logger->log(Level::INFO, TAG, "CBL codepair received: " + payload);
+- json_object* payloadJ = json_object_new_string(payload.c_str());
+- json_object_object_add(eventDataJ, JSON_ATTR_PAYLOAD.c_str(), payloadJ);
+ observers = m_cblCodePairReceivedEvent->publishEvent(eventDataJ);
+ } else if (action == aasb::bridge::ACTION_CBL_CODEPAIR_EXPIRED) {
+ m_logger->log(Level::INFO, TAG, "CBL codepair expired: " + payload);
+- json_object* payloadJ = json_object_new_string(payload.c_str());
+- json_object_object_add(eventDataJ, JSON_ATTR_PAYLOAD.c_str(), payloadJ);
+ observers = m_cblCodePairExpiredEvent->publishEvent(eventDataJ);
+ } else {
+ m_logger->log(Level::INFO, TAG, "Unhandled action: " + action);
++ json_object_put(eventDataJ);
+ }
+
+ std::stringstream logMsg;
+diff --git a/src/plugins/dispatchers/local-voice-control/car-control/CarControlDispatcher.cpp b/src/plugins/dispatchers/local-voice-control/car-control/CarControlDispatcher.cpp
+index 096f72f..75108d4 100644
+--- a/src/plugins/dispatchers/local-voice-control/car-control/CarControlDispatcher.cpp
++++ b/src/plugins/dispatchers/local-voice-control/car-control/CarControlDispatcher.cpp
+@@ -72,7 +72,16 @@ void CarControlDispatcher::onReceivedDirective(
+
+ json_object* argsJ = json_object_new_object();
+ json_object* actionJ = json_object_new_string(vshlCapabilityAction.c_str());
+- json_object* payloadJ = json_object_new_string(payload.c_str());
++ json_object* payloadJ = NULL;
++ if(payload.length()) {
++ payloadJ = json_tokener_parse(payload.c_str());
++ } else {
++ payloadJ = json_object_new_string("");
++ }
++ if(!payloadJ) {
++ m_logger->log(Level::ERROR, TAG, "Unable to parse payload JSON: " + payload);
++ return;
++ }
+ json_object_object_add(argsJ, agl::alexa::JSON_ATTR_ACTION.c_str(), actionJ);
+ json_object_object_add(argsJ, agl::alexa::JSON_ATTR_PAYLOAD.c_str(), payloadJ);
+
+diff --git a/src/plugins/dispatchers/localmediasource/LocalMediaSourceDispatcher.cpp b/src/plugins/dispatchers/localmediasource/LocalMediaSourceDispatcher.cpp
+index c261a56..04ac10c 100644
+--- a/src/plugins/dispatchers/localmediasource/LocalMediaSourceDispatcher.cpp
++++ b/src/plugins/dispatchers/localmediasource/LocalMediaSourceDispatcher.cpp
+@@ -71,7 +71,16 @@ void LocalMediaSourceDispatcher::onReceivedDirective(
+
+ json_object* argsJ = json_object_new_object();
+ json_object* actionJ = json_object_new_string(vshlCapabilityAction.c_str());
+- json_object* payloadJ = json_object_new_string(payload.c_str());
++ json_object* payloadJ = NULL;
++ if(payload.length()) {
++ payloadJ = json_tokener_parse(payload.c_str());
++ } else {
++ payloadJ = json_object_new_string("");
++ }
++ if(!payloadJ) {
++ m_logger->log(Level::ERROR, TAG, "Unable to parse payload JSON: " + payload);
++ return;
++ }
+ json_object_object_add(argsJ, agl::alexa::JSON_ATTR_ACTION.c_str(), actionJ);
+ json_object_object_add(argsJ, agl::alexa::JSON_ATTR_PAYLOAD.c_str(), payloadJ);
+
+diff --git a/src/plugins/dispatchers/navigation/NavigationDispatcher.cpp b/src/plugins/dispatchers/navigation/NavigationDispatcher.cpp
+index 55a6017..283b42b 100644
+--- a/src/plugins/dispatchers/navigation/NavigationDispatcher.cpp
++++ b/src/plugins/dispatchers/navigation/NavigationDispatcher.cpp
+@@ -68,7 +68,16 @@ void NavigationDispatcher::onReceivedDirective(
+
+ json_object* argsJ = json_object_new_object();
+ json_object* actionJ = json_object_new_string(vshlCapabilityAction.c_str());
+- json_object* payloadJ = json_object_new_string(payload.c_str());
++ json_object* payloadJ = NULL;
++ if(payload.length()) {
++ payloadJ = json_tokener_parse(payload.c_str());
++ } else {
++ payloadJ = json_object_new_string("");
++ }
++ if(!payloadJ) {
++ m_logger->log(Level::ERROR, TAG, "Unable to parse payload JSON: " + payload);
++ return;
++ }
+ json_object_object_add(argsJ, agl::alexa::JSON_ATTR_ACTION.c_str(), actionJ);
+ json_object_object_add(argsJ, agl::alexa::JSON_ATTR_PAYLOAD.c_str(), payloadJ);
+
+diff --git a/src/plugins/dispatchers/phonecall/PhoneCallDispatcher.cpp b/src/plugins/dispatchers/phonecall/PhoneCallDispatcher.cpp
+index 29ad96a..3432892 100644
+--- a/src/plugins/dispatchers/phonecall/PhoneCallDispatcher.cpp
++++ b/src/plugins/dispatchers/phonecall/PhoneCallDispatcher.cpp
+@@ -86,7 +86,16 @@ void PhoneCallDispatcher::onReceivedDirective(
+
+ json_object* argsJ = json_object_new_object();
+ json_object* actionJ = json_object_new_string(vshlCapabilityAction.c_str());
+- json_object* payloadJ = json_object_new_string(payload.c_str());
++ json_object* payloadJ = NULL;
++ if(payload.length()) {
++ payloadJ = json_tokener_parse(payload.c_str());
++ } else {
++ payloadJ = json_object_new_string("");
++ }
++ if(!payloadJ) {
++ m_logger->log(Level::ERROR, TAG, "Unable to parse payload JSON: " + payload);
++ return;
++ }
+ json_object_object_add(argsJ, agl::alexa::JSON_ATTR_ACTION.c_str(), actionJ);
+ json_object_object_add(argsJ, agl::alexa::JSON_ATTR_PAYLOAD.c_str(), payloadJ);
+
diff --git a/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/alexa.json b/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/alexa.json
new file mode 100644
index 00000000..48918015
--- /dev/null
+++ b/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/alexa.json
@@ -0,0 +1,14 @@
+{
+ "id": "VA-001",
+ "active": true,
+ "name": "Alexa",
+ "api": "alexa-voiceagent",
+ "wakewords": [
+ "alexa",
+ "computer",
+ "echo"
+ ],
+ "activewakeword": "alexa",
+ "description": "Alexa voice assistant by Amazon.",
+ "vendor": "Amazon.com Services Inc"
+}
diff --git a/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service_git.bb b/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service_git.bb
index 296cf2d2..f0211552 100644
--- a/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service_git.bb
+++ b/meta-agl-devel/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service_git.bb
@@ -17,13 +17,17 @@ DEPENDS = " \
aac-module-navigation \
aac-module-phone-control \
aac-module-gstreamer \
+ ${@bb.utils.contains("ALEXA_WAKEWORD", "true", "aac-module-amazonlite pryon-lite", "", d)} \
"
SRC_URI = "git://github.com/alexa/alexa-auto-sdk.git;protocol=https;branch=2.0 \
+ file://alexa.json \
file://0001-remove-library-dependency-copying.patch \
file://0002-update-config.xml.in.patch \
file://0003-update-audio-device-configuration.patch \
file://0004-update-config-and-database-paths.patch \
+ file://0005-fix-segmentation-fault-for-release-build-mode.patch \
+ file://0006-fix-event-argument-json.patch \
"
SRCREV = "86916d2d8c1702a8be3c88a9012ca56583bcc0c8"
@@ -34,8 +38,23 @@ inherit cmake aglwgt
EXTRA_OECMAKE += "-DAAC_HOME=${RECIPE_SYSROOT}/${AAC_PREFIX}"
+ALEXA_WAKEWORD ??= "false"
+
+do_install_append() {
+ install -D -m 0644 ${WORKDIR}/alexa.json ${D}${sysconfdir}/xdg/AGL/voiceagents/alexa.json
+}
+
+PACKAGES =+ "${PN}-conf"
+
+FILES_${PN}-conf = "${sysconfdir}/xdg/AGL/voiceagents/*"
+
# NOTE: curl and opus are from the base SDK libraries, sqlite3 from the
# core module
-RDEPENDS_${PN} += "libcurl libopus libsqlite3"
-
-RPROVIDES_${PN} += "virtual/voiceagent"
+RDEPENDS_${PN} += " \
+ libcurl \
+ libopus \
+ libsqlite3 \
+ ${PN}-conf \
+ ${@bb.utils.contains("ALEXA_WAKEWORD", "true", "pryon-lite", "", d)} \
+ gstreamer1.0-plugins-bad-hls \
+"