Directly link wakeup-manager code with executable file 36/304836/1
authorJi-hoon Lee <dalton.lee@samsung.com>
Tue, 19 Dec 2023 07:50:43 +0000 (16:50 +0900)
committerJi-hoon Lee <dalton.lee@samsung.com>
Tue, 19 Dec 2023 07:50:43 +0000 (16:50 +0900)
Change-Id: Icb5ca3f5251e57307fb6c6e3741d76f24caaff46

70 files changed:
CMakeLists.txt
inc/service_plugin.h
inc/service_plugin_interface.h
packaging/org.tizen.multi-assistant-service.spec
plugins/CMakeLists.txt
plugins/dependency-default/CMakeLists.txt [new file with mode: 0644]
plugins/dependency-default/inc/dependency_default.h [new file with mode: 0644]
plugins/dependency-default/inc/dependency_default_audio.h [new file with mode: 0644]
plugins/dependency-default/inc/dependency_default_button.h [new file with mode: 0644]
plugins/dependency-default/src/dependency_default.cpp [new file with mode: 0644]
plugins/dependency-default/src/dependency_default_audio.cpp [new file with mode: 0644]
plugins/dependency-default/src/dependency_default_button.cpp [new file with mode: 0644]
plugins/wakeup-manager/CMakeLists.txt [deleted file]
plugins/wakeup-manager/dependency-default/CMakeLists.txt [deleted file]
plugins/wakeup-manager/dependency-default/inc/dependency_default.h [deleted file]
plugins/wakeup-manager/dependency-default/inc/dependency_default_audio.h [deleted file]
plugins/wakeup-manager/dependency-default/inc/dependency_default_button.h [deleted file]
plugins/wakeup-manager/dependency-default/src/dependency_default.cpp [deleted file]
plugins/wakeup-manager/dependency-default/src/dependency_default_audio.cpp [deleted file]
plugins/wakeup-manager/dependency-default/src/dependency_default_button.cpp [deleted file]
plugins/wakeup-manager/inc/assistant_config_manager.h [deleted file]
plugins/wakeup-manager/inc/dependency_resolver.h [deleted file]
plugins/wakeup-manager/inc/heap_tracer.h [deleted file]
plugins/wakeup-manager/inc/wakeup_audio_manager.h [deleted file]
plugins/wakeup-manager/inc/wakeup_engine_manager.h [deleted file]
plugins/wakeup-manager/inc/wakeup_manager.h [deleted file]
plugins/wakeup-manager/inc/wakeup_manager_main.h [deleted file]
plugins/wakeup-manager/inc/wakeup_manager_wrapper.h [deleted file]
plugins/wakeup-manager/inc/wakeup_policy.h [deleted file]
plugins/wakeup-manager/inc/wakeup_policy_default.h [deleted file]
plugins/wakeup-manager/inc/wakeup_policy_external.h [deleted file]
plugins/wakeup-manager/inc/wakeup_policy_impl.h [deleted file]
plugins/wakeup-manager/inc/wakeup_settings.h [deleted file]
plugins/wakeup-manager/src/assistant_config_manager.cpp [deleted file]
plugins/wakeup-manager/src/dependency_resolver.cpp [deleted file]
plugins/wakeup-manager/src/heap_tracer.cpp [deleted file]
plugins/wakeup-manager/src/wakeup_audio_manager.cpp [deleted file]
plugins/wakeup-manager/src/wakeup_engine_manager.cpp [deleted file]
plugins/wakeup-manager/src/wakeup_manager.cpp [deleted file]
plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp [deleted file]
plugins/wakeup-manager/src/wakeup_policy.cpp [deleted file]
plugins/wakeup-manager/src/wakeup_policy_default.cpp [deleted file]
plugins/wakeup-manager/src/wakeup_policy_external.cpp [deleted file]
plugins/wakeup-manager/src/wakeup_settings.cpp [deleted file]
src/service_plugin.cpp
wakeup-manager/CMakeLists.txt [new file with mode: 0644]
wakeup-manager/inc/assistant_config_manager.h [new file with mode: 0644]
wakeup-manager/inc/dependency_resolver.h [new file with mode: 0644]
wakeup-manager/inc/heap_tracer.h [new file with mode: 0644]
wakeup-manager/inc/wakeup_audio_manager.h [new file with mode: 0644]
wakeup-manager/inc/wakeup_engine_manager.h [new file with mode: 0644]
wakeup-manager/inc/wakeup_manager.h [new file with mode: 0644]
wakeup-manager/inc/wakeup_manager_main.h [new file with mode: 0644]
wakeup-manager/inc/wakeup_manager_wrapper.h [new file with mode: 0644]
wakeup-manager/inc/wakeup_policy.h [new file with mode: 0644]
wakeup-manager/inc/wakeup_policy_default.h [new file with mode: 0644]
wakeup-manager/inc/wakeup_policy_external.h [new file with mode: 0644]
wakeup-manager/inc/wakeup_policy_impl.h [new file with mode: 0644]
wakeup-manager/inc/wakeup_settings.h [new file with mode: 0644]
wakeup-manager/src/assistant_config_manager.cpp [new file with mode: 0644]
wakeup-manager/src/dependency_resolver.cpp [new file with mode: 0644]
wakeup-manager/src/heap_tracer.cpp [new file with mode: 0644]
wakeup-manager/src/wakeup_audio_manager.cpp [new file with mode: 0644]
wakeup-manager/src/wakeup_engine_manager.cpp [new file with mode: 0644]
wakeup-manager/src/wakeup_manager.cpp [new file with mode: 0644]
wakeup-manager/src/wakeup_manager_wrapper.cpp [new file with mode: 0644]
wakeup-manager/src/wakeup_policy.cpp [new file with mode: 0644]
wakeup-manager/src/wakeup_policy_default.cpp [new file with mode: 0644]
wakeup-manager/src/wakeup_policy_external.cpp [new file with mode: 0644]
wakeup-manager/src/wakeup_settings.cpp [new file with mode: 0644]

index 816b8129d97538e0c61da78120c7fc6754c74154..40b8703e60c2ab75f5ff7887bc6c4fcddeba8bfb 100644 (file)
@@ -29,6 +29,9 @@ pkg_check_modules(pkgs REQUIRED
        vconf
        pkgmgr-info
        jsoncpp
+       capi-media-audio-io
+       capi-media-sound-manager
+       eina
 )
 
 # SET FLAG ---------------------------------------------------------------------------------------
@@ -66,6 +69,7 @@ ENDIF()
 LINK_DIRECTORIES(${CMAKE_SOURCE_DIR}/lib)
 INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src)
 INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/inc)
+INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/wakeup-manager/inc)
 
 SET(SRCS
                src/service_config.cpp
@@ -78,6 +82,17 @@ SET(SRCS
                src/service_ipc_dbus.cpp
                src/service_ipc_dbus_dispatcher.cpp
                src/main.cpp
+               wakeup-manager/src/wakeup_manager.cpp
+               wakeup-manager/src/wakeup_settings.cpp
+               wakeup-manager/src/wakeup_policy.cpp
+               wakeup-manager/src/wakeup_policy_default.cpp
+               wakeup-manager/src/wakeup_policy_external.cpp
+               wakeup-manager/src/wakeup_audio_manager.cpp
+               wakeup-manager/src/wakeup_engine_manager.cpp
+               wakeup-manager/src/wakeup_manager_wrapper.cpp
+               wakeup-manager/src/dependency_resolver.cpp
+               wakeup-manager/src/heap_tracer.cpp
+               wakeup-manager/src/assistant_config_manager.cpp
 )
 ADD_EXECUTABLE(${BINNAME} ${SRCS})
 
index 6a4691d819271f7e4b0643995171d11168ca1b7f..776944b257f773b2eb5b927390b941cc22a2dd0f 100644 (file)
@@ -24,6 +24,8 @@
 #include "service_ipc_dbus.h"
 #include "service_plugin_interface.h"
 
+#include "wakeup_manager_wrapper.h"
+
 class CServiceMain;
 
 class CServicePlugin {
@@ -92,10 +94,6 @@ private:
        FILE* mDumpFile{NULL};
        int mDumpCount{1};
 #endif
-
-       void* mPluginHandle{NULL};
-
-       wakeup_manager_interface mWakeupManagerInterface{NULL, };
        ma_plugin_settings* mPluginSettings{NULL};
 
        CServiceIpcDbus* mServiceIpc{nullptr};
index ae2a74ea59094ff98fb862c53758d191f7fb1cf3..afce9f193ef06c4371b8f63a43fa388af44708d8 100644 (file)
 
 #include <tzplatform_config.h>
 
-typedef struct {
-       int plugin_version;
-       bool ui_panel_enabled;
-} ma_plugin_settings;
-
 #define MA_WAKEUP_MANAGER_PATH tzplatform_mkpath(tzplatform_getid("TZ_SYS_RO_SHARE"), "multiassistant/")
 
-#define MA_DEFAULT_WAKEUP_MANAGER_FILENAME "libma-wakeup-manager.so"
-
-#define MA_WAKEUP_MANAGER_FUNC_INITIALIZE "wakeup_manager_initialize"
-typedef int (*wakeup_manager_initialize)(void);
-#define MA_WAKEUP_MANAGER_FUNC_DEINITIALIZE "wakeup_manager_deinitialize"
-typedef int (*wakeup_manager_deinitialize)(void);
-#define MA_WAKEUP_MANAGER_FUNC_GET_SETTINGS "wakeup_manager_get_settings"
-typedef int (*wakeup_manager_get_settings)(ma_plugin_settings **settings, size_t *struct_size);
-#define MA_WAKEUP_MANAGER_FUNC_ADD_ASSISTANT_WAKEUP_WORD "wakeup_manager_add_assistant_wakeup_word"
-typedef int (*wakeup_manager_add_assistant_wakeup_word)(const char* appid, const char* wakeup_word, const char* language);
-#define MA_WAKEUP_MANAGER_FUNC_REMOVE_ASSISTANT_WAKEUP_WORD "wakeup_manager_remove_assistant_wakeup_word"
-typedef int (*wakeup_manager_remove_assistant_wakeup_word)(const char* appid, const char* wakeup_word, const char* language);
-#define MA_WAKEUP_MANAGER_FUNC_ADD_ASSISTANT_LANGUAGE "wakeup_manager_add_assistant_language"
-typedef int (*wakeup_manager_add_assistant_language)(const char* appid, const char* language);
-#define MA_WAKEUP_MANAGER_FUNC_ADD_ASSISTANT_WAKEUP_ENGINE "wakeup_manager_add_assistant_wakeup_engine"
-typedef int (*wakeup_manager_add_assistant_wakeup_engine)(const char* appid, const char* engine);
-#define MA_WAKEUP_MANAGER_FUNC_SET_DEFAULT_ASSISTANT "wakeup_manager_set_default_assistant"
-typedef int (*wakeup_manager_set_default_assistant)(const char* appid);
-#define MA_WAKEUP_MANAGER_FUNC_GET_DEFAULT_ASSISTANT "wakeup_manager_get_default_assistant"
-typedef int (*wakeup_manager_get_default_assistant)(const char** appid);
-#define MA_WAKEUP_MANAGER_FUNC_SET_LANGUAGE "wakeup_manager_set_language"
-typedef int (*wakeup_manager_set_language)(const char* language);
-#define MA_WAKEUP_MANAGER_FUNC_ACTIVATE "wakeup_manager_activate"
-typedef int (*wakeup_manager_activate)(void);
-#define MA_WAKEUP_MANAGER_FUNC_DEACTIVATE "wakeup_manager_deactivate"
-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_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"
-typedef int (*wakeup_manager_update_recognition_result)(const char* appid, int result);
-#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"
-typedef int (*wakeup_manager_stop_streaming_utterance_data)(void);
-#define MA_WAKEUP_MANAGER_FUNC_START_STREAMING_PREVIOUS_UTTERANCE_DATA "wakeup_manager_start_streaming_previous_utterance_data"
-typedef int (*wakeup_manager_start_streaming_previous_utterance_data)(void);
-#define MA_WAKEUP_MANAGER_FUNC_STOP_STREAMING_PREVIOUS_UTTERANCE_DATA "wakeup_manager_stop_streaming_previous_utterance_data"
-typedef int (*wakeup_manager_stop_streaming_previous_utterance_data)(void);
-#define MA_WAKEUP_MANAGER_FUNC_START_STREAMING_FOLLOW_UP_DATA "wakeup_manager_start_streaming_follow_up_data"
-typedef int (*wakeup_manager_start_streaming_follow_up_data)(void);
-#define MA_WAKEUP_MANAGER_FUNC_STOP_STREAMING_FOLLOW_UP_DATA "wakeup_manager_stop_streaming_follow_up_data"
-typedef int (*wakeup_manager_stop_streaming_follow_up_data)(void);
-#define MA_WAKEUP_MANAGER_FUNC_GET_AUDIO_FORMAT "wakeup_manager_get_audio_format"
-typedef int (*wakeup_manager_get_audio_format)(int* rate, int* channel, int* audio_type);
-#define MA_WAKEUP_MANAGER_FUNC_GET_AUDIO_SOURCE_TYPE "wakeup_manager_get_audio_source_type"
-typedef int (*wakeup_manager_get_audio_source_type)(char** type);
-#define MA_WAKEUP_MANAGER_FUNC_SET_VOICE_KEY_TAP_DURATION "wakeup_manager_set_voice_key_tap_duration"
-typedef int (*wakeup_manager_set_voice_key_tap_duration)(float duration);
-#define MA_WAKEUP_MANAGER_FUNC_UNSET_VOICE_KEY_TAP_DURATION "wakeup_manager_unset_voice_key_tap_duration"
-typedef int (*wakeup_manager_unset_voice_key_tap_duration)();
-#define MA_WAKEUP_MANAGER_FUNC_SET_VOICE_KEY_SUPPORT_MODE "wakeup_manager_set_voice_key_support_mode"
-typedef int (*wakeup_manager_set_voice_key_support_mode)(int mode);
-#define MA_WAKEUP_MANAGER_FUNC_SET_WAKE_WORD_AUDIO_REQUIRE_FLAG "wakeup_manager_set_wake_word_audio_require_flag"
-typedef int (*wakeup_manager_set_wake_word_audio_require_flag)(bool require);
-#define MA_WAKEUP_MANAGER_FUNC_SET_ASSISTANT_LANGUAGE "wakeup_manager_set_assistant_language"
-typedef int (*wakeup_manager_set_assistant_language)(const char* appid, const char* language);
-#define MA_WAKEUP_MANAGER_FUNC_SET_WAKEUP_EVENT_CALLBACK "wakeup_manager_set_wakeup_event_callback"
-typedef int (*wakeup_manager_set_wakeup_event_callback)(wakeup_service_wakeup_event_cb callback, void* user_data);
-#define MA_WAKEUP_MANAGER_FUNC_SET_UTTERANCE_STREAMING_CALLBACK "wakeup_manager_set_utterance_streaming_callback"
-typedef int (*wakeup_manager_set_utterance_streaming_callback)(wakeup_service_speech_streaming_cb callback, void* user_data);
-#define MA_WAKEUP_MANAGER_FUNC_SET_PREVIOUS_UTTERANCE_STREAMING_CALLBACK "wakeup_manager_set_previous_utterance_streaming_callback"
-typedef int (*wakeup_manager_set_previous_utterance_streaming_callback)(wakeup_service_speech_streaming_cb callback, void* user_data);
-#define MA_WAKEUP_MANAGER_FUNC_SET_FOLLOW_UP_STREAMING_CALLBACK "wakeup_manager_set_follow_up_streaming_callback"
-typedef int (*wakeup_manager_set_follow_up_streaming_callback)(wakeup_service_speech_streaming_cb callback, void* user_data);
-#define MA_WAKEUP_MANAGER_FUNC_SET_SPEECH_STATUS_CALLBACK "wakeup_manager_set_speech_status_callback"
-typedef int (*wakeup_manager_set_speech_status_callback)(wakeup_service_speech_status_cb callback, void* user_data);
-#define MA_WAKEUP_MANAGER_FUNC_SET_SETTING_CHANGED_CALLBACK "wakeup_manager_set_setting_changed_callback"
-typedef int (*wakeup_manager_set_setting_changed_callback)(wakeup_service_setting_changed_cb callback, void* user_data);
-#define MA_WAKEUP_MANAGER_FUNC_SET_ERROR_CALLBACK "wakeup_manager_set_error_callback"
-typedef int (*wakeup_manager_set_error_callback)(wakeup_service_error_cb callback, void* user_data);
-#define MA_WAKEUP_MANAGER_FUNC_SET_STREAMING_SECTION_CHANGED_CALLBACK "wakeup_manager_set_streaming_section_changed_callback"
-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);
-#define MA_WAKEUP_MANAGER_FUNC_SET_VOICE_KEY_STATUS_CHANGED_CALLBACK "wakeup_manager_set_voice_key_status_changed_callback"
-typedef int (*wakeup_manager_set_voice_key_status_changed_callback)(wakeup_service_voice_key_status_changed_cb callback, void* user_data);
-#define MA_WAKEUP_MANAGER_FUNC_SET_LOADED_ENGINE_CHANGED_CALLBACK "wakeup_manager_set_loaded_engine_changed_callback"
-typedef int (*wakeup_manager_set_loaded_engine_changed_callback)(wakeup_service_loaded_engine_changed_cb callback, void* user_data);
-
-typedef struct {
-       wakeup_manager_initialize                                                                       initialize;
-       wakeup_manager_deinitialize                                                                     deinitialize;
-       wakeup_manager_get_settings                                                                     get_settings;
-       wakeup_manager_add_assistant_wakeup_word                                        add_assistant_wakeup_word;
-       wakeup_manager_remove_assistant_wakeup_word                                     remove_assistant_wakeup_word;
-       wakeup_manager_add_assistant_language                                           add_assistant_language;
-       wakeup_manager_add_assistant_wakeup_engine                                      add_assistant_wakeup_engine;
-       wakeup_manager_set_default_assistant                                            set_default_assistant;
-       wakeup_manager_get_default_assistant                                            get_default_assistant;
-       wakeup_manager_set_language                                                                     set_language;
-       wakeup_manager_activate                                                                         activate;
-       wakeup_manager_deactivate                                                                       deactivate;
-       wakeup_manager_update_voice_feedback_state                                      update_voice_feedback_state;
-       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;
-       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;
-       wakeup_manager_stop_streaming_previous_utterance_data           stop_streaming_previous_utterance_data;
-       wakeup_manager_start_streaming_follow_up_data                           start_streaming_follow_up_data;
-       wakeup_manager_stop_streaming_follow_up_data                            stop_streaming_follow_up_data;
-       wakeup_manager_get_audio_format                                                         get_audio_format;
-       wakeup_manager_get_audio_source_type                                            get_audio_source_type;
-       wakeup_manager_set_voice_key_tap_duration                                       set_voice_key_tap_duration;
-       wakeup_manager_unset_voice_key_tap_duration                                     unset_voice_key_tap_duration;
-       wakeup_manager_set_voice_key_support_mode                                       set_voice_key_support_mode;
-       wakeup_manager_set_wake_word_audio_require_flag                         set_wake_word_audio_require_flag;
-       wakeup_manager_set_assistant_language                                           set_assistant_language;
-       wakeup_manager_set_wakeup_event_callback                                        set_wakeup_event_callback;
-       wakeup_manager_set_utterance_streaming_callback                         set_utterance_streaming_callback;
-       wakeup_manager_set_previous_utterance_streaming_callback        set_previous_utterance_streaming_callback;
-       wakeup_manager_set_follow_up_streaming_callback                         set_follow_up_streaming_callback;
-       wakeup_manager_set_speech_status_callback                                       set_speech_status_callback;
-       wakeup_manager_set_setting_changed_callback                                     set_setting_changed_callback;
-       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_set_voice_key_status_changed_callback            set_voice_key_status_changed_callback;
-       wakeup_manager_set_loaded_engine_changed_callback                       set_loaded_engine_changed_callback;
-} wakeup_manager_interface;
-
 #endif /* __SERVICE_PLUGIN_INTERFACE_H__ */
index 8049eed2f546a8d885d9f16ec8d8dd3f5c70b9b1..c0d18b5f8d9be11be1599871c398e395e82fefb0 100644 (file)
@@ -104,7 +104,6 @@ exit 0
 %manifest %{name}.manifest
 %defattr(-,root,root,-)
 /usr/share/packages/org.tizen.multi-assistant-service.xml
-%{TZ_SYS_RO_SHARE}/multiassistant/libma-wakeup-manager.so
 %{TZ_SYS_RO_SHARE}/multiassistant/libma-dependency-default.so
 %{TZ_SYS_RO_APP}/%{name}/*
 #%{_appdir}/lib/*
index 2d6e3828ae9b1ac67a810143fc37dce14ec1f0ec..9afc7fec021d346ad0a2be302943484eb408cd3f 100644 (file)
@@ -1 +1 @@
-ADD_SUBDIRECTORY(wakeup-manager)
+ADD_SUBDIRECTORY(dependency-default)
diff --git a/plugins/dependency-default/CMakeLists.txt b/plugins/dependency-default/CMakeLists.txt
new file mode 100644 (file)
index 0000000..b2361c2
--- /dev/null
@@ -0,0 +1,59 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+PROJECT(ma-dependency-default)
+
+SET(PREFIX ${CMAKE_INSTALL_PREFIX})
+SET(PACKAGE ${PROJECT_NAME})
+
+SET(CMAKE_SKIP_BUILD_RPATH TRUE)
+
+INCLUDE_DIRECTORIES(
+       ${CMAKE_SOURCE_DIR}/inc
+       ./inc
+       )
+
+SET(DDPKG_CHECK_MODULES
+       ecore
+       ecore-wl2
+       dlog
+       capi-media-audio-io
+       capi-media-sound-manager
+       eina
+       vconf
+       pkgmgr-info
+       multi-assistant
+)
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(ddpkgs REQUIRED ${DDPKG_CHECK_MODULES})
+MESSAGE("Modules : ${DDPKG_CHECK_MODULES}")
+
+IF("${CMAKE_BUILD_TYPE}" STREQUAL "")
+        SET(CMAKE_BUILD_TYPE "Release")
+ENDIF("${CMAKE_BUILD_TYPE}" STREQUAL "")
+MESSAGE("Build type: ${CMAKE_BUILD_TYPE}")
+
+ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"")
+ADD_DEFINITIONS("-DPACKAGE=\"${PACKAGE}\"")
+
+SET(SRCS
+       src/dependency_default.cpp
+       src/dependency_default_audio.cpp
+       src/dependency_default_button.cpp
+)
+
+FOREACH(flag ${ddpkgs_CFLAGS})
+       SET(EXTRA_CXXFLAGS "${EXTRA_CXXFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+
+
+SET(EXTRA_CXXFLAGS  "${EXTRA_CXXFLAGS} -fPIC -Wall" )
+SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXXFLAGS} -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wl,-z,relro -fPIC -std=c++11 -fvisibility=hidden")
+SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
+
+ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS} )
+
+# Install libraries
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${ddpkgs_LDFLAGS} -ldl ${EXTRA_LDFLAGS})
+MESSAGE("LDFLAG : ${ddpkgs_LDFLAGS}")
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/plugins/dependency-default/lib${PACKAGE}.so DESTINATION ${TZ_SYS_RO_SHARE}/multiassistant/)
diff --git a/plugins/dependency-default/inc/dependency_default.h b/plugins/dependency-default/inc/dependency_default.h
new file mode 100644 (file)
index 0000000..e053dd4
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * 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 _DEPENDENCY_DEFAULT_H_
+#define _DEPENDENCY_DEFAULT_H_
+
+#include <tizen.h>
+
+#include <multi_assistant_service.h>
+
+#ifndef LOG_TAG
+#define LOG_TAG "dependency_default"
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EXPORT_API int mas_dependency_initialize(mas_dependency_plugin_proxy_interface interfaces, int *dependency_version);
+EXPORT_API int mas_dependency_deinitialize(void);
+EXPORT_API int mas_dependency_set_error_callback(mas_error_cb callback, void* user_data);
+EXPORT_API int mas_dependency_start_recording(void);
+EXPORT_API int mas_dependency_stop_recording(void);
+EXPORT_API int mas_dependency_set_recording_session(unsigned int session);
+EXPORT_API int mas_dependency_set_background_volume(double ratio);
+EXPORT_API int mas_dependency_get_audio_format(int* rate, int* channel, int* audio_type);
+EXPORT_API int mas_dependency_get_audio_source_type(char** type);
+EXPORT_API int mas_dependency_process_wakeup_engine_command(const char* engine_name, const char* command);
+EXPORT_API int mas_dependency_set_voice_key_tap_duration(float duration);
+EXPORT_API int mas_dependency_unset_voice_key_tap_duration(void);
+EXPORT_API int mas_dependency_set_voice_key_support_mode(const char* support_mode);
+EXPORT_API int mas_dependency_get_custom_vconf_key(const char* default_key, char** custom_key);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _DEPENDENCY_DEFAULT_H_ */
diff --git a/plugins/dependency-default/inc/dependency_default_audio.h b/plugins/dependency-default/inc/dependency_default_audio.h
new file mode 100644 (file)
index 0000000..d9f402e
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * 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 _DEPENDENCY_DEFAULT_AUDIO_H_
+#define _DEPENDENCY_DEFAULT_AUDIO_H_
+
+#include "dependency_default.h"
+
+void dependency_default_audio_initialize(mas_dependency_plugin_proxy_interface  interface);
+void dependency_default_audio_deinitialize();
+
+void dependency_default_audio_start_recording();
+void dependency_default_audio_stop_recording();
+
+void dependency_default_audio_set_recording_session(unsigned int session);
+
+void dependency_default_audio_voice_key_pressed_set(bool pressed);
+
+void dependency_default_audio_set_background_volume(double ratio);
+
+void dependency_default_audio_get_audio_format(int* rate, int* channel, int* audio_type);
+void dependency_default_audio_get_audio_source_type(char** type);
+
+#endif //_DEPENDENCY_DEFAULT_AUDIO_H_
diff --git a/plugins/dependency-default/inc/dependency_default_button.h b/plugins/dependency-default/inc/dependency_default_button.h
new file mode 100644 (file)
index 0000000..aa50c94
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * 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 _DEPENDENCY_DEFAULT_BUTTON_H_
+#define _DEPENDENCY_DEFAULT_BUTTON_H_
+
+#include "dependency_default.h"
+
+void dependency_default_button_initialize(mas_dependency_plugin_proxy_interface interface);
+void dependency_default_button_deinitialize();
+void dependency_default_button_set_voice_key_tap_duration(float duration);
+void dependency_default_button_unset_voice_key_tap_duration(void);
+
+#endif //_DEPENDENCY_DEFAULT_BUTTON_H_
diff --git a/plugins/dependency-default/src/dependency_default.cpp b/plugins/dependency-default/src/dependency_default.cpp
new file mode 100644 (file)
index 0000000..b5496f9
--- /dev/null
@@ -0,0 +1,119 @@
+#include "dependency_default.h"
+#include "dependency_default_audio.h"
+#include "dependency_default_button.h"
+
+#include <dlog.h>
+#include <service_app_extension.h>
+
+#include <thread>
+
+static mas_dependency_plugin_proxy_interface g_proxy_interface;
+const int g_dependency_version = 1;
+
+static bool g_should_exit = false;
+
+int mas_dependency_initialize(mas_dependency_plugin_proxy_interface interface, int *dependency_version)
+{
+       g_proxy_interface = interface;
+
+       dependency_default_audio_initialize(interface);
+       dependency_default_button_initialize(interface);
+
+       if (dependency_version) {
+               *dependency_version = g_dependency_version;
+       }
+
+       /* If the service process has to terminate in certain circumstances,
+               set g_should_exit variable to true as below. */
+       // g_should_exit = true;
+
+       if (g_should_exit) {
+               LOGE("g_should_exit value contains positive value, registering timer");
+               std::thread([]() {
+                       std::this_thread::sleep_for(std::chrono::milliseconds(1000));
+                       LOGE("Now trying to exit");
+                       mas_dependency_deinitialize();
+                       service_app_exit_without_restart();
+               }).detach();
+       }
+
+       return 0;
+}
+
+int mas_dependency_deinitialize(void)
+{
+       dependency_default_audio_deinitialize();
+       dependency_default_button_deinitialize();
+
+       return 0;
+}
+
+int mas_dependency_set_error_callback(mas_error_cb callback, void* user_data)
+{
+       return 0;
+}
+
+int mas_dependency_start_recording(void)
+{
+       dependency_default_audio_start_recording();
+       return 0;
+}
+
+int mas_dependency_stop_recording(void)
+{
+       dependency_default_audio_stop_recording();
+       return 0;
+}
+
+int mas_dependency_set_recording_session(unsigned int session)
+{
+       dependency_default_audio_set_recording_session(session);
+       return 0;
+}
+
+int mas_dependency_set_background_volume(double ratio)
+{
+       dependency_default_audio_set_background_volume(ratio);
+       return 0;
+}
+
+int mas_dependency_get_audio_format(int* rate, int* channel, int* audio_type)
+{
+       dependency_default_audio_get_audio_format(rate, channel, audio_type);
+       return 0;
+}
+
+int mas_dependency_get_audio_source_type(char** type)
+{
+       dependency_default_audio_get_audio_source_type(type);
+       return 0;
+}
+
+int mas_dependency_process_wakeup_engine_command(const char* engine_name, const char* command)
+{
+       LOGD("Wakeup Engine %s has sent a command : %s", engine_name, command);
+       return 0;
+}
+
+int mas_dependency_set_voice_key_tap_duration(float duration)
+{
+       dependency_default_button_set_voice_key_tap_duration(duration);
+       return 0;
+}
+
+int mas_dependency_unset_voice_key_tap_duration(void)
+{
+       dependency_default_button_unset_voice_key_tap_duration();
+       return 0;
+}
+
+int mas_dependency_set_voice_key_support_mode(const char* support_mode)
+{
+       LOGD("support_mode : %s", support_mode);
+       return 0;
+}
+
+int mas_dependency_get_custom_vconf_key(const char* default_key, char** custom_key)
+{
+       return 0;
+}
\ No newline at end of file
diff --git a/plugins/dependency-default/src/dependency_default_audio.cpp b/plugins/dependency-default/src/dependency_default_audio.cpp
new file mode 100644 (file)
index 0000000..78b5195
--- /dev/null
@@ -0,0 +1,410 @@
+#include "dependency_default_audio.h"
+
+static bool g_voice_key_pressed = false;
+static mas_dependency_plugin_proxy_interface g_proxy_interface;
+
+#include <stdlib.h>
+#include <thread>
+#include <atomic>
+#include <chrono>
+
+#include <dlog.h>
+#include <audio_io.h>
+#include <sound_manager.h>
+#include <sound_manager_internal.h>
+
+using namespace std;
+
+static audio_in_h g_audio_in = NULL;
+static audio_io_state_e g_audio_io_state = AUDIO_IO_STATE_IDLE;
+
+static sound_stream_info_h g_volume_stream = NULL;
+static virtual_sound_stream_h g_virtual_sound_stream = NULL;
+
+static int g_device_id = -1;
+static sound_stream_info_h g_stream_info = NULL;
+
+static thread g_recorder_thread;
+static atomic_bool g_stop_recorder_thread{false};
+
+static long long get_current_milliseconds_after_epoch()
+{
+       auto now = chrono::steady_clock::now();
+       auto now_ms = chrono::time_point_cast<chrono::milliseconds>(now);
+       /* number of milliseconds since the epoch of system_clock */
+       auto value = now_ms.time_since_epoch();
+
+       return value.count();
+}
+
+static int _apply_device_for_stream_routing(void *user_data)
+{
+       sound_device_list_h deviceList = NULL;
+       sound_device_h device = NULL;
+       sound_device_type_e type;
+       sound_device_io_direction_e ioDirection;
+
+       if (0 != sound_manager_get_device_list(SOUND_DEVICE_IO_DIRECTION_IN_MASK, &deviceList)) {
+               LOGE("[Recorder ERROR] Fail to get current device list");
+               return -1;
+       }
+
+       bool isFound = false;
+       while (0 == sound_manager_get_next_device(deviceList, &device)) {
+               if (0 != sound_manager_get_device_type(device, &type)) {
+                       LOGE("[Recorder ERROR] Fail to get device type");
+                       continue;
+               }
+               if (0 != sound_manager_get_device_io_direction(device, &ioDirection)) {
+                       LOGE("[Recorder ERROR] Fail to get device io direction");
+                       continue;
+               }
+
+               if (SOUND_DEVICE_USB_AUDIO == type && SOUND_DEVICE_IO_DIRECTION_IN == ioDirection) {
+                       if (0 != sound_manager_add_device_for_stream_routing(g_stream_info, device)) {
+                               LOGE("[Recorder ERROR] Fail to add device");
+                               continue;
+                       }
+                       if (0 != sound_manager_apply_stream_routing(g_stream_info)) {
+                               LOGE("[Recorder ERROR] Fail to apply stream routing");
+                               continue;
+                       }
+                       isFound = true;
+                       break;
+               }
+       }
+
+       sound_manager_free_device_list(deviceList);
+       deviceList = NULL;
+
+       if (true != isFound) {
+               LOGI("[Recorder] No USB device");
+       } else {
+               LOGD("[Recorder] Apply device for stream routing");
+       }
+       return 0;
+}
+
+static void _device_connection_changed_cb(sound_device_h device, bool isConnected, void *user_data)
+{
+       sound_device_type_e type;
+       if (isConnected) {
+               if (0 != sound_manager_get_device_type(device, &type)) {
+                       LOGE("[Recorder ERROR] Fail to get device type");
+                       return;
+               }
+               if (type == SOUND_DEVICE_USB_AUDIO) {
+                       if (0 != sound_manager_remove_device_for_stream_routing(g_stream_info, device))
+                               LOGE("[Recorder ERROR] Fail to remove device");
+
+                       if (0 != sound_manager_add_device_for_stream_routing(g_stream_info, device)) {
+                               LOGE("[Recorder ERROR] Fail to add device");
+                               return;
+                       }
+                       if (0 != sound_manager_apply_stream_routing(g_stream_info)) {
+                               LOGE("[Recorder ERROR} Fail to apply stream routing");
+                               return;
+                       }
+                       LOGD("[Recorder] Apply device for stream routing");
+               }
+       }
+       return;
+}
+
+static void _audio_in_state_changed_cb(audio_in_h handle, audio_io_state_e previous, audio_io_state_e current, bool by_policy, void *user_data)
+{
+       if (handle == g_audio_in) {
+               g_audio_io_state = current;
+       }
+}
+
+void dependency_default_audio_initialize(mas_dependency_plugin_proxy_interface interfaces)
+{
+       const int rate = 16000;
+       const audio_channel_e channel = AUDIO_CHANNEL_MONO;
+       const audio_sample_type_e type = AUDIO_SAMPLE_TYPE_S16_LE;
+
+       g_proxy_interface = interfaces;
+
+       int ret = audio_in_create(rate, channel, type, &g_audio_in);
+       if (AUDIO_IO_ERROR_NONE != ret) {
+               LOGE("[Recorder ERROR] Rate(%d) Channel(%d) Type(%d)", rate, channel, type);
+               LOGE("[Recorder ERROR] Fail to create audio handle : %d", ret);
+               return;
+       }
+
+       ret = sound_manager_add_device_connection_changed_cb(SOUND_DEVICE_IO_DIRECTION_IN_MASK, _device_connection_changed_cb, NULL, &g_device_id);
+       if (0 != ret) {
+               LOGE("[Recorder ERROR] Fail to add device connection changed callback");
+               audio_in_destroy(g_audio_in);
+               g_audio_in = NULL;
+               return;
+       }
+
+       ret = sound_manager_create_stream_information_internal(
+               SOUND_STREAM_TYPE_VOICE_RECOGNITION_SERVICE, NULL, NULL, &g_stream_info);
+       if (0 != ret) {
+               LOGE("[Recorder ERROR] Fail to create stream info");
+               sound_manager_remove_device_connection_changed_cb(g_device_id);
+               audio_in_destroy(g_audio_in);
+               g_audio_in = NULL;
+               return;
+       }
+
+       ret = _apply_device_for_stream_routing(NULL);
+       if (0 != ret) {
+               LOGE("[Recorder ERROR] Fail to apply device for stream routing: %d", ret);
+       }
+
+       ret = audio_in_set_state_changed_cb(g_audio_in, _audio_in_state_changed_cb, NULL);
+       if (AUDIO_IO_ERROR_NONE != ret) {
+               LOGE("[Recorder ERROR] Fail to set state changed callback : %d", ret);
+               sound_manager_remove_device_connection_changed_cb(g_device_id);
+               sound_manager_destroy_stream_information(g_stream_info);
+               g_stream_info = NULL;
+               audio_in_destroy(g_audio_in);
+               g_audio_in = NULL;
+               return;
+       }
+
+       ret = audio_in_set_sound_stream_info(g_audio_in, g_stream_info);
+       if (AUDIO_IO_ERROR_NONE != ret) {
+               LOGE("[Recorder ERROR] Fail to set stream info : %d", ret);
+               sound_manager_remove_device_connection_changed_cb(g_device_id);
+               sound_manager_destroy_stream_information(g_stream_info);
+               g_stream_info = NULL;
+               audio_in_unset_state_changed_cb(g_audio_in);
+               audio_in_destroy(g_audio_in);
+               g_audio_in = NULL;
+               return;
+       }
+
+       ret = audio_in_prepare(g_audio_in);
+       if (AUDIO_IO_ERROR_NONE != ret) {
+               if (AUDIO_IO_ERROR_SOUND_POLICY == ret)
+               {
+                       LOGE("[Recorder ERROR] Audio is busy.");
+               } else {
+                       LOGE("[Recorder ERROR] Fail to start audio : %d", ret);
+               }
+               sound_manager_remove_device_connection_changed_cb(g_device_id);
+               sound_manager_destroy_stream_information(g_stream_info);
+               g_stream_info = NULL;
+               audio_in_unset_state_changed_cb(g_audio_in);
+               audio_in_destroy(g_audio_in);
+               g_audio_in = NULL;
+               return;
+       }
+
+       ret = audio_in_pause(g_audio_in);
+       if (AUDIO_IO_ERROR_NONE != ret) {
+               LOGE("[Recorder ERROR] Fail to pause audio in : %d", ret);
+       }
+}
+
+void dependency_default_audio_deinitialize()
+{
+       dependency_default_audio_stop_recording();
+
+       int ret = 0;
+       if (g_virtual_sound_stream) {
+               sound_manager_stop_virtual_stream(g_virtual_sound_stream);
+               ret = sound_manager_destroy_virtual_stream(g_virtual_sound_stream);
+               if (0 != ret) {
+                       LOGE("[Audio ERROR] Fail to destroy virtual stream, ret(%d)", ret);
+               }
+               g_virtual_sound_stream = NULL;
+       }
+
+       if (g_device_id) {
+               ret = sound_manager_remove_device_connection_changed_cb(g_device_id);
+               if (0 != ret)
+                       LOGE("[Audio ERROR] Fail to remove device connection changed callback, ret(%d)", ret);
+       }
+
+       if (g_volume_stream) {
+               ret = sound_manager_destroy_stream_information(g_volume_stream);
+               if (0 != ret) {
+                       LOGE("[Audio ERROR] Fail to destroy stream information, ret(%d)", ret);
+               }
+               g_volume_stream = NULL;
+       }
+
+       if (g_audio_in) {
+               ret = audio_in_unprepare(g_audio_in);
+               if (AUDIO_IO_ERROR_NONE != ret) {
+                       LOGD("[Recorder ERROR] Fail to stop audio : %d", ret);
+               }
+       }
+
+       if (g_stream_info) {
+               if (0 != sound_manager_destroy_stream_information(g_stream_info)) {
+                       LOGD("[Recorder ERROR] Fail to destroy stream info");
+               }
+               g_stream_info = NULL;
+       }
+
+       if (g_audio_in) {
+               ret = audio_in_unset_state_changed_cb(g_audio_in);
+               if (AUDIO_IO_ERROR_NONE != ret) {
+                       LOGD("[Recorder ERROR] Fail to unset state changed callback : %d", ret);
+               }
+
+               ret = audio_in_destroy(g_audio_in);
+               if (AUDIO_IO_ERROR_NONE != ret) {
+                       LOGD("[Recorder ERROR] Fail to destroy audio : %d", ret);
+               }
+               g_audio_in = NULL;
+       }
+}
+
+static void recorder_thread_func()
+{
+       const int FRAME_LENGTH = 160;
+       const int BUFFER_LENGTH = FRAME_LENGTH * 2;
+
+       static int buffer_count = 0;
+
+       while (!(g_stop_recorder_thread.load())) {
+               unsigned char buffer[BUFFER_LENGTH];
+               memset(buffer, '\0', BUFFER_LENGTH);
+
+               int read_bytes = audio_in_read(g_audio_in, buffer, BUFFER_LENGTH);
+               if (0 > read_bytes) {
+                       LOGE("[Recorder WARNING] Fail to read audio : %d", read_bytes);
+                       break;
+               }
+
+               g_proxy_interface.feed_audio_data(MAS_SPEECH_STREAMING_EVENT_CONTINUE,
+                       buffer, read_bytes);
+
+               /* Audio read log */
+               if (0 == buffer_count % 300) {
+                       LOGD("[Recorder][%d] Recording... : read_size(%d)", buffer_count, read_bytes);
+               }
+
+               buffer_count++;
+       }
+}
+
+void dependency_default_audio_start_recording()
+{
+       if (g_audio_in) {
+               int ret = AUDIO_IO_ERROR_NONE;
+               if (AUDIO_IO_STATE_RUNNING != g_audio_io_state) {
+                       ret = audio_in_resume(g_audio_in);
+               }
+               if (AUDIO_IO_ERROR_NONE != ret) {
+                       LOGD("[Recorder ERROR] Fail to resume audio in : %d", ret);
+               }
+               g_stop_recorder_thread.store(false);
+               LOGD("Starting recorder thread");
+               g_recorder_thread = thread(recorder_thread_func);
+       }
+}
+
+void dependency_default_audio_stop_recording()
+{
+       if (g_recorder_thread.joinable()) {
+               LOGD("g_recorder_thread is joinable, trying join()");
+               g_stop_recorder_thread.store(true);
+               g_recorder_thread.join();
+       }
+       if (g_audio_in) {
+               int ret = AUDIO_IO_ERROR_NONE;
+               if (AUDIO_IO_STATE_RUNNING == g_audio_io_state) {
+                       ret = audio_in_pause(g_audio_in);
+               }
+               if (AUDIO_IO_ERROR_NONE != ret) {
+                       LOGD("[Recorder ERROR] Fail to pause audio in : %d", ret);
+               }
+       }
+}
+
+void dependency_default_audio_set_recording_session(unsigned int session)
+{
+       LOGD("Current recording session : [%s]",
+               (MAS_RECORDING_SESSION_WAKE_WORD == session) ? "wake word detecting" :
+               (MAS_RECORDING_SESSION_UTTERANCE == session) ? "utterance recording" :
+               (MAS_RECORDING_SESSION_FOLLOW_UP == session) ? "follow-up speech recording" :
+               "ERROR - Invalid recording session information"
+       );
+}
+
+void dependency_default_audio_voice_key_pressed_set(bool pressed)
+{
+       g_voice_key_pressed = pressed;
+}
+
+void dependency_default_audio_set_background_volume(double ratio)
+{
+       LOGD("[ENTER]");
+       int ret;
+
+       if (ratio >= 0.5) {
+               if (g_virtual_sound_stream) {
+                       ret = sound_manager_stop_virtual_stream(g_virtual_sound_stream);
+                       if (0 != ret) {
+                                       LOGD("[Audio ERROR] Fail to stop virtual stream, ret(%d)", ret);
+                       }
+                       ret = sound_manager_destroy_virtual_stream(g_virtual_sound_stream);
+                       if (0 != ret) {
+                                       LOGD("[Audio ERROR] Fail to destroy virtual stream, ret(%d)", ret);
+                                       return;
+                       }
+                       g_virtual_sound_stream = NULL;
+               }
+
+               if (g_volume_stream) {
+                       ret = sound_manager_destroy_stream_information(g_volume_stream);
+                       if (0 != ret) {
+                                       LOGD("[Audio ERROR] Fail to destroy stream information, ret(%d)", ret);
+                                       return;
+                       }
+                       g_volume_stream = NULL;
+               }
+       } else {
+               if (!g_volume_stream) {
+                       ret = sound_manager_create_stream_information_internal(SOUND_STREAM_TYPE_VOICE_RECOGNITION_SERVICE, NULL, NULL, &g_volume_stream);
+                       if (0 != ret) {
+                               LOGD("[Audio] Fail to create stream information, ret(%d)", ret);
+                               return;
+                       }
+               }
+
+               if (!g_virtual_sound_stream) {
+                       ret = sound_manager_create_virtual_stream(g_volume_stream, &g_virtual_sound_stream);
+                       if (0 != ret) {
+                               LOGD("[Audio ERROR] Fail to create virtual stream, ret(%d)", ret);
+                               return;
+                       }
+               }
+               if (g_virtual_sound_stream) {
+                       ret = sound_manager_start_virtual_stream(g_virtual_sound_stream);
+                       if (0 != ret) {
+                               LOGD("[Audio ERROR] Fail to start virtual stream, ret(%d)", ret);
+                               return;
+                       }
+               }
+       }
+       LOGD("[EXIT]");
+}
+
+void dependency_default_audio_get_audio_format(int* rate, int* channel, int* audio_type)
+{
+       if (!audio_type || !rate || !channel) {
+               return;
+       }
+       *rate = 16000;
+       *channel = 0;
+       *audio_type = 0;
+}
+
+void dependency_default_audio_get_audio_source_type(char** type)
+{
+       static char source_type[] = "default_audio";
+       if (!type) {
+               return;
+       }
+       *type = source_type;
+}
diff --git a/plugins/dependency-default/src/dependency_default_button.cpp b/plugins/dependency-default/src/dependency_default_button.cpp
new file mode 100644 (file)
index 0000000..0b0c856
--- /dev/null
@@ -0,0 +1,167 @@
+#include "dependency_default_button.h"
+
+#include <chrono>
+
+using namespace std;
+
+#define EFL_BETA_API_SUPPORT
+
+#include <dlog.h>
+#include <Ecore.h>
+#include <Ecore_Input.h>
+#include <Ecore_Wl2.h>
+
+static mas_dependency_plugin_proxy_interface g_proxy_interface;
+
+static Ecore_Event_Handler* g_key_down_handler = NULL;
+static Ecore_Event_Handler* g_key_up_handler = NULL;
+
+static Ecore_Wl2_Display *g_ecore_wl2_display = NULL;
+
+static chrono::time_point<chrono::system_clock> g_last_key_pressed;
+static bool g_voice_key_pressed = false;
+const float DEFAULT_KEY_TAP_DURATION = 0.3f * 1000;
+static float g_voice_key_tap_duration = DEFAULT_KEY_TAP_DURATION;
+
+#define VOICE_KEY "XF86AudioPlayPause"
+
+static Eina_Bool _key_down_cb(void* data, int type, void* event)
+{
+       Ecore_Event_Key *ev = (Ecore_Event_Key *) event;
+       if (ev) {
+               LOGD("KEY[%s], type[%d]", ev->keyname, type);
+
+               if (ev->keyname && strncmp(ev->keyname, VOICE_KEY, strlen(VOICE_KEY)) == 0 ) {
+                       chrono::time_point<chrono::system_clock> current_time_point;
+                       current_time_point = chrono::system_clock::now();
+                       auto diff = current_time_point - g_last_key_pressed;
+                       auto milliseconds = chrono::duration_cast<chrono::milliseconds>(diff).count();
+                       /* If double click detected within 500 msec */
+                       if (milliseconds < 500) {
+                               if (g_proxy_interface.process_event) {
+                                       g_proxy_interface.process_event(MAS_PLUGIN_EVENT_VOICE_KEY_PRESSED, NULL, 0);
+                                       g_voice_key_pressed = true;
+                               }
+                       }
+                       g_last_key_pressed = current_time_point;
+               }
+       }
+
+       return ECORE_CALLBACK_DONE;
+}
+
+static Eina_Bool _key_up_cb(void* data, int type, void* event)
+{
+       Ecore_Event_Key *ev = (Ecore_Event_Key *) event;
+       if (ev) {
+               LOGD("KEY[%s], type[%d]", ev->keyname, type);
+
+               if (g_voice_key_pressed &&
+                       ev->keyname && strncmp(ev->keyname, VOICE_KEY, strlen(VOICE_KEY)) == 0) {
+                       chrono::time_point<chrono::system_clock> current_time_point;
+                       current_time_point = chrono::system_clock::now();
+                       auto diff = current_time_point - g_last_key_pressed;
+                       long long int milliseconds = chrono::duration_cast<chrono::milliseconds>(diff).count();
+                       LOGD("milliseconds : %lld", milliseconds);
+                       mas_plugin_event_e plugin_event;
+                       if (milliseconds < g_voice_key_tap_duration) {
+                               plugin_event = MAS_PLUGIN_EVENT_VOICE_KEY_RELEASED_AFTER_TAP;
+                       } else {
+                               plugin_event = MAS_PLUGIN_EVENT_VOICE_KEY_RELEASED_AFTER_PUSH;
+                       }
+                       if (g_proxy_interface.process_event) {
+                               g_proxy_interface.process_event(plugin_event, NULL, 0);
+                       }
+               }
+       }
+       return ECORE_CALLBACK_DONE;
+}
+
+static bool _grab_voice_key(void)
+{
+       Eina_Bool ret = true;
+       ret = ecore_wl2_window_keygrab_set(NULL, VOICE_KEY,  0, 0,  0, ECORE_WL2_WINDOW_KEYGRAB_SHARED);
+       LOGD("ecore_wl2_window_keygrab_set ret[%d] [%s]", ret, VOICE_KEY);
+
+       return ret;
+}
+
+static bool _ungrab_voice_key(void)
+{
+       Eina_Bool ret = true;
+       ret = ecore_wl2_window_keygrab_unset(NULL,  VOICE_KEY,  0, 0);
+       LOGD("ecore_wl2_window_keygrab_unset ret[%d] [%s]", ret, VOICE_KEY);
+
+       return ret;
+}
+
+static bool _add_key_cb()
+{
+       if (g_key_down_handler == NULL) {
+               LOGE("_key_down_handler");
+               g_key_down_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _key_down_cb, NULL);
+               if(g_key_down_handler == NULL) {
+                       LOGE("_key_down_handler == NULL ");
+               }
+       }
+
+       if (g_key_up_handler == NULL) {
+               LOGE("_key_down_handler");
+               g_key_up_handler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, _key_up_cb, NULL);
+               if(g_key_up_handler == NULL) {
+                       LOGE("_key_up_handler == NULL ");
+               }
+       }
+       return true;
+}
+
+static bool _delete_key_cb(void)
+{
+       LOGE("start");
+       if (NULL != g_key_down_handler) {
+               ecore_event_handler_del(g_key_down_handler);
+               g_key_down_handler = NULL;
+       }
+
+       if (NULL != g_key_up_handler) {
+               ecore_event_handler_del(g_key_up_handler);
+               g_key_up_handler = NULL;
+       }
+       LOGE("end");
+       return true;
+}
+
+void dependency_default_button_initialize(mas_dependency_plugin_proxy_interface interface)
+{
+       g_proxy_interface = interface;
+
+       Eina_Bool ret = ecore_wl2_init();
+       LOGD("ecore_wl2_init: %d", ret);
+
+       g_ecore_wl2_display = ecore_wl2_display_connect(NULL);
+       LOGD("g_ecore_wl2_display: %p", g_ecore_wl2_display);
+
+       g_last_key_pressed = chrono::system_clock::now();
+       _grab_voice_key();
+       _add_key_cb();
+}
+
+void dependency_default_button_deinitialize()
+{
+       if (g_ecore_wl2_display) {
+               ecore_wl2_display_disconnect(g_ecore_wl2_display);
+               g_ecore_wl2_display = NULL;
+       }
+       _delete_key_cb();
+       _ungrab_voice_key();
+}
+
+void dependency_default_button_set_voice_key_tap_duration(float duration)
+{
+       g_voice_key_tap_duration = duration * 1000.0f; // in milliseconds
+}
+
+void dependency_default_button_unset_voice_key_tap_duration(void)
+{
+       g_voice_key_tap_duration = DEFAULT_KEY_TAP_DURATION;
+}
diff --git a/plugins/wakeup-manager/CMakeLists.txt b/plugins/wakeup-manager/CMakeLists.txt
deleted file mode 100644 (file)
index 170bc35..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
-PROJECT(ma-wakeup-manager)
-
-SET(PREFIX ${CMAKE_INSTALL_PREFIX})
-SET(PACKAGE ${PROJECT_NAME})
-
-SET(CMAKE_SKIP_BUILD_RPATH TRUE)
-
-INCLUDE_DIRECTORIES(
-       ${CMAKE_SOURCE_DIR}/inc
-       ./inc
-       )
-
-SET(WMPKG_CHECK_MODULES
-       ecore
-       dlog
-       capi-appfw-preference
-       capi-media-audio-io
-       capi-media-sound-manager
-       eina
-       vconf
-       pkgmgr-info
-       multi-assistant
-       jsoncpp
-)
-
-INCLUDE(FindPkgConfig)
-pkg_check_modules(wmpkgs REQUIRED ${WMPKG_CHECK_MODULES})
-MESSAGE("Modules : ${WMPKG_CHECK_MODULES}")
-
-IF("${CMAKE_BUILD_TYPE}" STREQUAL "")
-        SET(CMAKE_BUILD_TYPE "Release")
-ENDIF("${CMAKE_BUILD_TYPE}" STREQUAL "")
-MESSAGE("Build type: ${CMAKE_BUILD_TYPE}")
-
-ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"")
-ADD_DEFINITIONS("-DPACKAGE=\"${PACKAGE}\"")
-
-SET(SRCS
-       src/wakeup_manager.cpp
-       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
-       src/dependency_resolver.cpp
-       src/heap_tracer.cpp
-       src/assistant_config_manager.cpp
-)
-
-FOREACH(flag ${wmpkgs_CFLAGS})
-       SET(EXTRA_CXXFLAGS "${EXTRA_CXXFLAGS} ${flag}")
-ENDFOREACH(flag)
-
-
-
-SET(EXTRA_CXXFLAGS  "${EXTRA_CXXFLAGS} -fPIC -Wall" )
-SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXXFLAGS} -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wl,-z,relro -fPIC -std=c++11 -fvisibility=hidden")
-SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
-
-ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS} )
-
-# Install libraries
-TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${wmpkgs_LDFLAGS} -ldl ${EXTRA_LDFLAGS})
-MESSAGE("LDFLAG : ${wmpkgs_LDFLAGS}")
-INSTALL(FILES ${CMAKE_SOURCE_DIR}/plugins/wakeup-manager/libma-wakeup-manager.so DESTINATION ${TZ_SYS_RO_SHARE}/multiassistant/)
-
-ADD_SUBDIRECTORY(dependency-default)
diff --git a/plugins/wakeup-manager/dependency-default/CMakeLists.txt b/plugins/wakeup-manager/dependency-default/CMakeLists.txt
deleted file mode 100644 (file)
index 3ea2a08..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
-PROJECT(ma-dependency-default)
-
-SET(PREFIX ${CMAKE_INSTALL_PREFIX})
-SET(PACKAGE ${PROJECT_NAME})
-
-SET(CMAKE_SKIP_BUILD_RPATH TRUE)
-
-INCLUDE_DIRECTORIES(
-       ${CMAKE_SOURCE_DIR}/inc
-       ./inc
-       )
-
-SET(DDPKG_CHECK_MODULES
-       ecore
-       ecore-wl2
-       dlog
-       capi-media-audio-io
-       capi-media-sound-manager
-       eina
-       vconf
-       pkgmgr-info
-       multi-assistant
-)
-
-INCLUDE(FindPkgConfig)
-pkg_check_modules(ddpkgs REQUIRED ${DDPKG_CHECK_MODULES})
-MESSAGE("Modules : ${DDPKG_CHECK_MODULES}")
-
-IF("${CMAKE_BUILD_TYPE}" STREQUAL "")
-        SET(CMAKE_BUILD_TYPE "Release")
-ENDIF("${CMAKE_BUILD_TYPE}" STREQUAL "")
-MESSAGE("Build type: ${CMAKE_BUILD_TYPE}")
-
-ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"")
-ADD_DEFINITIONS("-DPACKAGE=\"${PACKAGE}\"")
-
-SET(SRCS
-       src/dependency_default.cpp
-       src/dependency_default_audio.cpp
-       src/dependency_default_button.cpp
-)
-
-FOREACH(flag ${ddpkgs_CFLAGS})
-       SET(EXTRA_CXXFLAGS "${EXTRA_CXXFLAGS} ${flag}")
-ENDFOREACH(flag)
-
-
-
-SET(EXTRA_CXXFLAGS  "${EXTRA_CXXFLAGS} -fPIC -Wall" )
-SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXXFLAGS} -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wl,-z,relro -fPIC -std=c++11 -fvisibility=hidden")
-SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
-
-ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS} )
-
-# Install libraries
-TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${ddpkgs_LDFLAGS} -ldl ${EXTRA_LDFLAGS})
-MESSAGE("LDFLAG : ${ddpkgs_LDFLAGS}")
-INSTALL(FILES ${CMAKE_SOURCE_DIR}/plugins/wakeup-manager/dependency-default/lib${PACKAGE}.so DESTINATION ${TZ_SYS_RO_SHARE}/multiassistant/)
diff --git a/plugins/wakeup-manager/dependency-default/inc/dependency_default.h b/plugins/wakeup-manager/dependency-default/inc/dependency_default.h
deleted file mode 100644 (file)
index e053dd4..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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 _DEPENDENCY_DEFAULT_H_
-#define _DEPENDENCY_DEFAULT_H_
-
-#include <tizen.h>
-
-#include <multi_assistant_service.h>
-
-#ifndef LOG_TAG
-#define LOG_TAG "dependency_default"
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-EXPORT_API int mas_dependency_initialize(mas_dependency_plugin_proxy_interface interfaces, int *dependency_version);
-EXPORT_API int mas_dependency_deinitialize(void);
-EXPORT_API int mas_dependency_set_error_callback(mas_error_cb callback, void* user_data);
-EXPORT_API int mas_dependency_start_recording(void);
-EXPORT_API int mas_dependency_stop_recording(void);
-EXPORT_API int mas_dependency_set_recording_session(unsigned int session);
-EXPORT_API int mas_dependency_set_background_volume(double ratio);
-EXPORT_API int mas_dependency_get_audio_format(int* rate, int* channel, int* audio_type);
-EXPORT_API int mas_dependency_get_audio_source_type(char** type);
-EXPORT_API int mas_dependency_process_wakeup_engine_command(const char* engine_name, const char* command);
-EXPORT_API int mas_dependency_set_voice_key_tap_duration(float duration);
-EXPORT_API int mas_dependency_unset_voice_key_tap_duration(void);
-EXPORT_API int mas_dependency_set_voice_key_support_mode(const char* support_mode);
-EXPORT_API int mas_dependency_get_custom_vconf_key(const char* default_key, char** custom_key);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _DEPENDENCY_DEFAULT_H_ */
diff --git a/plugins/wakeup-manager/dependency-default/inc/dependency_default_audio.h b/plugins/wakeup-manager/dependency-default/inc/dependency_default_audio.h
deleted file mode 100644 (file)
index d9f402e..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * 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 _DEPENDENCY_DEFAULT_AUDIO_H_
-#define _DEPENDENCY_DEFAULT_AUDIO_H_
-
-#include "dependency_default.h"
-
-void dependency_default_audio_initialize(mas_dependency_plugin_proxy_interface  interface);
-void dependency_default_audio_deinitialize();
-
-void dependency_default_audio_start_recording();
-void dependency_default_audio_stop_recording();
-
-void dependency_default_audio_set_recording_session(unsigned int session);
-
-void dependency_default_audio_voice_key_pressed_set(bool pressed);
-
-void dependency_default_audio_set_background_volume(double ratio);
-
-void dependency_default_audio_get_audio_format(int* rate, int* channel, int* audio_type);
-void dependency_default_audio_get_audio_source_type(char** type);
-
-#endif //_DEPENDENCY_DEFAULT_AUDIO_H_
diff --git a/plugins/wakeup-manager/dependency-default/inc/dependency_default_button.h b/plugins/wakeup-manager/dependency-default/inc/dependency_default_button.h
deleted file mode 100644 (file)
index aa50c94..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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 _DEPENDENCY_DEFAULT_BUTTON_H_
-#define _DEPENDENCY_DEFAULT_BUTTON_H_
-
-#include "dependency_default.h"
-
-void dependency_default_button_initialize(mas_dependency_plugin_proxy_interface interface);
-void dependency_default_button_deinitialize();
-void dependency_default_button_set_voice_key_tap_duration(float duration);
-void dependency_default_button_unset_voice_key_tap_duration(void);
-
-#endif //_DEPENDENCY_DEFAULT_BUTTON_H_
diff --git a/plugins/wakeup-manager/dependency-default/src/dependency_default.cpp b/plugins/wakeup-manager/dependency-default/src/dependency_default.cpp
deleted file mode 100644 (file)
index b5496f9..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-#include "dependency_default.h"
-#include "dependency_default_audio.h"
-#include "dependency_default_button.h"
-
-#include <dlog.h>
-#include <service_app_extension.h>
-
-#include <thread>
-
-static mas_dependency_plugin_proxy_interface g_proxy_interface;
-const int g_dependency_version = 1;
-
-static bool g_should_exit = false;
-
-int mas_dependency_initialize(mas_dependency_plugin_proxy_interface interface, int *dependency_version)
-{
-       g_proxy_interface = interface;
-
-       dependency_default_audio_initialize(interface);
-       dependency_default_button_initialize(interface);
-
-       if (dependency_version) {
-               *dependency_version = g_dependency_version;
-       }
-
-       /* If the service process has to terminate in certain circumstances,
-               set g_should_exit variable to true as below. */
-       // g_should_exit = true;
-
-       if (g_should_exit) {
-               LOGE("g_should_exit value contains positive value, registering timer");
-               std::thread([]() {
-                       std::this_thread::sleep_for(std::chrono::milliseconds(1000));
-                       LOGE("Now trying to exit");
-                       mas_dependency_deinitialize();
-                       service_app_exit_without_restart();
-               }).detach();
-       }
-
-       return 0;
-}
-
-int mas_dependency_deinitialize(void)
-{
-       dependency_default_audio_deinitialize();
-       dependency_default_button_deinitialize();
-
-       return 0;
-}
-
-int mas_dependency_set_error_callback(mas_error_cb callback, void* user_data)
-{
-       return 0;
-}
-
-int mas_dependency_start_recording(void)
-{
-       dependency_default_audio_start_recording();
-       return 0;
-}
-
-int mas_dependency_stop_recording(void)
-{
-       dependency_default_audio_stop_recording();
-       return 0;
-}
-
-int mas_dependency_set_recording_session(unsigned int session)
-{
-       dependency_default_audio_set_recording_session(session);
-       return 0;
-}
-
-int mas_dependency_set_background_volume(double ratio)
-{
-       dependency_default_audio_set_background_volume(ratio);
-       return 0;
-}
-
-int mas_dependency_get_audio_format(int* rate, int* channel, int* audio_type)
-{
-       dependency_default_audio_get_audio_format(rate, channel, audio_type);
-       return 0;
-}
-
-int mas_dependency_get_audio_source_type(char** type)
-{
-       dependency_default_audio_get_audio_source_type(type);
-       return 0;
-}
-
-int mas_dependency_process_wakeup_engine_command(const char* engine_name, const char* command)
-{
-       LOGD("Wakeup Engine %s has sent a command : %s", engine_name, command);
-       return 0;
-}
-
-int mas_dependency_set_voice_key_tap_duration(float duration)
-{
-       dependency_default_button_set_voice_key_tap_duration(duration);
-       return 0;
-}
-
-int mas_dependency_unset_voice_key_tap_duration(void)
-{
-       dependency_default_button_unset_voice_key_tap_duration();
-       return 0;
-}
-
-int mas_dependency_set_voice_key_support_mode(const char* support_mode)
-{
-       LOGD("support_mode : %s", support_mode);
-       return 0;
-}
-
-int mas_dependency_get_custom_vconf_key(const char* default_key, char** custom_key)
-{
-       return 0;
-}
\ No newline at end of file
diff --git a/plugins/wakeup-manager/dependency-default/src/dependency_default_audio.cpp b/plugins/wakeup-manager/dependency-default/src/dependency_default_audio.cpp
deleted file mode 100644 (file)
index 78b5195..0000000
+++ /dev/null
@@ -1,410 +0,0 @@
-#include "dependency_default_audio.h"
-
-static bool g_voice_key_pressed = false;
-static mas_dependency_plugin_proxy_interface g_proxy_interface;
-
-#include <stdlib.h>
-#include <thread>
-#include <atomic>
-#include <chrono>
-
-#include <dlog.h>
-#include <audio_io.h>
-#include <sound_manager.h>
-#include <sound_manager_internal.h>
-
-using namespace std;
-
-static audio_in_h g_audio_in = NULL;
-static audio_io_state_e g_audio_io_state = AUDIO_IO_STATE_IDLE;
-
-static sound_stream_info_h g_volume_stream = NULL;
-static virtual_sound_stream_h g_virtual_sound_stream = NULL;
-
-static int g_device_id = -1;
-static sound_stream_info_h g_stream_info = NULL;
-
-static thread g_recorder_thread;
-static atomic_bool g_stop_recorder_thread{false};
-
-static long long get_current_milliseconds_after_epoch()
-{
-       auto now = chrono::steady_clock::now();
-       auto now_ms = chrono::time_point_cast<chrono::milliseconds>(now);
-       /* number of milliseconds since the epoch of system_clock */
-       auto value = now_ms.time_since_epoch();
-
-       return value.count();
-}
-
-static int _apply_device_for_stream_routing(void *user_data)
-{
-       sound_device_list_h deviceList = NULL;
-       sound_device_h device = NULL;
-       sound_device_type_e type;
-       sound_device_io_direction_e ioDirection;
-
-       if (0 != sound_manager_get_device_list(SOUND_DEVICE_IO_DIRECTION_IN_MASK, &deviceList)) {
-               LOGE("[Recorder ERROR] Fail to get current device list");
-               return -1;
-       }
-
-       bool isFound = false;
-       while (0 == sound_manager_get_next_device(deviceList, &device)) {
-               if (0 != sound_manager_get_device_type(device, &type)) {
-                       LOGE("[Recorder ERROR] Fail to get device type");
-                       continue;
-               }
-               if (0 != sound_manager_get_device_io_direction(device, &ioDirection)) {
-                       LOGE("[Recorder ERROR] Fail to get device io direction");
-                       continue;
-               }
-
-               if (SOUND_DEVICE_USB_AUDIO == type && SOUND_DEVICE_IO_DIRECTION_IN == ioDirection) {
-                       if (0 != sound_manager_add_device_for_stream_routing(g_stream_info, device)) {
-                               LOGE("[Recorder ERROR] Fail to add device");
-                               continue;
-                       }
-                       if (0 != sound_manager_apply_stream_routing(g_stream_info)) {
-                               LOGE("[Recorder ERROR] Fail to apply stream routing");
-                               continue;
-                       }
-                       isFound = true;
-                       break;
-               }
-       }
-
-       sound_manager_free_device_list(deviceList);
-       deviceList = NULL;
-
-       if (true != isFound) {
-               LOGI("[Recorder] No USB device");
-       } else {
-               LOGD("[Recorder] Apply device for stream routing");
-       }
-       return 0;
-}
-
-static void _device_connection_changed_cb(sound_device_h device, bool isConnected, void *user_data)
-{
-       sound_device_type_e type;
-       if (isConnected) {
-               if (0 != sound_manager_get_device_type(device, &type)) {
-                       LOGE("[Recorder ERROR] Fail to get device type");
-                       return;
-               }
-               if (type == SOUND_DEVICE_USB_AUDIO) {
-                       if (0 != sound_manager_remove_device_for_stream_routing(g_stream_info, device))
-                               LOGE("[Recorder ERROR] Fail to remove device");
-
-                       if (0 != sound_manager_add_device_for_stream_routing(g_stream_info, device)) {
-                               LOGE("[Recorder ERROR] Fail to add device");
-                               return;
-                       }
-                       if (0 != sound_manager_apply_stream_routing(g_stream_info)) {
-                               LOGE("[Recorder ERROR} Fail to apply stream routing");
-                               return;
-                       }
-                       LOGD("[Recorder] Apply device for stream routing");
-               }
-       }
-       return;
-}
-
-static void _audio_in_state_changed_cb(audio_in_h handle, audio_io_state_e previous, audio_io_state_e current, bool by_policy, void *user_data)
-{
-       if (handle == g_audio_in) {
-               g_audio_io_state = current;
-       }
-}
-
-void dependency_default_audio_initialize(mas_dependency_plugin_proxy_interface interfaces)
-{
-       const int rate = 16000;
-       const audio_channel_e channel = AUDIO_CHANNEL_MONO;
-       const audio_sample_type_e type = AUDIO_SAMPLE_TYPE_S16_LE;
-
-       g_proxy_interface = interfaces;
-
-       int ret = audio_in_create(rate, channel, type, &g_audio_in);
-       if (AUDIO_IO_ERROR_NONE != ret) {
-               LOGE("[Recorder ERROR] Rate(%d) Channel(%d) Type(%d)", rate, channel, type);
-               LOGE("[Recorder ERROR] Fail to create audio handle : %d", ret);
-               return;
-       }
-
-       ret = sound_manager_add_device_connection_changed_cb(SOUND_DEVICE_IO_DIRECTION_IN_MASK, _device_connection_changed_cb, NULL, &g_device_id);
-       if (0 != ret) {
-               LOGE("[Recorder ERROR] Fail to add device connection changed callback");
-               audio_in_destroy(g_audio_in);
-               g_audio_in = NULL;
-               return;
-       }
-
-       ret = sound_manager_create_stream_information_internal(
-               SOUND_STREAM_TYPE_VOICE_RECOGNITION_SERVICE, NULL, NULL, &g_stream_info);
-       if (0 != ret) {
-               LOGE("[Recorder ERROR] Fail to create stream info");
-               sound_manager_remove_device_connection_changed_cb(g_device_id);
-               audio_in_destroy(g_audio_in);
-               g_audio_in = NULL;
-               return;
-       }
-
-       ret = _apply_device_for_stream_routing(NULL);
-       if (0 != ret) {
-               LOGE("[Recorder ERROR] Fail to apply device for stream routing: %d", ret);
-       }
-
-       ret = audio_in_set_state_changed_cb(g_audio_in, _audio_in_state_changed_cb, NULL);
-       if (AUDIO_IO_ERROR_NONE != ret) {
-               LOGE("[Recorder ERROR] Fail to set state changed callback : %d", ret);
-               sound_manager_remove_device_connection_changed_cb(g_device_id);
-               sound_manager_destroy_stream_information(g_stream_info);
-               g_stream_info = NULL;
-               audio_in_destroy(g_audio_in);
-               g_audio_in = NULL;
-               return;
-       }
-
-       ret = audio_in_set_sound_stream_info(g_audio_in, g_stream_info);
-       if (AUDIO_IO_ERROR_NONE != ret) {
-               LOGE("[Recorder ERROR] Fail to set stream info : %d", ret);
-               sound_manager_remove_device_connection_changed_cb(g_device_id);
-               sound_manager_destroy_stream_information(g_stream_info);
-               g_stream_info = NULL;
-               audio_in_unset_state_changed_cb(g_audio_in);
-               audio_in_destroy(g_audio_in);
-               g_audio_in = NULL;
-               return;
-       }
-
-       ret = audio_in_prepare(g_audio_in);
-       if (AUDIO_IO_ERROR_NONE != ret) {
-               if (AUDIO_IO_ERROR_SOUND_POLICY == ret)
-               {
-                       LOGE("[Recorder ERROR] Audio is busy.");
-               } else {
-                       LOGE("[Recorder ERROR] Fail to start audio : %d", ret);
-               }
-               sound_manager_remove_device_connection_changed_cb(g_device_id);
-               sound_manager_destroy_stream_information(g_stream_info);
-               g_stream_info = NULL;
-               audio_in_unset_state_changed_cb(g_audio_in);
-               audio_in_destroy(g_audio_in);
-               g_audio_in = NULL;
-               return;
-       }
-
-       ret = audio_in_pause(g_audio_in);
-       if (AUDIO_IO_ERROR_NONE != ret) {
-               LOGE("[Recorder ERROR] Fail to pause audio in : %d", ret);
-       }
-}
-
-void dependency_default_audio_deinitialize()
-{
-       dependency_default_audio_stop_recording();
-
-       int ret = 0;
-       if (g_virtual_sound_stream) {
-               sound_manager_stop_virtual_stream(g_virtual_sound_stream);
-               ret = sound_manager_destroy_virtual_stream(g_virtual_sound_stream);
-               if (0 != ret) {
-                       LOGE("[Audio ERROR] Fail to destroy virtual stream, ret(%d)", ret);
-               }
-               g_virtual_sound_stream = NULL;
-       }
-
-       if (g_device_id) {
-               ret = sound_manager_remove_device_connection_changed_cb(g_device_id);
-               if (0 != ret)
-                       LOGE("[Audio ERROR] Fail to remove device connection changed callback, ret(%d)", ret);
-       }
-
-       if (g_volume_stream) {
-               ret = sound_manager_destroy_stream_information(g_volume_stream);
-               if (0 != ret) {
-                       LOGE("[Audio ERROR] Fail to destroy stream information, ret(%d)", ret);
-               }
-               g_volume_stream = NULL;
-       }
-
-       if (g_audio_in) {
-               ret = audio_in_unprepare(g_audio_in);
-               if (AUDIO_IO_ERROR_NONE != ret) {
-                       LOGD("[Recorder ERROR] Fail to stop audio : %d", ret);
-               }
-       }
-
-       if (g_stream_info) {
-               if (0 != sound_manager_destroy_stream_information(g_stream_info)) {
-                       LOGD("[Recorder ERROR] Fail to destroy stream info");
-               }
-               g_stream_info = NULL;
-       }
-
-       if (g_audio_in) {
-               ret = audio_in_unset_state_changed_cb(g_audio_in);
-               if (AUDIO_IO_ERROR_NONE != ret) {
-                       LOGD("[Recorder ERROR] Fail to unset state changed callback : %d", ret);
-               }
-
-               ret = audio_in_destroy(g_audio_in);
-               if (AUDIO_IO_ERROR_NONE != ret) {
-                       LOGD("[Recorder ERROR] Fail to destroy audio : %d", ret);
-               }
-               g_audio_in = NULL;
-       }
-}
-
-static void recorder_thread_func()
-{
-       const int FRAME_LENGTH = 160;
-       const int BUFFER_LENGTH = FRAME_LENGTH * 2;
-
-       static int buffer_count = 0;
-
-       while (!(g_stop_recorder_thread.load())) {
-               unsigned char buffer[BUFFER_LENGTH];
-               memset(buffer, '\0', BUFFER_LENGTH);
-
-               int read_bytes = audio_in_read(g_audio_in, buffer, BUFFER_LENGTH);
-               if (0 > read_bytes) {
-                       LOGE("[Recorder WARNING] Fail to read audio : %d", read_bytes);
-                       break;
-               }
-
-               g_proxy_interface.feed_audio_data(MAS_SPEECH_STREAMING_EVENT_CONTINUE,
-                       buffer, read_bytes);
-
-               /* Audio read log */
-               if (0 == buffer_count % 300) {
-                       LOGD("[Recorder][%d] Recording... : read_size(%d)", buffer_count, read_bytes);
-               }
-
-               buffer_count++;
-       }
-}
-
-void dependency_default_audio_start_recording()
-{
-       if (g_audio_in) {
-               int ret = AUDIO_IO_ERROR_NONE;
-               if (AUDIO_IO_STATE_RUNNING != g_audio_io_state) {
-                       ret = audio_in_resume(g_audio_in);
-               }
-               if (AUDIO_IO_ERROR_NONE != ret) {
-                       LOGD("[Recorder ERROR] Fail to resume audio in : %d", ret);
-               }
-               g_stop_recorder_thread.store(false);
-               LOGD("Starting recorder thread");
-               g_recorder_thread = thread(recorder_thread_func);
-       }
-}
-
-void dependency_default_audio_stop_recording()
-{
-       if (g_recorder_thread.joinable()) {
-               LOGD("g_recorder_thread is joinable, trying join()");
-               g_stop_recorder_thread.store(true);
-               g_recorder_thread.join();
-       }
-       if (g_audio_in) {
-               int ret = AUDIO_IO_ERROR_NONE;
-               if (AUDIO_IO_STATE_RUNNING == g_audio_io_state) {
-                       ret = audio_in_pause(g_audio_in);
-               }
-               if (AUDIO_IO_ERROR_NONE != ret) {
-                       LOGD("[Recorder ERROR] Fail to pause audio in : %d", ret);
-               }
-       }
-}
-
-void dependency_default_audio_set_recording_session(unsigned int session)
-{
-       LOGD("Current recording session : [%s]",
-               (MAS_RECORDING_SESSION_WAKE_WORD == session) ? "wake word detecting" :
-               (MAS_RECORDING_SESSION_UTTERANCE == session) ? "utterance recording" :
-               (MAS_RECORDING_SESSION_FOLLOW_UP == session) ? "follow-up speech recording" :
-               "ERROR - Invalid recording session information"
-       );
-}
-
-void dependency_default_audio_voice_key_pressed_set(bool pressed)
-{
-       g_voice_key_pressed = pressed;
-}
-
-void dependency_default_audio_set_background_volume(double ratio)
-{
-       LOGD("[ENTER]");
-       int ret;
-
-       if (ratio >= 0.5) {
-               if (g_virtual_sound_stream) {
-                       ret = sound_manager_stop_virtual_stream(g_virtual_sound_stream);
-                       if (0 != ret) {
-                                       LOGD("[Audio ERROR] Fail to stop virtual stream, ret(%d)", ret);
-                       }
-                       ret = sound_manager_destroy_virtual_stream(g_virtual_sound_stream);
-                       if (0 != ret) {
-                                       LOGD("[Audio ERROR] Fail to destroy virtual stream, ret(%d)", ret);
-                                       return;
-                       }
-                       g_virtual_sound_stream = NULL;
-               }
-
-               if (g_volume_stream) {
-                       ret = sound_manager_destroy_stream_information(g_volume_stream);
-                       if (0 != ret) {
-                                       LOGD("[Audio ERROR] Fail to destroy stream information, ret(%d)", ret);
-                                       return;
-                       }
-                       g_volume_stream = NULL;
-               }
-       } else {
-               if (!g_volume_stream) {
-                       ret = sound_manager_create_stream_information_internal(SOUND_STREAM_TYPE_VOICE_RECOGNITION_SERVICE, NULL, NULL, &g_volume_stream);
-                       if (0 != ret) {
-                               LOGD("[Audio] Fail to create stream information, ret(%d)", ret);
-                               return;
-                       }
-               }
-
-               if (!g_virtual_sound_stream) {
-                       ret = sound_manager_create_virtual_stream(g_volume_stream, &g_virtual_sound_stream);
-                       if (0 != ret) {
-                               LOGD("[Audio ERROR] Fail to create virtual stream, ret(%d)", ret);
-                               return;
-                       }
-               }
-               if (g_virtual_sound_stream) {
-                       ret = sound_manager_start_virtual_stream(g_virtual_sound_stream);
-                       if (0 != ret) {
-                               LOGD("[Audio ERROR] Fail to start virtual stream, ret(%d)", ret);
-                               return;
-                       }
-               }
-       }
-       LOGD("[EXIT]");
-}
-
-void dependency_default_audio_get_audio_format(int* rate, int* channel, int* audio_type)
-{
-       if (!audio_type || !rate || !channel) {
-               return;
-       }
-       *rate = 16000;
-       *channel = 0;
-       *audio_type = 0;
-}
-
-void dependency_default_audio_get_audio_source_type(char** type)
-{
-       static char source_type[] = "default_audio";
-       if (!type) {
-               return;
-       }
-       *type = source_type;
-}
diff --git a/plugins/wakeup-manager/dependency-default/src/dependency_default_button.cpp b/plugins/wakeup-manager/dependency-default/src/dependency_default_button.cpp
deleted file mode 100644 (file)
index 0b0c856..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
-#include "dependency_default_button.h"
-
-#include <chrono>
-
-using namespace std;
-
-#define EFL_BETA_API_SUPPORT
-
-#include <dlog.h>
-#include <Ecore.h>
-#include <Ecore_Input.h>
-#include <Ecore_Wl2.h>
-
-static mas_dependency_plugin_proxy_interface g_proxy_interface;
-
-static Ecore_Event_Handler* g_key_down_handler = NULL;
-static Ecore_Event_Handler* g_key_up_handler = NULL;
-
-static Ecore_Wl2_Display *g_ecore_wl2_display = NULL;
-
-static chrono::time_point<chrono::system_clock> g_last_key_pressed;
-static bool g_voice_key_pressed = false;
-const float DEFAULT_KEY_TAP_DURATION = 0.3f * 1000;
-static float g_voice_key_tap_duration = DEFAULT_KEY_TAP_DURATION;
-
-#define VOICE_KEY "XF86AudioPlayPause"
-
-static Eina_Bool _key_down_cb(void* data, int type, void* event)
-{
-       Ecore_Event_Key *ev = (Ecore_Event_Key *) event;
-       if (ev) {
-               LOGD("KEY[%s], type[%d]", ev->keyname, type);
-
-               if (ev->keyname && strncmp(ev->keyname, VOICE_KEY, strlen(VOICE_KEY)) == 0 ) {
-                       chrono::time_point<chrono::system_clock> current_time_point;
-                       current_time_point = chrono::system_clock::now();
-                       auto diff = current_time_point - g_last_key_pressed;
-                       auto milliseconds = chrono::duration_cast<chrono::milliseconds>(diff).count();
-                       /* If double click detected within 500 msec */
-                       if (milliseconds < 500) {
-                               if (g_proxy_interface.process_event) {
-                                       g_proxy_interface.process_event(MAS_PLUGIN_EVENT_VOICE_KEY_PRESSED, NULL, 0);
-                                       g_voice_key_pressed = true;
-                               }
-                       }
-                       g_last_key_pressed = current_time_point;
-               }
-       }
-
-       return ECORE_CALLBACK_DONE;
-}
-
-static Eina_Bool _key_up_cb(void* data, int type, void* event)
-{
-       Ecore_Event_Key *ev = (Ecore_Event_Key *) event;
-       if (ev) {
-               LOGD("KEY[%s], type[%d]", ev->keyname, type);
-
-               if (g_voice_key_pressed &&
-                       ev->keyname && strncmp(ev->keyname, VOICE_KEY, strlen(VOICE_KEY)) == 0) {
-                       chrono::time_point<chrono::system_clock> current_time_point;
-                       current_time_point = chrono::system_clock::now();
-                       auto diff = current_time_point - g_last_key_pressed;
-                       long long int milliseconds = chrono::duration_cast<chrono::milliseconds>(diff).count();
-                       LOGD("milliseconds : %lld", milliseconds);
-                       mas_plugin_event_e plugin_event;
-                       if (milliseconds < g_voice_key_tap_duration) {
-                               plugin_event = MAS_PLUGIN_EVENT_VOICE_KEY_RELEASED_AFTER_TAP;
-                       } else {
-                               plugin_event = MAS_PLUGIN_EVENT_VOICE_KEY_RELEASED_AFTER_PUSH;
-                       }
-                       if (g_proxy_interface.process_event) {
-                               g_proxy_interface.process_event(plugin_event, NULL, 0);
-                       }
-               }
-       }
-       return ECORE_CALLBACK_DONE;
-}
-
-static bool _grab_voice_key(void)
-{
-       Eina_Bool ret = true;
-       ret = ecore_wl2_window_keygrab_set(NULL, VOICE_KEY,  0, 0,  0, ECORE_WL2_WINDOW_KEYGRAB_SHARED);
-       LOGD("ecore_wl2_window_keygrab_set ret[%d] [%s]", ret, VOICE_KEY);
-
-       return ret;
-}
-
-static bool _ungrab_voice_key(void)
-{
-       Eina_Bool ret = true;
-       ret = ecore_wl2_window_keygrab_unset(NULL,  VOICE_KEY,  0, 0);
-       LOGD("ecore_wl2_window_keygrab_unset ret[%d] [%s]", ret, VOICE_KEY);
-
-       return ret;
-}
-
-static bool _add_key_cb()
-{
-       if (g_key_down_handler == NULL) {
-               LOGE("_key_down_handler");
-               g_key_down_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _key_down_cb, NULL);
-               if(g_key_down_handler == NULL) {
-                       LOGE("_key_down_handler == NULL ");
-               }
-       }
-
-       if (g_key_up_handler == NULL) {
-               LOGE("_key_down_handler");
-               g_key_up_handler = ecore_event_handler_add(ECORE_EVENT_KEY_UP, _key_up_cb, NULL);
-               if(g_key_up_handler == NULL) {
-                       LOGE("_key_up_handler == NULL ");
-               }
-       }
-       return true;
-}
-
-static bool _delete_key_cb(void)
-{
-       LOGE("start");
-       if (NULL != g_key_down_handler) {
-               ecore_event_handler_del(g_key_down_handler);
-               g_key_down_handler = NULL;
-       }
-
-       if (NULL != g_key_up_handler) {
-               ecore_event_handler_del(g_key_up_handler);
-               g_key_up_handler = NULL;
-       }
-       LOGE("end");
-       return true;
-}
-
-void dependency_default_button_initialize(mas_dependency_plugin_proxy_interface interface)
-{
-       g_proxy_interface = interface;
-
-       Eina_Bool ret = ecore_wl2_init();
-       LOGD("ecore_wl2_init: %d", ret);
-
-       g_ecore_wl2_display = ecore_wl2_display_connect(NULL);
-       LOGD("g_ecore_wl2_display: %p", g_ecore_wl2_display);
-
-       g_last_key_pressed = chrono::system_clock::now();
-       _grab_voice_key();
-       _add_key_cb();
-}
-
-void dependency_default_button_deinitialize()
-{
-       if (g_ecore_wl2_display) {
-               ecore_wl2_display_disconnect(g_ecore_wl2_display);
-               g_ecore_wl2_display = NULL;
-       }
-       _delete_key_cb();
-       _ungrab_voice_key();
-}
-
-void dependency_default_button_set_voice_key_tap_duration(float duration)
-{
-       g_voice_key_tap_duration = duration * 1000.0f; // in milliseconds
-}
-
-void dependency_default_button_unset_voice_key_tap_duration(void)
-{
-       g_voice_key_tap_duration = DEFAULT_KEY_TAP_DURATION;
-}
diff --git a/plugins/wakeup-manager/inc/assistant_config_manager.h b/plugins/wakeup-manager/inc/assistant_config_manager.h
deleted file mode 100644 (file)
index 0dd7dda..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * 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 <string>
-#include <functional>
-
-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/dependency_resolver.h b/plugins/wakeup-manager/inc/dependency_resolver.h
deleted file mode 100644 (file)
index 0f4dbf6..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * 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 _DEPENDENCY_RESOLVER_H_
-#define _DEPENDENCY_RESOLVER_H_
-
-#include <tzplatform_config.h>
-#include <multi_assistant_service.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**************************************************************************************
- *** Definitions for dependencies
- *************************************************************************************/
-#define MAS_DEPENDENCY_DEFAULT_PATH tzplatform_mkpath(tzplatform_getid("TZ_SYS_RO_SHARE"), "multiassistant/")
-#define MAS_DEPENDENCY_DEFAULT_FILENAME "libma-dependency-default.so"
-#define MAS_DEPENDENCY_MODULE_PATH "db/multi-assistant/dependency_module_path"
-
-#define MAS_DEPENDENCY_FUNC_INITIALIZE "mas_dependency_initialize"
-typedef int (*mas_dependency_initialize)(mas_dependency_plugin_proxy_interface interface, int *dependency_version);
-#define MAS_DEPENDENCY_FUNC_DEINITIALIZE "mas_dependency_deinitialize"
-typedef int (*mas_dependency_deinitialize)(void);
-#define MAS_DEPENDENCY_FUNC_SET_ERROR_CALLBACK "mas_dependency_set_error_callback"
-typedef int (*mas_dependency_set_error_callback)(mas_error_cb callback, void* user_data);
-#define MAS_DEPENDENCY_FUNC_START_RECORDING "mas_dependency_start_recording"
-typedef int (*mas_dependency_start_recording)(void);
-#define MAS_DEPENDENCY_FUNC_STOP_RECORDING "mas_dependency_stop_recording"
-typedef int (*mas_dependency_stop_recording)(void);
-#define MAS_DEPENDENCY_FUNC_SET_RECORDING_SESSION "mas_dependency_set_recording_session"
-typedef int (*mas_dependency_set_recording_session)(unsigned int);
-#define MAS_DEPENDENCY_FUNC_SET_BACKGROUND_VOLUME "mas_dependency_set_background_volume"
-typedef int (*mas_dependency_set_background_volume)(double ratio);
-#define MAS_DEPENDENCY_FUNC_GET_AUDIO_FORMAT "mas_dependency_get_audio_format"
-typedef int (*mas_dependency_get_audio_format)(int* rate, int* channel, int* audio_type);
-#define MAS_DEPENDENCY_FUNC_GET_AUDIO_SOURCE_TYPE "mas_dependency_get_audio_source_type"
-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);
-#define MAS_DEPENDENCY_FUNC_SET_VOICE_KEY_TAP_DURATION "mas_dependency_set_voice_key_tap_duration"
-typedef int (*mas_dependency_set_voice_key_tap_duration)(float duration);
-#define MAS_DEPENDENCY_FUNC_UNSET_VOICE_KEY_TAP_DURATION "mas_dependency_unset_voice_key_tap_duration"
-typedef int (*mas_dependency_unset_voice_key_tap_duration)(void);
-#define MAS_DEPENDENCY_FUNC_SET_VOICE_KEY_SUPPORT_MODE "mas_dependency_set_voice_key_support_mode"
-typedef int (*mas_dependency_set_voice_key_support_mode)(const char* support_mode);
-#define MAS_DEPENDENCY_FUNC_GET_CUSTOM_VCONF_KEY "mas_dependency_get_custom_vconf_key"
-typedef int (*mas_dependency_get_custom_vconf_key)(const char* default_key, char** custom_key);
-
-
-typedef struct {
-       mas_dependency_initialize                                                               initialize;
-       mas_dependency_deinitialize                                                             deinitialize;
-       mas_dependency_set_error_callback                                               set_error_callback;
-       mas_dependency_start_recording                                                  start_recording;
-       mas_dependency_stop_recording                                                   stop_recording;
-       mas_dependency_set_recording_session                                    set_recording_session;
-       mas_dependency_set_background_volume                                    set_background_volume;
-       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_set_voice_key_tap_duration                               set_voice_key_tap_duration;
-       mas_dependency_unset_voice_key_tap_duration                             unset_voice_key_tap_duration;
-       mas_dependency_set_voice_key_support_mode                               set_voice_key_support_mode;
-       mas_dependency_get_custom_vconf_key                     get_custom_vconf_key;
-} 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);
-int dependency_resolver_set_voice_key_tap_duration(float duration);
-int dependency_resolver_unset_voice_key_tap_duration();
-int dependency_resolver_set_voice_key_support_mode(const char* support_mode);
-int dependency_resolver_get_custom_vconf_key(const char* default_key, char** custom_key);
-
-mas_dependency_module_interface* dependency_resolver_get_interface();
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _DEPENDENCY_RESOLVER_H_ */
diff --git a/plugins/wakeup-manager/inc/heap_tracer.h b/plugins/wakeup-manager/inc/heap_tracer.h
deleted file mode 100644 (file)
index 626bac1..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * 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 __HEAP_TRACER_H__
-#define __HEAP_TRACER_H__
-
-#include <list>
-#include <mutex>
-#include <unordered_map>
-#include <string>
-#include <set>
-
-#ifndef __MODULE__
-#define __MODULE__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
-#endif
-
-#define vm_calloc_simple(nmemb, size) vm_calloc(nmemb, size, "%s: %s(%d)", __MODULE__, __func__, __LINE__)
-#define vm_malloc_simple(size) vm_malloc(size, "%s: %s(%d)", __MODULE__, __func__, __LINE__)
-#define vm_free_simple(ptr) vm_free(ptr, "%s: %s(%d)", __MODULE__, __func__, __LINE__)
-#define vm_strdup_simple(ptr) vm_strdup(ptr, "%s: %s(%d)", __MODULE__, __func__, __LINE__)
-#define vm_mark_unmanaged_simple(ptr) vm_mark_unmanaged(ptr, "%s: %s(%d)", __MODULE__, __func__, __LINE__)
-
-void *vm_calloc(size_t nmemb, size_t size, const char *fmt, ...);
-void *vm_malloc(size_t size, const char *fmt, ...);
-void vm_free(void *ptr, const char *fmt, ...);
-char *vm_strdup(const char *s, const char *fmt, ...);
-void *vm_mark_unmanaged(void *ptr, const char *fmt, ...);
-
-class HeapTracer {
-public:
-       HeapTracer();
-       virtual ~HeapTracer();
-
-       bool Insert(void *ptr, std::string description, size_t size = 0);
-       bool Delete(void *ptr, std::string description);
-       std::string Find(void *ptr);
-
-       void MarkUnmanaged(void *ptr, std::string description);
-
-       bool Empty();
-       void Trace();
-protected:
-       typedef struct {
-               void *ptr{nullptr};
-               std::string description;
-               int size{0};
-       } AllocationEntry;
-
-       std::mutex mManagedTableMutex;
-       std::unordered_map<void*, AllocationEntry> mManagedTable;
-
-       std::mutex mUnmanagedRecordsMutex;
-       std::list<AllocationEntry> mUnmanagedRecords;
-       size_t mUnmanagedRecordsSize{0};
-
-       enum class EntryOperation {
-               INSERT,
-               DELETE,
-       };
-       typedef struct {
-               AllocationEntry entry;
-               EntryOperation operation;
-               struct timespec ts;
-       } EntryHistory;
-       std::list<EntryHistory> mEntryHistory;
-};
-
-#endif /* __HEAP_TRACER_H__ */
\ No newline at end of file
diff --git a/plugins/wakeup-manager/inc/wakeup_audio_manager.h b/plugins/wakeup-manager/inc/wakeup_audio_manager.h
deleted file mode 100644 (file)
index 7165ce3..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * 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 _WAKEUP_AUDIO_MANAGER_H_
-#define _WAKEUP_AUDIO_MANAGER_H_
-
-#include "service_common.h"
-
-#include <atomic>
-#include <list>
-#include <mutex>
-#include <thread>
-#include <vector>
-
-#include <multi_assistant_service.h>
-
-namespace multiassistant
-{
-namespace wakeup
-{
-
-using namespace std;
-
-class IAudioEventObserver
-{
-public:
-       virtual ~IAudioEventObserver() = default;
-       virtual bool on_recording_audio_data(long time, void* data, int len) = 0;
-       virtual bool on_streaming_audio_data(
-               mas_speech_streaming_event_e event, void* buffer, unsigned int len) = 0;
-};
-
-typedef enum
-{
-       RECORDING_SESSION_WAKE_WORD,
-       RECORDING_SESSION_UTTERANCE,
-       RECORDING_SESSION_FOLLOW_UP,
-} recording_session;
-
-class CAudioManager
-{
-public:
-       CAudioManager();
-       CAudioManager(IAudioEventObserver *observer);
-       ~CAudioManager();
-
-       CAudioManager(const CAudioManager&) = delete;
-       CAudioManager& operator=(const CAudioManager&) = delete;
-
-       int initialize();
-       int deinitialize();
-
-       void sound_focus_changed();
-
-       /* NOTE : The observer that is being passed to this subscribe() function
-        * must not be deleted before the call to CAudioManager::deinitialize(),
-        * since the observer's callback can be called even after unsubscribe() */
-       void subscribe(IAudioEventObserver *observer);
-       void unsubscribe(IAudioEventObserver *observer);
-
-       void start_recording(bool proactive);
-       void stop_recording(bool proactive);
-
-       void set_recording_session(recording_session session);
-
-       void feed_audio_data(mas_speech_streaming_event_e event, void* buffer, int len);
-       void finalize_audio_data();
-       void clear_audio_data();
-
-       void start_streaming_current_utterance_data(long long start_time = 0);
-       void stop_streaming_current_utterance_data();
-
-       void start_streaming_previous_utterance_data();
-       void stop_streaming_previous_utterance_data();
-
-       void start_streaming_follow_up_data();
-       void stop_streaming_follow_up_data();
-
-       void set_background_volume(double ratio);
-conditional_public:
-       void add_audio_data(mas_speech_data& data, long long time);
-       void notify_audio_data_recording(long time, void* data, int len);
-
-       void streaming_previous_audio_data_thread_func();
-       void streaming_audio_data_thread_func(long long start_time);
-
-private:
-       int mSoundFocusWatchId{0};
-       bool mRecordingRequired{false};
-       bool mIsRecording{false};
-
-       vector<IAudioEventObserver*> mObservers;
-
-       thread mStreamingThread;
-       atomic_bool mStopStreamingThread{false};
-       atomic_bool mStreamingThreadActive{false};
-
-       thread mStreamingPreviousThread;
-       atomic_bool mStopStreamingPreviousThread{false};
-
-       static constexpr long long mAudioRecordingDurationMilliseconds = 10 * 1000;
-       typedef struct {
-               long long time;
-               mas_speech_data data;
-       } mas_speech_data_with_time;
-       vector<mas_speech_data_with_time> mPreviousAudioData;
-       list<mas_speech_data_with_time> mAudioData;
-
-       mutex mMutex;
-       bool mVoiceKeyPressed{false};
-
-       thread mBackgroundVolumeThread;
-};
-
-} // wakeup
-} // multiassistant
-
-#endif /* _WAKEUP_AUDIO_MANAGER_H_ */
diff --git a/plugins/wakeup-manager/inc/wakeup_engine_manager.h b/plugins/wakeup-manager/inc/wakeup_engine_manager.h
deleted file mode 100644 (file)
index 4f659ed..0000000
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * 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 _WAKEUP_ENGINE_MANAGER_H_
-#define _WAKEUP_ENGINE_MANAGER_H_
-
-#include "wakeup_manager_wrapper.h"
-
-#include <atomic>
-#include <string>
-#include <thread>
-#include <vector>
-#include <set>
-
-namespace multiassistant
-{
-namespace wakeup
-{
-
-using namespace std;
-
-/**************************************************************************************
- *** Definitions for wakeup engine interface
- *************************************************************************************/
-#define MA_WAKEUP_ENGINE_PATH                                  tzplatform_mkpath(tzplatform_getid("TZ_SYS_RO_SHARE"), "multiassistant/engines")
-/* Need to check whether this dedicated engine path also needs to be configurable */
-#define MA_WAKEUP_DEDICATED_ENGINE_PATH                        "shared/lib/libwakeup-engine.so"
-
-/* Interfaces without version information */
-#define MA_WAKEUP_ENGINE_FUNC_INITIALIZE "wakeup_engine_initialize"
-typedef int (*wakeup_engine_initialize)(void);
-#define MA_WAKEUP_ENGINE_FUNC_DEINITIALIZE "wakeup_engine_deinitialize"
-typedef int (*wakeup_engine_deinitialize)(void);
-#define MA_WAKEUP_ENGINE_FUNC_ACTIVATE "wakeup_engine_activate"
-typedef int (*wakeup_engine_activate)(void);
-#define MA_WAKEUP_ENGINE_FUNC_DEACTIVATE "wakeup_engine_deactivate"
-typedef int (*wakeup_engine_deactivate)(void);
-#define MA_WAKEUP_ENGINE_FUNC_ADD_WAKEUP_WORD "wakeup_engine_add_wakeup_word"
-typedef int (*wakeup_engine_add_wakeup_word)(const char* appid, const char* wakeup_word, const char* language);
-#define MA_WAKEUP_ENGINE_FUNC_REMOVE_WAKEUP_WORD "wakeup_engine_remove_wakeup_word"
-typedef int (*wakeup_engine_remove_wakeup_word)(const char* appid, const char* wakeup_word, const char* language);
-#define MA_WAKEUP_ENGINE_FUNC_ADD_LANGUAGE "wakeup_engine_add_language"
-typedef int (*wakeup_engine_add_language)(const char* appid, const char* language);
-#define MA_WAKEUP_ENGINE_FUNC_SET_LANGUAGE "wakeup_engine_set_language"
-typedef int (*wakeup_engine_set_language)(const char* language);
-#define MA_WAKEUP_ENGINE_FUNC_UPDATE_MANAGER_STATE "wakeup_engine_update_manager_state"
-typedef int (*wakeup_engine_update_manager_state)(wakeup_manager_state_e state);
-#define MA_WAKEUP_ENGINE_FUNC_UPDATE_RECOGNITION_RESULT "wakeup_engine_update_recognition_result"
-typedef int (*wakeup_engine_update_recognition_result)(const char* appid, int result);
-#define MA_WAKEUP_ENGINE_FUNC_SET_AUDIO_FORMAT "wakeup_engine_set_audio_format"
-typedef int (*wakeup_engine_set_audio_format)(int rate, int channel, int audio_type);
-#define MA_WAKEUP_ENGINE_FUNC_GET_AUDIO_FORMAT "wakeup_engine_get_audio_format"
-typedef int (*wakeup_engine_get_audio_format)(int* rate, int* channel, int* audio_type);
-#define MA_WAKEUP_ENGINE_FUNC_FEED_AUDIO_DATA "wakeup_engine_feed_audio_data"
-typedef int (*wakeup_engine_feed_audio_data)(long time, void* data, int len);
-#define MA_WAKEUP_ENGINE_FUNC_GET_UTTERANCE_DATA_COUNT "wakeup_engine_get_utterance_data_count"
-typedef int (*wakeup_engine_get_utterance_data_count)(void);
-#define MA_WAKEUP_ENGINE_FUNC_GET_UTTERANCE_DATA "wakeup_engine_get_utterance_data"
-typedef int (*wakeup_engine_get_utterance_data)(int index, mas_speech_data *data);
-#define MA_WAKEUP_ENGINE_FUNC_GET_WAKE_WORD_DATA_COUNT "wakeup_engine_get_wake_word_data_count"
-typedef int (*wakeup_engine_get_wake_word_data_count)(void);
-#define MA_WAKEUP_ENGINE_FUNC_GET_WAKE_WORD_DATA "wakeup_engine_get_wake_word_data"
-typedef int (*wakeup_engine_get_wake_word_data)(int index, mas_speech_data *data);
-#define MA_WAKEUP_ENGINE_FUNC_SET_ASSISTANT_SPECIFIC_COMMAND "wakeup_engine_set_assistant_specific_command"
-typedef int (*wakeup_engine_set_assistant_specific_command)(const char* appid, const char* command);
-#define MA_WAKEUP_ENGINE_FUNC_SET_WAKE_WORD_AUDIO_REQUIRE_FLAG "wakeup_engine_set_wake_word_audio_require_flag"
-typedef int (*wakeup_engine_set_wake_word_audio_require_flag)(bool require);
-#define MA_WAKEUP_ENGINE_FUNC_SET_WAKEUP_EVENT_CALLBACK "wakeup_engine_set_wakeup_event_callback"
-typedef int (*wakeup_engine_set_wakeup_event_callback)(wakeup_service_wakeup_event_cb callback, void* user_data);
-#define MA_WAKEUP_ENGINE_FUNC_SET_SPEECH_STATUS_CALLBACK "wakeup_engine_set_speech_status_callback"
-typedef int (*wakeup_engine_set_speech_status_callback)(wakeup_service_speech_status_cb callback, void* user_data);
-#define MA_WAKEUP_ENGINE_FUNC_SET_ERROR_CALLBACK "wakeup_engine_set_error_callback"
-typedef int (*wakeup_engine_set_error_callback)(wakeup_service_error_cb callback, void* user_data);
-#define MA_WAKEUP_ENGINE_FUNC_SET_AUDIO_DATA_REQUIRE_STATUS_CALLBACK "wakeup_engine_set_audio_data_require_status_callback"
-typedef int (*wakeup_engine_set_audio_data_require_status_callback)(wakeup_service_audio_data_require_status_cb callback, void* user_data);
-#define MA_WAKEUP_ENGINE_FUNC_SET_WAKEUP_ENGINE_COMMAND_CALLBACK "wakeup_engine_set_wakeup_engine_command_callback"
-typedef int (*wakeup_engine_set_wakeup_engine_command_callback)(wakeup_service_engine_command_cb callback, void* user_data);
-
-/* Interfaces after version 1 */
-#define MA_WAKEUP_ENGINE_FUNC_GET_VERSION "wakeup_engine_get_version"
-typedef int (*wakeup_engine_get_version)(int* version);
-#define MA_WAKEUP_ENGINE_FUNC_SET_DEPENDENCY_MODULE_COMMAND "wakeup_engine_set_dependency_module_command"
-typedef int (*wakeup_engine_set_dependency_module_command)(const char* command);
-
-typedef struct {
-       wakeup_engine_initialize                                                                initialize;
-       wakeup_engine_deinitialize                                                              deinitialize;
-       wakeup_engine_activate                                                                  activate;
-       wakeup_engine_deactivate                                                                deactivate;
-       wakeup_engine_add_wakeup_word                                                   add_wakeup_word;
-       wakeup_engine_remove_wakeup_word                                                remove_wakeup_word;
-       wakeup_engine_add_language                                                              add_language;
-       wakeup_engine_set_language                                                              set_language;
-       wakeup_engine_update_manager_state                                              update_manager_state;
-       wakeup_engine_update_recognition_result                                 update_recognition_result;
-       wakeup_engine_set_audio_format                                                  set_audio_format;
-       wakeup_engine_get_audio_format                                                  get_audio_format;
-       wakeup_engine_feed_audio_data                                                   feed_audio_data;
-       wakeup_engine_get_utterance_data_count                                  get_utterance_data_count;
-       wakeup_engine_get_utterance_data                                                get_utterance_data;
-       wakeup_engine_get_wake_word_data_count                                  get_wake_word_data_count;
-       wakeup_engine_get_wake_word_data                                                get_wake_word_data;
-       wakeup_engine_get_version                                                               get_version;
-       wakeup_engine_set_assistant_specific_command                    set_assistant_specific_command;
-       wakeup_engine_set_wake_word_audio_require_flag                  set_wake_word_audio_require_flag;
-       wakeup_engine_set_dependency_module_command                             set_dependency_module_command;
-       wakeup_engine_set_wakeup_event_callback                                 set_wakeup_event_callback;
-       wakeup_engine_set_speech_status_callback                                set_speech_status_callback;
-       wakeup_engine_set_error_callback                                                set_error_callback;
-       wakeup_engine_set_audio_data_require_status_callback    set_audio_data_require_status_callback;
-       wakeup_engine_set_wakeup_engine_command_callback                set_wakeup_engine_command_callback;
-} wakeup_engine_interface;
-
-class IEngineEventObserver
-{
-public:
-       virtual ~IEngineEventObserver() = default;
-       virtual bool on_wakeup_event(string engine_name, mas_wakeup_event_info wakeup_info) = 0;
-       virtual bool on_speech_status(string engine_name, mas_speech_status_e status) = 0;
-       virtual bool on_error(string engine_name, int error_code, string error_message) = 0;
-       virtual bool on_audio_data_require_status(string engine_name, bool require) = 0;
-
-       virtual bool on_streaming_audio_data(
-               mas_speech_streaming_event_e event, void* buffer, unsigned int len) = 0;
-       virtual bool on_audio_streaming_data_section(ma_audio_streaming_data_section_e section) = 0;
-       virtual bool on_wakeup_engine_command(
-               mas_wakeup_engine_command_target_e target, string engine_name, string assistant_name, string command) = 0;
-};
-
-class CWakeupEngineManager
-{
-public:
-       CWakeupEngineManager();
-       CWakeupEngineManager(IEngineEventObserver *observer);
-       virtual ~CWakeupEngineManager();
-
-       CWakeupEngineManager(const CWakeupEngineManager&) = delete;
-       CWakeupEngineManager& operator=(const CWakeupEngineManager&) = delete;
-
-       void initialize();
-       void deinitialize();
-
-       void subscribe(IEngineEventObserver *observer);
-       void unsubscribe(IEngineEventObserver *observer);
-
-       bool get_audio_data_required();
-       void set_selected_wakeup_info(mas_wakeup_event_info wakeup_info);
-
-       bool set_language(string language);
-       bool set_assistant_language(string appid, string language);
-       void set_assistant_activated(string appid, bool activated);
-       bool get_assistant_activated(string appid);
-       void set_wake_word_audio_require_flag(bool require);
-
-       void start_streaming_current_utterance_data();
-       void stop_streaming_current_utterance_data();
-
-       void update_manager_state(wakeup_manager_state_e state);
-       void update_recognition_result(string appid, int result);
-
-       void engine_add_target_assistant(string engine_name, string appid);
-       void engine_add_wakeup_word(string appid, string wakeup_word, string language);
-       void engine_remove_wakeup_word(string appid, string wakeup_word, string language);
-       void engine_set_assistant_specific_command(string appid, string command);
-       void engine_set_dependency_module_command(string engine_name, string command);
-       void engine_feed_audio_data(long time, void* data, int len);
-
-       bool on_wakeup_event(string engine_name, mas_wakeup_event_info wakeup_info);
-       bool on_speech_status(string engine_name, mas_speech_status_e status);
-       bool on_error(string engine_name, int error_code, string error_message);
-       bool on_audio_data_require_status(string engine_name, bool require);
-       bool on_wakeup_engine_command(string engine_name,
-               mas_wakeup_engine_command_target_e target, string assistant_name, string command);
-private:
-       typedef struct {
-               int version;
-               string engine_name;
-               bool activated{false};
-               bool audio_data_require_status{false};
-               string engine_path;
-               wakeup_engine_interface interface{nullptr, };
-               vector<string> assistant_list;
-               set<string> activated_assistants;
-               void *engine_handle{nullptr};
-       } EngineInfo;
-
-       void add_engine_directory(string name, string path);
-       void add_engine(string name, string path);
-
-       vector<IEngineEventObserver*> mObservers;
-
-       void streaming_speech_data_thread_func();
-
-       vector<EngineInfo> mEngineInfo;
-       const EngineInfo* mSelectedEngine{nullptr};
-       bool mAudioDataRequired{false};
-
-       thread mStreamingThread;
-       atomic_bool mStopStreamingThread{false};
-       wakeup_manager_state_e mWakeupManagerState{WAKEUP_MANAGER_STATE_INACTIVE};
-
-       bool mWakeWordAudioRequired{false};
-
-       typedef struct {
-               atomic_llong last_audio_fetched{0};
-               atomic_llong last_count_fetched{0};
-               atomic_llong last_audio_sent{0};
-       } StreamingHistory;
-
-       StreamingHistory mStreamingHistory;
-};
-
-} // wakeup
-} // multiassistant
-
-#endif /* _WAKEUP_ENGINE_MANAGER_H_ */
diff --git a/plugins/wakeup-manager/inc/wakeup_manager.h b/plugins/wakeup-manager/inc/wakeup_manager.h
deleted file mode 100644 (file)
index 994dab3..0000000
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- * 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 _WAKEUP_MANAGER_H_
-#define _WAKEUP_MANAGER_H_
-
-#include "service_config.h"
-#include "wakeup_manager_wrapper.h"
-#include "wakeup_settings.h"
-#include "wakeup_engine_manager.h"
-#include "wakeup_audio_manager.h"
-#include "wakeup_policy_default.h"
-#include "assistant_config_manager.h"
-
-#include <memory>
-#include <map>
-#include <mutex>
-
-namespace multiassistant
-{
-namespace wakeup
-{
-
-using namespace std;
-
-#define WAKEUP_VCONF_KEY_DEFAULT_ASSISTANT_APPID "db/multi-assistant/default_assistant_appid"
-#define WAKEUP_VCONF_KEY_ENABLED_ASSISTANTS "db/multi-assistant/enabled_assistants"
-#define WAKEUP_VCONF_KEY_WAKE_WORD_DETECTION_ENABLED "db/multi-assistant/wake_word_detection_enabled"
-
-enum class STREAMING_MODE {
-       NONE,
-       UTTERANCE,
-       PREVIOUS_UTTERANCE,
-       FOLLOW_UP,
-};
-
-class IWakeupEventObserver {
-public:
-       virtual ~IWakeupEventObserver() = default;
-       virtual void on_wakeup(mas_wakeup_event_info wakeup_info) = 0;
-       virtual void on_streaming_audio_data(
-               mas_speech_streaming_event_e event, void* buffer, unsigned int len) = 0;
-       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;
-       virtual void on_voice_key_status_changed(ma_voice_key_status_e status) = 0;
-};
-
-class ISettingValueObserver {
-public:
-       virtual ~ISettingValueObserver() = default;
-       virtual void on_value_changed() = 0;
-       virtual void on_loaded_wakeup_engine_changed() = 0;
-};
-
-/* If a wakeup event is raised by pressing a voice key,
-       the wakeup_engine attribute of wakeup_event_info will have the following value */
-#define WAKEUP_ENGINE_VOICE_KEY "voice_key"
-
-class CWakeupManager
-{
-public:
-       CWakeupManager(IWakeupEventObserver* wakeup_observer, ISettingValueObserver* setting_observer);
-       virtual ~CWakeupManager();
-
-       CWakeupManager(const CWakeupManager&) = delete;
-       CWakeupManager& operator=(const CWakeupManager&) = delete;
-
-       bool initialize();
-       bool deinitialize();
-
-       void subscribe_wakeup_observer(IWakeupEventObserver* observer);
-       void unsubscribe_wakeup_observer(IWakeupEventObserver* observer);
-
-       void subscribe_setting_observer(ISettingValueObserver* observer);
-       void unsubscribe_setting_observer(ISettingValueObserver* observer);
-
-       bool activate();
-       bool deactivate();
-
-       bool add_assistant_language(string appid, string language);
-       bool add_assistant_wakeup_word(string appid, string wakeup_word, string language);
-       bool remove_assistant_wakeup_word(string appid, string wakeup_word, string language);
-       bool add_assistant_wakeup_engine(string appid, string engine);
-       bool set_assistant_language(string appid, string language);
-
-       bool set_assistant_enabled(string appid, bool enabled);
-       bool get_assistant_enabled(string appid);
-       bool set_default_assistant(string appid);
-       bool process_default_assistant_changed(string appid, bool expected);
-       string get_default_assistant();
-
-       bool update_voice_feedback_state(string appid, bool state);
-       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);
-       bool get_audio_format(int* rate, int* channel, int* audio_type);
-       bool get_audio_source_type(char** type);
-       bool set_language(string language);
-       bool get_recording_by_voice_key();
-       void set_recording_by_voice_key(bool recording);
-       bool set_voice_key_tap_duration(float duration);
-       bool unset_voice_key_tap_duration();
-       bool set_voice_key_support_mode(VOICE_KEY_SUPPORT_MODE mode);
-       bool set_wake_word_audio_require_flag(bool require);
-
-       STREAMING_MODE get_streaming_mode();
-       bool set_streaming_mode(STREAMING_MODE mode);
-
-       bool start_streaming_utterance_data();
-       bool stop_streaming_utterance_data();
-       bool start_streaming_follow_up_data();
-       bool stop_streaming_follow_up_data();
-       bool start_streaming_previous_utterance_data();
-       bool stop_streaming_previous_utterance_data();
-
-       CWakeupPolicy* get_wakeup_policy();
-       CWakeupEngineManager* get_engine_manager();
-       CAudioManager* get_audio_manager();
-       CWakeupSettings* get_wakeup_settings();
-
-       vector<IWakeupEventObserver*> get_wakeup_observers();
-       void set_last_wakeup_event_info(mas_wakeup_event_info wakeup_info);
-
-       vector<ISettingValueObserver*> get_setting_observers();
-
-       bool change_manager_state(wakeup_manager_state_e state);
-       wakeup_manager_state_e get_manager_state();
-
-       void feed_audio_data(mas_speech_streaming_event_e event, void* buffer, int len);
-       void set_dependency_module_command(string engine_name, string command);
-
-       void start_streaming_duration_timer();
-       void stop_streaming_duration_timer();
-
-       void set_streaming_duration_timer(Ecore_Timer* timer);
-       Ecore_Timer* get_streaming_duration_timer();
-
-       void start_periodic_monitor_timer();
-       void stop_periodic_monitor_timer();
-
-       void update_voice_key_status(ma_voice_key_status_e status);
-       void update_pending_voice_key_status();
-
-       void start_voice_key_status_update_timer();
-       void set_streaming_completed(bool completed);
-private:
-       class CEngineEventObserver : public IEngineEventObserver
-       {
-       public:
-               bool on_wakeup_event(string engine_name, mas_wakeup_event_info wakeup_info) override;
-               bool on_speech_status(string engine_name, mas_speech_status_e status) override;
-               bool on_error(string engine_name, int error_code, string error_message) override;
-               bool on_audio_data_require_status(string engine_name, bool require) override;
-
-               bool on_streaming_audio_data(
-                       mas_speech_streaming_event_e event, void* buffer, unsigned int len) override;
-               bool on_audio_streaming_data_section(ma_audio_streaming_data_section_e section) override;
-               bool on_wakeup_engine_command(
-                       mas_wakeup_engine_command_target_e target, string engine, string name, string command) override;
-
-               void set_wakeup_manager(CWakeupManager *manager) { mWakeupManager = manager; }
-       private:
-               CWakeupManager *mWakeupManager{nullptr};
-       };
-
-       class CPolicyEventObserver : public IPolicyEventObserver
-       {
-       public:
-               void on_wakeup(mas_wakeup_event_info wakeup_info) override;
-
-               void set_wakeup_manager(CWakeupManager *manager) { mWakeupManager = manager; }
-       private:
-               CWakeupManager *mWakeupManager{nullptr};
-       };
-
-       class CAudioEventObserver : public IAudioEventObserver
-       {
-       public:
-               bool on_recording_audio_data(long time, void* data, int len) override;
-               bool on_streaming_audio_data(
-                       mas_speech_streaming_event_e event, void* buffer, unsigned int len) override;
-
-               void set_wakeup_manager(CWakeupManager *manager) { mWakeupManager = manager; }
-               void set_wakeup_engine_manager(CWakeupEngineManager *manager) { mEngineManager = manager; }
-       private:
-               CWakeupManager *mWakeupManager{nullptr};
-               CWakeupEngineManager *mEngineManager{nullptr};
-       };
-
-       class CSettingsEventObserver : public ISettingsEventObserver
-       {
-       public:
-               bool on_voice_input_language_changed(const char* language) override;
-               bool on_assistant_enabled_info_changed(const char* appid, bool enabled) override;
-               bool on_default_assistant_appid_changed(const char* appid) override;
-               bool on_multiple_mode_changed() override;
-               bool on_wake_word_detection_enabled_info_changed() override;
-
-               void set_wakeup_manager(CWakeupManager *manager) { mWakeupManager = manager; }
-       private:
-               CWakeupManager *mWakeupManager{nullptr};
-       };
-
-       void initialize_wakeup_policy();
-
-       typedef struct {
-               string appid;
-               vector<string> languageList;
-       } AssistantLanguageInfo;
-       vector<AssistantLanguageInfo> mAssistantLanguageInfo;
-       map<string, bool> mAssistantSupportsCurrentLanguage;
-       map<string, bool> mAssistantEnabled;
-
-       vector<IWakeupEventObserver*> mWakeupObservers;
-       vector<ISettingValueObserver*> mSettingObservers;
-
-       unique_ptr<CWakeupPolicy> mWakeupPolicy;
-
-       CAudioManager mAudioManager;
-       CWakeupEngineManager mWakeupEngineManager;
-       CWakeupSettings mWakeupSettings;
-       CAssistantConfigManager mAssistantConfigManager;
-
-       CAudioEventObserver mAudioEventObserver;
-       CEngineEventObserver mEngineEventObserver;
-       CPolicyEventObserver mPolicyEventObserver;
-       CSettingsEventObserver mSettingsEventObserver;
-
-       thread mEngineDataThread;
-       atomic_bool mStopEngineDataThread{false};
-
-       bool mRecordingByVoiceKey{false};
-
-       string mCurrentLanguage;
-       string mCurrentDefaultAssistant;
-       /* Assume Push-to-talk is the default mode */
-       VOICE_KEY_SUPPORT_MODE mCurrentVoiceKeySupportMode{VOICE_KEY_SUPPORT_MODE_PUSH_TO_TALK};
-
-       STREAMING_MODE mStreamingMode{STREAMING_MODE::NONE};
-       Ecore_Timer* mStreamingDurationTimer{nullptr};
-       Ecore_Timer* mPeriodicMonitorTimer{nullptr};
-
-       wakeup_manager_state_e mWakeupManagerState{WAKEUP_MANAGER_STATE_INACTIVE};
-
-       mas_wakeup_event_info mLastWakeupEventInfo;
-
-       unsigned int mLastWakeupEventID{0};
-       unsigned int mCurrentStreamingSessionID{0};
-
-       boost::optional<ma_voice_key_status_e> mPendingVoiceKeyStatus;
-       atomic_bool mStreamingCompleted{false};
-       Ecore_Timer *mVoiceKeyStatusUpdateTimer{nullptr};
-       mutex mVoiceKeyStatusUpdateMutex;
-
-       mutex mMutex;
-};
-
-} // wakeup
-} // multiassistant
-
-#endif /* _WAKEUP_MANAGER_H_ */
diff --git a/plugins/wakeup-manager/inc/wakeup_manager_main.h b/plugins/wakeup-manager/inc/wakeup_manager_main.h
deleted file mode 100644 (file)
index d0b8b30..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef __MUTLI_WAKEUP_MAIN_H__
-#define __MUTLI_WAKEUP_MAIN_H__
-
-#include <dlog.h>
-#include <glib.h>
-
-#ifdef  LOG_TAG
-#undef  LOG_TAG
-#endif
-#define LOG_TAG "multi-assistant"
-
-#ifdef __MODULE__
-#undef  __MODULE__
-#endif
-#define __MODULE__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
-
-#define MWR_SECURE_LOG_(id, prio, tag, fmt, arg...) \
-        ({ do { \
-                __dlog_print(id, prio, tag, "%s: %s(%d) > [SECURE_LOG] " fmt, __MODULE__, __func__, __LINE__, ##arg); \
-        } while (0); })
-
-#define MWR_LOG_(prio, tag, fmt, arg...) \
-        ({ do { \
-                dlog_print(prio, tag, "%s: %s(%d) > " fmt, __MODULE__, __func__, __LINE__, ##arg); \
-        } while (0); })
-
-#define MWR_LOGD(fmt, args...) MWR_LOG_(DLOG_DEBUG, LOG_TAG, fmt, ##args)
-#define MWR_LOGI(fmt, args...) MWR_LOG_(DLOG_INFO, LOG_TAG, fmt, ##args)
-#define MWR_LOGW(fmt, args...) MWR_LOG_(DLOG_WARN, LOG_TAG, fmt, ##args)
-#define MWR_LOGE(fmt, args...) MWR_LOG_(DLOG_ERROR, LOG_TAG, fmt, ##args)
-
-#define MWR_SLOGD(fmt, args...) MWR_SECURE_LOG_(DLOG_DEBUG, LOG_TAG, fmt, ##args)
-#define MWR_SLOGI(fmt, args...) MWR_SECURE_LOG_(DLOG_INFO, LOG_TAG, fmt, ##args)
-#define MWR_SLOGW(fmt, args...) MWR_SECURE_LOG_(DLOG_WARN, LOG_TAG, fmt, ##args)
-#define MWR_SLOGE(fmt, args...) MWR_SECURE_LOG_(DLOG_ERROR, LOG_TAG, fmt, ##args)
-
-#endif /* __MUTLI_WAKEUP_MAIN_H__ */
diff --git a/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h b/plugins/wakeup-manager/inc/wakeup_manager_wrapper.h
deleted file mode 100644 (file)
index b34a8f2..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * 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 _WAKEUP_MANAGER_WRAPPER_H_
-#define _WAKEUP_MANAGER_WRAPPER_H_
-
-#include <dlog.h>
-#include <stdbool.h>
-#include <tizen.h>
-#include <tzplatform_config.h>
-
-#include <multi_assistant_service.h>
-#include <multi_assistant_internal.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef enum {
-       WAKEUP_MANAGER_STATE_INACTIVE = 0,
-       WAKEUP_MANAGER_STATE_LISTENING = 1,
-       WAKEUP_MANAGER_STATE_UTTERANCE = 2,
-       WAKEUP_MANAGER_STATE_PROCESSING = 3,
-       WAKEUP_MANAGER_STATE_VOICE_FEEDBACK = 4
-} wakeup_manager_state_e;
-
-typedef void (*ma_audio_streaming_data_section_changed_cb)(ma_audio_streaming_data_section_e section, void* user_data);
-
-typedef void (*wakeup_service_wakeup_event_cb)(mas_wakeup_event_info wakeup_info, void* user_data);
-
-typedef void (*wakeup_service_speech_streaming_cb)(mas_speech_streaming_event_e event, void* buffer, int len, void *user_data);
-
-typedef void (*wakeup_service_speech_status_cb)(mas_speech_status_e status, void *user_data);
-
-typedef void (*wakeup_service_setting_changed_cb)( void *user_data);
-
-typedef void (*wakeup_service_error_cb)(int error, const char* err_msg, void* user_data);
-
-typedef void (*wakeup_service_audio_data_require_status_cb)(bool require, void* user_data);
-
-typedef void (*wakeup_service_streaming_section_changed_cb)(ma_audio_streaming_data_section_e section, void* user_data);
-
-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 void (*wakeup_service_voice_key_status_changed_cb)(ma_voice_key_status_e state, void* user_data);
-
-typedef void (*wakeup_service_loaded_engine_changed_cb)(void* user_data);
-
-typedef struct {
-       int plugin_version;
-       bool ui_panel_enabled;
-} ma_plugin_settings;
-
-EXPORT_API int wakeup_manager_initialize(void);
-
-EXPORT_API int wakeup_manager_deinitialize(void);
-
-EXPORT_API int wakeup_manager_get_settings(ma_plugin_settings **settings, size_t *struct_size);
-
-EXPORT_API int wakeup_manager_add_assistant_wakeup_word(const char* appid, const char* wakeup_word, const char* language);
-
-EXPORT_API int wakeup_manager_remove_assistant_wakeup_word(const char* appid, const char* wakeup_word, const char* language);
-
-EXPORT_API int wakeup_manager_add_assistant_language(const char* appid, const char* language);
-
-EXPORT_API int wakeup_manager_add_assistant_wakeup_engine(const char* appid, const char *engine);
-
-EXPORT_API int wakeup_manager_set_default_assistant(const char* appid);
-
-EXPORT_API int wakeup_manager_get_default_assistant(const char** appid);
-
-EXPORT_API int wakeup_manager_set_language(const char* language);
-
-EXPORT_API int wakeup_manager_activate(void);
-
-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_set_assistant_specific_command(const char* appid, const char* command);
-
-EXPORT_API int wakeup_manager_set_background_volume(const char *appid, double ratio);
-
-EXPORT_API int wakeup_manager_update_recognition_result(const char *appid, int result);
-
-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);
-
-EXPORT_API int wakeup_manager_stop_streaming_utterance_data(void);
-
-EXPORT_API int wakeup_manager_start_streaming_previous_utterance_data(void);
-
-EXPORT_API int wakeup_manager_stop_streaming_previous_utterance_data(void);
-
-EXPORT_API int wakeup_manager_start_streaming_follow_up_data(void);
-
-EXPORT_API int wakeup_manager_stop_streaming_follow_up_data(void);
-
-EXPORT_API int wakeup_manager_get_audio_format(int *rate, int *channel, int *audio_type);
-
-EXPORT_API int wakeup_manager_get_audio_source_type(char** type);
-
-EXPORT_API int wakeup_manager_set_voice_key_tap_duration(float duration);
-
-EXPORT_API int wakeup_manager_unset_voice_key_tap_duration();
-
-EXPORT_API int wakeup_manager_set_voice_key_support_mode(int mode);
-
-EXPORT_API int wakeup_manager_set_wake_word_audio_require_flag(bool require);
-
-EXPORT_API int wakeup_manager_set_assistant_language(const char* appid, const char *language);
-
-EXPORT_API int wakeup_manager_set_wakeup_event_callback(wakeup_service_wakeup_event_cb callback, void* user_data);
-
-EXPORT_API int wakeup_manager_set_utterance_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data);
-
-EXPORT_API int wakeup_manager_set_previous_utterance_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data);
-
-EXPORT_API int wakeup_manager_set_follow_up_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data);
-
-EXPORT_API int wakeup_manager_set_speech_status_callback(wakeup_service_speech_status_cb callback, void* user_data);
-
-EXPORT_API int wakeup_manager_set_setting_changed_callback(wakeup_service_setting_changed_cb callback, void* user_data);
-
-EXPORT_API int wakeup_manager_set_error_callback(wakeup_service_error_cb callback, void* user_data);
-
-EXPORT_API int wakeup_manager_set_streaming_section_changed_callback(wakeup_service_streaming_section_changed_cb callback, void* user_data);
-
-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);
-
-EXPORT_API int wakeup_manager_set_voice_key_status_changed_callback(wakeup_service_voice_key_status_changed_cb callback, void* user_data);
-
-EXPORT_API int wakeup_manager_set_loaded_engine_changed_callback(wakeup_service_loaded_engine_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);
-
-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);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _WAKEUP_MANAGER_WRAPPER_H_ */
diff --git a/plugins/wakeup-manager/inc/wakeup_policy.h b/plugins/wakeup-manager/inc/wakeup_policy.h
deleted file mode 100644 (file)
index 238a27b..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * 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 _WAKEUP_POLICY_H_
-#define _WAKEUP_POLICY_H_
-
-#include <string>
-#include <memory>
-
-#include <multi_assistant_service.h>
-
-namespace multiassistant
-{
-namespace wakeup
-{
-
-using namespace std;
-
-class IPolicyEventObserver
-{
-public:
-       virtual ~IPolicyEventObserver() = default;
-       virtual void on_wakeup(mas_wakeup_event_info wakeup_info) = 0;
-};
-
-class CWakeupPolicyImpl;
-
-class CWakeupPolicy
-{
-public:
-       CWakeupPolicy();
-       CWakeupPolicy(IPolicyEventObserver *observer);
-       virtual ~CWakeupPolicy();
-
-       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<CWakeupPolicyImpl> mImpl;
-};
-
-} // wakeup
-} // multiassistant
-
-#endif /* _WAKEUP_POLICY_H_ */
diff --git a/plugins/wakeup-manager/inc/wakeup_policy_default.h b/plugins/wakeup-manager/inc/wakeup_policy_default.h
deleted file mode 100644 (file)
index 5293273..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * 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 _WAKEUP_POLICY_DEFAULT_H_
-#define _WAKEUP_POLICY_DEFAULT_H_
-
-#include "wakeup_policy.h"
-
-#include <vector>
-#include <string>
-
-#include <Ecore.h>
-
-namespace multiassistant
-{
-namespace wakeup
-{
-
-typedef struct {
-       std::string wakeup_appid;
-       std::string wakeup_word;
-       std::string wakeup_language;
-       std::string wakeup_voice_id;
-       std::string wakeup_engine;
-
-       std::vector<unsigned char> extra_data;
-       std::string extra_data_description;
-       mas_wakeup_event_info info;
-} mas_wakeup_event_info_wrapper;
-
-
-using namespace std;
-
-class CWakeupPolicyDefault : public CWakeupPolicy
-{
-public:
-       CWakeupPolicyDefault(IPolicyEventObserver *observer);
-       ~CWakeupPolicyDefault();
-
-       bool valid() override;
-
-       void set_assistant_priority(string appid, int priority);
-
-       void wakeup_candidate(mas_wakeup_event_info wakeup_info) override;
-       void select_candidate(mas_wakeup_event_info wakeup_info) override;
-
-       void timer_expired();
-
-       void set_delay(float seconds);
-       float get_delay();
-
-       void set_timer(Ecore_Timer* timer);
-       Ecore_Timer* get_timer();
-
-private:
-       typedef struct {
-               string appid;
-               int priority{0};
-       } PRIORITY_INFO;
-
-       float mDelaySeconds{0.0f};
-       vector<PRIORITY_INFO> mPriorityInfos;
-       vector<mas_wakeup_event_info_wrapper> mWakeupInfos;
-
-       Ecore_Timer *mTimer{nullptr};
-};
-
-} // wakeup
-} // multiassistant
-
-#endif /* _WAKEUP_POLICY_H_ */
diff --git a/plugins/wakeup-manager/inc/wakeup_policy_external.h b/plugins/wakeup-manager/inc/wakeup_policy_external.h
deleted file mode 100644 (file)
index 366f272..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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/inc/wakeup_policy_impl.h b/plugins/wakeup-manager/inc/wakeup_policy_impl.h
deleted file mode 100644 (file)
index a1da86b..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * 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 _WAKEUP_POLICY_IMPL_H_
-#define _WAKEUP_POLICY_IMPL_H_
-
-#include "wakeup_policy.h"
-#include <string>
-#include <vector>
-
-namespace multiassistant
-{
-namespace wakeup
-{
-
-class CWakeupPolicyImpl
-{
-public:
-       CWakeupPolicyImpl() {}
-       ~CWakeupPolicyImpl() {}
-
-       void subscribe(IPolicyEventObserver *observer);
-       void unsubscribe(IPolicyEventObserver *observer);
-
-       void wakeup(mas_wakeup_event_info wakeup_info);
-private:
-       vector<IPolicyEventObserver*> mObservers;
-};
-
-} // wakeup
-} // multiassistant
-
-#endif /* _WAKEUP_POLICY_IMPL_H_ */
diff --git a/plugins/wakeup-manager/inc/wakeup_settings.h b/plugins/wakeup-manager/inc/wakeup_settings.h
deleted file mode 100644 (file)
index ca6a324..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * 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 _WAKEUP_SETTINGS_H_
-#define _WAKEUP_SETTINGS_H_
-
-#include <string>
-#include <vector>
-#include <vconf.h>
-#include <map>
-
-//#define ENABLE_VOICE_INPUT_LANGUAGE_SETTINGS
-
-typedef void (*input_language_changed_cb)(void* data);
-
-namespace multiassistant
-{
-namespace wakeup
-{
-
-using namespace std;
-
-#define WAKEUP_SETTINGS_KEY_DEFAULT_ASSISTANT_APPID "db/multi-assistant/default_assistant_appid"
-#define WAKEUP_SETTINGS_KEY_UI_PANEL_ENABLED "db/multi-assistant/ui_panel_enabled"
-#define WAKEUP_SETTINGS_KEY_CONVERSATION_TIMEOUT "db/multi-assistant/conversation_timeout"
-#define WAKEUP_SETTINGS_KEY_MULTIPLE_MODE "db/multi-assistant/multiple_mode"
-#define WAKEUP_SETTINGS_KEY_ENABLED_ASSISTANTS "db/multi-assistant/enabled_assistants"
-#define WAKEUP_SETTINGS_KEY_WAKEUP_POLICY_DELAY "db/multi-assistant/wakeup_policy_delay"
-#define WAKEUP_SETTINGS_KEY_WAKEUP_POLICY_PRIORITY "db/multi-assistant/wakeup_policy_priority"
-#define WAKEUP_SETTINGS_KEY_STREAMING_DURATION_MAX "db/multi-assistant/streaming_duration_max"
-#define WAKEUP_SETTINGS_KEY_VOICE_INPUT_LANGUAGE "db/multi-assistant/voice_input_language"
-#define WAKEUP_SETTINGS_KEY_WAKE_WORD_DETECTION_ENABLED "db/multi-assistant/wake_word_detection_enabled"
-
-class ISettingsEventObserver
-{
-public:
-       virtual ~ISettingsEventObserver() = default;
-       virtual bool on_voice_input_language_changed(const char* language) = 0;
-       virtual bool on_assistant_enabled_info_changed(const char* appid, bool enabled) = 0;
-       virtual bool on_default_assistant_appid_changed(const char* appid) = 0;
-       virtual bool on_multiple_mode_changed() = 0;
-       virtual bool on_wake_word_detection_enabled_info_changed() = 0;
-};
-
-class CWakeupSettings
-{
-public:
-       CWakeupSettings();
-       virtual ~CWakeupSettings();
-
-       CWakeupSettings(const CWakeupSettings&) = delete;
-       CWakeupSettings& operator=(const CWakeupSettings&) = delete;
-
-       void initialize(map<string, string> custom_keys);
-       void deinitialize();
-
-       void subscribe(ISettingsEventObserver *observer);
-       void unsubscribe(ISettingsEventObserver *observer);
-       const vector<ISettingsEventObserver*>& get_observers();
-
-       string get_default_assistant_appid();
-       void set_default_assistant_appid(std::string appid);
-
-       bool get_ui_panel_enabled();
-       float get_conversation_timeout();
-       bool get_multiple_mode();
-       vector<string> get_enabled_assistants();
-       float get_wakeup_policy_delay();
-       vector<string> get_wakeup_policy_priority();
-       float get_streaming_duration_max();
-       void set_streaming_duration_max(float duration);
-       string get_current_language(void);
-       vector<string> get_wake_word_disabled_assistants();
-private:
-       vector<ISettingsEventObserver*> mObservers;
-
-       string mDefaultAssistantAppid;
-       bool mUiPanelEnabled{true};
-       float mConversationTimeout{5.0};
-       bool mMultipleMode{false};
-       vector<string> mEnabledAssistants;
-       float mWakeupPolicyDelay{0.0};
-       vector<string> mWakeupPolicyPriority; // No priority by default
-       float mStreamingDurationMax{15.0};
-       string mVoiceInputLanguage;
-       map<string, string> mCustomVconfKeys;
-       vector<string> mWakeWordDisabledAssistants;
-};
-
-} // wakeup
-} // multiassistant
-
-#endif /* _WAKEUP_SETTINGS_H_ */
diff --git a/plugins/wakeup-manager/src/assistant_config_manager.cpp b/plugins/wakeup-manager/src/assistant_config_manager.cpp
deleted file mode 100644 (file)
index 8bce9ed..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-#include "wakeup_manager_main.h"
-#include "assistant_config_manager.h"
-
-#include <string.h>
-
-#include <app_preference.h>
-
-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());
-       MWR_LOGE("Set assistant language : %s %s", 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;
-       MWR_LOGE("Got assistant language : %s %s", key.c_str(), language.c_str());
-       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 *data) {
-                       string prefix = string{LANGUAGE_PREFIX};
-                       foreach_assistant_language_cb_closure* closure =
-                               static_cast<foreach_assistant_language_cb_closure*>(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<void*>(&closure)
-       );
-}
-
-} // wakeup
-} // multiassistant
diff --git a/plugins/wakeup-manager/src/dependency_resolver.cpp b/plugins/wakeup-manager/src/dependency_resolver.cpp
deleted file mode 100644 (file)
index abacd59..0000000
+++ /dev/null
@@ -1,491 +0,0 @@
-/*
- * 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.
- */
-
-#include <tizen.h>
-#include <dlfcn.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <vconf.h>
-
-#include <stdexcept>
-
-#include "service_common.h"
-#include "dependency_resolver.h"
-
-#ifdef LOG_TAG
-#undef LOG_TAG
-#endif
-#define LOG_TAG "dependency-resolver"
-
-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]");
-
-       const int FILEPATH_LEN = 512;
-       char filepath[FILEPATH_LEN] = {'\0', };
-       char *vconf_str = vconf_get_str(MAS_DEPENDENCY_MODULE_PATH);
-       if (vconf_str) {
-               snprintf(filepath, FILEPATH_LEN - 1, "%s", vconf_str);
-               free(vconf_str);
-       } else {
-               const char *default_path = MAS_DEPENDENCY_DEFAULT_PATH;
-               snprintf(filepath, FILEPATH_LEN - 1, "%s/%s", default_path, MAS_DEPENDENCY_DEFAULT_FILENAME);
-       }
-       filepath[FILEPATH_LEN - 1] = '\0';
-
-       char *error;
-       g_handle = NULL;
-       g_handle = dlopen(filepath, RTLD_LAZY);
-       if (NULL != (error = dlerror())) {
-               MAS_LOGE("[ERROR] Fail to dlopen(%s), error(%s)", filepath, error);
-               return -1; //MAS_ERROR_OPERATION_FAILED;
-       }
-
-       g_mas_dependency.initialize =
-               (mas_dependency_initialize)dlsym(g_handle,
-               MAS_DEPENDENCY_FUNC_INITIALIZE);
-       g_mas_dependency.deinitialize =
-               (mas_dependency_deinitialize)dlsym(g_handle,
-               MAS_DEPENDENCY_FUNC_DEINITIALIZE);
-       g_mas_dependency.set_error_callback =
-               (mas_dependency_set_error_callback)dlsym(g_handle,
-               MAS_DEPENDENCY_FUNC_SET_ERROR_CALLBACK);
-       g_mas_dependency.start_recording =
-               (mas_dependency_start_recording)dlsym(g_handle,
-               MAS_DEPENDENCY_FUNC_START_RECORDING);
-       g_mas_dependency.stop_recording =
-               (mas_dependency_stop_recording)dlsym(g_handle,
-               MAS_DEPENDENCY_FUNC_STOP_RECORDING);
-       g_mas_dependency.set_recording_session =
-               (mas_dependency_set_recording_session)dlsym(g_handle,
-               MAS_DEPENDENCY_FUNC_SET_RECORDING_SESSION);
-       g_mas_dependency.set_background_volume =
-               (mas_dependency_set_background_volume)dlsym(g_handle,
-               MAS_DEPENDENCY_FUNC_SET_BACKGROUND_VOLUME);
-       g_mas_dependency.get_audio_format =
-               (mas_dependency_get_audio_format)dlsym(g_handle,
-               MAS_DEPENDENCY_FUNC_GET_AUDIO_FORMAT);
-       g_mas_dependency.get_audio_source_type =
-               (mas_dependency_get_audio_source_type)dlsym(g_handle,
-               MAS_DEPENDENCY_FUNC_GET_AUDIO_SOURCE_TYPE);
-       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);
-       g_mas_dependency.set_voice_key_tap_duration =
-               (mas_dependency_set_voice_key_tap_duration)dlsym(g_handle,
-               MAS_DEPENDENCY_FUNC_SET_VOICE_KEY_TAP_DURATION);
-       g_mas_dependency.unset_voice_key_tap_duration =
-               (mas_dependency_unset_voice_key_tap_duration)dlsym(g_handle,
-               MAS_DEPENDENCY_FUNC_UNSET_VOICE_KEY_TAP_DURATION);
-       g_mas_dependency.set_voice_key_support_mode =
-               (mas_dependency_set_voice_key_support_mode)dlsym(g_handle,
-               MAS_DEPENDENCY_FUNC_SET_VOICE_KEY_SUPPORT_MODE);
-       g_mas_dependency.get_custom_vconf_key =
-               (mas_dependency_get_custom_vconf_key)dlsym(g_handle,
-               MAS_DEPENDENCY_FUNC_GET_CUSTOM_VCONF_KEY);
-
-       int ret = -1;
-       int dependency_version = 0;
-       if (NULL != g_handle) {
-               mas_dependency_initialize func = g_mas_dependency.initialize;
-
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_INITIALIZE);
-               } else {
-                       try {
-                               ret = func(interface, &dependency_version);
-                       } catch (const std::exception& e) {
-                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
-                                       MAS_DEPENDENCY_FUNC_INITIALIZE, e.what());
-                       }
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to initialize, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] g_handle is not valid");
-       }
-       MAS_LOGD("g_handle : %p, dependency_version %d", g_handle, dependency_version);
-       return ret;
-}
-
-int dependency_resolver_deinitialize(void)
-{
-       MAS_LOGD("g_handle : %p", g_handle);
-       int ret = -1;
-       if (NULL != g_handle) {
-               mas_dependency_deinitialize func = g_mas_dependency.deinitialize;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_DEINITIALIZE);
-               } else {
-                       try {
-                               ret = func();
-                       } catch (const std::exception& e) {
-                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
-                                       MAS_DEPENDENCY_FUNC_DEINITIALIZE, e.what());
-                       }
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to deinitialize, ret(%d)", ret);
-                       }
-               }
-
-               dlclose(g_handle);
-               g_handle = NULL;
-       } else {
-               MAS_LOGE("[ERROR] g_handle is not valid");
-       }
-
-       return ret;
-}
-
-int dependency_resolver_set_error_callback(mas_error_cb callback, void* user_data)
-{
-       int ret = -1;
-       if (NULL != g_handle) {
-               mas_dependency_set_error_callback func = g_mas_dependency.set_error_callback;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_SET_ERROR_CALLBACK);
-               } else {
-                       try {
-                               ret = func(callback, user_data);
-                       } catch (const std::exception& e) {
-                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
-                                       MAS_DEPENDENCY_FUNC_SET_ERROR_CALLBACK, e.what());
-                       }
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to set error callback(%p, %p), ret(%d)", callback, user_data, ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] g_handle is not valid");
-       }
-       return ret;
-}
-
-int dependency_resolver_start_recording(void)
-{
-       int ret = -1;
-       MAS_LOGD("g_handle : %p", g_handle);
-       if (NULL != g_handle) {
-               mas_dependency_start_recording func = g_mas_dependency.start_recording;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_START_RECORDING);
-               } else {
-                       try {
-                               ret = func();
-                       } catch (const std::exception& e) {
-                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
-                                       MAS_DEPENDENCY_FUNC_START_RECORDING, e.what());
-                       }
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to start recording, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] g_handle is not valid");
-       }
-
-       return ret;
-}
-
-int dependency_resolver_stop_recording(void)
-{
-       int ret = -1;
-       if (NULL != g_handle) {
-               mas_dependency_stop_recording func = g_mas_dependency.stop_recording;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_STOP_RECORDING);
-               } else {
-                       try {
-                               ret = func();
-                       } catch (const std::exception& e) {
-                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
-                                       MAS_DEPENDENCY_FUNC_STOP_RECORDING, e.what());
-                       }
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to stop recording, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] g_handle is not valid");
-       }
-
-       return ret;
-}
-
-int dependency_resolver_set_recording_session(unsigned int session)
-{
-       int ret = -1;
-       MAS_LOGD("g_handle : %p", g_handle);
-       if (NULL != g_handle) {
-               mas_dependency_set_recording_session func = g_mas_dependency.set_recording_session;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_SET_RECORDING_SESSION);
-               } else {
-                       try {
-                               ret = func(session);
-                       } catch (const std::exception& e) {
-                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
-                                       MAS_DEPENDENCY_FUNC_SET_RECORDING_SESSION, e.what());
-                       }
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to set recording session, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] g_handle is not valid");
-       }
-
-       return ret;
-}
-
-int dependency_resolver_set_background_volume(double ratio)
-{
-       int ret = -1;
-       if (NULL != g_handle) {
-               mas_dependency_set_background_volume func = g_mas_dependency.set_background_volume;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_SET_BACKGROUND_VOLUME);
-               } else {
-                       try {
-                               ret = func(ratio);
-                       } catch (const std::exception& e) {
-                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
-                                       MAS_DEPENDENCY_FUNC_SET_BACKGROUND_VOLUME, e.what());
-                       }
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to set background volume to %f, ret(%d)", ratio, ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] g_handle is not valid");
-       }
-
-       return ret;
-}
-
-int dependency_resolver_get_audio_format(int* rate, int* channel, int* audio_type)
-{
-       int ret = -1;
-       if (NULL != g_handle) {
-               mas_dependency_get_audio_format func = g_mas_dependency.get_audio_format;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_GET_AUDIO_FORMAT);
-               } else {
-                       try {
-                               ret = func(rate, channel, audio_type);
-                       } catch (const std::exception& e) {
-                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
-                                       MAS_DEPENDENCY_FUNC_GET_AUDIO_FORMAT, e.what());
-                       }
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to get audio format, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] g_handle is not valid");
-       }
-
-       return ret;
-}
-
-int dependency_resolver_get_audio_source_type(char** type)
-{
-       int ret = -1;
-       if (NULL != g_handle) {
-               mas_dependency_get_audio_source_type func = g_mas_dependency.get_audio_source_type;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_GET_AUDIO_SOURCE_TYPE);
-               } else {
-                       try {
-                               ret = func(type);
-                       } catch (const std::exception& e) {
-                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
-                                       MAS_DEPENDENCY_FUNC_GET_AUDIO_SOURCE_TYPE, e.what());
-                       }
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to get audio source type, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] g_handle is not valid");
-       }
-
-       return ret;
-}
-
-int dependency_resolver_process_wakeup_engine_command(const char* engine, const char* command)
-{
-       int ret = -1;
-       if (NULL != g_handle) {
-               mas_dependency_process_wakeup_engine_command func = g_mas_dependency.process_wakeup_engine_command;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_PROCESS_WAKEUP_ENGINE_COMMAND);
-               } else {
-                       try {
-                               ret = func(engine, command);
-                       } catch (const std::exception& e) {
-                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
-                                       MAS_DEPENDENCY_FUNC_PROCESS_WAKEUP_ENGINE_COMMAND, e.what());
-                       }
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to process wakeup engine command, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] g_handle is not valid");
-       }
-
-       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;
-}
-
-int dependency_resolver_set_voice_key_tap_duration(float duration)
-{
-       int ret = -1;
-       if (NULL != g_handle) {
-               mas_dependency_set_voice_key_tap_duration func = g_mas_dependency.set_voice_key_tap_duration;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_SET_VOICE_KEY_TAP_DURATION);
-               } else {
-                       try {
-                               ret = func(duration);
-                       } catch (const std::exception& e) {
-                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
-                                       MAS_DEPENDENCY_FUNC_SET_VOICE_KEY_TAP_DURATION, e.what());
-                       }
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to set voice key tap duration to %f, ret(%d)", duration, ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] g_handle is not valid");
-       }
-
-       return ret;
-}
-
-int dependency_resolver_unset_voice_key_tap_duration()
-{
-       int ret = -1;
-       if (NULL != g_handle) {
-               mas_dependency_unset_voice_key_tap_duration func = g_mas_dependency.unset_voice_key_tap_duration;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_UNSET_VOICE_KEY_TAP_DURATION);
-               } else {
-                       try {
-                               ret = func();
-                       } catch (const std::exception& e) {
-                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
-                                       MAS_DEPENDENCY_FUNC_UNSET_VOICE_KEY_TAP_DURATION, e.what());
-                       }
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to unset voice key tap duration, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] g_handle is not valid");
-       }
-
-       return ret;
-}
-
-int dependency_resolver_set_voice_key_support_mode(const char* support_mode)
-{
-       int ret = -1;
-       if (NULL != g_handle) {
-               mas_dependency_set_voice_key_support_mode func = g_mas_dependency.set_voice_key_support_mode;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_SET_VOICE_KEY_SUPPORT_MODE);
-               } else {
-                       try {
-                               ret = func(support_mode);
-                       } catch (const std::exception& e) {
-                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
-                                       MAS_DEPENDENCY_FUNC_SET_VOICE_KEY_SUPPORT_MODE, e.what());
-                       }
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to unset voice key tap duration, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] g_handle is not valid");
-       }
-
-       return ret;
-}
-
-int dependency_resolver_get_custom_vconf_key(const char* default_key, char** custom_key)
-{
-       int ret = -1;
-       if (NULL != g_handle) {
-               mas_dependency_get_custom_vconf_key func = g_mas_dependency.get_custom_vconf_key;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_GET_CUSTOM_VCONF_KEY);
-               } else {
-                       try {
-                               ret = func(default_key, custom_key);
-                       } catch (const std::exception& e) {
-                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
-                                       MAS_DEPENDENCY_FUNC_GET_CUSTOM_VCONF_KEY, e.what());
-                       }
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to get custom vconf key, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] g_handle is not valid");
-       }
-
-       return ret;
-}
diff --git a/plugins/wakeup-manager/src/heap_tracer.cpp b/plugins/wakeup-manager/src/heap_tracer.cpp
deleted file mode 100644 (file)
index ad650fd..0000000
+++ /dev/null
@@ -1,241 +0,0 @@
-#include "heap_tracer.h"
-
-#include <stdlib.h>
-#include <stdarg.h>
-
-#include <dlog.h>
-
-#ifdef LOG_TAG
-#undef LOG_TAG
-#endif
-#define LOG_TAG "ma_heap_tracer"
-
-static HeapTracer _tracer;
-
-const bool RECORD_UNMANAGED_CHUNKS = true;
-const int MAX_UNMANAGED_RECORDS = 128;
-const bool HEAP_TRACER_LOG_ENABLED = false
-;
-
-#define DESCRIPTION_LENGTH 255
-#define USE_HEAP_TRACER
-//#define ALLOW_FREE_UNMANAGED
-//#define RECORD_ALL_HISTORY
-
-void* vm_calloc(size_t nmemb, size_t size, const char *fmt, ...)
-{
-       void *ptr = calloc(nmemb, size);
-#ifdef USE_HEAP_TRACER
-       va_list argptr;
-       va_start(argptr, fmt);
-
-       char description[DESCRIPTION_LENGTH];
-       vsnprintf(description, sizeof(description), fmt, argptr);
-       _tracer.Insert(ptr, description, nmemb * size);
-
-       va_end(argptr);
-#endif
-       return ptr;
-}
-
-void* vm_malloc(size_t size, const char *fmt, ...)
-{
-       void *ptr = malloc(size);
-#ifdef USE_HEAP_TRACER
-       va_list argptr;
-       va_start(argptr, fmt);
-
-       char description[DESCRIPTION_LENGTH];
-       vsnprintf(description, sizeof(description), fmt, argptr);
-       _tracer.Insert(ptr, description, size);
-
-       va_end(argptr);
-#endif
-       return ptr;
-}
-
-void vm_free(void *ptr, const char *fmt, ...)
-{
-       if (ptr) {
-#ifdef USE_HEAP_TRACER
-               va_list argptr;
-               va_start(argptr, fmt);
-
-               bool managed = true;
-               char description[DESCRIPTION_LENGTH];
-               vsnprintf(description, sizeof(description), fmt, argptr);
-               if (false == _tracer.Delete(ptr, description)) {
-                       managed = false;
-                       _tracer.Find(ptr);
-               }
-#ifdef ALLOW_FREE_UNMANAGED
-               free(ptr);
-#else
-               if (managed) {
-                       free(ptr);
-               }
-#endif
-               va_end(argptr);
-#else
-               free(ptr);
-#endif
-       } else {
-               LOGD("Trying to free a null pointer");
-       }
-}
-
-char* vm_strdup(const char *s, const char *fmt, ...)
-{
-       char *ptr = nullptr;
-       if (s) {
-               ptr = strdup(s);
-#ifdef USE_HEAP_TRACER
-               va_list argptr;
-               va_start(argptr, fmt);
-
-               char description[DESCRIPTION_LENGTH];
-               vsnprintf(description, sizeof(description), fmt, argptr);
-               _tracer.Insert(ptr, description, strlen(s) + 1);
-
-               va_end(argptr);
-#endif
-       } else {
-               LOGD("Trying to duplicate a null pointer");
-       }
-       return ptr;
-}
-
-void *vm_mark_unmanaged(void *ptr, const char *fmt, ...)
-{
-#ifdef USE_HEAP_TRACER
-       va_list argptr;
-       va_start(argptr, fmt);
-
-       char description[DESCRIPTION_LENGTH];
-       vsnprintf(description, sizeof(description), fmt, argptr);
-       _tracer.MarkUnmanaged(ptr, description);
-
-       va_end(argptr);
-#endif
-       return ptr;
-}
-
-HeapTracer::HeapTracer()
-{
-       LOGD("HeapTracer()");
-}
-
-HeapTracer::~HeapTracer()
-{
-       LOGD("~HeapTracer()");
-
-       Trace();
-}
-
-bool HeapTracer::Insert(void *ptr, std::string description, size_t size)
-{
-       if (HEAP_TRACER_LOG_ENABLED) {
-               LOGD("Heap allocated %p [size %zu] : %s", ptr, size, description.c_str());
-       }
-
-       AllocationEntry entry;
-       entry.ptr = ptr;
-       entry.description = description;
-       entry.size = size;
-
-       std::lock_guard<std::mutex> lock(mManagedTableMutex);
-       mManagedTable[ptr] = entry;
-
-#ifdef RECORD_ALL_HISTORY
-       EntryHistory history;
-       history.entry = entry;
-       history.operation = EntryOperation::INSERT;
-       clock_gettime(CLOCK_REALTIME, &(history.ts));
-       mEntryHistory.push_back(history);
-#endif
-       return true;
-}
-
-bool HeapTracer::Delete(void *ptr, std::string description)
-{
-       if (HEAP_TRACER_LOG_ENABLED) {
-               LOGD("Heap deallocated %p : %s", ptr, description.c_str());
-       }
-
-       std::lock_guard<std::mutex> lock(mManagedTableMutex);
-       if (mManagedTable.find(ptr) != mManagedTable.end()) {
-#ifdef RECORD_ALL_HISTORY
-               EntryHistory history;
-               history.entry = mManagedTable[ptr];
-               history.entry.description = description;
-               history.operation = EntryOperation::DELETE;
-               clock_gettime(CLOCK_REALTIME, &(history.ts));
-               mEntryHistory.push_back(history);
-#endif
-               mManagedTable.erase(ptr);
-       } else {
-               LOGE("Heap Trace Error : Trying to delete an entry that does not exist : %p, %s",
-                       ptr, description.c_str());
-               return false;
-       }
-       return true;
-}
-
-std::string HeapTracer::Find(void *ptr)
-{
-       std::lock_guard<std::mutex> lock(mManagedTableMutex);
-#ifdef RECORD_ALL_HISTORY
-       for (auto& entry : mEntryHistory) {
-               if (entry.entry.ptr == ptr) {
-                       LOGD("Heap history record for %p : %s, %lld.%.9ld, %s",
-                               ptr,
-                               (entry.operation == EntryOperation::INSERT ? "INSERT" : "DELETE"),
-                               (long long)(entry.ts.tv_sec), entry.ts.tv_nsec,
-                               entry.entry.description.c_str());
-               }
-       }
-#endif
-       if (mManagedTable.find(ptr) != mManagedTable.end()) {
-               return mManagedTable[ptr].description;
-       }
-       return std::string("Not found");
-}
-
-void HeapTracer::MarkUnmanaged(void *ptr, std::string description)
-{
-       LOGD("Marking as unmanaged : %p %s", ptr, description.c_str());
-
-       std::lock_guard<std::mutex> lock(mManagedTableMutex);
-       auto iter = mManagedTable.find(ptr);
-       if (iter != mManagedTable.end()) {
-               if (RECORD_UNMANAGED_CHUNKS) {
-                       std::lock_guard<std::mutex> lock(mUnmanagedRecordsMutex);
-                       if (mUnmanagedRecordsSize >= MAX_UNMANAGED_RECORDS) {
-                               mUnmanagedRecords.pop_front();
-                               mUnmanagedRecordsSize--;
-                       }
-                       mUnmanagedRecords.push_back(iter->second);
-                       mUnmanagedRecordsSize++;
-               }
-               mManagedTable.erase(ptr);
-       } else {
-               LOGE("Heap Trace Error : Trying to mark an entry that does not exist as unmanaged : %p", ptr);
-       }
-}
-
-bool HeapTracer::Empty()
-{
-       std::lock_guard<std::mutex> lock(mManagedTableMutex);
-       return mManagedTable.empty();
-}
-
-void HeapTracer::Trace()
-{
-       LOGD("Heap Trace Start");
-
-       std::lock_guard<std::mutex> lock(mManagedTableMutex);
-       for (auto& item : mManagedTable) {
-               LOGD("No dealloc information exists for %p [size %d] : %s", item.first, item.second.size, item.second.description.c_str());
-       }
-       LOGD("Heap Trace End");
-}
diff --git a/plugins/wakeup-manager/src/wakeup_audio_manager.cpp b/plugins/wakeup-manager/src/wakeup_audio_manager.cpp
deleted file mode 100644 (file)
index 8bab1d6..0000000
+++ /dev/null
@@ -1,651 +0,0 @@
-#define _GNU_SOURCE
-
-#include "wakeup_audio_manager.h"
-#include "wakeup_manager_main.h"
-#include "dependency_resolver.h"
-#include "heap_tracer.h"
-
-#include <sys/time.h>
-#include <sys/resource.h>
-
-#include <algorithm>
-#include <map>
-
-#include <Ecore.h>
-#include <audio_io.h>
-#include <sound_manager.h>
-#include <sound_manager_internal.h>
-
-namespace multiassistant
-{
-namespace wakeup
-{
-
-/* Need to check whether this value needs to be configurable */
-static int g_speech_pcm_wait_count = 800;
-
-#ifdef PRINT_DETAILED_TIMEINFO
-static atomic_int g_mutex_wait_index{0};
-static map<int, long long int> g_mutex_wait_time;
-#endif
-
-static long long get_current_milliseconds_after_epoch()
-{
-       auto now = chrono::steady_clock::now();
-       auto now_ms = chrono::time_point_cast<chrono::milliseconds>(now);
-       /* number of milliseconds since the epoch of system_clock */
-       auto value = now_ms.time_since_epoch();
-
-       return value.count();
-}
-
-#ifdef PRINT_DETAILED_TIMEINFO
-static std::string get_current_milliseconds_after_epoch(chrono::time_point<chrono::steady_clock> point)
-{
-       auto now_ms = chrono::time_point_cast<chrono::milliseconds>(point);
-       /* number of milliseconds since the epoch of system_clock */
-       auto value = now_ms.time_since_epoch();
-
-       return std::to_string(value.count());
-}
-#endif
-
-CAudioManager::CAudioManager()
-{
-}
-
-CAudioManager::~CAudioManager()
-{
-       deinitialize();
-}
-
-CAudioManager::CAudioManager(IAudioEventObserver *observer) : CAudioManager()
-{
-       subscribe(observer);
-}
-
-void recording_focus_state_watch_cb(int id, sound_stream_focus_mask_e focus_mask,
-       sound_stream_focus_state_e focus_state, sound_stream_focus_change_reason_e reason,
-       const char *extra_info, void *user_data)
-{
-       MWR_LOGD("[Recorder] focus_mask : %d, focus_state : %d, reason : %d, [%s]",
-               focus_mask, focus_state, reason, extra_info);
-
-       if (nullptr == user_data) return;
-
-       /* The API description states that calling sound_manager_get_current_recording_focus()
-               function inside sound_stream_focus_state_watch_cb() function is prohibited */
-       ecore_main_loop_thread_safe_call_async(
-               [](void* data) {
-                       CAudioManager *manager = static_cast<CAudioManager*>(data);
-                       if (manager) {
-                               manager->sound_focus_changed();
-                       }
-               }, user_data);
-}
-
-int CAudioManager::initialize(void)
-{
-       sound_manager_add_focus_state_watch_cb(SOUND_STREAM_FOCUS_FOR_RECORDING,
-               recording_focus_state_watch_cb, this, &mSoundFocusWatchId);
-       return 0;
-}
-
-int CAudioManager::deinitialize(void)
-{
-       clear_audio_data();
-       if (mStreamingThread.joinable()) {
-               MWR_LOGD("mStreamingThread is joinable, trying join()");
-               mStopStreamingThread.store(true);
-               try {
-                       mStreamingThread.join();
-               } catch (std::exception &e) {
-                       MWR_LOGE("Exception thrown : %s", e.what());
-               }
-       }
-       mStopStreamingThread.store(false);
-
-       if (mBackgroundVolumeThread.joinable()) {
-               MWR_LOGD("mBackgroundVolumeThread is joinable, trying join()");
-               try {
-                       mBackgroundVolumeThread.join();
-               } catch (std::exception &e) {
-                       MWR_LOGE("Exception thrown : %s", e.what());
-               }
-       }
-
-       sound_manager_remove_focus_state_watch_cb(mSoundFocusWatchId);
-
-       return 0;
-}
-
-void CAudioManager::sound_focus_changed()
-{
-       sound_stream_focus_change_reason_e acquired_by;
-       int sound_behavior;
-       char* extra_info = NULL;
-       int focus = sound_manager_get_current_recording_focus(&acquired_by, &sound_behavior, &extra_info);
-       MWR_LOGD("[Recorder] sound focus has changed : %d %d %d %s", focus,
-               (SOUND_MANAGER_ERROR_NO_DATA != focus ? acquired_by : -1),
-               (SOUND_MANAGER_ERROR_NO_DATA != focus ? sound_behavior : -1),
-               (SOUND_MANAGER_ERROR_NO_DATA != focus ? extra_info : ""));
-       if (SOUND_MANAGER_ERROR_NO_DATA == focus) {
-               if (mRecordingRequired && !mIsRecording) {
-                       MWR_LOGD("[Recorder] Currently no other process has acquired sound focus, start recording");
-                       start_recording(false);
-               }
-       } else {
-               if (mIsRecording) {
-                       MWR_LOGW("[Recorder] Sound focus acquired by other process, stop recording");
-                       stop_recording(false);
-               }
-       }
-       if (extra_info) {
-               free(extra_info);
-               extra_info = NULL;
-       }
-}
-
-void CAudioManager::subscribe(IAudioEventObserver *observer)
-{
-       lock_guard<mutex> lock(mMutex);
-       if (observer) {
-               mObservers.push_back(observer);
-       }
-}
-
-void CAudioManager::unsubscribe(IAudioEventObserver *observer)
-{
-       lock_guard<mutex> lock(mMutex);
-       auto iter = find(mObservers.begin(), mObservers.end(), observer);
-       if (iter != mObservers.end()) {
-               mObservers.erase(iter);
-       }
-}
-
-void CAudioManager::stop_recording(bool proactive)
-{
-       dependency_resolver_stop_recording();
-       if (proactive) {
-               mRecordingRequired = false;
-       }
-       mIsRecording = false;
-}
-
-void CAudioManager::start_recording(bool proactive)
-{
-       if (mIsRecording) {
-               stop_recording(false);
-       }
-       if (proactive) {
-               mRecordingRequired = true;
-       }
-
-       sound_stream_focus_change_reason_e acquired_by;
-       int sound_behavior;
-       char* extra_info = NULL;
-       if (SOUND_MANAGER_ERROR_NO_DATA == sound_manager_get_current_recording_focus(&acquired_by, &sound_behavior, &extra_info)) {
-               MWR_LOGD("[Recorder] Currently no other process has acquired sound focus, start recording");
-               dependency_resolver_start_recording();
-               mIsRecording = true;
-       } else {
-               MWR_LOGW("[Recorder] Currently sound focus is acquired by other process, skip recording");
-       }
-       if (extra_info) {
-               free(extra_info);
-               extra_info = NULL;
-       }
-}
-
-void CAudioManager::set_recording_session(recording_session session)
-{
-       dependency_resolver_set_recording_session((unsigned int)session);
-}
-
-/* Need to consider adapting conventional producer-consumer model */
-void CAudioManager::streaming_previous_audio_data_thread_func()
-{
-       MWR_LOGI("[ENTER]");
-
-       unique_lock<mutex> lock(mMutex, defer_lock);
-
-       /* get feedback data */
-       size_t audio_data_size = 0;
-       lock.lock();
-       audio_data_size = mPreviousAudioData.size();
-       for (int index = 0; index < audio_data_size; index++) {
-               mas_speech_data& speech_data = mPreviousAudioData.at(index).data;
-               for (const auto& observer : mObservers) {
-                       if (observer) {
-                               if (!observer->on_streaming_audio_data(
-                                       speech_data.event, speech_data.buffer, speech_data.len)) {
-                                       LOGE("[Recorder WARNING] One of the observer returned false");
-                               }
-                       }
-
-                       if (MAS_SPEECH_STREAMING_EVENT_FINISH == speech_data.event) {
-                               MWR_LOGI("[INFO] Finish to send previous speech data");
-                               return;
-                       }
-               }
-
-               if (mStopStreamingThread.load()) {
-                       MWR_LOGI("[INFO] Stop Streaming Requested, returning");
-                       return;
-               }
-       }
-       lock.unlock();
-
-       MWR_LOGI("[EXIT]");
-}
-
-static void validate_audio_data_event_field(const mas_speech_data &data)
-{
-       if (data.event == MAS_SPEECH_STREAMING_EVENT_CONTINUE ||
-               data.event == MAS_SPEECH_STREAMING_EVENT_START ||
-               data.event == MAS_SPEECH_STREAMING_EVENT_FINISH ||
-               data.event == MAS_SPEECH_STREAMING_EVENT_FAIL) {
-               return;
-       }
-       MWR_LOGE("mas_speech_data has event field : %d", data.event);
-}
-
-void CAudioManager::streaming_audio_data_thread_func(long long start_time)
-{
-       MWR_LOGI("[ENTER]");
-
-       mStreamingThreadActive.store(true);
-
-       unique_lock<mutex> lock(mMutex, defer_lock);
-       bool finish_event_sent = false;
-
-       lock.lock();
-       auto lead = mAudioData.begin();
-       auto iter = lead;
-       while (lead != mAudioData.end() && lead->time < start_time) {
-               iter = lead;
-               advance(lead, 1);
-       }
-       MWR_LOGE("data_count : %zu", mAudioData.size());
-       lock.unlock();
-
-       while (!(mStopStreamingThread.load())) {
-               const size_t SEND_BUFFER_SIZE = 4096;
-               unsigned char send_buffer[SEND_BUFFER_SIZE];
-
-               int ret = -1;
-               int cnt = 0;
-
-               /* get feedback data */
-               lock.lock();
-               auto end = mAudioData.end();
-               lock.unlock();
-               if (lead == end) {
-                       /* empty queue */
-                       MWR_LOGD("[DEBUG] No feedback data. Waiting mode : %d", ret);
-
-                       /* waiting */
-                       while (!(mStopStreamingThread.load())) {
-                               this_thread::sleep_for(chrono::milliseconds(10));
-                               lock.lock();
-                               end = mAudioData.end();
-                               auto begin = mAudioData.begin();
-                               vector<IAudioEventObserver*> observers = mObservers;
-                               lock.unlock();
-                               if (iter == end) {
-                                       lead = begin;
-                               } else {
-                                       lead = iter;
-                                       if (lead != end) {
-                                               advance(lead, 1);
-                                       }
-                               }
-                               if (lead != end) {
-                                       MWR_LOGD("[INFO] Resume thread");
-                                       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 : observers) {
-                                               if (observer) {
-                                                       if (!observer->on_streaming_audio_data(
-                                                               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");
-                                                       }
-                                               }
-                                       }
-                                       mStreamingThreadActive.store(false);
-                                       return;
-                               }
-                               cnt++;
-                       }
-                       MWR_LOGD("[INFO] Finish to wait for new feedback data come");
-
-                       /* resume feedback thread */
-                       continue;
-               }
-
-               /* FIXME : Extracted audio data here should be used as previous audio data*/
-
-               lock.lock();
-               end = mAudioData.end();
-               vector<IAudioEventObserver*> observers = mObservers;
-
-               if (lead != end) {
-                       iter = lead;
-
-                       mas_speech_data speech_data = iter->data;
-                       size_t len = speech_data.len;
-                       if (len > SEND_BUFFER_SIZE) {
-                               LOGE("ERROR : SPEECH DATA contains data bigger than the buffer size : %d, truncating", len);
-                               len = SEND_BUFFER_SIZE;
-                       }
-                       memcpy(send_buffer, speech_data.buffer, len);
-                       speech_data.buffer = send_buffer;
-                       speech_data.len = len;
-                       lock.unlock();
-
-                       for (const auto& observer : observers) {
-                               if (observer) {
-                                       validate_audio_data_event_field(speech_data);
-
-#ifdef PRINT_DETAILED_TIMEINFO
-                                       auto started = std::chrono::steady_clock::now();
-#endif
-                                       if (!observer->on_streaming_audio_data(
-                                               speech_data.event, speech_data.buffer, speech_data.len)) {
-                                               LOGE("[Recorder WARNING] One of the observer returned false");
-                                       }
-#ifdef PRINT_DETAILED_TIMEINFO
-                                       auto finished = std::chrono::steady_clock::now();
-                                       auto interval = finished - started;
-                                       long long int count = static_cast<long long int>(
-                                               chrono::duration_cast<chrono::milliseconds>(interval).count());
-                                       int index = g_mutex_wait_index;
-                                       g_mutex_wait_time[index] += count;
-#endif
-                               }
-                       }
-
-                       if (MAS_SPEECH_STREAMING_EVENT_FINISH == speech_data.event) {
-                               MWR_LOGE("[INFO] Finish to get and send speech data");
-                               finish_event_sent = true;
-                               break;
-                       }
-
-                       advance(lead, 1);
-               } else {
-                       lock.unlock();
-               }
-       }
-
-       if (true != finish_event_sent) {
-               unsigned char final_buffer[2] = {'\0', };
-               lock.lock();
-               vector<IAudioEventObserver*> observers = mObservers;
-               lock.unlock();
-               for (const auto& observer : observers) {
-                       if (observer) {
-                               MWR_LOGE("No FINISH event sent yet, adding to finalize streaming session");
-                               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");
-                               }
-                       }
-               }
-       }
-       mStreamingThreadActive.store(false);
-       MWR_LOGE("[EXIT]");
-}
-
-#ifdef PRINT_DETAILED_TIMEINFO
-static void print_duration(std::chrono::time_point<std::chrono::steady_clock> started)
-{
-       const std::chrono::milliseconds threshold(100);
-       auto finished = std::chrono::steady_clock::now();
-       auto interval = finished - started;
-       if (interval > threshold) {
-               long long int count = static_cast<long long int>(
-                       std::chrono::duration_cast<std::chrono::milliseconds>(interval).count());
-               int index = g_mutex_wait_index;
-               MAS_LOGE("Mutex wait time : %d %lld %lld, [%s~]", index, count,
-                       g_mutex_wait_time[index],
-                       get_current_milliseconds_after_epoch(started).c_str());
-       }
-}
-#endif
-
-void CAudioManager::add_audio_data(mas_speech_data& data, long long time)
-{
-#ifdef PRINT_DETAILED_TIMEINFO
-       ++g_mutex_wait_index;
-#endif
-
-       long long delta = mAudioRecordingDurationMilliseconds;
-
-       bool print_log = false;
-       static unsigned int num = 0;
-       const std::chrono::seconds interval(3);
-       static auto last = std::chrono::steady_clock::now();
-       auto now = std::chrono::steady_clock::now();
-
-       struct rusage process_usage_before;
-       struct rusage thread_usage_before;
-
-       if (now - last > interval) {
-               print_log = true;
-               last = now;
-               getrusage(RUSAGE_SELF, &process_usage_before);
-               getrusage(RUSAGE_THREAD, &thread_usage_before);
-       }
-       num++;
-
-       notify_audio_data_recording(time, data.buffer, data.len);
-
-       if (print_log) {
-               struct rusage process_usage_after;
-               struct rusage thread_usage_after;
-
-               getrusage(RUSAGE_SELF, &process_usage_after);
-               getrusage(RUSAGE_THREAD, &thread_usage_after);
-
-               MWR_LOGE("Feeding audio data : num(%d), now(%" PRId64 "), %d %zu ([%ld,%ld,%ld,%ld] -> [%ld,%ld,%ld,%ld]) ([%ld,%ld,%ld,%ld] -> [%ld,%ld,%ld,%ld])",
-                       num, now.time_since_epoch().count(),
-                       mStreamingThreadActive.load(), mAudioData.size(),
-                       process_usage_before.ru_maxrss,
-                       process_usage_before.ru_ixrss,
-                       process_usage_before.ru_idrss,
-                       process_usage_before.ru_isrss,
-                       process_usage_after.ru_maxrss,
-                       process_usage_after.ru_ixrss,
-                       process_usage_after.ru_idrss,
-                       process_usage_after.ru_isrss,
-                       thread_usage_before.ru_maxrss,
-                       thread_usage_before.ru_ixrss,
-                       thread_usage_before.ru_idrss,
-                       thread_usage_before.ru_isrss,
-                       thread_usage_after.ru_maxrss,
-                       thread_usage_after.ru_ixrss,
-                       thread_usage_after.ru_idrss,
-                       thread_usage_after.ru_isrss);
-       }
-
-       mas_speech_data_with_time data_with_time;
-       data_with_time.data = data;
-       data_with_time.time = time;
-
-       lock_guard<mutex> lock(mMutex);
-
-#ifdef PRINT_DETAILED_TIMEINFO
-       print_duration(now);
-#endif
-
-       /* Pop items only when the streaming is not activated */
-       if (!mStreamingThreadActive.load()) {
-               while(false == mAudioData.empty() && mAudioData.front().time < time - delta) {
-                       const auto &front = mAudioData.front();
-                       if (front.data.buffer) {
-                               vm_free_simple(front.data.buffer);
-                       }
-                       mAudioData.pop_front();
-               }
-       }
-       validate_audio_data_event_field(data);
-       mAudioData.push_back(data_with_time);
-}
-
-void CAudioManager::feed_audio_data(mas_speech_streaming_event_e event, void* buffer, int len)
-{
-       if (NULL == buffer || 0 == len) return;
-
-       mas_speech_data speech_data;
-       speech_data.buffer = vm_malloc_simple(len);
-       if (speech_data.buffer) {
-               long long time = get_current_milliseconds_after_epoch();
-
-               speech_data.event = event;
-               speech_data.len = len;
-               memcpy(speech_data.buffer, buffer, len);
-               add_audio_data(speech_data, time);
-       }
-}
-
-void CAudioManager::finalize_audio_data()
-{
-       MWR_LOGI("Adding FINISH event to audio data list");
-       unsigned char final_buffer[2] = {'\0', };
-       mas_speech_data speech_data;
-       speech_data.event = MAS_SPEECH_STREAMING_EVENT_FINISH;
-       speech_data.len = sizeof(final_buffer);
-       speech_data.buffer = vm_malloc_simple(speech_data.len);
-       if (speech_data.buffer) {
-               long long time = get_current_milliseconds_after_epoch();
-
-               memcpy(speech_data.buffer, final_buffer, speech_data.len);
-               add_audio_data(speech_data, time);
-       }
-}
-
-void CAudioManager::clear_audio_data()
-{
-       lock_guard<mutex> lock(mMutex);
-       while(!mAudioData.empty()) {
-               const auto &front = mAudioData.front();
-               if (front.data.buffer) {
-                       vm_free_simple(front.data.buffer);
-               }
-               mAudioData.pop_front();
-       }
-       mAudioData.clear();
-}
-
-void CAudioManager::notify_audio_data_recording(long time, void* data, int len)
-{
-       unique_lock<mutex> lock(mMutex, defer_lock);
-       lock.lock();
-       vector<IAudioEventObserver*> observers = mObservers;
-       lock.unlock();
-       for (const auto& observer : observers) {
-               if (observer) {
-                       observer->on_recording_audio_data(time, data, len);
-               }
-       }
-}
-
-void CAudioManager::start_streaming_current_utterance_data(long long start_time)
-{
-       MWR_LOGI("[ENTER]");
-       if (mStreamingThread.joinable()) {
-               MWR_LOGE("ERROR : mStreamingThread is joinable, will not start a new thread");
-               return;
-       }
-       lock_guard<mutex> lock(mMutex);
-       mStreamingThread = thread(&CAudioManager::streaming_audio_data_thread_func, this, start_time);
-}
-
-void CAudioManager::stop_streaming_current_utterance_data()
-{
-       MWR_LOGI("[ENTER]");
-       if (mStreamingThread.joinable()) {
-               MWR_LOGD("mStreamingThread is joinable, trying join()");
-               mStopStreamingThread.store(true);
-               try {
-                       mStreamingThread.join();
-               } catch (std::exception &e) {
-                       MWR_LOGE("Exception thrown : %s", e.what());
-               }
-       }
-       mStopStreamingThread.store(false);
-
-       /* FIXME : Need to move all the speech data to previous speech data for later use */
-}
-
-void CAudioManager::start_streaming_previous_utterance_data()
-{
-       MWR_LOGI("[ENTER]");
-       if (mStreamingPreviousThread.joinable()) {
-               MWR_LOGE("ERROR : mStreamingPreviousThread is joinable, will not start a new thread");
-               return;
-       }
-       lock_guard<mutex> lock(mMutex);
-       mStreamingPreviousThread = thread(&CAudioManager::streaming_previous_audio_data_thread_func, this);
-}
-
-void CAudioManager::stop_streaming_previous_utterance_data()
-{
-       MWR_LOGI("[ENTER]");
-       if (mStreamingPreviousThread.joinable()) {
-               MWR_LOGD("mStreamingPreviousThread is joinable, trying join()");
-               mStopStreamingPreviousThread.store(true);
-               try {
-                       mStreamingPreviousThread.join();
-               } catch (std::exception &e) {
-                       MWR_LOGE("Exception thrown : %s", e.what());
-               }
-       }
-       mStopStreamingThread.store(false);
-}
-
-void CAudioManager::start_streaming_follow_up_data()
-{
-       MWR_LOGI("[ENTER]");
-       if (mStreamingThread.joinable()) {
-               MWR_LOGE("ERROR : mStreamingThread is joinable, will not start a new thread");
-               return;
-       }
-
-       mStreamingThread = thread(&CAudioManager::streaming_audio_data_thread_func, this, 0);
-}
-
-void CAudioManager::stop_streaming_follow_up_data()
-{
-       MWR_LOGI("[ENTER]");
-       if (mStreamingThread.joinable()) {
-               MWR_LOGD("mStreamingThread is joinable, trying join()");
-               mStopStreamingThread.store(true);
-               mStreamingThread.join();
-       }
-       mStopStreamingThread.store(false);
-}
-
-static void set_background_volume_thread_func(double ratio)
-{
-       MWR_LOGI("[ENTER]");
-       dependency_resolver_set_background_volume(ratio);
-}
-
-void CAudioManager::set_background_volume(double ratio)
-{
-       if (mBackgroundVolumeThread.joinable()) {
-               mBackgroundVolumeThread.join();
-       }
-       mBackgroundVolumeThread = thread(&set_background_volume_thread_func, ratio);
-}
-
-} // wakeup
-} // multiassistant
diff --git a/plugins/wakeup-manager/src/wakeup_engine_manager.cpp b/plugins/wakeup-manager/src/wakeup_engine_manager.cpp
deleted file mode 100644 (file)
index cb0c0b7..0000000
+++ /dev/null
@@ -1,1072 +0,0 @@
-#include <multi_assistant_service.h>
-
-#include "wakeup_engine_manager.h"
-#include "wakeup_manager_main.h"
-
-#include <dlfcn.h>
-#include <algorithm>
-#include <pkgmgr-info.h>
-#include <deque>
-
-namespace multiassistant
-{
-namespace wakeup
-{
-
-/* Sound buf save for test */
-#if 0
-#define BUF_SAVE_MODE
-#endif
-
-#ifdef BUF_SAVE_MODE
-static char g_temp_file_name[128] = {'\0', };
-
-static FILE* g_pFile = NULL;
-
-static int g_count = 1;
-#endif
-
-/* Need to check whether this value needs to be configurable */
-static int g_speech_pcm_wait_count = 800;
-
-/* Utility function for checking if an element exists in a container */
-template<class C, class T>
-static auto contains(const C& v, const T& x) -> decltype(end(v), true)
-{
-       return end(v) != find(begin(v), end(v), x);
-}
-
-static long long get_current_milliseconds_after_epoch()
-{
-       auto now = chrono::steady_clock::now();
-       auto now_ms = chrono::time_point_cast<chrono::milliseconds>(now);
-       /* number of milliseconds since the epoch of system_clock */
-       auto value = now_ms.time_since_epoch();
-
-       return value.count();
-}
-
-CWakeupEngineManager::CWakeupEngineManager()
-{
-}
-
-CWakeupEngineManager::~CWakeupEngineManager()
-{
-       MWR_LOGI("Wakeup Engine Manager is now being destroyed");
-}
-
-CWakeupEngineManager::CWakeupEngineManager(IEngineEventObserver *observer) : CWakeupEngineManager()
-{
-       subscribe(observer);
-}
-
-void CWakeupEngineManager::initialize()
-{
-       DIR* dp = opendir(MA_WAKEUP_ENGINE_PATH);
-       if (nullptr == dp) {
-               MWR_LOGD("Failed opening directory : %s", (const char*)MA_WAKEUP_ENGINE_PATH);
-       } else {
-               struct dirent *dirp = nullptr;
-               char dirpath[_POSIX_PATH_MAX];
-               do {
-                       dirp = readdir(dp);
-
-                       if (nullptr != dirp) {
-                               const string current_directory{"."};
-                               const string parent_directory{".."};
-                               if (0 == current_directory.compare(dirp->d_name) ||
-                                       0 == parent_directory.compare(dirp->d_name))
-                                       continue;
-
-                               if (DT_DIR != dirp->d_type) /* If not a directory */
-                                       continue;
-
-                               int dirpath_len = strlen(MA_WAKEUP_ENGINE_PATH) + strlen(dirp->d_name) + 1;
-                               if (dirpath_len >= _POSIX_PATH_MAX) {
-                                       MWR_LOGD("File path is too long : %s", dirp->d_name);
-                                       closedir(dp);
-                                       return;
-                               }
-
-                               memset(dirpath, '\0', _POSIX_PATH_MAX);
-                               snprintf(dirpath, _POSIX_PATH_MAX, "%s/%s",
-                                       (const char*)(MA_WAKEUP_ENGINE_PATH), dirp->d_name);
-
-                               add_engine_directory(string{dirp->d_name}, dirpath);
-                       }
-               } while (nullptr != dirp);
-
-               closedir(dp);
-       }
-}
-
-void CWakeupEngineManager::deinitialize()
-{
-       MWR_LOGI("[START]");
-       if (mStreamingThread.joinable()) {
-               MWR_LOGD("mStreamingThread is joinable, trying join()");
-               mStopStreamingThread.store(true);
-               mStreamingThread.join();
-       }
-       mStopStreamingThread.store(false);
-
-       for (auto& info : mEngineInfo) {
-               try {
-                       if (info.interface.set_wakeup_event_callback) {
-                               info.interface.set_wakeup_event_callback(nullptr, nullptr);
-                       }
-                       if (info.interface.set_speech_status_callback) {
-                               info.interface.set_speech_status_callback(nullptr, nullptr);
-                       }
-                       if (info.interface.set_error_callback) {
-                               info.interface.set_error_callback(nullptr, nullptr);
-                       }
-                       if (info.interface.set_audio_data_require_status_callback) {
-                               info.interface.set_audio_data_require_status_callback(nullptr, nullptr);
-                       }
-                       if (info.interface.set_wakeup_engine_command_callback) {
-                               info.interface.set_wakeup_engine_command_callback(nullptr, nullptr);
-                       }
-                       MWR_LOGI("Trying to deinitialize engine : %s", info.engine_name.c_str());
-                       if (info.interface.deinitialize) {
-                               int ret = info.interface.deinitialize();
-                               MWR_LOGI("Deinitialization [%s] returned %d", info.engine_name.c_str(), ret);
-                       }
-               } catch (const std::exception& e) {
-                       MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
-                               info.engine_name.c_str(), e.what());
-               }
-               if (info.engine_handle) {
-                       int ret = dlclose(info.engine_handle);
-                       MWR_LOGI("Closing [%s] returned %d, [%s]", info.engine_name.c_str(), ret,
-                               ((0 == ret) ? "" : dlerror()));
-                       info.engine_handle = nullptr;
-               }
-       }
-       mSelectedEngine = nullptr;
-       mEngineInfo.clear();
-       MWR_LOGI("[END]");
-}
-
-void CWakeupEngineManager::subscribe(IEngineEventObserver *observer)
-{
-       mObservers.push_back(observer);
-       MWR_LOGD("Added Observer : %p %zu", observer, mObservers.size());
-}
-
-void CWakeupEngineManager::unsubscribe(IEngineEventObserver *observer)
-{
-       auto iter = find(mObservers.begin(), mObservers.end(), observer);
-       if (iter != mObservers.end()) {
-               mObservers.erase(iter);
-       }
-}
-
-bool CWakeupEngineManager::get_audio_data_required()
-{
-       return mAudioDataRequired;
-}
-
-void CWakeupEngineManager::set_selected_wakeup_info(mas_wakeup_event_info wakeup_info)
-{
-       mSelectedEngine = nullptr;
-
-       const auto& iter = find_if(mEngineInfo.begin(), mEngineInfo.end(),
-               [wakeup_info](const EngineInfo& info) {
-                       if (nullptr == wakeup_info.wakeup_engine)
-                               return false;
-
-                       return (0 == info.engine_name.compare(wakeup_info.wakeup_engine));
-               });
-
-       if (iter != mEngineInfo.end()) {
-               mSelectedEngine = &(*iter);
-               MWR_LOGD("Selected : %s", iter->engine_name.c_str());
-       }
-}
-
-bool CWakeupEngineManager::set_language(string language)
-{
-       for (const auto& info : mEngineInfo) {
-               if (info.interface.set_language) {
-                       try {
-                               info.interface.set_language(language.c_str());
-                       } catch (const std::exception& e) {
-                               MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
-                                       info.engine_name.c_str(), e.what());
-                       }
-               }
-       }
-       return true;
-}
-
-bool CWakeupEngineManager::set_assistant_language(string appid, string language)
-{
-       for (auto& info : mEngineInfo) {
-               const auto& iter = find_if(info.assistant_list.begin(), info.assistant_list.end(),
-                       [appid](const string& assistant) {
-                               return (0 == assistant.compare(appid));
-                       });
-
-               /* If the appid is in the assistant list */
-               if (info.assistant_list.end() != iter) {
-                       try {
-                               int ret = info.interface.set_language(language.c_str());
-                               MWR_LOGI("set_language returned %d : %s %s %s",
-                                       ret, appid.c_str(), info.engine_name.c_str(), language.c_str());
-                       } catch (const std::exception& e) {
-                               MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
-                                       info.engine_name.c_str(), e.what());
-                       }
-               }
-       }
-       return true;
-}
-
-void CWakeupEngineManager::set_assistant_activated(string appid, bool activated)
-{
-       MWR_LOGE("[ENTER] : %s %d", appid.c_str(), activated);
-       for (auto& info : mEngineInfo) {
-               const auto& iter = find_if(info.assistant_list.begin(), info.assistant_list.end(),
-                       [appid](const string& assistant) {
-                               return (0 == assistant.compare(appid));
-                       });
-
-               /* If the appid is in the assistant list */
-               if (info.assistant_list.end() != iter) {
-                       MWR_LOGI("%s has %s", info.engine_name.c_str(), appid.c_str());
-                       bool previously_activated = info.activated;
-                       if (activated) {
-                               info.activated_assistants.insert(appid);
-                       } else {
-                               info.activated_assistants.erase(appid);
-                       }
-                       info.activated = (info.activated_assistants.size() > 0);
-                       if (previously_activated != info.activated) {
-                               if (info.activated) {
-                                       try {
-                                               info.interface.activate();
-                                               MWR_LOGW("Activating wakeup engine : %s", info.engine_name.c_str());
-                                       } catch (const std::exception& e) {
-                                               MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
-                                                       info.engine_name.c_str(), e.what());
-                                       }
-                               } else {
-                                       try {
-                                               info.interface.deactivate();
-                                               MWR_LOGW("Deactivating wakeup engine : %s", info.engine_name.c_str());
-                                       } catch (const std::exception& e) {
-                                               MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
-                                                       info.engine_name.c_str(), e.what());
-                                       }
-                               }
-                               /* Activated status changed, need to update audio_data_require_status too */
-                               on_audio_data_require_status(info.engine_name, info.audio_data_require_status);
-                       }
-               } else {
-                       MWR_LOGI("%s does not have %s", info.engine_name.c_str(), appid.c_str());
-               }
-       }
-}
-
-void CWakeupEngineManager::set_wake_word_audio_require_flag(bool require)
-{
-       MWR_LOGD("[ENTER]");
-       mWakeWordAudioRequired = require;
-       for (const auto& info : mEngineInfo) {
-               if (info.interface.set_wake_word_audio_require_flag) {
-                       try {
-                               info.interface.set_wake_word_audio_require_flag(require);
-                       } catch (const std::exception& e) {
-                               MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
-                                       info.engine_name.c_str(), e.what());
-                       }
-               }
-       }
-}
-
-void CWakeupEngineManager::streaming_speech_data_thread_func()
-{
-       MWR_LOGE("[ENTER]");
-
-       if (nullptr == mSelectedEngine) {
-               MWR_LOGE("No Engine Selected");
-               return;
-       }
-
-       const wakeup_engine_interface *interface = &(mSelectedEngine->interface);
-
-       if (NULL == interface ||
-               NULL == interface->get_utterance_data ||
-               NULL == interface->get_utterance_data_count)
-               return;
-
-       MWR_LOGE("data_count : %s, %d",
-               mSelectedEngine->engine_name.c_str(),
-               interface->get_utterance_data_count());
-
-#ifdef BUF_SAVE_MODE
-       if (g_pFile) {
-               fclose(g_pFile);
-               g_pFile = NULL;
-       } else {
-               MWR_LOGD("[Recorder Info] File not found!");
-       }
-
-       while (1) {
-               snprintf(g_temp_file_name, sizeof(g_temp_file_name), "/tmp/ma_wue_%d_%d", getpid(), g_count);
-               int ret = access(g_temp_file_name, 0);
-
-               if (0 == ret) {
-                       MWR_LOGD("[Recorder ERROR] File is already exist");
-                       if (0 == remove(g_temp_file_name)) {
-                               MWR_LOGD("[Recorder] Remove file");
-                               break;
-                       } else {
-                               g_count++;
-                       }
-               } else {
-                       break;
-               }
-       }
-
-       MWR_LOGD("[Recorder] Temp file name=[%s]", g_temp_file_name);
-
-       /* open test file */
-       g_pFile = fopen(g_temp_file_name, "wb+x");
-       if (!g_pFile) {
-               MWR_LOGD("[Recorder ERROR] File not found!");
-               return;
-       }
-       g_count++;
-#endif
-
-       mas_speech_data speech_data;
-       int index = 0;
-       bool finish_event_sent = false;
-
-       if (mWakeWordAudioRequired &&
-               NULL != interface->get_wake_word_data &&
-               NULL != interface->get_wake_word_data_count) {
-               for (const auto& observer : mObservers) {
-                       if (observer) {
-                               if (!observer->on_audio_streaming_data_section(MA_AUDIO_STREAMING_DATA_SECTION_WAKE_WORD)) {
-                                       LOGE("[Recorder WARNING] One of the observer returned false");
-                               }
-                       }
-               }
-               int count = interface->get_wake_word_data_count();
-               while (!(mStopStreamingThread.load()) && index < count) {
-                       int ret = interface->get_wake_word_data(index, &speech_data);
-                       if (0 == ret) {
-#ifdef BUF_SAVE_MODE
-                               if (g_pFile)
-                                       fwrite(speech_data.buffer, 1, speech_data.len, g_pFile);
-#endif
-                               for (const auto& observer : mObservers) {
-                                       if (observer) {
-                                               if (!observer->on_streaming_audio_data(
-                                                       speech_data.event, speech_data.buffer, speech_data.len)) {
-                                                       LOGE("[Recorder WARNING] One of the observer returned false");
-                                               }
-                                       }
-                               }
-                       } else {
-                               break;
-                       }
-                       index++;
-               }
-               index = 0;
-               for (const auto& observer : mObservers) {
-                       if (observer) {
-                               if (!observer->on_audio_streaming_data_section(MA_AUDIO_STREAMING_DATA_SECTION_UTTERANCE)) {
-                                       LOGE("[Recorder WARNING] One of the observer returned false");
-                               }
-                       }
-               }
-       }
-
-       int burst_count = 0;
-       int sleep_count = 0;
-
-       while (!(mStopStreamingThread.load())) {
-               int ret = -1;
-               int cnt = 0;
-
-               /* get feedback data */
-               if (interface && interface->get_utterance_data) {
-                       ret = interface->get_utterance_data(index, &speech_data);
-                       mStreamingHistory.last_audio_fetched.store(get_current_milliseconds_after_epoch());
-
-                       if (0 != ret) {
-                               /* empty queue */
-                               MWR_LOGI("[DEBUG] No feedback data. Waiting mode : %d %d", ret, cnt);
-
-                               sleep_count = 0;
-                               /* waiting */
-                               while (!(mStopStreamingThread.load())) {
-                                       burst_count = 0;
-                                       if (++sleep_count >= 100) {
-                                               MWR_LOGI("Still waiting : %d %p %p", sleep_count,
-                                                       interface->get_utterance_data,
-                                                       interface->get_utterance_data_count);
-                                               sleep_count = 0;
-                                       }
-                                       this_thread::sleep_for(chrono::milliseconds(10));
-                                       if (index < interface->get_utterance_data_count()) {
-                                               MWR_LOGI("[INFO] Resume thread, %d", cnt);
-                                               break;
-                                       }
-                                       mStreamingHistory.last_count_fetched.store(get_current_milliseconds_after_epoch());
-                                       if (g_speech_pcm_wait_count < cnt) {
-                                               unsigned char final_buffer[2] = {'\0', };
-                                               MWR_LOGE("[ERROR] Wrong request, there's no pcm data : %d", cnt);
-#ifdef BUF_SAVE_MODE
-                                               if (g_pFile) {
-                                                       fwrite(final_buffer, 1, sizeof(final_buffer), g_pFile);
-                                                       MWR_LOGE("[Recorder SUCCESS] File Close");
-                                                       fclose(g_pFile);
-                                                       g_pFile = NULL;
-                                               }
-#endif
-                                               for (const auto& observer : mObservers) {
-                                                       if (observer) {
-                                                               if (!observer->on_streaming_audio_data(
-                                                                       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");
-                                                               }
-                                                               mStreamingHistory.last_audio_sent.store(get_current_milliseconds_after_epoch());
-                                                       }
-                                               }
-                                               return;
-                                       }
-                                       cnt++;
-                               }
-                               MWR_LOGD("[INFO] Finish to wait for new feedback data come");
-
-                               /* resume feedback thread */
-                               continue;
-                       }
-
-#ifdef BUF_SAVE_MODE
-                       if (g_pFile)
-                               fwrite(speech_data.buffer, 1, speech_data.len, g_pFile);
-
-                       if (MAS_SPEECH_STREAMING_EVENT_FINISH == speech_data.event) {
-                               if (g_pFile) {
-                                       MWR_LOGE("[Recorder SUCCESS] File Close");
-                                       fclose(g_pFile);
-                                       g_pFile = NULL;
-                               } else {
-                                       MWR_LOGE("[Recorder ERROR] File not found!");
-                               }
-                       }
-#endif
-                       const int sleep_duration_in_millis = 10;
-                       const int max_burst_count = 3;
-                       if (++burst_count >= max_burst_count) {
-                               burst_count = 0;
-                               MWR_LOGI("[INFO] Streaming data burst transmission detected, forcing sleep");
-                               this_thread::sleep_for(chrono::milliseconds(sleep_duration_in_millis));
-                       }
-                       for (const auto& observer : mObservers) {
-                               if (observer) {
-                                       if (!observer->on_streaming_audio_data(
-                                               speech_data.event, speech_data.buffer, speech_data.len)) {
-                                               LOGE("[Recorder WARNING] One of the observer returned false");
-                                       }
-                                       mStreamingHistory.last_audio_sent.store(get_current_milliseconds_after_epoch());
-                               }
-                       }
-
-                       if (MAS_SPEECH_STREAMING_EVENT_FINISH == speech_data.event) {
-                               MWR_LOGE("[INFO] Finish to get and send speech data");
-                               finish_event_sent = true;
-                               break;
-                       }
-
-                       index++;
-               }
-       }
-       MWR_LOGE("[INFO] Streaming loop exit");
-
-       if (true != finish_event_sent) {
-               unsigned char final_buffer[2] = {'\0', };
-               for (const auto& observer : mObservers) {
-                       if (observer) {
-                               MWR_LOGE("No FINISH event sent yet, adding to finalize streaming session");
-                               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");
-                               }
-                               mStreamingHistory.last_audio_sent.store(get_current_milliseconds_after_epoch());
-                       }
-               }
-#ifdef BUF_SAVE_MODE
-               if (g_pFile) {
-                       fwrite(final_buffer, 1, sizeof(final_buffer), g_pFile);
-                       MWR_LOGE("[Recorder SUCCESS] File Close");
-                       fclose(g_pFile);
-                       g_pFile = NULL;
-               }
-#endif
-       }
-
-       MWR_LOGE("[EXIT]");
-}
-
-void CWakeupEngineManager::start_streaming_current_utterance_data()
-{
-       MWR_LOGI("[ENTER]");
-       if (mStreamingThread.joinable()) {
-               MWR_LOGE("ERROR : mStreamingThread is joinable, will not start a new thread");
-               return;
-       }
-       mStreamingThread = thread(&CWakeupEngineManager::streaming_speech_data_thread_func, this);
-}
-
-void CWakeupEngineManager::stop_streaming_current_utterance_data()
-{
-       MWR_LOGI("[ENTER]");
-       if (mStreamingThread.joinable()) {
-               MWR_LOGE("mStreamingThread is joinable, trying join() %lld %lld %lld %lld",
-                       get_current_milliseconds_after_epoch(),
-                       mStreamingHistory.last_audio_fetched.load(),
-                       mStreamingHistory.last_count_fetched.load(),
-                       mStreamingHistory.last_audio_sent.load());
-               mStopStreamingThread.store(true);
-               mStreamingThread.join();
-       }
-       mStopStreamingThread.store(false);
-}
-
-void CWakeupEngineManager::update_manager_state(wakeup_manager_state_e state)
-{
-       for (const auto& info : mEngineInfo) {
-               if (info.interface.update_manager_state) {
-                       try {
-                               info.interface.update_manager_state(state);
-                       } catch (const std::exception& e) {
-                               MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
-                                       info.engine_name.c_str(), e.what());
-                       }
-               }
-       }
-       mWakeupManagerState = state;
-}
-
-void CWakeupEngineManager::update_recognition_result(string appid, int result)
-{
-       if (mSelectedEngine) {
-               if (mSelectedEngine->interface.update_recognition_result) {
-                       mSelectedEngine->interface.update_recognition_result(appid.c_str(), result);
-               }
-       }
-}
-
-void CWakeupEngineManager::engine_add_target_assistant(string engine_name, string appid)
-{
-       const auto& iter = find_if(mEngineInfo.begin(), mEngineInfo.end(),
-               [engine_name](const EngineInfo& info) {
-                       return (0 == info.engine_name.compare(engine_name));
-               });
-
-       if (mEngineInfo.end() == iter) {
-               /* Not found, add new library */
-               pkgmgrinfo_appinfo_h handle;
-               int ret = pkgmgrinfo_appinfo_get_appinfo(engine_name.c_str(), &handle);
-               if (PMINFO_R_OK == ret) {
-                       char *root_path = nullptr;
-                       ret = pkgmgrinfo_appinfo_get_root_path(handle, &root_path);
-                       if (PMINFO_R_OK == ret && nullptr != root_path) {
-                               string path = root_path;
-                               path += "/";
-                               path += MA_WAKEUP_DEDICATED_ENGINE_PATH;
-                               add_engine(engine_name, path);
-                       }
-                       pkgmgrinfo_appinfo_destroy_appinfo(handle);
-               }
-               /* Find again to add appid to the newly created engine's assistant list */
-               const auto &new_iter = find_if(mEngineInfo.begin(), mEngineInfo.end(),
-                       [engine_name](const EngineInfo& info) {
-                               return (0 == info.engine_name.compare(engine_name));
-                       });
-               if (mEngineInfo.end() != new_iter) {
-                       new_iter->assistant_list.push_back(appid);
-                       for (const auto& assistant : new_iter->assistant_list) {
-                               MWR_LOGI("Assistant List : %s %s", assistant.c_str(), new_iter->engine_name.c_str());
-                       }
-               }
-       } else {
-               /* If the engine already exists, simply add the appid to the assistant list */
-               iter->assistant_list.push_back(appid);
-               for (const auto& assistant : iter->assistant_list) {
-                       MWR_LOGI("Assistant List : %s %s", assistant.c_str(), iter->engine_name.c_str());
-               }
-       }
-}
-
-void CWakeupEngineManager::engine_add_wakeup_word(string appid, string wakeup_word, string language)
-{
-       for (const auto& info : mEngineInfo) {
-               bool found = contains(info.assistant_list, appid);
-               if (found) {
-                       if (info.interface.add_wakeup_word) {
-                               try {
-                                       info.interface.add_wakeup_word(appid.c_str(), wakeup_word.c_str(), language.c_str());
-                               } catch (const std::exception& e) {
-                                       MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
-                                               info.engine_name.c_str(), e.what());
-                               }
-                       } else {
-                               MWR_LOGE("Wakeup Engine does not provide add_wakeup_word");
-                       }
-               }
-       }
-}
-
-void CWakeupEngineManager::engine_remove_wakeup_word(string appid, string wakeup_word, string language)
-{
-       for (const auto& info : mEngineInfo) {
-               bool found = contains(info.assistant_list, appid);
-               if (found) {
-                       if (info.interface.remove_wakeup_word) {
-                               try {
-                                       info.interface.remove_wakeup_word(appid.c_str(), wakeup_word.c_str(), language.c_str());
-                               } catch (const std::exception& e) {
-                                       MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
-                                               info.engine_name.c_str(), e.what());
-                               }
-                       } else {
-                               MWR_LOGE("Wakeup Engine does not provide remove_wakeup_word");
-                       }
-               }
-       }
-}
-
-void CWakeupEngineManager::engine_set_assistant_specific_command(string appid, string command)
-{
-       for (const auto& info : mEngineInfo) {
-               bool found = contains(info.assistant_list, appid);
-               if (found) {
-                       if (info.interface.set_assistant_specific_command) {
-                               try {
-                                       info.interface.set_assistant_specific_command(appid.c_str(), command.c_str());
-                               } catch (const std::exception& e) {
-                                       MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
-                                               info.engine_name.c_str(), e.what());
-                               }
-                       }
-               }
-       }
-}
-
-void CWakeupEngineManager::engine_feed_audio_data(long time, void* data, int len)
-{
-       bool print = false;
-       const std::chrono::seconds interval(3);
-       static auto last = std::chrono::steady_clock::now();
-       auto now = std::chrono::steady_clock::now();
-       if (now - last > interval) {
-               print = true;
-               last = now;
-       }
-       for (const auto& info : mEngineInfo) {
-               bool filtered_out = false;
-               if (info.activated &&
-                       info.audio_data_require_status &&
-                       info.interface.feed_audio_data) {
-                       try {
-                               /* After a wakeup event, wakeup engines other than the selected one
-                                  does not need to receive audio data. */
-                               if (WAKEUP_MANAGER_STATE_UTTERANCE == mWakeupManagerState) {
-                                       if (mSelectedEngine && &info != mSelectedEngine) {
-                                               filtered_out = true;
-                                       }
-                               }
-                               if (!filtered_out) {
-                                       int ret = info.interface.feed_audio_data(time, data, len);
-                                       if (ret != 0 || print) {
-                                               LOGE("Feed speech data, ret(%d) : %s", ret, info.engine_name.c_str());
-                                       }
-                               }
-                       } catch (const std::exception& e) {
-                               MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
-                                       info.engine_name.c_str(), e.what());
-                       }
-               }
-               if (print) {
-                       MWR_LOGE("Feeding audio data to %s : %d %d %p %d",
-                               info.engine_name.c_str(),
-                               info.activated, info.audio_data_require_status,
-                               info.interface.feed_audio_data, filtered_out);
-               }
-       }
-}
-
-void CWakeupEngineManager::engine_set_dependency_module_command(string engine_name, string command)
-{
-       const auto& iter = find_if(mEngineInfo.begin(), mEngineInfo.end(),
-               [engine_name](const EngineInfo& info) {
-                       return (0 == info.engine_name.compare(engine_name));
-               });
-
-       if (mEngineInfo.end() != iter) {
-               if (iter->activated &&
-                       iter->interface.set_dependency_module_command) {
-                       try {
-                               int ret = iter->interface.set_dependency_module_command(command.c_str());
-                               if (0 != ret) {
-                                       LOGE("[ERROR] Fail to set dependency module command, ret(%d) : %s",
-                                               ret, iter->engine_name.c_str());
-                               }
-                       } catch (const std::exception& e) {
-                               MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
-                                       iter->engine_name.c_str(), e.what());
-                       }
-               }
-       }
-}
-
-bool CWakeupEngineManager::on_wakeup_event(string engine_name, mas_wakeup_event_info info)
-{
-       MWR_LOGD("[ENTER]");
-
-       for (const auto& observer : mObservers) {
-               if (observer) {
-                       if (!observer->on_wakeup_event(engine_name, info)) {
-                               LOGE("[Recorder WARNING] One of the observer returned false");
-                       }
-               }
-       }
-
-       return true;
-}
-
-bool CWakeupEngineManager::on_speech_status(string engine_name, mas_speech_status_e status)
-{
-       MWR_LOGD("[ENTER]");
-
-       for (const auto& observer : mObservers) {
-               if (observer) {
-                       if (!observer->on_speech_status(engine_name, status)) {
-                               LOGE("[Recorder WARNING] One of the observer returned false");
-                       }
-               }
-       }
-
-       return true;
-}
-
-bool CWakeupEngineManager::on_error(string engine_name, int error_code, string error_message)
-{
-       MWR_LOGD("[ENTER]");
-
-       for (const auto& observer : mObservers) {
-               if (observer) {
-                       if (!observer->on_error(engine_name, error_code, error_message)) {
-                               LOGE("[Recorder WARNING] One of the observer returned false");
-                       }
-               }
-       }
-
-       return true;
-}
-
-bool CWakeupEngineManager::on_audio_data_require_status(string engine_name, bool require)
-{
-       MWR_LOGI("[ENTER] %s, %d", engine_name.c_str(), require);
-
-       bool found = false;
-       // LOCK REQUIRED
-       int count = 0;
-       for (auto& info : mEngineInfo) {
-               if (info.engine_name.compare(engine_name) == 0) {
-                       found = true;
-                       info.audio_data_require_status = require;
-               }
-               if (info.activated && info.audio_data_require_status) {
-                       count++;
-               }
-       }
-       MWR_LOGD("count : %d", count);
-       if (count > 0) {
-               mAudioDataRequired = true;
-       } else {
-               mAudioDataRequired = false;
-       }
-
-       if (found) {
-               for (const auto& observer : mObservers) {
-                       if (observer) {
-                               if (!observer->on_audio_data_require_status(engine_name, require)) {
-                                       LOGE("[Recorder WARNING] One of the observer returned false");
-                               }
-                       }
-               }
-       }
-       // UNLOCK REQUIRED
-       return true;
-}
-
-bool CWakeupEngineManager::on_wakeup_engine_command(string engine_name, mas_wakeup_engine_command_target_e target, string assistant_name, string command)
-{
-       MWR_LOGI("[ENTER] : %s %d %s %s",
-               engine_name.c_str(), target, assistant_name.c_str(), command.c_str());
-
-       for (const auto& observer : mObservers) {
-               if (observer) {
-                       if (MAS_WAKEUP_ENGINE_COMMAND_TARGET_DEPENDENCY_MODULE == target) {
-                               if (!observer->on_wakeup_engine_command(target, engine_name, assistant_name, command)) {
-                                       LOGE("[Recorder WARNING] One of the observer returned false");
-                               }
-                       } else {
-                               const auto& iter = find_if(mEngineInfo.begin(), mEngineInfo.end(),
-                                       [engine_name](const EngineInfo& info) {
-                                               return (0 == info.engine_name.compare(engine_name));
-                                       });
-                               if (mEngineInfo.end() != iter) {
-                                       for (const auto& assistant : iter->assistant_list) {
-                                               if (0 == assistant_name.compare(assistant) ||
-                                                       MAS_WAKEUP_ENGINE_COMMAND_TARGET_ALL_ASSISTANTS == target) {
-                                                               MWR_LOGI("Calling on_wakeup_engine_command for %s", assistant.c_str());
-                                                       if (!observer->on_wakeup_engine_command(target, engine_name, assistant, command)) {
-                                                               LOGE("[Recorder WARNING] One of the observer returned false");
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-               }
-       }
-
-       return true;
-}
-
-void CWakeupEngineManager::add_engine(string name, string path)
-{
-       MWR_LOGE("Name (%s), Filepath(%s)", name.c_str(), path.c_str());
-
-       char* error = NULL;
-       EngineInfo info;
-       info.engine_handle = dlopen(path.c_str(), RTLD_LAZY);
-       if (nullptr != (error = dlerror()) || nullptr == info.engine_handle) {
-               MWR_LOGE("[ERROR] Fail to dlopen(%s), error(%s)", path.c_str(), error);
-               if (info.engine_handle) dlclose(info.engine_handle);
-               info.engine_handle = nullptr;
-               return;
-       }
-
-       /* Interfaces without version information */
-       info.interface.initialize =
-               (wakeup_engine_initialize)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_INITIALIZE);
-       info.interface.deinitialize =
-               (wakeup_engine_deinitialize)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_DEINITIALIZE);
-       info.interface.activate =
-               (wakeup_engine_activate)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_ACTIVATE);
-       info.interface.deactivate =
-               (wakeup_engine_deactivate)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_DEACTIVATE);
-       info.interface.add_wakeup_word =
-               (wakeup_engine_add_wakeup_word)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_ADD_WAKEUP_WORD);
-       info.interface.remove_wakeup_word =
-               (wakeup_engine_remove_wakeup_word)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_REMOVE_WAKEUP_WORD);
-       info.interface.add_language =
-               (wakeup_engine_add_language)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_ADD_LANGUAGE);
-       info.interface.set_language =
-               (wakeup_engine_set_language)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_SET_LANGUAGE);
-       info.interface.update_manager_state =
-               (wakeup_engine_update_manager_state)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_UPDATE_MANAGER_STATE);
-       info.interface.update_recognition_result =
-               (wakeup_engine_update_recognition_result)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_UPDATE_RECOGNITION_RESULT);
-       info.interface.set_audio_format =
-               (wakeup_engine_set_audio_format)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_SET_AUDIO_FORMAT);
-       info.interface.get_audio_format =
-               (wakeup_engine_get_audio_format)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_GET_AUDIO_FORMAT);
-       info.interface.feed_audio_data =
-               (wakeup_engine_feed_audio_data)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_FEED_AUDIO_DATA);
-       info.interface.get_utterance_data_count =
-               (wakeup_engine_get_utterance_data_count)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_GET_UTTERANCE_DATA_COUNT);
-       info.interface.get_utterance_data =
-               (wakeup_engine_get_utterance_data)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_GET_UTTERANCE_DATA);
-       info.interface.get_wake_word_data_count =
-               (wakeup_engine_get_wake_word_data_count)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_GET_WAKE_WORD_DATA_COUNT);
-       info.interface.get_wake_word_data =
-               (wakeup_engine_get_wake_word_data)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_GET_WAKE_WORD_DATA);
-       info.interface.set_assistant_specific_command =
-               (wakeup_engine_set_assistant_specific_command)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_SET_ASSISTANT_SPECIFIC_COMMAND);
-       info.interface.set_wake_word_audio_require_flag =
-               (wakeup_engine_set_wake_word_audio_require_flag)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_SET_WAKE_WORD_AUDIO_REQUIRE_FLAG);
-       info.interface.set_wakeup_event_callback =
-               (wakeup_engine_set_wakeup_event_callback)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_SET_WAKEUP_EVENT_CALLBACK);
-       info.interface.set_speech_status_callback =
-               (wakeup_engine_set_speech_status_callback)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_SET_SPEECH_STATUS_CALLBACK);
-       info.interface.set_error_callback =
-               (wakeup_engine_set_error_callback)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_SET_ERROR_CALLBACK);
-       info.interface.set_audio_data_require_status_callback =
-               (wakeup_engine_set_audio_data_require_status_callback)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_SET_AUDIO_DATA_REQUIRE_STATUS_CALLBACK);
-       info.interface.set_wakeup_engine_command_callback =
-               (wakeup_engine_set_wakeup_engine_command_callback)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_SET_WAKEUP_ENGINE_COMMAND_CALLBACK);
-
-       /* Interfaces after version 1 */
-       info.interface.get_version =
-               (wakeup_engine_get_version)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_GET_VERSION);
-       info.interface.set_dependency_module_command =
-               (wakeup_engine_set_dependency_module_command)dlsym(info.engine_handle,
-               MA_WAKEUP_ENGINE_FUNC_SET_DEPENDENCY_MODULE_COMMAND);
-
-       if (info.interface.initialize == nullptr) {
-               MWR_LOGE("[ERROR] Initialize interface does not exist, skipping %s", path.c_str());
-               if (info.engine_handle) dlclose(info.engine_handle);
-               info.engine_handle = nullptr;
-               return;
-       }
-
-       info.version = 0;
-       info.engine_path = path;
-       info.engine_name = name;
-
-       info.activated = false;
-       info.audio_data_require_status = false;
-
-       /* All the necessary information has already been set properly */
-       mEngineInfo.push_back(info);
-
-       /* Workaround for registering C-style callbacks */
-       typedef struct {
-               CWakeupEngineManager *manager;
-               string engine_name;
-       } CallbackUserData;
-
-       static deque<CallbackUserData> callback_user_data;
-
-       CallbackUserData user_data;
-       user_data.manager = this;
-       user_data.engine_name = info.engine_name;
-       callback_user_data.push_back(user_data);
-
-       MWR_LOGI("Initializing wakeup engine : %s %p %p",
-               info.engine_path.c_str(),
-               info.interface.initialize,
-               &callback_user_data.back());
-
-       try {
-               if (info.interface.set_wakeup_event_callback) {
-                       info.interface.set_wakeup_event_callback(
-                               [](mas_wakeup_event_info info, void* user_data) {
-                                       MWR_LOGI("user_data : %p", user_data);
-                                       CallbackUserData *data = static_cast<CallbackUserData*>(user_data);
-                                       if (nullptr == data) return;
-                                       if (nullptr == data->manager) return;
-                                       info.wakeup_engine = data->engine_name.c_str();
-                                       data->manager->on_wakeup_event(data->engine_name, info);
-                               }, &(callback_user_data.back()));
-               }
-
-               if (info.interface.set_audio_data_require_status_callback) {
-                       info.interface.set_audio_data_require_status_callback(
-                               [](bool require, void* user_data) {
-                                       MWR_LOGI("user_data : %p", user_data);
-                                       CallbackUserData *data = static_cast<CallbackUserData*>(user_data);
-                                       if (nullptr == data) return;
-                                       if (nullptr == data->manager) return;
-                                       data->manager->on_audio_data_require_status(data->engine_name, require);
-                               }, &(callback_user_data.back()));
-               }
-
-               if (info.interface.set_wakeup_engine_command_callback) {
-                       info.interface.set_wakeup_engine_command_callback(
-                               [](mas_wakeup_engine_command_target_e target,
-                                       const char* assistant_name, const char* command, void* user_data) {
-                                       MWR_LOGI("user_data : %p", user_data);
-                                       CallbackUserData* data = static_cast<CallbackUserData*>(user_data);
-                                       if (nullptr == data) return;
-                                       if (nullptr == data->manager) return;
-                                       if (nullptr == command) return;
-                                       data->manager->on_wakeup_engine_command(
-                                               data->engine_name, target, (assistant_name ? assistant_name : ""), command);
-                               }, &(callback_user_data.back()));
-               }
-
-               if (info.interface.initialize) {
-                       info.interface.initialize();
-               }
-               if (info.interface.get_version) {
-                       int version;
-                       if (0 == info.interface.get_version(&version)) {
-                               info.version = version;
-                       }
-               }
-       } catch (const std::exception& e) {
-               MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
-                       info.engine_name.c_str(), e.what());
-       }
-}
-
-void CWakeupEngineManager::add_engine_directory(string name, string path)
-{
-       if (0 == path.size()) return;
-
-       DIR* dp = opendir(path.c_str());
-       if (NULL == dp) {
-               MWR_LOGD("Failed opening directory : %s", path.c_str());
-       } else {
-               struct dirent *dirp = NULL;
-               string filepath;
-               do {
-                       dirp = readdir(dp);
-
-                       if (NULL != dirp) {
-                               if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name))
-                                       continue;
-
-                               if (DT_REG != dirp->d_type) /* If not a regular file */
-                                       continue;
-
-                               filepath = path;
-                               filepath += "/";
-                               filepath += dirp->d_name;
-
-                               if (filepath.length() >= _POSIX_PATH_MAX) {
-                                       MWR_LOGD("File path is too long : %s", filepath.c_str());
-                                       closedir(dp);
-                                       return;
-                               }
-                               add_engine(name, filepath);
-                       }
-               } while (NULL != dirp);
-
-               closedir(dp);
-       }
-}
-
-} // wakeup
-} // multiassistant
diff --git a/plugins/wakeup-manager/src/wakeup_manager.cpp b/plugins/wakeup-manager/src/wakeup_manager.cpp
deleted file mode 100644 (file)
index 516669f..0000000
+++ /dev/null
@@ -1,1427 +0,0 @@
-/*
- * 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.
- */
-
-#include "wakeup_manager.h"
-#include "wakeup_manager_main.h"
-#include "wakeup_policy_default.h"
-#include "wakeup_policy_external.h"
-#include "dependency_resolver.h"
-
-#include <algorithm>
-#include <iostream>
-#include <map>
-
-#include <boost/optional.hpp>
-
-namespace multiassistant
-{
-namespace wakeup
-{
-
-static bool check_language_valid(string language)
-{
-       bool valid = true;
-       if (0 == language.length()) {
-               valid = false;
-       }
-       return valid;
-}
-
-static bool initialize_wakeup_event_info(mas_wakeup_event_info* wakeup_info)
-{
-       bool ret = false;
-       if (wakeup_info) {
-               ret = true;
-
-               wakeup_info->wakeup_appid = nullptr;
-               wakeup_info->wakeup_word = nullptr;
-               wakeup_info->wakeup_language = nullptr;
-               wakeup_info->wakeup_voice_id = nullptr;
-               wakeup_info->wakeup_engine = nullptr;
-               wakeup_info->wakeup_confidence_score = 0.0f;
-
-               wakeup_info->wakeup_start_time = 0;
-               wakeup_info->wakeup_end_time = 0L;
-               wakeup_info->wakeup_time_valid = false;
-
-               wakeup_info->extra_data = nullptr;
-               wakeup_info->extra_data_length = 0;
-               wakeup_info->extra_data_description = nullptr;
-       }
-       return ret;
-}
-
-static map<string, string> get_custom_vconf_keys()
-{
-       map<string, string> vconf_keys;
-       char* custom_key = NULL;
-
-       vconf_keys.clear();
-       dependency_resolver_get_custom_vconf_key(WAKEUP_VCONF_KEY_DEFAULT_ASSISTANT_APPID, &custom_key);
-       vconf_keys.insert({WAKEUP_VCONF_KEY_DEFAULT_ASSISTANT_APPID, custom_key ? custom_key : WAKEUP_VCONF_KEY_DEFAULT_ASSISTANT_APPID});
-
-       if (custom_key) {
-               free(custom_key);
-               custom_key = nullptr;
-       }
-
-       dependency_resolver_get_custom_vconf_key(WAKEUP_VCONF_KEY_ENABLED_ASSISTANTS, &custom_key);
-       vconf_keys.insert({WAKEUP_VCONF_KEY_ENABLED_ASSISTANTS, custom_key ? custom_key : WAKEUP_VCONF_KEY_ENABLED_ASSISTANTS});
-
-       if (custom_key) {
-               free(custom_key);
-               custom_key = nullptr;
-       }
-
-       dependency_resolver_get_custom_vconf_key(WAKEUP_VCONF_KEY_WAKE_WORD_DETECTION_ENABLED, &custom_key);
-       vconf_keys.insert({WAKEUP_VCONF_KEY_WAKE_WORD_DETECTION_ENABLED, custom_key ? custom_key : WAKEUP_VCONF_KEY_WAKE_WORD_DETECTION_ENABLED});
-
-       if (custom_key) {
-               free(custom_key);
-               custom_key = nullptr;
-       }
-
-       return vconf_keys;
-}
-
-CWakeupManager::CWakeupManager(IWakeupEventObserver* wakeup_observer, ISettingValueObserver* setting_observer)
-{
-       initialize_wakeup_event_info(&mLastWakeupEventInfo);
-
-       if (wakeup_observer) {
-               subscribe_wakeup_observer(wakeup_observer);
-       }
-       if (setting_observer) {
-               subscribe_setting_observer(setting_observer);
-       }
-}
-
-CWakeupManager::~CWakeupManager()
-{
-       MWR_LOGI("Wakeup Manager is now being destroyed");
-}
-
-void CWakeupManager::initialize_wakeup_policy()
-{
-       mWakeupPolicy.reset(new CWakeupPolicyExternal{&mPolicyEventObserver});
-       if (nullptr == mWakeupPolicy || !(mWakeupPolicy->valid())) {
-               mWakeupPolicy.reset(new CWakeupPolicyDefault{&mPolicyEventObserver});
-
-               /* Default Policy specific initialization */
-               CWakeupPolicyDefault *policy =
-                       dynamic_cast<CWakeupPolicyDefault*>(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());
-                       }
-               }
-       }
-}
-
-bool CWakeupManager::initialize()
-{
-       MWR_LOGE("[ENTER]");
-       std::cerr << "WakeupManager Initialize" << std::endl;
-
-       mPolicyEventObserver.set_wakeup_manager(this);
-       mEngineEventObserver.set_wakeup_manager(this);
-       mAudioEventObserver.set_wakeup_manager(this);
-       mSettingsEventObserver.set_wakeup_manager(this);
-
-       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_command = wakeup_manager_set_dependency_module_command;
-       interface.wakeup_assistant = wakeup_manager_wakeup_assistant;
-
-       dependency_resolver_initialize(interface);
-
-       mWakeupSettings.subscribe(&mSettingsEventObserver);
-       mWakeupSettings.initialize(get_custom_vconf_keys());
-
-       mAudioEventObserver.set_wakeup_engine_manager(&mWakeupEngineManager);
-       mAudioManager.subscribe(&mAudioEventObserver);
-       mAudioManager.initialize();
-
-       mWakeupEngineManager.subscribe(&mEngineEventObserver);
-       mWakeupEngineManager.initialize();
-
-       mAssistantConfigManager.initialize();
-
-       initialize_wakeup_policy();
-       start_periodic_monitor_timer();
-
-       MWR_LOGD("[END]");
-       return true;
-}
-
-bool CWakeupManager::deinitialize()
-{
-       MWR_LOGE("[ENTER]");
-       std::cerr << "WakeupManager Deinitialize" << std::endl;
-
-       stop_periodic_monitor_timer();
-       stop_streaming_duration_timer();
-
-       dependency_resolver_deinitialize();
-
-       mAssistantConfigManager.deinitialize();
-
-       mWakeupEngineManager.unsubscribe(&mEngineEventObserver);
-       mWakeupEngineManager.deinitialize();
-
-       mAudioManager.unsubscribe(&mAudioEventObserver);
-       mAudioManager.deinitialize();
-
-       mWakeupSettings.deinitialize();
-       mAssistantLanguageInfo.clear();
-
-       MWR_LOGE("[END]");
-       return true;
-}
-
-void CWakeupManager::subscribe_wakeup_observer(IWakeupEventObserver *observer)
-{
-       mWakeupObservers.push_back(observer);
-}
-
-void CWakeupManager::unsubscribe_wakeup_observer(IWakeupEventObserver *observer)
-{
-       auto iter = find(mWakeupObservers.begin(), mWakeupObservers.end(), observer);
-       if (iter != mWakeupObservers.end()) {
-               mWakeupObservers.erase(iter);
-       }
-}
-
-void CWakeupManager::subscribe_setting_observer(ISettingValueObserver* observer)
-{
-       mSettingObservers.push_back(observer);
-}
-
-void CWakeupManager::unsubscribe_setting_observer(ISettingValueObserver* observer)
-{
-       auto iter = find(mSettingObservers.begin(), mSettingObservers.end(), observer);
-       if (iter != mSettingObservers.end()) {
-               mSettingObservers.erase(iter);
-       }
-}
-
-bool CWakeupManager::activate(void)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (WAKEUP_MANAGER_STATE_INACTIVE != mWakeupManagerState)
-               return false;
-
-       /* Activate assistants that supports current voice input language */
-       set_language(mWakeupSettings.get_current_language());
-
-       change_manager_state(WAKEUP_MANAGER_STATE_LISTENING);
-       if (mWakeupEngineManager.get_audio_data_required()) {
-               mAudioManager.set_recording_session(RECORDING_SESSION_WAKE_WORD);
-               mAudioManager.start_recording(true);
-       }
-
-       MWR_LOGD("[END]");
-       return true;
-}
-
-bool CWakeupManager::deactivate(void)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (WAKEUP_MANAGER_STATE_INACTIVE == mWakeupManagerState)
-               return false;
-
-       mAudioManager.stop_recording(true);
-       mRecordingByVoiceKey = false;
-       change_manager_state(WAKEUP_MANAGER_STATE_INACTIVE);
-
-       stop_streaming_utterance_data();
-       stop_streaming_previous_utterance_data();
-       stop_streaming_follow_up_data();
-
-       MWR_LOGD("[END]");
-       return true;
-}
-
-bool CWakeupManager::add_assistant_language(string appid, string language)
-{
-       MWR_LOGI("[ENTER]");
-       bool found = false;
-       for (auto& info : mAssistantLanguageInfo) {
-               if(0 == info.appid.compare(appid)) {
-                       info.languageList.push_back(language);
-                       found = true;
-               }
-       }
-       if(false == found) {
-               AssistantLanguageInfo info;
-               info.appid = appid;
-               info.languageList.push_back(language);
-               mAssistantLanguageInfo.push_back(info);
-       }
-       if (0 == mCurrentLanguage.compare(language)) {
-               mAssistantSupportsCurrentLanguage[appid] = true;
-               if (true == mAssistantEnabled[appid]) {
-                       mWakeupEngineManager.set_assistant_activated(appid, true);
-               }
-       }
-       MWR_LOGD("[END]");
-       return true;
-}
-
-bool CWakeupManager::add_assistant_wakeup_word(string appid, string wakeup_word, string language)
-{
-       MWR_LOGI("[ENTER]");
-
-       mWakeupEngineManager.engine_add_wakeup_word(appid, wakeup_word, language);
-
-       MWR_LOGD("[END]");
-       return true;
-}
-
-bool CWakeupManager::remove_assistant_wakeup_word(string appid, string wakeup_word, string language)
-{
-       MWR_LOGI("[ENTER]");
-
-       mWakeupEngineManager.engine_remove_wakeup_word(appid, wakeup_word, language);
-
-       MWR_LOGD("[END]");
-       return true;
-}
-
-bool CWakeupManager::add_assistant_wakeup_engine(string appid, string engine)
-{
-       MWR_LOGI("[ENTER] %s %s", appid.c_str(), engine.c_str());
-
-       vector<string> disabled_assistants = mWakeupSettings.get_wake_word_disabled_assistants();
-       auto iter = find(disabled_assistants.begin(), disabled_assistants.end(), appid);
-       if (iter != disabled_assistants.end())
-               return true;
-
-       bool found = false;
-       if (mWakeupSettings.get_multiple_mode()) {
-               vector<string> assistants = mWakeupSettings.get_enabled_assistants();
-               iter = find(assistants.begin(), assistants.end(), appid);
-               if (iter != assistants.end())
-                       found = true;
-       } else {
-               if (0 == appid.compare(mWakeupSettings.get_default_assistant_appid()))
-                       found = true;
-       }
-
-       if (found)
-               mWakeupEngineManager.engine_add_target_assistant(engine, appid);
-
-       MWR_LOGD("[END]");
-       return true;
-}
-
-bool CWakeupManager::set_assistant_language(string appid, string language)
-{
-       MWR_LOGI("[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;
-}
-
-bool CWakeupManager::set_assistant_enabled(string appid, bool enabled)
-{
-       MWR_LOGI("[ENTER]");
-
-       mAssistantEnabled[appid] = enabled;
-       bool activated = enabled;
-       if (false == mAssistantSupportsCurrentLanguage[appid]) {
-               activated = false;
-       }
-       if (0 == appid.compare(mWakeupSettings.get_default_assistant_appid())) {
-               activated = true;
-       }
-       mWakeupEngineManager.set_assistant_activated(appid, activated);
-
-       MWR_LOGD("[END]");
-       return true;
-}
-
-bool CWakeupManager::set_default_assistant(string appid)
-{
-       MWR_LOGE("[ENTER] %s %s", appid.c_str(), mCurrentDefaultAssistant.c_str());
-
-       /* Passing 'expected' as true since MAS is changing the default assistant config */
-       process_default_assistant_changed(appid, true);
-
-       mWakeupSettings.set_default_assistant_appid(appid);
-
-       return true;
-}
-
-bool CWakeupManager::process_default_assistant_changed(string appid, bool expected)
-{
-       MWR_LOGE("[ENTER] %s %s", appid.c_str(), mCurrentDefaultAssistant.c_str());
-
-       if (mCurrentDefaultAssistant.compare(appid) == 0) {
-               MWR_LOGE("Default assistant appid not changed, ignoring...");
-               return false;
-       }
-
-       if (mWakeupManagerState == WAKEUP_MANAGER_STATE_UTTERANCE ||
-               mWakeupManagerState == WAKEUP_MANAGER_STATE_PROCESSING) {
-               if (expected) {
-                       stop_streaming_utterance_data();
-                       stop_streaming_previous_utterance_data();
-                       stop_streaming_follow_up_data();
-
-                       mWakeupEngineManager.update_recognition_result(appid, MA_RECOGNITION_RESULT_EVENT_ERROR);
-               } else {
-                       /* If this is an unexpected change, invalidate previous recognition process */
-                       update_recognition_result(mCurrentDefaultAssistant, MA_RECOGNITION_RESULT_EVENT_ERROR);
-               }
-       }
-
-       /* Check if previous default assistant has to be deactivated */
-       bool activated = true;
-       if (false == mAssistantSupportsCurrentLanguage[mCurrentDefaultAssistant]) {
-               activated = false;
-       }
-       if (false == mAssistantEnabled[mCurrentDefaultAssistant]) {
-               activated = false;
-       }
-       mWakeupEngineManager.set_assistant_activated(mCurrentDefaultAssistant, activated);
-
-       /* New default assistant has to be activated no matter what */
-       mWakeupEngineManager.set_assistant_activated(appid, true);
-
-       mCurrentDefaultAssistant = appid;
-
-       MWR_LOGD("[END]");
-       return true;
-}
-
-string CWakeupManager::get_default_assistant()
-{
-       return mWakeupSettings.get_default_assistant_appid();
-}
-
-bool CWakeupManager::get_assistant_enabled(string appid)
-{
-       return mAssistantEnabled[appid];
-}
-
-bool CWakeupManager::set_language(string language)
-{
-       bool valid = false;
-       MWR_LOGI("[ENTER] : %s", language.c_str());
-
-       if (check_language_valid(language)) {
-               mCurrentLanguage = language;
-               valid = true;
-       } else {
-               MWR_LOGE("[ERROR] Invalid language (%s)", language.c_str());
-       }
-
-       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;
-                       }
-                       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;
-               }
-
-               if (false == mAssistantEnabled[info.appid]) {
-                       disable = true;
-               }
-               if (0 == info.appid.compare(mWakeupSettings.get_default_assistant_appid())) {
-                       /* 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 valid;
-}
-
-bool CWakeupManager::get_recording_by_voice_key()
-{
-       return mRecordingByVoiceKey;
-}
-
-void CWakeupManager::set_recording_by_voice_key(bool recording)
-{
-       mRecordingByVoiceKey = recording;
-}
-
-STREAMING_MODE CWakeupManager::get_streaming_mode()
-{
-       return mStreamingMode;
-}
-
-bool CWakeupManager::set_streaming_mode(STREAMING_MODE mode)
-{
-       lock_guard<mutex> lock(mMutex);
-       mStreamingMode = mode;
-       return true;
-}
-
-bool CWakeupManager::change_manager_state(wakeup_manager_state_e state)
-{
-       MWR_LOGI("[ENTER] : %d", 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;
-}
-
-wakeup_manager_state_e CWakeupManager::get_manager_state()
-{
-       return mWakeupManagerState;
-}
-
-bool CWakeupManager::update_voice_feedback_state(string appid, bool state)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (state) {
-               if (WAKEUP_MANAGER_STATE_LISTENING == mWakeupManagerState ||
-                       WAKEUP_MANAGER_STATE_PROCESSING == mWakeupManagerState) {
-                       change_manager_state(WAKEUP_MANAGER_STATE_VOICE_FEEDBACK);
-               }
-       } else {
-               if (WAKEUP_MANAGER_STATE_VOICE_FEEDBACK == mWakeupManagerState) {
-                       change_manager_state(WAKEUP_MANAGER_STATE_LISTENING);
-               }
-       }
-
-       MWR_LOGD("[END]");
-       return true;
-}
-
-bool CWakeupManager::set_assistant_specific_command(string appid, string command)
-{
-       MWR_LOGI("[ENTER]");
-
-       /*
-       static const string voice_key_pressed{"voice_key_pressed"};
-       static const string voice_key_released{"voice_key_released"};
-
-       if (0 == command.compare(voice_key_pressed)) {
-               process_event(MA_PLUGIN_EVENT_VOICE_KEY_PRESSED, NULL, 0);
-       } else if (0 == command.compare(voice_key_released)) {
-               process_event(MA_PLUGIN_EVENT_VOICE_KEY_RELEASED, NULL, 0);
-       }
-       */
-
-       mWakeupEngineManager.engine_set_assistant_specific_command(appid, command);
-
-       MWR_LOGD("[END]");
-       return true;
-}
-
-bool CWakeupManager::set_background_volume(string appid, double ratio)
-{
-       MWR_LOGD("[DEBUG] set background volume (%f)", ratio);
-
-       int ret = 0;
-       mAudioManager.set_background_volume(ratio);
-       return ret;
-}
-
-bool CWakeupManager::update_recognition_result(string appid, int result)
-{
-       MWR_LOGI("[ENTER]");
-
-       stop_streaming_utterance_data();
-       stop_streaming_previous_utterance_data();
-       stop_streaming_follow_up_data();
-
-       mAudioManager.set_recording_session(RECORDING_SESSION_WAKE_WORD);
-       mWakeupEngineManager.update_recognition_result(appid, result);
-       if (WAKEUP_MANAGER_STATE_PROCESSING == mWakeupManagerState ||
-               WAKEUP_MANAGER_STATE_UTTERANCE == mWakeupManagerState) {
-               change_manager_state(WAKEUP_MANAGER_STATE_LISTENING);
-       }
-       MWR_LOGD("[END]");
-       return true;
-}
-
-static long long get_current_milliseconds_after_epoch()
-{
-       auto now = chrono::steady_clock::now();
-       auto now_ms = chrono::time_point_cast<chrono::milliseconds>(now);
-       /* number of milliseconds since the epoch of system_clock */
-       auto value = now_ms.time_since_epoch();
-
-       return value.count();
-}
-
-bool CWakeupManager::process_plugin_event(mas_plugin_event_e event, void* data, int len)
-{
-       MWR_LOGE("[ENTER] : %d", event);
-       if (WAKEUP_MANAGER_STATE_INACTIVE == mWakeupManagerState)
-               return false;
-
-       bool start_recording = false;
-       bool stop_recording = false;
-
-       boost::optional<ma_voice_key_status_e> next_voice_key_status;
-       if (MAS_PLUGIN_EVENT_VOICE_KEY_PRESSED == event) {
-               if (STREAMING_MODE::FOLLOW_UP == mStreamingMode) {
-                       MWR_LOGE("Voice key pressed, but currently streaming follow_up audio");
-               } else {
-                       if (VOICE_KEY_SUPPORT_MODE_NONE != mCurrentVoiceKeySupportMode) {
-                               start_recording = true;
-                       }
-               }
-               next_voice_key_status = MA_VOICE_KEY_STATUS_PRESSED;
-       } else if (MAS_PLUGIN_EVENT_VOICE_KEY_RELEASED_AFTER_PUSH == event) {
-               if (VOICE_KEY_SUPPORT_MODE_PUSH_TO_TALK == mCurrentVoiceKeySupportMode ||
-                       VOICE_KEY_SUPPORT_MODE_ALL == mCurrentVoiceKeySupportMode) {
-                       stop_recording = true;
-               }
-               next_voice_key_status = MA_VOICE_KEY_STATUS_RELEASED_AFTER_PUSH;
-       } else if (MAS_PLUGIN_EVENT_VOICE_KEY_RELEASED_AFTER_TAP == event) {
-               if (VOICE_KEY_SUPPORT_MODE_PUSH_TO_TALK == mCurrentVoiceKeySupportMode) {
-                       stop_recording = true;
-               }
-               next_voice_key_status = MA_VOICE_KEY_STATUS_RELEASED_AFTER_TAP;
-       }
-
-       if (start_recording) {
-               mRecordingByVoiceKey = true;
-
-               mAudioManager.stop_recording(true);
-
-               stop_streaming_utterance_data();
-               stop_streaming_previous_utterance_data();
-               stop_streaming_follow_up_data();
-
-               mAudioManager.clear_audio_data();
-               change_manager_state(WAKEUP_MANAGER_STATE_UTTERANCE);
-
-               /* Start recorder thread using appropriate recording device */
-               mAudioManager.set_recording_session(RECORDING_SESSION_UTTERANCE);
-               mAudioManager.start_recording(true);
-
-               /* Wakeup default assistant */
-               /* TODO: apply conversation timeout for selecting assistant here */
-               mas_wakeup_event_info wakeup_info;
-               initialize_wakeup_event_info(&wakeup_info);
-               /* Make sure to use background data */
-               wakeup_info.wakeup_time_valid = true;
-               wakeup_info.wakeup_end_time = get_current_milliseconds_after_epoch();
-               wakeup_info.wakeup_engine = WAKEUP_ENGINE_VOICE_KEY;
-
-               std::string default_assistant_appid = mWakeupSettings.get_default_assistant_appid();
-               wakeup_info.wakeup_appid = default_assistant_appid.c_str();
-               MWR_LOGD("wakeup_appid : %s", wakeup_info.wakeup_appid);
-
-               set_last_wakeup_event_info(wakeup_info);
-               mWakeupEngineManager.set_selected_wakeup_info(wakeup_info);
-               for (const auto& observer : mWakeupObservers) {
-                       observer->on_wakeup(wakeup_info);
-               }
-       }
-       if (stop_recording) {
-               mRecordingByVoiceKey = false;
-
-               stop_streaming_duration_timer();
-               mAudioManager.finalize_audio_data();
-
-               if (STREAMING_MODE::UTTERANCE == mStreamingMode) {
-                       change_manager_state(WAKEUP_MANAGER_STATE_PROCESSING);
-               } else {
-                       change_manager_state(WAKEUP_MANAGER_STATE_LISTENING);
-               }
-
-               mAudioManager.stop_recording(true);
-               mAudioManager.set_recording_session(RECORDING_SESSION_WAKE_WORD);
-               if (mWakeupEngineManager.get_audio_data_required()) {
-                       /* Restart recorder thread using appropriate recording device */
-                       mAudioManager.start_recording(true);
-               }
-       }
-
-       if (next_voice_key_status) {
-               update_voice_key_status(*next_voice_key_status);
-       }
-
-       MWR_LOGD("[END]");
-       return true;
-}
-
-void CWakeupManager::set_streaming_completed(bool completed)
-{
-       MWR_LOGI("[ENTER] : %d", completed);
-       mStreamingCompleted.store(completed);
-
-       /* When Streaming completes, update pending voice key status */
-       update_pending_voice_key_status();
-}
-
-void CWakeupManager::start_voice_key_status_update_timer()
-{
-       const float VOICE_KEY_STATUS_UPDATE_INTERVAL = 5.0f;
-
-       if (mVoiceKeyStatusUpdateTimer) {
-               ecore_timer_del(mVoiceKeyStatusUpdateTimer);
-       }
-
-       mVoiceKeyStatusUpdateTimer = ecore_timer_add(VOICE_KEY_STATUS_UPDATE_INTERVAL,
-               [](void *data) {
-                       MAS_LOGE("voice_key_status_update_timer expired");
-                       auto manager = static_cast<CWakeupManager*>(data);
-                       manager->update_pending_voice_key_status();
-                       return ECORE_CALLBACK_CANCEL;
-               }, static_cast<void*>(this));
-}
-
-void CWakeupManager::update_pending_voice_key_status()
-{
-       MAS_LOGI("[ENTER]");
-       if (mVoiceKeyStatusUpdateTimer) {
-               ecore_timer_del(mVoiceKeyStatusUpdateTimer);
-               mVoiceKeyStatusUpdateTimer = nullptr;
-       }
-       if (mPendingVoiceKeyStatus) {
-               for (const auto& observer : mWakeupObservers) {
-                       observer->on_voice_key_status_changed(*mPendingVoiceKeyStatus);
-               }
-               mPendingVoiceKeyStatus = boost::none;
-       }
-}
-
-void CWakeupManager::update_voice_key_status(ma_voice_key_status_e status)
-{
-       MWR_LOGI("status : %d", status);
-       if (mPendingVoiceKeyStatus) {
-               for (const auto& observer : mWakeupObservers) {
-                       observer->on_voice_key_status_changed(*mPendingVoiceKeyStatus);
-               }
-               mPendingVoiceKeyStatus = boost::none;
-       }
-
-       /* If streaming has not been completed yet after pressed event,
-        * postpone the status update until streaming is completed */
-       bool postpone = false;
-       if (status == MA_VOICE_KEY_STATUS_RELEASED_AFTER_PUSH) {
-               if (!mStreamingCompleted.load()) {
-                       postpone = true;
-               }
-       }
-
-       if (postpone) {
-               mPendingVoiceKeyStatus = status;
-               start_voice_key_status_update_timer();
-       } else {
-               for (const auto& observer : mWakeupObservers) {
-                       observer->on_voice_key_status_changed(status);
-               }
-       }
-
-       if (status == MA_VOICE_KEY_STATUS_PRESSED) {
-               mStreamingCompleted.store(false);
-       }
-}
-
-vector<IWakeupEventObserver*> CWakeupManager::get_wakeup_observers()
-{
-       return mWakeupObservers;
-}
-
-void CWakeupManager::set_last_wakeup_event_info(mas_wakeup_event_info wakeup_info)
-{
-       mLastWakeupEventInfo = wakeup_info;
-       mLastWakeupEventID++;
-}
-
-vector<ISettingValueObserver*> CWakeupManager::get_setting_observers()
-{
-       return mSettingObservers;
-}
-
-static Eina_Bool streaming_duration_expired(void *data)
-{
-       MWR_LOGW("[ENTER]");
-       CWakeupManager *wakeup_manager = static_cast<CWakeupManager*>(data);
-       if (nullptr == wakeup_manager) return ECORE_CALLBACK_CANCEL;
-
-       wakeup_manager->set_streaming_duration_timer(nullptr);
-
-       CAudioManager *audio_manager = wakeup_manager->get_audio_manager();
-       CWakeupEngineManager *engine_manager = wakeup_manager->get_engine_manager();
-
-       if (nullptr == audio_manager) return ECORE_CALLBACK_CANCEL;
-       if (nullptr == engine_manager) return ECORE_CALLBACK_CANCEL;
-
-       switch(wakeup_manager->get_streaming_mode()) {
-               case STREAMING_MODE::UTTERANCE:
-                       audio_manager->stop_streaming_current_utterance_data();
-                       engine_manager->stop_streaming_current_utterance_data();
-               break;
-               case STREAMING_MODE::PREVIOUS_UTTERANCE:
-                       audio_manager->stop_streaming_previous_utterance_data();
-               break;
-               case STREAMING_MODE::FOLLOW_UP:
-                       audio_manager->stop_streaming_follow_up_data();
-                       audio_manager->stop_recording(true);
-                       wakeup_manager->set_recording_by_voice_key(false);
-                       audio_manager->clear_audio_data();
-               break;
-       }
-
-       wakeup_manager->set_streaming_mode(STREAMING_MODE::NONE);
-
-       if (WAKEUP_MANAGER_STATE_UTTERANCE == wakeup_manager->get_manager_state()) {
-               audio_manager->stop_recording(true);
-               wakeup_manager->set_recording_by_voice_key(false);
-               audio_manager->set_recording_session(RECORDING_SESSION_WAKE_WORD);
-               if (engine_manager->get_audio_data_required()) {
-                       /* Restart recorder thread using appropriate recording device */
-                       audio_manager->start_recording(true);
-               }
-               wakeup_manager->change_manager_state(WAKEUP_MANAGER_STATE_PROCESSING);
-       }
-
-       return ECORE_CALLBACK_CANCEL;
-}
-
-bool CWakeupManager::start_streaming_utterance_data()
-{
-       MWR_LOGI("[ENTER]");
-
-       if (mCurrentStreamingSessionID == mLastWakeupEventID) {
-               MWR_LOGW("Streaming already started for this session");
-               return false;
-       }
-
-       mCurrentStreamingSessionID = mLastWakeupEventID;
-
-       mAudioManager.stop_streaming_current_utterance_data();
-       mWakeupEngineManager.stop_streaming_current_utterance_data();
-
-       mStreamingMode = STREAMING_MODE::UTTERANCE;
-
-       bool streaming_by_manager = true;
-       if (false == mLastWakeupEventInfo.wakeup_time_valid) {
-               mWakeupEngineManager.start_streaming_current_utterance_data();
-               streaming_by_manager = false;
-       } else {
-               mAudioManager.start_streaming_current_utterance_data(mLastWakeupEventInfo.wakeup_end_time);
-       }
-
-       stop_streaming_duration_timer();
-       if (streaming_by_manager) {
-               start_streaming_duration_timer();
-       }
-
-       MWR_LOGD("[END]");
-       return true;
-}
-
-bool CWakeupManager::stop_streaming_utterance_data()
-{
-       MWR_LOGI("[ENTER]");
-
-       if (STREAMING_MODE::UTTERANCE != mStreamingMode) return false;
-
-       mAudioManager.stop_streaming_current_utterance_data();
-       mWakeupEngineManager.stop_streaming_current_utterance_data();
-
-       if (mStreamingDurationTimer) {
-               stop_streaming_duration_timer();
-       }
-       if (WAKEUP_MANAGER_STATE_UTTERANCE == mWakeupManagerState) {
-               change_manager_state(WAKEUP_MANAGER_STATE_PROCESSING);
-               mAudioManager.stop_recording(true);
-               mRecordingByVoiceKey = false;
-               mAudioManager.set_recording_session(RECORDING_SESSION_WAKE_WORD);
-               if (mWakeupEngineManager.get_audio_data_required()) {
-                       /* Restart recorder thread using appropriate recording device */
-                       mAudioManager.start_recording(true);
-               }
-       }
-
-       mStreamingMode = STREAMING_MODE::NONE;
-
-       MWR_LOGD("[END]");
-       return true;
-}
-
-bool CWakeupManager::start_streaming_follow_up_data()
-{
-       MWR_LOGI("[ENTER]");
-
-       mAudioManager.stop_streaming_follow_up_data();
-       mWakeupEngineManager.stop_streaming_current_utterance_data();
-
-       mStreamingMode = STREAMING_MODE::FOLLOW_UP;
-
-       /* For the follow up streaming, audio data should be recorded from now on */
-       mAudioManager.stop_recording(true);
-       mAudioManager.clear_audio_data();
-       change_manager_state(WAKEUP_MANAGER_STATE_UTTERANCE);
-       mAudioManager.set_recording_session(RECORDING_SESSION_FOLLOW_UP);
-       mAudioManager.start_recording(true);
-
-       mAudioManager.start_streaming_follow_up_data();
-
-       stop_streaming_duration_timer();
-       start_streaming_duration_timer();
-
-       MWR_LOGD("[END]");
-       return true;
-}
-
-bool CWakeupManager::stop_streaming_follow_up_data()
-{
-       MWR_LOGI("[ENTER]");
-       if (STREAMING_MODE::FOLLOW_UP != mStreamingMode) return false;
-
-       mAudioManager.stop_streaming_follow_up_data();
-       mWakeupEngineManager.stop_streaming_current_utterance_data();
-
-       if (mStreamingDurationTimer) {
-               stop_streaming_duration_timer();
-       }
-
-       if (WAKEUP_MANAGER_STATE_UTTERANCE == mWakeupManagerState) {
-               change_manager_state(WAKEUP_MANAGER_STATE_PROCESSING);
-               mAudioManager.stop_recording(true);
-               mRecordingByVoiceKey = false;
-               mAudioManager.set_recording_session(RECORDING_SESSION_WAKE_WORD);
-               if (mWakeupEngineManager.get_audio_data_required()) {
-                       /* Restart recorder thread using appropriate recording device */
-                       mAudioManager.start_recording(true);
-               }
-       }
-
-       mStreamingMode = STREAMING_MODE::NONE;
-
-       mAudioManager.clear_audio_data();
-
-       MWR_LOGD("[END]");
-       return true;
-}
-
-bool CWakeupManager::start_streaming_previous_utterance_data()
-{
-       MWR_LOGI("[ENTER]");
-
-       mAudioManager.stop_streaming_previous_utterance_data();
-       mWakeupEngineManager.stop_streaming_current_utterance_data();
-
-       mStreamingMode = STREAMING_MODE::PREVIOUS_UTTERANCE;
-       mAudioManager.start_streaming_previous_utterance_data();
-
-       stop_streaming_duration_timer();
-       start_streaming_duration_timer();
-
-       MWR_LOGD("[END]");
-       return true;
-}
-
-bool CWakeupManager::stop_streaming_previous_utterance_data()
-{
-       MWR_LOGI("[ENTER]");
-       if (STREAMING_MODE::PREVIOUS_UTTERANCE != mStreamingMode) return false;
-
-       mAudioManager.stop_streaming_previous_utterance_data();
-       mWakeupEngineManager.stop_streaming_current_utterance_data();
-
-       if (mStreamingDurationTimer) {
-               stop_streaming_duration_timer();
-       }
-
-       if (WAKEUP_MANAGER_STATE_UTTERANCE == mWakeupManagerState) {
-               change_manager_state(WAKEUP_MANAGER_STATE_PROCESSING);
-       }
-
-       mStreamingMode = STREAMING_MODE::NONE;
-
-       MWR_LOGD("[END]");
-       return true;
-}
-
-bool CWakeupManager::get_audio_format(int* rate, int* channel, int* audio_type)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (!audio_type || !rate || !channel) {
-               MWR_LOGE("[ERROR] Invalid parameter");
-               return false;
-       }
-
-       dependency_resolver_get_audio_format(rate, channel, audio_type);
-
-       MWR_LOGD("[END] rate(%d), channel(%d), audio_type(%d)", *rate, *channel, *audio_type);
-       return true;
-}
-
-bool CWakeupManager::get_audio_source_type(char** type)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (!type) {
-               MWR_LOGE("[ERROR] Invalid parameter");
-               return false;
-       }
-
-       dependency_resolver_get_audio_source_type(type);
-
-       MWR_LOGD("[END] type(%s)", *type);
-       return true;
-}
-
-bool CWakeupManager::set_wake_word_audio_require_flag(bool require)
-{
-       MWR_LOGI("[ENTER]");
-
-       mWakeupEngineManager.set_wake_word_audio_require_flag(require);
-
-       MWR_LOGD("[END]");
-       return true;
-}
-
-bool CWakeupManager::set_voice_key_tap_duration(float duration)
-{
-       MWR_LOGI("[ENTER]");
-
-       dependency_resolver_set_voice_key_tap_duration(duration);
-
-       MWR_LOGD("[END]");
-       return true;
-}
-
-bool CWakeupManager::unset_voice_key_tap_duration()
-{
-       MWR_LOGI("[ENTER]");
-
-       dependency_resolver_unset_voice_key_tap_duration();
-
-       MWR_LOGD("[END]");
-       return true;
-}
-
-bool CWakeupManager::set_voice_key_support_mode(VOICE_KEY_SUPPORT_MODE mode)
-{
-       MWR_LOGI("Voice key support mode : %d", mode);
-       mCurrentVoiceKeySupportMode = mode;
-
-       char* support_mode = NULL;
-       switch (mode)
-       {
-       case VOICE_KEY_SUPPORT_MODE_NONE:
-               support_mode = strdup("none");
-               break;
-       case VOICE_KEY_SUPPORT_MODE_PUSH_TO_TALK:
-               support_mode = strdup("push_to_talk");
-               break;
-       case VOICE_KEY_SUPPORT_MODE_TAP_TO_TALK:
-               support_mode = strdup("tap_to_talk");
-               break;
-       case VOICE_KEY_SUPPORT_MODE_ALL:
-               support_mode = strdup("all");
-               break;
-       default:
-               support_mode = strdup("none");
-               break;
-       }
-
-       dependency_resolver_set_voice_key_support_mode(support_mode);
-
-       if (support_mode)
-               free(support_mode);
-
-       return true;
-}
-
-CWakeupPolicy* CWakeupManager::get_wakeup_policy()
-{
-       return mWakeupPolicy.get();
-}
-
-CWakeupEngineManager* CWakeupManager::get_engine_manager()
-{
-       return &mWakeupEngineManager;
-}
-
-CAudioManager* CWakeupManager::get_audio_manager()
-{
-       return &mAudioManager;
-}
-
-CWakeupSettings* CWakeupManager::get_wakeup_settings()
-{
-       return &mWakeupSettings;
-}
-
-void CWakeupManager::feed_audio_data(mas_speech_streaming_event_e event, void* buffer, int len)
-{
-       const std::chrono::seconds interval(5);
-       static auto last = std::chrono::steady_clock::now();
-       auto now = std::chrono::steady_clock::now();
-       if (now - last > interval) {
-               std::cerr << "Feeding Audio : " << len << std::endl;
-               last = now;
-       }
-
-       mAudioManager.feed_audio_data(event, buffer, len);
-}
-
-void CWakeupManager::set_dependency_module_command(string engine_name, string command)
-{
-       mWakeupEngineManager.engine_set_dependency_module_command(engine_name, command);
-}
-
-static Eina_Bool periodic_monitor_func(void *data)
-{
-       std::cerr << "MAS PERIODIC HEALTH CHECK" << std::endl;
-       return ECORE_CALLBACK_RENEW;
-}
-
-void CWakeupManager::start_periodic_monitor_timer()
-{
-       MWR_LOGI("MONITOR_TIMER START");
-       mPeriodicMonitorTimer = ecore_timer_add(
-               30.0f,
-               periodic_monitor_func, nullptr);
-}
-
-void CWakeupManager::stop_periodic_monitor_timer()
-{
-       if (mPeriodicMonitorTimer) {
-               ecore_timer_del(mPeriodicMonitorTimer);
-               mPeriodicMonitorTimer = nullptr;
-       }
-}
-
-void CWakeupManager::start_streaming_duration_timer()
-{
-       MWR_LOGI("DURATION_TIMER START");
-       ecore_main_loop_thread_safe_call_async([](void* data) {
-               MWR_LOGI("DURATION_TIMER START - async");
-               CWakeupManager* manager = static_cast<CWakeupManager*>(data);
-               if (!manager) return;
-
-               CWakeupSettings *settings = manager->get_wakeup_settings();
-               if (settings) {
-                       Ecore_Timer* timer = ecore_timer_add(
-                               settings->get_streaming_duration_max(),
-                               streaming_duration_expired, manager);
-                       manager->set_streaming_duration_timer(timer);
-                       MWR_LOGI("DURATION_TIMER STARTED : %p", timer);
-               }
-       }, this);
-}
-
-void CWakeupManager::stop_streaming_duration_timer()
-{
-       MWR_LOGI("DURATION_TIMER STOP");
-       if (mStreamingDurationTimer) {
-               MWR_LOGI("DURATION_TIMER STOP - has timer");
-               ecore_main_loop_thread_safe_call_async([](void* data) {
-                       MWR_LOGI("DURATION_TIMER STOP - async");
-                       CWakeupManager* manager = static_cast<CWakeupManager*>(data);
-                       if (!manager) return;
-
-                       Ecore_Timer* timer = manager->get_streaming_duration_timer();
-                       void* ret = ecore_timer_del(timer);
-                       MWR_LOGI("DURATION_TIMER EXISTS : %p %p", timer, ret);
-                       manager->set_streaming_duration_timer(nullptr);
-               }, this);
-       }
-}
-
-void CWakeupManager::set_streaming_duration_timer(Ecore_Timer* timer)
-{
-       MWR_LOGI("DURATION_TIMER SET : %p", timer);
-       mStreamingDurationTimer = timer;
-}
-
-Ecore_Timer* CWakeupManager::get_streaming_duration_timer()
-{
-       return mStreamingDurationTimer;
-}
-
-bool CWakeupManager::CEngineEventObserver::on_wakeup_event(string engine_name, mas_wakeup_event_info wakeup_info)
-{
-       MWR_LOGI("[ENTER]");
-       if (nullptr == mWakeupManager) return false;
-       if (nullptr == wakeup_info.wakeup_appid) return false;
-
-       if (0 != mWakeupManager->get_default_assistant().compare(wakeup_info.wakeup_appid)) {
-               if (false == mWakeupManager->get_assistant_enabled(string{wakeup_info.wakeup_appid})) {
-                       MWR_LOGE("Wakeup event with deactivated appid : %s", wakeup_info.wakeup_appid);
-                       return false;
-               }
-       }
-
-       CWakeupPolicy* policy = mWakeupManager->get_wakeup_policy();
-       if (policy) {
-               policy->wakeup_candidate(wakeup_info);
-       }
-       return true;
-}
-
-bool CWakeupManager::CEngineEventObserver::on_speech_status(string engine_name, mas_speech_status_e status)
-{
-       MWR_LOGI("[ENTER]");
-       if (nullptr == mWakeupManager) return false;
-
-       return true;
-}
-
-bool CWakeupManager::CEngineEventObserver::on_error(string engine_name, int error_code, string error_message)
-{
-       MWR_LOGI("[ENTER]");
-       if (nullptr == mWakeupManager) return false;
-
-       return true;
-}
-
-bool CWakeupManager::CEngineEventObserver::on_audio_data_require_status(string engine_name, bool require)
-{
-       MWR_LOGI("[ENTER]");
-       if (nullptr == mWakeupManager) return false;
-       if (WAKEUP_MANAGER_STATE_INACTIVE == mWakeupManager->get_manager_state()) return false;
-
-       CAudioManager *audio_manager = mWakeupManager->get_audio_manager();
-       CWakeupEngineManager *engine_manager = mWakeupManager->get_engine_manager();
-
-       if (audio_manager && engine_manager) {
-               if (engine_manager->get_audio_data_required()) {
-                       if (mWakeupManager->get_recording_by_voice_key() != true) {
-                               audio_manager->set_recording_session(RECORDING_SESSION_WAKE_WORD);
-                               audio_manager->start_recording(true);
-                       }
-               } else {
-                       if (mWakeupManager->get_recording_by_voice_key() != true) {
-                               audio_manager->stop_recording(true);
-                       }
-               }
-       }
-       return true;
-}
-
-bool CWakeupManager::CEngineEventObserver::on_streaming_audio_data(
-       mas_speech_streaming_event_e event, void* buffer, unsigned int len)
-{
-       if (nullptr == mWakeupManager) return false;
-
-       vector<IWakeupEventObserver*> observers = mWakeupManager->get_wakeup_observers();
-       for (const auto& observer : observers) {
-               observer->on_streaming_audio_data(event, buffer, len);
-       }
-
-       return true;
-}
-
-bool CWakeupManager::CEngineEventObserver::on_audio_streaming_data_section(
-       ma_audio_streaming_data_section_e section)
-{
-       if (nullptr == mWakeupManager) return false;
-
-       vector<IWakeupEventObserver*> observers = mWakeupManager->get_wakeup_observers();
-       for (const auto& observer : observers) {
-               observer->on_audio_streaming_data_section(section);
-       }
-
-       return true;
-}
-
-bool CWakeupManager::CEngineEventObserver::on_wakeup_engine_command(
-       mas_wakeup_engine_command_target_e target, string engine_name, string assistant_name, string command)
-{
-       if (nullptr == mWakeupManager) return false;
-
-       if (MAS_WAKEUP_ENGINE_COMMAND_TARGET_DEPENDENCY_MODULE == target) {
-               dependency_resolver_process_wakeup_engine_command(engine_name.c_str(), command.c_str());
-       }
-
-       if (MAS_WAKEUP_ENGINE_COMMAND_TARGET_ALL_ASSISTANTS == target ||
-               MAS_WAKEUP_ENGINE_COMMAND_TARGET_SPECIFIC_ASSISTANT == target) {
-               vector<IWakeupEventObserver*> observers = mWakeupManager->get_wakeup_observers();
-               for (const auto& observer : observers) {
-                       observer->on_wakeup_engine_command(target, assistant_name.c_str(), command.c_str());
-               }
-       }
-
-       return true;
-}
-
-void CWakeupManager::CPolicyEventObserver::on_wakeup(mas_wakeup_event_info wakeup_info)
-{
-       if (nullptr == mWakeupManager) return;
-
-       CAudioManager *audio_manager = mWakeupManager->get_audio_manager();
-       CWakeupEngineManager *engine_manager = mWakeupManager->get_engine_manager();
-       CWakeupSettings* settings = mWakeupManager->get_wakeup_settings();
-       if (nullptr == audio_manager || nullptr == engine_manager || nullptr == settings) return;
-
-       if (wakeup_info.wakeup_appid && strlen(wakeup_info.wakeup_appid) > 0) {
-               mWakeupManager->set_default_assistant(wakeup_info.wakeup_appid);
-       }
-
-       mWakeupManager->stop_streaming_utterance_data();
-       mWakeupManager->stop_streaming_previous_utterance_data();
-       mWakeupManager->stop_streaming_follow_up_data();
-       mWakeupManager->change_manager_state(WAKEUP_MANAGER_STATE_UTTERANCE);
-
-       mWakeupManager->set_last_wakeup_event_info(wakeup_info);
-       engine_manager->set_selected_wakeup_info(wakeup_info);
-       vector<IWakeupEventObserver*> observers = mWakeupManager->get_wakeup_observers();
-       for (const auto& observer : observers) {
-               observer->on_wakeup(wakeup_info);
-       }
-
-       audio_manager->set_recording_session(RECORDING_SESSION_UTTERANCE);
-}
-
-bool CWakeupManager::CAudioEventObserver::on_recording_audio_data(long time, void* data, int len)
-{
-       if (nullptr == mWakeupManager) return false;
-       if (nullptr == mEngineManager) return false;
-
-       if (false == mEngineManager->get_audio_data_required()) return false;
-
-       if (mWakeupManager->get_recording_by_voice_key() != true) {
-               /* When follow-up streaming in progress, no need to feed audio data to wakeup engines */
-               if (STREAMING_MODE::FOLLOW_UP != mWakeupManager->get_streaming_mode()) {
-                       mEngineManager->engine_feed_audio_data(time, data, len);
-               }
-       }
-
-       return true;
-}
-
-bool CWakeupManager::CAudioEventObserver::on_streaming_audio_data(
-       mas_speech_streaming_event_e event, void* buffer, unsigned int len)
-{
-       if (nullptr == mWakeupManager) return false;
-
-       vector<IWakeupEventObserver*> observers = mWakeupManager->get_wakeup_observers();
-       for (const auto& observer : observers) {
-               observer->on_streaming_audio_data(event, buffer, len);
-       }
-       if (MAS_SPEECH_STREAMING_EVENT_FINISH == event) {
-               mWakeupManager->set_streaming_mode(STREAMING_MODE::NONE);
-               mWakeupManager->stop_streaming_duration_timer();
-
-               mWakeupManager->set_streaming_completed(true);
-       }
-
-       return true;
-}
-
-bool CWakeupManager::CSettingsEventObserver::on_voice_input_language_changed(
-       const char* language)
-{
-       if (nullptr == mWakeupManager || nullptr == language) return false;
-       mWakeupManager->set_language(std::string(language));
-       vector<ISettingValueObserver*> observers = mWakeupManager->get_setting_observers();
-       for (const auto& observer : observers) {
-               observer->on_value_changed();
-       }
-       return true;
-}
-
-bool CWakeupManager::CSettingsEventObserver::on_assistant_enabled_info_changed(
-       const char* appid, bool enabled)
-{
-       MWR_LOGE("[ENTER]");
-       if (nullptr == mWakeupManager || nullptr == appid) return false;
-       mWakeupManager->set_assistant_enabled(std::string(appid), enabled);
-       vector<ISettingValueObserver*> observers = mWakeupManager->get_setting_observers();
-       for (const auto& observer : observers) {
-               if (mWakeupManager->get_wakeup_settings()->get_multiple_mode())
-                       observer->on_loaded_wakeup_engine_changed();
-               else
-                       observer->on_value_changed();
-       }
-       MWR_LOGE("[END]");
-       return true;
-}
-
-bool CWakeupManager::CSettingsEventObserver::on_default_assistant_appid_changed(
-       const char* appid)
-{
-       MWR_LOGE("[ENTER]");
-       if (nullptr == mWakeupManager || nullptr == appid) return false;
-       /* Passing 'expected' as false since the change was occurred outside of MAS */
-       mWakeupManager->process_default_assistant_changed(std::string(appid), false);
-       vector<ISettingValueObserver*> observers = mWakeupManager->get_setting_observers();
-       for (const auto& observer : observers) {
-               if (mWakeupManager->get_wakeup_settings()->get_multiple_mode())
-                       observer->on_value_changed();
-               else
-                       observer->on_loaded_wakeup_engine_changed();
-       }
-       MWR_LOGE("[END]");
-       return true;
-}
-
-bool CWakeupManager::CSettingsEventObserver::on_multiple_mode_changed()
-{
-       MWR_LOGE("[ENTER]");
-       if (nullptr == mWakeupManager) return false;
-       vector<ISettingValueObserver*> observers = mWakeupManager->get_setting_observers();
-       for (const auto& observer : observers) {
-               observer->on_loaded_wakeup_engine_changed();
-       }
-       MWR_LOGE("[END]");
-       return true;
-}
-
-bool CWakeupManager::CSettingsEventObserver::on_wake_word_detection_enabled_info_changed()
-{
-       MWR_LOGE("[ENTER]");
-       if (nullptr == mWakeupManager) return false;
-       vector<ISettingValueObserver*> observers = mWakeupManager->get_setting_observers();
-       for (const auto& observer : observers) {
-               observer->on_loaded_wakeup_engine_changed();
-       }
-       MWR_LOGE("[END]");
-       return true;
-}
-
-} // wakeup
-} // multiassistant
diff --git a/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp b/plugins/wakeup-manager/src/wakeup_manager_wrapper.cpp
deleted file mode 100644 (file)
index fd89d43..0000000
+++ /dev/null
@@ -1,954 +0,0 @@
-/*
- * 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.
- */
-#include "wakeup_manager_wrapper.h"
-#include "wakeup_manager_main.h"
-#include "wakeup_manager.h"
-
-#include <memory>
-
-#if 0
-#define BUF_SAVE_MODE
-#endif
-#if 0
-#define BUF_LOAD_MODE
-#endif
-
-#ifdef BUF_SAVE_MODE
-static char g_temp_file_name[128] = {'\0', };
-
-static FILE* g_pFile = NULL;
-
-static int g_count = 1;
-#endif
-
-#ifdef BUF_LOAD_MODE
-static FILE* g_pFile = NULL;
-#endif
-
-using namespace multiassistant::wakeup;
-
-static wakeup_service_wakeup_event_cb g_wakeup_event_cb;
-static void* g_wakeup_event_user_data;
-
-static wakeup_service_speech_streaming_cb g_utterance_streaming_cb;
-static void* g_utterance_streaming_user_data;
-
-static wakeup_service_speech_streaming_cb g_previous_utterance_streaming_cb;
-static void* g_previous_utterance_streaming_user_data;
-
-static wakeup_service_speech_streaming_cb g_follow_up_streaming_cb;
-static void* g_follow_up_streaming_user_data;
-
-static wakeup_service_speech_status_cb g_speech_status_cb;
-static void* g_speech_status_user_data;
-
-static wakeup_service_setting_changed_cb g_setting_changed_cb;
-static void* g_setting_changed_user_data;
-
-static wakeup_service_error_cb g_error_cb;
-static void* g_error_user_data;
-
-static wakeup_service_streaming_section_changed_cb g_streaming_section_changed_cb;
-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;
-
-static wakeup_service_voice_key_status_changed_cb g_wakeup_service_voice_key_status_changed_cb;
-static void *g_wakeup_service_voice_key_status_changed_user_data;
-
-static wakeup_service_loaded_engine_changed_cb g_loaded_engine_changed_cb;
-static void *g_loaded_engine_changed_user_data;
-
-class CWakeupEventObserver : public IWakeupEventObserver
-{
-       void on_wakeup(mas_wakeup_event_info wakeup_info) override;
-       void on_streaming_audio_data(
-               mas_speech_streaming_event_e event, void* buffer, unsigned int len) override;
-       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;
-       void on_voice_key_status_changed(ma_voice_key_status_e status) override;
-};
-
-class CSettingValueObserver : public ISettingValueObserver
-{
-       void on_value_changed() override;
-       void on_loaded_wakeup_engine_changed() override;
-};
-
-static std::unique_ptr<CWakeupEventObserver> g_wakeup_event_observer;
-static std::unique_ptr<CSettingValueObserver> g_setting_value_observer;
-static std::unique_ptr<CWakeupManager> g_wakeup_manager;
-
-int wakeup_manager_feed_audio_data(mas_speech_streaming_event_e event, void* buffer, int len);
-
-#ifdef BUF_LOAD_MODE
-static Eina_Bool file_read_feed(void *data)
-{
-       if (g_pFile == NULL) {
-               g_pFile = fopen("/tmp/ma_feed_file", "rb");
-               if (g_pFile == NULL) return EINA_FALSE;
-       }
-
-       if (feof(g_pFile)) {
-               fclose(g_pFile);
-               return EINA_FALSE;
-       }
-
-       const size_t BUFFER_SIZE = 4096;
-       unsigned char buffer[BUFFER_SIZE];
-       size_t len = fread(buffer, sizeof(unsigned char), BUFFER_SIZE, g_pFile);
-       wakeup_manager_feed_audio_data(MAS_SPEECH_STREAMING_EVENT_CONTINUE, buffer, len);
-
-       return EINA_TRUE;
-}
-#endif
-
-int wakeup_manager_initialize(void)
-{
-       MWR_LOGI("[ENTER]");
-
-       try {
-               g_wakeup_event_observer.reset(new CWakeupEventObserver);
-               g_setting_value_observer.reset(new CSettingValueObserver);
-               if (NULL == g_wakeup_event_observer || NULL == g_setting_value_observer) {
-                       return -1;
-               }
-               g_wakeup_manager.reset(new CWakeupManager(g_wakeup_event_observer.get(), g_setting_value_observer.get()));
-               if (NULL == g_wakeup_manager) {
-                       return -1;
-               }
-       } catch (const std::exception& e) {
-               MWR_LOGE("Exception caught : %s", e.what());
-               return -1;
-       }
-
-       g_wakeup_event_cb = NULL;
-       g_wakeup_event_user_data = NULL;
-
-       g_utterance_streaming_cb = NULL;
-       g_utterance_streaming_user_data = NULL;
-
-       g_follow_up_streaming_cb = NULL;
-       g_follow_up_streaming_user_data = NULL;
-
-       g_speech_status_cb = NULL;
-       g_speech_status_user_data = NULL;
-
-       g_setting_changed_cb = NULL;
-       g_setting_changed_user_data = NULL;
-
-       g_error_cb = NULL;
-       g_error_user_data = NULL;
-
-       g_streaming_section_changed_cb = NULL;
-       g_streaming_section_changed_user_data = NULL;
-
-       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_service_voice_key_status_changed_cb = NULL;
-       g_wakeup_service_voice_key_status_changed_user_data = NULL;
-
-       g_loaded_engine_changed_cb = NULL;
-       g_loaded_engine_changed_user_data = NULL;
-
-       g_wakeup_manager->initialize();
-
-       MWR_LOGD("[END]");
-
-#ifdef BUF_SAVE_MODE
-       if (g_pFile) {
-               fclose(g_pFile);
-               g_pFile = NULL;
-       } else {
-               MWR_LOGD("[Recorder Info] File not found!");
-       }
-
-       while (1) {
-               snprintf(g_temp_file_name, sizeof(g_temp_file_name), "/tmp/wakeup_manager_%d_%d", getpid(), g_count);
-               int ret = access(g_temp_file_name, 0);
-
-               if (0 == ret) {
-                       MWR_LOGD("[Recorder ERROR] File is already exist");
-                       if (0 == remove(g_temp_file_name)) {
-                               MWR_LOGD("[Recorder] Remove file");
-                               break;
-                       } else {
-                               g_count++;
-                       }
-               } else {
-                       break;
-               }
-       }
-
-       MWR_LOGD("[Recorder] Temp file name=[%s]", g_temp_file_name);
-
-       /* open test file */
-       g_pFile = fopen(g_temp_file_name, "wb+x");
-       if (!g_pFile) {
-               MWR_LOGD("[Recorder ERROR] File not found!");
-       }
-       g_count++;
-#endif
-
-#ifdef BUF_LOAD_MODE
-       Ecore_Timer* timer = ecore_timer_add(0.01f, file_read_feed, NULL);
-#endif
-       return 0;
-}
-
-int wakeup_manager_deinitialize(void)
-{
-       MWR_LOGI("[ENTER]");
-
-#ifdef BUF_SAVE_MODE
-       if (g_pFile) {
-               MWR_LOGE("[Recorder SUCCESS] File Close");
-               fclose(g_pFile);
-               g_pFile = NULL;
-       }
-#endif
-
-       if (nullptr == g_wakeup_manager) return -1;
-
-       try {
-               g_wakeup_manager->deinitialize();
-               g_wakeup_manager.reset();
-
-               g_wakeup_event_observer.reset();
-               g_setting_value_observer.reset();
-       } catch (const std::exception& e) {
-               MWR_LOGE("Exception caught : %s", e.what());
-               return -1;
-       }
-
-       MWR_LOGI("[END]");
-       return 0;
-}
-
-int wakeup_manager_get_settings(ma_plugin_settings **settings, size_t *struct_size)
-{
-       if (NULL == settings || NULL == struct_size) {
-               MWR_LOGD("[ERROR] Parameter is invalid, settings(%p), struct_size(%p)", settings, struct_size);
-               return -1;
-       }
-
-       if (nullptr == g_wakeup_manager) return -1;
-       CWakeupSettings* wakeup_settings = g_wakeup_manager->get_wakeup_settings();
-       if (wakeup_settings) {
-               const int PLUGIN_VERSION = 1;
-               static ma_plugin_settings current_settings;
-               current_settings.plugin_version = PLUGIN_VERSION;
-               current_settings.ui_panel_enabled = wakeup_settings->get_ui_panel_enabled();
-               *struct_size = sizeof(current_settings);
-               *settings = &current_settings;
-       }
-
-       return 0;
-}
-
-int wakeup_manager_add_assistant_wakeup_word(const char* appid, const char* wakeup_word, const char* language)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (NULL == appid || NULL == wakeup_word) {
-               MWR_LOGD("[ERROR] Parameter is invalid, appid(%s), wakeup_word(%s), language(%s)", appid, wakeup_word, language);
-               return -1;
-       }
-
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->add_assistant_wakeup_word(
-               string{appid}, string{wakeup_word}, (language ? string{language} : string{}));
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_remove_assistant_wakeup_word(const char* appid, const char* wakeup_word, const char* language)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (NULL == appid || NULL == wakeup_word) {
-               MWR_LOGD("[ERROR] Parameter is invalid, appid(%s), wakeup_word(%s), language(%s)", appid, wakeup_word, language);
-               return -1;
-       }
-
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->remove_assistant_wakeup_word(
-               string{appid}, string{wakeup_word}, (language ? string{language} : string{}));
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_add_assistant_language(const char* appid, const char* language)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (NULL == appid || NULL == language) {
-               MWR_LOGD("[ERROR] Parameter is invalid, appid(%s), language(%s)", appid, language);
-               return -1;
-       }
-
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->add_assistant_language(string{appid}, string{language});
-
-       MWR_LOGD("[DEBUG] language(%s)", language);
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_add_assistant_wakeup_engine(const char* appid, const char* engine)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (NULL == appid || NULL == engine) {
-               MWR_LOGD("[ERROR] Parameter is invalid, appid(%s), wakeup engine(%s)", appid, engine);
-               return -1;
-       }
-
-       if (nullptr == g_wakeup_manager) return -1;
-       MWR_LOGD("[DEBUG] appid(%s), wakeup engine(%s)", appid, engine);
-       g_wakeup_manager->add_assistant_wakeup_engine(string{appid}, string{engine});
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_set_default_assistant(const char* appid)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (NULL == appid) {
-               MWR_LOGD("[ERROR] Parameter is NULL");
-               return -1;
-       }
-
-       if (nullptr == g_wakeup_manager) return -1;
-       MWR_LOGD("[DEBUG] default_assistant appid(%s)", appid);
-       g_wakeup_manager->set_default_assistant(string{appid});
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_get_default_assistant(const char** appid)
-{
-       static string default_assistant;
-
-       if (nullptr == g_wakeup_manager) return -1;
-       default_assistant = g_wakeup_manager->get_default_assistant();
-
-       if (default_assistant.empty()) {
-               *appid = nullptr;
-       } else {
-               *appid = default_assistant.c_str();
-       }
-       return 0;
-}
-
-int wakeup_manager_set_language(const char* language)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (NULL == language) {
-               MWR_LOGD("[ERROR] Parameter is NULL");
-               return -1;
-       }
-
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->set_language(string{language});
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_change_state(wakeup_manager_state_e state)
-{
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->change_manager_state(state);
-       return 0;
-}
-
-int wakeup_manager_activate(void)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->activate();
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_deactivate(void)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->deactivate();
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_update_voice_feedback_state(const char* appid, int state)
-{
-       MWR_LOGI("[ENTER]");
-
-       string appid_string;
-       if (NULL == appid) {
-               MWR_LOGD("[ERROR] Parameter is NULL");
-       } else {
-               appid_string = appid;
-       }
-
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->update_voice_feedback_state(appid_string, state);
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_set_assistant_specific_command(const char* appid, const char* command)
-{
-       MWR_LOGI("[ENTER]");
-
-       string appid_string;
-       string command_string;
-       if (NULL == appid || NULL == command) {
-               MWR_LOGD("[ERROR] Parameter is invalid, appid(%s), command(%s)", appid, command);
-       }
-       if (appid) appid_string = appid;
-       if (command) command_string = command;
-
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->set_assistant_specific_command(appid_string, command_string);
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_set_background_volume(const char* appid, double ratio)
-{
-       MWR_LOGI("[ENTER]");
-
-       string appid_string;
-       if (NULL == appid) {
-               MWR_LOGD("[ERROR] Parameter is NULL");
-       } else {
-               appid_string = appid;
-       }
-
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->set_background_volume(appid_string, ratio);
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_update_recognition_result(const char* appid, int result)
-{
-       MWR_LOGI("[ENTER]");
-
-       string appid_string;
-       if (NULL == appid) {
-               MWR_LOGD("[ERROR] Parameter is NULL");
-       } else {
-               appid_string = appid;
-       }
-
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->update_recognition_result(appid_string, result);
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_process_plugin_event(mas_plugin_event_e event, void* data, int len)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->process_plugin_event(event, data, len);
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_start_streaming_utterance_data(void)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->start_streaming_utterance_data();
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_stop_streaming_utterance_data(void)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->stop_streaming_utterance_data();
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_start_streaming_follow_up_data(void)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->start_streaming_follow_up_data();
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_stop_streaming_follow_up_data(void)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->stop_streaming_follow_up_data();
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_start_streaming_previous_utterance_data(void)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->start_streaming_previous_utterance_data();
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_stop_streaming_previous_utterance_data(void)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->stop_streaming_previous_utterance_data();
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_get_audio_format(int* rate, int* channel, int* audio_type)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (!audio_type || !rate || !channel) {
-               MWR_LOGE("[ERROR] Invalid parameter");
-               return -1;
-       }
-
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->get_audio_format(rate, channel, audio_type);
-
-       MWR_LOGD("[END] rate(%d), channel(%d), audio_type(%d)", *rate, *channel, *audio_type);
-       return 0;
-}
-
-int wakeup_manager_get_audio_source_type(char** type)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (!type) {
-               MWR_LOGE("[ERROR] Invalid parameter");
-               return -1;
-       }
-
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->get_audio_source_type(type);
-
-       MWR_LOGD("[END] type(%s)", *type);
-       return 0;
-}
-
-int wakeup_manager_set_voice_key_tap_duration(float duration)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->set_voice_key_tap_duration(duration);
-
-       MWR_LOGD("[END] duration(%f)", duration);
-       return 0;
-}
-
-int wakeup_manager_unset_voice_key_tap_duration()
-{
-       MWR_LOGI("[ENTER]");
-
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->unset_voice_key_tap_duration();
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_set_voice_key_support_mode(int mode)
-{
-       MWR_LOGI("[ENTER] : %d", mode);
-
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->set_voice_key_support_mode(static_cast<VOICE_KEY_SUPPORT_MODE>(mode));
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_set_wake_word_audio_require_flag(bool require)
-{
-       MWR_LOGI("[ENTER] : %d", require);
-
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->set_wake_word_audio_require_flag(require);
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_set_assistant_language(const char* appid, const char* language)
-{
-       MWR_LOGI("[ENTER]");
-
-       string appid_string;
-       string language_string;
-       if (NULL == appid || NULL == language) {
-               MWR_LOGE("[ERROR] Parameter is invalid, appid(%s), language(%s)", appid, language);
-               return -1;
-       }
-       appid_string = appid;
-       language_string = language;
-
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->set_assistant_language(appid_string, language_string);
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_set_wakeup_event_callback(wakeup_service_wakeup_event_cb callback, void* user_data)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (NULL == callback) {
-               MWR_LOGE("[ERROR] Input parameter is NULL");
-               return -1;
-       }
-
-       g_wakeup_event_cb = callback;
-       g_wakeup_event_user_data = user_data;
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_set_utterance_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (NULL == callback) {
-               MWR_LOGE("[ERROR] Input parameter is NULL");
-               return -1;
-       }
-
-       g_utterance_streaming_cb = callback;
-       g_utterance_streaming_user_data = user_data;
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_set_previous_utterance_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (NULL == callback) {
-               MWR_LOGE("[ERROR] Input parameter is NULL");
-               return -1;
-       }
-
-       g_previous_utterance_streaming_cb = callback;
-       g_previous_utterance_streaming_user_data = user_data;
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_set_follow_up_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (NULL == callback) {
-               MWR_LOGE("[ERROR] Input parameter is NULL");
-               return -1;
-       }
-
-       g_follow_up_streaming_cb = callback;
-       g_follow_up_streaming_user_data = user_data;
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_set_speech_status_callback(wakeup_service_speech_status_cb callback, void* user_data)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (NULL == callback) {
-               MWR_LOGE("[ERROR] Input parameter is NULL");
-               return -1;
-       }
-
-       g_speech_status_cb = callback;
-       g_speech_status_user_data = user_data;
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_set_setting_changed_callback(wakeup_service_setting_changed_cb callback, void* user_data)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (NULL == callback) {
-               MWR_LOGE("[ERROR] Input parameter is NULL");
-               return -1;
-       }
-
-       g_setting_changed_cb = callback;
-       g_setting_changed_user_data = user_data;
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_set_error_callback(wakeup_service_error_cb callback, void* user_data)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (NULL == callback) {
-               MWR_LOGE("[ERROR] Input parameter is NULL");
-               return -1;
-       }
-
-       g_error_cb = callback;
-       g_error_user_data = user_data;
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_set_streaming_section_changed_callback(wakeup_service_streaming_section_changed_cb callback, void* user_data)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (NULL == callback) {
-               MWR_LOGE("[ERROR] Input parameter is NULL");
-               return -1;
-       }
-
-       g_streaming_section_changed_cb = callback;
-       g_streaming_section_changed_user_data = user_data;
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_set_wakeup_engine_command_callback(wakeup_service_engine_command_cb callback, void* user_data)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (NULL == callback) {
-               MWR_LOGE("[ERROR] Input parameter is NULL");
-               return -1;
-       }
-
-       g_wakeup_engine_command_cb = callback;
-       g_wakeup_engine_command_user_data = user_data;
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_set_wakeup_service_state_changed_callback(wakeup_service_state_changed_cb callback, void* user_data)
-{
-       MWR_LOGI("[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_set_voice_key_status_changed_callback(wakeup_service_voice_key_status_changed_cb callback, void* user_data)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (NULL == callback) {
-               MWR_LOGE("[ERROR] Input parameter is NULL");
-               return -1;
-       }
-
-       g_wakeup_service_voice_key_status_changed_cb = callback;
-       g_wakeup_service_voice_key_status_changed_user_data = user_data;
-
-       MWR_LOGD("[END]");
-       return 0;
-}
-
-int wakeup_manager_set_loaded_engine_changed_callback(wakeup_service_loaded_engine_changed_cb callback, void* user_data)
-{
-       MWR_LOGI("[ENTER]");
-
-       if (NULL == callback) {
-               MWR_LOGE("[ERROR] Input parameter is NULL");
-               return -1;
-       }
-
-       g_loaded_engine_changed_cb = callback;
-       g_loaded_engine_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;
-
-#ifdef BUF_SAVE_MODE
-       static int num = 0;
-       const int MAXIMUM_NUM = 1000;
-       if (g_pFile && num++ < MAXIMUM_NUM)
-               fwrite(buffer, 1, len, g_pFile);
-#endif
-
-       g_wakeup_manager->feed_audio_data(event, buffer, len);
-
-       return 0;
-}
-
-int wakeup_manager_set_dependency_module_command(const char* engine_name, const char* command)
-{
-       if (nullptr == g_wakeup_manager) return -1;
-       g_wakeup_manager->set_dependency_module_command(
-               engine_name ? engine_name : "",
-               command ? command : "");
-       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);
-       return 0;
-}
-
-void CWakeupEventObserver::on_wakeup(mas_wakeup_event_info wakeup_info)
-{
-       if (NULL != g_wakeup_event_cb) {
-               g_wakeup_event_cb(wakeup_info, g_wakeup_event_user_data);
-       }
-}
-
-void CWakeupEventObserver::on_streaming_audio_data(
-       mas_speech_streaming_event_e event, void* buffer, unsigned int len)
-{
-       if (MAS_SPEECH_STREAMING_EVENT_START == event) {
-               MWR_LOGI("streaming_cb START");
-       }
-       if (MAS_SPEECH_STREAMING_EVENT_FINISH == event) {
-               MWR_LOGI("streaming_cb FINISH");
-       }
-       if (NULL != g_utterance_streaming_cb) {
-               g_utterance_streaming_cb(event, buffer, len, g_utterance_streaming_user_data);
-       } else {
-               MWR_LOGI("[INFO] No service streaming callback");
-       }
-}
-
-void CWakeupEventObserver::on_audio_streaming_data_section(
-       ma_audio_streaming_data_section_e section)
-{
-       if (g_streaming_section_changed_cb) {
-               g_streaming_section_changed_cb(section, g_streaming_section_changed_user_data);
-       }
-}
-
-void CWakeupEventObserver::on_wakeup_engine_command(
-       mas_wakeup_engine_command_target_e target, const char* assistant_name, const char* command)
-{
-       if (g_wakeup_engine_command_cb) {
-               g_wakeup_engine_command_cb(target, assistant_name, command, g_wakeup_engine_command_user_data);
-       }
-}
-
-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 CWakeupEventObserver::on_voice_key_status_changed(ma_voice_key_status_e status)
-{
-       if (g_wakeup_service_voice_key_status_changed_cb) {
-               g_wakeup_service_voice_key_status_changed_cb(status, g_wakeup_service_voice_key_status_changed_user_data);
-       }
-}
-
-void CSettingValueObserver::on_value_changed()
-{
-       if (g_setting_changed_cb) {
-               g_setting_changed_cb(g_setting_changed_user_data);
-       }
-}
-
-void CSettingValueObserver::on_loaded_wakeup_engine_changed()
-{
-       if (g_loaded_engine_changed_cb) {
-               g_loaded_engine_changed_cb(g_loaded_engine_changed_user_data);
-       }
-}
diff --git a/plugins/wakeup-manager/src/wakeup_policy.cpp b/plugins/wakeup-manager/src/wakeup_policy.cpp
deleted file mode 100644 (file)
index e196ac0..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-#include "wakeup_policy.h"
-#include "wakeup_policy_impl.h"
-
-#include <vector>
-#include <algorithm>
-
-namespace multiassistant
-{
-namespace wakeup
-{
-
-void CWakeupPolicyImpl::subscribe(IPolicyEventObserver *observer)
-{
-       mObservers.push_back(observer);
-}
-
-void CWakeupPolicyImpl::unsubscribe(IPolicyEventObserver *observer)
-{
-       auto iter = find(mObservers.begin(), mObservers.end(), observer);
-       if (iter != mObservers.end()) {
-               mObservers.erase(iter);
-       }
-}
-
-void CWakeupPolicyImpl::wakeup(mas_wakeup_event_info wakeup_info)
-{
-       for (const auto& observer : mObservers) {
-               if (observer) {
-                       observer->on_wakeup(wakeup_info);
-               }
-       }
-}
-
-CWakeupPolicy::CWakeupPolicy()
-{
-       mImpl.reset(new CWakeupPolicyImpl);
-}
-
-CWakeupPolicy::~CWakeupPolicy()
-{
-}
-
-CWakeupPolicy::CWakeupPolicy(IPolicyEventObserver *observer) : CWakeupPolicy()
-{
-       subscribe(observer);
-}
-
-void CWakeupPolicy::subscribe(IPolicyEventObserver *observer)
-{
-       if (mImpl) mImpl->subscribe(observer);
-}
-
-void CWakeupPolicy::unsubscribe(IPolicyEventObserver *observer)
-{
-       if (mImpl) mImpl->unsubscribe(observer);
-}
-
-} // wakeup
-} // multiassistant
diff --git a/plugins/wakeup-manager/src/wakeup_policy_default.cpp b/plugins/wakeup-manager/src/wakeup_policy_default.cpp
deleted file mode 100644 (file)
index 964a1f1..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-#include "wakeup_policy_default.h"
-#include "wakeup_policy_impl.h"
-#include "wakeup_manager_main.h"
-
-#include <vector>
-
-#include <Eina.h>
-#include <dlog.h>
-
-namespace multiassistant
-{
-namespace wakeup
-{
-
-CWakeupPolicyDefault::CWakeupPolicyDefault(IPolicyEventObserver *observer)
-       : CWakeupPolicy(observer)
-{
-}
-
-CWakeupPolicyDefault::~CWakeupPolicyDefault()
-{
-       if (mTimer) {
-               ecore_timer_del(mTimer);
-               mTimer = nullptr;
-       }
-}
-
-bool CWakeupPolicyDefault::valid()
-{
-       return true;
-}
-
-void CWakeupPolicyDefault::set_assistant_priority(string appid, int priority)
-{
-       PRIORITY_INFO info;
-       info.appid = appid;
-       info.priority = priority;
-
-       MWR_LOGD("Setting assistant priority : %s %d", appid.c_str(), priority);
-       mPriorityInfos.push_back(info);
-}
-
-void CWakeupPolicyDefault::set_delay(float seconds)
-{
-       MWR_LOGD("Setting delay : %f", seconds);
-       mDelaySeconds = seconds;
-}
-
-float CWakeupPolicyDefault::get_delay()
-{
-       return mDelaySeconds;
-}
-
-void CWakeupPolicyDefault::set_timer(Ecore_Timer* timer)
-{
-       mTimer = timer;
-}
-
-Ecore_Timer* CWakeupPolicyDefault::get_timer()
-{
-       return mTimer;
-}
-
-static Eina_Bool timer_func(void *data)
-{
-       MWR_LOGD("[ENTER]");
-       if (data) {
-               CWakeupPolicyDefault *policy = static_cast<CWakeupPolicyDefault*>(data);
-               policy->timer_expired();
-               policy->set_timer(nullptr);
-       }
-       return ECORE_CALLBACK_CANCEL;
-}
-
-void CWakeupPolicyDefault::wakeup_candidate(mas_wakeup_event_info wakeup_info)
-{
-       MWR_LOGI("[ENTER]");
-       mas_wakeup_event_info_wrapper wrapper;
-       wrapper.info = wakeup_info;
-       if (wakeup_info.wakeup_appid) wrapper.wakeup_appid = wakeup_info.wakeup_appid;
-       if (wakeup_info.wakeup_word) wrapper.wakeup_word = wakeup_info.wakeup_word;
-       if (wakeup_info.wakeup_language) wrapper.wakeup_language = wakeup_info.wakeup_language;
-       if (wakeup_info.wakeup_voice_id) wrapper.wakeup_voice_id = wakeup_info.wakeup_voice_id;
-       if (wakeup_info.wakeup_engine) wrapper.wakeup_engine = wakeup_info.wakeup_engine;
-       if (wakeup_info.extra_data_description) wrapper.extra_data_description = wakeup_info.extra_data_description;
-
-       if (wakeup_info.extra_data && wakeup_info.extra_data_length > 0) {
-               wrapper.extra_data.assign(
-                       (unsigned char*)wakeup_info.extra_data,
-                       (unsigned char*)wakeup_info.extra_data + wakeup_info.extra_data_length);
-       }
-
-       LOGI("wake word : %s", wakeup_info.wakeup_word);
-       mWakeupInfos.push_back(wrapper);
-       if (nullptr == mTimer) {
-               ecore_main_loop_thread_safe_call_async([](void* data) {
-                       /* Assume that choosing the first wakeup event is the default behavior */
-                       timer_func(data);
-               }, this);
-       }
-}
-
-void CWakeupPolicyDefault::select_candidate(mas_wakeup_event_info wakeup_info)
-{
-       MWR_LOGE("Default wakeup policy does not support selecting candidate");
-}
-
-void CWakeupPolicyDefault::timer_expired()
-{
-       MWR_LOGD("[ENTER]");
-       if (0 == mWakeupInfos.size()) return;
-
-       mas_wakeup_event_info_wrapper selected = mWakeupInfos.front();
-       LOGD("wake word : %s", selected.wakeup_word.c_str());
-       int selected_priority = -1;
-       for (const auto &wakeup : mWakeupInfos) {
-               for (const auto &info : mPriorityInfos) {
-                       if (0 == info.appid.compare(wakeup.wakeup_appid)) {
-                               if (info.priority > selected_priority || -1 == selected_priority) {
-                                       MWR_LOGD("Wakeup with higher priority found : %s, %d",
-                                               info.appid.c_str(), info.priority);
-                                       selected = wakeup;
-                                       selected_priority = info.priority;
-                               }
-                       }
-               }
-       }
-       selected.info.wakeup_appid = selected.wakeup_appid.c_str();
-       selected.info.wakeup_word = selected.wakeup_word.c_str();
-       selected.info.wakeup_language = selected.wakeup_language.c_str();
-       selected.info.wakeup_voice_id = selected.wakeup_voice_id.c_str();
-       selected.info.wakeup_engine = selected.wakeup_engine.c_str();
-       selected.info.extra_data = selected.extra_data.data();
-       selected.info.extra_data_length = selected.extra_data.size();
-       selected.info.extra_data_description = selected.extra_data_description.c_str();
-
-       if (mImpl) mImpl->wakeup(selected.info);
-       mWakeupInfos.clear();
-
-       if (mTimer) {
-               MWR_LOGD("Now deleting timer");
-               ecore_timer_del(mTimer);
-               mTimer = nullptr;
-       }
-}
-
-} // wakeup
-} // multiassistant
diff --git a/plugins/wakeup-manager/src/wakeup_policy_external.cpp b/plugins/wakeup-manager/src/wakeup_policy_external.cpp
deleted file mode 100644 (file)
index 2c94a2a..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-#include "wakeup_policy_external.h"
-#include "wakeup_policy_impl.h"
-
-#include "dependency_resolver.h"
-
-#include <dlog.h>
-
-#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
diff --git a/plugins/wakeup-manager/src/wakeup_settings.cpp b/plugins/wakeup-manager/src/wakeup_settings.cpp
deleted file mode 100644 (file)
index 602110f..0000000
+++ /dev/null
@@ -1,457 +0,0 @@
-#include "wakeup_settings.h"
-#include "wakeup_manager_main.h"
-
-#include <sstream>
-#include <algorithm>
-#include <json/json.h>
-
-namespace multiassistant
-{
-namespace wakeup
-{
-
-/* Utility function for checking if an element exists in a container */
-template<class C, class T>
-static auto contains(const C& v, const T& x) -> decltype(end(v), true)
-{
-       return end(v) != find(begin(v), end(v), x);
-}
-
-static string prev_wake_word_enabled;
-
-CWakeupSettings::CWakeupSettings()
-{
-}
-
-CWakeupSettings::~CWakeupSettings()
-{
-}
-
-static void wakeup_setting_input_language_changed_cb(keynode_t* node, void* data)
-{
-       MWR_LOGD("[ENTER]");
-       if (nullptr == node) return;
-
-       CWakeupSettings* settings = static_cast<CWakeupSettings*>(data);
-       if (nullptr == settings) return;
-
-       if (VCONF_TYPE_STRING == node->type) {
-               const char* value = static_cast<const char*>(node->value.s);
-               const auto& observers = settings->get_observers();
-               for (const auto& observer : observers) {
-                       if (observer) {
-                               if (!observer->on_voice_input_language_changed(value)) {
-                                       LOGW("[Settings WARNING] One of the observer returned false");
-                               }
-                       }
-               }
-       } else {
-               LOGE("[Settings ERROR] the value type is not string : %d", node->type);
-       }
-}
-
-static void wakeup_setting_streaming_duration_max_changed_cb(keynode_t* node, void* data)
-{
-       MWR_LOGD("[ENTER]");
-       if (nullptr == node) return;
-
-       CWakeupSettings* settings = static_cast<CWakeupSettings*>(data);
-       if (nullptr == settings) return;
-
-       if (VCONF_TYPE_DOUBLE == node->type) {
-               double value = static_cast<double>(node->value.d);
-               settings->set_streaming_duration_max(static_cast<float>(value));
-       } else {
-               LOGE("[Settings ERROR] the value type is not string : %d", node->type);
-       }
-}
-
-
-static void wakeup_setting_enabled_assistants_changed_cb(keynode_t* node, void* data)
-{
-       MWR_LOGD("[ENTER]");
-       if (nullptr == node) return;
-
-       CWakeupSettings* settings = static_cast<CWakeupSettings*>(data);
-       if (nullptr == settings) return;
-
-       if (VCONF_TYPE_STRING == node->type) {
-               vector<string> newlyAddedAssistants;
-               vector<string> newlyRemovedAssistants;
-               const char* value = static_cast<const char*>(node->value.s);
-               if (value) {
-                       vector<string> previouslyEnabledAssistants = settings->get_enabled_assistants();
-                       vector<string> currentlyEnabledAssistants;
-                       string token;
-                       istringstream iss(value);
-                       currentlyEnabledAssistants.clear();
-                       while (getline(iss, token, ';')) {
-                               currentlyEnabledAssistants.push_back(token);
-                               MWR_LOGD("enabled_assistants : %s", token.c_str());
-                       }
-
-                       for (const auto& assistant : currentlyEnabledAssistants) {
-                               if (!contains(previouslyEnabledAssistants, assistant)) {
-                                       newlyAddedAssistants.push_back(assistant);
-                               }
-                       }
-                       for (const auto& assistant : previouslyEnabledAssistants) {
-                               if (!contains(currentlyEnabledAssistants, assistant)) {
-                                       newlyRemovedAssistants.push_back(assistant);
-                               }
-                       }
-               }
-
-               const auto& observers = settings->get_observers();
-               for (const auto& observer : observers) {
-                       if (observer) {
-                               for (const auto& assistant : newlyAddedAssistants) {
-                                       if (!observer->on_assistant_enabled_info_changed(assistant.c_str(), true)) {
-                                               LOGW("[Settings WARNING] One of the observer returned false");
-                                       }
-                               }
-                               for (const auto& assistant : newlyRemovedAssistants) {
-                                       if (!observer->on_assistant_enabled_info_changed(assistant.c_str(), false)) {
-                                               LOGW("[Settings WARNING] One of the observer returned false");
-                                       }
-                               }
-                       }
-               }
-       } else {
-               LOGE("[Settings ERROR] the value type is not string : %d", node->type);
-       }
-}
-
-static void wakeup_setting_default_assistant_appid_changed_cb(keynode_t* node, void* data)
-{
-       MWR_LOGD("[ENTER]");
-       if (nullptr == node) return;
-
-       CWakeupSettings* settings = static_cast<CWakeupSettings*>(data);
-       if (nullptr == settings) return;
-
-       if (VCONF_TYPE_STRING == node->type) {
-               const char* value = static_cast<const char*>(node->value.s);
-               const auto& observers = settings->get_observers();
-               for (const auto& observer : observers) {
-                       if (observer) {
-                               if (!observer->on_default_assistant_appid_changed(value)) {
-                                       LOGW("[Settings WARNING] One of the observer returned false");
-                               }
-                       }
-               }
-       } else {
-               LOGE("[Settings ERROR] the value type is not string : %d", node->type);
-       }
-}
-
-static void wakeup_setting_multiple_mode_changed_cb(keynode_t* node, void* data)
-{
-       MWR_LOGD("[ENTER]");
-
-       CWakeupSettings* settings = static_cast<CWakeupSettings*>(data);
-       if (nullptr == settings) return;
-
-       const auto& observers = settings->get_observers();
-       for (const auto& observer : observers) {
-               if (observer) {
-                       if (!observer->on_multiple_mode_changed()) {
-                               LOGW("[Settings WARNING] One of the observer returned false");
-                       }
-               }
-       }
-}
-
-static void wakeup_setting_enabled_wake_word_detection_changed_cb(keynode_t* node, void* data)
-{
-       MWR_LOGD("[ENTER]");
-
-       char *vconf_str = vconf_keynode_get_str(node);
-       if (!vconf_str) return;
-
-       MWR_LOGI("vconf value : %s", vconf_str);
-       if (0 == prev_wake_word_enabled.compare(string(vconf_str))) {
-               return;
-       }
-
-       prev_wake_word_enabled = string(vconf_str);
-
-       CWakeupSettings* settings = static_cast<CWakeupSettings*>(data);
-       if (nullptr == settings) return;
-
-       const auto& observers = settings->get_observers();
-       for (const auto& observer : observers) {
-               if (observer) {
-                       if (!observer->on_wake_word_detection_enabled_info_changed()) {
-                               LOGW("[Settings WARNING] One of the observer returned false");
-                       }
-               }
-       }
-}
-
-void CWakeupSettings::initialize(map<string, string> custom_keys)
-{
-       int vconf_ret;
-       int vconf_bool;
-       double vconf_double;
-
-       mCustomVconfKeys.clear();
-       mCustomVconfKeys = custom_keys;
-
-       char *default_assistant_appid = vconf_get_str(mCustomVconfKeys[WAKEUP_SETTINGS_KEY_DEFAULT_ASSISTANT_APPID].c_str());
-       if (default_assistant_appid) {
-               mDefaultAssistantAppid = default_assistant_appid;
-               MWR_LOGD("default_assistant_appid : %s", mDefaultAssistantAppid.c_str());
-               for (const auto& observer : mObservers) {
-                       if (observer) {
-                               if (!observer->on_default_assistant_appid_changed(default_assistant_appid)) {
-                                       LOGW("[Settings WARNING] One of the observer returned false");
-                               }
-                       }
-               }
-               free(default_assistant_appid);
-               default_assistant_appid = nullptr;
-       }
-       vconf_ret = vconf_get_bool(WAKEUP_SETTINGS_KEY_UI_PANEL_ENABLED, &vconf_bool);
-       if (0 == vconf_ret) {
-               mUiPanelEnabled = vconf_bool;
-               MWR_LOGD("ui_panel_enabled : %s", (mUiPanelEnabled ? "true" : "false"));
-       }
-       vconf_ret = vconf_get_dbl(WAKEUP_SETTINGS_KEY_CONVERSATION_TIMEOUT, &vconf_double);
-       if (0 == vconf_ret) {
-               mConversationTimeout = vconf_double;
-               MWR_LOGD("conversation_timeout : %f", mConversationTimeout);
-       }
-       vconf_ret = vconf_get_bool(WAKEUP_SETTINGS_KEY_MULTIPLE_MODE, &vconf_bool);
-       if (0 == vconf_ret) {
-               mMultipleMode = vconf_bool;
-               MWR_LOGD("multiple_mode : %s", (mMultipleMode ? "true" : "false"));
-       }
-       if (true == mMultipleMode) {
-               char *enabled_assistants = vconf_get_str(mCustomVconfKeys[WAKEUP_SETTINGS_KEY_ENABLED_ASSISTANTS].c_str());
-               if (enabled_assistants) {
-                       string token;
-                       istringstream iss(enabled_assistants);
-                       mEnabledAssistants.clear();
-                       while (getline(iss, token, ';')) {
-                               mEnabledAssistants.push_back(token);
-                               MWR_LOGD("enabled_assistants : %s", token.c_str());
-                               for (const auto& observer : mObservers) {
-                                       if (observer) {
-                                               if (!observer->on_assistant_enabled_info_changed(token.c_str(), true)) {
-                                                       LOGW("[Settings WARNING] One of the observer returned false");
-                                               }
-                                       }
-                               }
-                       }
-                       free(enabled_assistants);
-                       enabled_assistants = nullptr;
-               }
-       }
-       char *wakeword_detection_enabled = vconf_get_str(mCustomVconfKeys[WAKEUP_SETTINGS_KEY_WAKE_WORD_DETECTION_ENABLED].c_str());
-       if (wakeword_detection_enabled) {
-               Json::Reader reader;
-               Json::Value root;
-               mWakeWordDisabledAssistants.clear();
-               if (!reader.parse(wakeword_detection_enabled, root)) {
-                       LOGW("[Settings WARNING] Failed to parse Json : %s", reader.getFormattedErrorMessages().c_str());
-               } else {
-                       auto member = root.getMemberNames();
-                       for (string m : member) {
-                               if (0 == root[m].asString().compare("off")) {
-                                       mWakeWordDisabledAssistants.push_back(m);
-                                       MWR_LOGD("wake_word_detection_disabled assistant : %s", m.c_str());
-                               }
-                       }
-               }
-               free(wakeword_detection_enabled);
-               wakeword_detection_enabled = nullptr;
-       }
-       vconf_ret = vconf_get_dbl(WAKEUP_SETTINGS_KEY_WAKEUP_POLICY_DELAY, &vconf_double);
-       if (0 == vconf_ret) {
-               mWakeupPolicyDelay = vconf_double;
-               MWR_LOGD("conversation_timeout : %f", mWakeupPolicyDelay);
-       }
-       char *wakeup_policy_priority = vconf_get_str(WAKEUP_SETTINGS_KEY_WAKEUP_POLICY_PRIORITY);
-       if (wakeup_policy_priority) {
-               string token;
-               istringstream iss(wakeup_policy_priority);
-               mWakeupPolicyPriority.clear();
-               while (getline(iss, token, ';')) {
-                       mWakeupPolicyPriority.push_back(token);
-                       MWR_LOGD("wakeup_policy_priority : %s", token.c_str());
-               }
-               free(wakeup_policy_priority);
-               wakeup_policy_priority = nullptr;
-       }
-       vconf_ret = vconf_get_dbl(WAKEUP_SETTINGS_KEY_STREAMING_DURATION_MAX, &vconf_double);
-       if (0 == vconf_ret) {
-               mStreamingDurationMax = vconf_double;
-               MWR_LOGD("streaming_duration_max : %f", mStreamingDurationMax);
-       }
-#ifdef ENABLE_VOICE_INPUT_LANGUAGE_SETTINGS
-       char *voice_input_language = vconf_get_str(WAKEUP_SETTINGS_KEY_VOICE_INPUT_LANGUAGE);
-       if (voice_input_language) {
-               mVoiceInputLanguage = voice_input_language;
-               MWR_LOGD("voice input language : %s", mVoiceInputLanguage.c_str());
-               for (const auto& observer : mObservers) {
-                       if (observer) {
-                               if (!observer->on_voice_input_language_changed(voice_input_language)) {
-                                       LOGW("[Settings WARNING] One of the observer returned false");
-                               }
-                       }
-               }
-               free(voice_input_language);
-               voice_input_language = nullptr;
-       }
-#endif
-
-#ifdef ENABLE_VOICE_INPUT_LANGUAGE_SETTINGS
-       vconf_notify_key_changed(WAKEUP_SETTINGS_KEY_VOICE_INPUT_LANGUAGE,
-               wakeup_setting_input_language_changed_cb, this);
-#endif
-       vconf_notify_key_changed(WAKEUP_SETTINGS_KEY_STREAMING_DURATION_MAX,
-               wakeup_setting_streaming_duration_max_changed_cb, this);
-       vconf_notify_key_changed(mCustomVconfKeys[WAKEUP_SETTINGS_KEY_DEFAULT_ASSISTANT_APPID].c_str(),
-               wakeup_setting_default_assistant_appid_changed_cb, this);
-       if (true == mMultipleMode) {
-               vconf_notify_key_changed(mCustomVconfKeys[WAKEUP_SETTINGS_KEY_ENABLED_ASSISTANTS].c_str(),
-                       wakeup_setting_enabled_assistants_changed_cb, this);
-       }
-       vconf_notify_key_changed(WAKEUP_SETTINGS_KEY_MULTIPLE_MODE,
-               wakeup_setting_multiple_mode_changed_cb, this);
-       vconf_notify_key_changed(mCustomVconfKeys[WAKEUP_SETTINGS_KEY_WAKE_WORD_DETECTION_ENABLED].c_str(),
-               wakeup_setting_enabled_wake_word_detection_changed_cb, this);
-}
-
-void CWakeupSettings::deinitialize()
-{
-#ifdef ENABLE_VOICE_INPUT_LANGUAGE_SETTINGS
-       vconf_ignore_key_changed(WAKEUP_SETTINGS_KEY_VOICE_INPUT_LANGUAGE,
-               wakeup_setting_input_language_changed_cb);
-#endif
-       vconf_ignore_key_changed(WAKEUP_SETTINGS_KEY_STREAMING_DURATION_MAX,
-               wakeup_setting_streaming_duration_max_changed_cb);
-       vconf_ignore_key_changed(mCustomVconfKeys[WAKEUP_SETTINGS_KEY_DEFAULT_ASSISTANT_APPID].c_str(),
-               wakeup_setting_default_assistant_appid_changed_cb);
-       if (true == mMultipleMode) {
-               vconf_ignore_key_changed(mCustomVconfKeys[WAKEUP_SETTINGS_KEY_ENABLED_ASSISTANTS].c_str(),
-                       wakeup_setting_enabled_assistants_changed_cb);
-       }
-       vconf_ignore_key_changed(WAKEUP_SETTINGS_KEY_MULTIPLE_MODE,
-               wakeup_setting_multiple_mode_changed_cb);
-       vconf_ignore_key_changed(mCustomVconfKeys[WAKEUP_SETTINGS_KEY_WAKE_WORD_DETECTION_ENABLED].c_str(),
-               wakeup_setting_enabled_wake_word_detection_changed_cb);
-}
-
-void CWakeupSettings::subscribe(ISettingsEventObserver *observer)
-{
-       mObservers.push_back(observer);
-}
-
-void CWakeupSettings::unsubscribe(ISettingsEventObserver *observer)
-{
-       auto iter = find(mObservers.begin(), mObservers.end(), observer);
-       if (iter != mObservers.end()) {
-               mObservers.erase(iter);
-       }
-}
-
-const vector<ISettingsEventObserver*>& CWakeupSettings::get_observers()
-{
-       return mObservers;
-}
-
-string CWakeupSettings::get_default_assistant_appid()
-{
-       char *vconf_str;
-       vconf_str = vconf_get_str(mCustomVconfKeys[WAKEUP_SETTINGS_KEY_DEFAULT_ASSISTANT_APPID].c_str());
-       MWR_LOGD("vconf default_assistant_appid : %s", vconf_str);
-       if (vconf_str) {
-               mDefaultAssistantAppid = vconf_str;
-               MWR_LOGD("member default_assistant_appid : %s", mDefaultAssistantAppid.c_str());
-               free(vconf_str);
-               vconf_str = nullptr;
-       }
-
-       return mDefaultAssistantAppid;
-}
-
-void CWakeupSettings::set_default_assistant_appid(std::string appid)
-{
-       if (appid.empty()) {
-               MWR_LOGE("appid is NULL");
-               return;
-       }
-       if (appid.compare(get_default_assistant_appid()) == 0) {
-               MWR_LOGE("Default assistant appid not changed, ignoring...");
-               return;
-       }
-       int ret = vconf_set_str(mCustomVconfKeys[WAKEUP_SETTINGS_KEY_DEFAULT_ASSISTANT_APPID].c_str(), appid.c_str());
-       MWR_LOGD("default_assistant_appid : %s, %d", appid.c_str(), ret);
-       mDefaultAssistantAppid = appid;
-}
-
-bool CWakeupSettings::get_ui_panel_enabled()
-{
-       return mUiPanelEnabled;
-}
-
-float CWakeupSettings::get_conversation_timeout()
-{
-       return mConversationTimeout;
-}
-
-bool CWakeupSettings::get_multiple_mode()
-{
-       return mMultipleMode;
-}
-
-vector<string> CWakeupSettings::get_enabled_assistants()
-{
-       return mEnabledAssistants;
-}
-
-float CWakeupSettings::get_wakeup_policy_delay()
-{
-       return mWakeupPolicyDelay;
-}
-
-vector<string> CWakeupSettings::get_wakeup_policy_priority()
-{
-       return mWakeupPolicyPriority;
-}
-
-float CWakeupSettings::get_streaming_duration_max()
-{
-       return mStreamingDurationMax;
-}
-
-void CWakeupSettings::set_streaming_duration_max(float duration)
-{
-       MWR_LOGE("Setting Streaming Duration Max Value : %f", duration);
-       mStreamingDurationMax = duration;
-}
-
-std::string CWakeupSettings::get_current_language(void)
-{
-       std::string result{"en_US"};
-
-#ifdef ENABLE_VOICE_INPUT_LANGUAGE_SETTINGS
-       char* language = vconf_get_str(WAKEUP_SETTINGS_KEY_VOICE_INPUT_LANGUAGE);
-       if (language) {
-               result = language;
-               free(language);
-       }
-#endif
-
-       return result;
-}
-
-vector<string> CWakeupSettings::get_wake_word_disabled_assistants()
-{
-       return mWakeWordDisabledAssistants;
-}
-
-} // wakeup
-} // multiassistant
index 2b8e8da6ca2f09b86b392c80b92d857dec6cd770..0f0454b536e053c80f65788357c06dd83f849fc1 100644 (file)
@@ -699,179 +699,20 @@ int CServicePlugin::initialize(void)
 {
        MAS_LOGD("[Enter]");
 
-       char filepath[512] = {'\0', };
-       const char *default_engine_path = MA_WAKEUP_MANAGER_PATH;
-       snprintf(filepath, 512, "%s/%s", default_engine_path, MA_DEFAULT_WAKEUP_MANAGER_FILENAME);
-
-       char *error;
-       mPluginHandle = nullptr;
-       mPluginHandle = dlopen(filepath, RTLD_LAZY);
-       if (nullptr != (error = dlerror())) {
-               MAS_LOGE("[ERROR] Fail to dlopen(%s), error(%s)", filepath, error);
-               if (mPluginHandle) dlclose(mPluginHandle);
-               mPluginHandle = nullptr;
-               return -1; //MAS_ERROR_OPERATION_FAILED;
-       }
-       if (nullptr == mPluginHandle) {
-               MAS_LOGE("[ERROR] Fail to dlopen(%s), error(%s)", filepath, error);
-               return -1; //MAS_ERROR_OPERATION_FAILED;
-       }
-
-       mWakeupManagerInterface.initialize =
-               (wakeup_manager_initialize)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_INITIALIZE);
-       mWakeupManagerInterface.deinitialize =
-               (wakeup_manager_deinitialize)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_DEINITIALIZE);
-       mWakeupManagerInterface.get_settings =
-               (wakeup_manager_get_settings)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_GET_SETTINGS);
-       mWakeupManagerInterface.add_assistant_wakeup_word =
-               (wakeup_manager_add_assistant_wakeup_word)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_ADD_ASSISTANT_WAKEUP_WORD);
-       mWakeupManagerInterface.remove_assistant_wakeup_word =
-               (wakeup_manager_remove_assistant_wakeup_word)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_REMOVE_ASSISTANT_WAKEUP_WORD);
-       mWakeupManagerInterface.add_assistant_language =
-               (wakeup_manager_add_assistant_language)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_ADD_ASSISTANT_LANGUAGE);
-       mWakeupManagerInterface.add_assistant_wakeup_engine =
-               (wakeup_manager_add_assistant_wakeup_engine)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_ADD_ASSISTANT_WAKEUP_ENGINE);
-       mWakeupManagerInterface.set_default_assistant =
-               (wakeup_manager_set_default_assistant)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_SET_DEFAULT_ASSISTANT);
-       mWakeupManagerInterface.get_default_assistant =
-               (wakeup_manager_get_default_assistant)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_GET_DEFAULT_ASSISTANT);
-       mWakeupManagerInterface.set_language =
-               (wakeup_manager_set_language)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_SET_LANGUAGE);
-       mWakeupManagerInterface.activate =
-               (wakeup_manager_activate)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_ACTIVATE);
-       mWakeupManagerInterface.deactivate =
-               (wakeup_manager_deactivate)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_DEACTIVATE);
-       mWakeupManagerInterface.update_voice_feedback_state =
-               (wakeup_manager_update_voice_feedback_state)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_UPDATE_VOICE_FEEDBACK_STATE);
-       mWakeupManagerInterface.set_assistant_specific_command =
-               (wakeup_manager_set_assistant_specific_command)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_SET_ASSISTANT_SPECIFIC_COMMAND);
-       mWakeupManagerInterface.set_background_volume =
-               (wakeup_manager_set_background_volume)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_SET_BACKGROUND_VOLUME);
-       mWakeupManagerInterface.update_recognition_result =
-               (wakeup_manager_update_recognition_result)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_UPDATE_RECOGNITION_RESULT);
-       mWakeupManagerInterface.process_plugin_event =
-               (wakeup_manager_process_plugin_event)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_PROCESS_PLUGIN_EVENT);
-       mWakeupManagerInterface.start_streaming_utterance_data =
-               (wakeup_manager_start_streaming_utterance_data)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_START_STREAMING_UTTERANCE_DATA);
-       mWakeupManagerInterface.stop_streaming_utterance_data =
-               (wakeup_manager_stop_streaming_utterance_data)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_STOP_STREAMING_UTTERANCE_DATA);
-       mWakeupManagerInterface.start_streaming_previous_utterance_data =
-               (wakeup_manager_start_streaming_previous_utterance_data)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_START_STREAMING_PREVIOUS_UTTERANCE_DATA);
-       mWakeupManagerInterface.stop_streaming_previous_utterance_data =
-               (wakeup_manager_stop_streaming_previous_utterance_data)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_STOP_STREAMING_PREVIOUS_UTTERANCE_DATA);
-       mWakeupManagerInterface.start_streaming_follow_up_data =
-               (wakeup_manager_start_streaming_follow_up_data)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_START_STREAMING_FOLLOW_UP_DATA);
-       mWakeupManagerInterface.stop_streaming_follow_up_data =
-               (wakeup_manager_stop_streaming_follow_up_data)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_STOP_STREAMING_FOLLOW_UP_DATA);
-       mWakeupManagerInterface.get_audio_format =
-               (wakeup_manager_get_audio_format)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_GET_AUDIO_FORMAT);
-       mWakeupManagerInterface.get_audio_source_type =
-               (wakeup_manager_get_audio_source_type)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_GET_AUDIO_SOURCE_TYPE);
-       mWakeupManagerInterface.set_wake_word_audio_require_flag =
-               (wakeup_manager_set_wake_word_audio_require_flag)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_SET_WAKE_WORD_AUDIO_REQUIRE_FLAG);
-       mWakeupManagerInterface.set_assistant_language =
-               (wakeup_manager_set_assistant_language)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_SET_ASSISTANT_LANGUAGE);
-       mWakeupManagerInterface.set_voice_key_tap_duration =
-               (wakeup_manager_set_voice_key_tap_duration)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_SET_VOICE_KEY_TAP_DURATION);
-       mWakeupManagerInterface.unset_voice_key_tap_duration =
-               (wakeup_manager_unset_voice_key_tap_duration)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_UNSET_VOICE_KEY_TAP_DURATION);
-       mWakeupManagerInterface.set_voice_key_support_mode =
-               (wakeup_manager_set_voice_key_support_mode)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_SET_VOICE_KEY_SUPPORT_MODE);
-       mWakeupManagerInterface.set_wakeup_event_callback =
-               (wakeup_manager_set_wakeup_event_callback)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_SET_WAKEUP_EVENT_CALLBACK);
-       mWakeupManagerInterface.set_utterance_streaming_callback =
-               (wakeup_manager_set_utterance_streaming_callback)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_SET_UTTERANCE_STREAMING_CALLBACK);
-       mWakeupManagerInterface.set_previous_utterance_streaming_callback =
-               (wakeup_manager_set_previous_utterance_streaming_callback)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_SET_PREVIOUS_UTTERANCE_STREAMING_CALLBACK);
-       mWakeupManagerInterface.set_follow_up_streaming_callback =
-               (wakeup_manager_set_follow_up_streaming_callback)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_SET_FOLLOW_UP_STREAMING_CALLBACK);
-       mWakeupManagerInterface.set_speech_status_callback =
-               (wakeup_manager_set_speech_status_callback)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_SET_SPEECH_STATUS_CALLBACK);
-       mWakeupManagerInterface.set_setting_changed_callback =
-               (wakeup_manager_set_setting_changed_callback)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_SET_SETTING_CHANGED_CALLBACK);
-       mWakeupManagerInterface.set_error_callback =
-               (wakeup_manager_set_error_callback)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_SET_ERROR_CALLBACK);
-       mWakeupManagerInterface.set_streaming_section_changed_callback =
-               (wakeup_manager_set_streaming_section_changed_callback)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_SET_STREAMING_SECTION_CHANGED_CALLBACK);
-       mWakeupManagerInterface.set_wakeup_engine_command_callback =
-               (wakeup_manager_set_wakeup_engine_command_callback)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_SET_WAKEUP_ENGINE_COMMAND_CALLBACK);
-       mWakeupManagerInterface.set_wakeup_service_state_changed_callback =
-               (wakeup_manager_set_wakeup_service_state_changed_callback)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_SET_WAKEUP_SERVICE_STATE_CHANGED_CALLBACK);
-       mWakeupManagerInterface.set_voice_key_status_changed_callback =
-               (wakeup_manager_set_voice_key_status_changed_callback)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_SET_VOICE_KEY_STATUS_CHANGED_CALLBACK);
-       mWakeupManagerInterface.set_loaded_engine_changed_callback =
-               (wakeup_manager_set_loaded_engine_changed_callback)dlsym(mPluginHandle,
-               MA_WAKEUP_MANAGER_FUNC_SET_LOADED_ENGINE_CHANGED_CALLBACK);
-
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_initialize func = mWakeupManagerInterface.initialize;
-
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_INITIALIZE);
-               } else {
-                       ret = func();
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to initialize, ret(%d)", ret);
-                       }
-               }
-
-               wakeup_manager_get_settings get_settings_func = mWakeupManagerInterface.get_settings;
+       ret = wakeup_manager_initialize();
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to initialize, ret(%d)", ret);
+               return ret;
+       }
 
-               if (NULL == get_settings_func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_GET_SETTINGS);
-               } else {
-                       size_t struct_size;
-                       ret = get_settings_func(&mPluginSettings, &struct_size);
-                       if (0 != ret || struct_size != sizeof(ma_plugin_settings)) {
-                               MAS_LOGE("[ERROR] Fail to get settings, ret(%d), size %zu", ret, struct_size);
-                               mPluginSettings = NULL;
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       size_t struct_size;
+       ret = wakeup_manager_get_settings(&mPluginSettings, &struct_size);
+       if (0 != ret || struct_size != sizeof(ma_plugin_settings)) {
+               MAS_LOGE("[ERROR] Fail to get settings, ret(%d), size %zu", ret, struct_size);
+               mPluginSettings = NULL;
        }
+
        return ret;
 }
 
@@ -892,21 +733,9 @@ int CServicePlugin::deinitialize(void)
        }
 
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_deinitialize func = mWakeupManagerInterface.deinitialize;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_DEINITIALIZE);
-               } else {
-                       ret = func();
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to deinitialize, ret(%d)", ret);
-                       }
-               }
-
-               dlclose(mPluginHandle);
-               mPluginHandle = NULL;
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_deinitialize();
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to deinitialize, ret(%d)", ret);
        }
 
        return ret;
@@ -915,18 +744,9 @@ int CServicePlugin::deinitialize(void)
 int CServicePlugin::get_settings(ma_plugin_settings **settings, size_t *struct_size)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_get_settings func = mWakeupManagerInterface.get_settings;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_GET_SETTINGS);
-               } else {
-                       ret = func(settings, struct_size);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to get settings, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_get_settings(settings, struct_size);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to get settings, ret(%d)", ret);
        }
        return ret;
 }
@@ -934,18 +754,9 @@ int CServicePlugin::get_settings(ma_plugin_settings **settings, size_t *struct_s
 int CServicePlugin::set_language(const char* language)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_set_language func = mWakeupManagerInterface.set_language;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_LANGUAGE);
-               } else {
-                       ret = func(language);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to set langauge(%s), ret(%d)", language, ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_set_language(language);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to set langauge(%s), ret(%d)", language, ret);
        }
        return ret;
 }
@@ -953,18 +764,9 @@ int CServicePlugin::set_language(const char* language)
 int CServicePlugin::add_assistant_wakeup_word(const char* appid, const char* wakeup_word, const char* language)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_add_assistant_wakeup_word func = mWakeupManagerInterface.add_assistant_wakeup_word;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_ADD_ASSISTANT_WAKEUP_WORD);
-               } else {
-                       ret = func(appid, wakeup_word, language);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to add wakeup word(%s)(%s)(%s), ret(%d)", appid, wakeup_word, language, ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_add_assistant_wakeup_word(appid, wakeup_word, language);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to add wakeup word(%s)(%s)(%s), ret(%d)", appid, wakeup_word, language, ret);
        }
        return ret;
 }
@@ -972,18 +774,9 @@ int CServicePlugin::add_assistant_wakeup_word(const char* appid, const char* wak
 int CServicePlugin::remove_assistant_wakeup_word(const char* appid, const char* wakeup_word, const char* language)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_remove_assistant_wakeup_word func = mWakeupManagerInterface.remove_assistant_wakeup_word;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_REMOVE_ASSISTANT_WAKEUP_WORD);
-               } else {
-                       ret = func(appid, wakeup_word, language);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to remove wakeup word(%s)(%s)(%s), ret(%d)", appid, wakeup_word, language, ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_remove_assistant_wakeup_word(appid, wakeup_word, language);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to remove wakeup word(%s)(%s)(%s), ret(%d)", appid, wakeup_word, language, ret);
        }
        return ret;
 }
@@ -991,18 +784,9 @@ int CServicePlugin::remove_assistant_wakeup_word(const char* appid, const char*
 int CServicePlugin::add_assistant_language(const char* appid, const char* language)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_add_assistant_language func = mWakeupManagerInterface.add_assistant_language;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_ADD_ASSISTANT_LANGUAGE);
-               } else {
-                       ret = func(appid, language);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to set wakeup word(%s)(%s), ret(%d)", appid, language, ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_add_assistant_language(appid, language);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to set wakeup word(%s)(%s), ret(%d)", appid, language, ret);
        }
        return ret;
 }
@@ -1010,18 +794,9 @@ int CServicePlugin::add_assistant_language(const char* appid, const char* langua
 int CServicePlugin::add_assistant_wakeup_engine(const char* appid, const char* engine)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_add_assistant_wakeup_engine func = mWakeupManagerInterface.add_assistant_wakeup_engine;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_ADD_ASSISTANT_WAKEUP_ENGINE);
-               } else {
-                       ret = func(appid, engine);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to set wakeup engine(%s)(%s), ret(%d)", appid, engine, ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_add_assistant_wakeup_engine(appid, engine);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to set wakeup engine(%s)(%s), ret(%d)", appid, engine, ret);
        }
        return ret;
 }
@@ -1029,18 +804,9 @@ int CServicePlugin::add_assistant_wakeup_engine(const char* appid, const char* e
 int CServicePlugin::set_default_assistant(const char* appid)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_set_default_assistant func = mWakeupManagerInterface.set_default_assistant;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_DEFAULT_ASSISTANT);
-               } else {
-                       ret = func(appid);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to set default assistant(%s), ret(%d)", appid, ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_set_default_assistant(appid);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to set default assistant(%s), ret(%d)", appid, ret);
        }
        return ret;
 }
@@ -1052,18 +818,9 @@ int CServicePlugin::get_default_assistant(const char** appid)
                MAS_LOGE("[ERROR] appid is not valid");
                return ret;
        }
-       if (NULL != mPluginHandle) {
-               wakeup_manager_get_default_assistant func = mWakeupManagerInterface.get_default_assistant;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_GET_DEFAULT_ASSISTANT);
-               } else {
-                       ret = func(appid);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to get default assistant, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_get_default_assistant(appid);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to get default assistant, ret(%d)", ret);
        }
        return ret;
 }
@@ -1071,18 +828,9 @@ int CServicePlugin::get_default_assistant(const char** appid)
 int CServicePlugin::activate(void)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_activate func = mWakeupManagerInterface.activate;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_ACTIVATE);
-               } else {
-                       ret = func();
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to start recording, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_activate();
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to start recording, ret(%d)", ret);
        }
        return ret;
 }
@@ -1090,18 +838,9 @@ int CServicePlugin::activate(void)
 int CServicePlugin::deactivate(void)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_deactivate func = mWakeupManagerInterface.deactivate;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_DEACTIVATE);
-               } else {
-                       ret = func();
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to stop recording, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_deactivate();
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to stop recording, ret(%d)", ret);
        }
        return ret;
 }
@@ -1109,18 +848,9 @@ int CServicePlugin::deactivate(void)
 int CServicePlugin::update_voice_feedback_state(const char* appid, int state)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_update_voice_feedback_state func = mWakeupManagerInterface.update_voice_feedback_state;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_UPDATE_VOICE_FEEDBACK_STATE);
-               } else {
-                       ret = func(appid, state);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to stop recording, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_update_voice_feedback_state(appid, state);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to stop recording, ret(%d)", ret);
        }
        return ret;
 }
@@ -1128,18 +858,9 @@ int CServicePlugin::update_voice_feedback_state(const char* appid, int state)
 int CServicePlugin::set_assistant_specific_command(const char* appid, const char* command)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_set_assistant_specific_command func = mWakeupManagerInterface.set_assistant_specific_command;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_ASSISTANT_SPECIFIC_COMMAND);
-               } else {
-                       ret = func(appid, command);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to stop recording, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_set_assistant_specific_command(appid, command);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to stop recording, ret(%d)", ret);
        }
        return ret;
 }
@@ -1147,18 +868,9 @@ int CServicePlugin::set_assistant_specific_command(const char* appid, const char
 int CServicePlugin::set_background_volume(const char* appid, double ratio)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_set_background_volume func = mWakeupManagerInterface.set_background_volume;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_BACKGROUND_VOLUME);
-               } else {
-                       ret = func(appid, ratio);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to set background volume, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_set_background_volume(appid, ratio);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to set background volume, ret(%d)", ret);
        }
        return ret;
 }
@@ -1166,18 +878,9 @@ int CServicePlugin::set_background_volume(const char* appid, double ratio)
 int CServicePlugin::update_recognition_result(const char* appid, int state)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_update_recognition_result func = mWakeupManagerInterface.update_recognition_result;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_UPDATE_RECOGNITION_RESULT);
-               } else {
-                       ret = func(appid, state);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to update result state, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_update_recognition_result(appid, state);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to update result state, ret(%d)", ret);
        }
        return ret;
 }
@@ -1185,18 +888,9 @@ int CServicePlugin::update_recognition_result(const char* appid, int state)
 int CServicePlugin::process_event(int event, void *data, int len)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_process_plugin_event func = mWakeupManagerInterface.process_plugin_event;
-               if (NULL == func) {
-                       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) {
-                               MAS_LOGE("[ERROR] Fail to stop recording, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_process_plugin_event((mas_plugin_event_e)event, data, len);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to stop recording, ret(%d)", ret);
        }
        return ret;
 }
@@ -1205,18 +899,9 @@ int CServicePlugin::start_streaming_utterance_data(void)
 {
        MAS_LOGI("[ENTER");
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_start_streaming_utterance_data func = mWakeupManagerInterface.start_streaming_utterance_data;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_START_STREAMING_UTTERANCE_DATA);
-               } else {
-                       ret = func();
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to request speech data, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_start_streaming_utterance_data();
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to request speech data, ret(%d)", ret);
        }
        return ret;
 }
@@ -1224,18 +909,9 @@ int CServicePlugin::start_streaming_utterance_data(void)
 int CServicePlugin::stop_streaming_utterance_data(void)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_stop_streaming_utterance_data func = mWakeupManagerInterface.stop_streaming_utterance_data;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_STOP_STREAMING_UTTERANCE_DATA);
-               } else {
-                       ret = func();
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to request speech data, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_stop_streaming_utterance_data();
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to request speech data, ret(%d)", ret);
        }
        return ret;
 }
@@ -1243,18 +919,9 @@ int CServicePlugin::stop_streaming_utterance_data(void)
 int CServicePlugin::start_streaming_previous_utterance_data(void)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_start_streaming_previous_utterance_data func = mWakeupManagerInterface.start_streaming_previous_utterance_data;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_START_STREAMING_PREVIOUS_UTTERANCE_DATA);
-               } else {
-                       ret = func();
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to request previous speech data, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_start_streaming_previous_utterance_data();
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to request previous speech data, ret(%d)", ret);
        }
        return ret;
 }
@@ -1262,18 +929,9 @@ int CServicePlugin::start_streaming_previous_utterance_data(void)
 int CServicePlugin::stop_streaming_previous_utterance_data(void)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_stop_streaming_previous_utterance_data func = mWakeupManagerInterface.stop_streaming_previous_utterance_data;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_STOP_STREAMING_PREVIOUS_UTTERANCE_DATA);
-               } else {
-                       ret = func();
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to request previous speech data, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_stop_streaming_previous_utterance_data();
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to request previous speech data, ret(%d)", ret);
        }
        return ret;
 }
@@ -1281,18 +939,9 @@ int CServicePlugin::stop_streaming_previous_utterance_data(void)
 int CServicePlugin::start_streaming_follow_up_data(void)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_start_streaming_follow_up_data func = mWakeupManagerInterface.start_streaming_follow_up_data;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_START_STREAMING_FOLLOW_UP_DATA);
-               } else {
-                       ret = func();
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to request speech data, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_start_streaming_follow_up_data();
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to request speech data, ret(%d)", ret);
        }
        return ret;
 }
@@ -1300,18 +949,9 @@ int CServicePlugin::start_streaming_follow_up_data(void)
 int CServicePlugin::stop_streaming_follow_up_data(void)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_stop_streaming_follow_up_data func = mWakeupManagerInterface.stop_streaming_follow_up_data;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_STOP_STREAMING_FOLLOW_UP_DATA);
-               } else {
-                       ret = func();
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to request speech data, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_stop_streaming_follow_up_data();
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to request speech data, ret(%d)", ret);
        }
        return ret;
 }
@@ -1319,18 +959,9 @@ int CServicePlugin::stop_streaming_follow_up_data(void)
 int CServicePlugin::get_recording_audio_format(int *rate, int *channel, int *audio_type)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_get_audio_format func = mWakeupManagerInterface.get_audio_format;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_GET_AUDIO_FORMAT);
-               } else {
-                       ret = func(rate, channel, audio_type);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to get recording audio format, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_get_audio_format(rate, channel, audio_type);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to get recording audio format, ret(%d)", ret);
        }
        return ret;
 }
@@ -1338,18 +969,9 @@ int CServicePlugin::get_recording_audio_format(int *rate, int *channel, int *aud
 int CServicePlugin::get_recording_audio_source_type(char** type)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_get_audio_source_type func = mWakeupManagerInterface.get_audio_source_type;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_GET_AUDIO_SOURCE_TYPE);
-               } else {
-                       ret = func(type);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to get recording audio source type, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_get_audio_source_type(type);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to get recording audio source type, ret(%d)", ret);
        }
        return ret;
 }
@@ -1357,18 +979,9 @@ int CServicePlugin::get_recording_audio_source_type(char** type)
 int CServicePlugin::set_voice_key_tap_duration(float duration)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_set_voice_key_tap_duration func = mWakeupManagerInterface.set_voice_key_tap_duration;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_VOICE_KEY_TAP_DURATION);
-               } else {
-                       ret = func(duration);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to set voice key tap duration, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_set_voice_key_tap_duration(duration);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to set voice key tap duration, ret(%d)", ret);
        }
        return ret;
 }
@@ -1376,18 +989,9 @@ int CServicePlugin::set_voice_key_tap_duration(float duration)
 int CServicePlugin::unset_voice_key_tap_duration()
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_unset_voice_key_tap_duration func = mWakeupManagerInterface.unset_voice_key_tap_duration;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_UNSET_VOICE_KEY_TAP_DURATION);
-               } else {
-                       ret = func();
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to unset voice key tap duration, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_unset_voice_key_tap_duration();
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to unset voice key tap duration, ret(%d)", ret);
        }
        return ret;
 }
@@ -1395,18 +999,9 @@ int CServicePlugin::unset_voice_key_tap_duration()
 int CServicePlugin::set_voice_key_support_mode(int mode)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_set_voice_key_support_mode func = mWakeupManagerInterface.set_voice_key_support_mode;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_VOICE_KEY_SUPPORT_MODE);
-               } else {
-                       ret = func(mode);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to set voice key support mode, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_set_voice_key_support_mode(mode);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to set voice key support mode, ret(%d)", ret);
        }
        return ret;
 }
@@ -1414,18 +1009,9 @@ int CServicePlugin::set_voice_key_support_mode(int mode)
 int CServicePlugin::set_wake_word_audio_require_flag(const char* appid, bool require)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_set_wake_word_audio_require_flag func = mWakeupManagerInterface.set_wake_word_audio_require_flag;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_WAKE_WORD_AUDIO_REQUIRE_FLAG);
-               } else {
-                       ret = func(require);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to set wake word audio require flag, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_set_wake_word_audio_require_flag(require);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to set wake word audio require flag, ret(%d)", ret);
        }
        return ret;
 }
@@ -1433,18 +1019,9 @@ int CServicePlugin::set_wake_word_audio_require_flag(const char* appid, bool req
 int CServicePlugin::set_assistant_language(const char* appid, const char* language)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_set_assistant_language func = mWakeupManagerInterface.set_assistant_language;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_ASSISTANT_LANGUAGE);
-               } else {
-                       ret = func(appid, language);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to set assistant language, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_set_assistant_language(appid, language);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to set assistant language, ret(%d)", ret);
        }
        return ret;
 }
@@ -1529,18 +1106,9 @@ int CServicePlugin::set_callbacks(void)
 int CServicePlugin::set_wakeup_event_callback(wakeup_service_wakeup_event_cb callback, void* user_data)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_set_wakeup_event_callback func = mWakeupManagerInterface.set_wakeup_event_callback;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_WAKEUP_EVENT_CALLBACK);
-               } else {
-                       ret = func(callback, user_data);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to set wakeup event callback, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_set_wakeup_event_callback(callback, user_data);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to set wakeup event callback, ret(%d)", ret);
        }
        return ret;
 }
@@ -1548,18 +1116,9 @@ int CServicePlugin::set_wakeup_event_callback(wakeup_service_wakeup_event_cb cal
 int CServicePlugin::set_utterance_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_set_utterance_streaming_callback func = mWakeupManagerInterface.set_utterance_streaming_callback;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_UTTERANCE_STREAMING_CALLBACK);
-               } else {
-                       ret = func(callback, user_data);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to set utterance streaming callback, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_set_utterance_streaming_callback(callback, user_data);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to set utterance streaming callback, ret(%d)", ret);
        }
        return ret;
 }
@@ -1567,18 +1126,9 @@ int CServicePlugin::set_utterance_streaming_callback(wakeup_service_speech_strea
 int CServicePlugin::set_previous_utterance_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_set_previous_utterance_streaming_callback func = mWakeupManagerInterface.set_previous_utterance_streaming_callback;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_PREVIOUS_UTTERANCE_STREAMING_CALLBACK);
-               } else {
-                       ret = func(callback, user_data);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to set utterance streaming callback, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_set_previous_utterance_streaming_callback(callback, user_data);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to set utterance streaming callback, ret(%d)", ret);
        }
        return ret;
 }
@@ -1586,18 +1136,9 @@ int CServicePlugin::set_previous_utterance_streaming_callback(wakeup_service_spe
 int CServicePlugin::set_follow_up_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_set_follow_up_streaming_callback func = mWakeupManagerInterface.set_follow_up_streaming_callback;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_FOLLOW_UP_STREAMING_CALLBACK);
-               } else {
-                       ret = func(callback, user_data);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to set follow-up streaming callback, ret(%d)", ret);
-                       }
-               }
-       } else {
-               MAS_LOGE("[ERROR] mPluginHandle is not valid");
+       ret = wakeup_manager_set_follow_up_streaming_callback(callback, user_data);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to set follow-up streaming callback, ret(%d)", ret);
        }
        return ret;
 }
@@ -1605,16 +1146,9 @@ int CServicePlugin::set_follow_up_streaming_callback(wakeup_service_speech_strea
 int CServicePlugin::set_speech_status_callback(wakeup_service_speech_status_cb callback, void* user_data)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_set_speech_status_callback func = mWakeupManagerInterface.set_speech_status_callback;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_SPEECH_STATUS_CALLBACK);
-               } else {
-                       ret = func(callback, user_data);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to set speech status callback, ret(%d)", ret);
-                       }
-               }
+       ret = wakeup_manager_set_speech_status_callback(callback, user_data);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to set speech status callback, ret(%d)", ret);
        }
        return ret;
 }
@@ -1622,16 +1156,9 @@ int CServicePlugin::set_speech_status_callback(wakeup_service_speech_status_cb c
 int CServicePlugin::set_setting_changed_callback(wakeup_service_setting_changed_cb callback, void* user_data)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_set_setting_changed_callback func = mWakeupManagerInterface.set_setting_changed_callback;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_SETTING_CHANGED_CALLBACK);
-               } else {
-                       ret = func(callback, user_data);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to set setting_changed callback, ret(%d)", ret);
-                       }
-               }
+       ret = wakeup_manager_set_setting_changed_callback(callback, user_data);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to set setting_changed callback, ret(%d)", ret);
        }
        return ret;
 }
@@ -1639,16 +1166,9 @@ int CServicePlugin::set_setting_changed_callback(wakeup_service_setting_changed_
 int CServicePlugin::set_error_callback(wakeup_service_error_cb callback, void* user_data)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_set_error_callback func = mWakeupManagerInterface.set_error_callback;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_ERROR_CALLBACK);
-               } else {
-                       ret = func(callback, user_data);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to set error callback, ret(%d)", ret);
-                       }
-               }
+       ret = wakeup_manager_set_error_callback(callback, user_data);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to set error callback, ret(%d)", ret);
        }
        return ret;
 }
@@ -1656,16 +1176,9 @@ int CServicePlugin::set_error_callback(wakeup_service_error_cb callback, void* u
 int CServicePlugin::set_streaming_section_changed_callback(wakeup_service_streaming_section_changed_cb callback, void* user_data)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_set_streaming_section_changed_callback func = mWakeupManagerInterface.set_streaming_section_changed_callback;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_STREAMING_SECTION_CHANGED_CALLBACK);
-               } else {
-                       ret = func(callback, user_data);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to set streaming section changed callback, ret(%d)", ret);
-                       }
-               }
+       ret = wakeup_manager_set_streaming_section_changed_callback(callback, user_data);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to set streaming section changed callback, ret(%d)", ret);
        }
        return ret;
 }
@@ -1673,16 +1186,9 @@ int CServicePlugin::set_streaming_section_changed_callback(wakeup_service_stream
 int CServicePlugin::set_wakeup_engine_command_callback(wakeup_service_wakeup_engine_command_cb callback, void* user_data)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_set_wakeup_engine_command_callback func = mWakeupManagerInterface.set_wakeup_engine_command_callback;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_WAKEUP_ENGINE_COMMAND_CALLBACK);
-               } else {
-                       ret = func(callback, user_data);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to set error callback, ret(%d)", ret);
-                       }
-               }
+       ret = wakeup_manager_set_wakeup_engine_command_callback(callback, user_data);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to set error callback, ret(%d)", ret);
        }
        return ret;
 }
@@ -1690,16 +1196,9 @@ int CServicePlugin::set_wakeup_engine_command_callback(wakeup_service_wakeup_eng
 int CServicePlugin::set_wakeup_service_state_changed_callback(wakeup_service_wakeup_service_state_changed_cb callback, void* user_data)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_set_wakeup_service_state_changed_callback func = mWakeupManagerInterface.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);
-                       }
-               }
+       ret = wakeup_manager_set_wakeup_service_state_changed_callback(callback, user_data);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to set error callback, ret(%d)", ret);
        }
        return ret;
 }
@@ -1707,16 +1206,9 @@ int CServicePlugin::set_wakeup_service_state_changed_callback(wakeup_service_wak
 int CServicePlugin::set_voice_key_status_changed_callback(wakeup_service_voice_key_status_changed_cb callback, void* user_data)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_set_voice_key_status_changed_callback func = mWakeupManagerInterface.set_voice_key_status_changed_callback;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_VOICE_KEY_STATUS_CHANGED_CALLBACK);
-               } else {
-                       ret = func(callback, user_data);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to set error callback, ret(%d)", ret);
-                       }
-               }
+       ret = wakeup_manager_set_voice_key_status_changed_callback(callback, user_data);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to set error callback, ret(%d)", ret);
        }
        return ret;
 }
@@ -1724,16 +1216,9 @@ int CServicePlugin::set_voice_key_status_changed_callback(wakeup_service_voice_k
 int CServicePlugin::set_loaded_engine_changed_callback(wakeup_service_loaded_engine_changed_cb callback, void* user_data)
 {
        int ret = -1;
-       if (NULL != mPluginHandle) {
-               wakeup_manager_set_loaded_engine_changed_callback func = mWakeupManagerInterface.set_loaded_engine_changed_callback;
-               if (NULL == func) {
-                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MA_WAKEUP_MANAGER_FUNC_SET_LOADED_ENGINE_CHANGED_CALLBACK);
-               } else {
-                       ret = func(callback, user_data);
-                       if (0 != ret) {
-                               MAS_LOGE("[ERROR] Fail to set error callback, ret(%d)", ret);
-                       }
-               }
+       ret = wakeup_manager_set_loaded_engine_changed_callback(callback, user_data);
+       if (0 != ret) {
+               MAS_LOGE("[ERROR] Fail to set error callback, ret(%d)", ret);
        }
        return ret;
 }
diff --git a/wakeup-manager/CMakeLists.txt b/wakeup-manager/CMakeLists.txt
new file mode 100644 (file)
index 0000000..170bc35
--- /dev/null
@@ -0,0 +1,70 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
+PROJECT(ma-wakeup-manager)
+
+SET(PREFIX ${CMAKE_INSTALL_PREFIX})
+SET(PACKAGE ${PROJECT_NAME})
+
+SET(CMAKE_SKIP_BUILD_RPATH TRUE)
+
+INCLUDE_DIRECTORIES(
+       ${CMAKE_SOURCE_DIR}/inc
+       ./inc
+       )
+
+SET(WMPKG_CHECK_MODULES
+       ecore
+       dlog
+       capi-appfw-preference
+       capi-media-audio-io
+       capi-media-sound-manager
+       eina
+       vconf
+       pkgmgr-info
+       multi-assistant
+       jsoncpp
+)
+
+INCLUDE(FindPkgConfig)
+pkg_check_modules(wmpkgs REQUIRED ${WMPKG_CHECK_MODULES})
+MESSAGE("Modules : ${WMPKG_CHECK_MODULES}")
+
+IF("${CMAKE_BUILD_TYPE}" STREQUAL "")
+        SET(CMAKE_BUILD_TYPE "Release")
+ENDIF("${CMAKE_BUILD_TYPE}" STREQUAL "")
+MESSAGE("Build type: ${CMAKE_BUILD_TYPE}")
+
+ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"")
+ADD_DEFINITIONS("-DPACKAGE=\"${PACKAGE}\"")
+
+SET(SRCS
+       src/wakeup_manager.cpp
+       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
+       src/dependency_resolver.cpp
+       src/heap_tracer.cpp
+       src/assistant_config_manager.cpp
+)
+
+FOREACH(flag ${wmpkgs_CFLAGS})
+       SET(EXTRA_CXXFLAGS "${EXTRA_CXXFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+
+
+SET(EXTRA_CXXFLAGS  "${EXTRA_CXXFLAGS} -fPIC -Wall" )
+SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CXXFLAGS} -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wl,-z,relro -fPIC -std=c++11 -fvisibility=hidden")
+SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
+
+ADD_LIBRARY(${PROJECT_NAME} SHARED ${SRCS} )
+
+# Install libraries
+TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${wmpkgs_LDFLAGS} -ldl ${EXTRA_LDFLAGS})
+MESSAGE("LDFLAG : ${wmpkgs_LDFLAGS}")
+INSTALL(FILES ${CMAKE_SOURCE_DIR}/plugins/wakeup-manager/libma-wakeup-manager.so DESTINATION ${TZ_SYS_RO_SHARE}/multiassistant/)
+
+ADD_SUBDIRECTORY(dependency-default)
diff --git a/wakeup-manager/inc/assistant_config_manager.h b/wakeup-manager/inc/assistant_config_manager.h
new file mode 100644 (file)
index 0000000..0dd7dda
--- /dev/null
@@ -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 <string>
+#include <functional>
+
+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/wakeup-manager/inc/dependency_resolver.h b/wakeup-manager/inc/dependency_resolver.h
new file mode 100644 (file)
index 0000000..0f4dbf6
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * 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 _DEPENDENCY_RESOLVER_H_
+#define _DEPENDENCY_RESOLVER_H_
+
+#include <tzplatform_config.h>
+#include <multi_assistant_service.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**************************************************************************************
+ *** Definitions for dependencies
+ *************************************************************************************/
+#define MAS_DEPENDENCY_DEFAULT_PATH tzplatform_mkpath(tzplatform_getid("TZ_SYS_RO_SHARE"), "multiassistant/")
+#define MAS_DEPENDENCY_DEFAULT_FILENAME "libma-dependency-default.so"
+#define MAS_DEPENDENCY_MODULE_PATH "db/multi-assistant/dependency_module_path"
+
+#define MAS_DEPENDENCY_FUNC_INITIALIZE "mas_dependency_initialize"
+typedef int (*mas_dependency_initialize)(mas_dependency_plugin_proxy_interface interface, int *dependency_version);
+#define MAS_DEPENDENCY_FUNC_DEINITIALIZE "mas_dependency_deinitialize"
+typedef int (*mas_dependency_deinitialize)(void);
+#define MAS_DEPENDENCY_FUNC_SET_ERROR_CALLBACK "mas_dependency_set_error_callback"
+typedef int (*mas_dependency_set_error_callback)(mas_error_cb callback, void* user_data);
+#define MAS_DEPENDENCY_FUNC_START_RECORDING "mas_dependency_start_recording"
+typedef int (*mas_dependency_start_recording)(void);
+#define MAS_DEPENDENCY_FUNC_STOP_RECORDING "mas_dependency_stop_recording"
+typedef int (*mas_dependency_stop_recording)(void);
+#define MAS_DEPENDENCY_FUNC_SET_RECORDING_SESSION "mas_dependency_set_recording_session"
+typedef int (*mas_dependency_set_recording_session)(unsigned int);
+#define MAS_DEPENDENCY_FUNC_SET_BACKGROUND_VOLUME "mas_dependency_set_background_volume"
+typedef int (*mas_dependency_set_background_volume)(double ratio);
+#define MAS_DEPENDENCY_FUNC_GET_AUDIO_FORMAT "mas_dependency_get_audio_format"
+typedef int (*mas_dependency_get_audio_format)(int* rate, int* channel, int* audio_type);
+#define MAS_DEPENDENCY_FUNC_GET_AUDIO_SOURCE_TYPE "mas_dependency_get_audio_source_type"
+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);
+#define MAS_DEPENDENCY_FUNC_SET_VOICE_KEY_TAP_DURATION "mas_dependency_set_voice_key_tap_duration"
+typedef int (*mas_dependency_set_voice_key_tap_duration)(float duration);
+#define MAS_DEPENDENCY_FUNC_UNSET_VOICE_KEY_TAP_DURATION "mas_dependency_unset_voice_key_tap_duration"
+typedef int (*mas_dependency_unset_voice_key_tap_duration)(void);
+#define MAS_DEPENDENCY_FUNC_SET_VOICE_KEY_SUPPORT_MODE "mas_dependency_set_voice_key_support_mode"
+typedef int (*mas_dependency_set_voice_key_support_mode)(const char* support_mode);
+#define MAS_DEPENDENCY_FUNC_GET_CUSTOM_VCONF_KEY "mas_dependency_get_custom_vconf_key"
+typedef int (*mas_dependency_get_custom_vconf_key)(const char* default_key, char** custom_key);
+
+
+typedef struct {
+       mas_dependency_initialize                                                               initialize;
+       mas_dependency_deinitialize                                                             deinitialize;
+       mas_dependency_set_error_callback                                               set_error_callback;
+       mas_dependency_start_recording                                                  start_recording;
+       mas_dependency_stop_recording                                                   stop_recording;
+       mas_dependency_set_recording_session                                    set_recording_session;
+       mas_dependency_set_background_volume                                    set_background_volume;
+       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_set_voice_key_tap_duration                               set_voice_key_tap_duration;
+       mas_dependency_unset_voice_key_tap_duration                             unset_voice_key_tap_duration;
+       mas_dependency_set_voice_key_support_mode                               set_voice_key_support_mode;
+       mas_dependency_get_custom_vconf_key                     get_custom_vconf_key;
+} 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);
+int dependency_resolver_set_voice_key_tap_duration(float duration);
+int dependency_resolver_unset_voice_key_tap_duration();
+int dependency_resolver_set_voice_key_support_mode(const char* support_mode);
+int dependency_resolver_get_custom_vconf_key(const char* default_key, char** custom_key);
+
+mas_dependency_module_interface* dependency_resolver_get_interface();
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _DEPENDENCY_RESOLVER_H_ */
diff --git a/wakeup-manager/inc/heap_tracer.h b/wakeup-manager/inc/heap_tracer.h
new file mode 100644 (file)
index 0000000..626bac1
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * 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 __HEAP_TRACER_H__
+#define __HEAP_TRACER_H__
+
+#include <list>
+#include <mutex>
+#include <unordered_map>
+#include <string>
+#include <set>
+
+#ifndef __MODULE__
+#define __MODULE__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
+#endif
+
+#define vm_calloc_simple(nmemb, size) vm_calloc(nmemb, size, "%s: %s(%d)", __MODULE__, __func__, __LINE__)
+#define vm_malloc_simple(size) vm_malloc(size, "%s: %s(%d)", __MODULE__, __func__, __LINE__)
+#define vm_free_simple(ptr) vm_free(ptr, "%s: %s(%d)", __MODULE__, __func__, __LINE__)
+#define vm_strdup_simple(ptr) vm_strdup(ptr, "%s: %s(%d)", __MODULE__, __func__, __LINE__)
+#define vm_mark_unmanaged_simple(ptr) vm_mark_unmanaged(ptr, "%s: %s(%d)", __MODULE__, __func__, __LINE__)
+
+void *vm_calloc(size_t nmemb, size_t size, const char *fmt, ...);
+void *vm_malloc(size_t size, const char *fmt, ...);
+void vm_free(void *ptr, const char *fmt, ...);
+char *vm_strdup(const char *s, const char *fmt, ...);
+void *vm_mark_unmanaged(void *ptr, const char *fmt, ...);
+
+class HeapTracer {
+public:
+       HeapTracer();
+       virtual ~HeapTracer();
+
+       bool Insert(void *ptr, std::string description, size_t size = 0);
+       bool Delete(void *ptr, std::string description);
+       std::string Find(void *ptr);
+
+       void MarkUnmanaged(void *ptr, std::string description);
+
+       bool Empty();
+       void Trace();
+protected:
+       typedef struct {
+               void *ptr{nullptr};
+               std::string description;
+               int size{0};
+       } AllocationEntry;
+
+       std::mutex mManagedTableMutex;
+       std::unordered_map<void*, AllocationEntry> mManagedTable;
+
+       std::mutex mUnmanagedRecordsMutex;
+       std::list<AllocationEntry> mUnmanagedRecords;
+       size_t mUnmanagedRecordsSize{0};
+
+       enum class EntryOperation {
+               INSERT,
+               DELETE,
+       };
+       typedef struct {
+               AllocationEntry entry;
+               EntryOperation operation;
+               struct timespec ts;
+       } EntryHistory;
+       std::list<EntryHistory> mEntryHistory;
+};
+
+#endif /* __HEAP_TRACER_H__ */
\ No newline at end of file
diff --git a/wakeup-manager/inc/wakeup_audio_manager.h b/wakeup-manager/inc/wakeup_audio_manager.h
new file mode 100644 (file)
index 0000000..7165ce3
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ * 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 _WAKEUP_AUDIO_MANAGER_H_
+#define _WAKEUP_AUDIO_MANAGER_H_
+
+#include "service_common.h"
+
+#include <atomic>
+#include <list>
+#include <mutex>
+#include <thread>
+#include <vector>
+
+#include <multi_assistant_service.h>
+
+namespace multiassistant
+{
+namespace wakeup
+{
+
+using namespace std;
+
+class IAudioEventObserver
+{
+public:
+       virtual ~IAudioEventObserver() = default;
+       virtual bool on_recording_audio_data(long time, void* data, int len) = 0;
+       virtual bool on_streaming_audio_data(
+               mas_speech_streaming_event_e event, void* buffer, unsigned int len) = 0;
+};
+
+typedef enum
+{
+       RECORDING_SESSION_WAKE_WORD,
+       RECORDING_SESSION_UTTERANCE,
+       RECORDING_SESSION_FOLLOW_UP,
+} recording_session;
+
+class CAudioManager
+{
+public:
+       CAudioManager();
+       CAudioManager(IAudioEventObserver *observer);
+       ~CAudioManager();
+
+       CAudioManager(const CAudioManager&) = delete;
+       CAudioManager& operator=(const CAudioManager&) = delete;
+
+       int initialize();
+       int deinitialize();
+
+       void sound_focus_changed();
+
+       /* NOTE : The observer that is being passed to this subscribe() function
+        * must not be deleted before the call to CAudioManager::deinitialize(),
+        * since the observer's callback can be called even after unsubscribe() */
+       void subscribe(IAudioEventObserver *observer);
+       void unsubscribe(IAudioEventObserver *observer);
+
+       void start_recording(bool proactive);
+       void stop_recording(bool proactive);
+
+       void set_recording_session(recording_session session);
+
+       void feed_audio_data(mas_speech_streaming_event_e event, void* buffer, int len);
+       void finalize_audio_data();
+       void clear_audio_data();
+
+       void start_streaming_current_utterance_data(long long start_time = 0);
+       void stop_streaming_current_utterance_data();
+
+       void start_streaming_previous_utterance_data();
+       void stop_streaming_previous_utterance_data();
+
+       void start_streaming_follow_up_data();
+       void stop_streaming_follow_up_data();
+
+       void set_background_volume(double ratio);
+conditional_public:
+       void add_audio_data(mas_speech_data& data, long long time);
+       void notify_audio_data_recording(long time, void* data, int len);
+
+       void streaming_previous_audio_data_thread_func();
+       void streaming_audio_data_thread_func(long long start_time);
+
+private:
+       int mSoundFocusWatchId{0};
+       bool mRecordingRequired{false};
+       bool mIsRecording{false};
+
+       vector<IAudioEventObserver*> mObservers;
+
+       thread mStreamingThread;
+       atomic_bool mStopStreamingThread{false};
+       atomic_bool mStreamingThreadActive{false};
+
+       thread mStreamingPreviousThread;
+       atomic_bool mStopStreamingPreviousThread{false};
+
+       static constexpr long long mAudioRecordingDurationMilliseconds = 10 * 1000;
+       typedef struct {
+               long long time;
+               mas_speech_data data;
+       } mas_speech_data_with_time;
+       vector<mas_speech_data_with_time> mPreviousAudioData;
+       list<mas_speech_data_with_time> mAudioData;
+
+       mutex mMutex;
+       bool mVoiceKeyPressed{false};
+
+       thread mBackgroundVolumeThread;
+};
+
+} // wakeup
+} // multiassistant
+
+#endif /* _WAKEUP_AUDIO_MANAGER_H_ */
diff --git a/wakeup-manager/inc/wakeup_engine_manager.h b/wakeup-manager/inc/wakeup_engine_manager.h
new file mode 100644 (file)
index 0000000..4f659ed
--- /dev/null
@@ -0,0 +1,229 @@
+/*
+ * 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 _WAKEUP_ENGINE_MANAGER_H_
+#define _WAKEUP_ENGINE_MANAGER_H_
+
+#include "wakeup_manager_wrapper.h"
+
+#include <atomic>
+#include <string>
+#include <thread>
+#include <vector>
+#include <set>
+
+namespace multiassistant
+{
+namespace wakeup
+{
+
+using namespace std;
+
+/**************************************************************************************
+ *** Definitions for wakeup engine interface
+ *************************************************************************************/
+#define MA_WAKEUP_ENGINE_PATH                                  tzplatform_mkpath(tzplatform_getid("TZ_SYS_RO_SHARE"), "multiassistant/engines")
+/* Need to check whether this dedicated engine path also needs to be configurable */
+#define MA_WAKEUP_DEDICATED_ENGINE_PATH                        "shared/lib/libwakeup-engine.so"
+
+/* Interfaces without version information */
+#define MA_WAKEUP_ENGINE_FUNC_INITIALIZE "wakeup_engine_initialize"
+typedef int (*wakeup_engine_initialize)(void);
+#define MA_WAKEUP_ENGINE_FUNC_DEINITIALIZE "wakeup_engine_deinitialize"
+typedef int (*wakeup_engine_deinitialize)(void);
+#define MA_WAKEUP_ENGINE_FUNC_ACTIVATE "wakeup_engine_activate"
+typedef int (*wakeup_engine_activate)(void);
+#define MA_WAKEUP_ENGINE_FUNC_DEACTIVATE "wakeup_engine_deactivate"
+typedef int (*wakeup_engine_deactivate)(void);
+#define MA_WAKEUP_ENGINE_FUNC_ADD_WAKEUP_WORD "wakeup_engine_add_wakeup_word"
+typedef int (*wakeup_engine_add_wakeup_word)(const char* appid, const char* wakeup_word, const char* language);
+#define MA_WAKEUP_ENGINE_FUNC_REMOVE_WAKEUP_WORD "wakeup_engine_remove_wakeup_word"
+typedef int (*wakeup_engine_remove_wakeup_word)(const char* appid, const char* wakeup_word, const char* language);
+#define MA_WAKEUP_ENGINE_FUNC_ADD_LANGUAGE "wakeup_engine_add_language"
+typedef int (*wakeup_engine_add_language)(const char* appid, const char* language);
+#define MA_WAKEUP_ENGINE_FUNC_SET_LANGUAGE "wakeup_engine_set_language"
+typedef int (*wakeup_engine_set_language)(const char* language);
+#define MA_WAKEUP_ENGINE_FUNC_UPDATE_MANAGER_STATE "wakeup_engine_update_manager_state"
+typedef int (*wakeup_engine_update_manager_state)(wakeup_manager_state_e state);
+#define MA_WAKEUP_ENGINE_FUNC_UPDATE_RECOGNITION_RESULT "wakeup_engine_update_recognition_result"
+typedef int (*wakeup_engine_update_recognition_result)(const char* appid, int result);
+#define MA_WAKEUP_ENGINE_FUNC_SET_AUDIO_FORMAT "wakeup_engine_set_audio_format"
+typedef int (*wakeup_engine_set_audio_format)(int rate, int channel, int audio_type);
+#define MA_WAKEUP_ENGINE_FUNC_GET_AUDIO_FORMAT "wakeup_engine_get_audio_format"
+typedef int (*wakeup_engine_get_audio_format)(int* rate, int* channel, int* audio_type);
+#define MA_WAKEUP_ENGINE_FUNC_FEED_AUDIO_DATA "wakeup_engine_feed_audio_data"
+typedef int (*wakeup_engine_feed_audio_data)(long time, void* data, int len);
+#define MA_WAKEUP_ENGINE_FUNC_GET_UTTERANCE_DATA_COUNT "wakeup_engine_get_utterance_data_count"
+typedef int (*wakeup_engine_get_utterance_data_count)(void);
+#define MA_WAKEUP_ENGINE_FUNC_GET_UTTERANCE_DATA "wakeup_engine_get_utterance_data"
+typedef int (*wakeup_engine_get_utterance_data)(int index, mas_speech_data *data);
+#define MA_WAKEUP_ENGINE_FUNC_GET_WAKE_WORD_DATA_COUNT "wakeup_engine_get_wake_word_data_count"
+typedef int (*wakeup_engine_get_wake_word_data_count)(void);
+#define MA_WAKEUP_ENGINE_FUNC_GET_WAKE_WORD_DATA "wakeup_engine_get_wake_word_data"
+typedef int (*wakeup_engine_get_wake_word_data)(int index, mas_speech_data *data);
+#define MA_WAKEUP_ENGINE_FUNC_SET_ASSISTANT_SPECIFIC_COMMAND "wakeup_engine_set_assistant_specific_command"
+typedef int (*wakeup_engine_set_assistant_specific_command)(const char* appid, const char* command);
+#define MA_WAKEUP_ENGINE_FUNC_SET_WAKE_WORD_AUDIO_REQUIRE_FLAG "wakeup_engine_set_wake_word_audio_require_flag"
+typedef int (*wakeup_engine_set_wake_word_audio_require_flag)(bool require);
+#define MA_WAKEUP_ENGINE_FUNC_SET_WAKEUP_EVENT_CALLBACK "wakeup_engine_set_wakeup_event_callback"
+typedef int (*wakeup_engine_set_wakeup_event_callback)(wakeup_service_wakeup_event_cb callback, void* user_data);
+#define MA_WAKEUP_ENGINE_FUNC_SET_SPEECH_STATUS_CALLBACK "wakeup_engine_set_speech_status_callback"
+typedef int (*wakeup_engine_set_speech_status_callback)(wakeup_service_speech_status_cb callback, void* user_data);
+#define MA_WAKEUP_ENGINE_FUNC_SET_ERROR_CALLBACK "wakeup_engine_set_error_callback"
+typedef int (*wakeup_engine_set_error_callback)(wakeup_service_error_cb callback, void* user_data);
+#define MA_WAKEUP_ENGINE_FUNC_SET_AUDIO_DATA_REQUIRE_STATUS_CALLBACK "wakeup_engine_set_audio_data_require_status_callback"
+typedef int (*wakeup_engine_set_audio_data_require_status_callback)(wakeup_service_audio_data_require_status_cb callback, void* user_data);
+#define MA_WAKEUP_ENGINE_FUNC_SET_WAKEUP_ENGINE_COMMAND_CALLBACK "wakeup_engine_set_wakeup_engine_command_callback"
+typedef int (*wakeup_engine_set_wakeup_engine_command_callback)(wakeup_service_engine_command_cb callback, void* user_data);
+
+/* Interfaces after version 1 */
+#define MA_WAKEUP_ENGINE_FUNC_GET_VERSION "wakeup_engine_get_version"
+typedef int (*wakeup_engine_get_version)(int* version);
+#define MA_WAKEUP_ENGINE_FUNC_SET_DEPENDENCY_MODULE_COMMAND "wakeup_engine_set_dependency_module_command"
+typedef int (*wakeup_engine_set_dependency_module_command)(const char* command);
+
+typedef struct {
+       wakeup_engine_initialize                                                                initialize;
+       wakeup_engine_deinitialize                                                              deinitialize;
+       wakeup_engine_activate                                                                  activate;
+       wakeup_engine_deactivate                                                                deactivate;
+       wakeup_engine_add_wakeup_word                                                   add_wakeup_word;
+       wakeup_engine_remove_wakeup_word                                                remove_wakeup_word;
+       wakeup_engine_add_language                                                              add_language;
+       wakeup_engine_set_language                                                              set_language;
+       wakeup_engine_update_manager_state                                              update_manager_state;
+       wakeup_engine_update_recognition_result                                 update_recognition_result;
+       wakeup_engine_set_audio_format                                                  set_audio_format;
+       wakeup_engine_get_audio_format                                                  get_audio_format;
+       wakeup_engine_feed_audio_data                                                   feed_audio_data;
+       wakeup_engine_get_utterance_data_count                                  get_utterance_data_count;
+       wakeup_engine_get_utterance_data                                                get_utterance_data;
+       wakeup_engine_get_wake_word_data_count                                  get_wake_word_data_count;
+       wakeup_engine_get_wake_word_data                                                get_wake_word_data;
+       wakeup_engine_get_version                                                               get_version;
+       wakeup_engine_set_assistant_specific_command                    set_assistant_specific_command;
+       wakeup_engine_set_wake_word_audio_require_flag                  set_wake_word_audio_require_flag;
+       wakeup_engine_set_dependency_module_command                             set_dependency_module_command;
+       wakeup_engine_set_wakeup_event_callback                                 set_wakeup_event_callback;
+       wakeup_engine_set_speech_status_callback                                set_speech_status_callback;
+       wakeup_engine_set_error_callback                                                set_error_callback;
+       wakeup_engine_set_audio_data_require_status_callback    set_audio_data_require_status_callback;
+       wakeup_engine_set_wakeup_engine_command_callback                set_wakeup_engine_command_callback;
+} wakeup_engine_interface;
+
+class IEngineEventObserver
+{
+public:
+       virtual ~IEngineEventObserver() = default;
+       virtual bool on_wakeup_event(string engine_name, mas_wakeup_event_info wakeup_info) = 0;
+       virtual bool on_speech_status(string engine_name, mas_speech_status_e status) = 0;
+       virtual bool on_error(string engine_name, int error_code, string error_message) = 0;
+       virtual bool on_audio_data_require_status(string engine_name, bool require) = 0;
+
+       virtual bool on_streaming_audio_data(
+               mas_speech_streaming_event_e event, void* buffer, unsigned int len) = 0;
+       virtual bool on_audio_streaming_data_section(ma_audio_streaming_data_section_e section) = 0;
+       virtual bool on_wakeup_engine_command(
+               mas_wakeup_engine_command_target_e target, string engine_name, string assistant_name, string command) = 0;
+};
+
+class CWakeupEngineManager
+{
+public:
+       CWakeupEngineManager();
+       CWakeupEngineManager(IEngineEventObserver *observer);
+       virtual ~CWakeupEngineManager();
+
+       CWakeupEngineManager(const CWakeupEngineManager&) = delete;
+       CWakeupEngineManager& operator=(const CWakeupEngineManager&) = delete;
+
+       void initialize();
+       void deinitialize();
+
+       void subscribe(IEngineEventObserver *observer);
+       void unsubscribe(IEngineEventObserver *observer);
+
+       bool get_audio_data_required();
+       void set_selected_wakeup_info(mas_wakeup_event_info wakeup_info);
+
+       bool set_language(string language);
+       bool set_assistant_language(string appid, string language);
+       void set_assistant_activated(string appid, bool activated);
+       bool get_assistant_activated(string appid);
+       void set_wake_word_audio_require_flag(bool require);
+
+       void start_streaming_current_utterance_data();
+       void stop_streaming_current_utterance_data();
+
+       void update_manager_state(wakeup_manager_state_e state);
+       void update_recognition_result(string appid, int result);
+
+       void engine_add_target_assistant(string engine_name, string appid);
+       void engine_add_wakeup_word(string appid, string wakeup_word, string language);
+       void engine_remove_wakeup_word(string appid, string wakeup_word, string language);
+       void engine_set_assistant_specific_command(string appid, string command);
+       void engine_set_dependency_module_command(string engine_name, string command);
+       void engine_feed_audio_data(long time, void* data, int len);
+
+       bool on_wakeup_event(string engine_name, mas_wakeup_event_info wakeup_info);
+       bool on_speech_status(string engine_name, mas_speech_status_e status);
+       bool on_error(string engine_name, int error_code, string error_message);
+       bool on_audio_data_require_status(string engine_name, bool require);
+       bool on_wakeup_engine_command(string engine_name,
+               mas_wakeup_engine_command_target_e target, string assistant_name, string command);
+private:
+       typedef struct {
+               int version;
+               string engine_name;
+               bool activated{false};
+               bool audio_data_require_status{false};
+               string engine_path;
+               wakeup_engine_interface interface{nullptr, };
+               vector<string> assistant_list;
+               set<string> activated_assistants;
+               void *engine_handle{nullptr};
+       } EngineInfo;
+
+       void add_engine_directory(string name, string path);
+       void add_engine(string name, string path);
+
+       vector<IEngineEventObserver*> mObservers;
+
+       void streaming_speech_data_thread_func();
+
+       vector<EngineInfo> mEngineInfo;
+       const EngineInfo* mSelectedEngine{nullptr};
+       bool mAudioDataRequired{false};
+
+       thread mStreamingThread;
+       atomic_bool mStopStreamingThread{false};
+       wakeup_manager_state_e mWakeupManagerState{WAKEUP_MANAGER_STATE_INACTIVE};
+
+       bool mWakeWordAudioRequired{false};
+
+       typedef struct {
+               atomic_llong last_audio_fetched{0};
+               atomic_llong last_count_fetched{0};
+               atomic_llong last_audio_sent{0};
+       } StreamingHistory;
+
+       StreamingHistory mStreamingHistory;
+};
+
+} // wakeup
+} // multiassistant
+
+#endif /* _WAKEUP_ENGINE_MANAGER_H_ */
diff --git a/wakeup-manager/inc/wakeup_manager.h b/wakeup-manager/inc/wakeup_manager.h
new file mode 100644 (file)
index 0000000..994dab3
--- /dev/null
@@ -0,0 +1,278 @@
+/*
+ * 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 _WAKEUP_MANAGER_H_
+#define _WAKEUP_MANAGER_H_
+
+#include "service_config.h"
+#include "wakeup_manager_wrapper.h"
+#include "wakeup_settings.h"
+#include "wakeup_engine_manager.h"
+#include "wakeup_audio_manager.h"
+#include "wakeup_policy_default.h"
+#include "assistant_config_manager.h"
+
+#include <memory>
+#include <map>
+#include <mutex>
+
+namespace multiassistant
+{
+namespace wakeup
+{
+
+using namespace std;
+
+#define WAKEUP_VCONF_KEY_DEFAULT_ASSISTANT_APPID "db/multi-assistant/default_assistant_appid"
+#define WAKEUP_VCONF_KEY_ENABLED_ASSISTANTS "db/multi-assistant/enabled_assistants"
+#define WAKEUP_VCONF_KEY_WAKE_WORD_DETECTION_ENABLED "db/multi-assistant/wake_word_detection_enabled"
+
+enum class STREAMING_MODE {
+       NONE,
+       UTTERANCE,
+       PREVIOUS_UTTERANCE,
+       FOLLOW_UP,
+};
+
+class IWakeupEventObserver {
+public:
+       virtual ~IWakeupEventObserver() = default;
+       virtual void on_wakeup(mas_wakeup_event_info wakeup_info) = 0;
+       virtual void on_streaming_audio_data(
+               mas_speech_streaming_event_e event, void* buffer, unsigned int len) = 0;
+       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;
+       virtual void on_voice_key_status_changed(ma_voice_key_status_e status) = 0;
+};
+
+class ISettingValueObserver {
+public:
+       virtual ~ISettingValueObserver() = default;
+       virtual void on_value_changed() = 0;
+       virtual void on_loaded_wakeup_engine_changed() = 0;
+};
+
+/* If a wakeup event is raised by pressing a voice key,
+       the wakeup_engine attribute of wakeup_event_info will have the following value */
+#define WAKEUP_ENGINE_VOICE_KEY "voice_key"
+
+class CWakeupManager
+{
+public:
+       CWakeupManager(IWakeupEventObserver* wakeup_observer, ISettingValueObserver* setting_observer);
+       virtual ~CWakeupManager();
+
+       CWakeupManager(const CWakeupManager&) = delete;
+       CWakeupManager& operator=(const CWakeupManager&) = delete;
+
+       bool initialize();
+       bool deinitialize();
+
+       void subscribe_wakeup_observer(IWakeupEventObserver* observer);
+       void unsubscribe_wakeup_observer(IWakeupEventObserver* observer);
+
+       void subscribe_setting_observer(ISettingValueObserver* observer);
+       void unsubscribe_setting_observer(ISettingValueObserver* observer);
+
+       bool activate();
+       bool deactivate();
+
+       bool add_assistant_language(string appid, string language);
+       bool add_assistant_wakeup_word(string appid, string wakeup_word, string language);
+       bool remove_assistant_wakeup_word(string appid, string wakeup_word, string language);
+       bool add_assistant_wakeup_engine(string appid, string engine);
+       bool set_assistant_language(string appid, string language);
+
+       bool set_assistant_enabled(string appid, bool enabled);
+       bool get_assistant_enabled(string appid);
+       bool set_default_assistant(string appid);
+       bool process_default_assistant_changed(string appid, bool expected);
+       string get_default_assistant();
+
+       bool update_voice_feedback_state(string appid, bool state);
+       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);
+       bool get_audio_format(int* rate, int* channel, int* audio_type);
+       bool get_audio_source_type(char** type);
+       bool set_language(string language);
+       bool get_recording_by_voice_key();
+       void set_recording_by_voice_key(bool recording);
+       bool set_voice_key_tap_duration(float duration);
+       bool unset_voice_key_tap_duration();
+       bool set_voice_key_support_mode(VOICE_KEY_SUPPORT_MODE mode);
+       bool set_wake_word_audio_require_flag(bool require);
+
+       STREAMING_MODE get_streaming_mode();
+       bool set_streaming_mode(STREAMING_MODE mode);
+
+       bool start_streaming_utterance_data();
+       bool stop_streaming_utterance_data();
+       bool start_streaming_follow_up_data();
+       bool stop_streaming_follow_up_data();
+       bool start_streaming_previous_utterance_data();
+       bool stop_streaming_previous_utterance_data();
+
+       CWakeupPolicy* get_wakeup_policy();
+       CWakeupEngineManager* get_engine_manager();
+       CAudioManager* get_audio_manager();
+       CWakeupSettings* get_wakeup_settings();
+
+       vector<IWakeupEventObserver*> get_wakeup_observers();
+       void set_last_wakeup_event_info(mas_wakeup_event_info wakeup_info);
+
+       vector<ISettingValueObserver*> get_setting_observers();
+
+       bool change_manager_state(wakeup_manager_state_e state);
+       wakeup_manager_state_e get_manager_state();
+
+       void feed_audio_data(mas_speech_streaming_event_e event, void* buffer, int len);
+       void set_dependency_module_command(string engine_name, string command);
+
+       void start_streaming_duration_timer();
+       void stop_streaming_duration_timer();
+
+       void set_streaming_duration_timer(Ecore_Timer* timer);
+       Ecore_Timer* get_streaming_duration_timer();
+
+       void start_periodic_monitor_timer();
+       void stop_periodic_monitor_timer();
+
+       void update_voice_key_status(ma_voice_key_status_e status);
+       void update_pending_voice_key_status();
+
+       void start_voice_key_status_update_timer();
+       void set_streaming_completed(bool completed);
+private:
+       class CEngineEventObserver : public IEngineEventObserver
+       {
+       public:
+               bool on_wakeup_event(string engine_name, mas_wakeup_event_info wakeup_info) override;
+               bool on_speech_status(string engine_name, mas_speech_status_e status) override;
+               bool on_error(string engine_name, int error_code, string error_message) override;
+               bool on_audio_data_require_status(string engine_name, bool require) override;
+
+               bool on_streaming_audio_data(
+                       mas_speech_streaming_event_e event, void* buffer, unsigned int len) override;
+               bool on_audio_streaming_data_section(ma_audio_streaming_data_section_e section) override;
+               bool on_wakeup_engine_command(
+                       mas_wakeup_engine_command_target_e target, string engine, string name, string command) override;
+
+               void set_wakeup_manager(CWakeupManager *manager) { mWakeupManager = manager; }
+       private:
+               CWakeupManager *mWakeupManager{nullptr};
+       };
+
+       class CPolicyEventObserver : public IPolicyEventObserver
+       {
+       public:
+               void on_wakeup(mas_wakeup_event_info wakeup_info) override;
+
+               void set_wakeup_manager(CWakeupManager *manager) { mWakeupManager = manager; }
+       private:
+               CWakeupManager *mWakeupManager{nullptr};
+       };
+
+       class CAudioEventObserver : public IAudioEventObserver
+       {
+       public:
+               bool on_recording_audio_data(long time, void* data, int len) override;
+               bool on_streaming_audio_data(
+                       mas_speech_streaming_event_e event, void* buffer, unsigned int len) override;
+
+               void set_wakeup_manager(CWakeupManager *manager) { mWakeupManager = manager; }
+               void set_wakeup_engine_manager(CWakeupEngineManager *manager) { mEngineManager = manager; }
+       private:
+               CWakeupManager *mWakeupManager{nullptr};
+               CWakeupEngineManager *mEngineManager{nullptr};
+       };
+
+       class CSettingsEventObserver : public ISettingsEventObserver
+       {
+       public:
+               bool on_voice_input_language_changed(const char* language) override;
+               bool on_assistant_enabled_info_changed(const char* appid, bool enabled) override;
+               bool on_default_assistant_appid_changed(const char* appid) override;
+               bool on_multiple_mode_changed() override;
+               bool on_wake_word_detection_enabled_info_changed() override;
+
+               void set_wakeup_manager(CWakeupManager *manager) { mWakeupManager = manager; }
+       private:
+               CWakeupManager *mWakeupManager{nullptr};
+       };
+
+       void initialize_wakeup_policy();
+
+       typedef struct {
+               string appid;
+               vector<string> languageList;
+       } AssistantLanguageInfo;
+       vector<AssistantLanguageInfo> mAssistantLanguageInfo;
+       map<string, bool> mAssistantSupportsCurrentLanguage;
+       map<string, bool> mAssistantEnabled;
+
+       vector<IWakeupEventObserver*> mWakeupObservers;
+       vector<ISettingValueObserver*> mSettingObservers;
+
+       unique_ptr<CWakeupPolicy> mWakeupPolicy;
+
+       CAudioManager mAudioManager;
+       CWakeupEngineManager mWakeupEngineManager;
+       CWakeupSettings mWakeupSettings;
+       CAssistantConfigManager mAssistantConfigManager;
+
+       CAudioEventObserver mAudioEventObserver;
+       CEngineEventObserver mEngineEventObserver;
+       CPolicyEventObserver mPolicyEventObserver;
+       CSettingsEventObserver mSettingsEventObserver;
+
+       thread mEngineDataThread;
+       atomic_bool mStopEngineDataThread{false};
+
+       bool mRecordingByVoiceKey{false};
+
+       string mCurrentLanguage;
+       string mCurrentDefaultAssistant;
+       /* Assume Push-to-talk is the default mode */
+       VOICE_KEY_SUPPORT_MODE mCurrentVoiceKeySupportMode{VOICE_KEY_SUPPORT_MODE_PUSH_TO_TALK};
+
+       STREAMING_MODE mStreamingMode{STREAMING_MODE::NONE};
+       Ecore_Timer* mStreamingDurationTimer{nullptr};
+       Ecore_Timer* mPeriodicMonitorTimer{nullptr};
+
+       wakeup_manager_state_e mWakeupManagerState{WAKEUP_MANAGER_STATE_INACTIVE};
+
+       mas_wakeup_event_info mLastWakeupEventInfo;
+
+       unsigned int mLastWakeupEventID{0};
+       unsigned int mCurrentStreamingSessionID{0};
+
+       boost::optional<ma_voice_key_status_e> mPendingVoiceKeyStatus;
+       atomic_bool mStreamingCompleted{false};
+       Ecore_Timer *mVoiceKeyStatusUpdateTimer{nullptr};
+       mutex mVoiceKeyStatusUpdateMutex;
+
+       mutex mMutex;
+};
+
+} // wakeup
+} // multiassistant
+
+#endif /* _WAKEUP_MANAGER_H_ */
diff --git a/wakeup-manager/inc/wakeup_manager_main.h b/wakeup-manager/inc/wakeup_manager_main.h
new file mode 100644 (file)
index 0000000..d0b8b30
--- /dev/null
@@ -0,0 +1,37 @@
+#ifndef __MUTLI_WAKEUP_MAIN_H__
+#define __MUTLI_WAKEUP_MAIN_H__
+
+#include <dlog.h>
+#include <glib.h>
+
+#ifdef  LOG_TAG
+#undef  LOG_TAG
+#endif
+#define LOG_TAG "multi-assistant"
+
+#ifdef __MODULE__
+#undef  __MODULE__
+#endif
+#define __MODULE__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)
+
+#define MWR_SECURE_LOG_(id, prio, tag, fmt, arg...) \
+        ({ do { \
+                __dlog_print(id, prio, tag, "%s: %s(%d) > [SECURE_LOG] " fmt, __MODULE__, __func__, __LINE__, ##arg); \
+        } while (0); })
+
+#define MWR_LOG_(prio, tag, fmt, arg...) \
+        ({ do { \
+                dlog_print(prio, tag, "%s: %s(%d) > " fmt, __MODULE__, __func__, __LINE__, ##arg); \
+        } while (0); })
+
+#define MWR_LOGD(fmt, args...) MWR_LOG_(DLOG_DEBUG, LOG_TAG, fmt, ##args)
+#define MWR_LOGI(fmt, args...) MWR_LOG_(DLOG_INFO, LOG_TAG, fmt, ##args)
+#define MWR_LOGW(fmt, args...) MWR_LOG_(DLOG_WARN, LOG_TAG, fmt, ##args)
+#define MWR_LOGE(fmt, args...) MWR_LOG_(DLOG_ERROR, LOG_TAG, fmt, ##args)
+
+#define MWR_SLOGD(fmt, args...) MWR_SECURE_LOG_(DLOG_DEBUG, LOG_TAG, fmt, ##args)
+#define MWR_SLOGI(fmt, args...) MWR_SECURE_LOG_(DLOG_INFO, LOG_TAG, fmt, ##args)
+#define MWR_SLOGW(fmt, args...) MWR_SECURE_LOG_(DLOG_WARN, LOG_TAG, fmt, ##args)
+#define MWR_SLOGE(fmt, args...) MWR_SECURE_LOG_(DLOG_ERROR, LOG_TAG, fmt, ##args)
+
+#endif /* __MUTLI_WAKEUP_MAIN_H__ */
diff --git a/wakeup-manager/inc/wakeup_manager_wrapper.h b/wakeup-manager/inc/wakeup_manager_wrapper.h
new file mode 100644 (file)
index 0000000..7692580
--- /dev/null
@@ -0,0 +1,166 @@
+/*
+ * 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 _WAKEUP_MANAGER_WRAPPER_H_
+#define _WAKEUP_MANAGER_WRAPPER_H_
+
+#include <dlog.h>
+#include <stdbool.h>
+#include <tizen.h>
+#include <tzplatform_config.h>
+
+#include <multi_assistant_service.h>
+#include <multi_assistant_internal.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+       WAKEUP_MANAGER_STATE_INACTIVE = 0,
+       WAKEUP_MANAGER_STATE_LISTENING = 1,
+       WAKEUP_MANAGER_STATE_UTTERANCE = 2,
+       WAKEUP_MANAGER_STATE_PROCESSING = 3,
+       WAKEUP_MANAGER_STATE_VOICE_FEEDBACK = 4
+} wakeup_manager_state_e;
+
+typedef void (*ma_audio_streaming_data_section_changed_cb)(ma_audio_streaming_data_section_e section, void* user_data);
+
+typedef void (*wakeup_service_wakeup_event_cb)(mas_wakeup_event_info wakeup_info, void* user_data);
+
+typedef void (*wakeup_service_speech_streaming_cb)(mas_speech_streaming_event_e event, void* buffer, int len, void *user_data);
+
+typedef void (*wakeup_service_speech_status_cb)(mas_speech_status_e status, void *user_data);
+
+typedef void (*wakeup_service_setting_changed_cb)( void *user_data);
+
+typedef void (*wakeup_service_error_cb)(int error, const char* err_msg, void* user_data);
+
+typedef void (*wakeup_service_audio_data_require_status_cb)(bool require, void* user_data);
+
+typedef void (*wakeup_service_streaming_section_changed_cb)(ma_audio_streaming_data_section_e section, void* user_data);
+
+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 void (*wakeup_service_voice_key_status_changed_cb)(ma_voice_key_status_e state, void* user_data);
+
+typedef void (*wakeup_service_loaded_engine_changed_cb)(void* user_data);
+
+typedef struct {
+       int plugin_version;
+       bool ui_panel_enabled;
+} ma_plugin_settings;
+
+int wakeup_manager_initialize(void);
+
+int wakeup_manager_deinitialize(void);
+
+int wakeup_manager_get_settings(ma_plugin_settings **settings, size_t *struct_size);
+
+int wakeup_manager_add_assistant_wakeup_word(const char* appid, const char* wakeup_word, const char* language);
+
+int wakeup_manager_remove_assistant_wakeup_word(const char* appid, const char* wakeup_word, const char* language);
+
+int wakeup_manager_add_assistant_language(const char* appid, const char* language);
+
+int wakeup_manager_add_assistant_wakeup_engine(const char* appid, const char *engine);
+
+int wakeup_manager_set_default_assistant(const char* appid);
+
+int wakeup_manager_get_default_assistant(const char** appid);
+
+int wakeup_manager_set_language(const char* language);
+
+int wakeup_manager_activate(void);
+
+int wakeup_manager_deactivate(void);
+
+int wakeup_manager_update_voice_feedback_state(const char *appid, int state);
+
+int wakeup_manager_set_assistant_specific_command(const char* appid, const char* command);
+
+int wakeup_manager_set_background_volume(const char *appid, double ratio);
+
+int wakeup_manager_update_recognition_result(const char *appid, int result);
+
+int wakeup_manager_process_plugin_event(mas_plugin_event_e event, void* data, int len);
+
+int wakeup_manager_start_streaming_utterance_data(void);
+
+int wakeup_manager_stop_streaming_utterance_data(void);
+
+int wakeup_manager_start_streaming_previous_utterance_data(void);
+
+int wakeup_manager_stop_streaming_previous_utterance_data(void);
+
+int wakeup_manager_start_streaming_follow_up_data(void);
+
+int wakeup_manager_stop_streaming_follow_up_data(void);
+
+int wakeup_manager_get_audio_format(int *rate, int *channel, int *audio_type);
+
+int wakeup_manager_get_audio_source_type(char** type);
+
+int wakeup_manager_set_voice_key_tap_duration(float duration);
+
+int wakeup_manager_unset_voice_key_tap_duration();
+
+int wakeup_manager_set_voice_key_support_mode(int mode);
+
+int wakeup_manager_set_wake_word_audio_require_flag(bool require);
+
+int wakeup_manager_set_assistant_language(const char* appid, const char *language);
+
+int wakeup_manager_set_wakeup_event_callback(wakeup_service_wakeup_event_cb callback, void* user_data);
+
+int wakeup_manager_set_utterance_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data);
+
+int wakeup_manager_set_previous_utterance_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data);
+
+int wakeup_manager_set_follow_up_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data);
+
+int wakeup_manager_set_speech_status_callback(wakeup_service_speech_status_cb callback, void* user_data);
+
+int wakeup_manager_set_setting_changed_callback(wakeup_service_setting_changed_cb callback, void* user_data);
+
+int wakeup_manager_set_error_callback(wakeup_service_error_cb callback, void* user_data);
+
+int wakeup_manager_set_streaming_section_changed_callback(wakeup_service_streaming_section_changed_cb callback, void* user_data);
+
+int wakeup_manager_set_wakeup_engine_command_callback(wakeup_service_engine_command_cb callback, void* user_data);
+
+int wakeup_manager_set_wakeup_service_state_changed_callback(wakeup_service_state_changed_cb callback, void* user_data);
+
+int wakeup_manager_set_voice_key_status_changed_callback(wakeup_service_voice_key_status_changed_cb callback, void* user_data);
+
+int wakeup_manager_set_loaded_engine_changed_callback(wakeup_service_loaded_engine_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);
+
+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);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _WAKEUP_MANAGER_WRAPPER_H_ */
diff --git a/wakeup-manager/inc/wakeup_policy.h b/wakeup-manager/inc/wakeup_policy.h
new file mode 100644 (file)
index 0000000..238a27b
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * 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 _WAKEUP_POLICY_H_
+#define _WAKEUP_POLICY_H_
+
+#include <string>
+#include <memory>
+
+#include <multi_assistant_service.h>
+
+namespace multiassistant
+{
+namespace wakeup
+{
+
+using namespace std;
+
+class IPolicyEventObserver
+{
+public:
+       virtual ~IPolicyEventObserver() = default;
+       virtual void on_wakeup(mas_wakeup_event_info wakeup_info) = 0;
+};
+
+class CWakeupPolicyImpl;
+
+class CWakeupPolicy
+{
+public:
+       CWakeupPolicy();
+       CWakeupPolicy(IPolicyEventObserver *observer);
+       virtual ~CWakeupPolicy();
+
+       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<CWakeupPolicyImpl> mImpl;
+};
+
+} // wakeup
+} // multiassistant
+
+#endif /* _WAKEUP_POLICY_H_ */
diff --git a/wakeup-manager/inc/wakeup_policy_default.h b/wakeup-manager/inc/wakeup_policy_default.h
new file mode 100644 (file)
index 0000000..5293273
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * 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 _WAKEUP_POLICY_DEFAULT_H_
+#define _WAKEUP_POLICY_DEFAULT_H_
+
+#include "wakeup_policy.h"
+
+#include <vector>
+#include <string>
+
+#include <Ecore.h>
+
+namespace multiassistant
+{
+namespace wakeup
+{
+
+typedef struct {
+       std::string wakeup_appid;
+       std::string wakeup_word;
+       std::string wakeup_language;
+       std::string wakeup_voice_id;
+       std::string wakeup_engine;
+
+       std::vector<unsigned char> extra_data;
+       std::string extra_data_description;
+       mas_wakeup_event_info info;
+} mas_wakeup_event_info_wrapper;
+
+
+using namespace std;
+
+class CWakeupPolicyDefault : public CWakeupPolicy
+{
+public:
+       CWakeupPolicyDefault(IPolicyEventObserver *observer);
+       ~CWakeupPolicyDefault();
+
+       bool valid() override;
+
+       void set_assistant_priority(string appid, int priority);
+
+       void wakeup_candidate(mas_wakeup_event_info wakeup_info) override;
+       void select_candidate(mas_wakeup_event_info wakeup_info) override;
+
+       void timer_expired();
+
+       void set_delay(float seconds);
+       float get_delay();
+
+       void set_timer(Ecore_Timer* timer);
+       Ecore_Timer* get_timer();
+
+private:
+       typedef struct {
+               string appid;
+               int priority{0};
+       } PRIORITY_INFO;
+
+       float mDelaySeconds{0.0f};
+       vector<PRIORITY_INFO> mPriorityInfos;
+       vector<mas_wakeup_event_info_wrapper> mWakeupInfos;
+
+       Ecore_Timer *mTimer{nullptr};
+};
+
+} // wakeup
+} // multiassistant
+
+#endif /* _WAKEUP_POLICY_H_ */
diff --git a/wakeup-manager/inc/wakeup_policy_external.h b/wakeup-manager/inc/wakeup_policy_external.h
new file mode 100644 (file)
index 0000000..366f272
--- /dev/null
@@ -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/wakeup-manager/inc/wakeup_policy_impl.h b/wakeup-manager/inc/wakeup_policy_impl.h
new file mode 100644 (file)
index 0000000..a1da86b
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * 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 _WAKEUP_POLICY_IMPL_H_
+#define _WAKEUP_POLICY_IMPL_H_
+
+#include "wakeup_policy.h"
+#include <string>
+#include <vector>
+
+namespace multiassistant
+{
+namespace wakeup
+{
+
+class CWakeupPolicyImpl
+{
+public:
+       CWakeupPolicyImpl() {}
+       ~CWakeupPolicyImpl() {}
+
+       void subscribe(IPolicyEventObserver *observer);
+       void unsubscribe(IPolicyEventObserver *observer);
+
+       void wakeup(mas_wakeup_event_info wakeup_info);
+private:
+       vector<IPolicyEventObserver*> mObservers;
+};
+
+} // wakeup
+} // multiassistant
+
+#endif /* _WAKEUP_POLICY_IMPL_H_ */
diff --git a/wakeup-manager/inc/wakeup_settings.h b/wakeup-manager/inc/wakeup_settings.h
new file mode 100644 (file)
index 0000000..ca6a324
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * 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 _WAKEUP_SETTINGS_H_
+#define _WAKEUP_SETTINGS_H_
+
+#include <string>
+#include <vector>
+#include <vconf.h>
+#include <map>
+
+//#define ENABLE_VOICE_INPUT_LANGUAGE_SETTINGS
+
+typedef void (*input_language_changed_cb)(void* data);
+
+namespace multiassistant
+{
+namespace wakeup
+{
+
+using namespace std;
+
+#define WAKEUP_SETTINGS_KEY_DEFAULT_ASSISTANT_APPID "db/multi-assistant/default_assistant_appid"
+#define WAKEUP_SETTINGS_KEY_UI_PANEL_ENABLED "db/multi-assistant/ui_panel_enabled"
+#define WAKEUP_SETTINGS_KEY_CONVERSATION_TIMEOUT "db/multi-assistant/conversation_timeout"
+#define WAKEUP_SETTINGS_KEY_MULTIPLE_MODE "db/multi-assistant/multiple_mode"
+#define WAKEUP_SETTINGS_KEY_ENABLED_ASSISTANTS "db/multi-assistant/enabled_assistants"
+#define WAKEUP_SETTINGS_KEY_WAKEUP_POLICY_DELAY "db/multi-assistant/wakeup_policy_delay"
+#define WAKEUP_SETTINGS_KEY_WAKEUP_POLICY_PRIORITY "db/multi-assistant/wakeup_policy_priority"
+#define WAKEUP_SETTINGS_KEY_STREAMING_DURATION_MAX "db/multi-assistant/streaming_duration_max"
+#define WAKEUP_SETTINGS_KEY_VOICE_INPUT_LANGUAGE "db/multi-assistant/voice_input_language"
+#define WAKEUP_SETTINGS_KEY_WAKE_WORD_DETECTION_ENABLED "db/multi-assistant/wake_word_detection_enabled"
+
+class ISettingsEventObserver
+{
+public:
+       virtual ~ISettingsEventObserver() = default;
+       virtual bool on_voice_input_language_changed(const char* language) = 0;
+       virtual bool on_assistant_enabled_info_changed(const char* appid, bool enabled) = 0;
+       virtual bool on_default_assistant_appid_changed(const char* appid) = 0;
+       virtual bool on_multiple_mode_changed() = 0;
+       virtual bool on_wake_word_detection_enabled_info_changed() = 0;
+};
+
+class CWakeupSettings
+{
+public:
+       CWakeupSettings();
+       virtual ~CWakeupSettings();
+
+       CWakeupSettings(const CWakeupSettings&) = delete;
+       CWakeupSettings& operator=(const CWakeupSettings&) = delete;
+
+       void initialize(map<string, string> custom_keys);
+       void deinitialize();
+
+       void subscribe(ISettingsEventObserver *observer);
+       void unsubscribe(ISettingsEventObserver *observer);
+       const vector<ISettingsEventObserver*>& get_observers();
+
+       string get_default_assistant_appid();
+       void set_default_assistant_appid(std::string appid);
+
+       bool get_ui_panel_enabled();
+       float get_conversation_timeout();
+       bool get_multiple_mode();
+       vector<string> get_enabled_assistants();
+       float get_wakeup_policy_delay();
+       vector<string> get_wakeup_policy_priority();
+       float get_streaming_duration_max();
+       void set_streaming_duration_max(float duration);
+       string get_current_language(void);
+       vector<string> get_wake_word_disabled_assistants();
+private:
+       vector<ISettingsEventObserver*> mObservers;
+
+       string mDefaultAssistantAppid;
+       bool mUiPanelEnabled{true};
+       float mConversationTimeout{5.0};
+       bool mMultipleMode{false};
+       vector<string> mEnabledAssistants;
+       float mWakeupPolicyDelay{0.0};
+       vector<string> mWakeupPolicyPriority; // No priority by default
+       float mStreamingDurationMax{15.0};
+       string mVoiceInputLanguage;
+       map<string, string> mCustomVconfKeys;
+       vector<string> mWakeWordDisabledAssistants;
+};
+
+} // wakeup
+} // multiassistant
+
+#endif /* _WAKEUP_SETTINGS_H_ */
diff --git a/wakeup-manager/src/assistant_config_manager.cpp b/wakeup-manager/src/assistant_config_manager.cpp
new file mode 100644 (file)
index 0000000..8bce9ed
--- /dev/null
@@ -0,0 +1,91 @@
+#include "wakeup_manager_main.h"
+#include "assistant_config_manager.h"
+
+#include <string.h>
+
+#include <app_preference.h>
+
+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());
+       MWR_LOGE("Set assistant language : %s %s", 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;
+       MWR_LOGE("Got assistant language : %s %s", key.c_str(), language.c_str());
+       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 *data) {
+                       string prefix = string{LANGUAGE_PREFIX};
+                       foreach_assistant_language_cb_closure* closure =
+                               static_cast<foreach_assistant_language_cb_closure*>(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<void*>(&closure)
+       );
+}
+
+} // wakeup
+} // multiassistant
diff --git a/wakeup-manager/src/dependency_resolver.cpp b/wakeup-manager/src/dependency_resolver.cpp
new file mode 100644 (file)
index 0000000..abacd59
--- /dev/null
@@ -0,0 +1,491 @@
+/*
+ * 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.
+ */
+
+#include <tizen.h>
+#include <dlfcn.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <vconf.h>
+
+#include <stdexcept>
+
+#include "service_common.h"
+#include "dependency_resolver.h"
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+#define LOG_TAG "dependency-resolver"
+
+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]");
+
+       const int FILEPATH_LEN = 512;
+       char filepath[FILEPATH_LEN] = {'\0', };
+       char *vconf_str = vconf_get_str(MAS_DEPENDENCY_MODULE_PATH);
+       if (vconf_str) {
+               snprintf(filepath, FILEPATH_LEN - 1, "%s", vconf_str);
+               free(vconf_str);
+       } else {
+               const char *default_path = MAS_DEPENDENCY_DEFAULT_PATH;
+               snprintf(filepath, FILEPATH_LEN - 1, "%s/%s", default_path, MAS_DEPENDENCY_DEFAULT_FILENAME);
+       }
+       filepath[FILEPATH_LEN - 1] = '\0';
+
+       char *error;
+       g_handle = NULL;
+       g_handle = dlopen(filepath, RTLD_LAZY);
+       if (NULL != (error = dlerror())) {
+               MAS_LOGE("[ERROR] Fail to dlopen(%s), error(%s)", filepath, error);
+               return -1; //MAS_ERROR_OPERATION_FAILED;
+       }
+
+       g_mas_dependency.initialize =
+               (mas_dependency_initialize)dlsym(g_handle,
+               MAS_DEPENDENCY_FUNC_INITIALIZE);
+       g_mas_dependency.deinitialize =
+               (mas_dependency_deinitialize)dlsym(g_handle,
+               MAS_DEPENDENCY_FUNC_DEINITIALIZE);
+       g_mas_dependency.set_error_callback =
+               (mas_dependency_set_error_callback)dlsym(g_handle,
+               MAS_DEPENDENCY_FUNC_SET_ERROR_CALLBACK);
+       g_mas_dependency.start_recording =
+               (mas_dependency_start_recording)dlsym(g_handle,
+               MAS_DEPENDENCY_FUNC_START_RECORDING);
+       g_mas_dependency.stop_recording =
+               (mas_dependency_stop_recording)dlsym(g_handle,
+               MAS_DEPENDENCY_FUNC_STOP_RECORDING);
+       g_mas_dependency.set_recording_session =
+               (mas_dependency_set_recording_session)dlsym(g_handle,
+               MAS_DEPENDENCY_FUNC_SET_RECORDING_SESSION);
+       g_mas_dependency.set_background_volume =
+               (mas_dependency_set_background_volume)dlsym(g_handle,
+               MAS_DEPENDENCY_FUNC_SET_BACKGROUND_VOLUME);
+       g_mas_dependency.get_audio_format =
+               (mas_dependency_get_audio_format)dlsym(g_handle,
+               MAS_DEPENDENCY_FUNC_GET_AUDIO_FORMAT);
+       g_mas_dependency.get_audio_source_type =
+               (mas_dependency_get_audio_source_type)dlsym(g_handle,
+               MAS_DEPENDENCY_FUNC_GET_AUDIO_SOURCE_TYPE);
+       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);
+       g_mas_dependency.set_voice_key_tap_duration =
+               (mas_dependency_set_voice_key_tap_duration)dlsym(g_handle,
+               MAS_DEPENDENCY_FUNC_SET_VOICE_KEY_TAP_DURATION);
+       g_mas_dependency.unset_voice_key_tap_duration =
+               (mas_dependency_unset_voice_key_tap_duration)dlsym(g_handle,
+               MAS_DEPENDENCY_FUNC_UNSET_VOICE_KEY_TAP_DURATION);
+       g_mas_dependency.set_voice_key_support_mode =
+               (mas_dependency_set_voice_key_support_mode)dlsym(g_handle,
+               MAS_DEPENDENCY_FUNC_SET_VOICE_KEY_SUPPORT_MODE);
+       g_mas_dependency.get_custom_vconf_key =
+               (mas_dependency_get_custom_vconf_key)dlsym(g_handle,
+               MAS_DEPENDENCY_FUNC_GET_CUSTOM_VCONF_KEY);
+
+       int ret = -1;
+       int dependency_version = 0;
+       if (NULL != g_handle) {
+               mas_dependency_initialize func = g_mas_dependency.initialize;
+
+               if (NULL == func) {
+                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_INITIALIZE);
+               } else {
+                       try {
+                               ret = func(interface, &dependency_version);
+                       } catch (const std::exception& e) {
+                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
+                                       MAS_DEPENDENCY_FUNC_INITIALIZE, e.what());
+                       }
+                       if (0 != ret) {
+                               MAS_LOGE("[ERROR] Fail to initialize, ret(%d)", ret);
+                       }
+               }
+       } else {
+               MAS_LOGE("[ERROR] g_handle is not valid");
+       }
+       MAS_LOGD("g_handle : %p, dependency_version %d", g_handle, dependency_version);
+       return ret;
+}
+
+int dependency_resolver_deinitialize(void)
+{
+       MAS_LOGD("g_handle : %p", g_handle);
+       int ret = -1;
+       if (NULL != g_handle) {
+               mas_dependency_deinitialize func = g_mas_dependency.deinitialize;
+               if (NULL == func) {
+                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_DEINITIALIZE);
+               } else {
+                       try {
+                               ret = func();
+                       } catch (const std::exception& e) {
+                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
+                                       MAS_DEPENDENCY_FUNC_DEINITIALIZE, e.what());
+                       }
+                       if (0 != ret) {
+                               MAS_LOGE("[ERROR] Fail to deinitialize, ret(%d)", ret);
+                       }
+               }
+
+               dlclose(g_handle);
+               g_handle = NULL;
+       } else {
+               MAS_LOGE("[ERROR] g_handle is not valid");
+       }
+
+       return ret;
+}
+
+int dependency_resolver_set_error_callback(mas_error_cb callback, void* user_data)
+{
+       int ret = -1;
+       if (NULL != g_handle) {
+               mas_dependency_set_error_callback func = g_mas_dependency.set_error_callback;
+               if (NULL == func) {
+                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_SET_ERROR_CALLBACK);
+               } else {
+                       try {
+                               ret = func(callback, user_data);
+                       } catch (const std::exception& e) {
+                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
+                                       MAS_DEPENDENCY_FUNC_SET_ERROR_CALLBACK, e.what());
+                       }
+                       if (0 != ret) {
+                               MAS_LOGE("[ERROR] Fail to set error callback(%p, %p), ret(%d)", callback, user_data, ret);
+                       }
+               }
+       } else {
+               MAS_LOGE("[ERROR] g_handle is not valid");
+       }
+       return ret;
+}
+
+int dependency_resolver_start_recording(void)
+{
+       int ret = -1;
+       MAS_LOGD("g_handle : %p", g_handle);
+       if (NULL != g_handle) {
+               mas_dependency_start_recording func = g_mas_dependency.start_recording;
+               if (NULL == func) {
+                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_START_RECORDING);
+               } else {
+                       try {
+                               ret = func();
+                       } catch (const std::exception& e) {
+                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
+                                       MAS_DEPENDENCY_FUNC_START_RECORDING, e.what());
+                       }
+                       if (0 != ret) {
+                               MAS_LOGE("[ERROR] Fail to start recording, ret(%d)", ret);
+                       }
+               }
+       } else {
+               MAS_LOGE("[ERROR] g_handle is not valid");
+       }
+
+       return ret;
+}
+
+int dependency_resolver_stop_recording(void)
+{
+       int ret = -1;
+       if (NULL != g_handle) {
+               mas_dependency_stop_recording func = g_mas_dependency.stop_recording;
+               if (NULL == func) {
+                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_STOP_RECORDING);
+               } else {
+                       try {
+                               ret = func();
+                       } catch (const std::exception& e) {
+                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
+                                       MAS_DEPENDENCY_FUNC_STOP_RECORDING, e.what());
+                       }
+                       if (0 != ret) {
+                               MAS_LOGE("[ERROR] Fail to stop recording, ret(%d)", ret);
+                       }
+               }
+       } else {
+               MAS_LOGE("[ERROR] g_handle is not valid");
+       }
+
+       return ret;
+}
+
+int dependency_resolver_set_recording_session(unsigned int session)
+{
+       int ret = -1;
+       MAS_LOGD("g_handle : %p", g_handle);
+       if (NULL != g_handle) {
+               mas_dependency_set_recording_session func = g_mas_dependency.set_recording_session;
+               if (NULL == func) {
+                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_SET_RECORDING_SESSION);
+               } else {
+                       try {
+                               ret = func(session);
+                       } catch (const std::exception& e) {
+                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
+                                       MAS_DEPENDENCY_FUNC_SET_RECORDING_SESSION, e.what());
+                       }
+                       if (0 != ret) {
+                               MAS_LOGE("[ERROR] Fail to set recording session, ret(%d)", ret);
+                       }
+               }
+       } else {
+               MAS_LOGE("[ERROR] g_handle is not valid");
+       }
+
+       return ret;
+}
+
+int dependency_resolver_set_background_volume(double ratio)
+{
+       int ret = -1;
+       if (NULL != g_handle) {
+               mas_dependency_set_background_volume func = g_mas_dependency.set_background_volume;
+               if (NULL == func) {
+                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_SET_BACKGROUND_VOLUME);
+               } else {
+                       try {
+                               ret = func(ratio);
+                       } catch (const std::exception& e) {
+                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
+                                       MAS_DEPENDENCY_FUNC_SET_BACKGROUND_VOLUME, e.what());
+                       }
+                       if (0 != ret) {
+                               MAS_LOGE("[ERROR] Fail to set background volume to %f, ret(%d)", ratio, ret);
+                       }
+               }
+       } else {
+               MAS_LOGE("[ERROR] g_handle is not valid");
+       }
+
+       return ret;
+}
+
+int dependency_resolver_get_audio_format(int* rate, int* channel, int* audio_type)
+{
+       int ret = -1;
+       if (NULL != g_handle) {
+               mas_dependency_get_audio_format func = g_mas_dependency.get_audio_format;
+               if (NULL == func) {
+                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_GET_AUDIO_FORMAT);
+               } else {
+                       try {
+                               ret = func(rate, channel, audio_type);
+                       } catch (const std::exception& e) {
+                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
+                                       MAS_DEPENDENCY_FUNC_GET_AUDIO_FORMAT, e.what());
+                       }
+                       if (0 != ret) {
+                               MAS_LOGE("[ERROR] Fail to get audio format, ret(%d)", ret);
+                       }
+               }
+       } else {
+               MAS_LOGE("[ERROR] g_handle is not valid");
+       }
+
+       return ret;
+}
+
+int dependency_resolver_get_audio_source_type(char** type)
+{
+       int ret = -1;
+       if (NULL != g_handle) {
+               mas_dependency_get_audio_source_type func = g_mas_dependency.get_audio_source_type;
+               if (NULL == func) {
+                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_GET_AUDIO_SOURCE_TYPE);
+               } else {
+                       try {
+                               ret = func(type);
+                       } catch (const std::exception& e) {
+                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
+                                       MAS_DEPENDENCY_FUNC_GET_AUDIO_SOURCE_TYPE, e.what());
+                       }
+                       if (0 != ret) {
+                               MAS_LOGE("[ERROR] Fail to get audio source type, ret(%d)", ret);
+                       }
+               }
+       } else {
+               MAS_LOGE("[ERROR] g_handle is not valid");
+       }
+
+       return ret;
+}
+
+int dependency_resolver_process_wakeup_engine_command(const char* engine, const char* command)
+{
+       int ret = -1;
+       if (NULL != g_handle) {
+               mas_dependency_process_wakeup_engine_command func = g_mas_dependency.process_wakeup_engine_command;
+               if (NULL == func) {
+                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_PROCESS_WAKEUP_ENGINE_COMMAND);
+               } else {
+                       try {
+                               ret = func(engine, command);
+                       } catch (const std::exception& e) {
+                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
+                                       MAS_DEPENDENCY_FUNC_PROCESS_WAKEUP_ENGINE_COMMAND, e.what());
+                       }
+                       if (0 != ret) {
+                               MAS_LOGE("[ERROR] Fail to process wakeup engine command, ret(%d)", ret);
+                       }
+               }
+       } else {
+               MAS_LOGE("[ERROR] g_handle is not valid");
+       }
+
+       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;
+}
+
+int dependency_resolver_set_voice_key_tap_duration(float duration)
+{
+       int ret = -1;
+       if (NULL != g_handle) {
+               mas_dependency_set_voice_key_tap_duration func = g_mas_dependency.set_voice_key_tap_duration;
+               if (NULL == func) {
+                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_SET_VOICE_KEY_TAP_DURATION);
+               } else {
+                       try {
+                               ret = func(duration);
+                       } catch (const std::exception& e) {
+                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
+                                       MAS_DEPENDENCY_FUNC_SET_VOICE_KEY_TAP_DURATION, e.what());
+                       }
+                       if (0 != ret) {
+                               MAS_LOGE("[ERROR] Fail to set voice key tap duration to %f, ret(%d)", duration, ret);
+                       }
+               }
+       } else {
+               MAS_LOGE("[ERROR] g_handle is not valid");
+       }
+
+       return ret;
+}
+
+int dependency_resolver_unset_voice_key_tap_duration()
+{
+       int ret = -1;
+       if (NULL != g_handle) {
+               mas_dependency_unset_voice_key_tap_duration func = g_mas_dependency.unset_voice_key_tap_duration;
+               if (NULL == func) {
+                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_UNSET_VOICE_KEY_TAP_DURATION);
+               } else {
+                       try {
+                               ret = func();
+                       } catch (const std::exception& e) {
+                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
+                                       MAS_DEPENDENCY_FUNC_UNSET_VOICE_KEY_TAP_DURATION, e.what());
+                       }
+                       if (0 != ret) {
+                               MAS_LOGE("[ERROR] Fail to unset voice key tap duration, ret(%d)", ret);
+                       }
+               }
+       } else {
+               MAS_LOGE("[ERROR] g_handle is not valid");
+       }
+
+       return ret;
+}
+
+int dependency_resolver_set_voice_key_support_mode(const char* support_mode)
+{
+       int ret = -1;
+       if (NULL != g_handle) {
+               mas_dependency_set_voice_key_support_mode func = g_mas_dependency.set_voice_key_support_mode;
+               if (NULL == func) {
+                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_SET_VOICE_KEY_SUPPORT_MODE);
+               } else {
+                       try {
+                               ret = func(support_mode);
+                       } catch (const std::exception& e) {
+                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
+                                       MAS_DEPENDENCY_FUNC_SET_VOICE_KEY_SUPPORT_MODE, e.what());
+                       }
+                       if (0 != ret) {
+                               MAS_LOGE("[ERROR] Fail to unset voice key tap duration, ret(%d)", ret);
+                       }
+               }
+       } else {
+               MAS_LOGE("[ERROR] g_handle is not valid");
+       }
+
+       return ret;
+}
+
+int dependency_resolver_get_custom_vconf_key(const char* default_key, char** custom_key)
+{
+       int ret = -1;
+       if (NULL != g_handle) {
+               mas_dependency_get_custom_vconf_key func = g_mas_dependency.get_custom_vconf_key;
+               if (NULL == func) {
+                       MAS_LOGE("[ERROR] symbol lookup failed : %s", MAS_DEPENDENCY_FUNC_GET_CUSTOM_VCONF_KEY);
+               } else {
+                       try {
+                               ret = func(default_key, custom_key);
+                       } catch (const std::exception& e) {
+                               MAS_LOGE("[ERROR] %s of dependency module threw exception : %s",
+                                       MAS_DEPENDENCY_FUNC_GET_CUSTOM_VCONF_KEY, e.what());
+                       }
+                       if (0 != ret) {
+                               MAS_LOGE("[ERROR] Fail to get custom vconf key, ret(%d)", ret);
+                       }
+               }
+       } else {
+               MAS_LOGE("[ERROR] g_handle is not valid");
+       }
+
+       return ret;
+}
diff --git a/wakeup-manager/src/heap_tracer.cpp b/wakeup-manager/src/heap_tracer.cpp
new file mode 100644 (file)
index 0000000..ad650fd
--- /dev/null
@@ -0,0 +1,241 @@
+#include "heap_tracer.h"
+
+#include <stdlib.h>
+#include <stdarg.h>
+
+#include <dlog.h>
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+#define LOG_TAG "ma_heap_tracer"
+
+static HeapTracer _tracer;
+
+const bool RECORD_UNMANAGED_CHUNKS = true;
+const int MAX_UNMANAGED_RECORDS = 128;
+const bool HEAP_TRACER_LOG_ENABLED = false
+;
+
+#define DESCRIPTION_LENGTH 255
+#define USE_HEAP_TRACER
+//#define ALLOW_FREE_UNMANAGED
+//#define RECORD_ALL_HISTORY
+
+void* vm_calloc(size_t nmemb, size_t size, const char *fmt, ...)
+{
+       void *ptr = calloc(nmemb, size);
+#ifdef USE_HEAP_TRACER
+       va_list argptr;
+       va_start(argptr, fmt);
+
+       char description[DESCRIPTION_LENGTH];
+       vsnprintf(description, sizeof(description), fmt, argptr);
+       _tracer.Insert(ptr, description, nmemb * size);
+
+       va_end(argptr);
+#endif
+       return ptr;
+}
+
+void* vm_malloc(size_t size, const char *fmt, ...)
+{
+       void *ptr = malloc(size);
+#ifdef USE_HEAP_TRACER
+       va_list argptr;
+       va_start(argptr, fmt);
+
+       char description[DESCRIPTION_LENGTH];
+       vsnprintf(description, sizeof(description), fmt, argptr);
+       _tracer.Insert(ptr, description, size);
+
+       va_end(argptr);
+#endif
+       return ptr;
+}
+
+void vm_free(void *ptr, const char *fmt, ...)
+{
+       if (ptr) {
+#ifdef USE_HEAP_TRACER
+               va_list argptr;
+               va_start(argptr, fmt);
+
+               bool managed = true;
+               char description[DESCRIPTION_LENGTH];
+               vsnprintf(description, sizeof(description), fmt, argptr);
+               if (false == _tracer.Delete(ptr, description)) {
+                       managed = false;
+                       _tracer.Find(ptr);
+               }
+#ifdef ALLOW_FREE_UNMANAGED
+               free(ptr);
+#else
+               if (managed) {
+                       free(ptr);
+               }
+#endif
+               va_end(argptr);
+#else
+               free(ptr);
+#endif
+       } else {
+               LOGD("Trying to free a null pointer");
+       }
+}
+
+char* vm_strdup(const char *s, const char *fmt, ...)
+{
+       char *ptr = nullptr;
+       if (s) {
+               ptr = strdup(s);
+#ifdef USE_HEAP_TRACER
+               va_list argptr;
+               va_start(argptr, fmt);
+
+               char description[DESCRIPTION_LENGTH];
+               vsnprintf(description, sizeof(description), fmt, argptr);
+               _tracer.Insert(ptr, description, strlen(s) + 1);
+
+               va_end(argptr);
+#endif
+       } else {
+               LOGD("Trying to duplicate a null pointer");
+       }
+       return ptr;
+}
+
+void *vm_mark_unmanaged(void *ptr, const char *fmt, ...)
+{
+#ifdef USE_HEAP_TRACER
+       va_list argptr;
+       va_start(argptr, fmt);
+
+       char description[DESCRIPTION_LENGTH];
+       vsnprintf(description, sizeof(description), fmt, argptr);
+       _tracer.MarkUnmanaged(ptr, description);
+
+       va_end(argptr);
+#endif
+       return ptr;
+}
+
+HeapTracer::HeapTracer()
+{
+       LOGD("HeapTracer()");
+}
+
+HeapTracer::~HeapTracer()
+{
+       LOGD("~HeapTracer()");
+
+       Trace();
+}
+
+bool HeapTracer::Insert(void *ptr, std::string description, size_t size)
+{
+       if (HEAP_TRACER_LOG_ENABLED) {
+               LOGD("Heap allocated %p [size %zu] : %s", ptr, size, description.c_str());
+       }
+
+       AllocationEntry entry;
+       entry.ptr = ptr;
+       entry.description = description;
+       entry.size = size;
+
+       std::lock_guard<std::mutex> lock(mManagedTableMutex);
+       mManagedTable[ptr] = entry;
+
+#ifdef RECORD_ALL_HISTORY
+       EntryHistory history;
+       history.entry = entry;
+       history.operation = EntryOperation::INSERT;
+       clock_gettime(CLOCK_REALTIME, &(history.ts));
+       mEntryHistory.push_back(history);
+#endif
+       return true;
+}
+
+bool HeapTracer::Delete(void *ptr, std::string description)
+{
+       if (HEAP_TRACER_LOG_ENABLED) {
+               LOGD("Heap deallocated %p : %s", ptr, description.c_str());
+       }
+
+       std::lock_guard<std::mutex> lock(mManagedTableMutex);
+       if (mManagedTable.find(ptr) != mManagedTable.end()) {
+#ifdef RECORD_ALL_HISTORY
+               EntryHistory history;
+               history.entry = mManagedTable[ptr];
+               history.entry.description = description;
+               history.operation = EntryOperation::DELETE;
+               clock_gettime(CLOCK_REALTIME, &(history.ts));
+               mEntryHistory.push_back(history);
+#endif
+               mManagedTable.erase(ptr);
+       } else {
+               LOGE("Heap Trace Error : Trying to delete an entry that does not exist : %p, %s",
+                       ptr, description.c_str());
+               return false;
+       }
+       return true;
+}
+
+std::string HeapTracer::Find(void *ptr)
+{
+       std::lock_guard<std::mutex> lock(mManagedTableMutex);
+#ifdef RECORD_ALL_HISTORY
+       for (auto& entry : mEntryHistory) {
+               if (entry.entry.ptr == ptr) {
+                       LOGD("Heap history record for %p : %s, %lld.%.9ld, %s",
+                               ptr,
+                               (entry.operation == EntryOperation::INSERT ? "INSERT" : "DELETE"),
+                               (long long)(entry.ts.tv_sec), entry.ts.tv_nsec,
+                               entry.entry.description.c_str());
+               }
+       }
+#endif
+       if (mManagedTable.find(ptr) != mManagedTable.end()) {
+               return mManagedTable[ptr].description;
+       }
+       return std::string("Not found");
+}
+
+void HeapTracer::MarkUnmanaged(void *ptr, std::string description)
+{
+       LOGD("Marking as unmanaged : %p %s", ptr, description.c_str());
+
+       std::lock_guard<std::mutex> lock(mManagedTableMutex);
+       auto iter = mManagedTable.find(ptr);
+       if (iter != mManagedTable.end()) {
+               if (RECORD_UNMANAGED_CHUNKS) {
+                       std::lock_guard<std::mutex> lock(mUnmanagedRecordsMutex);
+                       if (mUnmanagedRecordsSize >= MAX_UNMANAGED_RECORDS) {
+                               mUnmanagedRecords.pop_front();
+                               mUnmanagedRecordsSize--;
+                       }
+                       mUnmanagedRecords.push_back(iter->second);
+                       mUnmanagedRecordsSize++;
+               }
+               mManagedTable.erase(ptr);
+       } else {
+               LOGE("Heap Trace Error : Trying to mark an entry that does not exist as unmanaged : %p", ptr);
+       }
+}
+
+bool HeapTracer::Empty()
+{
+       std::lock_guard<std::mutex> lock(mManagedTableMutex);
+       return mManagedTable.empty();
+}
+
+void HeapTracer::Trace()
+{
+       LOGD("Heap Trace Start");
+
+       std::lock_guard<std::mutex> lock(mManagedTableMutex);
+       for (auto& item : mManagedTable) {
+               LOGD("No dealloc information exists for %p [size %d] : %s", item.first, item.second.size, item.second.description.c_str());
+       }
+       LOGD("Heap Trace End");
+}
diff --git a/wakeup-manager/src/wakeup_audio_manager.cpp b/wakeup-manager/src/wakeup_audio_manager.cpp
new file mode 100644 (file)
index 0000000..8bab1d6
--- /dev/null
@@ -0,0 +1,651 @@
+#define _GNU_SOURCE
+
+#include "wakeup_audio_manager.h"
+#include "wakeup_manager_main.h"
+#include "dependency_resolver.h"
+#include "heap_tracer.h"
+
+#include <sys/time.h>
+#include <sys/resource.h>
+
+#include <algorithm>
+#include <map>
+
+#include <Ecore.h>
+#include <audio_io.h>
+#include <sound_manager.h>
+#include <sound_manager_internal.h>
+
+namespace multiassistant
+{
+namespace wakeup
+{
+
+/* Need to check whether this value needs to be configurable */
+static int g_speech_pcm_wait_count = 800;
+
+#ifdef PRINT_DETAILED_TIMEINFO
+static atomic_int g_mutex_wait_index{0};
+static map<int, long long int> g_mutex_wait_time;
+#endif
+
+static long long get_current_milliseconds_after_epoch()
+{
+       auto now = chrono::steady_clock::now();
+       auto now_ms = chrono::time_point_cast<chrono::milliseconds>(now);
+       /* number of milliseconds since the epoch of system_clock */
+       auto value = now_ms.time_since_epoch();
+
+       return value.count();
+}
+
+#ifdef PRINT_DETAILED_TIMEINFO
+static std::string get_current_milliseconds_after_epoch(chrono::time_point<chrono::steady_clock> point)
+{
+       auto now_ms = chrono::time_point_cast<chrono::milliseconds>(point);
+       /* number of milliseconds since the epoch of system_clock */
+       auto value = now_ms.time_since_epoch();
+
+       return std::to_string(value.count());
+}
+#endif
+
+CAudioManager::CAudioManager()
+{
+}
+
+CAudioManager::~CAudioManager()
+{
+       deinitialize();
+}
+
+CAudioManager::CAudioManager(IAudioEventObserver *observer) : CAudioManager()
+{
+       subscribe(observer);
+}
+
+void recording_focus_state_watch_cb(int id, sound_stream_focus_mask_e focus_mask,
+       sound_stream_focus_state_e focus_state, sound_stream_focus_change_reason_e reason,
+       const char *extra_info, void *user_data)
+{
+       MWR_LOGD("[Recorder] focus_mask : %d, focus_state : %d, reason : %d, [%s]",
+               focus_mask, focus_state, reason, extra_info);
+
+       if (nullptr == user_data) return;
+
+       /* The API description states that calling sound_manager_get_current_recording_focus()
+               function inside sound_stream_focus_state_watch_cb() function is prohibited */
+       ecore_main_loop_thread_safe_call_async(
+               [](void* data) {
+                       CAudioManager *manager = static_cast<CAudioManager*>(data);
+                       if (manager) {
+                               manager->sound_focus_changed();
+                       }
+               }, user_data);
+}
+
+int CAudioManager::initialize(void)
+{
+       sound_manager_add_focus_state_watch_cb(SOUND_STREAM_FOCUS_FOR_RECORDING,
+               recording_focus_state_watch_cb, this, &mSoundFocusWatchId);
+       return 0;
+}
+
+int CAudioManager::deinitialize(void)
+{
+       clear_audio_data();
+       if (mStreamingThread.joinable()) {
+               MWR_LOGD("mStreamingThread is joinable, trying join()");
+               mStopStreamingThread.store(true);
+               try {
+                       mStreamingThread.join();
+               } catch (std::exception &e) {
+                       MWR_LOGE("Exception thrown : %s", e.what());
+               }
+       }
+       mStopStreamingThread.store(false);
+
+       if (mBackgroundVolumeThread.joinable()) {
+               MWR_LOGD("mBackgroundVolumeThread is joinable, trying join()");
+               try {
+                       mBackgroundVolumeThread.join();
+               } catch (std::exception &e) {
+                       MWR_LOGE("Exception thrown : %s", e.what());
+               }
+       }
+
+       sound_manager_remove_focus_state_watch_cb(mSoundFocusWatchId);
+
+       return 0;
+}
+
+void CAudioManager::sound_focus_changed()
+{
+       sound_stream_focus_change_reason_e acquired_by;
+       int sound_behavior;
+       char* extra_info = NULL;
+       int focus = sound_manager_get_current_recording_focus(&acquired_by, &sound_behavior, &extra_info);
+       MWR_LOGD("[Recorder] sound focus has changed : %d %d %d %s", focus,
+               (SOUND_MANAGER_ERROR_NO_DATA != focus ? acquired_by : -1),
+               (SOUND_MANAGER_ERROR_NO_DATA != focus ? sound_behavior : -1),
+               (SOUND_MANAGER_ERROR_NO_DATA != focus ? extra_info : ""));
+       if (SOUND_MANAGER_ERROR_NO_DATA == focus) {
+               if (mRecordingRequired && !mIsRecording) {
+                       MWR_LOGD("[Recorder] Currently no other process has acquired sound focus, start recording");
+                       start_recording(false);
+               }
+       } else {
+               if (mIsRecording) {
+                       MWR_LOGW("[Recorder] Sound focus acquired by other process, stop recording");
+                       stop_recording(false);
+               }
+       }
+       if (extra_info) {
+               free(extra_info);
+               extra_info = NULL;
+       }
+}
+
+void CAudioManager::subscribe(IAudioEventObserver *observer)
+{
+       lock_guard<mutex> lock(mMutex);
+       if (observer) {
+               mObservers.push_back(observer);
+       }
+}
+
+void CAudioManager::unsubscribe(IAudioEventObserver *observer)
+{
+       lock_guard<mutex> lock(mMutex);
+       auto iter = find(mObservers.begin(), mObservers.end(), observer);
+       if (iter != mObservers.end()) {
+               mObservers.erase(iter);
+       }
+}
+
+void CAudioManager::stop_recording(bool proactive)
+{
+       dependency_resolver_stop_recording();
+       if (proactive) {
+               mRecordingRequired = false;
+       }
+       mIsRecording = false;
+}
+
+void CAudioManager::start_recording(bool proactive)
+{
+       if (mIsRecording) {
+               stop_recording(false);
+       }
+       if (proactive) {
+               mRecordingRequired = true;
+       }
+
+       sound_stream_focus_change_reason_e acquired_by;
+       int sound_behavior;
+       char* extra_info = NULL;
+       if (SOUND_MANAGER_ERROR_NO_DATA == sound_manager_get_current_recording_focus(&acquired_by, &sound_behavior, &extra_info)) {
+               MWR_LOGD("[Recorder] Currently no other process has acquired sound focus, start recording");
+               dependency_resolver_start_recording();
+               mIsRecording = true;
+       } else {
+               MWR_LOGW("[Recorder] Currently sound focus is acquired by other process, skip recording");
+       }
+       if (extra_info) {
+               free(extra_info);
+               extra_info = NULL;
+       }
+}
+
+void CAudioManager::set_recording_session(recording_session session)
+{
+       dependency_resolver_set_recording_session((unsigned int)session);
+}
+
+/* Need to consider adapting conventional producer-consumer model */
+void CAudioManager::streaming_previous_audio_data_thread_func()
+{
+       MWR_LOGI("[ENTER]");
+
+       unique_lock<mutex> lock(mMutex, defer_lock);
+
+       /* get feedback data */
+       size_t audio_data_size = 0;
+       lock.lock();
+       audio_data_size = mPreviousAudioData.size();
+       for (int index = 0; index < audio_data_size; index++) {
+               mas_speech_data& speech_data = mPreviousAudioData.at(index).data;
+               for (const auto& observer : mObservers) {
+                       if (observer) {
+                               if (!observer->on_streaming_audio_data(
+                                       speech_data.event, speech_data.buffer, speech_data.len)) {
+                                       LOGE("[Recorder WARNING] One of the observer returned false");
+                               }
+                       }
+
+                       if (MAS_SPEECH_STREAMING_EVENT_FINISH == speech_data.event) {
+                               MWR_LOGI("[INFO] Finish to send previous speech data");
+                               return;
+                       }
+               }
+
+               if (mStopStreamingThread.load()) {
+                       MWR_LOGI("[INFO] Stop Streaming Requested, returning");
+                       return;
+               }
+       }
+       lock.unlock();
+
+       MWR_LOGI("[EXIT]");
+}
+
+static void validate_audio_data_event_field(const mas_speech_data &data)
+{
+       if (data.event == MAS_SPEECH_STREAMING_EVENT_CONTINUE ||
+               data.event == MAS_SPEECH_STREAMING_EVENT_START ||
+               data.event == MAS_SPEECH_STREAMING_EVENT_FINISH ||
+               data.event == MAS_SPEECH_STREAMING_EVENT_FAIL) {
+               return;
+       }
+       MWR_LOGE("mas_speech_data has event field : %d", data.event);
+}
+
+void CAudioManager::streaming_audio_data_thread_func(long long start_time)
+{
+       MWR_LOGI("[ENTER]");
+
+       mStreamingThreadActive.store(true);
+
+       unique_lock<mutex> lock(mMutex, defer_lock);
+       bool finish_event_sent = false;
+
+       lock.lock();
+       auto lead = mAudioData.begin();
+       auto iter = lead;
+       while (lead != mAudioData.end() && lead->time < start_time) {
+               iter = lead;
+               advance(lead, 1);
+       }
+       MWR_LOGE("data_count : %zu", mAudioData.size());
+       lock.unlock();
+
+       while (!(mStopStreamingThread.load())) {
+               const size_t SEND_BUFFER_SIZE = 4096;
+               unsigned char send_buffer[SEND_BUFFER_SIZE];
+
+               int ret = -1;
+               int cnt = 0;
+
+               /* get feedback data */
+               lock.lock();
+               auto end = mAudioData.end();
+               lock.unlock();
+               if (lead == end) {
+                       /* empty queue */
+                       MWR_LOGD("[DEBUG] No feedback data. Waiting mode : %d", ret);
+
+                       /* waiting */
+                       while (!(mStopStreamingThread.load())) {
+                               this_thread::sleep_for(chrono::milliseconds(10));
+                               lock.lock();
+                               end = mAudioData.end();
+                               auto begin = mAudioData.begin();
+                               vector<IAudioEventObserver*> observers = mObservers;
+                               lock.unlock();
+                               if (iter == end) {
+                                       lead = begin;
+                               } else {
+                                       lead = iter;
+                                       if (lead != end) {
+                                               advance(lead, 1);
+                                       }
+                               }
+                               if (lead != end) {
+                                       MWR_LOGD("[INFO] Resume thread");
+                                       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 : observers) {
+                                               if (observer) {
+                                                       if (!observer->on_streaming_audio_data(
+                                                               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");
+                                                       }
+                                               }
+                                       }
+                                       mStreamingThreadActive.store(false);
+                                       return;
+                               }
+                               cnt++;
+                       }
+                       MWR_LOGD("[INFO] Finish to wait for new feedback data come");
+
+                       /* resume feedback thread */
+                       continue;
+               }
+
+               /* FIXME : Extracted audio data here should be used as previous audio data*/
+
+               lock.lock();
+               end = mAudioData.end();
+               vector<IAudioEventObserver*> observers = mObservers;
+
+               if (lead != end) {
+                       iter = lead;
+
+                       mas_speech_data speech_data = iter->data;
+                       size_t len = speech_data.len;
+                       if (len > SEND_BUFFER_SIZE) {
+                               LOGE("ERROR : SPEECH DATA contains data bigger than the buffer size : %d, truncating", len);
+                               len = SEND_BUFFER_SIZE;
+                       }
+                       memcpy(send_buffer, speech_data.buffer, len);
+                       speech_data.buffer = send_buffer;
+                       speech_data.len = len;
+                       lock.unlock();
+
+                       for (const auto& observer : observers) {
+                               if (observer) {
+                                       validate_audio_data_event_field(speech_data);
+
+#ifdef PRINT_DETAILED_TIMEINFO
+                                       auto started = std::chrono::steady_clock::now();
+#endif
+                                       if (!observer->on_streaming_audio_data(
+                                               speech_data.event, speech_data.buffer, speech_data.len)) {
+                                               LOGE("[Recorder WARNING] One of the observer returned false");
+                                       }
+#ifdef PRINT_DETAILED_TIMEINFO
+                                       auto finished = std::chrono::steady_clock::now();
+                                       auto interval = finished - started;
+                                       long long int count = static_cast<long long int>(
+                                               chrono::duration_cast<chrono::milliseconds>(interval).count());
+                                       int index = g_mutex_wait_index;
+                                       g_mutex_wait_time[index] += count;
+#endif
+                               }
+                       }
+
+                       if (MAS_SPEECH_STREAMING_EVENT_FINISH == speech_data.event) {
+                               MWR_LOGE("[INFO] Finish to get and send speech data");
+                               finish_event_sent = true;
+                               break;
+                       }
+
+                       advance(lead, 1);
+               } else {
+                       lock.unlock();
+               }
+       }
+
+       if (true != finish_event_sent) {
+               unsigned char final_buffer[2] = {'\0', };
+               lock.lock();
+               vector<IAudioEventObserver*> observers = mObservers;
+               lock.unlock();
+               for (const auto& observer : observers) {
+                       if (observer) {
+                               MWR_LOGE("No FINISH event sent yet, adding to finalize streaming session");
+                               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");
+                               }
+                       }
+               }
+       }
+       mStreamingThreadActive.store(false);
+       MWR_LOGE("[EXIT]");
+}
+
+#ifdef PRINT_DETAILED_TIMEINFO
+static void print_duration(std::chrono::time_point<std::chrono::steady_clock> started)
+{
+       const std::chrono::milliseconds threshold(100);
+       auto finished = std::chrono::steady_clock::now();
+       auto interval = finished - started;
+       if (interval > threshold) {
+               long long int count = static_cast<long long int>(
+                       std::chrono::duration_cast<std::chrono::milliseconds>(interval).count());
+               int index = g_mutex_wait_index;
+               MAS_LOGE("Mutex wait time : %d %lld %lld, [%s~]", index, count,
+                       g_mutex_wait_time[index],
+                       get_current_milliseconds_after_epoch(started).c_str());
+       }
+}
+#endif
+
+void CAudioManager::add_audio_data(mas_speech_data& data, long long time)
+{
+#ifdef PRINT_DETAILED_TIMEINFO
+       ++g_mutex_wait_index;
+#endif
+
+       long long delta = mAudioRecordingDurationMilliseconds;
+
+       bool print_log = false;
+       static unsigned int num = 0;
+       const std::chrono::seconds interval(3);
+       static auto last = std::chrono::steady_clock::now();
+       auto now = std::chrono::steady_clock::now();
+
+       struct rusage process_usage_before;
+       struct rusage thread_usage_before;
+
+       if (now - last > interval) {
+               print_log = true;
+               last = now;
+               getrusage(RUSAGE_SELF, &process_usage_before);
+               getrusage(RUSAGE_THREAD, &thread_usage_before);
+       }
+       num++;
+
+       notify_audio_data_recording(time, data.buffer, data.len);
+
+       if (print_log) {
+               struct rusage process_usage_after;
+               struct rusage thread_usage_after;
+
+               getrusage(RUSAGE_SELF, &process_usage_after);
+               getrusage(RUSAGE_THREAD, &thread_usage_after);
+
+               MWR_LOGE("Feeding audio data : num(%d), now(%" PRId64 "), %d %zu ([%ld,%ld,%ld,%ld] -> [%ld,%ld,%ld,%ld]) ([%ld,%ld,%ld,%ld] -> [%ld,%ld,%ld,%ld])",
+                       num, now.time_since_epoch().count(),
+                       mStreamingThreadActive.load(), mAudioData.size(),
+                       process_usage_before.ru_maxrss,
+                       process_usage_before.ru_ixrss,
+                       process_usage_before.ru_idrss,
+                       process_usage_before.ru_isrss,
+                       process_usage_after.ru_maxrss,
+                       process_usage_after.ru_ixrss,
+                       process_usage_after.ru_idrss,
+                       process_usage_after.ru_isrss,
+                       thread_usage_before.ru_maxrss,
+                       thread_usage_before.ru_ixrss,
+                       thread_usage_before.ru_idrss,
+                       thread_usage_before.ru_isrss,
+                       thread_usage_after.ru_maxrss,
+                       thread_usage_after.ru_ixrss,
+                       thread_usage_after.ru_idrss,
+                       thread_usage_after.ru_isrss);
+       }
+
+       mas_speech_data_with_time data_with_time;
+       data_with_time.data = data;
+       data_with_time.time = time;
+
+       lock_guard<mutex> lock(mMutex);
+
+#ifdef PRINT_DETAILED_TIMEINFO
+       print_duration(now);
+#endif
+
+       /* Pop items only when the streaming is not activated */
+       if (!mStreamingThreadActive.load()) {
+               while(false == mAudioData.empty() && mAudioData.front().time < time - delta) {
+                       const auto &front = mAudioData.front();
+                       if (front.data.buffer) {
+                               vm_free_simple(front.data.buffer);
+                       }
+                       mAudioData.pop_front();
+               }
+       }
+       validate_audio_data_event_field(data);
+       mAudioData.push_back(data_with_time);
+}
+
+void CAudioManager::feed_audio_data(mas_speech_streaming_event_e event, void* buffer, int len)
+{
+       if (NULL == buffer || 0 == len) return;
+
+       mas_speech_data speech_data;
+       speech_data.buffer = vm_malloc_simple(len);
+       if (speech_data.buffer) {
+               long long time = get_current_milliseconds_after_epoch();
+
+               speech_data.event = event;
+               speech_data.len = len;
+               memcpy(speech_data.buffer, buffer, len);
+               add_audio_data(speech_data, time);
+       }
+}
+
+void CAudioManager::finalize_audio_data()
+{
+       MWR_LOGI("Adding FINISH event to audio data list");
+       unsigned char final_buffer[2] = {'\0', };
+       mas_speech_data speech_data;
+       speech_data.event = MAS_SPEECH_STREAMING_EVENT_FINISH;
+       speech_data.len = sizeof(final_buffer);
+       speech_data.buffer = vm_malloc_simple(speech_data.len);
+       if (speech_data.buffer) {
+               long long time = get_current_milliseconds_after_epoch();
+
+               memcpy(speech_data.buffer, final_buffer, speech_data.len);
+               add_audio_data(speech_data, time);
+       }
+}
+
+void CAudioManager::clear_audio_data()
+{
+       lock_guard<mutex> lock(mMutex);
+       while(!mAudioData.empty()) {
+               const auto &front = mAudioData.front();
+               if (front.data.buffer) {
+                       vm_free_simple(front.data.buffer);
+               }
+               mAudioData.pop_front();
+       }
+       mAudioData.clear();
+}
+
+void CAudioManager::notify_audio_data_recording(long time, void* data, int len)
+{
+       unique_lock<mutex> lock(mMutex, defer_lock);
+       lock.lock();
+       vector<IAudioEventObserver*> observers = mObservers;
+       lock.unlock();
+       for (const auto& observer : observers) {
+               if (observer) {
+                       observer->on_recording_audio_data(time, data, len);
+               }
+       }
+}
+
+void CAudioManager::start_streaming_current_utterance_data(long long start_time)
+{
+       MWR_LOGI("[ENTER]");
+       if (mStreamingThread.joinable()) {
+               MWR_LOGE("ERROR : mStreamingThread is joinable, will not start a new thread");
+               return;
+       }
+       lock_guard<mutex> lock(mMutex);
+       mStreamingThread = thread(&CAudioManager::streaming_audio_data_thread_func, this, start_time);
+}
+
+void CAudioManager::stop_streaming_current_utterance_data()
+{
+       MWR_LOGI("[ENTER]");
+       if (mStreamingThread.joinable()) {
+               MWR_LOGD("mStreamingThread is joinable, trying join()");
+               mStopStreamingThread.store(true);
+               try {
+                       mStreamingThread.join();
+               } catch (std::exception &e) {
+                       MWR_LOGE("Exception thrown : %s", e.what());
+               }
+       }
+       mStopStreamingThread.store(false);
+
+       /* FIXME : Need to move all the speech data to previous speech data for later use */
+}
+
+void CAudioManager::start_streaming_previous_utterance_data()
+{
+       MWR_LOGI("[ENTER]");
+       if (mStreamingPreviousThread.joinable()) {
+               MWR_LOGE("ERROR : mStreamingPreviousThread is joinable, will not start a new thread");
+               return;
+       }
+       lock_guard<mutex> lock(mMutex);
+       mStreamingPreviousThread = thread(&CAudioManager::streaming_previous_audio_data_thread_func, this);
+}
+
+void CAudioManager::stop_streaming_previous_utterance_data()
+{
+       MWR_LOGI("[ENTER]");
+       if (mStreamingPreviousThread.joinable()) {
+               MWR_LOGD("mStreamingPreviousThread is joinable, trying join()");
+               mStopStreamingPreviousThread.store(true);
+               try {
+                       mStreamingPreviousThread.join();
+               } catch (std::exception &e) {
+                       MWR_LOGE("Exception thrown : %s", e.what());
+               }
+       }
+       mStopStreamingThread.store(false);
+}
+
+void CAudioManager::start_streaming_follow_up_data()
+{
+       MWR_LOGI("[ENTER]");
+       if (mStreamingThread.joinable()) {
+               MWR_LOGE("ERROR : mStreamingThread is joinable, will not start a new thread");
+               return;
+       }
+
+       mStreamingThread = thread(&CAudioManager::streaming_audio_data_thread_func, this, 0);
+}
+
+void CAudioManager::stop_streaming_follow_up_data()
+{
+       MWR_LOGI("[ENTER]");
+       if (mStreamingThread.joinable()) {
+               MWR_LOGD("mStreamingThread is joinable, trying join()");
+               mStopStreamingThread.store(true);
+               mStreamingThread.join();
+       }
+       mStopStreamingThread.store(false);
+}
+
+static void set_background_volume_thread_func(double ratio)
+{
+       MWR_LOGI("[ENTER]");
+       dependency_resolver_set_background_volume(ratio);
+}
+
+void CAudioManager::set_background_volume(double ratio)
+{
+       if (mBackgroundVolumeThread.joinable()) {
+               mBackgroundVolumeThread.join();
+       }
+       mBackgroundVolumeThread = thread(&set_background_volume_thread_func, ratio);
+}
+
+} // wakeup
+} // multiassistant
diff --git a/wakeup-manager/src/wakeup_engine_manager.cpp b/wakeup-manager/src/wakeup_engine_manager.cpp
new file mode 100644 (file)
index 0000000..cb0c0b7
--- /dev/null
@@ -0,0 +1,1072 @@
+#include <multi_assistant_service.h>
+
+#include "wakeup_engine_manager.h"
+#include "wakeup_manager_main.h"
+
+#include <dlfcn.h>
+#include <algorithm>
+#include <pkgmgr-info.h>
+#include <deque>
+
+namespace multiassistant
+{
+namespace wakeup
+{
+
+/* Sound buf save for test */
+#if 0
+#define BUF_SAVE_MODE
+#endif
+
+#ifdef BUF_SAVE_MODE
+static char g_temp_file_name[128] = {'\0', };
+
+static FILE* g_pFile = NULL;
+
+static int g_count = 1;
+#endif
+
+/* Need to check whether this value needs to be configurable */
+static int g_speech_pcm_wait_count = 800;
+
+/* Utility function for checking if an element exists in a container */
+template<class C, class T>
+static auto contains(const C& v, const T& x) -> decltype(end(v), true)
+{
+       return end(v) != find(begin(v), end(v), x);
+}
+
+static long long get_current_milliseconds_after_epoch()
+{
+       auto now = chrono::steady_clock::now();
+       auto now_ms = chrono::time_point_cast<chrono::milliseconds>(now);
+       /* number of milliseconds since the epoch of system_clock */
+       auto value = now_ms.time_since_epoch();
+
+       return value.count();
+}
+
+CWakeupEngineManager::CWakeupEngineManager()
+{
+}
+
+CWakeupEngineManager::~CWakeupEngineManager()
+{
+       MWR_LOGI("Wakeup Engine Manager is now being destroyed");
+}
+
+CWakeupEngineManager::CWakeupEngineManager(IEngineEventObserver *observer) : CWakeupEngineManager()
+{
+       subscribe(observer);
+}
+
+void CWakeupEngineManager::initialize()
+{
+       DIR* dp = opendir(MA_WAKEUP_ENGINE_PATH);
+       if (nullptr == dp) {
+               MWR_LOGD("Failed opening directory : %s", (const char*)MA_WAKEUP_ENGINE_PATH);
+       } else {
+               struct dirent *dirp = nullptr;
+               char dirpath[_POSIX_PATH_MAX];
+               do {
+                       dirp = readdir(dp);
+
+                       if (nullptr != dirp) {
+                               const string current_directory{"."};
+                               const string parent_directory{".."};
+                               if (0 == current_directory.compare(dirp->d_name) ||
+                                       0 == parent_directory.compare(dirp->d_name))
+                                       continue;
+
+                               if (DT_DIR != dirp->d_type) /* If not a directory */
+                                       continue;
+
+                               int dirpath_len = strlen(MA_WAKEUP_ENGINE_PATH) + strlen(dirp->d_name) + 1;
+                               if (dirpath_len >= _POSIX_PATH_MAX) {
+                                       MWR_LOGD("File path is too long : %s", dirp->d_name);
+                                       closedir(dp);
+                                       return;
+                               }
+
+                               memset(dirpath, '\0', _POSIX_PATH_MAX);
+                               snprintf(dirpath, _POSIX_PATH_MAX, "%s/%s",
+                                       (const char*)(MA_WAKEUP_ENGINE_PATH), dirp->d_name);
+
+                               add_engine_directory(string{dirp->d_name}, dirpath);
+                       }
+               } while (nullptr != dirp);
+
+               closedir(dp);
+       }
+}
+
+void CWakeupEngineManager::deinitialize()
+{
+       MWR_LOGI("[START]");
+       if (mStreamingThread.joinable()) {
+               MWR_LOGD("mStreamingThread is joinable, trying join()");
+               mStopStreamingThread.store(true);
+               mStreamingThread.join();
+       }
+       mStopStreamingThread.store(false);
+
+       for (auto& info : mEngineInfo) {
+               try {
+                       if (info.interface.set_wakeup_event_callback) {
+                               info.interface.set_wakeup_event_callback(nullptr, nullptr);
+                       }
+                       if (info.interface.set_speech_status_callback) {
+                               info.interface.set_speech_status_callback(nullptr, nullptr);
+                       }
+                       if (info.interface.set_error_callback) {
+                               info.interface.set_error_callback(nullptr, nullptr);
+                       }
+                       if (info.interface.set_audio_data_require_status_callback) {
+                               info.interface.set_audio_data_require_status_callback(nullptr, nullptr);
+                       }
+                       if (info.interface.set_wakeup_engine_command_callback) {
+                               info.interface.set_wakeup_engine_command_callback(nullptr, nullptr);
+                       }
+                       MWR_LOGI("Trying to deinitialize engine : %s", info.engine_name.c_str());
+                       if (info.interface.deinitialize) {
+                               int ret = info.interface.deinitialize();
+                               MWR_LOGI("Deinitialization [%s] returned %d", info.engine_name.c_str(), ret);
+                       }
+               } catch (const std::exception& e) {
+                       MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
+                               info.engine_name.c_str(), e.what());
+               }
+               if (info.engine_handle) {
+                       int ret = dlclose(info.engine_handle);
+                       MWR_LOGI("Closing [%s] returned %d, [%s]", info.engine_name.c_str(), ret,
+                               ((0 == ret) ? "" : dlerror()));
+                       info.engine_handle = nullptr;
+               }
+       }
+       mSelectedEngine = nullptr;
+       mEngineInfo.clear();
+       MWR_LOGI("[END]");
+}
+
+void CWakeupEngineManager::subscribe(IEngineEventObserver *observer)
+{
+       mObservers.push_back(observer);
+       MWR_LOGD("Added Observer : %p %zu", observer, mObservers.size());
+}
+
+void CWakeupEngineManager::unsubscribe(IEngineEventObserver *observer)
+{
+       auto iter = find(mObservers.begin(), mObservers.end(), observer);
+       if (iter != mObservers.end()) {
+               mObservers.erase(iter);
+       }
+}
+
+bool CWakeupEngineManager::get_audio_data_required()
+{
+       return mAudioDataRequired;
+}
+
+void CWakeupEngineManager::set_selected_wakeup_info(mas_wakeup_event_info wakeup_info)
+{
+       mSelectedEngine = nullptr;
+
+       const auto& iter = find_if(mEngineInfo.begin(), mEngineInfo.end(),
+               [wakeup_info](const EngineInfo& info) {
+                       if (nullptr == wakeup_info.wakeup_engine)
+                               return false;
+
+                       return (0 == info.engine_name.compare(wakeup_info.wakeup_engine));
+               });
+
+       if (iter != mEngineInfo.end()) {
+               mSelectedEngine = &(*iter);
+               MWR_LOGD("Selected : %s", iter->engine_name.c_str());
+       }
+}
+
+bool CWakeupEngineManager::set_language(string language)
+{
+       for (const auto& info : mEngineInfo) {
+               if (info.interface.set_language) {
+                       try {
+                               info.interface.set_language(language.c_str());
+                       } catch (const std::exception& e) {
+                               MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
+                                       info.engine_name.c_str(), e.what());
+                       }
+               }
+       }
+       return true;
+}
+
+bool CWakeupEngineManager::set_assistant_language(string appid, string language)
+{
+       for (auto& info : mEngineInfo) {
+               const auto& iter = find_if(info.assistant_list.begin(), info.assistant_list.end(),
+                       [appid](const string& assistant) {
+                               return (0 == assistant.compare(appid));
+                       });
+
+               /* If the appid is in the assistant list */
+               if (info.assistant_list.end() != iter) {
+                       try {
+                               int ret = info.interface.set_language(language.c_str());
+                               MWR_LOGI("set_language returned %d : %s %s %s",
+                                       ret, appid.c_str(), info.engine_name.c_str(), language.c_str());
+                       } catch (const std::exception& e) {
+                               MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
+                                       info.engine_name.c_str(), e.what());
+                       }
+               }
+       }
+       return true;
+}
+
+void CWakeupEngineManager::set_assistant_activated(string appid, bool activated)
+{
+       MWR_LOGE("[ENTER] : %s %d", appid.c_str(), activated);
+       for (auto& info : mEngineInfo) {
+               const auto& iter = find_if(info.assistant_list.begin(), info.assistant_list.end(),
+                       [appid](const string& assistant) {
+                               return (0 == assistant.compare(appid));
+                       });
+
+               /* If the appid is in the assistant list */
+               if (info.assistant_list.end() != iter) {
+                       MWR_LOGI("%s has %s", info.engine_name.c_str(), appid.c_str());
+                       bool previously_activated = info.activated;
+                       if (activated) {
+                               info.activated_assistants.insert(appid);
+                       } else {
+                               info.activated_assistants.erase(appid);
+                       }
+                       info.activated = (info.activated_assistants.size() > 0);
+                       if (previously_activated != info.activated) {
+                               if (info.activated) {
+                                       try {
+                                               info.interface.activate();
+                                               MWR_LOGW("Activating wakeup engine : %s", info.engine_name.c_str());
+                                       } catch (const std::exception& e) {
+                                               MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
+                                                       info.engine_name.c_str(), e.what());
+                                       }
+                               } else {
+                                       try {
+                                               info.interface.deactivate();
+                                               MWR_LOGW("Deactivating wakeup engine : %s", info.engine_name.c_str());
+                                       } catch (const std::exception& e) {
+                                               MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
+                                                       info.engine_name.c_str(), e.what());
+                                       }
+                               }
+                               /* Activated status changed, need to update audio_data_require_status too */
+                               on_audio_data_require_status(info.engine_name, info.audio_data_require_status);
+                       }
+               } else {
+                       MWR_LOGI("%s does not have %s", info.engine_name.c_str(), appid.c_str());
+               }
+       }
+}
+
+void CWakeupEngineManager::set_wake_word_audio_require_flag(bool require)
+{
+       MWR_LOGD("[ENTER]");
+       mWakeWordAudioRequired = require;
+       for (const auto& info : mEngineInfo) {
+               if (info.interface.set_wake_word_audio_require_flag) {
+                       try {
+                               info.interface.set_wake_word_audio_require_flag(require);
+                       } catch (const std::exception& e) {
+                               MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
+                                       info.engine_name.c_str(), e.what());
+                       }
+               }
+       }
+}
+
+void CWakeupEngineManager::streaming_speech_data_thread_func()
+{
+       MWR_LOGE("[ENTER]");
+
+       if (nullptr == mSelectedEngine) {
+               MWR_LOGE("No Engine Selected");
+               return;
+       }
+
+       const wakeup_engine_interface *interface = &(mSelectedEngine->interface);
+
+       if (NULL == interface ||
+               NULL == interface->get_utterance_data ||
+               NULL == interface->get_utterance_data_count)
+               return;
+
+       MWR_LOGE("data_count : %s, %d",
+               mSelectedEngine->engine_name.c_str(),
+               interface->get_utterance_data_count());
+
+#ifdef BUF_SAVE_MODE
+       if (g_pFile) {
+               fclose(g_pFile);
+               g_pFile = NULL;
+       } else {
+               MWR_LOGD("[Recorder Info] File not found!");
+       }
+
+       while (1) {
+               snprintf(g_temp_file_name, sizeof(g_temp_file_name), "/tmp/ma_wue_%d_%d", getpid(), g_count);
+               int ret = access(g_temp_file_name, 0);
+
+               if (0 == ret) {
+                       MWR_LOGD("[Recorder ERROR] File is already exist");
+                       if (0 == remove(g_temp_file_name)) {
+                               MWR_LOGD("[Recorder] Remove file");
+                               break;
+                       } else {
+                               g_count++;
+                       }
+               } else {
+                       break;
+               }
+       }
+
+       MWR_LOGD("[Recorder] Temp file name=[%s]", g_temp_file_name);
+
+       /* open test file */
+       g_pFile = fopen(g_temp_file_name, "wb+x");
+       if (!g_pFile) {
+               MWR_LOGD("[Recorder ERROR] File not found!");
+               return;
+       }
+       g_count++;
+#endif
+
+       mas_speech_data speech_data;
+       int index = 0;
+       bool finish_event_sent = false;
+
+       if (mWakeWordAudioRequired &&
+               NULL != interface->get_wake_word_data &&
+               NULL != interface->get_wake_word_data_count) {
+               for (const auto& observer : mObservers) {
+                       if (observer) {
+                               if (!observer->on_audio_streaming_data_section(MA_AUDIO_STREAMING_DATA_SECTION_WAKE_WORD)) {
+                                       LOGE("[Recorder WARNING] One of the observer returned false");
+                               }
+                       }
+               }
+               int count = interface->get_wake_word_data_count();
+               while (!(mStopStreamingThread.load()) && index < count) {
+                       int ret = interface->get_wake_word_data(index, &speech_data);
+                       if (0 == ret) {
+#ifdef BUF_SAVE_MODE
+                               if (g_pFile)
+                                       fwrite(speech_data.buffer, 1, speech_data.len, g_pFile);
+#endif
+                               for (const auto& observer : mObservers) {
+                                       if (observer) {
+                                               if (!observer->on_streaming_audio_data(
+                                                       speech_data.event, speech_data.buffer, speech_data.len)) {
+                                                       LOGE("[Recorder WARNING] One of the observer returned false");
+                                               }
+                                       }
+                               }
+                       } else {
+                               break;
+                       }
+                       index++;
+               }
+               index = 0;
+               for (const auto& observer : mObservers) {
+                       if (observer) {
+                               if (!observer->on_audio_streaming_data_section(MA_AUDIO_STREAMING_DATA_SECTION_UTTERANCE)) {
+                                       LOGE("[Recorder WARNING] One of the observer returned false");
+                               }
+                       }
+               }
+       }
+
+       int burst_count = 0;
+       int sleep_count = 0;
+
+       while (!(mStopStreamingThread.load())) {
+               int ret = -1;
+               int cnt = 0;
+
+               /* get feedback data */
+               if (interface && interface->get_utterance_data) {
+                       ret = interface->get_utterance_data(index, &speech_data);
+                       mStreamingHistory.last_audio_fetched.store(get_current_milliseconds_after_epoch());
+
+                       if (0 != ret) {
+                               /* empty queue */
+                               MWR_LOGI("[DEBUG] No feedback data. Waiting mode : %d %d", ret, cnt);
+
+                               sleep_count = 0;
+                               /* waiting */
+                               while (!(mStopStreamingThread.load())) {
+                                       burst_count = 0;
+                                       if (++sleep_count >= 100) {
+                                               MWR_LOGI("Still waiting : %d %p %p", sleep_count,
+                                                       interface->get_utterance_data,
+                                                       interface->get_utterance_data_count);
+                                               sleep_count = 0;
+                                       }
+                                       this_thread::sleep_for(chrono::milliseconds(10));
+                                       if (index < interface->get_utterance_data_count()) {
+                                               MWR_LOGI("[INFO] Resume thread, %d", cnt);
+                                               break;
+                                       }
+                                       mStreamingHistory.last_count_fetched.store(get_current_milliseconds_after_epoch());
+                                       if (g_speech_pcm_wait_count < cnt) {
+                                               unsigned char final_buffer[2] = {'\0', };
+                                               MWR_LOGE("[ERROR] Wrong request, there's no pcm data : %d", cnt);
+#ifdef BUF_SAVE_MODE
+                                               if (g_pFile) {
+                                                       fwrite(final_buffer, 1, sizeof(final_buffer), g_pFile);
+                                                       MWR_LOGE("[Recorder SUCCESS] File Close");
+                                                       fclose(g_pFile);
+                                                       g_pFile = NULL;
+                                               }
+#endif
+                                               for (const auto& observer : mObservers) {
+                                                       if (observer) {
+                                                               if (!observer->on_streaming_audio_data(
+                                                                       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");
+                                                               }
+                                                               mStreamingHistory.last_audio_sent.store(get_current_milliseconds_after_epoch());
+                                                       }
+                                               }
+                                               return;
+                                       }
+                                       cnt++;
+                               }
+                               MWR_LOGD("[INFO] Finish to wait for new feedback data come");
+
+                               /* resume feedback thread */
+                               continue;
+                       }
+
+#ifdef BUF_SAVE_MODE
+                       if (g_pFile)
+                               fwrite(speech_data.buffer, 1, speech_data.len, g_pFile);
+
+                       if (MAS_SPEECH_STREAMING_EVENT_FINISH == speech_data.event) {
+                               if (g_pFile) {
+                                       MWR_LOGE("[Recorder SUCCESS] File Close");
+                                       fclose(g_pFile);
+                                       g_pFile = NULL;
+                               } else {
+                                       MWR_LOGE("[Recorder ERROR] File not found!");
+                               }
+                       }
+#endif
+                       const int sleep_duration_in_millis = 10;
+                       const int max_burst_count = 3;
+                       if (++burst_count >= max_burst_count) {
+                               burst_count = 0;
+                               MWR_LOGI("[INFO] Streaming data burst transmission detected, forcing sleep");
+                               this_thread::sleep_for(chrono::milliseconds(sleep_duration_in_millis));
+                       }
+                       for (const auto& observer : mObservers) {
+                               if (observer) {
+                                       if (!observer->on_streaming_audio_data(
+                                               speech_data.event, speech_data.buffer, speech_data.len)) {
+                                               LOGE("[Recorder WARNING] One of the observer returned false");
+                                       }
+                                       mStreamingHistory.last_audio_sent.store(get_current_milliseconds_after_epoch());
+                               }
+                       }
+
+                       if (MAS_SPEECH_STREAMING_EVENT_FINISH == speech_data.event) {
+                               MWR_LOGE("[INFO] Finish to get and send speech data");
+                               finish_event_sent = true;
+                               break;
+                       }
+
+                       index++;
+               }
+       }
+       MWR_LOGE("[INFO] Streaming loop exit");
+
+       if (true != finish_event_sent) {
+               unsigned char final_buffer[2] = {'\0', };
+               for (const auto& observer : mObservers) {
+                       if (observer) {
+                               MWR_LOGE("No FINISH event sent yet, adding to finalize streaming session");
+                               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");
+                               }
+                               mStreamingHistory.last_audio_sent.store(get_current_milliseconds_after_epoch());
+                       }
+               }
+#ifdef BUF_SAVE_MODE
+               if (g_pFile) {
+                       fwrite(final_buffer, 1, sizeof(final_buffer), g_pFile);
+                       MWR_LOGE("[Recorder SUCCESS] File Close");
+                       fclose(g_pFile);
+                       g_pFile = NULL;
+               }
+#endif
+       }
+
+       MWR_LOGE("[EXIT]");
+}
+
+void CWakeupEngineManager::start_streaming_current_utterance_data()
+{
+       MWR_LOGI("[ENTER]");
+       if (mStreamingThread.joinable()) {
+               MWR_LOGE("ERROR : mStreamingThread is joinable, will not start a new thread");
+               return;
+       }
+       mStreamingThread = thread(&CWakeupEngineManager::streaming_speech_data_thread_func, this);
+}
+
+void CWakeupEngineManager::stop_streaming_current_utterance_data()
+{
+       MWR_LOGI("[ENTER]");
+       if (mStreamingThread.joinable()) {
+               MWR_LOGE("mStreamingThread is joinable, trying join() %lld %lld %lld %lld",
+                       get_current_milliseconds_after_epoch(),
+                       mStreamingHistory.last_audio_fetched.load(),
+                       mStreamingHistory.last_count_fetched.load(),
+                       mStreamingHistory.last_audio_sent.load());
+               mStopStreamingThread.store(true);
+               mStreamingThread.join();
+       }
+       mStopStreamingThread.store(false);
+}
+
+void CWakeupEngineManager::update_manager_state(wakeup_manager_state_e state)
+{
+       for (const auto& info : mEngineInfo) {
+               if (info.interface.update_manager_state) {
+                       try {
+                               info.interface.update_manager_state(state);
+                       } catch (const std::exception& e) {
+                               MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
+                                       info.engine_name.c_str(), e.what());
+                       }
+               }
+       }
+       mWakeupManagerState = state;
+}
+
+void CWakeupEngineManager::update_recognition_result(string appid, int result)
+{
+       if (mSelectedEngine) {
+               if (mSelectedEngine->interface.update_recognition_result) {
+                       mSelectedEngine->interface.update_recognition_result(appid.c_str(), result);
+               }
+       }
+}
+
+void CWakeupEngineManager::engine_add_target_assistant(string engine_name, string appid)
+{
+       const auto& iter = find_if(mEngineInfo.begin(), mEngineInfo.end(),
+               [engine_name](const EngineInfo& info) {
+                       return (0 == info.engine_name.compare(engine_name));
+               });
+
+       if (mEngineInfo.end() == iter) {
+               /* Not found, add new library */
+               pkgmgrinfo_appinfo_h handle;
+               int ret = pkgmgrinfo_appinfo_get_appinfo(engine_name.c_str(), &handle);
+               if (PMINFO_R_OK == ret) {
+                       char *root_path = nullptr;
+                       ret = pkgmgrinfo_appinfo_get_root_path(handle, &root_path);
+                       if (PMINFO_R_OK == ret && nullptr != root_path) {
+                               string path = root_path;
+                               path += "/";
+                               path += MA_WAKEUP_DEDICATED_ENGINE_PATH;
+                               add_engine(engine_name, path);
+                       }
+                       pkgmgrinfo_appinfo_destroy_appinfo(handle);
+               }
+               /* Find again to add appid to the newly created engine's assistant list */
+               const auto &new_iter = find_if(mEngineInfo.begin(), mEngineInfo.end(),
+                       [engine_name](const EngineInfo& info) {
+                               return (0 == info.engine_name.compare(engine_name));
+                       });
+               if (mEngineInfo.end() != new_iter) {
+                       new_iter->assistant_list.push_back(appid);
+                       for (const auto& assistant : new_iter->assistant_list) {
+                               MWR_LOGI("Assistant List : %s %s", assistant.c_str(), new_iter->engine_name.c_str());
+                       }
+               }
+       } else {
+               /* If the engine already exists, simply add the appid to the assistant list */
+               iter->assistant_list.push_back(appid);
+               for (const auto& assistant : iter->assistant_list) {
+                       MWR_LOGI("Assistant List : %s %s", assistant.c_str(), iter->engine_name.c_str());
+               }
+       }
+}
+
+void CWakeupEngineManager::engine_add_wakeup_word(string appid, string wakeup_word, string language)
+{
+       for (const auto& info : mEngineInfo) {
+               bool found = contains(info.assistant_list, appid);
+               if (found) {
+                       if (info.interface.add_wakeup_word) {
+                               try {
+                                       info.interface.add_wakeup_word(appid.c_str(), wakeup_word.c_str(), language.c_str());
+                               } catch (const std::exception& e) {
+                                       MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
+                                               info.engine_name.c_str(), e.what());
+                               }
+                       } else {
+                               MWR_LOGE("Wakeup Engine does not provide add_wakeup_word");
+                       }
+               }
+       }
+}
+
+void CWakeupEngineManager::engine_remove_wakeup_word(string appid, string wakeup_word, string language)
+{
+       for (const auto& info : mEngineInfo) {
+               bool found = contains(info.assistant_list, appid);
+               if (found) {
+                       if (info.interface.remove_wakeup_word) {
+                               try {
+                                       info.interface.remove_wakeup_word(appid.c_str(), wakeup_word.c_str(), language.c_str());
+                               } catch (const std::exception& e) {
+                                       MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
+                                               info.engine_name.c_str(), e.what());
+                               }
+                       } else {
+                               MWR_LOGE("Wakeup Engine does not provide remove_wakeup_word");
+                       }
+               }
+       }
+}
+
+void CWakeupEngineManager::engine_set_assistant_specific_command(string appid, string command)
+{
+       for (const auto& info : mEngineInfo) {
+               bool found = contains(info.assistant_list, appid);
+               if (found) {
+                       if (info.interface.set_assistant_specific_command) {
+                               try {
+                                       info.interface.set_assistant_specific_command(appid.c_str(), command.c_str());
+                               } catch (const std::exception& e) {
+                                       MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
+                                               info.engine_name.c_str(), e.what());
+                               }
+                       }
+               }
+       }
+}
+
+void CWakeupEngineManager::engine_feed_audio_data(long time, void* data, int len)
+{
+       bool print = false;
+       const std::chrono::seconds interval(3);
+       static auto last = std::chrono::steady_clock::now();
+       auto now = std::chrono::steady_clock::now();
+       if (now - last > interval) {
+               print = true;
+               last = now;
+       }
+       for (const auto& info : mEngineInfo) {
+               bool filtered_out = false;
+               if (info.activated &&
+                       info.audio_data_require_status &&
+                       info.interface.feed_audio_data) {
+                       try {
+                               /* After a wakeup event, wakeup engines other than the selected one
+                                  does not need to receive audio data. */
+                               if (WAKEUP_MANAGER_STATE_UTTERANCE == mWakeupManagerState) {
+                                       if (mSelectedEngine && &info != mSelectedEngine) {
+                                               filtered_out = true;
+                                       }
+                               }
+                               if (!filtered_out) {
+                                       int ret = info.interface.feed_audio_data(time, data, len);
+                                       if (ret != 0 || print) {
+                                               LOGE("Feed speech data, ret(%d) : %s", ret, info.engine_name.c_str());
+                                       }
+                               }
+                       } catch (const std::exception& e) {
+                               MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
+                                       info.engine_name.c_str(), e.what());
+                       }
+               }
+               if (print) {
+                       MWR_LOGE("Feeding audio data to %s : %d %d %p %d",
+                               info.engine_name.c_str(),
+                               info.activated, info.audio_data_require_status,
+                               info.interface.feed_audio_data, filtered_out);
+               }
+       }
+}
+
+void CWakeupEngineManager::engine_set_dependency_module_command(string engine_name, string command)
+{
+       const auto& iter = find_if(mEngineInfo.begin(), mEngineInfo.end(),
+               [engine_name](const EngineInfo& info) {
+                       return (0 == info.engine_name.compare(engine_name));
+               });
+
+       if (mEngineInfo.end() != iter) {
+               if (iter->activated &&
+                       iter->interface.set_dependency_module_command) {
+                       try {
+                               int ret = iter->interface.set_dependency_module_command(command.c_str());
+                               if (0 != ret) {
+                                       LOGE("[ERROR] Fail to set dependency module command, ret(%d) : %s",
+                                               ret, iter->engine_name.c_str());
+                               }
+                       } catch (const std::exception& e) {
+                               MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
+                                       iter->engine_name.c_str(), e.what());
+                       }
+               }
+       }
+}
+
+bool CWakeupEngineManager::on_wakeup_event(string engine_name, mas_wakeup_event_info info)
+{
+       MWR_LOGD("[ENTER]");
+
+       for (const auto& observer : mObservers) {
+               if (observer) {
+                       if (!observer->on_wakeup_event(engine_name, info)) {
+                               LOGE("[Recorder WARNING] One of the observer returned false");
+                       }
+               }
+       }
+
+       return true;
+}
+
+bool CWakeupEngineManager::on_speech_status(string engine_name, mas_speech_status_e status)
+{
+       MWR_LOGD("[ENTER]");
+
+       for (const auto& observer : mObservers) {
+               if (observer) {
+                       if (!observer->on_speech_status(engine_name, status)) {
+                               LOGE("[Recorder WARNING] One of the observer returned false");
+                       }
+               }
+       }
+
+       return true;
+}
+
+bool CWakeupEngineManager::on_error(string engine_name, int error_code, string error_message)
+{
+       MWR_LOGD("[ENTER]");
+
+       for (const auto& observer : mObservers) {
+               if (observer) {
+                       if (!observer->on_error(engine_name, error_code, error_message)) {
+                               LOGE("[Recorder WARNING] One of the observer returned false");
+                       }
+               }
+       }
+
+       return true;
+}
+
+bool CWakeupEngineManager::on_audio_data_require_status(string engine_name, bool require)
+{
+       MWR_LOGI("[ENTER] %s, %d", engine_name.c_str(), require);
+
+       bool found = false;
+       // LOCK REQUIRED
+       int count = 0;
+       for (auto& info : mEngineInfo) {
+               if (info.engine_name.compare(engine_name) == 0) {
+                       found = true;
+                       info.audio_data_require_status = require;
+               }
+               if (info.activated && info.audio_data_require_status) {
+                       count++;
+               }
+       }
+       MWR_LOGD("count : %d", count);
+       if (count > 0) {
+               mAudioDataRequired = true;
+       } else {
+               mAudioDataRequired = false;
+       }
+
+       if (found) {
+               for (const auto& observer : mObservers) {
+                       if (observer) {
+                               if (!observer->on_audio_data_require_status(engine_name, require)) {
+                                       LOGE("[Recorder WARNING] One of the observer returned false");
+                               }
+                       }
+               }
+       }
+       // UNLOCK REQUIRED
+       return true;
+}
+
+bool CWakeupEngineManager::on_wakeup_engine_command(string engine_name, mas_wakeup_engine_command_target_e target, string assistant_name, string command)
+{
+       MWR_LOGI("[ENTER] : %s %d %s %s",
+               engine_name.c_str(), target, assistant_name.c_str(), command.c_str());
+
+       for (const auto& observer : mObservers) {
+               if (observer) {
+                       if (MAS_WAKEUP_ENGINE_COMMAND_TARGET_DEPENDENCY_MODULE == target) {
+                               if (!observer->on_wakeup_engine_command(target, engine_name, assistant_name, command)) {
+                                       LOGE("[Recorder WARNING] One of the observer returned false");
+                               }
+                       } else {
+                               const auto& iter = find_if(mEngineInfo.begin(), mEngineInfo.end(),
+                                       [engine_name](const EngineInfo& info) {
+                                               return (0 == info.engine_name.compare(engine_name));
+                                       });
+                               if (mEngineInfo.end() != iter) {
+                                       for (const auto& assistant : iter->assistant_list) {
+                                               if (0 == assistant_name.compare(assistant) ||
+                                                       MAS_WAKEUP_ENGINE_COMMAND_TARGET_ALL_ASSISTANTS == target) {
+                                                               MWR_LOGI("Calling on_wakeup_engine_command for %s", assistant.c_str());
+                                                       if (!observer->on_wakeup_engine_command(target, engine_name, assistant, command)) {
+                                                               LOGE("[Recorder WARNING] One of the observer returned false");
+                                                       }
+                                               }
+                                       }
+                               }
+                       }
+               }
+       }
+
+       return true;
+}
+
+void CWakeupEngineManager::add_engine(string name, string path)
+{
+       MWR_LOGE("Name (%s), Filepath(%s)", name.c_str(), path.c_str());
+
+       char* error = NULL;
+       EngineInfo info;
+       info.engine_handle = dlopen(path.c_str(), RTLD_LAZY);
+       if (nullptr != (error = dlerror()) || nullptr == info.engine_handle) {
+               MWR_LOGE("[ERROR] Fail to dlopen(%s), error(%s)", path.c_str(), error);
+               if (info.engine_handle) dlclose(info.engine_handle);
+               info.engine_handle = nullptr;
+               return;
+       }
+
+       /* Interfaces without version information */
+       info.interface.initialize =
+               (wakeup_engine_initialize)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_INITIALIZE);
+       info.interface.deinitialize =
+               (wakeup_engine_deinitialize)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_DEINITIALIZE);
+       info.interface.activate =
+               (wakeup_engine_activate)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_ACTIVATE);
+       info.interface.deactivate =
+               (wakeup_engine_deactivate)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_DEACTIVATE);
+       info.interface.add_wakeup_word =
+               (wakeup_engine_add_wakeup_word)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_ADD_WAKEUP_WORD);
+       info.interface.remove_wakeup_word =
+               (wakeup_engine_remove_wakeup_word)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_REMOVE_WAKEUP_WORD);
+       info.interface.add_language =
+               (wakeup_engine_add_language)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_ADD_LANGUAGE);
+       info.interface.set_language =
+               (wakeup_engine_set_language)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_SET_LANGUAGE);
+       info.interface.update_manager_state =
+               (wakeup_engine_update_manager_state)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_UPDATE_MANAGER_STATE);
+       info.interface.update_recognition_result =
+               (wakeup_engine_update_recognition_result)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_UPDATE_RECOGNITION_RESULT);
+       info.interface.set_audio_format =
+               (wakeup_engine_set_audio_format)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_SET_AUDIO_FORMAT);
+       info.interface.get_audio_format =
+               (wakeup_engine_get_audio_format)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_GET_AUDIO_FORMAT);
+       info.interface.feed_audio_data =
+               (wakeup_engine_feed_audio_data)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_FEED_AUDIO_DATA);
+       info.interface.get_utterance_data_count =
+               (wakeup_engine_get_utterance_data_count)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_GET_UTTERANCE_DATA_COUNT);
+       info.interface.get_utterance_data =
+               (wakeup_engine_get_utterance_data)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_GET_UTTERANCE_DATA);
+       info.interface.get_wake_word_data_count =
+               (wakeup_engine_get_wake_word_data_count)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_GET_WAKE_WORD_DATA_COUNT);
+       info.interface.get_wake_word_data =
+               (wakeup_engine_get_wake_word_data)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_GET_WAKE_WORD_DATA);
+       info.interface.set_assistant_specific_command =
+               (wakeup_engine_set_assistant_specific_command)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_SET_ASSISTANT_SPECIFIC_COMMAND);
+       info.interface.set_wake_word_audio_require_flag =
+               (wakeup_engine_set_wake_word_audio_require_flag)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_SET_WAKE_WORD_AUDIO_REQUIRE_FLAG);
+       info.interface.set_wakeup_event_callback =
+               (wakeup_engine_set_wakeup_event_callback)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_SET_WAKEUP_EVENT_CALLBACK);
+       info.interface.set_speech_status_callback =
+               (wakeup_engine_set_speech_status_callback)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_SET_SPEECH_STATUS_CALLBACK);
+       info.interface.set_error_callback =
+               (wakeup_engine_set_error_callback)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_SET_ERROR_CALLBACK);
+       info.interface.set_audio_data_require_status_callback =
+               (wakeup_engine_set_audio_data_require_status_callback)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_SET_AUDIO_DATA_REQUIRE_STATUS_CALLBACK);
+       info.interface.set_wakeup_engine_command_callback =
+               (wakeup_engine_set_wakeup_engine_command_callback)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_SET_WAKEUP_ENGINE_COMMAND_CALLBACK);
+
+       /* Interfaces after version 1 */
+       info.interface.get_version =
+               (wakeup_engine_get_version)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_GET_VERSION);
+       info.interface.set_dependency_module_command =
+               (wakeup_engine_set_dependency_module_command)dlsym(info.engine_handle,
+               MA_WAKEUP_ENGINE_FUNC_SET_DEPENDENCY_MODULE_COMMAND);
+
+       if (info.interface.initialize == nullptr) {
+               MWR_LOGE("[ERROR] Initialize interface does not exist, skipping %s", path.c_str());
+               if (info.engine_handle) dlclose(info.engine_handle);
+               info.engine_handle = nullptr;
+               return;
+       }
+
+       info.version = 0;
+       info.engine_path = path;
+       info.engine_name = name;
+
+       info.activated = false;
+       info.audio_data_require_status = false;
+
+       /* All the necessary information has already been set properly */
+       mEngineInfo.push_back(info);
+
+       /* Workaround for registering C-style callbacks */
+       typedef struct {
+               CWakeupEngineManager *manager;
+               string engine_name;
+       } CallbackUserData;
+
+       static deque<CallbackUserData> callback_user_data;
+
+       CallbackUserData user_data;
+       user_data.manager = this;
+       user_data.engine_name = info.engine_name;
+       callback_user_data.push_back(user_data);
+
+       MWR_LOGI("Initializing wakeup engine : %s %p %p",
+               info.engine_path.c_str(),
+               info.interface.initialize,
+               &callback_user_data.back());
+
+       try {
+               if (info.interface.set_wakeup_event_callback) {
+                       info.interface.set_wakeup_event_callback(
+                               [](mas_wakeup_event_info info, void* user_data) {
+                                       MWR_LOGI("user_data : %p", user_data);
+                                       CallbackUserData *data = static_cast<CallbackUserData*>(user_data);
+                                       if (nullptr == data) return;
+                                       if (nullptr == data->manager) return;
+                                       info.wakeup_engine = data->engine_name.c_str();
+                                       data->manager->on_wakeup_event(data->engine_name, info);
+                               }, &(callback_user_data.back()));
+               }
+
+               if (info.interface.set_audio_data_require_status_callback) {
+                       info.interface.set_audio_data_require_status_callback(
+                               [](bool require, void* user_data) {
+                                       MWR_LOGI("user_data : %p", user_data);
+                                       CallbackUserData *data = static_cast<CallbackUserData*>(user_data);
+                                       if (nullptr == data) return;
+                                       if (nullptr == data->manager) return;
+                                       data->manager->on_audio_data_require_status(data->engine_name, require);
+                               }, &(callback_user_data.back()));
+               }
+
+               if (info.interface.set_wakeup_engine_command_callback) {
+                       info.interface.set_wakeup_engine_command_callback(
+                               [](mas_wakeup_engine_command_target_e target,
+                                       const char* assistant_name, const char* command, void* user_data) {
+                                       MWR_LOGI("user_data : %p", user_data);
+                                       CallbackUserData* data = static_cast<CallbackUserData*>(user_data);
+                                       if (nullptr == data) return;
+                                       if (nullptr == data->manager) return;
+                                       if (nullptr == command) return;
+                                       data->manager->on_wakeup_engine_command(
+                                               data->engine_name, target, (assistant_name ? assistant_name : ""), command);
+                               }, &(callback_user_data.back()));
+               }
+
+               if (info.interface.initialize) {
+                       info.interface.initialize();
+               }
+               if (info.interface.get_version) {
+                       int version;
+                       if (0 == info.interface.get_version(&version)) {
+                               info.version = version;
+                       }
+               }
+       } catch (const std::exception& e) {
+               MWR_LOGE("[ERROR] wakeup engine %s threw exception : %s",
+                       info.engine_name.c_str(), e.what());
+       }
+}
+
+void CWakeupEngineManager::add_engine_directory(string name, string path)
+{
+       if (0 == path.size()) return;
+
+       DIR* dp = opendir(path.c_str());
+       if (NULL == dp) {
+               MWR_LOGD("Failed opening directory : %s", path.c_str());
+       } else {
+               struct dirent *dirp = NULL;
+               string filepath;
+               do {
+                       dirp = readdir(dp);
+
+                       if (NULL != dirp) {
+                               if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name))
+                                       continue;
+
+                               if (DT_REG != dirp->d_type) /* If not a regular file */
+                                       continue;
+
+                               filepath = path;
+                               filepath += "/";
+                               filepath += dirp->d_name;
+
+                               if (filepath.length() >= _POSIX_PATH_MAX) {
+                                       MWR_LOGD("File path is too long : %s", filepath.c_str());
+                                       closedir(dp);
+                                       return;
+                               }
+                               add_engine(name, filepath);
+                       }
+               } while (NULL != dirp);
+
+               closedir(dp);
+       }
+}
+
+} // wakeup
+} // multiassistant
diff --git a/wakeup-manager/src/wakeup_manager.cpp b/wakeup-manager/src/wakeup_manager.cpp
new file mode 100644 (file)
index 0000000..516669f
--- /dev/null
@@ -0,0 +1,1427 @@
+/*
+ * 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.
+ */
+
+#include "wakeup_manager.h"
+#include "wakeup_manager_main.h"
+#include "wakeup_policy_default.h"
+#include "wakeup_policy_external.h"
+#include "dependency_resolver.h"
+
+#include <algorithm>
+#include <iostream>
+#include <map>
+
+#include <boost/optional.hpp>
+
+namespace multiassistant
+{
+namespace wakeup
+{
+
+static bool check_language_valid(string language)
+{
+       bool valid = true;
+       if (0 == language.length()) {
+               valid = false;
+       }
+       return valid;
+}
+
+static bool initialize_wakeup_event_info(mas_wakeup_event_info* wakeup_info)
+{
+       bool ret = false;
+       if (wakeup_info) {
+               ret = true;
+
+               wakeup_info->wakeup_appid = nullptr;
+               wakeup_info->wakeup_word = nullptr;
+               wakeup_info->wakeup_language = nullptr;
+               wakeup_info->wakeup_voice_id = nullptr;
+               wakeup_info->wakeup_engine = nullptr;
+               wakeup_info->wakeup_confidence_score = 0.0f;
+
+               wakeup_info->wakeup_start_time = 0;
+               wakeup_info->wakeup_end_time = 0L;
+               wakeup_info->wakeup_time_valid = false;
+
+               wakeup_info->extra_data = nullptr;
+               wakeup_info->extra_data_length = 0;
+               wakeup_info->extra_data_description = nullptr;
+       }
+       return ret;
+}
+
+static map<string, string> get_custom_vconf_keys()
+{
+       map<string, string> vconf_keys;
+       char* custom_key = NULL;
+
+       vconf_keys.clear();
+       dependency_resolver_get_custom_vconf_key(WAKEUP_VCONF_KEY_DEFAULT_ASSISTANT_APPID, &custom_key);
+       vconf_keys.insert({WAKEUP_VCONF_KEY_DEFAULT_ASSISTANT_APPID, custom_key ? custom_key : WAKEUP_VCONF_KEY_DEFAULT_ASSISTANT_APPID});
+
+       if (custom_key) {
+               free(custom_key);
+               custom_key = nullptr;
+       }
+
+       dependency_resolver_get_custom_vconf_key(WAKEUP_VCONF_KEY_ENABLED_ASSISTANTS, &custom_key);
+       vconf_keys.insert({WAKEUP_VCONF_KEY_ENABLED_ASSISTANTS, custom_key ? custom_key : WAKEUP_VCONF_KEY_ENABLED_ASSISTANTS});
+
+       if (custom_key) {
+               free(custom_key);
+               custom_key = nullptr;
+       }
+
+       dependency_resolver_get_custom_vconf_key(WAKEUP_VCONF_KEY_WAKE_WORD_DETECTION_ENABLED, &custom_key);
+       vconf_keys.insert({WAKEUP_VCONF_KEY_WAKE_WORD_DETECTION_ENABLED, custom_key ? custom_key : WAKEUP_VCONF_KEY_WAKE_WORD_DETECTION_ENABLED});
+
+       if (custom_key) {
+               free(custom_key);
+               custom_key = nullptr;
+       }
+
+       return vconf_keys;
+}
+
+CWakeupManager::CWakeupManager(IWakeupEventObserver* wakeup_observer, ISettingValueObserver* setting_observer)
+{
+       initialize_wakeup_event_info(&mLastWakeupEventInfo);
+
+       if (wakeup_observer) {
+               subscribe_wakeup_observer(wakeup_observer);
+       }
+       if (setting_observer) {
+               subscribe_setting_observer(setting_observer);
+       }
+}
+
+CWakeupManager::~CWakeupManager()
+{
+       MWR_LOGI("Wakeup Manager is now being destroyed");
+}
+
+void CWakeupManager::initialize_wakeup_policy()
+{
+       mWakeupPolicy.reset(new CWakeupPolicyExternal{&mPolicyEventObserver});
+       if (nullptr == mWakeupPolicy || !(mWakeupPolicy->valid())) {
+               mWakeupPolicy.reset(new CWakeupPolicyDefault{&mPolicyEventObserver});
+
+               /* Default Policy specific initialization */
+               CWakeupPolicyDefault *policy =
+                       dynamic_cast<CWakeupPolicyDefault*>(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());
+                       }
+               }
+       }
+}
+
+bool CWakeupManager::initialize()
+{
+       MWR_LOGE("[ENTER]");
+       std::cerr << "WakeupManager Initialize" << std::endl;
+
+       mPolicyEventObserver.set_wakeup_manager(this);
+       mEngineEventObserver.set_wakeup_manager(this);
+       mAudioEventObserver.set_wakeup_manager(this);
+       mSettingsEventObserver.set_wakeup_manager(this);
+
+       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_command = wakeup_manager_set_dependency_module_command;
+       interface.wakeup_assistant = wakeup_manager_wakeup_assistant;
+
+       dependency_resolver_initialize(interface);
+
+       mWakeupSettings.subscribe(&mSettingsEventObserver);
+       mWakeupSettings.initialize(get_custom_vconf_keys());
+
+       mAudioEventObserver.set_wakeup_engine_manager(&mWakeupEngineManager);
+       mAudioManager.subscribe(&mAudioEventObserver);
+       mAudioManager.initialize();
+
+       mWakeupEngineManager.subscribe(&mEngineEventObserver);
+       mWakeupEngineManager.initialize();
+
+       mAssistantConfigManager.initialize();
+
+       initialize_wakeup_policy();
+       start_periodic_monitor_timer();
+
+       MWR_LOGD("[END]");
+       return true;
+}
+
+bool CWakeupManager::deinitialize()
+{
+       MWR_LOGE("[ENTER]");
+       std::cerr << "WakeupManager Deinitialize" << std::endl;
+
+       stop_periodic_monitor_timer();
+       stop_streaming_duration_timer();
+
+       dependency_resolver_deinitialize();
+
+       mAssistantConfigManager.deinitialize();
+
+       mWakeupEngineManager.unsubscribe(&mEngineEventObserver);
+       mWakeupEngineManager.deinitialize();
+
+       mAudioManager.unsubscribe(&mAudioEventObserver);
+       mAudioManager.deinitialize();
+
+       mWakeupSettings.deinitialize();
+       mAssistantLanguageInfo.clear();
+
+       MWR_LOGE("[END]");
+       return true;
+}
+
+void CWakeupManager::subscribe_wakeup_observer(IWakeupEventObserver *observer)
+{
+       mWakeupObservers.push_back(observer);
+}
+
+void CWakeupManager::unsubscribe_wakeup_observer(IWakeupEventObserver *observer)
+{
+       auto iter = find(mWakeupObservers.begin(), mWakeupObservers.end(), observer);
+       if (iter != mWakeupObservers.end()) {
+               mWakeupObservers.erase(iter);
+       }
+}
+
+void CWakeupManager::subscribe_setting_observer(ISettingValueObserver* observer)
+{
+       mSettingObservers.push_back(observer);
+}
+
+void CWakeupManager::unsubscribe_setting_observer(ISettingValueObserver* observer)
+{
+       auto iter = find(mSettingObservers.begin(), mSettingObservers.end(), observer);
+       if (iter != mSettingObservers.end()) {
+               mSettingObservers.erase(iter);
+       }
+}
+
+bool CWakeupManager::activate(void)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (WAKEUP_MANAGER_STATE_INACTIVE != mWakeupManagerState)
+               return false;
+
+       /* Activate assistants that supports current voice input language */
+       set_language(mWakeupSettings.get_current_language());
+
+       change_manager_state(WAKEUP_MANAGER_STATE_LISTENING);
+       if (mWakeupEngineManager.get_audio_data_required()) {
+               mAudioManager.set_recording_session(RECORDING_SESSION_WAKE_WORD);
+               mAudioManager.start_recording(true);
+       }
+
+       MWR_LOGD("[END]");
+       return true;
+}
+
+bool CWakeupManager::deactivate(void)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (WAKEUP_MANAGER_STATE_INACTIVE == mWakeupManagerState)
+               return false;
+
+       mAudioManager.stop_recording(true);
+       mRecordingByVoiceKey = false;
+       change_manager_state(WAKEUP_MANAGER_STATE_INACTIVE);
+
+       stop_streaming_utterance_data();
+       stop_streaming_previous_utterance_data();
+       stop_streaming_follow_up_data();
+
+       MWR_LOGD("[END]");
+       return true;
+}
+
+bool CWakeupManager::add_assistant_language(string appid, string language)
+{
+       MWR_LOGI("[ENTER]");
+       bool found = false;
+       for (auto& info : mAssistantLanguageInfo) {
+               if(0 == info.appid.compare(appid)) {
+                       info.languageList.push_back(language);
+                       found = true;
+               }
+       }
+       if(false == found) {
+               AssistantLanguageInfo info;
+               info.appid = appid;
+               info.languageList.push_back(language);
+               mAssistantLanguageInfo.push_back(info);
+       }
+       if (0 == mCurrentLanguage.compare(language)) {
+               mAssistantSupportsCurrentLanguage[appid] = true;
+               if (true == mAssistantEnabled[appid]) {
+                       mWakeupEngineManager.set_assistant_activated(appid, true);
+               }
+       }
+       MWR_LOGD("[END]");
+       return true;
+}
+
+bool CWakeupManager::add_assistant_wakeup_word(string appid, string wakeup_word, string language)
+{
+       MWR_LOGI("[ENTER]");
+
+       mWakeupEngineManager.engine_add_wakeup_word(appid, wakeup_word, language);
+
+       MWR_LOGD("[END]");
+       return true;
+}
+
+bool CWakeupManager::remove_assistant_wakeup_word(string appid, string wakeup_word, string language)
+{
+       MWR_LOGI("[ENTER]");
+
+       mWakeupEngineManager.engine_remove_wakeup_word(appid, wakeup_word, language);
+
+       MWR_LOGD("[END]");
+       return true;
+}
+
+bool CWakeupManager::add_assistant_wakeup_engine(string appid, string engine)
+{
+       MWR_LOGI("[ENTER] %s %s", appid.c_str(), engine.c_str());
+
+       vector<string> disabled_assistants = mWakeupSettings.get_wake_word_disabled_assistants();
+       auto iter = find(disabled_assistants.begin(), disabled_assistants.end(), appid);
+       if (iter != disabled_assistants.end())
+               return true;
+
+       bool found = false;
+       if (mWakeupSettings.get_multiple_mode()) {
+               vector<string> assistants = mWakeupSettings.get_enabled_assistants();
+               iter = find(assistants.begin(), assistants.end(), appid);
+               if (iter != assistants.end())
+                       found = true;
+       } else {
+               if (0 == appid.compare(mWakeupSettings.get_default_assistant_appid()))
+                       found = true;
+       }
+
+       if (found)
+               mWakeupEngineManager.engine_add_target_assistant(engine, appid);
+
+       MWR_LOGD("[END]");
+       return true;
+}
+
+bool CWakeupManager::set_assistant_language(string appid, string language)
+{
+       MWR_LOGI("[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;
+}
+
+bool CWakeupManager::set_assistant_enabled(string appid, bool enabled)
+{
+       MWR_LOGI("[ENTER]");
+
+       mAssistantEnabled[appid] = enabled;
+       bool activated = enabled;
+       if (false == mAssistantSupportsCurrentLanguage[appid]) {
+               activated = false;
+       }
+       if (0 == appid.compare(mWakeupSettings.get_default_assistant_appid())) {
+               activated = true;
+       }
+       mWakeupEngineManager.set_assistant_activated(appid, activated);
+
+       MWR_LOGD("[END]");
+       return true;
+}
+
+bool CWakeupManager::set_default_assistant(string appid)
+{
+       MWR_LOGE("[ENTER] %s %s", appid.c_str(), mCurrentDefaultAssistant.c_str());
+
+       /* Passing 'expected' as true since MAS is changing the default assistant config */
+       process_default_assistant_changed(appid, true);
+
+       mWakeupSettings.set_default_assistant_appid(appid);
+
+       return true;
+}
+
+bool CWakeupManager::process_default_assistant_changed(string appid, bool expected)
+{
+       MWR_LOGE("[ENTER] %s %s", appid.c_str(), mCurrentDefaultAssistant.c_str());
+
+       if (mCurrentDefaultAssistant.compare(appid) == 0) {
+               MWR_LOGE("Default assistant appid not changed, ignoring...");
+               return false;
+       }
+
+       if (mWakeupManagerState == WAKEUP_MANAGER_STATE_UTTERANCE ||
+               mWakeupManagerState == WAKEUP_MANAGER_STATE_PROCESSING) {
+               if (expected) {
+                       stop_streaming_utterance_data();
+                       stop_streaming_previous_utterance_data();
+                       stop_streaming_follow_up_data();
+
+                       mWakeupEngineManager.update_recognition_result(appid, MA_RECOGNITION_RESULT_EVENT_ERROR);
+               } else {
+                       /* If this is an unexpected change, invalidate previous recognition process */
+                       update_recognition_result(mCurrentDefaultAssistant, MA_RECOGNITION_RESULT_EVENT_ERROR);
+               }
+       }
+
+       /* Check if previous default assistant has to be deactivated */
+       bool activated = true;
+       if (false == mAssistantSupportsCurrentLanguage[mCurrentDefaultAssistant]) {
+               activated = false;
+       }
+       if (false == mAssistantEnabled[mCurrentDefaultAssistant]) {
+               activated = false;
+       }
+       mWakeupEngineManager.set_assistant_activated(mCurrentDefaultAssistant, activated);
+
+       /* New default assistant has to be activated no matter what */
+       mWakeupEngineManager.set_assistant_activated(appid, true);
+
+       mCurrentDefaultAssistant = appid;
+
+       MWR_LOGD("[END]");
+       return true;
+}
+
+string CWakeupManager::get_default_assistant()
+{
+       return mWakeupSettings.get_default_assistant_appid();
+}
+
+bool CWakeupManager::get_assistant_enabled(string appid)
+{
+       return mAssistantEnabled[appid];
+}
+
+bool CWakeupManager::set_language(string language)
+{
+       bool valid = false;
+       MWR_LOGI("[ENTER] : %s", language.c_str());
+
+       if (check_language_valid(language)) {
+               mCurrentLanguage = language;
+               valid = true;
+       } else {
+               MWR_LOGE("[ERROR] Invalid language (%s)", language.c_str());
+       }
+
+       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;
+                       }
+                       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;
+               }
+
+               if (false == mAssistantEnabled[info.appid]) {
+                       disable = true;
+               }
+               if (0 == info.appid.compare(mWakeupSettings.get_default_assistant_appid())) {
+                       /* 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 valid;
+}
+
+bool CWakeupManager::get_recording_by_voice_key()
+{
+       return mRecordingByVoiceKey;
+}
+
+void CWakeupManager::set_recording_by_voice_key(bool recording)
+{
+       mRecordingByVoiceKey = recording;
+}
+
+STREAMING_MODE CWakeupManager::get_streaming_mode()
+{
+       return mStreamingMode;
+}
+
+bool CWakeupManager::set_streaming_mode(STREAMING_MODE mode)
+{
+       lock_guard<mutex> lock(mMutex);
+       mStreamingMode = mode;
+       return true;
+}
+
+bool CWakeupManager::change_manager_state(wakeup_manager_state_e state)
+{
+       MWR_LOGI("[ENTER] : %d", 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;
+}
+
+wakeup_manager_state_e CWakeupManager::get_manager_state()
+{
+       return mWakeupManagerState;
+}
+
+bool CWakeupManager::update_voice_feedback_state(string appid, bool state)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (state) {
+               if (WAKEUP_MANAGER_STATE_LISTENING == mWakeupManagerState ||
+                       WAKEUP_MANAGER_STATE_PROCESSING == mWakeupManagerState) {
+                       change_manager_state(WAKEUP_MANAGER_STATE_VOICE_FEEDBACK);
+               }
+       } else {
+               if (WAKEUP_MANAGER_STATE_VOICE_FEEDBACK == mWakeupManagerState) {
+                       change_manager_state(WAKEUP_MANAGER_STATE_LISTENING);
+               }
+       }
+
+       MWR_LOGD("[END]");
+       return true;
+}
+
+bool CWakeupManager::set_assistant_specific_command(string appid, string command)
+{
+       MWR_LOGI("[ENTER]");
+
+       /*
+       static const string voice_key_pressed{"voice_key_pressed"};
+       static const string voice_key_released{"voice_key_released"};
+
+       if (0 == command.compare(voice_key_pressed)) {
+               process_event(MA_PLUGIN_EVENT_VOICE_KEY_PRESSED, NULL, 0);
+       } else if (0 == command.compare(voice_key_released)) {
+               process_event(MA_PLUGIN_EVENT_VOICE_KEY_RELEASED, NULL, 0);
+       }
+       */
+
+       mWakeupEngineManager.engine_set_assistant_specific_command(appid, command);
+
+       MWR_LOGD("[END]");
+       return true;
+}
+
+bool CWakeupManager::set_background_volume(string appid, double ratio)
+{
+       MWR_LOGD("[DEBUG] set background volume (%f)", ratio);
+
+       int ret = 0;
+       mAudioManager.set_background_volume(ratio);
+       return ret;
+}
+
+bool CWakeupManager::update_recognition_result(string appid, int result)
+{
+       MWR_LOGI("[ENTER]");
+
+       stop_streaming_utterance_data();
+       stop_streaming_previous_utterance_data();
+       stop_streaming_follow_up_data();
+
+       mAudioManager.set_recording_session(RECORDING_SESSION_WAKE_WORD);
+       mWakeupEngineManager.update_recognition_result(appid, result);
+       if (WAKEUP_MANAGER_STATE_PROCESSING == mWakeupManagerState ||
+               WAKEUP_MANAGER_STATE_UTTERANCE == mWakeupManagerState) {
+               change_manager_state(WAKEUP_MANAGER_STATE_LISTENING);
+       }
+       MWR_LOGD("[END]");
+       return true;
+}
+
+static long long get_current_milliseconds_after_epoch()
+{
+       auto now = chrono::steady_clock::now();
+       auto now_ms = chrono::time_point_cast<chrono::milliseconds>(now);
+       /* number of milliseconds since the epoch of system_clock */
+       auto value = now_ms.time_since_epoch();
+
+       return value.count();
+}
+
+bool CWakeupManager::process_plugin_event(mas_plugin_event_e event, void* data, int len)
+{
+       MWR_LOGE("[ENTER] : %d", event);
+       if (WAKEUP_MANAGER_STATE_INACTIVE == mWakeupManagerState)
+               return false;
+
+       bool start_recording = false;
+       bool stop_recording = false;
+
+       boost::optional<ma_voice_key_status_e> next_voice_key_status;
+       if (MAS_PLUGIN_EVENT_VOICE_KEY_PRESSED == event) {
+               if (STREAMING_MODE::FOLLOW_UP == mStreamingMode) {
+                       MWR_LOGE("Voice key pressed, but currently streaming follow_up audio");
+               } else {
+                       if (VOICE_KEY_SUPPORT_MODE_NONE != mCurrentVoiceKeySupportMode) {
+                               start_recording = true;
+                       }
+               }
+               next_voice_key_status = MA_VOICE_KEY_STATUS_PRESSED;
+       } else if (MAS_PLUGIN_EVENT_VOICE_KEY_RELEASED_AFTER_PUSH == event) {
+               if (VOICE_KEY_SUPPORT_MODE_PUSH_TO_TALK == mCurrentVoiceKeySupportMode ||
+                       VOICE_KEY_SUPPORT_MODE_ALL == mCurrentVoiceKeySupportMode) {
+                       stop_recording = true;
+               }
+               next_voice_key_status = MA_VOICE_KEY_STATUS_RELEASED_AFTER_PUSH;
+       } else if (MAS_PLUGIN_EVENT_VOICE_KEY_RELEASED_AFTER_TAP == event) {
+               if (VOICE_KEY_SUPPORT_MODE_PUSH_TO_TALK == mCurrentVoiceKeySupportMode) {
+                       stop_recording = true;
+               }
+               next_voice_key_status = MA_VOICE_KEY_STATUS_RELEASED_AFTER_TAP;
+       }
+
+       if (start_recording) {
+               mRecordingByVoiceKey = true;
+
+               mAudioManager.stop_recording(true);
+
+               stop_streaming_utterance_data();
+               stop_streaming_previous_utterance_data();
+               stop_streaming_follow_up_data();
+
+               mAudioManager.clear_audio_data();
+               change_manager_state(WAKEUP_MANAGER_STATE_UTTERANCE);
+
+               /* Start recorder thread using appropriate recording device */
+               mAudioManager.set_recording_session(RECORDING_SESSION_UTTERANCE);
+               mAudioManager.start_recording(true);
+
+               /* Wakeup default assistant */
+               /* TODO: apply conversation timeout for selecting assistant here */
+               mas_wakeup_event_info wakeup_info;
+               initialize_wakeup_event_info(&wakeup_info);
+               /* Make sure to use background data */
+               wakeup_info.wakeup_time_valid = true;
+               wakeup_info.wakeup_end_time = get_current_milliseconds_after_epoch();
+               wakeup_info.wakeup_engine = WAKEUP_ENGINE_VOICE_KEY;
+
+               std::string default_assistant_appid = mWakeupSettings.get_default_assistant_appid();
+               wakeup_info.wakeup_appid = default_assistant_appid.c_str();
+               MWR_LOGD("wakeup_appid : %s", wakeup_info.wakeup_appid);
+
+               set_last_wakeup_event_info(wakeup_info);
+               mWakeupEngineManager.set_selected_wakeup_info(wakeup_info);
+               for (const auto& observer : mWakeupObservers) {
+                       observer->on_wakeup(wakeup_info);
+               }
+       }
+       if (stop_recording) {
+               mRecordingByVoiceKey = false;
+
+               stop_streaming_duration_timer();
+               mAudioManager.finalize_audio_data();
+
+               if (STREAMING_MODE::UTTERANCE == mStreamingMode) {
+                       change_manager_state(WAKEUP_MANAGER_STATE_PROCESSING);
+               } else {
+                       change_manager_state(WAKEUP_MANAGER_STATE_LISTENING);
+               }
+
+               mAudioManager.stop_recording(true);
+               mAudioManager.set_recording_session(RECORDING_SESSION_WAKE_WORD);
+               if (mWakeupEngineManager.get_audio_data_required()) {
+                       /* Restart recorder thread using appropriate recording device */
+                       mAudioManager.start_recording(true);
+               }
+       }
+
+       if (next_voice_key_status) {
+               update_voice_key_status(*next_voice_key_status);
+       }
+
+       MWR_LOGD("[END]");
+       return true;
+}
+
+void CWakeupManager::set_streaming_completed(bool completed)
+{
+       MWR_LOGI("[ENTER] : %d", completed);
+       mStreamingCompleted.store(completed);
+
+       /* When Streaming completes, update pending voice key status */
+       update_pending_voice_key_status();
+}
+
+void CWakeupManager::start_voice_key_status_update_timer()
+{
+       const float VOICE_KEY_STATUS_UPDATE_INTERVAL = 5.0f;
+
+       if (mVoiceKeyStatusUpdateTimer) {
+               ecore_timer_del(mVoiceKeyStatusUpdateTimer);
+       }
+
+       mVoiceKeyStatusUpdateTimer = ecore_timer_add(VOICE_KEY_STATUS_UPDATE_INTERVAL,
+               [](void *data) {
+                       MAS_LOGE("voice_key_status_update_timer expired");
+                       auto manager = static_cast<CWakeupManager*>(data);
+                       manager->update_pending_voice_key_status();
+                       return ECORE_CALLBACK_CANCEL;
+               }, static_cast<void*>(this));
+}
+
+void CWakeupManager::update_pending_voice_key_status()
+{
+       MAS_LOGI("[ENTER]");
+       if (mVoiceKeyStatusUpdateTimer) {
+               ecore_timer_del(mVoiceKeyStatusUpdateTimer);
+               mVoiceKeyStatusUpdateTimer = nullptr;
+       }
+       if (mPendingVoiceKeyStatus) {
+               for (const auto& observer : mWakeupObservers) {
+                       observer->on_voice_key_status_changed(*mPendingVoiceKeyStatus);
+               }
+               mPendingVoiceKeyStatus = boost::none;
+       }
+}
+
+void CWakeupManager::update_voice_key_status(ma_voice_key_status_e status)
+{
+       MWR_LOGI("status : %d", status);
+       if (mPendingVoiceKeyStatus) {
+               for (const auto& observer : mWakeupObservers) {
+                       observer->on_voice_key_status_changed(*mPendingVoiceKeyStatus);
+               }
+               mPendingVoiceKeyStatus = boost::none;
+       }
+
+       /* If streaming has not been completed yet after pressed event,
+        * postpone the status update until streaming is completed */
+       bool postpone = false;
+       if (status == MA_VOICE_KEY_STATUS_RELEASED_AFTER_PUSH) {
+               if (!mStreamingCompleted.load()) {
+                       postpone = true;
+               }
+       }
+
+       if (postpone) {
+               mPendingVoiceKeyStatus = status;
+               start_voice_key_status_update_timer();
+       } else {
+               for (const auto& observer : mWakeupObservers) {
+                       observer->on_voice_key_status_changed(status);
+               }
+       }
+
+       if (status == MA_VOICE_KEY_STATUS_PRESSED) {
+               mStreamingCompleted.store(false);
+       }
+}
+
+vector<IWakeupEventObserver*> CWakeupManager::get_wakeup_observers()
+{
+       return mWakeupObservers;
+}
+
+void CWakeupManager::set_last_wakeup_event_info(mas_wakeup_event_info wakeup_info)
+{
+       mLastWakeupEventInfo = wakeup_info;
+       mLastWakeupEventID++;
+}
+
+vector<ISettingValueObserver*> CWakeupManager::get_setting_observers()
+{
+       return mSettingObservers;
+}
+
+static Eina_Bool streaming_duration_expired(void *data)
+{
+       MWR_LOGW("[ENTER]");
+       CWakeupManager *wakeup_manager = static_cast<CWakeupManager*>(data);
+       if (nullptr == wakeup_manager) return ECORE_CALLBACK_CANCEL;
+
+       wakeup_manager->set_streaming_duration_timer(nullptr);
+
+       CAudioManager *audio_manager = wakeup_manager->get_audio_manager();
+       CWakeupEngineManager *engine_manager = wakeup_manager->get_engine_manager();
+
+       if (nullptr == audio_manager) return ECORE_CALLBACK_CANCEL;
+       if (nullptr == engine_manager) return ECORE_CALLBACK_CANCEL;
+
+       switch(wakeup_manager->get_streaming_mode()) {
+               case STREAMING_MODE::UTTERANCE:
+                       audio_manager->stop_streaming_current_utterance_data();
+                       engine_manager->stop_streaming_current_utterance_data();
+               break;
+               case STREAMING_MODE::PREVIOUS_UTTERANCE:
+                       audio_manager->stop_streaming_previous_utterance_data();
+               break;
+               case STREAMING_MODE::FOLLOW_UP:
+                       audio_manager->stop_streaming_follow_up_data();
+                       audio_manager->stop_recording(true);
+                       wakeup_manager->set_recording_by_voice_key(false);
+                       audio_manager->clear_audio_data();
+               break;
+       }
+
+       wakeup_manager->set_streaming_mode(STREAMING_MODE::NONE);
+
+       if (WAKEUP_MANAGER_STATE_UTTERANCE == wakeup_manager->get_manager_state()) {
+               audio_manager->stop_recording(true);
+               wakeup_manager->set_recording_by_voice_key(false);
+               audio_manager->set_recording_session(RECORDING_SESSION_WAKE_WORD);
+               if (engine_manager->get_audio_data_required()) {
+                       /* Restart recorder thread using appropriate recording device */
+                       audio_manager->start_recording(true);
+               }
+               wakeup_manager->change_manager_state(WAKEUP_MANAGER_STATE_PROCESSING);
+       }
+
+       return ECORE_CALLBACK_CANCEL;
+}
+
+bool CWakeupManager::start_streaming_utterance_data()
+{
+       MWR_LOGI("[ENTER]");
+
+       if (mCurrentStreamingSessionID == mLastWakeupEventID) {
+               MWR_LOGW("Streaming already started for this session");
+               return false;
+       }
+
+       mCurrentStreamingSessionID = mLastWakeupEventID;
+
+       mAudioManager.stop_streaming_current_utterance_data();
+       mWakeupEngineManager.stop_streaming_current_utterance_data();
+
+       mStreamingMode = STREAMING_MODE::UTTERANCE;
+
+       bool streaming_by_manager = true;
+       if (false == mLastWakeupEventInfo.wakeup_time_valid) {
+               mWakeupEngineManager.start_streaming_current_utterance_data();
+               streaming_by_manager = false;
+       } else {
+               mAudioManager.start_streaming_current_utterance_data(mLastWakeupEventInfo.wakeup_end_time);
+       }
+
+       stop_streaming_duration_timer();
+       if (streaming_by_manager) {
+               start_streaming_duration_timer();
+       }
+
+       MWR_LOGD("[END]");
+       return true;
+}
+
+bool CWakeupManager::stop_streaming_utterance_data()
+{
+       MWR_LOGI("[ENTER]");
+
+       if (STREAMING_MODE::UTTERANCE != mStreamingMode) return false;
+
+       mAudioManager.stop_streaming_current_utterance_data();
+       mWakeupEngineManager.stop_streaming_current_utterance_data();
+
+       if (mStreamingDurationTimer) {
+               stop_streaming_duration_timer();
+       }
+       if (WAKEUP_MANAGER_STATE_UTTERANCE == mWakeupManagerState) {
+               change_manager_state(WAKEUP_MANAGER_STATE_PROCESSING);
+               mAudioManager.stop_recording(true);
+               mRecordingByVoiceKey = false;
+               mAudioManager.set_recording_session(RECORDING_SESSION_WAKE_WORD);
+               if (mWakeupEngineManager.get_audio_data_required()) {
+                       /* Restart recorder thread using appropriate recording device */
+                       mAudioManager.start_recording(true);
+               }
+       }
+
+       mStreamingMode = STREAMING_MODE::NONE;
+
+       MWR_LOGD("[END]");
+       return true;
+}
+
+bool CWakeupManager::start_streaming_follow_up_data()
+{
+       MWR_LOGI("[ENTER]");
+
+       mAudioManager.stop_streaming_follow_up_data();
+       mWakeupEngineManager.stop_streaming_current_utterance_data();
+
+       mStreamingMode = STREAMING_MODE::FOLLOW_UP;
+
+       /* For the follow up streaming, audio data should be recorded from now on */
+       mAudioManager.stop_recording(true);
+       mAudioManager.clear_audio_data();
+       change_manager_state(WAKEUP_MANAGER_STATE_UTTERANCE);
+       mAudioManager.set_recording_session(RECORDING_SESSION_FOLLOW_UP);
+       mAudioManager.start_recording(true);
+
+       mAudioManager.start_streaming_follow_up_data();
+
+       stop_streaming_duration_timer();
+       start_streaming_duration_timer();
+
+       MWR_LOGD("[END]");
+       return true;
+}
+
+bool CWakeupManager::stop_streaming_follow_up_data()
+{
+       MWR_LOGI("[ENTER]");
+       if (STREAMING_MODE::FOLLOW_UP != mStreamingMode) return false;
+
+       mAudioManager.stop_streaming_follow_up_data();
+       mWakeupEngineManager.stop_streaming_current_utterance_data();
+
+       if (mStreamingDurationTimer) {
+               stop_streaming_duration_timer();
+       }
+
+       if (WAKEUP_MANAGER_STATE_UTTERANCE == mWakeupManagerState) {
+               change_manager_state(WAKEUP_MANAGER_STATE_PROCESSING);
+               mAudioManager.stop_recording(true);
+               mRecordingByVoiceKey = false;
+               mAudioManager.set_recording_session(RECORDING_SESSION_WAKE_WORD);
+               if (mWakeupEngineManager.get_audio_data_required()) {
+                       /* Restart recorder thread using appropriate recording device */
+                       mAudioManager.start_recording(true);
+               }
+       }
+
+       mStreamingMode = STREAMING_MODE::NONE;
+
+       mAudioManager.clear_audio_data();
+
+       MWR_LOGD("[END]");
+       return true;
+}
+
+bool CWakeupManager::start_streaming_previous_utterance_data()
+{
+       MWR_LOGI("[ENTER]");
+
+       mAudioManager.stop_streaming_previous_utterance_data();
+       mWakeupEngineManager.stop_streaming_current_utterance_data();
+
+       mStreamingMode = STREAMING_MODE::PREVIOUS_UTTERANCE;
+       mAudioManager.start_streaming_previous_utterance_data();
+
+       stop_streaming_duration_timer();
+       start_streaming_duration_timer();
+
+       MWR_LOGD("[END]");
+       return true;
+}
+
+bool CWakeupManager::stop_streaming_previous_utterance_data()
+{
+       MWR_LOGI("[ENTER]");
+       if (STREAMING_MODE::PREVIOUS_UTTERANCE != mStreamingMode) return false;
+
+       mAudioManager.stop_streaming_previous_utterance_data();
+       mWakeupEngineManager.stop_streaming_current_utterance_data();
+
+       if (mStreamingDurationTimer) {
+               stop_streaming_duration_timer();
+       }
+
+       if (WAKEUP_MANAGER_STATE_UTTERANCE == mWakeupManagerState) {
+               change_manager_state(WAKEUP_MANAGER_STATE_PROCESSING);
+       }
+
+       mStreamingMode = STREAMING_MODE::NONE;
+
+       MWR_LOGD("[END]");
+       return true;
+}
+
+bool CWakeupManager::get_audio_format(int* rate, int* channel, int* audio_type)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (!audio_type || !rate || !channel) {
+               MWR_LOGE("[ERROR] Invalid parameter");
+               return false;
+       }
+
+       dependency_resolver_get_audio_format(rate, channel, audio_type);
+
+       MWR_LOGD("[END] rate(%d), channel(%d), audio_type(%d)", *rate, *channel, *audio_type);
+       return true;
+}
+
+bool CWakeupManager::get_audio_source_type(char** type)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (!type) {
+               MWR_LOGE("[ERROR] Invalid parameter");
+               return false;
+       }
+
+       dependency_resolver_get_audio_source_type(type);
+
+       MWR_LOGD("[END] type(%s)", *type);
+       return true;
+}
+
+bool CWakeupManager::set_wake_word_audio_require_flag(bool require)
+{
+       MWR_LOGI("[ENTER]");
+
+       mWakeupEngineManager.set_wake_word_audio_require_flag(require);
+
+       MWR_LOGD("[END]");
+       return true;
+}
+
+bool CWakeupManager::set_voice_key_tap_duration(float duration)
+{
+       MWR_LOGI("[ENTER]");
+
+       dependency_resolver_set_voice_key_tap_duration(duration);
+
+       MWR_LOGD("[END]");
+       return true;
+}
+
+bool CWakeupManager::unset_voice_key_tap_duration()
+{
+       MWR_LOGI("[ENTER]");
+
+       dependency_resolver_unset_voice_key_tap_duration();
+
+       MWR_LOGD("[END]");
+       return true;
+}
+
+bool CWakeupManager::set_voice_key_support_mode(VOICE_KEY_SUPPORT_MODE mode)
+{
+       MWR_LOGI("Voice key support mode : %d", mode);
+       mCurrentVoiceKeySupportMode = mode;
+
+       char* support_mode = NULL;
+       switch (mode)
+       {
+       case VOICE_KEY_SUPPORT_MODE_NONE:
+               support_mode = strdup("none");
+               break;
+       case VOICE_KEY_SUPPORT_MODE_PUSH_TO_TALK:
+               support_mode = strdup("push_to_talk");
+               break;
+       case VOICE_KEY_SUPPORT_MODE_TAP_TO_TALK:
+               support_mode = strdup("tap_to_talk");
+               break;
+       case VOICE_KEY_SUPPORT_MODE_ALL:
+               support_mode = strdup("all");
+               break;
+       default:
+               support_mode = strdup("none");
+               break;
+       }
+
+       dependency_resolver_set_voice_key_support_mode(support_mode);
+
+       if (support_mode)
+               free(support_mode);
+
+       return true;
+}
+
+CWakeupPolicy* CWakeupManager::get_wakeup_policy()
+{
+       return mWakeupPolicy.get();
+}
+
+CWakeupEngineManager* CWakeupManager::get_engine_manager()
+{
+       return &mWakeupEngineManager;
+}
+
+CAudioManager* CWakeupManager::get_audio_manager()
+{
+       return &mAudioManager;
+}
+
+CWakeupSettings* CWakeupManager::get_wakeup_settings()
+{
+       return &mWakeupSettings;
+}
+
+void CWakeupManager::feed_audio_data(mas_speech_streaming_event_e event, void* buffer, int len)
+{
+       const std::chrono::seconds interval(5);
+       static auto last = std::chrono::steady_clock::now();
+       auto now = std::chrono::steady_clock::now();
+       if (now - last > interval) {
+               std::cerr << "Feeding Audio : " << len << std::endl;
+               last = now;
+       }
+
+       mAudioManager.feed_audio_data(event, buffer, len);
+}
+
+void CWakeupManager::set_dependency_module_command(string engine_name, string command)
+{
+       mWakeupEngineManager.engine_set_dependency_module_command(engine_name, command);
+}
+
+static Eina_Bool periodic_monitor_func(void *data)
+{
+       std::cerr << "MAS PERIODIC HEALTH CHECK" << std::endl;
+       return ECORE_CALLBACK_RENEW;
+}
+
+void CWakeupManager::start_periodic_monitor_timer()
+{
+       MWR_LOGI("MONITOR_TIMER START");
+       mPeriodicMonitorTimer = ecore_timer_add(
+               30.0f,
+               periodic_monitor_func, nullptr);
+}
+
+void CWakeupManager::stop_periodic_monitor_timer()
+{
+       if (mPeriodicMonitorTimer) {
+               ecore_timer_del(mPeriodicMonitorTimer);
+               mPeriodicMonitorTimer = nullptr;
+       }
+}
+
+void CWakeupManager::start_streaming_duration_timer()
+{
+       MWR_LOGI("DURATION_TIMER START");
+       ecore_main_loop_thread_safe_call_async([](void* data) {
+               MWR_LOGI("DURATION_TIMER START - async");
+               CWakeupManager* manager = static_cast<CWakeupManager*>(data);
+               if (!manager) return;
+
+               CWakeupSettings *settings = manager->get_wakeup_settings();
+               if (settings) {
+                       Ecore_Timer* timer = ecore_timer_add(
+                               settings->get_streaming_duration_max(),
+                               streaming_duration_expired, manager);
+                       manager->set_streaming_duration_timer(timer);
+                       MWR_LOGI("DURATION_TIMER STARTED : %p", timer);
+               }
+       }, this);
+}
+
+void CWakeupManager::stop_streaming_duration_timer()
+{
+       MWR_LOGI("DURATION_TIMER STOP");
+       if (mStreamingDurationTimer) {
+               MWR_LOGI("DURATION_TIMER STOP - has timer");
+               ecore_main_loop_thread_safe_call_async([](void* data) {
+                       MWR_LOGI("DURATION_TIMER STOP - async");
+                       CWakeupManager* manager = static_cast<CWakeupManager*>(data);
+                       if (!manager) return;
+
+                       Ecore_Timer* timer = manager->get_streaming_duration_timer();
+                       void* ret = ecore_timer_del(timer);
+                       MWR_LOGI("DURATION_TIMER EXISTS : %p %p", timer, ret);
+                       manager->set_streaming_duration_timer(nullptr);
+               }, this);
+       }
+}
+
+void CWakeupManager::set_streaming_duration_timer(Ecore_Timer* timer)
+{
+       MWR_LOGI("DURATION_TIMER SET : %p", timer);
+       mStreamingDurationTimer = timer;
+}
+
+Ecore_Timer* CWakeupManager::get_streaming_duration_timer()
+{
+       return mStreamingDurationTimer;
+}
+
+bool CWakeupManager::CEngineEventObserver::on_wakeup_event(string engine_name, mas_wakeup_event_info wakeup_info)
+{
+       MWR_LOGI("[ENTER]");
+       if (nullptr == mWakeupManager) return false;
+       if (nullptr == wakeup_info.wakeup_appid) return false;
+
+       if (0 != mWakeupManager->get_default_assistant().compare(wakeup_info.wakeup_appid)) {
+               if (false == mWakeupManager->get_assistant_enabled(string{wakeup_info.wakeup_appid})) {
+                       MWR_LOGE("Wakeup event with deactivated appid : %s", wakeup_info.wakeup_appid);
+                       return false;
+               }
+       }
+
+       CWakeupPolicy* policy = mWakeupManager->get_wakeup_policy();
+       if (policy) {
+               policy->wakeup_candidate(wakeup_info);
+       }
+       return true;
+}
+
+bool CWakeupManager::CEngineEventObserver::on_speech_status(string engine_name, mas_speech_status_e status)
+{
+       MWR_LOGI("[ENTER]");
+       if (nullptr == mWakeupManager) return false;
+
+       return true;
+}
+
+bool CWakeupManager::CEngineEventObserver::on_error(string engine_name, int error_code, string error_message)
+{
+       MWR_LOGI("[ENTER]");
+       if (nullptr == mWakeupManager) return false;
+
+       return true;
+}
+
+bool CWakeupManager::CEngineEventObserver::on_audio_data_require_status(string engine_name, bool require)
+{
+       MWR_LOGI("[ENTER]");
+       if (nullptr == mWakeupManager) return false;
+       if (WAKEUP_MANAGER_STATE_INACTIVE == mWakeupManager->get_manager_state()) return false;
+
+       CAudioManager *audio_manager = mWakeupManager->get_audio_manager();
+       CWakeupEngineManager *engine_manager = mWakeupManager->get_engine_manager();
+
+       if (audio_manager && engine_manager) {
+               if (engine_manager->get_audio_data_required()) {
+                       if (mWakeupManager->get_recording_by_voice_key() != true) {
+                               audio_manager->set_recording_session(RECORDING_SESSION_WAKE_WORD);
+                               audio_manager->start_recording(true);
+                       }
+               } else {
+                       if (mWakeupManager->get_recording_by_voice_key() != true) {
+                               audio_manager->stop_recording(true);
+                       }
+               }
+       }
+       return true;
+}
+
+bool CWakeupManager::CEngineEventObserver::on_streaming_audio_data(
+       mas_speech_streaming_event_e event, void* buffer, unsigned int len)
+{
+       if (nullptr == mWakeupManager) return false;
+
+       vector<IWakeupEventObserver*> observers = mWakeupManager->get_wakeup_observers();
+       for (const auto& observer : observers) {
+               observer->on_streaming_audio_data(event, buffer, len);
+       }
+
+       return true;
+}
+
+bool CWakeupManager::CEngineEventObserver::on_audio_streaming_data_section(
+       ma_audio_streaming_data_section_e section)
+{
+       if (nullptr == mWakeupManager) return false;
+
+       vector<IWakeupEventObserver*> observers = mWakeupManager->get_wakeup_observers();
+       for (const auto& observer : observers) {
+               observer->on_audio_streaming_data_section(section);
+       }
+
+       return true;
+}
+
+bool CWakeupManager::CEngineEventObserver::on_wakeup_engine_command(
+       mas_wakeup_engine_command_target_e target, string engine_name, string assistant_name, string command)
+{
+       if (nullptr == mWakeupManager) return false;
+
+       if (MAS_WAKEUP_ENGINE_COMMAND_TARGET_DEPENDENCY_MODULE == target) {
+               dependency_resolver_process_wakeup_engine_command(engine_name.c_str(), command.c_str());
+       }
+
+       if (MAS_WAKEUP_ENGINE_COMMAND_TARGET_ALL_ASSISTANTS == target ||
+               MAS_WAKEUP_ENGINE_COMMAND_TARGET_SPECIFIC_ASSISTANT == target) {
+               vector<IWakeupEventObserver*> observers = mWakeupManager->get_wakeup_observers();
+               for (const auto& observer : observers) {
+                       observer->on_wakeup_engine_command(target, assistant_name.c_str(), command.c_str());
+               }
+       }
+
+       return true;
+}
+
+void CWakeupManager::CPolicyEventObserver::on_wakeup(mas_wakeup_event_info wakeup_info)
+{
+       if (nullptr == mWakeupManager) return;
+
+       CAudioManager *audio_manager = mWakeupManager->get_audio_manager();
+       CWakeupEngineManager *engine_manager = mWakeupManager->get_engine_manager();
+       CWakeupSettings* settings = mWakeupManager->get_wakeup_settings();
+       if (nullptr == audio_manager || nullptr == engine_manager || nullptr == settings) return;
+
+       if (wakeup_info.wakeup_appid && strlen(wakeup_info.wakeup_appid) > 0) {
+               mWakeupManager->set_default_assistant(wakeup_info.wakeup_appid);
+       }
+
+       mWakeupManager->stop_streaming_utterance_data();
+       mWakeupManager->stop_streaming_previous_utterance_data();
+       mWakeupManager->stop_streaming_follow_up_data();
+       mWakeupManager->change_manager_state(WAKEUP_MANAGER_STATE_UTTERANCE);
+
+       mWakeupManager->set_last_wakeup_event_info(wakeup_info);
+       engine_manager->set_selected_wakeup_info(wakeup_info);
+       vector<IWakeupEventObserver*> observers = mWakeupManager->get_wakeup_observers();
+       for (const auto& observer : observers) {
+               observer->on_wakeup(wakeup_info);
+       }
+
+       audio_manager->set_recording_session(RECORDING_SESSION_UTTERANCE);
+}
+
+bool CWakeupManager::CAudioEventObserver::on_recording_audio_data(long time, void* data, int len)
+{
+       if (nullptr == mWakeupManager) return false;
+       if (nullptr == mEngineManager) return false;
+
+       if (false == mEngineManager->get_audio_data_required()) return false;
+
+       if (mWakeupManager->get_recording_by_voice_key() != true) {
+               /* When follow-up streaming in progress, no need to feed audio data to wakeup engines */
+               if (STREAMING_MODE::FOLLOW_UP != mWakeupManager->get_streaming_mode()) {
+                       mEngineManager->engine_feed_audio_data(time, data, len);
+               }
+       }
+
+       return true;
+}
+
+bool CWakeupManager::CAudioEventObserver::on_streaming_audio_data(
+       mas_speech_streaming_event_e event, void* buffer, unsigned int len)
+{
+       if (nullptr == mWakeupManager) return false;
+
+       vector<IWakeupEventObserver*> observers = mWakeupManager->get_wakeup_observers();
+       for (const auto& observer : observers) {
+               observer->on_streaming_audio_data(event, buffer, len);
+       }
+       if (MAS_SPEECH_STREAMING_EVENT_FINISH == event) {
+               mWakeupManager->set_streaming_mode(STREAMING_MODE::NONE);
+               mWakeupManager->stop_streaming_duration_timer();
+
+               mWakeupManager->set_streaming_completed(true);
+       }
+
+       return true;
+}
+
+bool CWakeupManager::CSettingsEventObserver::on_voice_input_language_changed(
+       const char* language)
+{
+       if (nullptr == mWakeupManager || nullptr == language) return false;
+       mWakeupManager->set_language(std::string(language));
+       vector<ISettingValueObserver*> observers = mWakeupManager->get_setting_observers();
+       for (const auto& observer : observers) {
+               observer->on_value_changed();
+       }
+       return true;
+}
+
+bool CWakeupManager::CSettingsEventObserver::on_assistant_enabled_info_changed(
+       const char* appid, bool enabled)
+{
+       MWR_LOGE("[ENTER]");
+       if (nullptr == mWakeupManager || nullptr == appid) return false;
+       mWakeupManager->set_assistant_enabled(std::string(appid), enabled);
+       vector<ISettingValueObserver*> observers = mWakeupManager->get_setting_observers();
+       for (const auto& observer : observers) {
+               if (mWakeupManager->get_wakeup_settings()->get_multiple_mode())
+                       observer->on_loaded_wakeup_engine_changed();
+               else
+                       observer->on_value_changed();
+       }
+       MWR_LOGE("[END]");
+       return true;
+}
+
+bool CWakeupManager::CSettingsEventObserver::on_default_assistant_appid_changed(
+       const char* appid)
+{
+       MWR_LOGE("[ENTER]");
+       if (nullptr == mWakeupManager || nullptr == appid) return false;
+       /* Passing 'expected' as false since the change was occurred outside of MAS */
+       mWakeupManager->process_default_assistant_changed(std::string(appid), false);
+       vector<ISettingValueObserver*> observers = mWakeupManager->get_setting_observers();
+       for (const auto& observer : observers) {
+               if (mWakeupManager->get_wakeup_settings()->get_multiple_mode())
+                       observer->on_value_changed();
+               else
+                       observer->on_loaded_wakeup_engine_changed();
+       }
+       MWR_LOGE("[END]");
+       return true;
+}
+
+bool CWakeupManager::CSettingsEventObserver::on_multiple_mode_changed()
+{
+       MWR_LOGE("[ENTER]");
+       if (nullptr == mWakeupManager) return false;
+       vector<ISettingValueObserver*> observers = mWakeupManager->get_setting_observers();
+       for (const auto& observer : observers) {
+               observer->on_loaded_wakeup_engine_changed();
+       }
+       MWR_LOGE("[END]");
+       return true;
+}
+
+bool CWakeupManager::CSettingsEventObserver::on_wake_word_detection_enabled_info_changed()
+{
+       MWR_LOGE("[ENTER]");
+       if (nullptr == mWakeupManager) return false;
+       vector<ISettingValueObserver*> observers = mWakeupManager->get_setting_observers();
+       for (const auto& observer : observers) {
+               observer->on_loaded_wakeup_engine_changed();
+       }
+       MWR_LOGE("[END]");
+       return true;
+}
+
+} // wakeup
+} // multiassistant
diff --git a/wakeup-manager/src/wakeup_manager_wrapper.cpp b/wakeup-manager/src/wakeup_manager_wrapper.cpp
new file mode 100644 (file)
index 0000000..fd89d43
--- /dev/null
@@ -0,0 +1,954 @@
+/*
+ * 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.
+ */
+#include "wakeup_manager_wrapper.h"
+#include "wakeup_manager_main.h"
+#include "wakeup_manager.h"
+
+#include <memory>
+
+#if 0
+#define BUF_SAVE_MODE
+#endif
+#if 0
+#define BUF_LOAD_MODE
+#endif
+
+#ifdef BUF_SAVE_MODE
+static char g_temp_file_name[128] = {'\0', };
+
+static FILE* g_pFile = NULL;
+
+static int g_count = 1;
+#endif
+
+#ifdef BUF_LOAD_MODE
+static FILE* g_pFile = NULL;
+#endif
+
+using namespace multiassistant::wakeup;
+
+static wakeup_service_wakeup_event_cb g_wakeup_event_cb;
+static void* g_wakeup_event_user_data;
+
+static wakeup_service_speech_streaming_cb g_utterance_streaming_cb;
+static void* g_utterance_streaming_user_data;
+
+static wakeup_service_speech_streaming_cb g_previous_utterance_streaming_cb;
+static void* g_previous_utterance_streaming_user_data;
+
+static wakeup_service_speech_streaming_cb g_follow_up_streaming_cb;
+static void* g_follow_up_streaming_user_data;
+
+static wakeup_service_speech_status_cb g_speech_status_cb;
+static void* g_speech_status_user_data;
+
+static wakeup_service_setting_changed_cb g_setting_changed_cb;
+static void* g_setting_changed_user_data;
+
+static wakeup_service_error_cb g_error_cb;
+static void* g_error_user_data;
+
+static wakeup_service_streaming_section_changed_cb g_streaming_section_changed_cb;
+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;
+
+static wakeup_service_voice_key_status_changed_cb g_wakeup_service_voice_key_status_changed_cb;
+static void *g_wakeup_service_voice_key_status_changed_user_data;
+
+static wakeup_service_loaded_engine_changed_cb g_loaded_engine_changed_cb;
+static void *g_loaded_engine_changed_user_data;
+
+class CWakeupEventObserver : public IWakeupEventObserver
+{
+       void on_wakeup(mas_wakeup_event_info wakeup_info) override;
+       void on_streaming_audio_data(
+               mas_speech_streaming_event_e event, void* buffer, unsigned int len) override;
+       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;
+       void on_voice_key_status_changed(ma_voice_key_status_e status) override;
+};
+
+class CSettingValueObserver : public ISettingValueObserver
+{
+       void on_value_changed() override;
+       void on_loaded_wakeup_engine_changed() override;
+};
+
+static std::unique_ptr<CWakeupEventObserver> g_wakeup_event_observer;
+static std::unique_ptr<CSettingValueObserver> g_setting_value_observer;
+static std::unique_ptr<CWakeupManager> g_wakeup_manager;
+
+int wakeup_manager_feed_audio_data(mas_speech_streaming_event_e event, void* buffer, int len);
+
+#ifdef BUF_LOAD_MODE
+static Eina_Bool file_read_feed(void *data)
+{
+       if (g_pFile == NULL) {
+               g_pFile = fopen("/tmp/ma_feed_file", "rb");
+               if (g_pFile == NULL) return EINA_FALSE;
+       }
+
+       if (feof(g_pFile)) {
+               fclose(g_pFile);
+               return EINA_FALSE;
+       }
+
+       const size_t BUFFER_SIZE = 4096;
+       unsigned char buffer[BUFFER_SIZE];
+       size_t len = fread(buffer, sizeof(unsigned char), BUFFER_SIZE, g_pFile);
+       wakeup_manager_feed_audio_data(MAS_SPEECH_STREAMING_EVENT_CONTINUE, buffer, len);
+
+       return EINA_TRUE;
+}
+#endif
+
+int wakeup_manager_initialize(void)
+{
+       MWR_LOGI("[ENTER]");
+
+       try {
+               g_wakeup_event_observer.reset(new CWakeupEventObserver);
+               g_setting_value_observer.reset(new CSettingValueObserver);
+               if (NULL == g_wakeup_event_observer || NULL == g_setting_value_observer) {
+                       return -1;
+               }
+               g_wakeup_manager.reset(new CWakeupManager(g_wakeup_event_observer.get(), g_setting_value_observer.get()));
+               if (NULL == g_wakeup_manager) {
+                       return -1;
+               }
+       } catch (const std::exception& e) {
+               MWR_LOGE("Exception caught : %s", e.what());
+               return -1;
+       }
+
+       g_wakeup_event_cb = NULL;
+       g_wakeup_event_user_data = NULL;
+
+       g_utterance_streaming_cb = NULL;
+       g_utterance_streaming_user_data = NULL;
+
+       g_follow_up_streaming_cb = NULL;
+       g_follow_up_streaming_user_data = NULL;
+
+       g_speech_status_cb = NULL;
+       g_speech_status_user_data = NULL;
+
+       g_setting_changed_cb = NULL;
+       g_setting_changed_user_data = NULL;
+
+       g_error_cb = NULL;
+       g_error_user_data = NULL;
+
+       g_streaming_section_changed_cb = NULL;
+       g_streaming_section_changed_user_data = NULL;
+
+       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_service_voice_key_status_changed_cb = NULL;
+       g_wakeup_service_voice_key_status_changed_user_data = NULL;
+
+       g_loaded_engine_changed_cb = NULL;
+       g_loaded_engine_changed_user_data = NULL;
+
+       g_wakeup_manager->initialize();
+
+       MWR_LOGD("[END]");
+
+#ifdef BUF_SAVE_MODE
+       if (g_pFile) {
+               fclose(g_pFile);
+               g_pFile = NULL;
+       } else {
+               MWR_LOGD("[Recorder Info] File not found!");
+       }
+
+       while (1) {
+               snprintf(g_temp_file_name, sizeof(g_temp_file_name), "/tmp/wakeup_manager_%d_%d", getpid(), g_count);
+               int ret = access(g_temp_file_name, 0);
+
+               if (0 == ret) {
+                       MWR_LOGD("[Recorder ERROR] File is already exist");
+                       if (0 == remove(g_temp_file_name)) {
+                               MWR_LOGD("[Recorder] Remove file");
+                               break;
+                       } else {
+                               g_count++;
+                       }
+               } else {
+                       break;
+               }
+       }
+
+       MWR_LOGD("[Recorder] Temp file name=[%s]", g_temp_file_name);
+
+       /* open test file */
+       g_pFile = fopen(g_temp_file_name, "wb+x");
+       if (!g_pFile) {
+               MWR_LOGD("[Recorder ERROR] File not found!");
+       }
+       g_count++;
+#endif
+
+#ifdef BUF_LOAD_MODE
+       Ecore_Timer* timer = ecore_timer_add(0.01f, file_read_feed, NULL);
+#endif
+       return 0;
+}
+
+int wakeup_manager_deinitialize(void)
+{
+       MWR_LOGI("[ENTER]");
+
+#ifdef BUF_SAVE_MODE
+       if (g_pFile) {
+               MWR_LOGE("[Recorder SUCCESS] File Close");
+               fclose(g_pFile);
+               g_pFile = NULL;
+       }
+#endif
+
+       if (nullptr == g_wakeup_manager) return -1;
+
+       try {
+               g_wakeup_manager->deinitialize();
+               g_wakeup_manager.reset();
+
+               g_wakeup_event_observer.reset();
+               g_setting_value_observer.reset();
+       } catch (const std::exception& e) {
+               MWR_LOGE("Exception caught : %s", e.what());
+               return -1;
+       }
+
+       MWR_LOGI("[END]");
+       return 0;
+}
+
+int wakeup_manager_get_settings(ma_plugin_settings **settings, size_t *struct_size)
+{
+       if (NULL == settings || NULL == struct_size) {
+               MWR_LOGD("[ERROR] Parameter is invalid, settings(%p), struct_size(%p)", settings, struct_size);
+               return -1;
+       }
+
+       if (nullptr == g_wakeup_manager) return -1;
+       CWakeupSettings* wakeup_settings = g_wakeup_manager->get_wakeup_settings();
+       if (wakeup_settings) {
+               const int PLUGIN_VERSION = 1;
+               static ma_plugin_settings current_settings;
+               current_settings.plugin_version = PLUGIN_VERSION;
+               current_settings.ui_panel_enabled = wakeup_settings->get_ui_panel_enabled();
+               *struct_size = sizeof(current_settings);
+               *settings = &current_settings;
+       }
+
+       return 0;
+}
+
+int wakeup_manager_add_assistant_wakeup_word(const char* appid, const char* wakeup_word, const char* language)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (NULL == appid || NULL == wakeup_word) {
+               MWR_LOGD("[ERROR] Parameter is invalid, appid(%s), wakeup_word(%s), language(%s)", appid, wakeup_word, language);
+               return -1;
+       }
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->add_assistant_wakeup_word(
+               string{appid}, string{wakeup_word}, (language ? string{language} : string{}));
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_remove_assistant_wakeup_word(const char* appid, const char* wakeup_word, const char* language)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (NULL == appid || NULL == wakeup_word) {
+               MWR_LOGD("[ERROR] Parameter is invalid, appid(%s), wakeup_word(%s), language(%s)", appid, wakeup_word, language);
+               return -1;
+       }
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->remove_assistant_wakeup_word(
+               string{appid}, string{wakeup_word}, (language ? string{language} : string{}));
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_add_assistant_language(const char* appid, const char* language)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (NULL == appid || NULL == language) {
+               MWR_LOGD("[ERROR] Parameter is invalid, appid(%s), language(%s)", appid, language);
+               return -1;
+       }
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->add_assistant_language(string{appid}, string{language});
+
+       MWR_LOGD("[DEBUG] language(%s)", language);
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_add_assistant_wakeup_engine(const char* appid, const char* engine)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (NULL == appid || NULL == engine) {
+               MWR_LOGD("[ERROR] Parameter is invalid, appid(%s), wakeup engine(%s)", appid, engine);
+               return -1;
+       }
+
+       if (nullptr == g_wakeup_manager) return -1;
+       MWR_LOGD("[DEBUG] appid(%s), wakeup engine(%s)", appid, engine);
+       g_wakeup_manager->add_assistant_wakeup_engine(string{appid}, string{engine});
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_set_default_assistant(const char* appid)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (NULL == appid) {
+               MWR_LOGD("[ERROR] Parameter is NULL");
+               return -1;
+       }
+
+       if (nullptr == g_wakeup_manager) return -1;
+       MWR_LOGD("[DEBUG] default_assistant appid(%s)", appid);
+       g_wakeup_manager->set_default_assistant(string{appid});
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_get_default_assistant(const char** appid)
+{
+       static string default_assistant;
+
+       if (nullptr == g_wakeup_manager) return -1;
+       default_assistant = g_wakeup_manager->get_default_assistant();
+
+       if (default_assistant.empty()) {
+               *appid = nullptr;
+       } else {
+               *appid = default_assistant.c_str();
+       }
+       return 0;
+}
+
+int wakeup_manager_set_language(const char* language)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (NULL == language) {
+               MWR_LOGD("[ERROR] Parameter is NULL");
+               return -1;
+       }
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->set_language(string{language});
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_change_state(wakeup_manager_state_e state)
+{
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->change_manager_state(state);
+       return 0;
+}
+
+int wakeup_manager_activate(void)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->activate();
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_deactivate(void)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->deactivate();
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_update_voice_feedback_state(const char* appid, int state)
+{
+       MWR_LOGI("[ENTER]");
+
+       string appid_string;
+       if (NULL == appid) {
+               MWR_LOGD("[ERROR] Parameter is NULL");
+       } else {
+               appid_string = appid;
+       }
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->update_voice_feedback_state(appid_string, state);
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_set_assistant_specific_command(const char* appid, const char* command)
+{
+       MWR_LOGI("[ENTER]");
+
+       string appid_string;
+       string command_string;
+       if (NULL == appid || NULL == command) {
+               MWR_LOGD("[ERROR] Parameter is invalid, appid(%s), command(%s)", appid, command);
+       }
+       if (appid) appid_string = appid;
+       if (command) command_string = command;
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->set_assistant_specific_command(appid_string, command_string);
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_set_background_volume(const char* appid, double ratio)
+{
+       MWR_LOGI("[ENTER]");
+
+       string appid_string;
+       if (NULL == appid) {
+               MWR_LOGD("[ERROR] Parameter is NULL");
+       } else {
+               appid_string = appid;
+       }
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->set_background_volume(appid_string, ratio);
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_update_recognition_result(const char* appid, int result)
+{
+       MWR_LOGI("[ENTER]");
+
+       string appid_string;
+       if (NULL == appid) {
+               MWR_LOGD("[ERROR] Parameter is NULL");
+       } else {
+               appid_string = appid;
+       }
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->update_recognition_result(appid_string, result);
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_process_plugin_event(mas_plugin_event_e event, void* data, int len)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->process_plugin_event(event, data, len);
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_start_streaming_utterance_data(void)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->start_streaming_utterance_data();
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_stop_streaming_utterance_data(void)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->stop_streaming_utterance_data();
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_start_streaming_follow_up_data(void)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->start_streaming_follow_up_data();
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_stop_streaming_follow_up_data(void)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->stop_streaming_follow_up_data();
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_start_streaming_previous_utterance_data(void)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->start_streaming_previous_utterance_data();
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_stop_streaming_previous_utterance_data(void)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->stop_streaming_previous_utterance_data();
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_get_audio_format(int* rate, int* channel, int* audio_type)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (!audio_type || !rate || !channel) {
+               MWR_LOGE("[ERROR] Invalid parameter");
+               return -1;
+       }
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->get_audio_format(rate, channel, audio_type);
+
+       MWR_LOGD("[END] rate(%d), channel(%d), audio_type(%d)", *rate, *channel, *audio_type);
+       return 0;
+}
+
+int wakeup_manager_get_audio_source_type(char** type)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (!type) {
+               MWR_LOGE("[ERROR] Invalid parameter");
+               return -1;
+       }
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->get_audio_source_type(type);
+
+       MWR_LOGD("[END] type(%s)", *type);
+       return 0;
+}
+
+int wakeup_manager_set_voice_key_tap_duration(float duration)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->set_voice_key_tap_duration(duration);
+
+       MWR_LOGD("[END] duration(%f)", duration);
+       return 0;
+}
+
+int wakeup_manager_unset_voice_key_tap_duration()
+{
+       MWR_LOGI("[ENTER]");
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->unset_voice_key_tap_duration();
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_set_voice_key_support_mode(int mode)
+{
+       MWR_LOGI("[ENTER] : %d", mode);
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->set_voice_key_support_mode(static_cast<VOICE_KEY_SUPPORT_MODE>(mode));
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_set_wake_word_audio_require_flag(bool require)
+{
+       MWR_LOGI("[ENTER] : %d", require);
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->set_wake_word_audio_require_flag(require);
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_set_assistant_language(const char* appid, const char* language)
+{
+       MWR_LOGI("[ENTER]");
+
+       string appid_string;
+       string language_string;
+       if (NULL == appid || NULL == language) {
+               MWR_LOGE("[ERROR] Parameter is invalid, appid(%s), language(%s)", appid, language);
+               return -1;
+       }
+       appid_string = appid;
+       language_string = language;
+
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->set_assistant_language(appid_string, language_string);
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_set_wakeup_event_callback(wakeup_service_wakeup_event_cb callback, void* user_data)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (NULL == callback) {
+               MWR_LOGE("[ERROR] Input parameter is NULL");
+               return -1;
+       }
+
+       g_wakeup_event_cb = callback;
+       g_wakeup_event_user_data = user_data;
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_set_utterance_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (NULL == callback) {
+               MWR_LOGE("[ERROR] Input parameter is NULL");
+               return -1;
+       }
+
+       g_utterance_streaming_cb = callback;
+       g_utterance_streaming_user_data = user_data;
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_set_previous_utterance_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (NULL == callback) {
+               MWR_LOGE("[ERROR] Input parameter is NULL");
+               return -1;
+       }
+
+       g_previous_utterance_streaming_cb = callback;
+       g_previous_utterance_streaming_user_data = user_data;
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_set_follow_up_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (NULL == callback) {
+               MWR_LOGE("[ERROR] Input parameter is NULL");
+               return -1;
+       }
+
+       g_follow_up_streaming_cb = callback;
+       g_follow_up_streaming_user_data = user_data;
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_set_speech_status_callback(wakeup_service_speech_status_cb callback, void* user_data)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (NULL == callback) {
+               MWR_LOGE("[ERROR] Input parameter is NULL");
+               return -1;
+       }
+
+       g_speech_status_cb = callback;
+       g_speech_status_user_data = user_data;
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_set_setting_changed_callback(wakeup_service_setting_changed_cb callback, void* user_data)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (NULL == callback) {
+               MWR_LOGE("[ERROR] Input parameter is NULL");
+               return -1;
+       }
+
+       g_setting_changed_cb = callback;
+       g_setting_changed_user_data = user_data;
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_set_error_callback(wakeup_service_error_cb callback, void* user_data)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (NULL == callback) {
+               MWR_LOGE("[ERROR] Input parameter is NULL");
+               return -1;
+       }
+
+       g_error_cb = callback;
+       g_error_user_data = user_data;
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_set_streaming_section_changed_callback(wakeup_service_streaming_section_changed_cb callback, void* user_data)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (NULL == callback) {
+               MWR_LOGE("[ERROR] Input parameter is NULL");
+               return -1;
+       }
+
+       g_streaming_section_changed_cb = callback;
+       g_streaming_section_changed_user_data = user_data;
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_set_wakeup_engine_command_callback(wakeup_service_engine_command_cb callback, void* user_data)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (NULL == callback) {
+               MWR_LOGE("[ERROR] Input parameter is NULL");
+               return -1;
+       }
+
+       g_wakeup_engine_command_cb = callback;
+       g_wakeup_engine_command_user_data = user_data;
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_set_wakeup_service_state_changed_callback(wakeup_service_state_changed_cb callback, void* user_data)
+{
+       MWR_LOGI("[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_set_voice_key_status_changed_callback(wakeup_service_voice_key_status_changed_cb callback, void* user_data)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (NULL == callback) {
+               MWR_LOGE("[ERROR] Input parameter is NULL");
+               return -1;
+       }
+
+       g_wakeup_service_voice_key_status_changed_cb = callback;
+       g_wakeup_service_voice_key_status_changed_user_data = user_data;
+
+       MWR_LOGD("[END]");
+       return 0;
+}
+
+int wakeup_manager_set_loaded_engine_changed_callback(wakeup_service_loaded_engine_changed_cb callback, void* user_data)
+{
+       MWR_LOGI("[ENTER]");
+
+       if (NULL == callback) {
+               MWR_LOGE("[ERROR] Input parameter is NULL");
+               return -1;
+       }
+
+       g_loaded_engine_changed_cb = callback;
+       g_loaded_engine_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;
+
+#ifdef BUF_SAVE_MODE
+       static int num = 0;
+       const int MAXIMUM_NUM = 1000;
+       if (g_pFile && num++ < MAXIMUM_NUM)
+               fwrite(buffer, 1, len, g_pFile);
+#endif
+
+       g_wakeup_manager->feed_audio_data(event, buffer, len);
+
+       return 0;
+}
+
+int wakeup_manager_set_dependency_module_command(const char* engine_name, const char* command)
+{
+       if (nullptr == g_wakeup_manager) return -1;
+       g_wakeup_manager->set_dependency_module_command(
+               engine_name ? engine_name : "",
+               command ? command : "");
+       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);
+       return 0;
+}
+
+void CWakeupEventObserver::on_wakeup(mas_wakeup_event_info wakeup_info)
+{
+       if (NULL != g_wakeup_event_cb) {
+               g_wakeup_event_cb(wakeup_info, g_wakeup_event_user_data);
+       }
+}
+
+void CWakeupEventObserver::on_streaming_audio_data(
+       mas_speech_streaming_event_e event, void* buffer, unsigned int len)
+{
+       if (MAS_SPEECH_STREAMING_EVENT_START == event) {
+               MWR_LOGI("streaming_cb START");
+       }
+       if (MAS_SPEECH_STREAMING_EVENT_FINISH == event) {
+               MWR_LOGI("streaming_cb FINISH");
+       }
+       if (NULL != g_utterance_streaming_cb) {
+               g_utterance_streaming_cb(event, buffer, len, g_utterance_streaming_user_data);
+       } else {
+               MWR_LOGI("[INFO] No service streaming callback");
+       }
+}
+
+void CWakeupEventObserver::on_audio_streaming_data_section(
+       ma_audio_streaming_data_section_e section)
+{
+       if (g_streaming_section_changed_cb) {
+               g_streaming_section_changed_cb(section, g_streaming_section_changed_user_data);
+       }
+}
+
+void CWakeupEventObserver::on_wakeup_engine_command(
+       mas_wakeup_engine_command_target_e target, const char* assistant_name, const char* command)
+{
+       if (g_wakeup_engine_command_cb) {
+               g_wakeup_engine_command_cb(target, assistant_name, command, g_wakeup_engine_command_user_data);
+       }
+}
+
+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 CWakeupEventObserver::on_voice_key_status_changed(ma_voice_key_status_e status)
+{
+       if (g_wakeup_service_voice_key_status_changed_cb) {
+               g_wakeup_service_voice_key_status_changed_cb(status, g_wakeup_service_voice_key_status_changed_user_data);
+       }
+}
+
+void CSettingValueObserver::on_value_changed()
+{
+       if (g_setting_changed_cb) {
+               g_setting_changed_cb(g_setting_changed_user_data);
+       }
+}
+
+void CSettingValueObserver::on_loaded_wakeup_engine_changed()
+{
+       if (g_loaded_engine_changed_cb) {
+               g_loaded_engine_changed_cb(g_loaded_engine_changed_user_data);
+       }
+}
diff --git a/wakeup-manager/src/wakeup_policy.cpp b/wakeup-manager/src/wakeup_policy.cpp
new file mode 100644 (file)
index 0000000..e196ac0
--- /dev/null
@@ -0,0 +1,59 @@
+#include "wakeup_policy.h"
+#include "wakeup_policy_impl.h"
+
+#include <vector>
+#include <algorithm>
+
+namespace multiassistant
+{
+namespace wakeup
+{
+
+void CWakeupPolicyImpl::subscribe(IPolicyEventObserver *observer)
+{
+       mObservers.push_back(observer);
+}
+
+void CWakeupPolicyImpl::unsubscribe(IPolicyEventObserver *observer)
+{
+       auto iter = find(mObservers.begin(), mObservers.end(), observer);
+       if (iter != mObservers.end()) {
+               mObservers.erase(iter);
+       }
+}
+
+void CWakeupPolicyImpl::wakeup(mas_wakeup_event_info wakeup_info)
+{
+       for (const auto& observer : mObservers) {
+               if (observer) {
+                       observer->on_wakeup(wakeup_info);
+               }
+       }
+}
+
+CWakeupPolicy::CWakeupPolicy()
+{
+       mImpl.reset(new CWakeupPolicyImpl);
+}
+
+CWakeupPolicy::~CWakeupPolicy()
+{
+}
+
+CWakeupPolicy::CWakeupPolicy(IPolicyEventObserver *observer) : CWakeupPolicy()
+{
+       subscribe(observer);
+}
+
+void CWakeupPolicy::subscribe(IPolicyEventObserver *observer)
+{
+       if (mImpl) mImpl->subscribe(observer);
+}
+
+void CWakeupPolicy::unsubscribe(IPolicyEventObserver *observer)
+{
+       if (mImpl) mImpl->unsubscribe(observer);
+}
+
+} // wakeup
+} // multiassistant
diff --git a/wakeup-manager/src/wakeup_policy_default.cpp b/wakeup-manager/src/wakeup_policy_default.cpp
new file mode 100644 (file)
index 0000000..964a1f1
--- /dev/null
@@ -0,0 +1,148 @@
+#include "wakeup_policy_default.h"
+#include "wakeup_policy_impl.h"
+#include "wakeup_manager_main.h"
+
+#include <vector>
+
+#include <Eina.h>
+#include <dlog.h>
+
+namespace multiassistant
+{
+namespace wakeup
+{
+
+CWakeupPolicyDefault::CWakeupPolicyDefault(IPolicyEventObserver *observer)
+       : CWakeupPolicy(observer)
+{
+}
+
+CWakeupPolicyDefault::~CWakeupPolicyDefault()
+{
+       if (mTimer) {
+               ecore_timer_del(mTimer);
+               mTimer = nullptr;
+       }
+}
+
+bool CWakeupPolicyDefault::valid()
+{
+       return true;
+}
+
+void CWakeupPolicyDefault::set_assistant_priority(string appid, int priority)
+{
+       PRIORITY_INFO info;
+       info.appid = appid;
+       info.priority = priority;
+
+       MWR_LOGD("Setting assistant priority : %s %d", appid.c_str(), priority);
+       mPriorityInfos.push_back(info);
+}
+
+void CWakeupPolicyDefault::set_delay(float seconds)
+{
+       MWR_LOGD("Setting delay : %f", seconds);
+       mDelaySeconds = seconds;
+}
+
+float CWakeupPolicyDefault::get_delay()
+{
+       return mDelaySeconds;
+}
+
+void CWakeupPolicyDefault::set_timer(Ecore_Timer* timer)
+{
+       mTimer = timer;
+}
+
+Ecore_Timer* CWakeupPolicyDefault::get_timer()
+{
+       return mTimer;
+}
+
+static Eina_Bool timer_func(void *data)
+{
+       MWR_LOGD("[ENTER]");
+       if (data) {
+               CWakeupPolicyDefault *policy = static_cast<CWakeupPolicyDefault*>(data);
+               policy->timer_expired();
+               policy->set_timer(nullptr);
+       }
+       return ECORE_CALLBACK_CANCEL;
+}
+
+void CWakeupPolicyDefault::wakeup_candidate(mas_wakeup_event_info wakeup_info)
+{
+       MWR_LOGI("[ENTER]");
+       mas_wakeup_event_info_wrapper wrapper;
+       wrapper.info = wakeup_info;
+       if (wakeup_info.wakeup_appid) wrapper.wakeup_appid = wakeup_info.wakeup_appid;
+       if (wakeup_info.wakeup_word) wrapper.wakeup_word = wakeup_info.wakeup_word;
+       if (wakeup_info.wakeup_language) wrapper.wakeup_language = wakeup_info.wakeup_language;
+       if (wakeup_info.wakeup_voice_id) wrapper.wakeup_voice_id = wakeup_info.wakeup_voice_id;
+       if (wakeup_info.wakeup_engine) wrapper.wakeup_engine = wakeup_info.wakeup_engine;
+       if (wakeup_info.extra_data_description) wrapper.extra_data_description = wakeup_info.extra_data_description;
+
+       if (wakeup_info.extra_data && wakeup_info.extra_data_length > 0) {
+               wrapper.extra_data.assign(
+                       (unsigned char*)wakeup_info.extra_data,
+                       (unsigned char*)wakeup_info.extra_data + wakeup_info.extra_data_length);
+       }
+
+       LOGI("wake word : %s", wakeup_info.wakeup_word);
+       mWakeupInfos.push_back(wrapper);
+       if (nullptr == mTimer) {
+               ecore_main_loop_thread_safe_call_async([](void* data) {
+                       /* Assume that choosing the first wakeup event is the default behavior */
+                       timer_func(data);
+               }, this);
+       }
+}
+
+void CWakeupPolicyDefault::select_candidate(mas_wakeup_event_info wakeup_info)
+{
+       MWR_LOGE("Default wakeup policy does not support selecting candidate");
+}
+
+void CWakeupPolicyDefault::timer_expired()
+{
+       MWR_LOGD("[ENTER]");
+       if (0 == mWakeupInfos.size()) return;
+
+       mas_wakeup_event_info_wrapper selected = mWakeupInfos.front();
+       LOGD("wake word : %s", selected.wakeup_word.c_str());
+       int selected_priority = -1;
+       for (const auto &wakeup : mWakeupInfos) {
+               for (const auto &info : mPriorityInfos) {
+                       if (0 == info.appid.compare(wakeup.wakeup_appid)) {
+                               if (info.priority > selected_priority || -1 == selected_priority) {
+                                       MWR_LOGD("Wakeup with higher priority found : %s, %d",
+                                               info.appid.c_str(), info.priority);
+                                       selected = wakeup;
+                                       selected_priority = info.priority;
+                               }
+                       }
+               }
+       }
+       selected.info.wakeup_appid = selected.wakeup_appid.c_str();
+       selected.info.wakeup_word = selected.wakeup_word.c_str();
+       selected.info.wakeup_language = selected.wakeup_language.c_str();
+       selected.info.wakeup_voice_id = selected.wakeup_voice_id.c_str();
+       selected.info.wakeup_engine = selected.wakeup_engine.c_str();
+       selected.info.extra_data = selected.extra_data.data();
+       selected.info.extra_data_length = selected.extra_data.size();
+       selected.info.extra_data_description = selected.extra_data_description.c_str();
+
+       if (mImpl) mImpl->wakeup(selected.info);
+       mWakeupInfos.clear();
+
+       if (mTimer) {
+               MWR_LOGD("Now deleting timer");
+               ecore_timer_del(mTimer);
+               mTimer = nullptr;
+       }
+}
+
+} // wakeup
+} // multiassistant
diff --git a/wakeup-manager/src/wakeup_policy_external.cpp b/wakeup-manager/src/wakeup_policy_external.cpp
new file mode 100644 (file)
index 0000000..2c94a2a
--- /dev/null
@@ -0,0 +1,49 @@
+#include "wakeup_policy_external.h"
+#include "wakeup_policy_impl.h"
+
+#include "dependency_resolver.h"
+
+#include <dlog.h>
+
+#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
diff --git a/wakeup-manager/src/wakeup_settings.cpp b/wakeup-manager/src/wakeup_settings.cpp
new file mode 100644 (file)
index 0000000..602110f
--- /dev/null
@@ -0,0 +1,457 @@
+#include "wakeup_settings.h"
+#include "wakeup_manager_main.h"
+
+#include <sstream>
+#include <algorithm>
+#include <json/json.h>
+
+namespace multiassistant
+{
+namespace wakeup
+{
+
+/* Utility function for checking if an element exists in a container */
+template<class C, class T>
+static auto contains(const C& v, const T& x) -> decltype(end(v), true)
+{
+       return end(v) != find(begin(v), end(v), x);
+}
+
+static string prev_wake_word_enabled;
+
+CWakeupSettings::CWakeupSettings()
+{
+}
+
+CWakeupSettings::~CWakeupSettings()
+{
+}
+
+static void wakeup_setting_input_language_changed_cb(keynode_t* node, void* data)
+{
+       MWR_LOGD("[ENTER]");
+       if (nullptr == node) return;
+
+       CWakeupSettings* settings = static_cast<CWakeupSettings*>(data);
+       if (nullptr == settings) return;
+
+       if (VCONF_TYPE_STRING == node->type) {
+               const char* value = static_cast<const char*>(node->value.s);
+               const auto& observers = settings->get_observers();
+               for (const auto& observer : observers) {
+                       if (observer) {
+                               if (!observer->on_voice_input_language_changed(value)) {
+                                       LOGW("[Settings WARNING] One of the observer returned false");
+                               }
+                       }
+               }
+       } else {
+               LOGE("[Settings ERROR] the value type is not string : %d", node->type);
+       }
+}
+
+static void wakeup_setting_streaming_duration_max_changed_cb(keynode_t* node, void* data)
+{
+       MWR_LOGD("[ENTER]");
+       if (nullptr == node) return;
+
+       CWakeupSettings* settings = static_cast<CWakeupSettings*>(data);
+       if (nullptr == settings) return;
+
+       if (VCONF_TYPE_DOUBLE == node->type) {
+               double value = static_cast<double>(node->value.d);
+               settings->set_streaming_duration_max(static_cast<float>(value));
+       } else {
+               LOGE("[Settings ERROR] the value type is not string : %d", node->type);
+       }
+}
+
+
+static void wakeup_setting_enabled_assistants_changed_cb(keynode_t* node, void* data)
+{
+       MWR_LOGD("[ENTER]");
+       if (nullptr == node) return;
+
+       CWakeupSettings* settings = static_cast<CWakeupSettings*>(data);
+       if (nullptr == settings) return;
+
+       if (VCONF_TYPE_STRING == node->type) {
+               vector<string> newlyAddedAssistants;
+               vector<string> newlyRemovedAssistants;
+               const char* value = static_cast<const char*>(node->value.s);
+               if (value) {
+                       vector<string> previouslyEnabledAssistants = settings->get_enabled_assistants();
+                       vector<string> currentlyEnabledAssistants;
+                       string token;
+                       istringstream iss(value);
+                       currentlyEnabledAssistants.clear();
+                       while (getline(iss, token, ';')) {
+                               currentlyEnabledAssistants.push_back(token);
+                               MWR_LOGD("enabled_assistants : %s", token.c_str());
+                       }
+
+                       for (const auto& assistant : currentlyEnabledAssistants) {
+                               if (!contains(previouslyEnabledAssistants, assistant)) {
+                                       newlyAddedAssistants.push_back(assistant);
+                               }
+                       }
+                       for (const auto& assistant : previouslyEnabledAssistants) {
+                               if (!contains(currentlyEnabledAssistants, assistant)) {
+                                       newlyRemovedAssistants.push_back(assistant);
+                               }
+                       }
+               }
+
+               const auto& observers = settings->get_observers();
+               for (const auto& observer : observers) {
+                       if (observer) {
+                               for (const auto& assistant : newlyAddedAssistants) {
+                                       if (!observer->on_assistant_enabled_info_changed(assistant.c_str(), true)) {
+                                               LOGW("[Settings WARNING] One of the observer returned false");
+                                       }
+                               }
+                               for (const auto& assistant : newlyRemovedAssistants) {
+                                       if (!observer->on_assistant_enabled_info_changed(assistant.c_str(), false)) {
+                                               LOGW("[Settings WARNING] One of the observer returned false");
+                                       }
+                               }
+                       }
+               }
+       } else {
+               LOGE("[Settings ERROR] the value type is not string : %d", node->type);
+       }
+}
+
+static void wakeup_setting_default_assistant_appid_changed_cb(keynode_t* node, void* data)
+{
+       MWR_LOGD("[ENTER]");
+       if (nullptr == node) return;
+
+       CWakeupSettings* settings = static_cast<CWakeupSettings*>(data);
+       if (nullptr == settings) return;
+
+       if (VCONF_TYPE_STRING == node->type) {
+               const char* value = static_cast<const char*>(node->value.s);
+               const auto& observers = settings->get_observers();
+               for (const auto& observer : observers) {
+                       if (observer) {
+                               if (!observer->on_default_assistant_appid_changed(value)) {
+                                       LOGW("[Settings WARNING] One of the observer returned false");
+                               }
+                       }
+               }
+       } else {
+               LOGE("[Settings ERROR] the value type is not string : %d", node->type);
+       }
+}
+
+static void wakeup_setting_multiple_mode_changed_cb(keynode_t* node, void* data)
+{
+       MWR_LOGD("[ENTER]");
+
+       CWakeupSettings* settings = static_cast<CWakeupSettings*>(data);
+       if (nullptr == settings) return;
+
+       const auto& observers = settings->get_observers();
+       for (const auto& observer : observers) {
+               if (observer) {
+                       if (!observer->on_multiple_mode_changed()) {
+                               LOGW("[Settings WARNING] One of the observer returned false");
+                       }
+               }
+       }
+}
+
+static void wakeup_setting_enabled_wake_word_detection_changed_cb(keynode_t* node, void* data)
+{
+       MWR_LOGD("[ENTER]");
+
+       char *vconf_str = vconf_keynode_get_str(node);
+       if (!vconf_str) return;
+
+       MWR_LOGI("vconf value : %s", vconf_str);
+       if (0 == prev_wake_word_enabled.compare(string(vconf_str))) {
+               return;
+       }
+
+       prev_wake_word_enabled = string(vconf_str);
+
+       CWakeupSettings* settings = static_cast<CWakeupSettings*>(data);
+       if (nullptr == settings) return;
+
+       const auto& observers = settings->get_observers();
+       for (const auto& observer : observers) {
+               if (observer) {
+                       if (!observer->on_wake_word_detection_enabled_info_changed()) {
+                               LOGW("[Settings WARNING] One of the observer returned false");
+                       }
+               }
+       }
+}
+
+void CWakeupSettings::initialize(map<string, string> custom_keys)
+{
+       int vconf_ret;
+       int vconf_bool;
+       double vconf_double;
+
+       mCustomVconfKeys.clear();
+       mCustomVconfKeys = custom_keys;
+
+       char *default_assistant_appid = vconf_get_str(mCustomVconfKeys[WAKEUP_SETTINGS_KEY_DEFAULT_ASSISTANT_APPID].c_str());
+       if (default_assistant_appid) {
+               mDefaultAssistantAppid = default_assistant_appid;
+               MWR_LOGD("default_assistant_appid : %s", mDefaultAssistantAppid.c_str());
+               for (const auto& observer : mObservers) {
+                       if (observer) {
+                               if (!observer->on_default_assistant_appid_changed(default_assistant_appid)) {
+                                       LOGW("[Settings WARNING] One of the observer returned false");
+                               }
+                       }
+               }
+               free(default_assistant_appid);
+               default_assistant_appid = nullptr;
+       }
+       vconf_ret = vconf_get_bool(WAKEUP_SETTINGS_KEY_UI_PANEL_ENABLED, &vconf_bool);
+       if (0 == vconf_ret) {
+               mUiPanelEnabled = vconf_bool;
+               MWR_LOGD("ui_panel_enabled : %s", (mUiPanelEnabled ? "true" : "false"));
+       }
+       vconf_ret = vconf_get_dbl(WAKEUP_SETTINGS_KEY_CONVERSATION_TIMEOUT, &vconf_double);
+       if (0 == vconf_ret) {
+               mConversationTimeout = vconf_double;
+               MWR_LOGD("conversation_timeout : %f", mConversationTimeout);
+       }
+       vconf_ret = vconf_get_bool(WAKEUP_SETTINGS_KEY_MULTIPLE_MODE, &vconf_bool);
+       if (0 == vconf_ret) {
+               mMultipleMode = vconf_bool;
+               MWR_LOGD("multiple_mode : %s", (mMultipleMode ? "true" : "false"));
+       }
+       if (true == mMultipleMode) {
+               char *enabled_assistants = vconf_get_str(mCustomVconfKeys[WAKEUP_SETTINGS_KEY_ENABLED_ASSISTANTS].c_str());
+               if (enabled_assistants) {
+                       string token;
+                       istringstream iss(enabled_assistants);
+                       mEnabledAssistants.clear();
+                       while (getline(iss, token, ';')) {
+                               mEnabledAssistants.push_back(token);
+                               MWR_LOGD("enabled_assistants : %s", token.c_str());
+                               for (const auto& observer : mObservers) {
+                                       if (observer) {
+                                               if (!observer->on_assistant_enabled_info_changed(token.c_str(), true)) {
+                                                       LOGW("[Settings WARNING] One of the observer returned false");
+                                               }
+                                       }
+                               }
+                       }
+                       free(enabled_assistants);
+                       enabled_assistants = nullptr;
+               }
+       }
+       char *wakeword_detection_enabled = vconf_get_str(mCustomVconfKeys[WAKEUP_SETTINGS_KEY_WAKE_WORD_DETECTION_ENABLED].c_str());
+       if (wakeword_detection_enabled) {
+               Json::Reader reader;
+               Json::Value root;
+               mWakeWordDisabledAssistants.clear();
+               if (!reader.parse(wakeword_detection_enabled, root)) {
+                       LOGW("[Settings WARNING] Failed to parse Json : %s", reader.getFormattedErrorMessages().c_str());
+               } else {
+                       auto member = root.getMemberNames();
+                       for (string m : member) {
+                               if (0 == root[m].asString().compare("off")) {
+                                       mWakeWordDisabledAssistants.push_back(m);
+                                       MWR_LOGD("wake_word_detection_disabled assistant : %s", m.c_str());
+                               }
+                       }
+               }
+               free(wakeword_detection_enabled);
+               wakeword_detection_enabled = nullptr;
+       }
+       vconf_ret = vconf_get_dbl(WAKEUP_SETTINGS_KEY_WAKEUP_POLICY_DELAY, &vconf_double);
+       if (0 == vconf_ret) {
+               mWakeupPolicyDelay = vconf_double;
+               MWR_LOGD("conversation_timeout : %f", mWakeupPolicyDelay);
+       }
+       char *wakeup_policy_priority = vconf_get_str(WAKEUP_SETTINGS_KEY_WAKEUP_POLICY_PRIORITY);
+       if (wakeup_policy_priority) {
+               string token;
+               istringstream iss(wakeup_policy_priority);
+               mWakeupPolicyPriority.clear();
+               while (getline(iss, token, ';')) {
+                       mWakeupPolicyPriority.push_back(token);
+                       MWR_LOGD("wakeup_policy_priority : %s", token.c_str());
+               }
+               free(wakeup_policy_priority);
+               wakeup_policy_priority = nullptr;
+       }
+       vconf_ret = vconf_get_dbl(WAKEUP_SETTINGS_KEY_STREAMING_DURATION_MAX, &vconf_double);
+       if (0 == vconf_ret) {
+               mStreamingDurationMax = vconf_double;
+               MWR_LOGD("streaming_duration_max : %f", mStreamingDurationMax);
+       }
+#ifdef ENABLE_VOICE_INPUT_LANGUAGE_SETTINGS
+       char *voice_input_language = vconf_get_str(WAKEUP_SETTINGS_KEY_VOICE_INPUT_LANGUAGE);
+       if (voice_input_language) {
+               mVoiceInputLanguage = voice_input_language;
+               MWR_LOGD("voice input language : %s", mVoiceInputLanguage.c_str());
+               for (const auto& observer : mObservers) {
+                       if (observer) {
+                               if (!observer->on_voice_input_language_changed(voice_input_language)) {
+                                       LOGW("[Settings WARNING] One of the observer returned false");
+                               }
+                       }
+               }
+               free(voice_input_language);
+               voice_input_language = nullptr;
+       }
+#endif
+
+#ifdef ENABLE_VOICE_INPUT_LANGUAGE_SETTINGS
+       vconf_notify_key_changed(WAKEUP_SETTINGS_KEY_VOICE_INPUT_LANGUAGE,
+               wakeup_setting_input_language_changed_cb, this);
+#endif
+       vconf_notify_key_changed(WAKEUP_SETTINGS_KEY_STREAMING_DURATION_MAX,
+               wakeup_setting_streaming_duration_max_changed_cb, this);
+       vconf_notify_key_changed(mCustomVconfKeys[WAKEUP_SETTINGS_KEY_DEFAULT_ASSISTANT_APPID].c_str(),
+               wakeup_setting_default_assistant_appid_changed_cb, this);
+       if (true == mMultipleMode) {
+               vconf_notify_key_changed(mCustomVconfKeys[WAKEUP_SETTINGS_KEY_ENABLED_ASSISTANTS].c_str(),
+                       wakeup_setting_enabled_assistants_changed_cb, this);
+       }
+       vconf_notify_key_changed(WAKEUP_SETTINGS_KEY_MULTIPLE_MODE,
+               wakeup_setting_multiple_mode_changed_cb, this);
+       vconf_notify_key_changed(mCustomVconfKeys[WAKEUP_SETTINGS_KEY_WAKE_WORD_DETECTION_ENABLED].c_str(),
+               wakeup_setting_enabled_wake_word_detection_changed_cb, this);
+}
+
+void CWakeupSettings::deinitialize()
+{
+#ifdef ENABLE_VOICE_INPUT_LANGUAGE_SETTINGS
+       vconf_ignore_key_changed(WAKEUP_SETTINGS_KEY_VOICE_INPUT_LANGUAGE,
+               wakeup_setting_input_language_changed_cb);
+#endif
+       vconf_ignore_key_changed(WAKEUP_SETTINGS_KEY_STREAMING_DURATION_MAX,
+               wakeup_setting_streaming_duration_max_changed_cb);
+       vconf_ignore_key_changed(mCustomVconfKeys[WAKEUP_SETTINGS_KEY_DEFAULT_ASSISTANT_APPID].c_str(),
+               wakeup_setting_default_assistant_appid_changed_cb);
+       if (true == mMultipleMode) {
+               vconf_ignore_key_changed(mCustomVconfKeys[WAKEUP_SETTINGS_KEY_ENABLED_ASSISTANTS].c_str(),
+                       wakeup_setting_enabled_assistants_changed_cb);
+       }
+       vconf_ignore_key_changed(WAKEUP_SETTINGS_KEY_MULTIPLE_MODE,
+               wakeup_setting_multiple_mode_changed_cb);
+       vconf_ignore_key_changed(mCustomVconfKeys[WAKEUP_SETTINGS_KEY_WAKE_WORD_DETECTION_ENABLED].c_str(),
+               wakeup_setting_enabled_wake_word_detection_changed_cb);
+}
+
+void CWakeupSettings::subscribe(ISettingsEventObserver *observer)
+{
+       mObservers.push_back(observer);
+}
+
+void CWakeupSettings::unsubscribe(ISettingsEventObserver *observer)
+{
+       auto iter = find(mObservers.begin(), mObservers.end(), observer);
+       if (iter != mObservers.end()) {
+               mObservers.erase(iter);
+       }
+}
+
+const vector<ISettingsEventObserver*>& CWakeupSettings::get_observers()
+{
+       return mObservers;
+}
+
+string CWakeupSettings::get_default_assistant_appid()
+{
+       char *vconf_str;
+       vconf_str = vconf_get_str(mCustomVconfKeys[WAKEUP_SETTINGS_KEY_DEFAULT_ASSISTANT_APPID].c_str());
+       MWR_LOGD("vconf default_assistant_appid : %s", vconf_str);
+       if (vconf_str) {
+               mDefaultAssistantAppid = vconf_str;
+               MWR_LOGD("member default_assistant_appid : %s", mDefaultAssistantAppid.c_str());
+               free(vconf_str);
+               vconf_str = nullptr;
+       }
+
+       return mDefaultAssistantAppid;
+}
+
+void CWakeupSettings::set_default_assistant_appid(std::string appid)
+{
+       if (appid.empty()) {
+               MWR_LOGE("appid is NULL");
+               return;
+       }
+       if (appid.compare(get_default_assistant_appid()) == 0) {
+               MWR_LOGE("Default assistant appid not changed, ignoring...");
+               return;
+       }
+       int ret = vconf_set_str(mCustomVconfKeys[WAKEUP_SETTINGS_KEY_DEFAULT_ASSISTANT_APPID].c_str(), appid.c_str());
+       MWR_LOGD("default_assistant_appid : %s, %d", appid.c_str(), ret);
+       mDefaultAssistantAppid = appid;
+}
+
+bool CWakeupSettings::get_ui_panel_enabled()
+{
+       return mUiPanelEnabled;
+}
+
+float CWakeupSettings::get_conversation_timeout()
+{
+       return mConversationTimeout;
+}
+
+bool CWakeupSettings::get_multiple_mode()
+{
+       return mMultipleMode;
+}
+
+vector<string> CWakeupSettings::get_enabled_assistants()
+{
+       return mEnabledAssistants;
+}
+
+float CWakeupSettings::get_wakeup_policy_delay()
+{
+       return mWakeupPolicyDelay;
+}
+
+vector<string> CWakeupSettings::get_wakeup_policy_priority()
+{
+       return mWakeupPolicyPriority;
+}
+
+float CWakeupSettings::get_streaming_duration_max()
+{
+       return mStreamingDurationMax;
+}
+
+void CWakeupSettings::set_streaming_duration_max(float duration)
+{
+       MWR_LOGE("Setting Streaming Duration Max Value : %f", duration);
+       mStreamingDurationMax = duration;
+}
+
+std::string CWakeupSettings::get_current_language(void)
+{
+       std::string result{"en_US"};
+
+#ifdef ENABLE_VOICE_INPUT_LANGUAGE_SETTINGS
+       char* language = vconf_get_str(WAKEUP_SETTINGS_KEY_VOICE_INPUT_LANGUAGE);
+       if (language) {
+               result = language;
+               free(language);
+       }
+#endif
+
+       return result;
+}
+
+vector<string> CWakeupSettings::get_wake_word_disabled_assistants()
+{
+       return mWakeWordDisabledAssistants;
+}
+
+} // wakeup
+} // multiassistant