diff options
19 files changed, 111 insertions, 873 deletions
diff --git a/meta-speech-framework/conf/include/agl-voiceagent-alexa.inc b/meta-speech-framework/conf/include/agl-voiceagent-alexa.inc index 635d3ead..c8e61852 100644 --- a/meta-speech-framework/conf/include/agl-voiceagent-alexa.inc +++ b/meta-speech-framework/conf/include/agl-voiceagent-alexa.inc @@ -2,11 +2,13 @@ # from meta-aac to avoid triggering rebuilds of all curl dependencies when # agl-voiceagent-alexa is configured. BBMASK += "meta-aac/recipes-support/curl/curl_%.bbappend" -# Mask out the nghttp2 recipe in meta-aac as well, since the same version +# Mask out the nghttp2 recipe in meta-aac as well, as a newer version # is available in meta-networking, and due to meta-aac having a higher # layer priority, rebuilds will be triggered when the voiceagent feature # is configured and the layer is added. BBMASK += "meta-aac/recipes-connectivity/nghttp2" +# Mask out the duplicate libopus recipe in meta-aac for the same reason +BBMASK += "meta-aac/recipes-multimedia/libopus" PREFERRED_RPROVIDER_virtual/voice-high-config = "alexa-voice-high-config" diff --git a/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-config/AlexaAutoCoreEngineConfig.json.in b/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-config/AlexaAutoCoreEngineConfig.json.in index 9ead4893..4bf00f89 100644 --- a/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-config/AlexaAutoCoreEngineConfig.json.in +++ b/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-config/AlexaAutoCoreEngineConfig.json.in @@ -1,55 +1,34 @@ { "deviceInfo": { - "clientId":"@@ALEXA_CLIENTID@@", - "deviceSerialNumber":"@@ALEXA_SERIALNUMBER@@", - "productId":"@@ALEXA_PRODUCTID@@" + "clientId": "@@ALEXA_CLIENTID@@", + "deviceSerialNumber": "@@ALEXA_SERIALNUMBER@@", + "productId": "@@ALEXA_PRODUCTID@@", + "manufacturerName": "@@ALEXA_MFG_NAME@@", + "description": "@@ALEXA_DESCRIPTION@@" }, "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" + "deviceSettings": { + "defaultLocale":"@@ALEXA_LOCALE@@", + "defaultTimezone":"@@ALEXA_TIMEZONE@@" }, "aace.vehicle": { "info": { "make": "Amazon", - "model": "AACE", - "year": "2018", + "model": "AutoSDK", + "year": "2019", "trim": "aac", "geography": "US", "version": "1.2.3", - "os": "sample-aace", - "arch": "sample-aace", + "os": "AGL", + "arch": "aarch64", "language": "en_US", "microphone": "SingleArray", - "countries": "US,GB,IE,CA,DE,AT,IN,JP,AU,NZ,FR" + "countries": "US,GB,IE,CA,DE,AT,IN,JP,AU,NZ,FR", + "vehicleIdentifier": "Sample Identifier ABC" }, "operatingCountry": "US", "currentLocation": "36.1363,-115.1513" @@ -58,11 +37,12 @@ "voice": "Default" }, "aace.audio.output": { - "tts": "Speech-High", - "music": "Speech-Low" + "tts": "Speech-Low", + "music": "Speech-High", + "alarm": "Custom-Low" }, "aace.wakeword": { - "enabled":@@WAKEWORD@@ + "enabled":@@ALEXA_WAKEWORD@@ }, "aace.cbl": { "enabled": true @@ -70,115 +50,15 @@ "aace.localmediasource": { "enabled":false, "sources": { - "bluetooth":false, - "usb":false, - "fmRadio":false, - "amRadio":false, + "bluetooth":true, + "usb":true, + "fmRadio":true, + "amRadio":true, "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 - } - ] + "compactDisc":true, + "siriusXM":false, + "dab":false } } } diff --git a/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-config_1.0.bb b/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-config_1.0.bb index 7e5992bb..a16ad182 100644 --- a/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-config_1.0.bb +++ b/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-config_1.0.bb @@ -11,30 +11,41 @@ SRC_URI = "file://AlexaAutoCoreEngineConfig.json.in" inherit allarch ALEXA_WAKEWORD ??= "false" +ALEXA_LOCALE ??= "en-US" +ALEXA_TIMEZONE ??= "America/Vancouver" -do_compile () { +do_compile[noexec] = "1" - if test x"${ALEXA_CLIENTID}" == x"" ; then - bbfatal "ALEXA CLIENTID not defined in your environment e.g. conf/local.conf" +do_install () { + if [ -z "${ALEXA_CLIENTID}" ]; 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" + if [ -z "${ALEXA_SERIALNUMBER}" ]; 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" + if [ -z "${ALEXA_PRODUCTID}" ]; then + bbfatal "ALEXA_PRODUCTID not defined in your environment e.g. conf/local.conf" + fi + if [ -z "${ALEXA_MFG_NAME}" ]; then + bbfatal "ALEXA_MFG_NAME not defined in your environment e.g. conf/local.conf" + fi + if [ -z "${ALEXA_DESCRIPTION}" ]; then + bbfatal "ALEXA_DESCRIPTION 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 + sed -e "s|@@ALEXA_CLIENTID@@|${ALEXA_CLIENTID}|" \ + -e "s|@@ALEXA_SERIALNUMBER@@|${ALEXA_SERIALNUMBER}|" \ + -e "s|@@ALEXA_PRODUCTID@@|${ALEXA_PRODUCTID}|" \ + -e "s|@@ALEXA_MFG_NAME@@|${ALEXA_MFG_NAME}|" \ + -e "s|@@ALEXA_DESCRIPTION@@|${ALEXA_DESCRIPTION}|" \ + -e "s|@@ALEXA_WAKEWORD@@|${ALEXA_WAKEWORD}|" \ + -e "s|@@ALEXA_LOCALE@@|${ALEXA_LOCALE}|" \ + -e "s|@@ALEXA_TIMEZONE@@|${ALEXA_TIMEZONE}|" \ + ${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-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0001-remove-library-dependency-copying.patch b/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0001-remove-library-dependency-copying.patch index 3e45c527..ee61ac20 100644 --- a/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0001-remove-library-dependency-copying.patch +++ b/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0001-remove-library-dependency-copying.patch @@ -10,23 +10,17 @@ Upstream-Status: Inappropriate [embedded specific] Signed-off-by: Scott Murray <scott.murray@konsulko.com> diff --git a/libs/CMakeLists.txt b/libs/CMakeLists.txt -index 4732e7b..938e5f3 100644 +index 8a955feb..5b097877 100644 --- a/libs/CMakeLists.txt +++ b/libs/CMakeLists.txt -@@ -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) +@@ -92,16 +92,11 @@ add_avs_library(SQLiteStorage ${AAC_HOME}/lib/libSQLiteStorage.so) + add_avs_library(SystemSoundPlayer ${AAC_HOME}/lib/libSystemSoundPlayer.so) add_avs_library(TemplateRuntime ${AAC_HOME}/lib/libTemplateRuntime.so) --#add_avs_library(curl ${AAC_HOME}/lib/libcurl.so.4.5.0) + add_avs_library(ToggleController ${AAC_HOME}/lib/libToggleController.so) -add_avs_library(curl ${AAC_HOME}/lib/libcurl.so.4) --#add_avs_library(nghttp2 ${AAC_HOME}/lib/libnghttp2.so.14.16) -add_avs_library(nghttp2 ${AAC_HOME}/lib/libnghttp2.so.14) --#add_avs_library(opus ${AAC_HOME}/lib/libopus.so.0.6.1) -add_avs_library(opus ${AAC_HOME}/lib/libopus.so.0) --#add_avs_library(sqlite3 ${AAC_HOME}/lib/libsqlite3.so.0.8.6) -add_avs_library(sqlite3 ${AAC_HOME}/lib/libsqlite3.so.0) - 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) @@ -36,4 +30,4 @@ index 4732e7b..938e5f3 100644 - add_avs_library(pryon_lite ${AAC_HOME}/lib/libpryon_lite.so.1.13) endif() - if(EXISTS ${AAC_HOME}/lib/libAACEGStreamerEngine.so) + if(EXISTS ${AAC_HOME}/share/cmake/AACESystemAudio.cmake) diff --git a/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0002-update-config.xml.in.patch b/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0002-update-config.xml.in.patch deleted file mode 100644 index fd5aaf75..00000000 --- a/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0002-update-config.xml.in.patch +++ /dev/null @@ -1,31 +0,0 @@ -Update config.xml.in - -Remove now unneeded 4A binding dependency, and add new required audio -permission. - -Upstream-Status: Pending - -Signed-off-by: Scott Murray <scott.murray@konsulko.com> - -diff --git a/platforms/agl/alexa-voiceagent-service/conf.d/wgt/config.xml.in b/platforms/agl/alexa-voiceagent-service/conf.d/wgt/config.xml.in -index 3486518..14fd6a2 100644 ---- a/conf.d/wgt/config.xml.in -+++ b/conf.d/wgt/config.xml.in -@@ -9,6 +9,7 @@ - - <feature name="urn:AGL:widget:required-permission"> - <param name="urn:AGL:permission::public:no-htdocs" value="required" /> -+ <param name="urn:AGL:permission::public:audio" value="required" /> - <param name="urn:AGL:permission:audio:public:audiostream" value="required" /> - <param name="urn:AGL:permission::public:hidden" value="required" /> - <param name="urn:AGL:permission::system:run-by-default" value="required" /> -@@ -23,7 +24,6 @@ - </feature> - - <feature name="urn:AGL:widget:required-api"> -- <param name="ahl-4a" value="ws" /> - <param name="vshl-capabilities" value="ws" /> - </feature> --</widget> -\ No newline at end of file -+</widget> diff --git a/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0003-update-audio-device-configuration.patch b/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0003-update-audio-device-configuration.patch deleted file mode 100644 index ede3d533..00000000 --- a/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0003-update-audio-device-configuration.patch +++ /dev/null @@ -1,197 +0,0 @@ -Update audio device configuration - -Rework the audio output device configuration to match the expectations -of the PipeWire output sink configuration in the gstreamer output code. -Currently, this means that the role is being stored as the device name -so the gstreamer code can use it when setting up the output sink -properties. - -Upstream-Status: Pending - -Signed-off-by: Scott Murray <scott.murray@konsulko.com> - -diff --git a/platforms/agl/alexa-voiceagent-service/src/plugins/aasb-client/config/AASBConfigProviderImpl.cpp b/platforms/agl/alexa-voiceagent-service/src/plugins/aasb-client/config/AASBConfigProviderImpl.cpp -index 83d0341..b51185c 100644 ---- a/src/plugins/aasb-client/config/AASBConfigProviderImpl.cpp -+++ b/src/plugins/aasb-client/config/AASBConfigProviderImpl.cpp -@@ -97,25 +97,25 @@ AASBConfigProviderImpl::AudioIOConfiguration AASBConfigProviderImpl::getAudioIOC - - // Output devices - if(!m_ttsOutputDevice.empty()) -- audioConfig.ttsOutputDevice = m_audio->openAHLChannel(m_ttsOutputDevice); -+ audioConfig.ttsOutputDevice = m_audio->openChannel(m_ttsOutputDevice); - - if(!m_musicOutputDevice.empty()) -- audioConfig.musicOutputDevice = m_audio->openAHLChannel(m_musicOutputDevice); -+ audioConfig.musicOutputDevice = m_audio->openChannel(m_musicOutputDevice); - - if(!m_notificationOutputDevice.empty()) -- audioConfig.notificationOutputDevice = m_audio->openAHLChannel(m_notificationOutputDevice); -+ audioConfig.notificationOutputDevice = m_audio->openChannel(m_notificationOutputDevice); - - if(!m_alarmOutputDevice.empty()) -- audioConfig.alarmOutputDevice = m_audio->openAHLChannel(m_alarmOutputDevice); -+ audioConfig.alarmOutputDevice = m_audio->openChannel(m_alarmOutputDevice); - - if(!m_earconOutputDevice.empty()) -- audioConfig.earconOutputDevice = m_audio->openAHLChannel(m_earconOutputDevice); -+ audioConfig.earconOutputDevice = m_audio->openChannel(m_earconOutputDevice); - - if(!m_communicationOutputDevice.empty()) -- audioConfig.communicationOutputDevice = m_audio->openAHLChannel(m_communicationOutputDevice); -+ audioConfig.communicationOutputDevice = m_audio->openChannel(m_communicationOutputDevice); - - if(!m_ringtoneOutputDevice.empty()) -- audioConfig.ringtoneOutputDevice = m_audio->openAHLChannel(m_ringtoneOutputDevice); -+ audioConfig.ringtoneOutputDevice = m_audio->openChannel(m_ringtoneOutputDevice); - - return audioConfig; - } -@@ -585,4 +585,4 @@ void AASBConfigProviderImpl::logCurrentConfiguration() { - } - - } // namespace alexa --} // namespace agl -\ No newline at end of file -+} // namespace agl -diff --git a/src/plugins/audio/Audio.cpp b/src/plugins/audio/Audio.cpp -index d662a06..1b2fa9d 100644 ---- a/src/plugins/audio/Audio.cpp -+++ b/src/plugins/audio/Audio.cpp -@@ -13,8 +13,6 @@ - * permissions and limitations under the License. - */ - --#include <json.h> -- - #include <AACE/Engine/Core/EngineMacros.h> - - #include "Audio.h" -@@ -22,7 +20,7 @@ - namespace agl { - namespace audio { - --/// Shortcut to reach logging level. -+// Shortcut to reach logging level. - using Level = agl::common::interfaces::ILogger::Level; - - using namespace agl::common::interfaces; -@@ -31,68 +29,30 @@ static std::string TAG = "agl::audio::Audio"; - - std::shared_ptr<Audio> Audio::create( - std::shared_ptr<agl::common::interfaces::ILogger> logger, -- shared_ptr<agl::common::interfaces::IAFBApi> api) { -+ shared_ptr<agl::common::interfaces::IAFBApi> api) -+{ - return std::shared_ptr<Audio>(new Audio(logger, api)); - } - - Audio::Audio(std::shared_ptr<ILogger> logger, - std::shared_ptr<IAFBApi> api) : - m_logger(logger), -- m_api(api) { -- --} -- --std::string Audio::openAHLChannel(const std::string &role) -+ m_api(api) - { -- json_object *request = json_object_new_object(); -- json_object *response = NULL; -- json_object_object_add(request, "action", json_object_new_string("open")); -- if (callAHL(role, request, &response)) { -- json_object *val = NULL; -- std::string result; -- if (json_object_object_get_ex(response, "device_uri", &val)) { -- const char* device = json_object_get_string(val); -- m_logger->log(Level::DEBUG, TAG, "openAHLChannel: device=" + std::string(device)); -- result = device; -- } -- json_object_put(response); -- return result; -- } -- return ""; - } - --bool Audio::setAHLChannelVolume(const std::string &role, int volume) -+std::string Audio::openChannel(const std::string &role) - { -- json_object *request = json_object_new_object(); -- json_object_object_add(request, "action", json_object_new_string("volume")); -- json_object_object_add(request, "value", json_object_new_int(volume)); -- return callAHL(role, request, NULL); -+ // For now, return the given role as the device string, to match -+ // the expectation of the PipeWire sink configuration in the -+ // gstreamer output code. -+ return role; - } - --bool Audio::callAHL(const std::string &role, json_object *request, json_object **response) -+bool Audio::setChannelVolume(const std::string &role, int volume) - { -- json_object *object = NULL; -- std::string error, info; -- bool result = false; -- -- if (m_api->callSync("ahl-4a", role, request, &object, error, info) < 0) { -- m_logger->log(Level::ERROR, TAG, "VA service call=" + role + " failed, error=" + error + ", info=" + info); -- goto exit; -- } -- -- m_logger->log(Level::DEBUG, TAG, "callAHL, response=" + std::string(json_object_get_string(object))); -- result = true; -- if (response) { -- *response = object; -- } -- --exit: -- if (!result && object) { -- json_object_put(object); -- } -- -- return result; -+ return true; - } - --} --} -\ No newline at end of file -+} // namespace audio -+} // namespace agl -diff --git a/src/plugins/audio/Audio.h b/src/plugins/audio/Audio.h -index 14bef4d..8998242 100644 ---- a/src/plugins/audio/Audio.h -+++ b/src/plugins/audio/Audio.h -@@ -35,23 +35,21 @@ public: - std::shared_ptr<agl::common::interfaces::ILogger> logger, - shared_ptr<agl::common::interfaces::IAFBApi> api); - -- std::string openAHLChannel(const std::string &role); -- bool setAHLChannelVolume(const std::string &role, int volume); -+ std::string openChannel(const std::string &role); -+ bool setChannelVolume(const std::string &role, int volume); - - private: - Audio(std::shared_ptr<agl::common::interfaces::ILogger> logger, - shared_ptr<agl::common::interfaces::IAFBApi> api); - -- bool callAHL(const std::string &role, json_object *request, json_object **response); -- -- // Logger. -- std::shared_ptr<agl::common::interfaces::ILogger> m_logger; -+ // Logger. -+ std::shared_ptr<agl::common::interfaces::ILogger> m_logger; - - // AFB API object for events pub/sub, and for calling other AGL services. -- std::shared_ptr<agl::common::interfaces::IAFBApi> m_api; -+ std::shared_ptr<agl::common::interfaces::IAFBApi> m_api; - }; - --} --} -+} // namespace audio -+} // namespace agl - --#endif // AGL_AUDIO_AUDIO_H_ -\ No newline at end of file -+#endif // AGL_AUDIO_AUDIO_H_ diff --git a/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0004-update-config-and-database-paths.patch b/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0004-update-config-and-database-paths.patch deleted file mode 100644 index 0bf4267f..00000000 --- a/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0004-update-config-and-database-paths.patch +++ /dev/null @@ -1,124 +0,0 @@ -alexa-voiceagent-service: update config and database file paths - -Tweak getDataRootPath in the AASBConfigProviderImpl class to use the -AFM_WORKDIR environment variable as the basis for the path, which -moves things from the binding installation hierarchy into the app -framework's provided application data directory. This avoids the -permissions problems stemming from the new security model of running -as non-root. Also reworked the main configuration JSON file location -logic to use a new helper member function that checks for the file -in /etc/xdg/AGL and then in AFM_WORKDIR (app-data directory), before -falling back to the original location in var/config under the binding -installation directory. The local copy of GetBindingDirPath has been -removed, as it seems to be working fine now that the binding is being -built with AFB_BINDING_VERSION = 3. - -Upstream-Status: Pending - -Signed-off-by: Scott Murray <scott.murray@konsulko.com> - -diff --git a/src/plugins/aasb-client/config/AASBConfigProviderImpl.cpp b/src/plugins/aasb-client/config/AASBConfigProviderImpl.cpp -index b51185c..5d5c3ba 100644 ---- a/src/plugins/aasb-client/config/AASBConfigProviderImpl.cpp -+++ b/src/plugins/aasb-client/config/AASBConfigProviderImpl.cpp -@@ -19,6 +19,7 @@ - #include <iostream> - #include <sstream> - #include <unistd.h> -+#include <sys/stat.h> - - #include <rapidjson/document.h> - #include <rapidjson/istreamwrapper.h> -@@ -36,6 +37,9 @@ using Level = agl::common::interfaces::ILogger::Level; - /// Logging tag for this file. - static std::string TAG = "agl::alexa::AASBConfigProviderImpl"; - -+/// Directory where user over-ride alexa json configuration may be. -+static std::string ALEXA_CONFIG_FILE_OVERRIDE_DIR = "/etc/xdg/AGL/"; -+ - /// File name where alexa json configuration is stored. - static std::string ALEXA_CONFIG_FILE_NAME = "AlexaAutoCoreEngineConfig.json"; - -@@ -64,8 +68,7 @@ AASBConfigProviderImpl::AASBConfigProviderImpl(std::shared_ptr<agl::common::inte - m_enableLocalVoiceControl(false) { - m_LocalVoiceControlConfiguration = std::unique_ptr<LVCConfiguration>(new LVCConfiguration()); - m_carControlConfiguration = std::unique_ptr<CarControlConfiguration>(new CarControlConfiguration()); -- std::string alexaConfigFile = getDataRootPath() + ALEXA_CONFIG_FILE_NAME; -- initConfigFromFile(alexaConfigFile); -+ initConfigFromFile(getAlexaConfigPath()); - logCurrentConfiguration(); - } - -@@ -520,32 +523,25 @@ void AASBConfigProviderImpl::initConfigFromFile(const std::string& fileName) { - } - } - --// GetBindingDirPath() method provided by AGL SDK crashes every single time. --// It turns out that on latest AGL platforms, GetBindingDirPath(afb_api_t) version --// is supposed to be the correct version. However when we include filescan-utils.h --// it compiles a version without "afb_api_t" parameter. For now, I have made a --// copy of this method here which accepts "afb_api_t" parameter. --// TODO: Fix it --std::string GetBindingDirectoryPath(afb_api_t api) { -- // A file description should not be greater than 999.999.999 -- char fd_link[CONTROL_MAXPATH_LEN]; -- char retdir[CONTROL_MAXPATH_LEN]; -- ssize_t len; -- sprintf(fd_link, "/proc/self/fd/%d", afb_dynapi_rootdir_get_fd(api)); -- -- if ((len = readlink(fd_link, retdir, sizeof(retdir) - 1)) == -1) { -- perror("lstat"); -- strncpy(retdir, "/tmp", CONTROL_MAXPATH_LEN - 1); -- } else { -- retdir[len] = '\0'; -- } -- -- return std::string(retdir); -+std::string AASBConfigProviderImpl::getDataRootPath() { -+ std::string workDir(getenv("AFM_WORKDIR")); -+ return workDir + "/"; - } - --std::string AASBConfigProviderImpl::getDataRootPath() { -- std::string bindingDir(GetBindingDirectoryPath(m_api)); -- return bindingDir + "/var/config/"; -+std::string AASBConfigProviderImpl::getAlexaConfigPath() { -+ struct stat statbuf; -+ -+ // Look in over-ride directory first -+ std::string configPath = ALEXA_CONFIG_FILE_OVERRIDE_DIR + ALEXA_CONFIG_FILE_NAME; -+ if(stat(configPath.c_str(), &statbuf) != 0) { -+ // Look in work directory (app-data) next -+ configPath = getDataRootPath() + ALEXA_CONFIG_FILE_NAME; -+ if(stat(configPath.c_str(), &statbuf) != 0) { -+ // Fall back to default version in widget -+ configPath = std::string(GetBindingDirPath(m_api)) + "/var/config/" + ALEXA_CONFIG_FILE_NAME; -+ } -+ } -+ return configPath; - } - - void AASBConfigProviderImpl::logCurrentConfiguration() { -diff --git a/src/plugins/aasb-client/config/AASBConfigProviderImpl.h b/src/plugins/aasb-client/config/AASBConfigProviderImpl.h -index 6b79994..e32f7b7 100644 ---- a/src/plugins/aasb-client/config/AASBConfigProviderImpl.h -+++ b/src/plugins/aasb-client/config/AASBConfigProviderImpl.h -@@ -87,6 +87,11 @@ private: - */ - std::string getDataRootPath(); - -+ /** -+ * Provides the path where alexa json config resides. -+ */ -+ std::string getAlexaConfigPath(); -+ - /** - * Logs the current configuration loaded by this object. - */ -@@ -139,4 +144,4 @@ private: - } // namespace alexa - } // namespace agl - --#endif // AGL_ALEXA_SVC_AASB_CONFIG_PROVIDER_IMPL_H_ -\ No newline at end of file -+#endif // AGL_ALEXA_SVC_AASB_CONFIG_PROVIDER_IMPL_H_ diff --git a/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0005-fix-segmentation-fault-for-release-build-mode.patch b/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0005-fix-segmentation-fault-for-release-build-mode.patch deleted file mode 100644 index 5012dfe8..00000000 --- a/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0005-fix-segmentation-fault-for-release-build-mode.patch +++ /dev/null @@ -1,33 +0,0 @@ -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-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0006-fix-event-argument-json.patch b/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0006-fix-event-argument-json.patch deleted file mode 100644 index 8c6f1e4b..00000000 --- a/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service/0006-fix-event-argument-json.patch +++ /dev/null @@ -1,183 +0,0 @@ -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-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service_git.bb b/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service_git.bb index abae3dec..580b141c 100644 --- a/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service_git.bb +++ b/meta-speech-framework/meta-aac/recipes-apis/alexa-voiceagent-service/alexa-voiceagent-service_git.bb @@ -12,27 +12,24 @@ DEPENDS = " \ avs-device-sdk \ aac-module-core \ aac-module-alexa \ + aac-module-address-book \ + aac-module-car-control \ aac-module-cbl \ aac-module-contact-uploader \ aac-module-navigation \ aac-module-phone-control \ - aac-module-gstreamer \ + aac-module-system-audio \ ${@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 \ +SRC_URI = "git://github.com/alexa/alexa-auto-sdk.git;protocol=https;branch=2.3 \ 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 \ file://0007-add-autobuild-scripts.patch \ " -SRCREV = "86916d2d8c1702a8be3c88a9012ca56583bcc0c8" +SRCREV = "d46f22b453f528868b483e39bc7a057ca68a5199" -PV = "2.0+git${SRCPV}" +PV = "2.3+git${SRCPV}" S = "${WORKDIR}/git/platforms/agl/alexa-voiceagent-service" inherit cmake aglwgt diff --git a/meta-speech-framework/meta-aac/recipes-avs/avs-device-sdk/avs-device-sdk/0001-connection-deadlock-workaround.patch b/meta-speech-framework/meta-aac/recipes-avs/avs-device-sdk/avs-device-sdk/0001-connection-deadlock-workaround.patch new file mode 100644 index 00000000..3bf79835 --- /dev/null +++ b/meta-speech-framework/meta-aac/recipes-avs/avs-device-sdk/avs-device-sdk/0001-connection-deadlock-workaround.patch @@ -0,0 +1,35 @@ +Workaround for connection deadlock + +Change the maximum (effectively infinite) delay in HTTP2Transport's +connecting state handling code to use the inactivity timeout value, +which is currently 5 minutes. This seems to avoid triggering a +deadlock between the condition variable checking in the +monitorSharedQueueWhileWaiting method and use of the object's m_mutex +member in sendPostConnectMessage and onActivity methods. +At present, my theory is this issue stems from some change or bug +in the newer g++/libstdc++ coming with dunfell versus the thud release +that Amazon supports. + +Upstream-Status: Inappropriate [other] + +Signed-off-by: Scott Murray <scott.murray@konsulko.com> + +diff --git a/ACL/src/Transport/HTTP2Transport.cpp b/ACL/src/Transport/HTTP2Transport.cpp +index f1b5c03..dec7424 100644 +--- a/ACL/src/Transport/HTTP2Transport.cpp ++++ b/ACL/src/Transport/HTTP2Transport.cpp +@@ -618,7 +618,13 @@ HTTP2Transport::State HTTP2Transport::handleConnecting() { + return m_state; + } + +- return monitorSharedQueueWhileWaiting(State::CONNECTING); ++ // Wait for connection for the same length of time as the post-connection ++ // inactivity monitor timeout (currently 5 minutes). ++ // This seems to avoid triggering an issue where connecting deadlocks when ++ // using the maximum timeout of std::chrono:steady_clock. ++ std::chrono::time_point<std::chrono::steady_clock> timeout = ++ std::chrono::steady_clock::now() + INACTIVITY_TIMEOUT; ++ return monitorSharedQueueWhileWaiting(State::CONNECTING, timeout); + } + + HTTP2Transport::State HTTP2Transport::handleWaitingToRetryConnecting() { diff --git a/meta-speech-framework/meta-aac/recipes-avs/avs-device-sdk/avs-device-sdk/0001-enable-building-with-g++-9.patch b/meta-speech-framework/meta-aac/recipes-avs/avs-device-sdk/avs-device-sdk/0001-enable-building-with-g++-9.patch deleted file mode 100644 index 0e4f14fd..00000000 --- a/meta-speech-framework/meta-aac/recipes-avs/avs-device-sdk/avs-device-sdk/0001-enable-building-with-g++-9.patch +++ /dev/null @@ -1,24 +0,0 @@ -Enable building with g++ 9.x - -Disable -Werror for new warning "deprecated-copy" to avoid build -failure in the packaged copy of googletest with g++ 9.x. This is -hopefully temporary until googletest is upgraded or it becomes -straightforward to build against an externally provided copy. - -Upstream-Status: pending - -Signed-off-by: Scott Murray <scott.murray@konsulko.com> - -diff --git a/ThirdParty/googletest-release-1.8.0/googletest/cmake/internal_utils.cmake b/ThirdParty/googletest-release-1.8.0/googletest/cmake/internal_utils.cmake -index 777b91e..7832f20 100644 ---- a/ThirdParty/googletest-release-1.8.0/googletest/cmake/internal_utils.cmake -+++ b/ThirdParty/googletest-release-1.8.0/googletest/cmake/internal_utils.cmake -@@ -91,7 +91,7 @@ macro(config_compiler_and_linker) - set(cxx_no_exception_flags "-D_HAS_EXCEPTIONS=0") - set(cxx_no_rtti_flags "-GR-") - elseif (CMAKE_COMPILER_IS_GNUCXX) -- set(cxx_base_flags "-Wall -Wshadow") -+ set(cxx_base_flags "-Wall -Wshadow -Wno-error=deprecated-copy") - set(cxx_exception_flags "-fexceptions") - set(cxx_no_exception_flags "-fno-exceptions") - # Until version 4.3.2, GCC doesn't define a macro to indicate diff --git a/meta-speech-framework/meta-aac/recipes-avs/avs-device-sdk/avs-device-sdk_1.13.bbappend b/meta-speech-framework/meta-aac/recipes-avs/avs-device-sdk/avs-device-sdk_1.13.bbappend deleted file mode 100644 index 8afb91a9..00000000 --- a/meta-speech-framework/meta-aac/recipes-avs/avs-device-sdk/avs-device-sdk_1.13.bbappend +++ /dev/null @@ -1,3 +0,0 @@ -FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:" - -SRC_URI += "file://0001-enable-building-with-g++-9.patch" diff --git a/meta-speech-framework/meta-aac/recipes-avs/avs-device-sdk/avs-device-sdk_1.19.1.bbappend b/meta-speech-framework/meta-aac/recipes-avs/avs-device-sdk/avs-device-sdk_1.19.1.bbappend new file mode 100644 index 00000000..d4ea2592 --- /dev/null +++ b/meta-speech-framework/meta-aac/recipes-avs/avs-device-sdk/avs-device-sdk_1.19.1.bbappend @@ -0,0 +1,3 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:" + +SRC_URI += "file://0001-connection-deadlock-workaround.patch" diff --git a/meta-speech-framework/meta-aac/recipes-modules/aac-module-car-control/aac-module-car-control.bbappend b/meta-speech-framework/meta-aac/recipes-modules/aac-module-car-control/aac-module-car-control.bbappend new file mode 100644 index 00000000..93b7b443 --- /dev/null +++ b/meta-speech-framework/meta-aac/recipes-modules/aac-module-car-control/aac-module-car-control.bbappend @@ -0,0 +1,3 @@ +# Fix nlohmann dependency to pick up newer nlohmann-json recipe in meta-oe +DEPENDS_remove = "nlohmann" +DEPENDS_append = " nlohmann-json" diff --git a/meta-speech-framework/meta-aac/recipes-modules/aac-module-gstreamer/aac-module-gstreamer/0001-gstreamer-implement-pipewire-integration.patch b/meta-speech-framework/meta-aac/recipes-modules/aac-module-gstreamer/aac-module-gstreamer/0001-gstreamer-implement-pipewire-integration.patch deleted file mode 100644 index b0a5c104..00000000 --- a/meta-speech-framework/meta-aac/recipes-modules/aac-module-gstreamer/aac-module-gstreamer/0001-gstreamer-implement-pipewire-integration.patch +++ /dev/null @@ -1,94 +0,0 @@ -gstreamer: implement pipewire integration using pwaudiosrc/pwaudiosink - -The code path is wrapped in #ifdef USE_PIPEWIRE so that it can be toggled -easily at compile time. - -The device string is abused to hold the role name, just like it was -with 4A. In the future this may need to be reconsidered. In theory, -we could detect the backend or make it configurable from the upper layer -if we knew exactly what kind of data is in that device string -(is it an ALSA device name? a pipewire role? a pipewire node id? -a pulseaudio device name? ...) - -Upstream-Status: Pending - -Signed-off-by: George Kiagiadakis <george.kiagiadakis@collabora.com> -[reworked for SDK 2.0] -Signed-off-by: Scott Murray <scott.murray@konsulko.com> - -diff --git a/lib/aal/CMakeLists.txt b/lib/aal/CMakeLists.txt -index a892465..c92b2cf 100644 ---- a/lib/aal/CMakeLists.txt -+++ b/lib/aal/CMakeLists.txt -@@ -7,6 +7,7 @@ set(CMAKE_POSITION_INDEPENDENT_CODE ON) - - add_definitions(-DUSE_GLOOP) - add_definitions(-DUSE_FAKEMUTE) -+add_definitions(-DUSE_PIPEWIRE) - - # GStreamer - find_package(PkgConfig) -diff --git a/lib/aal/src/player.c b/lib/aal/src/player.c -index 02a2881..8747854 100644 ---- a/lib/aal/src/player.c -+++ b/lib/aal/src/player.c -@@ -120,6 +120,19 @@ aal_handle_t aal_player_create(const aal_attributes_t *attr) - g_object_get(volume, "volume", &ctx->saved_volume, NULL); - #endif - -+#ifdef USE_PIPEWIRE -+ sink = create_and_add_element(bin, "pwaudiosink", "sink"); -+ if (sink && attr->device && !IS_EMPTY_STRING(attr->device)) { -+ g_info("Using role: %s\n", attr->device); -+ GstStructure *s = gst_structure_new("properties", -+ "media.role", -+ G_TYPE_STRING, -+ attr->device, -+ NULL); -+ g_object_set(G_OBJECT(sink), "stream-properties", s, NULL); -+ gst_structure_free(s); -+ } -+#else - if (!attr->device || IS_EMPTY_STRING(attr->device)) { - sink = create_and_add_element(bin, "autoaudiosink", "sink"); - } else { -@@ -128,6 +141,7 @@ aal_handle_t aal_player_create(const aal_attributes_t *attr) - if (sink) - g_object_set(G_OBJECT(sink), "device", attr->device, NULL); - } -+#endif - if (!sink) - goto exit; - -diff --git a/lib/aal/src/recorder.c b/lib/aal/src/recorder.c -index 96c9b2a..66b36e1 100644 ---- a/lib/aal/src/recorder.c -+++ b/lib/aal/src/recorder.c -@@ -86,6 +86,19 @@ aal_handle_t aal_recorder_create(const aal_attributes_t *attr) - if (!ctx) - goto exit; - -+#ifdef USE_PIPEWIRE -+ source = create_and_add_element(ctx->pipeline, "pwaudiosrc", "source"); -+ if (source && attr->device && !IS_EMPTY_STRING(attr->device)) { -+ g_info("Using role: %s\n", attr->device); -+ GstStructure *s = gst_structure_new("properties", -+ "media.role", -+ G_TYPE_STRING, -+ attr->device, -+ NULL); -+ g_object_set(G_OBJECT(source), "stream-properties", s, NULL); -+ gst_structure_free(s); -+ } -+#else - if (!attr->device || IS_EMPTY_STRING(attr->device)) { - source = create_and_add_element(ctx->pipeline, "autoaudiosrc", "source"); - } else { -@@ -94,6 +107,7 @@ aal_handle_t aal_recorder_create(const aal_attributes_t *attr) - if (source) - g_object_set(G_OBJECT(source), "device", attr->device, NULL); - } -+#endif - if (!source) - goto exit; - diff --git a/meta-speech-framework/meta-aac/recipes-modules/aac-module-messaging/aac-module-messaging.bbappend b/meta-speech-framework/meta-aac/recipes-modules/aac-module-messaging/aac-module-messaging.bbappend new file mode 100644 index 00000000..93b7b443 --- /dev/null +++ b/meta-speech-framework/meta-aac/recipes-modules/aac-module-messaging/aac-module-messaging.bbappend @@ -0,0 +1,3 @@ +# Fix nlohmann dependency to pick up newer nlohmann-json recipe in meta-oe +DEPENDS_remove = "nlohmann" +DEPENDS_append = " nlohmann-json" diff --git a/meta-speech-framework/meta-aac/recipes-modules/aac-module-gstreamer/aac-module-gstreamer.bbappend b/meta-speech-framework/meta-aac/recipes-modules/aac-module-system-audio/aac-module-system-audio.bbappend index 1b2618e8..35847170 100644 --- a/meta-speech-framework/meta-aac/recipes-modules/aac-module-gstreamer/aac-module-gstreamer.bbappend +++ b/meta-speech-framework/meta-aac/recipes-modules/aac-module-system-audio/aac-module-system-audio.bbappend @@ -1,9 +1,8 @@ -FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:" - # Needed for the required gstreamer-app-1.0 pkgconfig bits DEPENDS += "gstreamer1.0-plugins-base" -AAC_PATCHES += "file://0001-gstreamer-implement-pipewire-integration.patch" +# Need to enable PipeWire support +EXTRA_OECMAKE += "-DUSE_PIPEWIRE=1" # Pull static library into appropriate package to avoid a QA error FILES_${PN}-staticdev += "${AAC_PREFIX}/lib/libaal.a" diff --git a/templates/feature/agl-voiceagent-alexa/50_bblayers.conf.inc b/templates/feature/agl-voiceagent-alexa/50_bblayers.conf.inc index c32a0f6d..ab41cdbd 100644 --- a/templates/feature/agl-voiceagent-alexa/50_bblayers.conf.inc +++ b/templates/feature/agl-voiceagent-alexa/50_bblayers.conf.inc @@ -8,7 +8,7 @@ BBLAYERS =+ " \ BBFILES += "${METADIR}/external/alexa-auto-sdk/modules/*/*.bb" # Include the recipe for the required gstreamer module as well -BBFILES += "${METADIR}/external/alexa-auto-sdk/extensions/experimental/gstreamer/modules/*/*.bb" +BBFILES += "${METADIR}/external/alexa-auto-sdk/extensions/experimental/system-audio/modules/*/*.bb" # For now, tweak the layer's compatibility to allow using with zeus, # since we know it works without major issues. |