From e423d6427ba67ae4a334e361059b044475806977 Mon Sep 17 00:00:00 2001 From: Ji-hoon Lee Date: Mon, 2 Dec 2019 19:48:39 +0900 Subject: [PATCH 01/16] Remove unused privilege definition Change-Id: If00ccd366f4592239d0c84684a6117d20b01c536 --- org.tizen.multi-assistant-service.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/org.tizen.multi-assistant-service.xml b/org.tizen.multi-assistant-service.xml index b97ba98..7ba4aa1 100644 --- a/org.tizen.multi-assistant-service.xml +++ b/org.tizen.multi-assistant-service.xml @@ -28,7 +28,6 @@ http://tizen.org/privilege/appmanager.kill http://tizen.org/privilege/keygrab http://tizen.org/privilege/recorder - http://tizen.org/privilege/appdir.shareddata http://tizen.org/privilege/internet http://tizen.org/privilege/network.get http://tizen.org/privilege/bluetooth -- 2.7.4 From e31bc9cd7a1e572bc4eaeedf487de20ca8268fe2 Mon Sep 17 00:00:00 2001 From: Ji-hoon Lee Date: Tue, 3 Dec 2019 18:02:24 +0900 Subject: [PATCH 02/16] Add wakeup policy support in dependency module Change-Id: I54d5e54b7a1a45a4eef03a80679b0705925dcc32 --- plugins/wakeup-manager/CMakeLists.txt | 1 + plugins/wakeup-manager/inc/dependency_resolver.h | 28 ++++++++----- .../wakeup-manager/inc/wakeup_manager_wrapper.h | 2 + plugins/wakeup-manager/inc/wakeup_policy.h | 3 ++ plugins/wakeup-manager/inc/wakeup_policy_default.h | 7 +++- .../wakeup-manager/inc/wakeup_policy_external.h | 44 +++++++++++++++++++ plugins/wakeup-manager/src/dependency_resolver.cpp | 33 +++++++++++++++ plugins/wakeup-manager/src/wakeup_manager.cpp | 35 +++++++++------- .../wakeup-manager/src/wakeup_manager_wrapper.cpp | 7 ++++ .../wakeup-manager/src/wakeup_policy_default.cpp | 18 ++++---- .../wakeup-manager/src/wakeup_policy_external.cpp | 49 ++++++++++++++++++++++ 11 files changed, 191 insertions(+), 36 deletions(-) create mode 100644 plugins/wakeup-manager/inc/wakeup_policy_external.h create mode 100644 plugins/wakeup-manager/src/wakeup_policy_external.cpp diff --git a/plugins/wakeup-manager/CMakeLists.txt b/plugins/wakeup-manager/CMakeLists.txt index 1f804c1..55a8770 100644 --- a/plugins/wakeup-manager/CMakeLists.txt +++ b/plugins/wakeup-manager/CMakeLists.txt @@ -42,6 +42,7 @@ SET(SRCS src/wakeup_settings.cpp src/wakeup_policy.cpp src/wakeup_policy_default.cpp + src/wakeup_policy_external.cpp src/wakeup_audio_manager.cpp src/wakeup_engine_manager.cpp src/wakeup_manager_wrapper.cpp diff --git a/plugins/wakeup-manager/inc/dependency_resolver.h b/plugins/wakeup-manager/inc/dependency_resolver.h index d0ab5b7..75d882e 100644 --- a/plugins/wakeup-manager/inc/dependency_resolver.h +++ b/plugins/wakeup-manager/inc/dependency_resolver.h @@ -25,17 +25,6 @@ extern "C" { #endif -int dependency_resolver_initialize(mas_dependency_plugin_proxy_interface interface); -int dependency_resolver_deinitialize(void); -int dependency_resolver_set_error_callback(mas_error_cb callback, void* user_data); -int dependency_resolver_start_recording(); -int dependency_resolver_stop_recording(); -int dependency_resolver_set_recording_session(unsigned int); -int dependency_resolver_set_background_volume(double ratio); -int dependency_resolver_get_audio_format(int* rate, int* channel, int* audio_type); -int dependency_resolver_get_audio_source_type(char** type); -int dependency_resolver_process_wakeup_engine_command(const char* engine, const char* command); - /************************************************************************************** *** Definitions for dependencies *************************************************************************************/ @@ -63,6 +52,8 @@ typedef int (*mas_dependency_get_audio_format)(int* rate, int* channel, int* aud typedef int (*mas_dependency_get_audio_source_type)(char** type); #define MAS_DEPENDENCY_FUNC_PROCESS_WAKEUP_ENGINE_COMMAND "mas_dependency_process_wakeup_engine_command" typedef int (*mas_dependency_process_wakeup_engine_command)(const char* engine_name, const char* command); +#define MAS_DEPENDENCY_FUNC_PROCESS_WAKEUP_CANDIDATE "mas_dependency_process_wakeup_candidate" +typedef int (*mas_dependency_process_wakeup_candidate)(const mas_wakeup_event_info* info); typedef struct { mas_dependency_initialize initialize; @@ -75,8 +66,23 @@ typedef struct { mas_dependency_get_audio_format get_audio_format; mas_dependency_get_audio_source_type get_audio_source_type; mas_dependency_process_wakeup_engine_command process_wakeup_engine_command; + mas_dependency_process_wakeup_candidate process_wakeup_candidate; } mas_dependency_module_interface; +int dependency_resolver_initialize(mas_dependency_plugin_proxy_interface interface); +int dependency_resolver_deinitialize(void); +int dependency_resolver_set_error_callback(mas_error_cb callback, void* user_data); +int dependency_resolver_start_recording(); +int dependency_resolver_stop_recording(); +int dependency_resolver_set_recording_session(unsigned int); +int dependency_resolver_set_background_volume(double ratio); +int dependency_resolver_get_audio_format(int* rate, int* channel, int* audio_type); +int dependency_resolver_get_audio_source_type(char** type); +int dependency_resolver_process_wakeup_engine_command(const char* engine, const char* command); +int dependency_resolver_process_wakeup_candidate(mas_wakeup_event_info* info); + +mas_dependency_module_interface* dependency_resolver_get_interface(); + #ifdef __cplusplus } #endif diff --git a/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h b/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h index 533c1bd..92858fb 100644 --- a/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h +++ b/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h @@ -136,6 +136,8 @@ int wakeup_manager_feed_audio_data(mas_speech_streaming_event_e event, void* buf int wakeup_manager_send_dependency_module_command(const char* engine_name, const char* command); +int wakeup_manager_wakeup_assistant(const mas_wakeup_event_info* wakeup_info); + #ifdef __cplusplus } #endif diff --git a/plugins/wakeup-manager/inc/wakeup_policy.h b/plugins/wakeup-manager/inc/wakeup_policy.h index 09bbd8f..238a27b 100644 --- a/plugins/wakeup-manager/inc/wakeup_policy.h +++ b/plugins/wakeup-manager/inc/wakeup_policy.h @@ -48,10 +48,13 @@ public: CWakeupPolicy(const CWakeupPolicy&) = delete; CWakeupPolicy& operator=(const CWakeupPolicy&) = delete; + virtual bool valid() = 0; + void subscribe(IPolicyEventObserver *observer); void unsubscribe(IPolicyEventObserver *observer); virtual void wakeup_candidate(mas_wakeup_event_info wakeup_info) = 0; + virtual void select_candidate(mas_wakeup_event_info wakeup_info) = 0; protected: unique_ptr mImpl; }; diff --git a/plugins/wakeup-manager/inc/wakeup_policy_default.h b/plugins/wakeup-manager/inc/wakeup_policy_default.h index f2a3081..d4b36b7 100644 --- a/plugins/wakeup-manager/inc/wakeup_policy_default.h +++ b/plugins/wakeup-manager/inc/wakeup_policy_default.h @@ -34,14 +34,17 @@ using namespace std; class CWakeupPolicyDefault : public CWakeupPolicy { public: - CWakeupPolicyDefault(); CWakeupPolicyDefault(IPolicyEventObserver *observer); ~CWakeupPolicyDefault(); + bool valid() override; + void set_assistant_priority(string appid, int priority); void set_delay(float seconds); - void wakeup_candidate(mas_wakeup_event_info wakeup_info); + void wakeup_candidate(mas_wakeup_event_info wakeup_info) override; + void select_candidate(mas_wakeup_event_info wakeup_info) override; + void timer_expired(); private: typedef struct { diff --git a/plugins/wakeup-manager/inc/wakeup_policy_external.h b/plugins/wakeup-manager/inc/wakeup_policy_external.h new file mode 100644 index 0000000..846330f --- /dev/null +++ b/plugins/wakeup-manager/inc/wakeup_policy_external.h @@ -0,0 +1,44 @@ +/* + * Copyright 2018 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _WAKEUP_POLICY_EXTERNAL_H_ +#define _WAKEUP_POLICY_EXTERNAL_H_ + +#include "wakeup_policy.h" + +namespace multiassistant +{ +namespace wakeup +{ + +using namespace std; + +class CWakeupPolicyExternal : public CWakeupPolicy +{ +public: + CWakeupPolicyExternal(IPolicyEventObserver *observer); + ~CWakeupPolicyExternal(); + + bool valid() override; + + void wakeup_candidate(mas_wakeup_event_info wakeup_info) override; + void select_candidate(mas_wakeup_event_info wakeup_info) override; +}; + +} // wakeup +} // multiassistant + +#endif /* _WAKEUP_POLICY_EXTERNAL_H_ */ diff --git a/plugins/wakeup-manager/src/dependency_resolver.cpp b/plugins/wakeup-manager/src/dependency_resolver.cpp index e329bda..c2537d6 100644 --- a/plugins/wakeup-manager/src/dependency_resolver.cpp +++ b/plugins/wakeup-manager/src/dependency_resolver.cpp @@ -35,6 +35,11 @@ static void *g_handle = NULL; static mas_dependency_module_interface g_mas_dependency = { NULL, }; +mas_dependency_module_interface* dependency_resolver_get_interface() +{ + return &g_mas_dependency; +} + int dependency_resolver_initialize(mas_dependency_plugin_proxy_interface interface) { MAS_LOGD("[Enter]"); @@ -89,6 +94,9 @@ int dependency_resolver_initialize(mas_dependency_plugin_proxy_interface interfa g_mas_dependency.process_wakeup_engine_command = (mas_dependency_process_wakeup_engine_command)dlsym(g_handle, MAS_DEPENDENCY_FUNC_PROCESS_WAKEUP_ENGINE_COMMAND); + g_mas_dependency.process_wakeup_candidate = + (mas_dependency_process_wakeup_candidate)dlsym(g_handle, + MAS_DEPENDENCY_FUNC_PROCESS_WAKEUP_CANDIDATE); int ret = -1; int dependency_version = 0; @@ -344,3 +352,28 @@ int dependency_resolver_process_wakeup_engine_command(const char* engine, const return ret; } + +int dependency_resolver_process_wakeup_candidate(mas_wakeup_event_info* info) +{ + int ret = -1; + if (NULL != g_handle) { + mas_dependency_process_wakeup_candidate func = g_mas_dependency.process_wakeup_candidate; + if (NULL == func) { + MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_PROCESS_WAKEUP_CANDIDATE); + } else { + try { + ret = func(info); + } catch (const std::exception& e) { + MAS_LOGE("[ERROR] %s of dependency module threw exception : %s", + MAS_DEPENDENCY_FUNC_PROCESS_WAKEUP_CANDIDATE, e.what()); + } + if (0 != ret) { + MAS_LOGE("[ERROR] Fail to process wakeup candidate, ret(%d)", ret); + } + } + } else { + MAS_LOGE("[ERROR] g_handle is not valid"); + } + + return ret; +} diff --git a/plugins/wakeup-manager/src/wakeup_manager.cpp b/plugins/wakeup-manager/src/wakeup_manager.cpp index a18eef8..352ebbe 100644 --- a/plugins/wakeup-manager/src/wakeup_manager.cpp +++ b/plugins/wakeup-manager/src/wakeup_manager.cpp @@ -17,6 +17,7 @@ #include "wakeup_manager.h" #include "wakeup_manager_main.h" #include "wakeup_policy_default.h" +#include "wakeup_policy_external.h" #include "dependency_resolver.h" #include @@ -73,19 +74,22 @@ CWakeupManager::~CWakeupManager() void CWakeupManager::initialize_wakeup_policy() { - mWakeupPolicy.reset(new CWakeupPolicyDefault{&mPolicyEventObserver}); - - /* Default Policy specific initialization */ - CWakeupPolicyDefault *policy = - dynamic_cast(mWakeupPolicy.get()); - if (policy) { - int priority = 0; - - policy->set_delay(mWakeupSettings.get_wakeup_policy_delay()); - MWR_LOGD("Setting Delay : %f", mWakeupSettings.get_wakeup_policy_delay()); - for (const auto& assistant : mWakeupSettings.get_wakeup_policy_priority()) { - policy->set_assistant_priority(assistant, ++priority); - MWR_LOGD("Setting Priority : %d %s", priority, assistant.c_str()); + mWakeupPolicy.reset(new CWakeupPolicyExternal{&mPolicyEventObserver}); + if (nullptr == mWakeupPolicy || !(mWakeupPolicy->valid())) { + mWakeupPolicy.reset(new CWakeupPolicyDefault{&mPolicyEventObserver}); + + /* Default Policy specific initialization */ + CWakeupPolicyDefault *policy = + dynamic_cast(mWakeupPolicy.get()); + if (policy) { + int priority = 0; + + policy->set_delay(mWakeupSettings.get_wakeup_policy_delay()); + MWR_LOGD("Setting Delay : %f", mWakeupSettings.get_wakeup_policy_delay()); + for (const auto& assistant : mWakeupSettings.get_wakeup_policy_priority()) { + policy->set_assistant_priority(assistant, ++priority); + MWR_LOGD("Setting Priority : %d %s", priority, assistant.c_str()); + } } } } @@ -106,8 +110,6 @@ bool CWakeupManager::initialize() mAudioManager.subscribe(&mAudioEventObserver); mAudioManager.initialize(); - initialize_wakeup_policy(); - mWakeupEngineManager.subscribe(&mEngineEventObserver); mWakeupEngineManager.initialize(); @@ -115,9 +117,12 @@ bool CWakeupManager::initialize() interface.process_event = wakeup_manager_process_event; interface.feed_audio_data = wakeup_manager_feed_audio_data; //interface.send_dependency_module_command = wakeup_manager_send_dependency_module_command; + interface.wakeup_assistant = wakeup_manager_wakeup_assistant; dependency_resolver_initialize(interface); + initialize_wakeup_policy(); + MWR_LOGD("[END]"); return true; } diff --git a/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp b/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp index a5cdc59..2325bcb 100644 --- a/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp +++ b/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp @@ -660,6 +660,13 @@ int wakeup_manager_send_dependency_module_command(const char* engine_name, const return 0; } +int wakeup_manager_wakeup_assistant(const mas_wakeup_event_info* wakeup_info) +{ + if (nullptr == g_wakeup_manager) return -1; + CWakeupPolicy* policy = g_wakeup_manager->get_wakeup_policy(); + if (policy) policy->select_candidate(*wakeup_info); +} + void CWakeupEventObserver::on_wakeup(mas_wakeup_event_info wakeup_info) { if (NULL != g_wakeup_event_cb) { diff --git a/plugins/wakeup-manager/src/wakeup_policy_default.cpp b/plugins/wakeup-manager/src/wakeup_policy_default.cpp index 1715ddf..7a471fd 100644 --- a/plugins/wakeup-manager/src/wakeup_policy_default.cpp +++ b/plugins/wakeup-manager/src/wakeup_policy_default.cpp @@ -6,19 +6,11 @@ #include #include -#ifndef LOG_TAG -#define LOG_TAG "WakeupPolicyDefault" -#endif - namespace multiassistant { namespace wakeup { -CWakeupPolicyDefault::CWakeupPolicyDefault() -{ -} - CWakeupPolicyDefault::CWakeupPolicyDefault(IPolicyEventObserver *observer) : CWakeupPolicy(observer) { @@ -32,6 +24,11 @@ CWakeupPolicyDefault::~CWakeupPolicyDefault() } } +bool CWakeupPolicyDefault::valid() +{ + return true; +} + void CWakeupPolicyDefault::set_assistant_priority(string appid, int priority) { PRIORITY_INFO info; @@ -68,6 +65,11 @@ void CWakeupPolicyDefault::wakeup_candidate(mas_wakeup_event_info wakeup_info) } } +void CWakeupPolicyDefault::select_candidate(mas_wakeup_event_info wakeup_info) +{ + LOGE("Default wakeup policy does not support selecting candidate"); +} + void CWakeupPolicyDefault::timer_expired() { LOGD("[ENTER]"); diff --git a/plugins/wakeup-manager/src/wakeup_policy_external.cpp b/plugins/wakeup-manager/src/wakeup_policy_external.cpp new file mode 100644 index 0000000..2c94a2a --- /dev/null +++ b/plugins/wakeup-manager/src/wakeup_policy_external.cpp @@ -0,0 +1,49 @@ +#include "wakeup_policy_external.h" +#include "wakeup_policy_impl.h" + +#include "dependency_resolver.h" + +#include + +#ifndef LOG_TAG +#define LOG_TAG "WakeupPolicyExternal" +#endif + +namespace multiassistant +{ +namespace wakeup +{ + +CWakeupPolicyExternal::CWakeupPolicyExternal(IPolicyEventObserver *observer) + : CWakeupPolicy(observer) +{ +} + +CWakeupPolicyExternal::~CWakeupPolicyExternal() +{ +} + +bool CWakeupPolicyExternal::valid() +{ + bool ret = false; + mas_dependency_module_interface* interface = dependency_resolver_get_interface(); + if (interface) { + if (interface->process_wakeup_candidate) { + ret = true; + } + } + return ret; +} + +void CWakeupPolicyExternal::wakeup_candidate(mas_wakeup_event_info wakeup_info) +{ + dependency_resolver_process_wakeup_candidate(&wakeup_info); +} + +void CWakeupPolicyExternal::select_candidate(mas_wakeup_event_info wakeup_info) +{ + if (mImpl) mImpl->wakeup(wakeup_info); +} + +} // wakeup +} // multiassistant -- 2.7.4 From 1b3cd8e9bb4a2fe2634c370f5df76d1a7126b7f9 Mon Sep 17 00:00:00 2001 From: Ji-hoon Lee Date: Fri, 6 Dec 2019 19:00:44 +0900 Subject: [PATCH 03/16] Keep assistants updated about service state changes Change-Id: Ie7e01bc84b61da61da959e03cbebec16bf14a9fa --- inc/multi_assistant_main.h | 1 + inc/multi_assistant_service_client.h | 4 ++ inc/multi_assistant_service_plugin.h | 3 ++ inc/multi_wakeup_recognizer.h | 3 ++ plugins/wakeup-manager/inc/wakeup_manager.h | 1 + .../wakeup-manager/inc/wakeup_manager_wrapper.h | 5 +++ plugins/wakeup-manager/src/wakeup_manager.cpp | 3 ++ .../wakeup-manager/src/wakeup_manager_wrapper.cpp | 30 +++++++++++++ src/multi_assistant_dbus.c | 51 ++++++++++++++++++++++ src/multi_assistant_dbus.h | 8 ++++ src/multi_assistant_service.c | 32 +++++++++++++- src/multi_assistant_service_plugin.c | 36 ++++++++++++++- 12 files changed, 175 insertions(+), 2 deletions(-) diff --git a/inc/multi_assistant_main.h b/inc/multi_assistant_main.h index 3e2b2c1..8adc1c0 100644 --- a/inc/multi_assistant_main.h +++ b/inc/multi_assistant_main.h @@ -82,6 +82,7 @@ #define MAS_METHOD_AUDIO_STREAMING_DATA_SECTION "mas_method_audio_streaming_data_section" #define MAS_METHOD_SEND_PREPROCESSING_RESULT "mas_method_send_preprocessing_result" #define MAS_METHOD_SEND_WAKEUP_ENGINE_COMMAND "mas_method_send_wakeup_engine_command" +#define MAS_METHOD_SERVICE_STATE_CHANGE "mas_method_service_state_change" #define MAS_UI_METHOD_SEND_ASR_RESULT "mas_ui_method_send_asr_result" #define MAS_UI_METHOD_SEND_RESULT "mas_ui_method_send_result" diff --git a/inc/multi_assistant_service_client.h b/inc/multi_assistant_service_client.h index b3eebf1..110d0d1 100644 --- a/inc/multi_assistant_service_client.h +++ b/inc/multi_assistant_service_client.h @@ -83,6 +83,10 @@ int mas_launch_client_by_wakeup_word(const char *wakeup_word); int mas_prelaunch_default_assistant(); +int mas_set_current_service_state(ma_service_state_e state); + +ma_service_state_e mas_get_current_service_state(); + typedef enum { CLIENT_LAUNCH_MODE_ACTIVATION, CLIENT_LAUNCH_MODE_PRELAUNCH, diff --git a/inc/multi_assistant_service_plugin.h b/inc/multi_assistant_service_plugin.h index 7115f95..cae0038 100644 --- a/inc/multi_assistant_service_plugin.h +++ b/inc/multi_assistant_service_plugin.h @@ -173,6 +173,8 @@ typedef int (*wakeup_manager_set_error_callback)(wakeup_service_error_cb callbac typedef int (*wakeup_manager_set_streaming_section_changed_callback)(wakeup_service_streaming_section_changed_cb callback, void* user_data); #define MA_WAKEUP_MANAGER_FUNC_SET_WAKEUP_ENGINE_COMMAND_CALLBACK "wakeup_manager_set_wakeup_engine_command_callback" typedef int (*wakeup_manager_set_wakeup_engine_command_callback)(wakeup_service_wakeup_engine_command_cb callback, void* user_data); +#define MA_WAKEUP_MANAGER_FUNC_SET_WAKEUP_SERVICE_STATE_CHANGED_CALLBACK "wakeup_manager_set_wakeup_service_state_changed_callback" +typedef int (*wakeup_manager_set_wakeup_service_state_changed_callback)(wakeup_service_wakeup_service_state_changed_cb callback, void* user_data); typedef struct { wakeup_manager_initialize initialize; @@ -210,6 +212,7 @@ typedef struct { wakeup_manager_set_error_callback set_error_callback; wakeup_manager_set_streaming_section_changed_callback set_streaming_section_changed_callback; wakeup_manager_set_wakeup_engine_command_callback set_wakeup_engine_command_callback; + wakeup_manager_set_wakeup_service_state_changed_callback set_wakeup_service_state_changed_callback; } wakeup_manager_interface; #ifdef __cplusplus diff --git a/inc/multi_wakeup_recognizer.h b/inc/multi_wakeup_recognizer.h index 6e1b26a..cdd8140 100644 --- a/inc/multi_wakeup_recognizer.h +++ b/inc/multi_wakeup_recognizer.h @@ -22,6 +22,7 @@ #include #include +#include #ifdef __cplusplus extern "C" { @@ -41,6 +42,8 @@ typedef void (*wakeup_service_streaming_section_changed_cb)(ma_audio_streaming_d typedef void (*wakeup_service_wakeup_engine_command_cb)(mas_wakeup_engine_command_target_e target, const char* assistant_name, const char* command, void* user_data); +typedef void (*wakeup_service_wakeup_service_state_changed_cb)(ma_service_state_e state, void* user_data); + #ifdef __cplusplus } #endif diff --git a/plugins/wakeup-manager/inc/wakeup_manager.h b/plugins/wakeup-manager/inc/wakeup_manager.h index 8d36921..85ce732 100644 --- a/plugins/wakeup-manager/inc/wakeup_manager.h +++ b/plugins/wakeup-manager/inc/wakeup_manager.h @@ -50,6 +50,7 @@ public: virtual void on_audio_streaming_data_section(ma_audio_streaming_data_section_e section) = 0; virtual void on_wakeup_engine_command( mas_wakeup_engine_command_target_e target, const char* name, const char* command) = 0; + virtual void on_wakeup_service_state_changed(ma_service_state_e state) = 0; }; class ISettingValueObserver { diff --git a/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h b/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h index 92858fb..54fd533 100644 --- a/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h +++ b/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h @@ -24,6 +24,7 @@ #include #include +#include #ifdef __cplusplus extern "C" { @@ -55,6 +56,8 @@ typedef void (*wakeup_service_streaming_section_changed_cb)(ma_audio_streaming_d typedef void (*wakeup_service_engine_command_cb)(mas_wakeup_engine_command_target_e target, const char* assistant_name, const char* command, void* user_data); +typedef void (*wakeup_service_state_changed_cb)(ma_service_state_e state, void* user_data); + typedef struct { int plugin_version; bool ui_panel_enabled; @@ -130,6 +133,8 @@ EXPORT_API int wakeup_manager_set_streaming_section_changed_callback(wakeup_serv EXPORT_API int wakeup_manager_set_wakeup_engine_command_callback(wakeup_service_engine_command_cb callback, void* user_data); +EXPORT_API int wakeup_manager_set_wakeup_service_state_changed_callback(wakeup_service_state_changed_cb callback, void* user_data); + /* Internal API declarations for dependency modules */ int wakeup_manager_feed_audio_data(mas_speech_streaming_event_e event, void* buffer, int len); diff --git a/plugins/wakeup-manager/src/wakeup_manager.cpp b/plugins/wakeup-manager/src/wakeup_manager.cpp index 352ebbe..7119251 100644 --- a/plugins/wakeup-manager/src/wakeup_manager.cpp +++ b/plugins/wakeup-manager/src/wakeup_manager.cpp @@ -379,6 +379,9 @@ bool CWakeupManager::change_manager_state(wakeup_manager_state_e state) { mWakeupManagerState = state; mWakeupEngineManager.update_manager_state(state); + for (const auto& observer : mWakeupObservers) { + observer->on_wakeup_service_state_changed((ma_service_state_e)state); + } return true; } diff --git a/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp b/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp index 2325bcb..5fe6469 100644 --- a/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp +++ b/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp @@ -48,6 +48,9 @@ static void* g_streaming_section_changed_user_data; static wakeup_service_engine_command_cb g_wakeup_engine_command_cb; static void* g_wakeup_engine_command_user_data; +static wakeup_service_state_changed_cb g_wakeup_service_state_changed_cb; +static void *g_wakeup_service_state_changed_user_data; + class CWakeupEventObserver : public IWakeupEventObserver { void on_wakeup(mas_wakeup_event_info wakeup_info) override; @@ -56,6 +59,7 @@ class CWakeupEventObserver : public IWakeupEventObserver void on_audio_streaming_data_section(ma_audio_streaming_data_section_e section) override; void on_wakeup_engine_command( mas_wakeup_engine_command_target_e target, const char* assistant_name, const char* command) override; + void on_wakeup_service_state_changed(ma_service_state_e state) override; }; class CSettingValueObserver : public ISettingValueObserver @@ -110,6 +114,9 @@ int wakeup_manager_initialize(void) g_wakeup_engine_command_cb = NULL; g_wakeup_engine_command_user_data = NULL; + g_wakeup_service_state_changed_cb = NULL; + g_wakeup_service_state_changed_user_data = NULL; + g_wakeup_manager->initialize(); MWR_LOGD("[END]"); @@ -644,6 +651,22 @@ int wakeup_manager_set_wakeup_engine_command_callback(wakeup_service_engine_comm return 0; } +int wakeup_manager_set_wakeup_service_state_changed_callback(wakeup_service_state_changed_cb callback, void* user_data) +{ + MWR_LOGD("[ENTER]"); + + if (NULL == callback) { + MWR_LOGE("[ERROR] Input parameter is NULL"); + return -1; + } + + g_wakeup_service_state_changed_cb = callback; + g_wakeup_service_state_changed_user_data = user_data; + + MWR_LOGD("[END]"); + return 0; +} + int wakeup_manager_feed_audio_data(mas_speech_streaming_event_e event, void* buffer, int len) { if (nullptr == g_wakeup_manager) return -1; @@ -706,6 +729,13 @@ void CWakeupEventObserver::on_wakeup_engine_command( } } +void CWakeupEventObserver::on_wakeup_service_state_changed(ma_service_state_e state) +{ + if (g_wakeup_service_state_changed_cb) { + g_wakeup_service_state_changed_cb(state, g_wakeup_service_state_changed_user_data); + } +} + void CSettingValueObserver::on_value_changed() { if (g_setting_changed_cb) { diff --git a/src/multi_assistant_dbus.c b/src/multi_assistant_dbus.c index 1fb2ed4..664a111 100644 --- a/src/multi_assistant_dbus.c +++ b/src/multi_assistant_dbus.c @@ -512,6 +512,57 @@ int masc_dbus_send_wakeup_engine_command(int pid, const char* command) return 0; } +int masc_dbus_service_state_change(int pid, int state) +{ + if (0 != __dbus_check()) { + return -1; //MAS_ERROR_OPERATION_FAILED; + } + + DBusMessage* msg; + + DBusError err; + dbus_error_init(&err); + + char service_name[64]; + memset(service_name, '\0', 64); + snprintf(service_name, 64, "%s_%d", MA_CLIENT_SERVICE_NAME, pid); + + msg = dbus_message_new_method_call( + service_name, + MA_CLIENT_SERVICE_OBJECT_PATH, + MA_CLIENT_SERVICE_INTERFACE, + MAS_METHOD_SERVICE_STATE_CHANGE); + + static int count = 0; + if (NULL == msg) { + MAS_LOGE(">>>> Request mas send service state message : Fail to make message"); + return -1; // MAS_ERROR_OPERATION_FAILED; + } else { + MAS_LOGD(">>>> Request mas send service state message : %s", service_name); + } + + if (true != dbus_message_append_args(msg, + DBUS_TYPE_INT32, &state, + DBUS_TYPE_INVALID)) { + dbus_message_unref(msg); + MAS_LOGE("[ERROR] Fail to append args"); + return -1; + } + + dbus_message_set_no_reply(msg, TRUE); + + if (1 != dbus_connection_send(g_conn_sender, msg, NULL)) { + MAS_LOGE("[Dbus ERROR] Fail to Send"); + return -1; // MAS_ERROR_OPERATION_FAILED; + } else { + MAS_LOGD("[Dbus DEBUG] Success to Send activate message : %d", state); + dbus_connection_flush(g_conn_sender); + } + + dbus_message_unref(msg); + return 0; +} + int masc_ui_dbus_send_hello(void) { if (0 != __dbus_check()) { diff --git a/src/multi_assistant_dbus.h b/src/multi_assistant_dbus.h index 9a8790c..4c38cd2 100644 --- a/src/multi_assistant_dbus.h +++ b/src/multi_assistant_dbus.h @@ -35,6 +35,14 @@ int masc_dbus_active_state_change(int pid, int state); int masc_dbus_send_preprocessing_information(int pid, const char* app_id); +int masc_dbus_send_streaming_section_changed(int pid, int section); + +int masc_dbus_send_preprocessing_result(int pid, bool result); + +int masc_dbus_send_wakeup_engine_command(int pid, const char* command); + +int masc_dbus_service_state_change(int pid, int state); + int masc_ui_dbus_send_hello(void); int masc_ui_dbus_send_asr_result(int pid, int event, char* asr_result); diff --git a/src/multi_assistant_service.c b/src/multi_assistant_service.c index 0361e22..7faabf5 100644 --- a/src/multi_assistant_service.c +++ b/src/multi_assistant_service.c @@ -75,6 +75,7 @@ static const char *g_wakeup_maclient_appid = NULL; static package_manager_h g_pkgmgr = NULL; static PREPROCESSING_STATE g_current_preprocessing_state = PREPROCESSING_STATE_NONE; +static ma_service_state_e g_current_service_state = MA_SERVICE_STATE_INACTIVE; /* client list */ static GSList* g_client_list = NULL; @@ -259,6 +260,8 @@ int mas_client_initialize(int pid) } else { MAS_LOGD("MA client connected, but its appid does not match with current maclient"); } + + masc_dbus_service_state_change(pid, mas_get_current_service_state()); } else { MAS_LOGE("[ERROR] Fail to retrieve appid"); } @@ -1129,7 +1132,6 @@ int mas_prelaunch_default_assistant() return 0; } - ma_preprocessing_allow_mode_e get_preprocessing_allow_mode(const char* appid) { for (int loop = 0; loop < MAX_MACLIENT_INFO_NUM; loop++) { @@ -1253,6 +1255,34 @@ int mas_process_preprocessing_state_event(PREPROCESSING_STATE_EVENT event) return 0; } +int mas_set_current_service_state(ma_service_state_e state) +{ + g_current_service_state = state; + + ma_client_s *data = NULL; + + int count = g_slist_length(g_client_list); + int i; + + for (i = 0; i < count; i++) { + data = g_slist_nth_data(g_client_list, i); + + if (NULL != data && -1 != data->pid) { + int ret = masc_dbus_service_state_change(data->pid, state); + if (0 != ret) { + MAS_LOGE("[ERROR] Fail to send wakeup service state change to %d, ret(%d)", + data->pid, ret); + } + } + } + return 0; +} + +ma_service_state_e mas_get_current_service_state() +{ + return g_current_service_state; +} + static int pkg_app_list_cb(const pkgmgrinfo_appinfo_h handle, void *user_data) { char *appid = NULL; diff --git a/src/multi_assistant_service_plugin.c b/src/multi_assistant_service_plugin.c index aca5001..a486a84 100644 --- a/src/multi_assistant_service_plugin.c +++ b/src/multi_assistant_service_plugin.c @@ -367,6 +367,13 @@ static void __wakeup_engine_command_cb(mas_wakeup_engine_command_target_e target } } +static void __wakeup_service_state_changed_cb(ma_service_state_e state, void* user_data) +{ + MAS_LOGD( "[SUCCESS] __wakeup_service_state_changed_cb is called, state(%d)", state); + + mas_set_current_service_state(state); +} + int multi_assistant_service_plugin_initialize(void) { MAS_LOGD( "[Enter]"); @@ -488,6 +495,9 @@ int multi_assistant_service_plugin_initialize(void) _wakeup_manager_interface.set_wakeup_engine_command_callback = (wakeup_manager_set_wakeup_engine_command_callback)dlsym(g_handle, MA_WAKEUP_MANAGER_FUNC_SET_WAKEUP_ENGINE_COMMAND_CALLBACK); + _wakeup_manager_interface.set_wakeup_service_state_changed_callback = + (wakeup_manager_set_wakeup_service_state_changed_callback)dlsym(g_handle, + MA_WAKEUP_MANAGER_FUNC_SET_WAKEUP_SERVICE_STATE_CHANGED_CALLBACK); int ret = -1; if (NULL != g_handle) { @@ -1068,6 +1078,12 @@ int multi_assistant_service_plugin_set_callbacks(void) return ret; } + ret = multi_assistant_service_plugin_set_wakeup_service_state_changed_callback(__wakeup_service_state_changed_cb, NULL); + if (0 != ret) { + MAS_LOGE("Fail to set wakeup engine command cb"); + return ret; + } + return 0; } @@ -1230,4 +1246,22 @@ int multi_assistant_service_plugin_set_wakeup_engine_command_callback(wakeup_ser } } return ret; -} \ No newline at end of file +} + +int multi_assistant_service_plugin_set_wakeup_service_state_changed_callback(wakeup_service_wakeup_service_state_changed_cb callback, void* user_data) +{ + int ret = -1; + if (NULL != g_handle) { + wakeup_manager_set_wakeup_service_state_changed_callback func = _wakeup_manager_interface.set_wakeup_service_state_changed_callback; + if (NULL == func) { + MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_WAKEUP_SERVICE_STATE_CHANGED_CALLBACK); + } else { + ret = func(callback, user_data); + if (0 != ret) { + MAS_LOGE("[ERROR] Fail to set error callback, ret(%d)", ret); + } + } + } + return ret; +} + -- 2.7.4 From cffa459eb692f8165e6042b7c20b762b94228017 Mon Sep 17 00:00:00 2001 From: Ji-hoon Lee Date: Fri, 13 Dec 2019 13:14:57 +0900 Subject: [PATCH 04/16] Rename process_event to process_plugin_event Change-Id: I773bd187d329a005fdc9e6052c91b4b2d4bd4fde --- inc/multi_assistant_service_plugin.h | 6 +++--- plugins/wakeup-manager/inc/wakeup_manager.h | 2 +- plugins/wakeup-manager/inc/wakeup_manager_wrapper.h | 2 +- plugins/wakeup-manager/src/wakeup_manager.cpp | 4 ++-- plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp | 4 ++-- src/multi_assistant_service_plugin.c | 10 +++++----- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/inc/multi_assistant_service_plugin.h b/inc/multi_assistant_service_plugin.h index cae0038..1f31ac0 100644 --- a/inc/multi_assistant_service_plugin.h +++ b/inc/multi_assistant_service_plugin.h @@ -133,8 +133,8 @@ typedef int (*wakeup_manager_send_assistant_specific_command)(const char* appid, typedef int (*wakeup_manager_set_background_volume)(const char* appid, double ratio); #define MA_WAKEUP_MANAGER_FUNC_UPDATE_RECOGNITION_RESULT "wakeup_manager_update_recognition_result" typedef int (*wakeup_manager_update_recognition_result)(const char* appid, int result); -#define MA_WAKEUP_MANAGER_FUNC_PROCESS_EVENT "wakeup_manager_process_event" -typedef int (*wakeup_manager_process_event)(int event, void* data, int len); +#define MA_WAKEUP_MANAGER_FUNC_PROCESS_PLUGIN_EVENT "wakeup_manager_process_plugin_event" +typedef int (*wakeup_manager_process_plugin_event)(int event, void* data, int len); #define MA_WAKEUP_MANAGER_FUNC_START_STREAMING_UTTERANCE_DATA "wakeup_manager_start_streaming_utterance_data" typedef int (*wakeup_manager_start_streaming_utterance_data)(void); #define MA_WAKEUP_MANAGER_FUNC_STOP_STREAMING_UTTERANCE_DATA "wakeup_manager_stop_streaming_utterance_data" @@ -192,7 +192,7 @@ typedef struct { wakeup_manager_send_assistant_specific_command send_assistant_specific_command; wakeup_manager_set_background_volume set_background_volume; wakeup_manager_update_recognition_result update_recognition_result; - wakeup_manager_process_event process_event; + wakeup_manager_process_plugin_event process_plugin_event; wakeup_manager_start_streaming_utterance_data start_streaming_utterance_data; wakeup_manager_stop_streaming_utterance_data stop_streaming_utterance_data; wakeup_manager_start_streaming_previous_utterance_data start_streaming_previous_utterance_data; diff --git a/plugins/wakeup-manager/inc/wakeup_manager.h b/plugins/wakeup-manager/inc/wakeup_manager.h index 85ce732..25c5498 100644 --- a/plugins/wakeup-manager/inc/wakeup_manager.h +++ b/plugins/wakeup-manager/inc/wakeup_manager.h @@ -98,7 +98,7 @@ public: bool send_assistant_specific_command(string appid, string command); bool set_background_volume(string appid, double ratio); bool update_recognition_result(string appid, int result); - bool process_event(mas_plugin_event_e event, void* data, int len); + bool process_plugin_event(mas_plugin_event_e event, void* data, int len); bool get_audio_format(int* rate, int* channel, int* audio_type); bool get_audio_source_type(char** type); bool set_language(string language); diff --git a/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h b/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h index 54fd533..1477360 100644 --- a/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h +++ b/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h @@ -93,7 +93,7 @@ EXPORT_API int wakeup_manager_set_background_volume(const char *appid, double ra EXPORT_API int wakeup_manager_update_recognition_result(const char *appid, int result); -EXPORT_API int wakeup_manager_process_event(mas_plugin_event_e event, void* data, int len); +EXPORT_API int wakeup_manager_process_plugin_event(mas_plugin_event_e event, void* data, int len); EXPORT_API int wakeup_manager_start_streaming_utterance_data(void); diff --git a/plugins/wakeup-manager/src/wakeup_manager.cpp b/plugins/wakeup-manager/src/wakeup_manager.cpp index 7119251..7372efb 100644 --- a/plugins/wakeup-manager/src/wakeup_manager.cpp +++ b/plugins/wakeup-manager/src/wakeup_manager.cpp @@ -114,7 +114,7 @@ bool CWakeupManager::initialize() mWakeupEngineManager.initialize(); mas_dependency_plugin_proxy_interface interface; - interface.process_event = wakeup_manager_process_event; + interface.process_event = wakeup_manager_process_plugin_event; interface.feed_audio_data = wakeup_manager_feed_audio_data; //interface.send_dependency_module_command = wakeup_manager_send_dependency_module_command; interface.wakeup_assistant = wakeup_manager_wakeup_assistant; @@ -467,7 +467,7 @@ static long get_current_milliseconds_after_epoch() return value.count(); } -bool CWakeupManager::process_event(mas_plugin_event_e event, void* data, int len) +bool CWakeupManager::process_plugin_event(mas_plugin_event_e event, void* data, int len) { MWR_LOGD("[ENTER] : %d", event); if (WAKEUP_MANAGER_STATE_INACTIVE == mWakeupManagerState) diff --git a/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp b/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp index 5fe6469..5dc12dc 100644 --- a/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp +++ b/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp @@ -367,12 +367,12 @@ int wakeup_manager_update_recognition_result(const char* appid, int result) return 0; } -int wakeup_manager_process_event(mas_plugin_event_e event, void* data, int len) +int wakeup_manager_process_plugin_event(mas_plugin_event_e event, void* data, int len) { MWR_LOGD("[ENTER]"); if (nullptr == g_wakeup_manager) return -1; - g_wakeup_manager->process_event(event, data, len); + g_wakeup_manager->process_plugin_event(event, data, len); MWR_LOGD("[END]"); return 0; diff --git a/src/multi_assistant_service_plugin.c b/src/multi_assistant_service_plugin.c index a486a84..d9a1e6e 100644 --- a/src/multi_assistant_service_plugin.c +++ b/src/multi_assistant_service_plugin.c @@ -435,9 +435,9 @@ int multi_assistant_service_plugin_initialize(void) _wakeup_manager_interface.update_recognition_result = (wakeup_manager_update_recognition_result)dlsym(g_handle, MA_WAKEUP_MANAGER_FUNC_UPDATE_RECOGNITION_RESULT); - _wakeup_manager_interface.process_event = - (wakeup_manager_process_event)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_PROCESS_EVENT); + _wakeup_manager_interface.process_plugin_event = + (wakeup_manager_process_plugin_event)dlsym(g_handle, + MA_WAKEUP_MANAGER_FUNC_PROCESS_PLUGIN_EVENT); _wakeup_manager_interface.start_streaming_utterance_data = (wakeup_manager_start_streaming_utterance_data)dlsym(g_handle, MA_WAKEUP_MANAGER_FUNC_START_STREAMING_UTTERANCE_DATA); @@ -817,9 +817,9 @@ int multi_assistant_service_plugin_process_event(int event, void *data, int len) { int ret = -1; if (NULL != g_handle) { - wakeup_manager_process_event func = _wakeup_manager_interface.process_event; + wakeup_manager_process_plugin_event func = _wakeup_manager_interface.process_plugin_event; if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_PROCESS_EVENT); + MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_PROCESS_PLUGIN_EVENT); } else { ret = func((mas_plugin_event_e)event, data, len); if (0 != ret) { -- 2.7.4 From 4d000d33e1399981d72ea0b14321ee28a20ac5c9 Mon Sep 17 00:00:00 2001 From: Ji-hoon Lee Date: Fri, 13 Dec 2019 16:44:06 +0900 Subject: [PATCH 05/16] Rename inappropriate send_* functions to set_* Change-Id: Ia5d18f98ddbe51377e5681f9be15457d6b80f8c6 --- inc/multi_assistant_service_client.h | 2 +- inc/multi_assistant_service_plugin.h | 8 ++++---- plugins/wakeup-manager/inc/wakeup_manager.h | 4 ++-- plugins/wakeup-manager/inc/wakeup_manager_wrapper.h | 4 ++-- plugins/wakeup-manager/src/wakeup_manager.cpp | 4 ++-- plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp | 8 ++++---- src/multi_assistant_dbus_server.c | 2 +- src/multi_assistant_service.c | 4 ++-- src/multi_assistant_service_plugin.c | 12 ++++++------ 9 files changed, 24 insertions(+), 24 deletions(-) diff --git a/inc/multi_assistant_service_client.h b/inc/multi_assistant_service_client.h index 110d0d1..b6d7f42 100644 --- a/inc/multi_assistant_service_client.h +++ b/inc/multi_assistant_service_client.h @@ -49,7 +49,7 @@ int mas_client_stop_streaming_audio_data(int pid, int type); int mas_client_update_voice_feedback_state(int pid, int state); -int mas_client_send_assistant_specific_command(int pid, const char *command); +int mas_client_set_assistant_specific_command(int pid, const char *command); int mas_client_set_background_volume(int pid, double ratio); diff --git a/inc/multi_assistant_service_plugin.h b/inc/multi_assistant_service_plugin.h index 1f31ac0..4f431e6 100644 --- a/inc/multi_assistant_service_plugin.h +++ b/inc/multi_assistant_service_plugin.h @@ -57,7 +57,7 @@ int multi_assistant_service_plugin_deactivate(void); int multi_assistant_service_plugin_update_voice_feedback_state(const char* appid, int state); -int multi_assistant_service_plugin_send_assistant_specific_command(const char *appid, const char* command); +int multi_assistant_service_plugin_set_assistant_specific_command(const char *appid, const char* command); int multi_assistant_service_plugin_set_background_volume(const char *appid, double ratio); @@ -127,8 +127,8 @@ typedef int (*wakeup_manager_activate)(void); typedef int (*wakeup_manager_deactivate)(void); #define MA_WAKEUP_MANAGER_FUNC_UPDATE_VOICE_FEEDBACK_STATE "wakeup_manager_update_voice_feedback_state" typedef int (*wakeup_manager_update_voice_feedback_state)(const char* appid, int state); -#define MA_WAKEUP_MANAGER_FUNC_SEND_ASSISTANT_SPECIFIC_COMMAND "wakeup_manager_send_assistant_specific_command" -typedef int (*wakeup_manager_send_assistant_specific_command)(const char* appid, const char* command); +#define MA_WAKEUP_MANAGER_FUNC_SET_ASSISTANT_SPECIFIC_COMMAND "wakeup_manager_set_assistant_specific_command" +typedef int (*wakeup_manager_set_assistant_specific_command)(const char* appid, const char* command); #define MA_WAKEUP_MANAGER_FUNC_SET_BACKGROUND_VOLUME "wakeup_manager_set_background_volume" typedef int (*wakeup_manager_set_background_volume)(const char* appid, double ratio); #define MA_WAKEUP_MANAGER_FUNC_UPDATE_RECOGNITION_RESULT "wakeup_manager_update_recognition_result" @@ -189,7 +189,7 @@ typedef struct { wakeup_manager_activate activate; wakeup_manager_deactivate deactivate; wakeup_manager_update_voice_feedback_state update_voice_feedback_state; - wakeup_manager_send_assistant_specific_command send_assistant_specific_command; + wakeup_manager_set_assistant_specific_command set_assistant_specific_command; wakeup_manager_set_background_volume set_background_volume; wakeup_manager_update_recognition_result update_recognition_result; wakeup_manager_process_plugin_event process_plugin_event; diff --git a/plugins/wakeup-manager/inc/wakeup_manager.h b/plugins/wakeup-manager/inc/wakeup_manager.h index 25c5498..f734256 100644 --- a/plugins/wakeup-manager/inc/wakeup_manager.h +++ b/plugins/wakeup-manager/inc/wakeup_manager.h @@ -95,7 +95,7 @@ public: string get_default_assistant(); bool update_voice_feedback_state(string appid, bool state); - bool send_assistant_specific_command(string appid, string command); + bool set_assistant_specific_command(string appid, string command); bool set_background_volume(string appid, double ratio); bool update_recognition_result(string appid, int result); bool process_plugin_event(mas_plugin_event_e event, void* data, int len); @@ -129,7 +129,7 @@ public: wakeup_manager_state_e get_manager_state(); void feed_audio_data(mas_speech_streaming_event_e event, void* buffer, int len); - void send_dependency_module_command(string engine_name, string command); + void set_dependency_module_command(string engine_name, string command); private: class CEngineEventObserver : public IEngineEventObserver { diff --git a/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h b/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h index 1477360..7857664 100644 --- a/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h +++ b/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h @@ -87,7 +87,7 @@ EXPORT_API int wakeup_manager_deactivate(void); EXPORT_API int wakeup_manager_update_voice_feedback_state(const char *appid, int state); -EXPORT_API int wakeup_manager_send_assistant_specific_command(const char* appid, const char* command); +EXPORT_API int wakeup_manager_set_assistant_specific_command(const char* appid, const char* command); EXPORT_API int wakeup_manager_set_background_volume(const char *appid, double ratio); @@ -139,7 +139,7 @@ EXPORT_API int wakeup_manager_set_wakeup_service_state_changed_callback(wakeup_s int wakeup_manager_feed_audio_data(mas_speech_streaming_event_e event, void* buffer, int len); -int wakeup_manager_send_dependency_module_command(const char* engine_name, const char* command); +int wakeup_manager_set_dependency_module_command(const char* engine_name, const char* command); int wakeup_manager_wakeup_assistant(const mas_wakeup_event_info* wakeup_info); diff --git a/plugins/wakeup-manager/src/wakeup_manager.cpp b/plugins/wakeup-manager/src/wakeup_manager.cpp index 7372efb..528578b 100644 --- a/plugins/wakeup-manager/src/wakeup_manager.cpp +++ b/plugins/wakeup-manager/src/wakeup_manager.cpp @@ -409,7 +409,7 @@ bool CWakeupManager::update_voice_feedback_state(string appid, bool state) return true; } -bool CWakeupManager::send_assistant_specific_command(string appid, string command) +bool CWakeupManager::set_assistant_specific_command(string appid, string command) { MWR_LOGD("[ENTER]"); @@ -829,7 +829,7 @@ void CWakeupManager::feed_audio_data(mas_speech_streaming_event_e event, void* b mAudioManager.feed_audio_data(event, buffer, len); } -void CWakeupManager::send_dependency_module_command(string engine_name, string command) +void CWakeupManager::set_dependency_module_command(string engine_name, string command) { mWakeupEngineManager.engine_set_dependency_module_command(engine_name, command); } diff --git a/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp b/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp index 5dc12dc..5e0b31a 100644 --- a/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp +++ b/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp @@ -312,7 +312,7 @@ int wakeup_manager_update_voice_feedback_state(const char* appid, int state) return 0; } -int wakeup_manager_send_assistant_specific_command(const char* appid, const char* command) +int wakeup_manager_set_assistant_specific_command(const char* appid, const char* command) { MWR_LOGD("[ENTER]"); @@ -325,7 +325,7 @@ int wakeup_manager_send_assistant_specific_command(const char* appid, const char if (command) command_string = command; if (nullptr == g_wakeup_manager) return -1; - g_wakeup_manager->send_assistant_specific_command(appid_string, command_string); + g_wakeup_manager->set_assistant_specific_command(appid_string, command_string); MWR_LOGD("[END]"); return 0; @@ -674,10 +674,10 @@ int wakeup_manager_feed_audio_data(mas_speech_streaming_event_e event, void* buf return 0; } -int wakeup_manager_send_dependency_module_command(const char* engine_name, const char* command) +int wakeup_manager_set_dependency_module_command(const char* engine_name, const char* command) { if (nullptr == g_wakeup_manager) return -1; - g_wakeup_manager->send_dependency_module_command( + g_wakeup_manager->set_dependency_module_command( engine_name ? engine_name : "", command ? command : ""); return 0; diff --git a/src/multi_assistant_dbus_server.c b/src/multi_assistant_dbus_server.c index 7fcde20..c229817 100644 --- a/src/multi_assistant_dbus_server.c +++ b/src/multi_assistant_dbus_server.c @@ -522,7 +522,7 @@ int ma_service_dbus_send_assistant_specific_command(DBusConnection* conn, DBusMe ret = -1; //MAS_ERROR_OPERATION_FAILED; } else { MAS_LOGD("[IN] mas send assistant specific command : pid(%d), command(%s)", pid, command); - ret = mas_client_send_assistant_specific_command(pid, command); + ret = mas_client_set_assistant_specific_command(pid, command); } MAS_LOGD("<<<<<"); diff --git a/src/multi_assistant_service.c b/src/multi_assistant_service.c index 7faabf5..2e955bb 100644 --- a/src/multi_assistant_service.c +++ b/src/multi_assistant_service.c @@ -440,7 +440,7 @@ int mas_client_update_voice_feedback_state(int pid, int state) return 0; } -int mas_client_send_assistant_specific_command(int pid, const char *command) +int mas_client_set_assistant_specific_command(int pid, const char *command) { const char* pid_appid = NULL; char buf[MAX_APPID_LEN] = {'\0',}; @@ -448,7 +448,7 @@ int mas_client_send_assistant_specific_command(int pid, const char *command) buf[MAX_APPID_LEN - 1] = '\0'; pid_appid = buf; } - multi_assistant_service_plugin_send_assistant_specific_command(pid_appid, command); + multi_assistant_service_plugin_set_assistant_specific_command(pid_appid, command); return 0; } diff --git a/src/multi_assistant_service_plugin.c b/src/multi_assistant_service_plugin.c index d9a1e6e..6eed1f5 100644 --- a/src/multi_assistant_service_plugin.c +++ b/src/multi_assistant_service_plugin.c @@ -426,9 +426,9 @@ int multi_assistant_service_plugin_initialize(void) _wakeup_manager_interface.update_voice_feedback_state = (wakeup_manager_update_voice_feedback_state)dlsym(g_handle, MA_WAKEUP_MANAGER_FUNC_UPDATE_VOICE_FEEDBACK_STATE); - _wakeup_manager_interface.send_assistant_specific_command = - (wakeup_manager_send_assistant_specific_command)dlsym(g_handle, - MA_WAKEUP_MANAGER_FUNC_SEND_ASSISTANT_SPECIFIC_COMMAND); + _wakeup_manager_interface.set_assistant_specific_command = + (wakeup_manager_set_assistant_specific_command)dlsym(g_handle, + MA_WAKEUP_MANAGER_FUNC_SET_ASSISTANT_SPECIFIC_COMMAND); _wakeup_manager_interface.set_background_volume = (wakeup_manager_set_background_volume)dlsym(g_handle, MA_WAKEUP_MANAGER_FUNC_SET_BACKGROUND_VOLUME); @@ -756,13 +756,13 @@ int multi_assistant_service_plugin_update_voice_feedback_state(const char* appid return ret; } -int multi_assistant_service_plugin_send_assistant_specific_command(const char* appid, const char* command) +int multi_assistant_service_plugin_set_assistant_specific_command(const char* appid, const char* command) { int ret = -1; if (NULL != g_handle) { - wakeup_manager_send_assistant_specific_command func = _wakeup_manager_interface.send_assistant_specific_command; + wakeup_manager_set_assistant_specific_command func = _wakeup_manager_interface.set_assistant_specific_command; if (NULL == func) { - MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SEND_ASSISTANT_SPECIFIC_COMMAND); + MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_ASSISTANT_SPECIFIC_COMMAND); } else { ret = func(appid, command); if (0 != ret) { -- 2.7.4 From 3cdc69d8f343d4284b2781aaa44894ac034c448c Mon Sep 17 00:00:00 2001 From: Ji-hoon Lee Date: Fri, 13 Dec 2019 16:45:18 +0900 Subject: [PATCH 06/16] Enable sending dependency module commands Change-Id: Ib1727f074d9d07d216a485a594d045d60f02b28e --- plugins/wakeup-manager/src/wakeup_manager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/wakeup-manager/src/wakeup_manager.cpp b/plugins/wakeup-manager/src/wakeup_manager.cpp index 528578b..095083a 100644 --- a/plugins/wakeup-manager/src/wakeup_manager.cpp +++ b/plugins/wakeup-manager/src/wakeup_manager.cpp @@ -116,7 +116,7 @@ bool CWakeupManager::initialize() mas_dependency_plugin_proxy_interface interface; interface.process_event = wakeup_manager_process_plugin_event; interface.feed_audio_data = wakeup_manager_feed_audio_data; - //interface.send_dependency_module_command = wakeup_manager_send_dependency_module_command; + interface.send_command = wakeup_manager_set_dependency_module_command; interface.wakeup_assistant = wakeup_manager_wakeup_assistant; dependency_resolver_initialize(interface); -- 2.7.4 From 6b360f012d264fc0505967fe0adfce16e148f1a9 Mon Sep 17 00:00:00 2001 From: Ji-hoon Lee Date: Fri, 13 Dec 2019 16:48:55 +0900 Subject: [PATCH 07/16] Bump version to 0.2.14 Change-Id: Ifc50009ee06fb4f6e9c676d6638596cf44945935 --- org.tizen.multi-assistant-service.xml | 2 +- packaging/org.tizen.multi-assistant-service.spec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/org.tizen.multi-assistant-service.xml b/org.tizen.multi-assistant-service.xml index 7ba4aa1..bc42b6b 100644 --- a/org.tizen.multi-assistant-service.xml +++ b/org.tizen.multi-assistant-service.xml @@ -1,5 +1,5 @@ - + Won Nam Jang Sooyeon Kim diff --git a/packaging/org.tizen.multi-assistant-service.spec b/packaging/org.tizen.multi-assistant-service.spec index 74f0601..60ef2ca 100644 --- a/packaging/org.tizen.multi-assistant-service.spec +++ b/packaging/org.tizen.multi-assistant-service.spec @@ -1,6 +1,6 @@ Name: org.tizen.multi-assistant-service Summary: Multi assistant service -Version: 0.2.13 +Version: 0.2.14 Release: 1 Group: Graphics & UI Framework/Voice Framework License: Flora-1.1 -- 2.7.4 From 7e4fa6dfe156ce28c813dba281dbceb8e922c844 Mon Sep 17 00:00:00 2001 From: Ji-hoon Lee Date: Tue, 17 Dec 2019 16:21:04 +0900 Subject: [PATCH 08/16] Add missing FINISH event after streaming in AudioManager Change-Id: I044ad8e2c328ae3abd93e542be07675042825fc5 --- plugins/wakeup-manager/src/wakeup_audio_manager.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/plugins/wakeup-manager/src/wakeup_audio_manager.cpp b/plugins/wakeup-manager/src/wakeup_audio_manager.cpp index 201c8a6..b1541a6 100644 --- a/plugins/wakeup-manager/src/wakeup_audio_manager.cpp +++ b/plugins/wakeup-manager/src/wakeup_audio_manager.cpp @@ -208,6 +208,7 @@ void CAudioManager::streaming_audio_data_thread_func(long start_time) MWR_LOGD("[ENTER]"); unique_lock lock(mMutex, defer_lock); + bool finish_event_sent = false; lock.lock(); auto lead = mAudioData.begin(); @@ -286,11 +287,24 @@ void CAudioManager::streaming_audio_data_thread_func(long start_time) if (MAS_SPEECH_STREAMING_EVENT_FINISH == speech_data.event) { MWR_LOGI("[INFO] Finish to get and send speech data"); + finish_event_sent = true; break; } advance(lead, 1); } + + if (true != finish_event_sent) { + unsigned char final_buffer[2] = {'\0', }; + for (const auto& observer : mObservers) { + if (observer) { + if (!observer->on_streaming_audio_data( + MAS_SPEECH_STREAMING_EVENT_FINISH, final_buffer, sizeof(final_buffer))) { + LOGE("[Recorder WARNING] One of the observer returned false"); + } + } + } + } MWR_LOGD("[EXIT]"); } -- 2.7.4 From 8486162823f96ff0ab5f3bd1a889ebf0c9cb6d91 Mon Sep 17 00:00:00 2001 From: Ji-hoon Lee Date: Tue, 17 Dec 2019 16:21:22 +0900 Subject: [PATCH 09/16] Bump version to 0.2.15 Change-Id: If0e4ad366cb1a7ac04c4fc8f3c1ca331cf9940de --- org.tizen.multi-assistant-service.xml | 2 +- packaging/org.tizen.multi-assistant-service.spec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/org.tizen.multi-assistant-service.xml b/org.tizen.multi-assistant-service.xml index bc42b6b..798bd6c 100644 --- a/org.tizen.multi-assistant-service.xml +++ b/org.tizen.multi-assistant-service.xml @@ -1,5 +1,5 @@ - + Won Nam Jang Sooyeon Kim diff --git a/packaging/org.tizen.multi-assistant-service.spec b/packaging/org.tizen.multi-assistant-service.spec index 60ef2ca..319a9eb 100644 --- a/packaging/org.tizen.multi-assistant-service.spec +++ b/packaging/org.tizen.multi-assistant-service.spec @@ -1,6 +1,6 @@ Name: org.tizen.multi-assistant-service Summary: Multi assistant service -Version: 0.2.14 +Version: 0.2.15 Release: 1 Group: Graphics & UI Framework/Voice Framework License: Flora-1.1 -- 2.7.4 From 1f6538bcd9c0916c0479a303058791d4018c3f6d Mon Sep 17 00:00:00 2001 From: Ji-hoon Lee Date: Fri, 13 Dec 2019 20:25:34 +0900 Subject: [PATCH 10/16] Restore assistant language configurations when activating Change-Id: Ia1f00b588bcf5b07a87f8b5598e31fd16d841c08 --- packaging/org.tizen.multi-assistant-service.spec | 1 + plugins/wakeup-manager/CMakeLists.txt | 2 + .../wakeup-manager/inc/assistant_config_manager.h | 56 ++++++++++++++ plugins/wakeup-manager/inc/wakeup_manager.h | 2 + .../src/assistant_config_manager.cpp | 88 ++++++++++++++++++++++ plugins/wakeup-manager/src/wakeup_manager.cpp | 73 +++++++++++------- 6 files changed, 193 insertions(+), 29 deletions(-) create mode 100644 plugins/wakeup-manager/inc/assistant_config_manager.h create mode 100644 plugins/wakeup-manager/src/assistant_config_manager.cpp diff --git a/packaging/org.tizen.multi-assistant-service.spec b/packaging/org.tizen.multi-assistant-service.spec index 319a9eb..231db59 100644 --- a/packaging/org.tizen.multi-assistant-service.spec +++ b/packaging/org.tizen.multi-assistant-service.spec @@ -14,6 +14,7 @@ BuildRequires: pkgconfig(capi-appfw-application) BuildRequires: pkgconfig(capi-appfw-app-manager) BuildRequires: pkgconfig(capi-appfw-package-manager) BuildRequires: pkgconfig(capi-appfw-service-application) +BuildRequires: pkgconfig(capi-appfw-preference) BuildRequires: pkgconfig(capi-media-audio-io) BuildRequires: pkgconfig(capi-network-connection) BuildRequires: pkgconfig(dlog) diff --git a/plugins/wakeup-manager/CMakeLists.txt b/plugins/wakeup-manager/CMakeLists.txt index 55a8770..4e86c6c 100644 --- a/plugins/wakeup-manager/CMakeLists.txt +++ b/plugins/wakeup-manager/CMakeLists.txt @@ -16,6 +16,7 @@ SET(WMPKG_CHECK_MODULES ecore dlog capi-appfw-app-manager + capi-appfw-preference capi-network-connection capi-media-audio-io capi-media-sound-manager @@ -48,6 +49,7 @@ SET(SRCS src/wakeup_manager_wrapper.cpp src/dependency_resolver.cpp src/heap_tracer.cpp + src/assistant_config_manager.cpp ) FOREACH(flag ${wmpkgs_CFLAGS}) diff --git a/plugins/wakeup-manager/inc/assistant_config_manager.h b/plugins/wakeup-manager/inc/assistant_config_manager.h new file mode 100644 index 0000000..0dd7dda --- /dev/null +++ b/plugins/wakeup-manager/inc/assistant_config_manager.h @@ -0,0 +1,56 @@ +/* + * Copyright 2018-2019 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ASSISTANT_CONFIG_MANAGER_H_ +#define _ASSISTANT_CONFIG_MANAGER_H_ + +#include +#include + +namespace multiassistant +{ +namespace wakeup +{ + +using namespace std; + +constexpr char LANGUAGE_PREFIX[] = "LANGUAGE_"; + +typedef void (*foreach_assistant_language_cb)(const char* appid, const char* language, void* user_data); + +class CAssistantConfigManager +{ +public: + CAssistantConfigManager(); + virtual ~CAssistantConfigManager(); + + CAssistantConfigManager(const CAssistantConfigManager&) = delete; + CAssistantConfigManager& operator=(const CAssistantConfigManager&) = delete; + + void initialize(); + void deinitialize(); + + int set_assistant_language(string assistant, string language); + int get_assistant_language(string assistant, string& language); + + void foreach_assistant_language(foreach_assistant_language_cb callback, void* user_data); +private: +}; + +} // wakeup +} // multiassistant + +#endif _ASSISTANT_CONFIG_MANAGER_H_ diff --git a/plugins/wakeup-manager/inc/wakeup_manager.h b/plugins/wakeup-manager/inc/wakeup_manager.h index f734256..b010453 100644 --- a/plugins/wakeup-manager/inc/wakeup_manager.h +++ b/plugins/wakeup-manager/inc/wakeup_manager.h @@ -23,6 +23,7 @@ #include "wakeup_engine_manager.h" #include "wakeup_audio_manager.h" #include "wakeup_policy_default.h" +#include "assistant_config_manager.h" #include #include @@ -204,6 +205,7 @@ private: CAudioManager mAudioManager; CWakeupEngineManager mWakeupEngineManager; CWakeupSettings mWakeupSettings; + CAssistantConfigManager mAssistantConfigManager; CAudioEventObserver mAudioEventObserver; CEngineEventObserver mEngineEventObserver; diff --git a/plugins/wakeup-manager/src/assistant_config_manager.cpp b/plugins/wakeup-manager/src/assistant_config_manager.cpp new file mode 100644 index 0000000..e15b411 --- /dev/null +++ b/plugins/wakeup-manager/src/assistant_config_manager.cpp @@ -0,0 +1,88 @@ +#include "assistant_config_manager.h" + +#include + +#include + +namespace multiassistant +{ +namespace wakeup +{ + +CAssistantConfigManager::CAssistantConfigManager() +{ +} + +CAssistantConfigManager::~CAssistantConfigManager() +{ +} + +void CAssistantConfigManager::initialize() +{ +} + +void CAssistantConfigManager::deinitialize() +{ +} + +int CAssistantConfigManager::set_assistant_language(string assistant, string language) +{ + string key = string{LANGUAGE_PREFIX} + assistant; + + preference_set_string(key.c_str(), language.c_str()); + + return 0; +} + +int CAssistantConfigManager::get_assistant_language(string assistant, string& language) +{ + string key = string{LANGUAGE_PREFIX} + assistant; + + bool existing = false; + preference_is_existing(key.c_str(), &existing); + if (!existing) return -1; + + char* value = nullptr; + preference_get_string(key.c_str(), &value); + if (nullptr == value) return -1; + + language = value; + free(value); + + return 0; +} + +void CAssistantConfigManager::foreach_assistant_language(foreach_assistant_language_cb callback, void* user_data) +{ + typedef struct { + foreach_assistant_language_cb callback; + void* user_data; + } foreach_assistant_language_cb_closure; + + foreach_assistant_language_cb_closure closure; + closure.callback = callback; + closure.user_data = user_data; + + preference_foreach_item( + [](const char *key, void *user_data) { + string prefix = string{LANGUAGE_PREFIX}; + foreach_assistant_language_cb_closure* closure = + static_cast(user_data); + if (key && strlen(key) > prefix.length() && + 0 == prefix.compare(0, prefix.length(), key, prefix.length())) { + char* value = nullptr; + preference_get_string(key, &value); + if (value) { + if (closure) { + closure->callback(key + prefix.length(), value, closure->user_data); + } + free(value); + } + } + return true; + }, static_cast(&closure) + ); +} + +} // wakeup +} // multiassistant diff --git a/plugins/wakeup-manager/src/wakeup_manager.cpp b/plugins/wakeup-manager/src/wakeup_manager.cpp index 095083a..c4e42cf 100644 --- a/plugins/wakeup-manager/src/wakeup_manager.cpp +++ b/plugins/wakeup-manager/src/wakeup_manager.cpp @@ -28,7 +28,11 @@ namespace wakeup static bool check_language_valid(string language) { - return true; + bool valid = true; + if (0 == language.length()) { + valid = false; + } + return valid; } static bool initialize_wakeup_event_info(mas_wakeup_event_info* wakeup_info) @@ -113,6 +117,8 @@ bool CWakeupManager::initialize() mWakeupEngineManager.subscribe(&mEngineEventObserver); mWakeupEngineManager.initialize(); + mAssistantConfigManager.initialize(); + mas_dependency_plugin_proxy_interface interface; interface.process_event = wakeup_manager_process_plugin_event; interface.feed_audio_data = wakeup_manager_feed_audio_data; @@ -133,6 +139,8 @@ bool CWakeupManager::deinitialize() dependency_resolver_deinitialize(); + mAssistantConfigManager.deinitialize(); + mWakeupEngineManager.unsubscribe(&mEngineEventObserver); mWakeupEngineManager.deinitialize(); @@ -261,6 +269,7 @@ bool CWakeupManager::set_assistant_language(string appid, string language) MWR_LOGD("[ENTER] : %s, %s", appid.c_str(), language.c_str()); mWakeupEngineManager.set_assistant_language(appid, language); + mAssistantConfigManager.set_assistant_language(appid, language); MWR_LOGD("[END]"); return true; @@ -318,45 +327,51 @@ bool CWakeupManager::get_assistant_enabled(string appid) bool CWakeupManager::set_language(string language) { - bool ret = false; + bool valid = false; MWR_LOGD("[ENTER] : %s", language.c_str()); if (check_language_valid(language)) { mCurrentLanguage = language; + valid = true; + } else { + MWR_LOGE("[ERROR] Invalid language (%s)", language.c_str()); + } - bool found = false; - for (auto& info : mAssistantLanguageInfo) { - found = false; - for(auto it = info.languageList.begin(); it != info.languageList.end(); it++) { - if(language == *it) { - found = true; - break; - } - } - if(false == found) { - mAssistantSupportsCurrentLanguage[info.appid] = false; - } else { - mAssistantSupportsCurrentLanguage[info.appid] = true; - } - - bool activated = found; - if (false == mAssistantEnabled[info.appid]) { - activated = false; - } - if (0 == info.appid.compare(mCurrentDefaultAssistant)) { - activated = true; + for (auto& info : mAssistantLanguageInfo) { + bool disable = false; + if (valid) { + bool supported = false; + if (info.languageList.end() != + find(info.languageList.begin(), info.languageList.end(), language)) { + supported = true; } - mWakeupEngineManager.set_assistant_activated(info.appid, activated); + mAssistantSupportsCurrentLanguage[info.appid] = supported; + /* Disable this assistant if language not supported */ + if (!supported) disable = true; + } else { + /* If current language is not valid, assume all languages support it */ + mAssistantSupportsCurrentLanguage[info.appid] = true; } - mWakeupEngineManager.set_language(language); - ret = true; - } else { - MWR_LOGE("[ERROR] Not supported language (%s)", language.c_str()); + if (false == mAssistantEnabled[info.appid]) { + disable = true; + } + if (0 == info.appid.compare(mCurrentDefaultAssistant)) { + /* Default Assistant should be activated no matter what */ + disable = false; + } + mWakeupEngineManager.set_assistant_activated(info.appid, !disable); + std::string assistant_language; + int ret = mAssistantConfigManager.get_assistant_language(info.appid, assistant_language); + if (0 != ret || !check_language_valid(assistant_language)) { + mWakeupEngineManager.set_assistant_language(info.appid, language); + } else { + mWakeupEngineManager.set_assistant_language(info.appid, assistant_language); + } } MWR_LOGD("[END]"); - return ret; + return valid; } bool CWakeupManager::get_voice_key_pressed() -- 2.7.4 From 5afd1db88433ef88f4e167f4adbd2c9d3375665b Mon Sep 17 00:00:00 2001 From: Ji-hoon Lee Date: Fri, 20 Dec 2019 19:03:01 +0900 Subject: [PATCH 11/16] Make dbus message sending to be executed in main thread Change-Id: I04bdf186730cb31556f20ce7753888d7981b0d10 --- src/multi_assistant_dbus.c | 6 ++++- src/multi_assistant_service_plugin.c | 46 +++++++++++++++++++++++++++--------- 2 files changed, 40 insertions(+), 12 deletions(-) diff --git a/src/multi_assistant_dbus.c b/src/multi_assistant_dbus.c index 664a111..eab7619 100644 --- a/src/multi_assistant_dbus.c +++ b/src/multi_assistant_dbus.c @@ -217,7 +217,11 @@ int masc_dbus_send_streaming_audio_data(int pid, int event, unsigned char* data, MAS_LOGE("[Dbus ERROR] Fail to Send"); return -1; // MAS_ERROR_OPERATION_FAILED; } else { - MAS_LOGD("[Dbus DEBUG] Success to Send utterance stream"); + static int last_event = -1; + if (event != last_event) { + MAS_LOGI("[Dbus DEBUG] Success to Send utterance stream : event (%d)", event); + } + last_event = event; dbus_connection_flush(g_conn_sender); } diff --git a/src/multi_assistant_service_plugin.c b/src/multi_assistant_service_plugin.c index 6eed1f5..bd9de18 100644 --- a/src/multi_assistant_service_plugin.c +++ b/src/multi_assistant_service_plugin.c @@ -272,15 +272,20 @@ static void handle_speech_streaming_event_failure(void *data) mas_client_send_recognition_result(0, MA_RECOGNITION_RESULT_EVENT_ERROR); } -static void __audio_streaming_cb(mas_speech_streaming_event_e event, unsigned char* buffer, int len, void *user_data) +static void handle_speech_streaming_event_success(void *data) { - if (event == MAS_SPEECH_STREAMING_EVENT_FAIL) { - ecore_main_loop_thread_safe_call_async(handle_speech_streaming_event_failure, NULL); + if (NULL == data) return; + + mas_speech_data* speech_data = data; + if (NULL == speech_data->buffer) { + free(speech_data); return; } + static int count = 0; - if (event != MAS_SPEECH_STREAMING_EVENT_CONTINUE || count % 100 == 0) { - MAS_LOGD( "[SUCCESS] __audio_streaming_cb is called, event(%d), buffer(%p), len(%d)", event, buffer, len); + if (speech_data->event != MAS_SPEECH_STREAMING_EVENT_CONTINUE || count % 100 == 0) { + MAS_LOGD( "[SUCCESS] __audio_streaming_cb is called, event(%d), buffer(%p), len(%d)", + speech_data->event, speech_data->buffer, speech_data->len); } ++count; @@ -289,13 +294,15 @@ static void __audio_streaming_cb(mas_speech_streaming_event_e event, unsigned ch if (pid == -1) { MAS_LOGE("[ERROR] Fail to retrieve pid of current MA client"); } else { - if (__validate_streaming_event_order(pid, &event)) { - int ret = masc_dbus_send_streaming_audio_data(pid, event, buffer, len); + if (__validate_streaming_event_order(pid, &(speech_data->event))) { + int ret = masc_dbus_send_streaming_audio_data(pid, + speech_data->event, speech_data->buffer, speech_data->len); if (0 != ret) { MAS_LOGE("[ERROR] Fail to send speech data, ret(%d)", ret); } if (pid != preprocessing_pid && -1 != preprocessing_pid) { - int ret = masc_dbus_send_streaming_audio_data(preprocessing_pid, event, buffer, len); + int ret = masc_dbus_send_streaming_audio_data(preprocessing_pid, + speech_data->event, speech_data->buffer, speech_data->len); if (0 != ret) { MAS_LOGE("[ERROR] Fail to send speech data to preprocessing client, ret(%d)", ret); } @@ -304,11 +311,10 @@ static void __audio_streaming_cb(mas_speech_streaming_event_e event, unsigned ch } #ifdef BUF_SAVE_MODE - /* write pcm buffer */ if (g_pFile) - fwrite(buffer, 1, len, g_pFile); + fwrite(speech_data->buffer, 1, speech_data->len, g_pFile); - if (MAS_SPEECH_STREAMING_EVENT_FINISH == event) { + if (MAS_SPEECH_STREAMING_EVENT_FINISH == speech_data->event) { if (g_pFile) { MAS_LOGE("[Recorder SUCCESS] File Close"); fclose(g_pFile); @@ -318,6 +324,24 @@ static void __audio_streaming_cb(mas_speech_streaming_event_e event, unsigned ch } } #endif + free(speech_data->buffer); + free(speech_data); +} + +static void __audio_streaming_cb(mas_speech_streaming_event_e event, unsigned char* buffer, int len, void *user_data) +{ + if (event == MAS_SPEECH_STREAMING_EVENT_FAIL) { + ecore_main_loop_thread_safe_call_async(handle_speech_streaming_event_failure, NULL); + } else { + mas_speech_data* data = malloc(sizeof(mas_speech_data)); + if (data) { + data->event = event; + data->buffer = malloc(len); + if (data->buffer) memcpy(data->buffer, buffer, len); + data->len = len; + ecore_main_loop_thread_safe_call_async(handle_speech_streaming_event_success, data); + } + } } static void __speech_status_cb(mas_speech_status_e status, void *user_data) -- 2.7.4 From f52c70256b054f4ea89c2fa99257d3eb956eaa02 Mon Sep 17 00:00:00 2001 From: Ji-hoon Lee Date: Fri, 20 Dec 2019 19:03:59 +0900 Subject: [PATCH 12/16] Bump version to 0.2.16 Change-Id: I5920abb2f85dc696b670a6362572b947d022ab8a --- org.tizen.multi-assistant-service.xml | 2 +- packaging/org.tizen.multi-assistant-service.spec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/org.tizen.multi-assistant-service.xml b/org.tizen.multi-assistant-service.xml index 798bd6c..0681181 100644 --- a/org.tizen.multi-assistant-service.xml +++ b/org.tizen.multi-assistant-service.xml @@ -1,5 +1,5 @@ - + Won Nam Jang Sooyeon Kim diff --git a/packaging/org.tizen.multi-assistant-service.spec b/packaging/org.tizen.multi-assistant-service.spec index 231db59..dae3bb2 100644 --- a/packaging/org.tizen.multi-assistant-service.spec +++ b/packaging/org.tizen.multi-assistant-service.spec @@ -1,6 +1,6 @@ Name: org.tizen.multi-assistant-service Summary: Multi assistant service -Version: 0.2.15 +Version: 0.2.16 Release: 1 Group: Graphics & UI Framework/Voice Framework License: Flora-1.1 -- 2.7.4 From bad27bbe5a77a0bb83642e0f1564036fc98286b6 Mon Sep 17 00:00:00 2001 From: Ji-hoon Lee Date: Fri, 27 Dec 2019 22:52:10 +0900 Subject: [PATCH 13/16] Make sure to emit FINISH event even when streaming fails Change-Id: I1c52a569e2ec6e4981f1e9b716b91de42998f04b --- plugins/wakeup-manager/src/wakeup_audio_manager.cpp | 5 +++++ plugins/wakeup-manager/src/wakeup_engine_manager.cpp | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/plugins/wakeup-manager/src/wakeup_audio_manager.cpp b/plugins/wakeup-manager/src/wakeup_audio_manager.cpp index b1541a6..6a76a4f 100644 --- a/plugins/wakeup-manager/src/wakeup_audio_manager.cpp +++ b/plugins/wakeup-manager/src/wakeup_audio_manager.cpp @@ -251,6 +251,7 @@ void CAudioManager::streaming_audio_data_thread_func(long start_time) break; } if (g_speech_pcm_wait_count < cnt) { + unsigned char final_buffer[2] = {'\0', }; MWR_LOGE("[ERROR] Wrong request, there's no pcm data"); for (const auto& observer : mObservers) { if (observer) { @@ -258,6 +259,10 @@ void CAudioManager::streaming_audio_data_thread_func(long start_time) MAS_SPEECH_STREAMING_EVENT_FAIL, NULL, 0)) { LOGE("[Recorder WARNING] One of the observer returned false"); } + if (!observer->on_streaming_audio_data( + MAS_SPEECH_STREAMING_EVENT_FINISH, final_buffer, sizeof(final_buffer))) { + LOGE("[Recorder WARNING] One of the observer returned false"); + } } } MWR_LOGD("[EXIT]"); diff --git a/plugins/wakeup-manager/src/wakeup_engine_manager.cpp b/plugins/wakeup-manager/src/wakeup_engine_manager.cpp index 596b697..f374d58 100644 --- a/plugins/wakeup-manager/src/wakeup_engine_manager.cpp +++ b/plugins/wakeup-manager/src/wakeup_engine_manager.cpp @@ -329,6 +329,7 @@ void CWakeupEngineManager::streaming_speech_data_thread_func() break; } if (g_speech_pcm_wait_count < cnt) { + unsigned char final_buffer[2] = {'\0', }; MWR_LOGE("[ERROR] Wrong request, there's no pcm data"); for (const auto& observer : mObservers) { if (observer) { @@ -336,6 +337,10 @@ void CWakeupEngineManager::streaming_speech_data_thread_func() MAS_SPEECH_STREAMING_EVENT_FAIL, NULL, 0)) { LOGE("[Recorder WARNING] One of the observer returned false"); } + if (!observer->on_streaming_audio_data( + MAS_SPEECH_STREAMING_EVENT_FINISH, final_buffer, sizeof(final_buffer))) { + LOGE("[Recorder WARNING] One of the observer returned false"); + } } } return; -- 2.7.4 From f076bc13e8a705bcaa4c4952172d4813541185e0 Mon Sep 17 00:00:00 2001 From: Ji-hoon Lee Date: Fri, 27 Dec 2019 22:52:48 +0900 Subject: [PATCH 14/16] Bump version to 0.2.17 Change-Id: I0de37fa3eceb45fecb626b1e65225416160b204c --- org.tizen.multi-assistant-service.xml | 2 +- packaging/org.tizen.multi-assistant-service.spec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/org.tizen.multi-assistant-service.xml b/org.tizen.multi-assistant-service.xml index 0681181..5f7e6b9 100644 --- a/org.tizen.multi-assistant-service.xml +++ b/org.tizen.multi-assistant-service.xml @@ -1,5 +1,5 @@ - + Won Nam Jang Sooyeon Kim diff --git a/packaging/org.tizen.multi-assistant-service.spec b/packaging/org.tizen.multi-assistant-service.spec index dae3bb2..cb7e250 100644 --- a/packaging/org.tizen.multi-assistant-service.spec +++ b/packaging/org.tizen.multi-assistant-service.spec @@ -1,6 +1,6 @@ Name: org.tizen.multi-assistant-service Summary: Multi assistant service -Version: 0.2.16 +Version: 0.2.17 Release: 1 Group: Graphics & UI Framework/Voice Framework License: Flora-1.1 -- 2.7.4 From 9cdfde61edb7b186a5eff6998e4f1734a31d97e5 Mon Sep 17 00:00:00 2001 From: Ji-hoon Lee Date: Fri, 3 Jan 2020 13:55:19 +0900 Subject: [PATCH 15/16] Return observers as a const reference instead of a value Change-Id: I3f8aad8fa2502959a4bcf94703d547ae32eec608 --- plugins/wakeup-manager/inc/wakeup_settings.h | 2 +- plugins/wakeup-manager/src/wakeup_settings.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/wakeup-manager/inc/wakeup_settings.h b/plugins/wakeup-manager/inc/wakeup_settings.h index 6804209..7155c33 100644 --- a/plugins/wakeup-manager/inc/wakeup_settings.h +++ b/plugins/wakeup-manager/inc/wakeup_settings.h @@ -63,7 +63,7 @@ public: void subscribe(ISettingsEventObserver *observer); void unsubscribe(ISettingsEventObserver *observer); - vector get_observers(); + const vector& get_observers(); string get_default_assistant_appid(); bool get_ui_panel_enabled(); diff --git a/plugins/wakeup-manager/src/wakeup_settings.cpp b/plugins/wakeup-manager/src/wakeup_settings.cpp index 96a006f..7324838 100644 --- a/plugins/wakeup-manager/src/wakeup_settings.cpp +++ b/plugins/wakeup-manager/src/wakeup_settings.cpp @@ -34,7 +34,7 @@ static void wakeup_setting_input_language_changed_cb(keynode_t* node, void* data if (VCONF_TYPE_STRING == node->type) { const char* value = static_cast(node->value.s); - vector observers = settings->get_observers(); + const auto& observers = settings->get_observers(); for (const auto& observer : observers) { if (observer) { if (!observer->on_voice_input_language_changed(value)) { @@ -82,7 +82,7 @@ static void wakeup_setting_enabled_assistants_changed_cb(keynode_t* node, void* } } - vector observers = settings->get_observers(); + const auto& observers = settings->get_observers(); for (const auto& observer : observers) { if (observer) { for (const auto& assistant : newlyAddedAssistants) { @@ -112,7 +112,7 @@ static void wakeup_setting_default_assistant_appid_changed_cb(keynode_t* node, v if (VCONF_TYPE_STRING == node->type) { const char* value = static_cast(node->value.s); - vector observers = settings->get_observers(); + const auto& observers = settings->get_observers(); for (const auto& observer : observers) { if (observer) { if (!observer->on_default_assistant_appid_changed(value)) { @@ -251,7 +251,7 @@ void CWakeupSettings::unsubscribe(ISettingsEventObserver *observer) } } -vector CWakeupSettings::get_observers() +const vector& CWakeupSettings::get_observers() { return mObservers; } -- 2.7.4 From e5247e6f013256d6dcae95f8c528e5a36dcc9ef8 Mon Sep 17 00:00:00 2001 From: Ji-hoon Lee Date: Fri, 3 Jan 2020 13:56:18 +0900 Subject: [PATCH 16/16] Bump version to 0.2.18 Change-Id: I6b2601289fcde7ee565ce77268786666f256c545 --- org.tizen.multi-assistant-service.xml | 2 +- packaging/org.tizen.multi-assistant-service.spec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/org.tizen.multi-assistant-service.xml b/org.tizen.multi-assistant-service.xml index 5f7e6b9..29f8e6b 100644 --- a/org.tizen.multi-assistant-service.xml +++ b/org.tizen.multi-assistant-service.xml @@ -1,5 +1,5 @@ - + Won Nam Jang Sooyeon Kim diff --git a/packaging/org.tizen.multi-assistant-service.spec b/packaging/org.tizen.multi-assistant-service.spec index cb7e250..72e171c 100644 --- a/packaging/org.tizen.multi-assistant-service.spec +++ b/packaging/org.tizen.multi-assistant-service.spec @@ -1,6 +1,6 @@ Name: org.tizen.multi-assistant-service Summary: Multi assistant service -Version: 0.2.17 +Version: 0.2.18 Release: 1 Group: Graphics & UI Framework/Voice Framework License: Flora-1.1 -- 2.7.4