2 * Copyright 2018-2019 Samsung Electronics Co., Ltd
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
8 * http://floralicense.org/license/
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.
18 #ifndef _WAKEUP_MANAGER_H_
19 #define _WAKEUP_MANAGER_H_
21 #include "service_config.h"
22 #include "wakeup_manager_wrapper.h"
23 #include "wakeup_settings.h"
24 #include "wakeup_engine_manager.h"
25 #include "wakeup_audio_manager.h"
26 #include "wakeup_policy_default.h"
27 #include "assistant_config_manager.h"
33 namespace multiassistant
40 enum class STREAMING_MODE {
47 class IWakeupEventObserver {
49 virtual ~IWakeupEventObserver() = default;
50 virtual void on_wakeup(mas_wakeup_event_info wakeup_info) = 0;
51 virtual void on_streaming_audio_data(
52 mas_speech_streaming_event_e event, void* buffer, unsigned int len) = 0;
53 virtual void on_audio_streaming_data_section(ma_audio_streaming_data_section_e section) = 0;
54 virtual void on_wakeup_engine_command(
55 mas_wakeup_engine_command_target_e target, const char* name, const char* command) = 0;
56 virtual void on_wakeup_service_state_changed(ma_service_state_e state) = 0;
57 virtual void on_voice_key_status_changed(ma_voice_key_status_e status) = 0;
60 class ISettingValueObserver {
62 virtual ~ISettingValueObserver() = default;
63 virtual void on_value_changed() = 0;
64 virtual void on_loaded_wakeup_engine_changed() = 0;
67 /* If a wakeup event is raised by pressing a voice key,
68 the wakeup_engine attribute of wakeup_event_info will have the following value */
69 #define WAKEUP_ENGINE_VOICE_KEY "voice_key"
74 CWakeupManager(IWakeupEventObserver* wakeup_observer, ISettingValueObserver* setting_observer);
75 virtual ~CWakeupManager();
77 CWakeupManager(const CWakeupManager&) = delete;
78 CWakeupManager& operator=(const CWakeupManager&) = delete;
83 void subscribe_wakeup_observer(IWakeupEventObserver* observer);
84 void unsubscribe_wakeup_observer(IWakeupEventObserver* observer);
86 void subscribe_setting_observer(ISettingValueObserver* observer);
87 void unsubscribe_setting_observer(ISettingValueObserver* observer);
92 bool add_assistant_language(string appid, string language);
93 bool add_assistant_wakeup_word(string appid, string wakeup_word, string language);
94 bool remove_assistant_wakeup_word(string appid, string wakeup_word, string language);
95 bool add_assistant_wakeup_engine(string appid, string engine);
96 bool set_assistant_language(string appid, string language);
98 bool set_assistant_enabled(string appid, bool enabled);
99 bool get_assistant_enabled(string appid);
100 bool set_default_assistant(string appid);
101 bool process_default_assistant_changed(string appid, bool expected);
102 string get_default_assistant();
104 bool update_voice_feedback_state(string appid, bool state);
105 bool set_assistant_specific_command(string appid, string command);
106 bool set_background_volume(string appid, double ratio);
107 bool update_recognition_result(string appid, int result);
108 bool process_plugin_event(mas_plugin_event_e event, void* data, int len);
109 bool get_audio_format(int* rate, int* channel, int* audio_type);
110 bool get_audio_source_type(char** type);
111 bool set_language(string language);
112 bool get_recording_by_voice_key();
113 void set_recording_by_voice_key(bool recording);
114 bool set_voice_key_tap_duration(float duration);
115 bool unset_voice_key_tap_duration();
116 bool set_voice_key_support_mode(VOICE_KEY_SUPPORT_MODE mode);
117 bool set_wake_word_audio_require_flag(bool require);
119 STREAMING_MODE get_streaming_mode();
120 bool set_streaming_mode(STREAMING_MODE mode);
122 bool start_streaming_utterance_data();
123 bool stop_streaming_utterance_data();
124 bool start_streaming_follow_up_data();
125 bool stop_streaming_follow_up_data();
126 bool start_streaming_previous_utterance_data();
127 bool stop_streaming_previous_utterance_data();
129 CWakeupPolicy* get_wakeup_policy();
130 CWakeupEngineManager* get_engine_manager();
131 CAudioManager* get_audio_manager();
132 CWakeupSettings* get_wakeup_settings();
134 vector<IWakeupEventObserver*> get_wakeup_observers();
135 void set_last_wakeup_event_info(mas_wakeup_event_info wakeup_info);
137 vector<ISettingValueObserver*> get_setting_observers();
139 bool change_manager_state(wakeup_manager_state_e state);
140 wakeup_manager_state_e get_manager_state();
142 void feed_audio_data(mas_speech_streaming_event_e event, void* buffer, int len);
143 void set_dependency_module_command(string engine_name, string command);
145 void start_streaming_duration_timer();
146 void stop_streaming_duration_timer();
148 void set_streaming_duration_timer(Ecore_Timer* timer);
149 Ecore_Timer* get_streaming_duration_timer();
151 void start_periodic_monitor_timer();
152 void stop_periodic_monitor_timer();
155 class CEngineEventObserver : public IEngineEventObserver
158 bool on_wakeup_event(string engine_name, mas_wakeup_event_info wakeup_info) override;
159 bool on_speech_status(string engine_name, mas_speech_status_e status) override;
160 bool on_error(string engine_name, int error_code, string error_message) override;
161 bool on_audio_data_require_status(string engine_name, bool require) override;
163 bool on_streaming_audio_data(
164 mas_speech_streaming_event_e event, void* buffer, unsigned int len) override;
165 bool on_audio_streaming_data_section(ma_audio_streaming_data_section_e section) override;
166 bool on_wakeup_engine_command(
167 mas_wakeup_engine_command_target_e target, string engine, string name, string command) override;
169 void set_wakeup_manager(CWakeupManager *manager) { mWakeupManager = manager; }
171 CWakeupManager *mWakeupManager{nullptr};
174 class CPolicyEventObserver : public IPolicyEventObserver
177 void on_wakeup(mas_wakeup_event_info wakeup_info) override;
179 void set_wakeup_manager(CWakeupManager *manager) { mWakeupManager = manager; }
181 CWakeupManager *mWakeupManager{nullptr};
184 class CAudioEventObserver : public IAudioEventObserver
187 bool on_recording_audio_data(long time, void* data, int len) override;
188 bool on_streaming_audio_data(
189 mas_speech_streaming_event_e event, void* buffer, unsigned int len) override;
191 void set_wakeup_manager(CWakeupManager *manager) { mWakeupManager = manager; }
192 void set_wakeup_engine_manager(CWakeupEngineManager *manager) { mEngineManager = manager; }
194 CWakeupManager *mWakeupManager{nullptr};
195 CWakeupEngineManager *mEngineManager{nullptr};
198 class CSettingsEventObserver : public ISettingsEventObserver
201 bool on_voice_input_language_changed(const char* language) override;
202 bool on_assistant_enabled_info_changed(const char* appid, bool enabled) override;
203 bool on_default_assistant_appid_changed(const char* appid) override;
204 bool on_multiple_mode_changed() override;
206 void set_wakeup_manager(CWakeupManager *manager) { mWakeupManager = manager; }
208 CWakeupManager *mWakeupManager{nullptr};
211 void initialize_wakeup_policy();
215 vector<string> languageList;
216 } AssistantLanguageInfo;
217 vector<AssistantLanguageInfo> mAssistantLanguageInfo;
218 map<string, bool> mAssistantSupportsCurrentLanguage;
219 map<string, bool> mAssistantEnabled;
221 vector<IWakeupEventObserver*> mWakeupObservers;
222 vector<ISettingValueObserver*> mSettingObservers;
224 unique_ptr<CWakeupPolicy> mWakeupPolicy;
226 CAudioManager mAudioManager;
227 CWakeupEngineManager mWakeupEngineManager;
228 CWakeupSettings mWakeupSettings;
229 CAssistantConfigManager mAssistantConfigManager;
231 CAudioEventObserver mAudioEventObserver;
232 CEngineEventObserver mEngineEventObserver;
233 CPolicyEventObserver mPolicyEventObserver;
234 CSettingsEventObserver mSettingsEventObserver;
236 thread mEngineDataThread;
237 atomic_bool mStopEngineDataThread{false};
239 bool mRecordingByVoiceKey{false};
241 string mCurrentLanguage;
242 string mCurrentDefaultAssistant;
243 /* Assume Push-to-talk is the default mode */
244 VOICE_KEY_SUPPORT_MODE mCurrentVoiceKeySupportMode{VOICE_KEY_SUPPORT_MODE_PUSH_TO_TALK};
246 STREAMING_MODE mStreamingMode{STREAMING_MODE::NONE};
247 Ecore_Timer* mStreamingDurationTimer{nullptr};
248 Ecore_Timer* mPeriodicMonitorTimer{nullptr};
250 wakeup_manager_state_e mWakeupManagerState{WAKEUP_MANAGER_STATE_INACTIVE};
252 mas_wakeup_event_info mLastWakeupEventInfo;
260 #endif /* _WAKEUP_MANAGER_H_ */