2 * Copyright (c) 2011-2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (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://www.apache.org/licenses/LICENSE-2.0
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.
21 #include "vcd_client_data.h"
22 #include "vcd_config.h"
23 #include "vcd_engine_agent.h"
25 #include "vcd_recorder.h"
29 * Internal data structure
37 /* engine load info */
40 bool is_command_ready;
43 vcpe_funcs_s* pefuncs;
44 vcpd_funcs_s* pdfuncs;
46 int (*vcp_load_engine)(vcpd_funcs_s* pdfuncs, vcpe_funcs_s* pefuncs);
47 int (*vcp_unload_engine)();
50 typedef struct _vcengine_info {
61 /** vc engine agent init */
62 static bool g_agent_init;
65 static GList *g_engine_list;
67 /** current engine information */
68 static vcengine_s g_dynamic_engine;
70 static char* g_default_lang;
72 /** callback functions */
73 static result_callback g_result_cb = NULL;
75 static asr_result_callback g_asr_result_cb = NULL;
76 static nlg_result_callback g_nlg_result_cb = NULL;
79 static pre_result_callback g_pre_result_cb = NULL;
81 static nlu_result_callback g_nlu_result_cb = NULL;
84 static error_callback g_error_cb = NULL;
86 bool __supported_language_cb(const char* language, void* user_data);
88 void __engine_info_cb(const char* engine_uuid, const char* engine_name, const char* engine_setting, bool use_network, void* user_data);
90 bool __engine_setting_cb(const char* key, const char* value, void* user_data);
92 /** Free voice list */
93 void __free_language_list(GList* lang_list);
100 /** check engine id */
101 int __internal_check_engine_id(const char* engine_uuid);
103 /** update engine list */
104 int __internal_update_engine_list();
106 /** get engine info */
107 int __internal_get_engine_info(const char* filepath, vcengine_info_s** info);
109 int __log_enginelist();
112 * VCS Engine Agent Interfaces
114 //int vcd_engine_agent_init(pre_result_callback pre_result_cb, result_callback result_cb, nlu_result_callback nlu_result_cb, error_callback error_cb)
115 int vcd_engine_agent_init(asr_result_callback asr_result_cb, result_callback result_cb, nlg_result_callback nlg_result_cb, error_callback error_cb)
117 if (/*NULL == pre_result_cb*/ NULL == asr_result_cb || NULL == result_cb /*|| NULL == nlu_result_cb*/ || NULL == error_cb) {
118 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Input parameter is NULL");
119 return VCD_ERROR_OPERATION_FAILED;
122 /* init dynamic engine */
123 g_dynamic_engine.engine_uuid = NULL;
124 g_dynamic_engine.engine_name = NULL;
125 g_dynamic_engine.engine_path = NULL;
127 g_dynamic_engine.is_set = false;
128 g_dynamic_engine.is_loaded = false;
129 g_dynamic_engine.handle = NULL;
130 g_dynamic_engine.is_command_ready = false;
131 g_dynamic_engine.pefuncs = (vcpe_funcs_s*)calloc(1, sizeof(vcpe_funcs_s));
132 g_dynamic_engine.pdfuncs = (vcpd_funcs_s*)calloc(1, sizeof(vcpd_funcs_s));
136 //g_pre_result_cb = pre_result_cb;
137 g_asr_result_cb = asr_result_cb;
138 g_nlg_result_cb = nlg_result_cb;
139 g_result_cb = result_cb;
140 //g_nlu_result_cb = nlu_result_cb;
141 g_error_cb = error_cb;
143 if (0 != vcd_config_get_default_language(&g_default_lang)) {
144 SLOG(LOG_WARN, TAG_VCD, "[Server WARNING] There is No default voice in config");
145 /* Set default voice */
146 g_default_lang = strdup(VC_BASE_LANGUAGE);
149 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent SUCCESS] Engine Agent Initialize");
154 int vcd_engine_agent_release()
156 if (false == g_agent_init) {
157 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
158 return VCD_ERROR_OPERATION_FAILED;
161 /* unload current engine */
162 vcd_engine_agent_unload_current_engine();
164 /* release engine list */
166 vcengine_s *data = NULL;
168 if (g_list_length(g_engine_list) > 0) {
169 /* Get a first item */
170 iter = g_list_first(g_engine_list);
172 while (NULL != iter) {
173 /* Get handle data from list */
175 iter = g_list_remove(iter, data);
178 if (NULL != data->engine_uuid) {
179 g_free(data->engine_uuid);
180 data->engine_uuid = NULL;
182 if (NULL != data->engine_name) {
183 g_free(data->engine_name);
184 data->engine_name = NULL;
186 if (NULL != data->engine_path) {
187 g_free(data->engine_path);
188 data->engine_path = NULL;
198 g_engine_list = NULL;
200 /* release current engine data */
201 if (NULL != g_dynamic_engine.pefuncs) {
202 free(g_dynamic_engine.pefuncs);
203 g_dynamic_engine.pefuncs = NULL;
205 if (NULL != g_dynamic_engine.pdfuncs) {
206 free(g_dynamic_engine.pdfuncs);
207 g_dynamic_engine.pdfuncs = NULL;
210 g_agent_init = false;
212 //g_pre_result_cb = NULL;
213 g_asr_result_cb = NULL;
214 g_nlg_result_cb = NULL;
216 //g_nlu_result_cb = NULL;
219 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent SUCCESS] Engine Agent release");
224 bool vcd_engine_is_available_engine()
226 if (true == g_dynamic_engine.is_loaded)
232 int vcd_engine_agent_initialize_current_engine()
234 /* check agent init */
235 if (false == g_agent_init) {
236 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
237 return VCD_ERROR_OPERATION_FAILED;
240 /* update engine list */
241 if (0 != __internal_update_engine_list()) {
242 SLOG(LOG_ERROR, TAG_VCD, "[engine agent] vcd_engine_agent_init : __internal_update_engine_list : no engine error");
243 return VCD_ERROR_ENGINE_NOT_FOUND;
246 /* check whether engine id is valid or not.*/
248 vcengine_info_s *dynamic_engine = NULL;
250 if (g_list_length(g_engine_list) > 0) {
252 iter = g_list_first(g_engine_list);
254 while (NULL != iter) {
255 /*Get handle data from list*/
256 dynamic_engine = iter->data;
257 if (NULL != dynamic_engine) {
262 iter = g_list_next(iter);
265 return VCD_ERROR_ENGINE_NOT_FOUND;
268 if (NULL == dynamic_engine) {
269 return VCD_ERROR_ENGINE_NOT_FOUND;
271 if (NULL != g_dynamic_engine.engine_uuid) {
272 /* set data from g_engine_list */
273 if (g_dynamic_engine.engine_uuid != NULL) g_free(g_dynamic_engine.engine_uuid);
274 if (g_dynamic_engine.engine_name != NULL) g_free(g_dynamic_engine.engine_name);
275 if (g_dynamic_engine.engine_path != NULL) g_free(g_dynamic_engine.engine_path);
278 g_dynamic_engine.engine_uuid = g_strdup(dynamic_engine->engine_uuid);
279 g_dynamic_engine.engine_name = g_strdup(dynamic_engine->engine_name);
280 g_dynamic_engine.engine_path = g_strdup(dynamic_engine->engine_path);
282 g_dynamic_engine.handle = NULL;
283 g_dynamic_engine.is_loaded = false;
284 g_dynamic_engine.is_set = true;
286 SLOG(LOG_DEBUG, TAG_VCD, "-----");
287 SLOG(LOG_DEBUG, TAG_VCD, " Dynamic engine uuid : %s", g_dynamic_engine.engine_uuid);
288 SLOG(LOG_DEBUG, TAG_VCD, " Dynamic engine name : %s", g_dynamic_engine.engine_name);
289 SLOG(LOG_DEBUG, TAG_VCD, " Dynamic engine path : %s", g_dynamic_engine.engine_path);
290 SLOG(LOG_DEBUG, TAG_VCD, "-----");
297 int __internal_check_engine_id(const char* engine_uuid)
299 if (NULL == engine_uuid) {
300 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Invalid Parameter");
301 return VCD_ERROR_INVALID_PARAMETER;
305 vcengine_s *data = NULL;
307 if (0 < g_list_length(g_engine_list)) {
309 iter = g_list_first(g_engine_list);
311 while (NULL != iter) {
314 if (0 == strncmp(engine_uuid, data->engine_uuid, strlen(data->engine_uuid))) {
318 iter = g_list_next(iter);
325 void __engine_info_cb(const char* engine_uuid, const char* engine_name, const char* engine_setting, bool use_network, void* user_data)
327 vcengine_info_s* temp = (vcengine_info_s*)user_data;
329 temp->engine_uuid = g_strdup(engine_uuid);
330 temp->engine_name = g_strdup(engine_name);
334 int __internal_get_engine_info(const char* filepath, vcengine_info_s** info)
336 if (NULL == filepath || NULL == info) {
337 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Invalid Parameter");
338 return VCD_ERROR_INVALID_PARAMETER;
345 handle = dlopen(filepath, RTLD_LAZY);
347 SLOG(LOG_WARN, TAG_VCD, "[Engine Agent] Invalid engine : %s", filepath);
348 if ((error = dlerror()) != NULL) {
349 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] %s", error);
354 /* link engine to daemon */
355 dlsym(handle, "vcp_load_engine");
356 if ((error = dlerror()) != NULL) {
357 SLOG(LOG_WARN, TAG_VCD, "[Engine Agent] Invalid engine. Fail to open vcp_load_engine : %s", filepath);
362 dlsym(handle, "vcp_unload_engine");
363 if ((error = dlerror()) != NULL) {
364 SLOG(LOG_WARN, TAG_VCD, "[Engine Agent] Invalid engine. Fail to open vcp_unload_engine : %s", filepath);
369 int (*get_engine_info)(vcpe_engine_info_cb callback, void* user_data);
371 get_engine_info = (int (*)(vcpe_engine_info_cb, void*))dlsym(handle, "vcp_get_engine_info");
372 if (NULL != (error = dlerror()) || NULL == get_engine_info) {
373 SLOG(LOG_WARN, TAG_VCD, "[Engine Agent WARNING] Invalid engine. Fail to open vcp_get_engine_info : %s", filepath);
378 vcengine_info_s* temp;
379 temp = (vcengine_info_s*)calloc(1, sizeof(vcengine_info_s));
381 SLOG(LOG_ERROR, TAG_VCD, "[ERROR] Fail to allocate memory");
383 return VCD_ERROR_OUT_OF_MEMORY;
386 /* get engine info */
387 if (0 != get_engine_info(__engine_info_cb, (void*)temp)) {
388 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to get engine info from engine");
397 temp->engine_path = g_strdup(filepath);
399 SLOG(LOG_DEBUG, TAG_VCD, "----- Valid Engine");
400 SLOG(LOG_DEBUG, TAG_VCD, "Engine uuid : %s", temp->engine_uuid);
401 SLOG(LOG_DEBUG, TAG_VCD, "Engine name : %s", temp->engine_name);
402 SLOG(LOG_DEBUG, TAG_VCD, "Engine path : %s", temp->engine_path);
403 SLOG(LOG_DEBUG, TAG_VCD, "-----");
404 SLOG(LOG_DEBUG, TAG_VCD, " ");
411 int __internal_update_engine_list()
413 /* relsease engine list */
415 vcengine_info_s *data = NULL;
417 if (0 < g_list_length(g_engine_list)) {
418 /* Get a first item */
419 iter = g_list_first(g_engine_list);
421 while (NULL != iter) {
422 /* Get handle data from list */
426 if (NULL != data->engine_uuid) g_free(data->engine_uuid);
427 if (NULL != data->engine_path) g_free(data->engine_path);
428 if (NULL != data->engine_name) g_free(data->engine_name);
430 data->engine_uuid = NULL;
431 data->engine_path = NULL;
432 data->engine_name = NULL;
437 g_engine_list = g_list_remove_link(g_engine_list, iter);
438 iter = g_list_first(g_engine_list);
442 /* Get file name from default engine directory */
444 struct dirent *dirp = NULL;
446 dp = opendir(VC_DEFAULT_ENGINE);
452 if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name))
455 vcengine_info_s* info = NULL;
456 char* filepath = NULL;
459 filesize = strlen(VC_DEFAULT_ENGINE) + strlen(dirp->d_name) + 5;
460 filepath = (char*)calloc(filesize, sizeof(char));
462 if (NULL != filepath) {
463 snprintf(filepath, filesize, "%s/%s", VC_DEFAULT_ENGINE, dirp->d_name);
465 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Memory not enough!!");
469 /* get its info and update engine list */
470 if (0 == __internal_get_engine_info(filepath, &info)) {
471 /* add engine info to g_engine_list */
472 g_engine_list = g_list_append(g_engine_list, info);
475 if (NULL != filepath) {
480 } while (NULL != dirp);
484 SLOG(LOG_WARN, TAG_VCD, "[Engine Agent WARNING] Fail to open default directory");
487 if (0 >= g_list_length(g_engine_list)) {
488 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] No Engine");
489 return VCD_ERROR_ENGINE_NOT_FOUND;
498 int __foreach_command(vcp_cmd_h vc_command, vcpd_foreach_command_cb callback, void* user_data)
500 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Request foreach command from engine");
501 return vcd_client_foreach_command((client_foreach_command_cb)callback, user_data);
504 int __command_get_length(vcp_cmd_h vc_command)
506 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Request command length from engine");
507 return vcd_client_get_length();
510 int __get_audio_type(char** audio_type)
512 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Request audio type");
514 return vcd_recorder_get(audio_type);
517 int __set_private_data(const char* key, const char* data)
519 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Request set private data");
520 vcdc_send_request_set_private_data(vcd_client_manager_get_pid(), key, data);
525 int __get_private_data(const char* key, char** data)
527 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Request get private data");
528 vcdc_send_request_get_private_data(vcd_client_manager_get_pid(), key, data);
533 int __start_recording()
535 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Request start recording");
537 int ret = vcd_recorder_start();
539 SLOG(LOG_ERROR, TAG_VCD, "[Server ERROR] Fail to start recorder : result(%d)", ret);
540 vcd_engine_recognize_cancel();
541 /* Send error cb to manager */
542 vcdc_send_error_signal_to_manager(vcd_client_manager_get_pid(), VCD_ERROR_OPERATION_FAILED, "voice_engine.error.proc_fail");
549 int __stop_recording()
551 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Request stop recording");
553 return vcd_recorder_stop();
556 void __result_cb(vcp_result_event_e event, int* result_id, int count, const char* all_result, const char* non_fixed, const char* nlu_result, const char* msg, void *user_data)
558 SLOG(LOG_DEBUG, TAG_VCD, "[Engine agent] Event(%d), Count(%d) Text(%s) Nonfixed(%s) NLU result(%s) Msg(%s)", event, count, all_result, non_fixed, nlu_result, msg);
560 if (NULL != g_result_cb) {
561 g_result_cb(event, result_id, count, all_result, non_fixed, nlu_result, msg, user_data);
563 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent ERROR] Result callback function is NOT valid");
569 void __asr_result_cb(vcp_asr_result_event_e event, const char* asr_result, void *user_data)
571 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] ASR result - Event(%d), Result(%s)", event, asr_result);
573 if (NULL != g_asr_result_cb) {
574 g_asr_result_cb(event, asr_result, user_data);
576 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent ERROR] ASR result callback function is NOT valid");
582 void __nlg_result_cb(const char* nlg_result, void *user_data)
584 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] NLG result - Result(%s)", nlg_result);
586 if (NULL != g_nlg_result_cb) {
587 g_nlg_result_cb(nlg_result, user_data);
589 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent ERROR] NLG result callback function is NOT valid");
595 void __error_cb(vcp_error_e error, const char* msg, void *user_data)
597 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent] ERROR(%d)", error);
599 if (NULL != g_error_cb) {
600 g_error_cb(error, msg, user_data);
602 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent ERROR] Error callback function is NOT vaild");
608 int __load_engine(vcengine_s* engine)
610 /* check whether current engine is loaded or not */
611 if (true == engine->is_loaded) {
612 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Engine has already been loaded ");
616 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Current engine path : %s", engine->engine_path);
620 engine->handle = dlopen(engine->engine_path, RTLD_LAZY);
622 if ((error = dlerror()) != NULL || !engine->handle) {
623 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to get engine handle");
624 return VCD_ERROR_OPERATION_FAILED;
627 engine->vcp_unload_engine = (int (*)())dlsym(engine->handle, "vcp_unload_engine");
628 if ((error = dlerror()) != NULL) {
629 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to link daemon to vcp_unload_engine()");
630 dlclose(engine->handle);
631 return VCD_ERROR_OPERATION_FAILED;
634 engine->vcp_load_engine = (int (*)(vcpd_funcs_s*, vcpe_funcs_s*))dlsym(engine->handle, "vcp_load_engine");
635 if (NULL != (error = dlerror()) || NULL == engine->vcp_load_engine) {
636 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to link daemon to vcp_load_engine()");
637 dlclose(engine->handle);
638 return VCD_ERROR_OPERATION_FAILED;
642 engine->pdfuncs->version = 1;
643 engine->pdfuncs->size = sizeof(vcpd_funcs_s);
645 engine->pdfuncs->foreach_command = __foreach_command;
646 engine->pdfuncs->get_command_count = __command_get_length;
647 engine->pdfuncs->get_audio_type = __get_audio_type;
649 engine->pdfuncs->set_private_data = __set_private_data;
650 engine->pdfuncs->get_private_data = __get_private_data;
652 engine->pdfuncs->start_recording = __start_recording;
653 engine->pdfuncs->stop_recording = __stop_recording;
655 if (0 != engine->vcp_load_engine(engine->pdfuncs, engine->pefuncs)) {
656 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail vcp_load_engine()");
657 dlclose(engine->handle);
658 return VCD_ERROR_OPERATION_FAILED;
661 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] engine info : version(%d), size(%d)(%d)", engine->pefuncs->version, engine->pefuncs->size, sizeof(vcpe_funcs_s));
663 /* engine error check */
664 if (engine->pefuncs->size != sizeof(vcpe_funcs_s)) {
665 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Engine is not valid");
666 return VCD_ERROR_OPERATION_FAILED;
669 /* Check all engine functions */
670 if (NULL == engine->pefuncs->initialize ||
671 NULL == engine->pefuncs->deinitialize ||
672 NULL == engine->pefuncs->get_recording_format ||
673 NULL == engine->pefuncs->foreach_langs ||
674 NULL == engine->pefuncs->is_lang_supported ||
675 NULL == engine->pefuncs->set_result_cb ||
676 NULL == engine->pefuncs->set_language ||
677 NULL == engine->pefuncs->set_commands ||
678 NULL == engine->pefuncs->unset_commands ||
679 NULL == engine->pefuncs->start ||
680 NULL == engine->pefuncs->set_recording ||
681 NULL == engine->pefuncs->stop ||
682 NULL == engine->pefuncs->cancel ||
683 NULL == engine->pefuncs->set_audio_type ||
684 NULL == engine->pefuncs->set_asr_result_cb ||
685 NULL == engine->pefuncs->set_nlg_result_cb ||
686 //NULL == engine->pefuncs->set_pre_result_cb ||
687 NULL == engine->pefuncs->set_error_cb ||
688 NULL == engine->pefuncs->set_domain ||
689 NULL == engine->pefuncs->get_nlu_base_info ||
690 //NULL == engine->pefuncs->set_nlu_result_cb ||
691 NULL == engine->pefuncs->set_private_data ||
692 NULL == engine->pefuncs->get_private_data ||
693 NULL == engine->pefuncs->process_text ||
694 NULL == engine->pefuncs->process_list_event ||
695 NULL == engine->pefuncs->process_haptic_event) {
696 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] The current engine is NOT valid");
697 return VCD_ERROR_OPERATION_FAILED;
700 /* initalize engine */
701 if (0 != engine->pefuncs->initialize()) {
702 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to initialize vc-engine");
703 return VCD_ERROR_OPERATION_FAILED;
706 if (0 != engine->pefuncs->set_result_cb(__result_cb, NULL)) {
707 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to set result callback of vc-engine");
708 return VCD_ERROR_OPERATION_FAILED;
711 if (0 != engine->pefuncs->set_asr_result_cb(__asr_result_cb, NULL)) {
712 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to set asr result callback of vc-engine");
713 return VCD_ERROR_OPERATION_FAILED;
716 if (0 != engine->pefuncs->set_nlg_result_cb(__nlg_result_cb, NULL)) {
717 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to set nlg result callback of vc-engine");
718 return VCD_ERROR_OPERATION_FAILED;
721 if (0 != engine->pefuncs->set_error_cb(__error_cb, NULL)) {
722 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to set error callback of vc-engine");
723 return VCD_ERROR_OPERATION_FAILED;
727 if (true == engine->pefuncs->is_lang_supported(g_default_lang)) {
728 if (0 != engine->pefuncs->set_language(g_default_lang)) {
729 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to load current engine");
730 return VCD_ERROR_OPERATION_FAILED;
732 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent SUCCESS] The %s has been loaded !!!", engine->engine_name);
733 engine->is_loaded = true;
735 SLOG(LOG_WARN, TAG_VCD, "[Engine Agent WARNING] This engine do not support default language : lang(%s)", g_default_lang);
736 engine->is_loaded = false;
742 int vcd_engine_agent_load_current_engine()
744 if (false == g_agent_init) {
745 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
746 return VCD_ERROR_OPERATION_FAILED;
749 if (true == g_dynamic_engine.is_set) {
750 if (0 != __load_engine(&g_dynamic_engine)) {
751 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to load dynamic engine");
753 /* need to initialize dynamic engine data */
754 g_dynamic_engine.is_loaded = false;
756 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent SUCCESS] Load dynamic engine");
763 int vcd_engine_agent_unload_current_engine()
765 if (false == g_agent_init) {
766 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized ");
767 return VCD_ERROR_OPERATION_FAILED;
770 if (true == g_dynamic_engine.is_set) {
771 /* unload dynamic engine */
772 if (true == g_dynamic_engine.is_loaded) {
773 /* shutdown engine */
774 g_dynamic_engine.pefuncs->deinitialize();
775 g_dynamic_engine.vcp_unload_engine();
776 dlclose(g_dynamic_engine.handle);
777 g_dynamic_engine.handle = NULL;
778 g_dynamic_engine.is_loaded = false;
786 * VCS Engine Interfaces for client
789 int vcd_engine_set_commands()
791 if (false == g_agent_init) {
792 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
793 return VCD_ERROR_OPERATION_FAILED;
798 if (true == g_dynamic_engine.is_loaded) {
799 /* Set dynamic command */
800 ret = g_dynamic_engine.pefuncs->set_commands((vcp_cmd_h)0);
802 SLOG(LOG_WARN, TAG_VCD, "[Engine Agent ERROR] Fail to set command of dynamic engine : error(%d)", ret);
803 g_dynamic_engine.is_command_ready = false;
805 g_dynamic_engine.is_command_ready = true;
808 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent SUCCESS] set command");
810 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Dynamic engine is not available");
816 int vcd_engine_recognize_start(bool silence)
818 if (false == g_agent_init) {
819 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
820 return VCD_ERROR_OPERATION_FAILED;
824 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] silence is %s", silence ? "true" : "false");
826 if (true == g_dynamic_engine.is_loaded && true == g_dynamic_engine.is_command_ready) {
827 ret = g_dynamic_engine.pefuncs->start(silence);
829 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent] Fail to start engine error(%d)", ret);
830 return VCD_ERROR_OPERATION_FAILED;
833 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Engine is not available (Cannot start)");
834 return VCD_ERROR_OPERATION_FAILED;
837 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent SUCCESS] Engine start");
841 int vcd_engine_recognize_audio(const void* data, unsigned int length, vcp_speech_detect_e* speech_detected)
843 if (false == g_agent_init) {
844 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
845 return VCD_ERROR_OPERATION_FAILED;
849 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Invalid Parameter");
850 return VCD_ERROR_INVALID_PARAMETER;
855 if (true == g_dynamic_engine.is_loaded) {
856 ret = g_dynamic_engine.pefuncs->set_recording(data, length, speech_detected);
858 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to set recording dynamic engine error(%d)", ret);
859 if (VCP_ERROR_OUT_OF_NETWORK == ret) {
860 return VCD_ERROR_TIMED_OUT;
862 return VCD_ERROR_OPERATION_FAILED;
869 int vcd_engine_recognize_stop()
871 if (false == g_agent_init) {
872 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
873 return VCD_ERROR_OPERATION_FAILED;
876 if (true == g_dynamic_engine.is_loaded) {
878 ret = g_dynamic_engine.pefuncs->stop();
880 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to stop dynamic engine error(%d)", ret);
881 return VCD_ERROR_OPERATION_FAILED;
884 SLOG(LOG_WARN, TAG_VCD, "[Engine Agent] Dynamic engine is not recording state");
885 return VCD_ERROR_OPERATION_FAILED;
891 int vcd_engine_recognize_cancel()
893 if (false == g_agent_init) {
894 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
895 return VCD_ERROR_OPERATION_FAILED;
899 if (true == g_dynamic_engine.is_loaded) {
900 ret = g_dynamic_engine.pefuncs->cancel();
902 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to cancel dynamic engine error(%d)", ret);
903 return VCD_ERROR_OPERATION_FAILED;
910 int vcd_engine_set_audio_type(const char* audio)
912 if (false == g_agent_init) {
913 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
914 return VCD_ERROR_OPERATION_FAILED;
918 if (true == g_dynamic_engine.is_loaded) {
919 ret = g_dynamic_engine.pefuncs->set_audio_type(audio);
921 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to set audio type(%d)", ret);
922 return VCD_ERROR_OPERATION_FAILED;
929 int vcd_engine_set_domain(int pid, const char* domain)
931 if (false == g_agent_init) {
932 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
933 return VCD_ERROR_OPERATION_FAILED;
937 if (true == g_dynamic_engine.is_loaded) {
938 ret = g_dynamic_engine.pefuncs->set_domain(domain);
940 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to set domain (%d)", ret);
941 return VCD_ERROR_OPERATION_FAILED;
948 int vcd_engine_get_nlu_base_info(int pid, const char* key, char** value)
951 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Invalid Parameter");
952 return VCD_ERROR_INVALID_PARAMETER;
955 if (false == g_agent_init) {
956 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
957 return VCD_ERROR_OPERATION_FAILED;
961 if (true == g_dynamic_engine.is_loaded) {
962 ret = g_dynamic_engine.pefuncs->get_nlu_base_info(key, value);
964 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to get nlu base info (%d)", ret);
965 return VCD_ERROR_OPERATION_FAILED;
972 int vcd_engine_set_private_data(int pid, const char* key, const char* data)
974 if (false == g_agent_init) {
975 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
976 return VCD_ERROR_OPERATION_FAILED;
980 if (true == g_dynamic_engine.is_loaded) {
981 ret = g_dynamic_engine.pefuncs->set_private_data(key, data);
983 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to set private data (%d)", ret);
984 return VCD_ERROR_OPERATION_FAILED;
991 int vcd_engine_get_private_data(int pid, const char* key, char** data)
994 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Invalid Parameter");
995 return VCD_ERROR_INVALID_PARAMETER;
998 if (false == g_agent_init) {
999 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
1000 return VCD_ERROR_OPERATION_FAILED;
1004 if (true == g_dynamic_engine.is_loaded) {
1005 ret = g_dynamic_engine.pefuncs->get_private_data(key, data);
1007 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to get private data (%d)", ret);
1008 return VCD_ERROR_OPERATION_FAILED;
1015 int vcd_engine_process_text(int pid, const char* text)
1017 if (false == g_agent_init) {
1018 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
1019 return VCD_ERROR_OPERATION_FAILED;
1023 if (true == g_dynamic_engine.is_loaded) {
1024 ret = g_dynamic_engine.pefuncs->process_text(text);
1026 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to process text (%d)", ret);
1027 return VCD_ERROR_OPERATION_FAILED;
1034 int vcd_engine_process_list_event(int pid, const char* event)
1036 if (false == g_agent_init) {
1037 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
1038 return VCD_ERROR_OPERATION_FAILED;
1042 if (true == g_dynamic_engine.is_loaded) {
1043 ret = g_dynamic_engine.pefuncs->process_list_event(event);
1045 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to process list event (%d)", ret);
1046 return VCD_ERROR_OPERATION_FAILED;
1053 int vcd_engine_process_haptic_event(int pid, const char* event)
1055 if (false == g_agent_init) {
1056 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
1057 return VCD_ERROR_OPERATION_FAILED;
1061 if (true == g_dynamic_engine.is_loaded) {
1062 ret = g_dynamic_engine.pefuncs->process_haptic_event(event);
1064 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Fail to process haptic event (%d)", ret);
1065 return VCD_ERROR_OPERATION_FAILED;
1073 * VCS Engine Interfaces for client and setting
1076 int vcd_engine_get_audio_format(const char* audio_id, vcp_audio_type_e* types, int* rate, int* channels)
1078 if (false == g_agent_init) {
1079 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
1080 return VCD_ERROR_OPERATION_FAILED;
1083 if (true != g_dynamic_engine.is_loaded) {
1084 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Engine is not loaded");
1087 if (NULL == g_dynamic_engine.pefuncs->get_recording_format) {
1088 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] The function of engine is NULL!!");
1089 return VCD_ERROR_OPERATION_FAILED;
1092 int ret = g_dynamic_engine.pefuncs->get_recording_format(audio_id, types, rate, channels);
1094 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] get recording format(%d)", ret);
1095 return VCD_ERROR_OPERATION_FAILED;
1101 bool __supported_language_cb(const char* language, void* user_data)
1103 GList** lang_list = (GList**)user_data;
1105 if (NULL == language || NULL == lang_list) {
1106 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Input parameter is NULL in callback!!!!");
1110 SLOG(LOG_DEBUG, TAG_VCD, "-- Language(%s)", language);
1112 char* temp_lang = g_strdup(language);
1114 *lang_list = g_list_append(*lang_list, temp_lang);
1119 int vcd_engine_supported_langs(GList** lang_list)
1121 if (false == g_agent_init) {
1122 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
1123 return VCD_ERROR_OPERATION_FAILED;
1126 if (true != g_dynamic_engine.is_loaded) {
1127 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Engine is not loaded");
1130 if (NULL == g_dynamic_engine.pefuncs->foreach_langs) {
1131 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] The function of engine is NULL!!");
1132 return VCD_ERROR_OPERATION_FAILED;
1135 int ret = g_dynamic_engine.pefuncs->foreach_langs(__supported_language_cb, (void*)lang_list);
1137 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] get language list error(%d)", ret);
1138 return VCD_ERROR_OPERATION_FAILED;
1145 int vcd_engine_get_current_language(char** lang)
1147 if (false == g_agent_init) {
1148 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
1149 return VCD_ERROR_OPERATION_FAILED;
1153 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Invalid Parameter");
1154 return VCD_ERROR_INVALID_PARAMETER;
1157 /* get default language */
1158 *lang = g_strdup(g_default_lang);
1163 int vcd_engine_set_current_language(const char* language)
1165 if (false == g_agent_init) {
1166 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Not Initialized");
1167 return VCD_ERROR_OPERATION_FAILED;
1170 if (NULL == language) {
1171 SLOG(LOG_ERROR, TAG_VCD, "[Engine Agent ERROR] Invalid Parameter");
1172 return VCD_ERROR_INVALID_PARAMETER;
1177 if (true == g_dynamic_engine.is_loaded) {
1178 g_dynamic_engine.is_command_ready = false;
1180 ret = g_dynamic_engine.pefuncs->set_language(language);
1182 SLOG(LOG_WARN, TAG_VCD, "[Engine Agent] Fail to set language of dynamic engine error(%d, %s)", ret, language);
1185 SLOG(LOG_DEBUG, TAG_VCD, "[Engine Agent] Dynamic engine is not available (Cannot start)");
1191 void __free_language_list(GList* lang_list)
1196 /* if list have item */
1197 if (g_list_length(lang_list) > 0) {
1198 /* Get a first item */
1199 iter = g_list_first(lang_list);
1201 while (NULL != iter) {
1207 lang_list = g_list_remove_link(lang_list, iter);
1209 iter = g_list_first(lang_list);
1214 int __log_enginelist()
1217 vcengine_info_s *data = NULL;
1219 if (0 < g_list_length(g_engine_list)) {
1221 /* Get a first item */
1222 iter = g_list_first(g_engine_list);
1224 SLOG(LOG_DEBUG, TAG_VCD, "--------------- engine list -------------------");
1227 while (NULL != iter) {
1228 /* Get handle data from list */
1231 SLOG(LOG_DEBUG, TAG_VCD, "[%dth]", i);
1232 SLOG(LOG_DEBUG, TAG_VCD, " engine uuid : %s", data->engine_uuid);
1233 SLOG(LOG_DEBUG, TAG_VCD, " engine name : %s", data->engine_name);
1234 SLOG(LOG_DEBUG, TAG_VCD, " engine path : %s", data->engine_path);
1235 iter = g_list_next(iter);
1238 SLOG(LOG_DEBUG, TAG_VCD, "----------------------------------------------");
1240 SLOG(LOG_DEBUG, TAG_VCD, "-------------- engine list -------------------");
1241 SLOG(LOG_DEBUG, TAG_VCD, " No Engine in engine directory");
1242 SLOG(LOG_DEBUG, TAG_VCD, "----------------------------------------------");