2 * Copyright (c) 2011-2016 Samsung Electronics Co., Ltd All Rights Reserved
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 * http://www.apache.org/licenses/LICENSE-2.0
7 * Unless required by applicable law or agreed to in writing, software
8 * distributed under the License is distributed on an "AS IS" BASIS,
9 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 * See the License for the specific language governing permissions and
11 * limitations under the License.
26 #include "stt_config_mgr.h"
28 #include "stt_engine.h"
30 #include "stt_file_client.h"
31 #include "stt_network.h"
34 typedef struct _sttengine_info {
40 char* engine_setting_path;
46 static GSList* g_engine_list;
49 #define STT_FILE_CONFIG_HANDLE 100000
52 static const char* __stt_file_get_error_code(stt_file_error_e err)
55 case STT_FILE_ERROR_NONE: return "STT_FILE_ERROR_NONE";
56 case STT_FILE_ERROR_OUT_OF_MEMORY: return "STT_FILE_ERROR_OUT_OF_MEMORY";
57 case STT_FILE_ERROR_IO_ERROR: return "STT_FILE_ERROR_IO_ERROR";
58 case STT_FILE_ERROR_INVALID_PARAMETER: return "STT_FILE_ERROR_INVALID_PARAMETER";
59 case STT_FILE_ERROR_OUT_OF_NETWORK: return "STT_FILE_ERROR_OUT_OF_NETWORK";
60 case STT_FILE_ERROR_INVALID_STATE: return "STT_FILE_ERROR_INVALID_STATE";
61 case STT_FILE_ERROR_INVALID_LANGUAGE: return "STT_FILE_ERROR_INVALID_LANGUAGE";
62 case STT_FILE_ERROR_ENGINE_NOT_FOUND: return "STT_FILE_ERROR_ENGINE_NOT_FOUND";
63 case STT_FILE_ERROR_OPERATION_FAILED: return "STT_FILE_ERROR_OPERATION_FAILED";
64 case STT_FILE_ERROR_NOT_SUPPORTED_FEATURE: return "STT_FILE_ERROR_NOT_SUPPORTED_FEATURE";
65 case STT_FILE_ERROR_NOT_AGREE_SERVICE: return "STT_FILE_ERROR_NOT_AGREE_SERVICE";
67 return "Invalid error code";
71 void __stt_file_engine_info_cb(const char* engine_uuid, const char* engine_name, const char* setting_ug_name,
72 bool use_network, void* user_data)
74 sttengine_info_s* temp = (sttengine_info_s*)user_data;
76 temp->engine_uuid = g_strdup(engine_uuid);
77 temp->engine_name = g_strdup(engine_name);
78 temp->engine_setting_path = g_strdup(setting_ug_name);
79 temp->use_network = use_network;
82 static int __stt_file_get_engine_info(const char* filepath, sttengine_info_s** info)
84 #ifdef __UNUSED_CODES__
85 if (NULL == filepath || NULL == info) {
86 SLOG(LOG_ERROR, TAG_STTFC, "[Engine Agent ERROR] Invalid Parameter");
87 return STT_FILE_ERROR_INVALID_PARAMETER;
94 handle = dlopen(filepath, RTLD_LAZY);
97 SECURE_SLOG(LOG_WARN, TAG_STTFC, "[Engine Agent] Invalid engine : %s", filepath);
98 return STT_FILE_ERROR_ENGINE_NOT_FOUND;
101 /* link engine to stt-service */
102 dlsym(handle, "sttp_load_engine");
103 if ((error = dlerror()) != NULL) {
104 SLOG(LOG_WARN, TAG_STTFC, "[Engine Agent] Invalid engine. Fail to open sttp_load_engine : %s", error);
106 return STT_FILE_ERROR_ENGINE_NOT_FOUND;
109 dlsym(handle, "sttp_unload_engine");
110 if ((error = dlerror()) != NULL) {
111 SLOG(LOG_WARN, TAG_STTFC, "[Engine Agent] Invalid engine. Fail to open sttp_unload_engine : %s", error);
113 return STT_FILE_ERROR_ENGINE_NOT_FOUND;
116 int (*get_engine_info)(sttpe_engine_info_cb callback, void* user_data);
118 get_engine_info = (int (*)(sttpe_engine_info_cb, void*))dlsym(handle, "sttp_get_engine_info");
119 if ((error = dlerror()) != NULL || NULL == get_engine_info) {
120 SLOG(LOG_WARN, TAG_STTFC, "[Engine Agent WARNING] Invalid engine. Fail to open sttp_get_engine_info : %s", error);
122 return STT_FILE_ERROR_ENGINE_NOT_FOUND;
125 sttengine_info_s* temp;
126 temp = (sttengine_info_s*)calloc(1, sizeof(sttengine_info_s));
128 SLOG(LOG_ERROR, TAG_STTFC, "[Engine Agent ERROR] Fail to allocate memory");
130 return STT_FILE_ERROR_OUT_OF_MEMORY;
133 /* get engine info */
134 if (0 != get_engine_info(__stt_file_engine_info_cb, (void*)temp)) {
135 SLOG(LOG_ERROR, TAG_STTFC, "[Engine Agent ERROR] Fail to get engine info from engine");
138 return STT_FILE_ERROR_ENGINE_NOT_FOUND;
144 temp->engine_id = g_engine_id_count;
147 temp->engine_path = g_strdup(filepath);
148 temp->is_loaded = false;
150 SLOG(LOG_DEBUG, TAG_STTFC, "----- Valid Engine");
151 SECURE_SLOG(LOG_DEBUG, TAG_STTFC, "Engine id : %d", temp->engine_id);
152 SECURE_SLOG(LOG_DEBUG, TAG_STTFC, "Engine uuid : %s", temp->engine_uuid);
153 SECURE_SLOG(LOG_DEBUG, TAG_STTFC, "Engine name : %s", temp->engine_name);
154 SECURE_SLOG(LOG_DEBUG, TAG_STTFC, "Engine path : %s", temp->engine_path);
155 SECURE_SLOG(LOG_DEBUG, TAG_STTFC, "Engine setting path : %s", temp->engine_setting_path);
156 SECURE_SLOG(LOG_DEBUG, TAG_STTFC, "Use network : %s", temp->use_network ? "true" : "false");
157 SLOG(LOG_DEBUG, TAG_STTFC, "-----");
158 SLOG(LOG_DEBUG, TAG_STTFC, " ");
163 return STT_FILE_ERROR_NONE;
166 static bool __stt_file_is_engine(const char* filepath)
169 sttengine_info_s *engine = NULL;
171 if (0 < g_slist_length(g_engine_list)) {
172 /* Get a first item */
173 iter = g_slist_nth(g_engine_list, 0);
175 while (NULL != iter) {
176 /* Get handle data from list */
179 if (0 == strcmp(engine->engine_path, filepath)) {
183 iter = g_slist_next(iter);
190 void __stt_file_relseae_engine_info(void)
194 /* Release engine list */
195 sttengine_info_s *engine = NULL;
197 if (0 < g_slist_length(g_engine_list)) {
198 /* Get a first item */
199 iter = g_slist_nth(g_engine_list, 0);
201 while (NULL != iter) {
202 /* Get handle data from list */
204 g_engine_list = g_slist_remove_link(g_engine_list, iter);
206 /* Check engine unload */
207 if (NULL != engine) {
208 if (engine->is_loaded) {
209 SECURE_SLOG(LOG_DEBUG, TAG_STTFC, "[Engine Agent] Unload engine id(%d)", engine->engine_id);
211 if (0 != stt_engine_deinitialize())
212 SECURE_SLOG(LOG_WARN, TAG_STTFC, "[Engine Agent] Fail to deinitialize engine id(%d)", engine->engine_id);
214 if (0 != stt_engine_unload())
215 SECURE_SLOG(LOG_WARN, TAG_STTFC, "[Engine Agent] Fail to unload engine id(%d)", engine->engine_id);
217 engine->is_loaded = false;
220 if (NULL != engine->engine_uuid) free(engine->engine_uuid);
221 if (NULL != engine->engine_path) free(engine->engine_path);
222 if (NULL != engine->engine_name) free(engine->engine_name);
223 if (NULL != engine->engine_setting_path)free(engine->engine_setting_path);
228 iter = g_slist_nth(g_engine_list, 0);
233 static sttengine_info_s* __stt_file_get_engine_by_id(int engine_id)
236 sttengine_info_s *data = NULL;
238 iter = g_slist_nth(g_engine_list, 0);
240 while (NULL != iter) {
244 if (data->engine_id == engine_id)
247 iter = g_slist_next(iter);
253 int __stt_file_result_cb(stte_result_event_e event, const char* type, const char** data, int data_count,
254 const char* msg, void* time_info, void *user_data)
257 SLOG(LOG_DEBUG, TAG_STTFC, "[STT FILE] Result event(%d) type(%s) msg(%s)", event, type, msg);
261 for (i = 0; i < data_count; i++) {
262 if (NULL != data[i]) {
263 SLOG(LOG_DEBUG, TAG_STTFC, "[STT FILE] [%d] %s", i, data[i]);
268 stt_file_client_s* client = stt_file_client_get();
271 if (NULL == client) {
272 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Fail to notify error : A handle is not valid");
273 return STT_FILE_ERROR_OPERATION_FAILED;
276 if (NULL != time_info) {
277 client->time_info = time_info;
280 if (NULL != client->recognition_result_cb) {
281 stt_file_client_use_callback(client);
282 client->recognition_result_cb(event, data, data_count, msg, client->recognition_result_user_data);
283 stt_file_client_not_use_callback(client);
284 SLOG(LOG_DEBUG, TAG_STTFC, "client recognition result callback called");
286 SLOG(LOG_WARN, TAG_STTFC, "[WARNING] User recognition result callback is NULL");
289 client->time_info = NULL;
291 if (STTE_RESULT_EVENT_FINAL_RESULT == event || STTE_RESULT_EVENT_ERROR == event) {
292 SLOG(LOG_DEBUG, TAG_STTFC, "[STT FILE] State change : 'Ready'");
294 client->before_state = client->current_state;
295 client->current_state = STT_FILE_STATE_READY;
297 if (NULL != client->state_changed_cb) {
298 stt_file_client_use_callback(client);
299 client->state_changed_cb(client->before_state, client->current_state, client->state_changed_user_data);
300 stt_file_client_not_use_callback(client);
301 SLOG(LOG_DEBUG, TAG_STTFC, "State changed callback is called");
303 SLOG(LOG_WARN, TAG_STTFC, "[WARNING] State changed callback is null");
307 return STT_FILE_ERROR_NONE;
310 void __stt_file_speech_status_cb(stte_speech_status_e status, void *user_data)
312 /* it seems to be no necessity yet */
313 SLOG(LOG_WARN, TAG_STTFC, "[WARNING] This callback should NOT be called.");
317 void __stt_file_error_cb(stte_error_e error, const char* msg)
319 /* it seems to be no necessity yet */
320 SLOG(LOG_DEBUG, TAG_STTFC, "[STT FILE] Error callback is called");
324 static int __stt_file_load_engine(sttengine_info_s* engine)
326 if (NULL == engine) {
327 SLOG(LOG_ERROR, TAG_STTFC, "[STT FILE ERROR] Input engine is NULL");
328 return STT_FILE_ERROR_INVALID_PARAMETER;
331 if (0 != stt_engine_load(engine->engine_path, NULL)) {
332 SLOG(LOG_ERROR, TAG_STTFC, "[STT FILE ERROR] Fail to load engine(%s)", engine->engine_path);
333 return STT_FILE_ERROR_OPERATION_FAILED;
336 int ret = stt_engine_initialize(true);
338 SECURE_SLOG(LOG_ERROR, TAG_STTFC, "[Engine Agent ERROR] Fail to initialize engine : id(%d) path(%s)", engine->engine_id, engine->engine_path);
339 return STT_FILE_ERROR_OPERATION_FAILED;
342 engine->is_loaded = true;
344 SECURE_SLOG(LOG_DEBUG, TAG_STTFC, "[STT FILE Success] Load engine id(%d) path(%s)", engine->engine_id, engine->engine_path);
346 return STT_FILE_ERROR_NONE;
349 int stt_file_initialize(void)
351 SLOG(LOG_DEBUG, TAG_STTFC, "===== Initialize STT FILE");
353 stt_file_client_s* client = stt_file_client_get();
354 if (NULL != client) {
355 SLOG(LOG_ERROR, TAG_STTFC, "[STT FILE ERROR] Already initialized");
356 return STT_FILE_ERROR_INVALID_STATE;
359 /* Get file name from default engine directory */
363 struct dirent *dirp = NULL;
364 dp = opendir(STT_DEFAULT_ENGINE);
367 ret = readdir_r(dp, &entry, &dirp);
369 SLOG(LOG_ERROR, TAG_STTFC, "[File ERROR] Fail to read directory");
374 if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name))
377 sttengine_info_s* info = NULL;
381 filesize = strlen(STT_DEFAULT_ENGINE) + strlen(dirp->d_name) + 5;
382 filepath = (char*)calloc(filesize, sizeof(char));
385 if (NULL != filepath) {
386 snprintf(filepath, filesize, "%s/%s", STT_DEFAULT_ENGINE, dirp->d_name);
388 SLOG(LOG_ERROR, TAG_STTFC, "[Engine Agent ERROR] Memory not enough!!");
392 if (false == __stt_file_is_engine(filepath)) {
393 /* get its and update engine list */
394 if (0 == __stt_file_get_engine_info(filepath, &info)) {
395 /* add engine info to g_engine_list */
396 g_engine_list = g_slist_append(g_engine_list, info);
400 if (NULL != filepath)
403 } while (NULL != dirp);
407 SLOG(LOG_WARN, TAG_STTFC, "[Engine Agent WARNING] Fail to open default directory");
410 if (0 >= g_slist_length(g_engine_list)) {
411 SLOG(LOG_WARN, TAG_STTFC, "[STT FILE WARNING] Not found engine");
412 return STT_FILE_ERROR_ENGINE_NOT_FOUND;
415 ret = stt_file_client_new();
417 SLOG(LOG_ERROR, TAG_STTFC, "[STT FILE ERROR] Fail to create client : %s", __stt_file_get_error_code(ret));
418 return STT_FILE_ERROR_OPERATION_FAILED;
421 client = stt_file_client_get();
422 if (NULL == client) {
423 SLOG(LOG_ERROR, TAG_STTFC, "[STT FILE ERROR] Not initialized");
424 return STT_FILE_ERROR_OPERATION_FAILED;
427 ret = stt_config_mgr_initialize(getpid() + STT_FILE_CONFIG_HANDLE);
429 SLOG(LOG_ERROR, TAG_STTFC, "[STT FILE ERROR] Fail to init config manager : %s", __stt_file_get_error_code(ret));
430 stt_file_client_destroy();
431 return STT_FILE_ERROR_OPERATION_FAILED;
435 char* engine_id = NULL;
436 ret = stt_config_mgr_get_engine(&engine_id);
438 SLOG(LOG_ERROR, TAG_STTFC, "[STT FILE ERROR] Fail to get engine id : %s", __stt_file_get_error_code(ret));
439 stt_file_client_destroy();
440 stt_config_mgr_finalize(getpid() + STT_FILE_CONFIG_HANDLE);
441 __stt_file_relseae_engine_info();
442 return STT_FILE_ERROR_OPERATION_FAILED;
445 SLOG(LOG_DEBUG, TAG_STTFC, "[STT FILE] Get engine id : %s", engine_id);
447 bool is_found = false;
449 sttengine_info_s* engine = NULL;
452 if (0 < g_slist_length(g_engine_list)) {
453 /* Get a first item */
454 iter = g_slist_nth(g_engine_list, 0);
456 while (NULL != iter) {
457 /* Get handle data from list */
460 if (0 == strcmp(engine->engine_uuid, engine_id)) {
465 iter = g_slist_next(iter);
469 if (NULL != engine_id) {
474 if (false == is_found) {
476 SLOG(LOG_WARN, TAG_STTFC, "[STT FILE WARNING] Fail to find default engine");
477 iter = g_slist_nth(g_engine_list, 0);
481 if (NULL == engine) {
482 SLOG(LOG_ERROR, TAG_STTFC, "[Engine Agent ERROR] Fail to initialize engine");
483 stt_file_client_destroy();
484 stt_config_mgr_finalize(getpid() + STT_FILE_CONFIG_HANDLE);
485 __stt_file_relseae_engine_info();
486 return STT_FILE_ERROR_OPERATION_FAILED;
488 SLOG(LOG_WARN, TAG_STTFC, "[STT FILE WARNING] Set default engine (%s)", engine->engine_name);
491 ret = __stt_file_load_engine(engine);
493 SLOG(LOG_ERROR, TAG_STTFC, "[Engine Agent ERROR] Fail to initialize engine");
494 stt_file_client_destroy();
495 stt_config_mgr_finalize(getpid() + STT_FILE_CONFIG_HANDLE);
496 __stt_file_relseae_engine_info();
497 return STT_FILE_ERROR_OPERATION_FAILED;
500 client->current_engine_id = engine->engine_id;
502 stt_network_initialize();
504 SECURE_SLOG(LOG_DEBUG, TAG_STTFC, "[STT FILE Success] Initialize : pid(%d)", getpid());
506 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
507 SLOG(LOG_DEBUG, TAG_STTFC, " ");
509 return STT_FILE_ERROR_NONE;
512 int stt_file_deinitialize(void)
514 SLOG(LOG_DEBUG, TAG_STTFC, "===== Deinitialize STT FILE");
516 stt_file_client_s* client = stt_file_client_get();
517 if (NULL == client) {
518 SLOG(LOG_ERROR, TAG_STTFC, "[STT FILE ERROR] Not initialized");
519 return STT_FILE_ERROR_INVALID_STATE;
522 /* check used callback */
523 if (0 != stt_file_client_get_use_callback(client)) {
524 SLOG(LOG_ERROR, TAG_STTFC, "[STT FILE ERROR] Client should NOT deinitialize STT FILE in callback function");
525 return STT_FILE_ERROR_OPERATION_FAILED;
528 stt_network_finalize();
530 stt_config_mgr_finalize(getpid() + STT_FILE_CONFIG_HANDLE);
533 switch (client->current_state) {
534 case STT_FILE_STATE_PROCESSING:
535 /* Cancel file recognition */
536 stt_engine_recognize_cancel_file();
538 case STT_FILE_STATE_READY:
540 __stt_file_relseae_engine_info();
543 stt_file_client_destroy();
546 case STT_FILE_STATE_NONE:
547 SLOG(LOG_WARN, TAG_STTFC, "[STT FILE WARNING] NOT initialized");
553 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
554 SLOG(LOG_DEBUG, TAG_STTFC, " ");
556 return STT_FILE_ERROR_NONE;
559 int stt_file_get_state(stt_file_state_e* state)
562 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Input parameter is NULL");
563 return STT_FILE_ERROR_INVALID_PARAMETER;
566 stt_file_client_s* client = stt_file_client_get();
568 if (NULL == client) {
569 SLOG(LOG_DEBUG, TAG_STTFC, "[STT FILE] Not initialized");
570 *state = STT_FILE_STATE_NONE;
571 return STT_FILE_ERROR_NONE;
574 *state = client->current_state;
577 case STT_FILE_STATE_NONE: SLOG(LOG_DEBUG, TAG_STTFC, "Current state is 'NONE'"); break;
578 case STT_FILE_STATE_READY: SLOG(LOG_DEBUG, TAG_STTFC, "Current state is 'Ready'"); break;
579 case STT_FILE_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_STTFC, "Current state is 'Processing'"); break;
580 default: SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Invalid value"); break;
583 return STT_FILE_ERROR_NONE;
586 int stt_file_foreach_supported_engines(stt_file_supported_engine_cb callback, void* user_data)
588 SLOG(LOG_DEBUG, TAG_STTFC, "===== Foreach Supported engine");
590 if (NULL == callback) {
591 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Input parameter is NULL");
592 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
593 SLOG(LOG_DEBUG, TAG_STTFC, " ");
594 return STT_FILE_ERROR_INVALID_PARAMETER;
597 stt_file_client_s* client = stt_file_client_get();
600 if (NULL == client) {
601 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] A handle is not available");
602 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
603 SLOG(LOG_DEBUG, TAG_STTFC, " ");
604 return STT_FILE_ERROR_INVALID_PARAMETER;
607 if (client->current_state != STT_FILE_STATE_READY) {
608 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", client->current_state);
609 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
610 SLOG(LOG_DEBUG, TAG_STTFC, " ");
611 return STT_FILE_ERROR_INVALID_STATE;
615 sttengine_info_s *engine = NULL;
617 /* Get a first item */
618 iter = g_slist_nth(g_engine_list, 0);
620 while (NULL != iter) {
621 /* Get handle data from list */
624 if (NULL != engine) {
625 if (false == callback(engine->engine_uuid, engine->engine_name, user_data)) {
629 iter = g_slist_next(iter);
632 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
633 SLOG(LOG_DEBUG, TAG_STTFC, " ");
635 return STT_FILE_ERROR_NONE;
638 int stt_file_get_engine(char** engine_id)
640 SLOG(LOG_DEBUG, TAG_STTFC, "===== Get current engine");
642 if (NULL == engine_id) {
643 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Input parameter is NULL");
644 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
645 SLOG(LOG_DEBUG, TAG_STTFC, " ");
646 return STT_FILE_ERROR_INVALID_PARAMETER;
649 stt_file_client_s* client = stt_file_client_get();
652 if (NULL == client) {
653 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] A handle is not available");
654 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
655 SLOG(LOG_DEBUG, TAG_STTFC, " ");
656 return STT_FILE_ERROR_INVALID_PARAMETER;
659 if (client->current_state != STT_FILE_STATE_READY) {
660 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", client->current_state);
661 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
662 SLOG(LOG_DEBUG, TAG_STTFC, " ");
663 return STT_FILE_ERROR_INVALID_STATE;
666 sttengine_info_s* engine = NULL;
667 engine = __stt_file_get_engine_by_id(client->current_engine_id);
668 if (NULL == engine) {
669 SECURE_SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Fail to get engine info(%d)", client->current_engine_id);
670 return STT_FILE_ERROR_OPERATION_FAILED;
673 *engine_id = strdup(engine->engine_uuid);
675 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
676 SLOG(LOG_DEBUG, TAG_STTFC, " ");
678 return STT_FILE_ERROR_NONE;
681 int stt_file_set_engine(const char* engine_id)
683 SLOG(LOG_DEBUG, TAG_STTFC, "===== Set current engine");
685 if (NULL == engine_id) {
686 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Input parameter is NULL");
687 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
688 SLOG(LOG_DEBUG, TAG_STTFC, " ");
689 return STT_FILE_ERROR_INVALID_PARAMETER;
692 stt_file_client_s* client = stt_file_client_get();
695 if (NULL == client) {
696 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] A handle is not available");
697 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
698 SLOG(LOG_DEBUG, TAG_STTFC, " ");
699 return STT_FILE_ERROR_INVALID_PARAMETER;
703 if (client->current_state != STT_FILE_STATE_READY) {
704 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Invalid State: Current state(%d) is not 'Ready'", client->current_state);
705 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
706 SLOG(LOG_DEBUG, TAG_STTFC, " ");
707 return STT_FILE_ERROR_INVALID_STATE;
711 sttengine_info_s *engine = NULL;
713 int temp_old_engine = -1;
715 /* Get a first item */
716 iter = g_slist_nth(g_engine_list, 0);
718 while (NULL != iter) {
719 /* Get handle data from list */
722 if (0 == strcmp(engine->engine_uuid, engine_id)) {
723 if (client->current_engine_id != engine->engine_id) {
724 temp_old_engine = client->current_engine_id;
726 SLOG(LOG_DEBUG, TAG_STTFC, "Already loaded engine : %s", engine_id);
733 iter = g_slist_next(iter);
737 if (NULL == engine) {
738 SLOG(LOG_ERROR, TAG_STTFC, "[Engine Agent ERROR] Engine id is NOT valid");
739 return STT_FILE_ERROR_INVALID_PARAMETER;
742 int ret = __stt_file_load_engine(engine);
744 SLOG(LOG_ERROR, TAG_STTFC, "[Engine Agent ERROR] Fail to initialize engine");
745 return STT_FILE_ERROR_OPERATION_FAILED;
748 client->current_engine_id = engine->engine_id;
750 if (-1 != temp_old_engine) {
751 stt_engine_deinitialize();
755 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
756 SLOG(LOG_DEBUG, TAG_STTFC, " ");
761 bool __stt_config_supported_language_cb(const char* engine_id, const char* language, void* user_data)
763 stt_file_client_s* client = stt_file_client_get();
764 if (NULL == client) {
765 SLOG(LOG_ERROR, TAG_STTFC, "[WARNING] A handle is not valid");
769 /* call callback function */
770 if (NULL != client->supported_lang_cb) {
771 return client->supported_lang_cb(language, client->supported_lang_user_data);
773 SLOG(LOG_WARN, TAG_STTFC, "No registered callback function of supported languages");
779 int stt_file_foreach_supported_languages(stt_file_supported_language_cb callback, void* user_data)
781 SLOG(LOG_DEBUG, TAG_STTFC, "===== Foreach Supported Language");
783 if (NULL == callback) {
784 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Input parameter is NULL");
785 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
786 SLOG(LOG_DEBUG, TAG_STTFC, " ");
787 return STT_FILE_ERROR_INVALID_PARAMETER;
790 stt_file_client_s* client = stt_file_client_get();
793 if (NULL == client) {
794 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] A handle is not available");
795 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
796 SLOG(LOG_DEBUG, TAG_STTFC, " ");
797 return STT_FILE_ERROR_INVALID_PARAMETER;
800 sttengine_info_s* engine = NULL;
801 engine = __stt_file_get_engine_by_id(client->current_engine_id);
802 if (NULL == engine) {
803 SECURE_SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Fail to get engine info(%d)", client->current_engine_id);
804 return STT_FILE_ERROR_OPERATION_FAILED;
807 client->supported_lang_cb = callback;
808 client->supported_lang_user_data = user_data;
811 ret = stt_config_mgr_get_language_list(engine->engine_uuid, __stt_config_supported_language_cb, NULL);
813 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Fail to get languages");
816 client->supported_lang_cb = NULL;
817 client->supported_lang_user_data = NULL;
819 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
820 SLOG(LOG_DEBUG, TAG_STTFC, " ");
822 return STT_FILE_ERROR_NONE;
825 int stt_file_start(const char* language, const char* type, const char* filepath,
826 stt_file_audio_type_e audio_type, int sample_rate)
828 SLOG(LOG_DEBUG, TAG_STTFC, "===== STT FILE START");
830 stt_file_client_s* client = stt_file_client_get();
833 if (NULL == client) {
834 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] A handle is not available");
835 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
836 SLOG(LOG_DEBUG, TAG_STTFC, " ");
837 return STT_FILE_ERROR_INVALID_STATE;
841 if (client->current_state != STT_FILE_STATE_READY) {
842 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
843 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
844 SLOG(LOG_DEBUG, TAG_STTFC, " ");
845 return STT_FILE_ERROR_INVALID_STATE;
848 if (NULL == language || NULL == filepath) {
849 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Input parameter is NULL");
850 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
851 SLOG(LOG_DEBUG, TAG_STTFC, " ");
852 return STT_FILE_ERROR_INVALID_PARAMETER;
855 /* check if engine use network */
856 sttengine_info_s* engine = NULL;
857 engine = __stt_file_get_engine_by_id(client->current_engine_id);
858 if (NULL == engine) {
859 SECURE_SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Fail to get engine info(%d)", client->current_engine_id);
860 return STT_FILE_ERROR_OPERATION_FAILED;
863 if (true == engine->use_network) {
864 if (false == stt_network_is_connected()) {
865 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Disconnect network. Current engine needs to network connection.");
866 return STT_FILE_ERROR_OUT_OF_NETWORK;
870 SLOG(LOG_DEBUG, TAG_STTFC, "[START Info] Engine(%d) Lang(%s) Type(%s) Filepath(%s) Audio(%d) Sample rate(%d)",
871 client->current_engine_id, language, type, filepath, audio_type, sample_rate);
874 ret = stt_engine_recognize_start_file(language, type, filepath, audio_type, sample_rate, NULL);
876 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Fail to start file recognition");
877 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
878 SLOG(LOG_DEBUG, TAG_STTFC, " ");
879 return STT_FILE_ERROR_OPERATION_FAILED;
882 client->before_state = client->current_state;
883 client->current_state = STT_FILE_STATE_PROCESSING;
885 if (NULL != client->state_changed_cb) {
886 stt_file_client_use_callback(client);
887 client->state_changed_cb(client->before_state, client->current_state, client->state_changed_user_data);
888 stt_file_client_not_use_callback(client);
889 SLOG(LOG_DEBUG, TAG_STTFC, "State changed callback is called");
891 SLOG(LOG_WARN, TAG_STTFC, "[WARNING] State changed callback is null");
894 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
895 SLOG(LOG_DEBUG, TAG_STTFC, " ");
897 return STT_FILE_ERROR_NONE;
900 int stt_file_cancel(void)
902 SLOG(LOG_DEBUG, TAG_STTFC, "===== STT FILE CANCEL");
904 stt_file_client_s* client = stt_file_client_get();
907 if (NULL == client) {
908 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] A handle is not available");
909 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
910 SLOG(LOG_DEBUG, TAG_STTFC, " ");
911 return STT_FILE_ERROR_INVALID_PARAMETER;
915 if (STT_FILE_STATE_PROCESSING != client->current_state) {
916 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Invalid state : Current state(%d) is NOT 'Processing'", client->current_state);
917 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
918 SLOG(LOG_DEBUG, TAG_STTFC, " ");
919 return STT_FILE_ERROR_INVALID_STATE;
923 ret = stt_engine_recognize_cancel_file();
925 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Fail to cancel file recognition");
926 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
927 SLOG(LOG_DEBUG, TAG_STTFC, " ");
928 return STT_FILE_ERROR_OPERATION_FAILED;
931 client->before_state = client->current_state;
932 client->current_state = STT_FILE_STATE_READY;
934 if (NULL != client->state_changed_cb) {
935 stt_file_client_use_callback(client);
936 client->state_changed_cb(client->before_state, client->current_state, client->state_changed_user_data);
937 stt_file_client_not_use_callback(client);
938 SLOG(LOG_DEBUG, TAG_STTFC, "State changed callback is called");
940 SLOG(LOG_WARN, TAG_STTFC, "[WARNING] State changed callback is null");
943 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
944 SLOG(LOG_DEBUG, TAG_STTFC, " ");
946 return STT_FILE_ERROR_NONE;
949 bool __stt_file_result_time_cb(int index, stte_result_time_event_e event, const char* text, long start_time, long end_time, void* user_data)
951 SLOG(LOG_DEBUG, TAG_STTFC, "(%d) event(%d) text(%s) start(%ld) end(%ld)",
952 index, event, text, start_time, end_time);
954 stt_file_client_s* client = stt_file_client_get();
957 if (NULL == client) {
958 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Fail to notify error : A handle is not valid");
962 if (NULL != client->result_time_cb) {
963 client->result_time_cb(index, (stt_file_result_time_event_e)event,
964 text, start_time, end_time, client->result_time_user_data);
966 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Callback is NULL");
973 int stt_file_foreach_detailed_result(stt_file_result_time_cb callback, void* user_data)
975 SLOG(LOG_DEBUG, TAG_STTFC, "===== STT FILE FOREACH DETAILED RESULT");
977 if (NULL == callback) {
978 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Input parameter is NULL");
979 return STT_FILE_ERROR_INVALID_PARAMETER;
982 stt_file_client_s* client = stt_file_client_get();
985 if (NULL == client) {
986 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Fail : A handle is not valid");
987 return STT_FILE_ERROR_INVALID_PARAMETER;
990 client->result_time_cb = callback;
991 client->result_time_user_data = user_data;
993 stt_engine_foreach_result_time(client->time_info, __stt_file_result_time_cb, NULL);
995 client->result_time_cb = NULL;
996 client->result_time_user_data = NULL;
998 SLOG(LOG_DEBUG, TAG_STTFC, "=====");
999 SLOG(LOG_DEBUG, TAG_STTFC, " ");
1001 return STT_FILE_ERROR_NONE;
1004 int stt_file_set_recognition_result_cb(stt_file_recognition_result_cb callback, void* user_data)
1006 if (NULL == callback)
1007 return STT_FILE_ERROR_INVALID_PARAMETER;
1009 stt_file_client_s* client = stt_file_client_get();
1012 if (NULL == client) {
1013 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] A handle is not available");
1014 return STT_FILE_ERROR_INVALID_PARAMETER;
1017 if (STT_FILE_STATE_READY != client->current_state) {
1018 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Current state(%d) is not 'ready'", client->current_state);
1019 return STT_FILE_ERROR_INVALID_STATE;
1022 int ret = stt_engine_set_recognition_result_cb(__stt_file_result_cb, NULL);
1024 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Fail to set recognition result cb");
1027 client->recognition_result_cb = callback;
1028 client->recognition_result_user_data = user_data;
1033 int stt_file_unset_recognition_result_cb(void)
1035 stt_file_client_s* client = stt_file_client_get();
1038 if (NULL == client) {
1039 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] A handle is not available");
1040 return STT_FILE_ERROR_INVALID_PARAMETER;
1043 if (STT_FILE_STATE_READY != client->current_state) {
1044 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Current state(%d) is not 'ready'", client->current_state);
1045 return STT_FILE_ERROR_INVALID_STATE;
1048 int ret = stt_engine_set_recognition_result_cb(NULL, NULL);
1050 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Fail to set recognition result cb");
1053 client->recognition_result_cb = NULL;
1054 client->recognition_result_user_data = NULL;
1059 int stt_file_set_state_changed_cb(stt_file_state_changed_cb callback, void* user_data)
1061 if (NULL == callback)
1062 return STT_FILE_ERROR_INVALID_PARAMETER;
1064 stt_file_client_s* client = stt_file_client_get();
1067 if (NULL == client) {
1068 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] A handle is not available");
1069 return STT_FILE_ERROR_INVALID_PARAMETER;
1072 if (STT_FILE_STATE_READY != client->current_state) {
1073 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Current state(%d) is not 'ready'", client->current_state);
1074 return STT_FILE_ERROR_INVALID_STATE;
1077 client->state_changed_cb = callback;
1078 client->state_changed_user_data = user_data;
1083 int stt_file_unset_state_changed_cb(void)
1085 stt_file_client_s* client = stt_file_client_get();
1088 if (NULL == client) {
1089 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] A handle is not available");
1090 return STT_FILE_ERROR_INVALID_PARAMETER;
1093 if (STT_FILE_STATE_READY != client->current_state) {
1094 SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Current state(%d) is not 'ready'", client->current_state);
1095 return STT_FILE_ERROR_INVALID_STATE;
1098 client->state_changed_cb = NULL;
1099 client->state_changed_user_data = NULL;