Deactivate wakeup engines with no activated assistant
[platform/core/uifw/multi-assistant-service.git] / plugins / wakeup-manager / inc / wakeup_engine_manager.h
1 /*
2  * Copyright 2018  Samsung Electronics Co., Ltd
3  *
4  * Licensed under the Flora License, Version 1.1 (the License);
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://floralicense.org/license/
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an AS IS BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef _WAKEUP_ENGINE_MANAGER_H_
18 #define _WAKEUP_ENGINE_MANAGER_H_
19
20 #include "wakeup_manager_wrapper.h"
21
22 #include <multi_assistant.h>
23
24 #include <atomic>
25 #include <string>
26 #include <thread>
27 #include <vector>
28 #include <set>
29
30 namespace multiassistant
31 {
32 namespace wakeup
33 {
34
35 using namespace std;
36
37 /**************************************************************************************
38  *** Definitions for wakeup engine interface
39  *************************************************************************************/
40 #define MA_WAKEUP_ENGINE_PATH                                   tzplatform_mkpath(tzplatform_getid("TZ_SYS_RO_SHARE"), "multiassistant/engines")
41 /* Need to check whether this dedicated engine path also needs to be configurable */
42 #define MA_WAKEUP_DEDICATED_ENGINE_PATH                 "shared/lib/libwakeup-engine.so"
43
44 /* Interfaces without version information */
45 #define MA_WAKEUP_ENGINE_FUNC_INITIALIZE "wakeup_engine_initialize"
46 typedef int (*wakeup_engine_initialize)(void);
47 #define MA_WAKEUP_ENGINE_FUNC_DEINITIALIZE "wakeup_engine_deinitialize"
48 typedef int (*wakeup_engine_deinitialize)(void);
49 #define MA_WAKEUP_ENGINE_FUNC_ACTIVATE "wakeup_engine_activate"
50 typedef int (*wakeup_engine_activate)(void);
51 #define MA_WAKEUP_ENGINE_FUNC_DEACTIVATE "wakeup_engine_deactivate"
52 typedef int (*wakeup_engine_deactivate)(void);
53 #define MA_WAKEUP_ENGINE_FUNC_ADD_WAKEUP_WORD "wakeup_engine_add_wakeup_word"
54 typedef int (*wakeup_engine_add_wakeup_word)(const char* appid, const char* wakeup_word, const char* language);
55 #define MA_WAKEUP_ENGINE_FUNC_ADD_LANGUAGE "wakeup_engine_add_language"
56 typedef int (*wakeup_engine_add_language)(const char* appid, const char* language);
57 #define MA_WAKEUP_ENGINE_FUNC_SET_LANGUAGE "wakeup_engine_set_language"
58 typedef int (*wakeup_engine_set_language)(const char* language);
59 #define MA_WAKEUP_ENGINE_FUNC_UPDATE_MANAGER_STATE "wakeup_engine_update_manager_state"
60 typedef int (*wakeup_engine_update_manager_state)(wakeup_manager_state_e state);
61 #define MA_WAKEUP_ENGINE_FUNC_UPDATE_RECOGNITION_RESULT "wakeup_engine_update_recognition_result"
62 typedef int (*wakeup_engine_update_recognition_result)(const char* appid, int result);
63 #define MA_WAKEUP_ENGINE_FUNC_SET_AUDIO_FORMAT "wakeup_engine_set_audio_format"
64 typedef int (*wakeup_engine_set_audio_format)(int rate, int channel, int audio_type);
65 #define MA_WAKEUP_ENGINE_FUNC_GET_AUDIO_FORMAT "wakeup_engine_get_audio_format"
66 typedef int (*wakeup_engine_get_audio_format)(int* rate, int* channel, int* audio_type);
67 #define MA_WAKEUP_ENGINE_FUNC_FEED_AUDIO_DATA "wakeup_engine_feed_audio_data"
68 typedef int (*wakeup_engine_feed_audio_data)(long time, void* data, int len);
69 #define MA_WAKEUP_ENGINE_FUNC_GET_UTTERANCE_DATA_COUNT "wakeup_engine_get_utterance_data_count"
70 typedef int (*wakeup_engine_get_utterance_data_count)(void);
71 #define MA_WAKEUP_ENGINE_FUNC_GET_UTTERANCE_DATA "wakeup_engine_get_utterance_data"
72 typedef int (*wakeup_engine_get_utterance_data)(int index, wakeup_speech_data *data);
73 #define MA_WAKEUP_ENGINE_FUNC_GET_WAKE_WORD_DATA_COUNT "wakeup_engine_get_wake_word_data_count"
74 typedef int (*wakeup_engine_get_wake_word_data_count)(void);
75 #define MA_WAKEUP_ENGINE_FUNC_GET_WAKE_WORD_DATA "wakeup_engine_get_wake_word_data"
76 typedef int (*wakeup_engine_get_wake_word_data)(int index, wakeup_speech_data *data);
77 #define MA_WAKEUP_ENGINE_FUNC_SET_ASSISTANT_SPECIFIC_COMMAND "wakeup_engine_set_assistant_specific_command"
78 typedef int (*wakeup_engine_set_assistant_specific_command)(const char* appid, const char* command);
79 #define MA_WAKEUP_ENGINE_FUNC_SET_WAKE_WORD_AUDIO_REQUIRE_FLAG "wakeup_engine_set_wake_word_audio_require_flag"
80 typedef int (*wakeup_engine_set_wake_word_audio_require_flag)(bool require);
81 #define MA_WAKEUP_ENGINE_FUNC_SET_WAKEUP_EVENT_CALLBACK "wakeup_engine_set_wakeup_event_callback"
82 typedef int (*wakeup_engine_set_wakeup_event_callback)(wakeup_service_wakeup_event_cb callback, void* user_data);
83 #define MA_WAKEUP_ENGINE_FUNC_SET_SPEECH_STATUS_CALLBACK "wakeup_engine_set_speech_status_callback"
84 typedef int (*wakeup_engine_set_speech_status_callback)(wakeup_service_speech_status_cb callback, void* user_data);
85 #define MA_WAKEUP_ENGINE_FUNC_SET_ERROR_CALLBACK "wakeup_engine_set_error_callback"
86 typedef int (*wakeup_engine_set_error_callback)(wakeup_service_error_cb callback, void* user_data);
87 #define MA_WAKEUP_ENGINE_FUNC_SET_AUDIO_DATA_REQUIRE_STATUS_CALLBACK "wakeup_engine_set_audio_data_require_status_callback"
88 typedef int (*wakeup_engine_set_audio_data_require_status_callback)(wakeup_service_audio_data_require_status_cb callback, void* user_data);
89
90 /* Interfaces after version 1 */
91 #define MA_WAKEUP_ENGINE_FUNC_GET_VERSION "wakeup_engine_get_version"
92 typedef int (*wakeup_engine_get_version)(int* version);
93
94 typedef struct {
95         wakeup_engine_initialize                                                                initialize;
96         wakeup_engine_deinitialize                                                              deinitialize;
97         wakeup_engine_activate                                                                  activate;
98         wakeup_engine_deactivate                                                                deactivate;
99         wakeup_engine_add_wakeup_word                                                   add_wakeup_word;
100         wakeup_engine_add_language                                                              add_language;
101         wakeup_engine_set_language                                                              set_language;
102         wakeup_engine_update_manager_state                                              update_manager_state;
103         wakeup_engine_update_recognition_result                                 update_recognition_result;
104         wakeup_engine_set_audio_format                                                  set_audio_format;
105         wakeup_engine_get_audio_format                                                  get_audio_format;
106         wakeup_engine_feed_audio_data                                                   feed_audio_data;
107         wakeup_engine_get_utterance_data_count                                  get_utterance_data_count;
108         wakeup_engine_get_utterance_data                                                get_utterance_data;
109         wakeup_engine_get_wake_word_data_count                                  get_wake_word_data_count;
110         wakeup_engine_get_wake_word_data                                                get_wake_word_data;
111         wakeup_engine_get_version                                                               get_version;
112         wakeup_engine_set_assistant_specific_command                    set_assistant_specific_command;
113         wakeup_engine_set_wake_word_audio_require_flag                  set_wake_word_audio_require_flag;
114         wakeup_engine_set_wakeup_event_callback                                 set_wakeup_event_callback;
115         wakeup_engine_set_speech_status_callback                                set_speech_status_callback;
116         wakeup_engine_set_error_callback                                                set_error_callback;
117         wakeup_engine_set_audio_data_require_status_callback    set_audio_data_require_status_callback;
118 } wakeup_engine_interface;
119
120 class IEngineEventObserver
121 {
122 public:
123         virtual ~IEngineEventObserver() = default;
124         virtual bool on_wakeup_event(string engine_name, wakeup_event_info wakeup_info) = 0;
125         virtual bool on_speech_status(string engine_name, wakeup_service_speech_status_e status) = 0;
126         virtual bool on_error(string engine_name, int error_code, string error_message) = 0;
127         virtual bool on_audio_data_require_status(string engine_name, bool require) = 0;
128
129         virtual bool on_streaming_audio_data(
130                 wakeup_speech_streaming_event_e event, void* buffer, unsigned int len) = 0;
131         virtual bool on_audio_streaming_data_section(ma_audio_streaming_data_section_e section) = 0;
132 };
133
134 class CWakeupEngineManager
135 {
136 public:
137         CWakeupEngineManager();
138         CWakeupEngineManager(IEngineEventObserver *observer);
139         virtual ~CWakeupEngineManager();
140
141         CWakeupEngineManager(const CWakeupEngineManager&) = delete;
142         CWakeupEngineManager& operator=(const CWakeupEngineManager&) = delete;
143
144         void initialize();
145         void deinitialize();
146
147         void subscribe(IEngineEventObserver *observer);
148         void unsubscribe(IEngineEventObserver *observer);
149
150         bool get_audio_data_required();
151         void set_selected_wakeup_info(wakeup_event_info wakeup_info);
152
153         bool set_language(string language);
154         void set_assistant_activated(string appid, bool activated);
155         bool get_assistant_activated(string appid);
156         void set_wake_word_audio_require_flag(bool require);
157
158         void start_streaming_current_utterance_data();
159         void stop_streaming_current_utterance_data();
160
161         void update_manager_state(wakeup_manager_state_e state);
162         void update_recognition_result(string appid, int result);
163
164         void engine_add_target_assistant(string engine_name, string appid);
165         void engine_add_wakeup_word(string appid, string wakeup_word, string language);
166         void engine_set_assistant_specific_command(string appid, string command);
167         void engine_feed_audio_data(long time, void* data, int len);
168
169         bool on_wakeup_event(string engine_name, wakeup_event_info wakeup_info);
170         bool on_speech_status(string engine_name, wakeup_service_speech_status_e status);
171         bool on_error(string engine_name, int error_code, string error_message);
172         bool on_audio_data_require_status(string engine_name, bool require);
173 private:
174         typedef struct {
175                 int version;
176                 string engine_name;
177                 bool activated{false};
178                 bool audio_data_require_status{false};
179                 string engine_path;
180                 wakeup_engine_interface interface{nullptr, };
181                 vector<string> assistant_list;
182                 set<string> activated_assistants;
183                 void *engine_handle{nullptr};
184         } EngineInfo;
185
186         void add_engine_directory(string name, string path);
187         void add_engine(string name, string path);
188
189         vector<IEngineEventObserver*> mObservers;
190
191         void streaming_speech_data_thread_func();
192
193         vector<EngineInfo> mEngineInfo;
194         const EngineInfo* mSelectedEngine{nullptr};
195         bool mAudioDataRequired{false};
196
197         thread mStreamingThread;
198         atomic_bool mStopStreamingThread{false};
199
200         bool mWakeWordAudioRequired{false};
201 };
202
203 } // wakeup
204 } // multiassistant
205
206 #endif /* _WAKEUP_ENGINE_MANAGER_H_ */