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.
16 #include "wakeup_manager_wrapper.h"
17 #include "wakeup_manager_main.h"
18 #include "wakeup_manager.h"
30 static char g_temp_file_name[128] = {'\0', };
32 static FILE* g_pFile = NULL;
34 static int g_count = 1;
38 static FILE* g_pFile = NULL;
41 using namespace multiassistant::wakeup;
43 static wakeup_service_wakeup_event_cb g_wakeup_event_cb;
44 static void* g_wakeup_event_user_data;
46 static wakeup_service_speech_streaming_cb g_utterance_streaming_cb;
47 static void* g_utterance_streaming_user_data;
49 static wakeup_service_speech_streaming_cb g_previous_utterance_streaming_cb;
50 static void* g_previous_utterance_streaming_user_data;
52 static wakeup_service_speech_streaming_cb g_follow_up_streaming_cb;
53 static void* g_follow_up_streaming_user_data;
55 static wakeup_service_speech_status_cb g_speech_status_cb;
56 static void* g_speech_status_user_data;
58 static wakeup_service_setting_changed_cb g_setting_changed_cb;
59 static void* g_setting_changed_user_data;
61 static wakeup_service_error_cb g_error_cb;
62 static void* g_error_user_data;
64 static wakeup_service_streaming_section_changed_cb g_streaming_section_changed_cb;
65 static void* g_streaming_section_changed_user_data;
67 static wakeup_service_engine_command_cb g_wakeup_engine_command_cb;
68 static void* g_wakeup_engine_command_user_data;
70 static wakeup_service_state_changed_cb g_wakeup_service_state_changed_cb;
71 static void *g_wakeup_service_state_changed_user_data;
73 static wakeup_service_voice_key_status_changed_cb g_wakeup_service_voice_key_status_changed_cb;
74 static void *g_wakeup_service_voice_key_status_changed_user_data;
76 static wakeup_service_loaded_engine_changed_cb g_loaded_engine_changed_cb;
77 static void *g_loaded_engine_changed_user_data;
79 class CWakeupEventObserver : public IWakeupEventObserver
81 void on_wakeup(mas_wakeup_event_info wakeup_info) override;
82 void on_streaming_audio_data(
83 mas_speech_streaming_event_e event, void* buffer, unsigned int len) override;
84 void on_audio_streaming_data_section(ma_audio_streaming_data_section_e section) override;
85 void on_wakeup_engine_command(
86 mas_wakeup_engine_command_target_e target, const char* assistant_name, const char* command) override;
87 void on_wakeup_service_state_changed(ma_service_state_e state) override;
88 void on_voice_key_status_changed(ma_voice_key_status_e status) override;
91 class CSettingValueObserver : public ISettingValueObserver
93 void on_value_changed() override;
94 void on_loaded_wakeup_engine_changed() override;
97 static std::unique_ptr<CWakeupEventObserver> g_wakeup_event_observer;
98 static std::unique_ptr<CSettingValueObserver> g_setting_value_observer;
99 static std::unique_ptr<CWakeupManager> g_wakeup_manager;
101 int wakeup_manager_feed_audio_data(mas_speech_streaming_event_e event, void* buffer, int len);
104 static Eina_Bool file_read_feed(void *data)
106 if (g_pFile == NULL) {
107 g_pFile = fopen("/tmp/ma_feed_file", "rb");
108 if (g_pFile == NULL) return EINA_FALSE;
116 const size_t BUFFER_SIZE = 4096;
117 unsigned char buffer[BUFFER_SIZE];
118 size_t len = fread(buffer, sizeof(unsigned char), BUFFER_SIZE, g_pFile);
119 wakeup_manager_feed_audio_data(MAS_SPEECH_STREAMING_EVENT_CONTINUE, buffer, len);
125 int wakeup_manager_initialize(void)
130 g_wakeup_event_observer.reset(new CWakeupEventObserver);
131 g_setting_value_observer.reset(new CSettingValueObserver);
132 if (NULL == g_wakeup_event_observer || NULL == g_setting_value_observer) {
135 g_wakeup_manager.reset(new CWakeupManager(g_wakeup_event_observer.get(), g_setting_value_observer.get()));
136 if (NULL == g_wakeup_manager) {
139 } catch (const std::exception& e) {
140 MWR_LOGE("Exception caught : %s", e.what());
144 g_wakeup_event_cb = NULL;
145 g_wakeup_event_user_data = NULL;
147 g_utterance_streaming_cb = NULL;
148 g_utterance_streaming_user_data = NULL;
150 g_follow_up_streaming_cb = NULL;
151 g_follow_up_streaming_user_data = NULL;
153 g_speech_status_cb = NULL;
154 g_speech_status_user_data = NULL;
156 g_setting_changed_cb = NULL;
157 g_setting_changed_user_data = NULL;
160 g_error_user_data = NULL;
162 g_streaming_section_changed_cb = NULL;
163 g_streaming_section_changed_user_data = NULL;
165 g_wakeup_engine_command_cb = NULL;
166 g_wakeup_engine_command_user_data = NULL;
168 g_wakeup_service_state_changed_cb = NULL;
169 g_wakeup_service_state_changed_user_data = NULL;
171 g_wakeup_service_voice_key_status_changed_cb = NULL;
172 g_wakeup_service_voice_key_status_changed_user_data = NULL;
174 g_loaded_engine_changed_cb = NULL;
175 g_loaded_engine_changed_user_data = NULL;
177 g_wakeup_manager->initialize();
186 MWR_LOGD("[Recorder Info] File not found!");
190 snprintf(g_temp_file_name, sizeof(g_temp_file_name), "/tmp/wakeup_manager_%d_%d", getpid(), g_count);
191 int ret = access(g_temp_file_name, 0);
194 MWR_LOGD("[Recorder ERROR] File is already exist");
195 if (0 == remove(g_temp_file_name)) {
196 MWR_LOGD("[Recorder] Remove file");
206 MWR_LOGD("[Recorder] Temp file name=[%s]", g_temp_file_name);
209 g_pFile = fopen(g_temp_file_name, "wb+x");
211 MWR_LOGD("[Recorder ERROR] File not found!");
217 Ecore_Timer* timer = ecore_timer_add(0.01f, file_read_feed, NULL);
222 int wakeup_manager_deinitialize(void)
228 MWR_LOGE("[Recorder SUCCESS] File Close");
234 if (nullptr == g_wakeup_manager) return -1;
237 g_wakeup_manager->deinitialize();
238 g_wakeup_manager.reset();
240 g_wakeup_event_observer.reset();
241 g_setting_value_observer.reset();
242 } catch (const std::exception& e) {
243 MWR_LOGE("Exception caught : %s", e.what());
251 int wakeup_manager_get_settings(ma_plugin_settings **settings, size_t *struct_size)
253 if (NULL == settings || NULL == struct_size) {
254 MWR_LOGD("[ERROR] Parameter is invalid, settings(%p), struct_size(%p)", settings, struct_size);
258 if (nullptr == g_wakeup_manager) return -1;
259 CWakeupSettings* wakeup_settings = g_wakeup_manager->get_wakeup_settings();
260 if (wakeup_settings) {
261 const int PLUGIN_VERSION = 1;
262 static ma_plugin_settings current_settings;
263 current_settings.plugin_version = PLUGIN_VERSION;
264 current_settings.ui_panel_enabled = wakeup_settings->get_ui_panel_enabled();
265 *struct_size = sizeof(current_settings);
266 *settings = ¤t_settings;
272 int wakeup_manager_add_assistant_wakeup_word(const char* appid, const char* wakeup_word, const char* language)
276 if (NULL == appid || NULL == wakeup_word) {
277 MWR_LOGD("[ERROR] Parameter is invalid, appid(%s), wakeup_word(%s), language(%s)", appid, wakeup_word, language);
281 if (nullptr == g_wakeup_manager) return -1;
282 g_wakeup_manager->add_assistant_wakeup_word(
283 string{appid}, string{wakeup_word}, (language ? string{language} : string{}));
289 int wakeup_manager_remove_assistant_wakeup_word(const char* appid, const char* wakeup_word, const char* language)
293 if (NULL == appid || NULL == wakeup_word) {
294 MWR_LOGD("[ERROR] Parameter is invalid, appid(%s), wakeup_word(%s), language(%s)", appid, wakeup_word, language);
298 if (nullptr == g_wakeup_manager) return -1;
299 g_wakeup_manager->remove_assistant_wakeup_word(
300 string{appid}, string{wakeup_word}, (language ? string{language} : string{}));
306 int wakeup_manager_add_assistant_language(const char* appid, const char* language)
310 if (NULL == appid || NULL == language) {
311 MWR_LOGD("[ERROR] Parameter is invalid, appid(%s), language(%s)", appid, language);
315 if (nullptr == g_wakeup_manager) return -1;
316 g_wakeup_manager->add_assistant_language(string{appid}, string{language});
318 MWR_LOGD("[DEBUG] language(%s)", language);
324 int wakeup_manager_add_assistant_wakeup_engine(const char* appid, const char* engine)
328 if (NULL == appid || NULL == engine) {
329 MWR_LOGD("[ERROR] Parameter is invalid, appid(%s), wakeup engine(%s)", appid, engine);
333 if (nullptr == g_wakeup_manager) return -1;
334 MWR_LOGD("[DEBUG] appid(%s), wakeup engine(%s)", appid, engine);
335 g_wakeup_manager->add_assistant_wakeup_engine(string{appid}, string{engine});
341 int wakeup_manager_set_default_assistant(const char* appid)
346 MWR_LOGD("[ERROR] Parameter is NULL");
350 if (nullptr == g_wakeup_manager) return -1;
351 MWR_LOGD("[DEBUG] default_assistant appid(%s)", appid);
352 g_wakeup_manager->set_default_assistant(string{appid});
358 int wakeup_manager_get_default_assistant(const char** appid)
360 static string default_assistant;
362 if (nullptr == g_wakeup_manager) return -1;
363 default_assistant = g_wakeup_manager->get_default_assistant();
365 if (default_assistant.empty()) {
368 *appid = default_assistant.c_str();
373 int wakeup_manager_set_language(const char* language)
377 if (NULL == language) {
378 MWR_LOGD("[ERROR] Parameter is NULL");
382 if (nullptr == g_wakeup_manager) return -1;
383 g_wakeup_manager->set_language(string{language});
389 int wakeup_manager_change_state(wakeup_manager_state_e state)
391 if (nullptr == g_wakeup_manager) return -1;
392 g_wakeup_manager->change_manager_state(state);
396 int wakeup_manager_activate(void)
400 if (nullptr == g_wakeup_manager) return -1;
401 g_wakeup_manager->activate();
407 int wakeup_manager_deactivate(void)
411 if (nullptr == g_wakeup_manager) return -1;
412 g_wakeup_manager->deactivate();
418 int wakeup_manager_update_voice_feedback_state(const char* appid, int state)
424 MWR_LOGD("[ERROR] Parameter is NULL");
426 appid_string = appid;
429 if (nullptr == g_wakeup_manager) return -1;
430 g_wakeup_manager->update_voice_feedback_state(appid_string, state);
436 int wakeup_manager_set_assistant_specific_command(const char* appid, const char* command)
441 string command_string;
442 if (NULL == appid || NULL == command) {
443 MWR_LOGD("[ERROR] Parameter is invalid, appid(%s), command(%s)", appid, command);
445 if (appid) appid_string = appid;
446 if (command) command_string = command;
448 if (nullptr == g_wakeup_manager) return -1;
449 g_wakeup_manager->set_assistant_specific_command(appid_string, command_string);
455 int wakeup_manager_set_background_volume(const char* appid, double ratio)
461 MWR_LOGD("[ERROR] Parameter is NULL");
463 appid_string = appid;
466 if (nullptr == g_wakeup_manager) return -1;
467 g_wakeup_manager->set_background_volume(appid_string, ratio);
473 int wakeup_manager_update_recognition_result(const char* appid, int result)
479 MWR_LOGD("[ERROR] Parameter is NULL");
481 appid_string = appid;
484 if (nullptr == g_wakeup_manager) return -1;
485 g_wakeup_manager->update_recognition_result(appid_string, result);
491 int wakeup_manager_process_plugin_event(mas_plugin_event_e event, void* data, int len)
495 if (nullptr == g_wakeup_manager) return -1;
496 g_wakeup_manager->process_plugin_event(event, data, len);
502 int wakeup_manager_start_streaming_utterance_data(void)
506 if (nullptr == g_wakeup_manager) return -1;
507 g_wakeup_manager->start_streaming_utterance_data();
513 int wakeup_manager_stop_streaming_utterance_data(void)
517 if (nullptr == g_wakeup_manager) return -1;
518 g_wakeup_manager->stop_streaming_utterance_data();
524 int wakeup_manager_start_streaming_follow_up_data(void)
528 if (nullptr == g_wakeup_manager) return -1;
529 g_wakeup_manager->start_streaming_follow_up_data();
535 int wakeup_manager_stop_streaming_follow_up_data(void)
539 if (nullptr == g_wakeup_manager) return -1;
540 g_wakeup_manager->stop_streaming_follow_up_data();
546 int wakeup_manager_start_streaming_previous_utterance_data(void)
550 if (nullptr == g_wakeup_manager) return -1;
551 g_wakeup_manager->start_streaming_previous_utterance_data();
557 int wakeup_manager_stop_streaming_previous_utterance_data(void)
561 if (nullptr == g_wakeup_manager) return -1;
562 g_wakeup_manager->stop_streaming_previous_utterance_data();
568 int wakeup_manager_get_audio_format(int* rate, int* channel, int* audio_type)
572 if (!audio_type || !rate || !channel) {
573 MWR_LOGE("[ERROR] Invalid parameter");
577 if (nullptr == g_wakeup_manager) return -1;
578 g_wakeup_manager->get_audio_format(rate, channel, audio_type);
580 MWR_LOGD("[END] rate(%d), channel(%d), audio_type(%d)", *rate, *channel, *audio_type);
584 int wakeup_manager_get_audio_source_type(char** type)
589 MWR_LOGE("[ERROR] Invalid parameter");
593 if (nullptr == g_wakeup_manager) return -1;
594 g_wakeup_manager->get_audio_source_type(type);
596 MWR_LOGD("[END] type(%s)", *type);
600 int wakeup_manager_set_voice_key_tap_duration(float duration)
604 if (nullptr == g_wakeup_manager) return -1;
605 g_wakeup_manager->set_voice_key_tap_duration(duration);
607 MWR_LOGD("[END] duration(%f)", duration);
611 int wakeup_manager_unset_voice_key_tap_duration()
615 if (nullptr == g_wakeup_manager) return -1;
616 g_wakeup_manager->unset_voice_key_tap_duration();
622 int wakeup_manager_set_voice_key_support_mode(int mode)
624 MWR_LOGI("[ENTER] : %d", mode);
626 if (nullptr == g_wakeup_manager) return -1;
627 g_wakeup_manager->set_voice_key_support_mode(static_cast<VOICE_KEY_SUPPORT_MODE>(mode));
633 int wakeup_manager_set_wake_word_audio_require_flag(bool require)
635 MWR_LOGI("[ENTER] : %d", require);
637 if (nullptr == g_wakeup_manager) return -1;
638 g_wakeup_manager->set_wake_word_audio_require_flag(require);
644 int wakeup_manager_set_assistant_language(const char* appid, const char* language)
649 string language_string;
650 if (NULL == appid || NULL == language) {
651 MWR_LOGE("[ERROR] Parameter is invalid, appid(%s), language(%s)", appid, language);
654 appid_string = appid;
655 language_string = language;
657 if (nullptr == g_wakeup_manager) return -1;
658 g_wakeup_manager->set_assistant_language(appid_string, language_string);
664 int wakeup_manager_set_wakeup_event_callback(wakeup_service_wakeup_event_cb callback, void* user_data)
668 if (NULL == callback) {
669 MWR_LOGE("[ERROR] Input parameter is NULL");
673 g_wakeup_event_cb = callback;
674 g_wakeup_event_user_data = user_data;
680 int wakeup_manager_set_utterance_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data)
684 if (NULL == callback) {
685 MWR_LOGE("[ERROR] Input parameter is NULL");
689 g_utterance_streaming_cb = callback;
690 g_utterance_streaming_user_data = user_data;
696 int wakeup_manager_set_previous_utterance_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data)
700 if (NULL == callback) {
701 MWR_LOGE("[ERROR] Input parameter is NULL");
705 g_previous_utterance_streaming_cb = callback;
706 g_previous_utterance_streaming_user_data = user_data;
712 int wakeup_manager_set_follow_up_streaming_callback(wakeup_service_speech_streaming_cb callback, void* user_data)
716 if (NULL == callback) {
717 MWR_LOGE("[ERROR] Input parameter is NULL");
721 g_follow_up_streaming_cb = callback;
722 g_follow_up_streaming_user_data = user_data;
728 int wakeup_manager_set_speech_status_callback(wakeup_service_speech_status_cb callback, void* user_data)
732 if (NULL == callback) {
733 MWR_LOGE("[ERROR] Input parameter is NULL");
737 g_speech_status_cb = callback;
738 g_speech_status_user_data = user_data;
744 int wakeup_manager_set_setting_changed_callback(wakeup_service_setting_changed_cb callback, void* user_data)
748 if (NULL == callback) {
749 MWR_LOGE("[ERROR] Input parameter is NULL");
753 g_setting_changed_cb = callback;
754 g_setting_changed_user_data = user_data;
760 int wakeup_manager_set_error_callback(wakeup_service_error_cb callback, void* user_data)
764 if (NULL == callback) {
765 MWR_LOGE("[ERROR] Input parameter is NULL");
769 g_error_cb = callback;
770 g_error_user_data = user_data;
776 int wakeup_manager_set_streaming_section_changed_callback(wakeup_service_streaming_section_changed_cb callback, void* user_data)
780 if (NULL == callback) {
781 MWR_LOGE("[ERROR] Input parameter is NULL");
785 g_streaming_section_changed_cb = callback;
786 g_streaming_section_changed_user_data = user_data;
792 int wakeup_manager_set_wakeup_engine_command_callback(wakeup_service_engine_command_cb callback, void* user_data)
796 if (NULL == callback) {
797 MWR_LOGE("[ERROR] Input parameter is NULL");
801 g_wakeup_engine_command_cb = callback;
802 g_wakeup_engine_command_user_data = user_data;
808 int wakeup_manager_set_wakeup_service_state_changed_callback(wakeup_service_state_changed_cb callback, void* user_data)
812 if (NULL == callback) {
813 MWR_LOGE("[ERROR] Input parameter is NULL");
817 g_wakeup_service_state_changed_cb = callback;
818 g_wakeup_service_state_changed_user_data = user_data;
824 int wakeup_manager_set_voice_key_status_changed_callback(wakeup_service_voice_key_status_changed_cb callback, void* user_data)
828 if (NULL == callback) {
829 MWR_LOGE("[ERROR] Input parameter is NULL");
833 g_wakeup_service_voice_key_status_changed_cb = callback;
834 g_wakeup_service_voice_key_status_changed_user_data = user_data;
840 int wakeup_manager_set_loaded_engine_changed_callback(wakeup_service_loaded_engine_changed_cb callback, void* user_data)
844 if (NULL == callback) {
845 MWR_LOGE("[ERROR] Input parameter is NULL");
849 g_loaded_engine_changed_cb = callback;
850 g_loaded_engine_changed_user_data = user_data;
856 int wakeup_manager_feed_audio_data(mas_speech_streaming_event_e event, void* buffer, int len)
858 if (nullptr == g_wakeup_manager) return -1;
862 const int MAXIMUM_NUM = 1000;
863 if (g_pFile && num++ < MAXIMUM_NUM)
864 fwrite(buffer, 1, len, g_pFile);
867 g_wakeup_manager->feed_audio_data(event, buffer, len);
872 int wakeup_manager_set_dependency_module_command(const char* engine_name, const char* command)
874 if (nullptr == g_wakeup_manager) return -1;
875 g_wakeup_manager->set_dependency_module_command(
876 engine_name ? engine_name : "",
877 command ? command : "");
881 int wakeup_manager_wakeup_assistant(const mas_wakeup_event_info* wakeup_info)
883 if (nullptr == g_wakeup_manager) return -1;
884 CWakeupPolicy* policy = g_wakeup_manager->get_wakeup_policy();
885 if (policy) policy->select_candidate(*wakeup_info);
889 void CWakeupEventObserver::on_wakeup(mas_wakeup_event_info wakeup_info)
891 if (NULL != g_wakeup_event_cb) {
892 g_wakeup_event_cb(wakeup_info, g_wakeup_event_user_data);
896 void CWakeupEventObserver::on_streaming_audio_data(
897 mas_speech_streaming_event_e event, void* buffer, unsigned int len)
899 if (MAS_SPEECH_STREAMING_EVENT_START == event) {
900 MWR_LOGI("streaming_cb START");
902 if (MAS_SPEECH_STREAMING_EVENT_FINISH == event) {
903 MWR_LOGI("streaming_cb FINISH");
905 if (NULL != g_utterance_streaming_cb) {
906 g_utterance_streaming_cb(event, buffer, len, g_utterance_streaming_user_data);
908 MWR_LOGI("[INFO] No service streaming callback");
912 void CWakeupEventObserver::on_audio_streaming_data_section(
913 ma_audio_streaming_data_section_e section)
915 if (g_streaming_section_changed_cb) {
916 g_streaming_section_changed_cb(section, g_streaming_section_changed_user_data);
920 void CWakeupEventObserver::on_wakeup_engine_command(
921 mas_wakeup_engine_command_target_e target, const char* assistant_name, const char* command)
923 if (g_wakeup_engine_command_cb) {
924 g_wakeup_engine_command_cb(target, assistant_name, command, g_wakeup_engine_command_user_data);
928 void CWakeupEventObserver::on_wakeup_service_state_changed(ma_service_state_e state)
930 if (g_wakeup_service_state_changed_cb) {
931 g_wakeup_service_state_changed_cb(state, g_wakeup_service_state_changed_user_data);
935 void CWakeupEventObserver::on_voice_key_status_changed(ma_voice_key_status_e status)
937 if (g_wakeup_service_voice_key_status_changed_cb) {
938 g_wakeup_service_voice_key_status_changed_cb(status, g_wakeup_service_voice_key_status_changed_user_data);
942 void CSettingValueObserver::on_value_changed()
944 if (g_setting_changed_cb) {
945 g_setting_changed_cb(g_setting_changed_user_data);
949 void CSettingValueObserver::on_loaded_wakeup_engine_changed()
951 if (g_loaded_engine_changed_cb) {
952 g_loaded_engine_changed_cb(g_loaded_engine_changed_user_data);