Change to STT engine process 52/79752/10 accepted/tizen/common/20160719.172928 accepted/tizen/mobile/20160719.232323 accepted/tizen/wearable/20160719.232438 submit/tizen/20160719.090324 submit/tizen_common/20160719.093915 submit/tizen_mobile/20160719.093939 submit/tizen_wearable/20160719.094003
authorsooyeon.kim <sooyeon.kim@samsung.com>
Tue, 12 Jul 2016 14:28:32 +0000 (23:28 +0900)
committersooyeon.kim <sooyeon.kim@samsung.com>
Fri, 15 Jul 2016 10:22:48 +0000 (19:22 +0900)
Change-Id: I710a760d57dcc195758ae60d113bb67ef7e2e131
Signed-off-by: sooyeon.kim <sooyeon.kim@samsung.com>
33 files changed:
CMakeLists.txt
changelog
client/CMakeLists.txt
client/stt.c
client/stt_client.c
client/stt_dbus.c
client/stt_file.c
common/stt_config_mgr.c
common/stt_defs.h
common/stt_engine.c
common/stt_engine.h
doc/uix_stt_doc.h
doc/uix_stt_engine_main_doc.h [new file with mode: 0755]
include/CMakeLists.txt
include/stt-engine.pc.in
include/stt.h
include/stt_setting.h
include/stte.h [new file with mode: 0755]
org.tizen.voice.sttserver.service
packaging/stt.spec
server/CMakeLists.txt
server/sttd_config.c
server/sttd_config.h
server/sttd_dbus_server.c
server/sttd_engine_agent.c
server/sttd_engine_agent.h
server/sttd_main.h
server/sttd_recorder.c
server/sttd_recorder.h
server/sttd_server.c
server/sttd_server.h
server/stte.c [new file with mode: 0755]
test/test_main.c

index 42a1c7d..8e4d43c 100644 (file)
@@ -23,7 +23,7 @@ PROJECT(stt)
 
 SET(PREFIX ${CMAKE_INSTALL_PREFIX})
 SET(EXEC_PREFIX "${PREFIX}")
-SET(VERSION 0.2.55)
+SET(VERSION 0.2.56)
 
 ADD_DEFINITIONS("-DSTT_LIBDIR=\"${LIBDIR}\"")
 ADD_DEFINITIONS("-Werror")
index e1b29b6..97875d8 100644 (file)
--- a/changelog
+++ b/changelog
@@ -1,3 +1,7 @@
+stt (0.2.56) -- Fri, 1 July 2016
+
+  * Change engine lib to engine process. Daemon will be used as library (Kwangyoun Kim <ky85.kim@samsung.com>)
+
 stt (0.2.55) -- Wed, 18 May 2016
 
   * Add to get error message function and to set credential fucntion (Wonnam Jang <wn.jang@samsung.com>)
index 9f4a756..6a35e5f 100644 (file)
@@ -13,6 +13,13 @@ SET(FILE_SRCS
        ../common/stt_config_parser.c
        ../common/stt_engine.c
        ../common/stt_network.c
+       ../server/sttd_client_data.c
+       ../server/sttd_config.c
+       ../server/sttd_dbus.c
+       ../server/sttd_dbus_server.c
+       ../server/sttd_engine_agent.c
+       ../server/sttd_recorder.c
+       ../server/sttd_server.c
 )
 
 set(SETTING_SRCS
index 82c47cb..34e95cf 100755 (executable)
@@ -110,8 +110,10 @@ static int __check_privilege(const char* uid, const char * privilege)
        char *session = cynara_session_from_pid(pid);
        int ret = cynara_check(p_cynara, smack_label, session, uid, privilege);
        SLOG(LOG_DEBUG, TAG_STTC, "[Client]cynara_check returned %d(%s)", ret, (CYNARA_API_ACCESS_ALLOWED == ret) ? "Allowed" : "Denied");
-       if (session)
-           free(session);
+       if (session) {
+               free(session);
+               session = NULL;
+       }
 
        if (ret != CYNARA_API_ACCESS_ALLOWED)
            return false;
@@ -244,7 +246,7 @@ void __stt_config_engine_changed_cb(const char* engine_id, const char* setting,
        if (NULL != client->engine_changed_cb) {
                client->engine_changed_cb(stt, engine_id, language, support_silence, need_credential, client->engine_changed_user_data);
        } else {
-               SLOG(LOG_WARN, TAG_STTC, "No registered callback function of supported languages");
+               SLOG(LOG_WARN, TAG_STTC, "No registered callback function for engine change");
        }
        return;
 }
@@ -568,6 +570,10 @@ int stt_set_credential(stt_h stt, const char* credential)
                return STT_ERROR_INVALID_STATE;
        }
 
+       if (NULL != client->credential) {
+               free(client->credential);
+               client->credential = NULL;
+       }
        client->credential = strdup(credential);
 
        SLOG(LOG_DEBUG, TAG_STTC, "=====");
@@ -707,7 +713,7 @@ static Eina_Bool __stt_connect_daemon(void *data)
        }
 
        g_connect_timer = NULL;
-       SLOG(LOG_DEBUG, TAG_STTC, "===== Connect daemon");
+       SLOG(LOG_DEBUG, TAG_STTC, "===== Connect stt-service");
 
        /* request initialization */
        bool silence_supported = false;
@@ -727,7 +733,7 @@ static Eina_Bool __stt_connect_daemon(void *data)
                SLOG(LOG_ERROR, TAG_STTC, "[WARNING] Fail to connection. Retry to connect");
                return EINA_TRUE;
        } else {
-               /* success to connect stt-daemon */
+               /* success to connect stt-service */
                client->silence_supported = silence_supported;
                client->credential_needed = credential_needed;
                SLOG(LOG_DEBUG, TAG_STTC, "Supported options : silence(%s), credential(%s)", silence_supported ? "support" : "no support", credential_needed ? "need" : "no need");
index c925151..e36e87e 100644 (file)
@@ -127,14 +127,18 @@ int stt_client_destroy(stt_h stt)
 
                                if (NULL != data->err_msg) {
                                        free(data->err_msg);
+                                       data->err_msg = NULL;
                                }
 
                                if (NULL != data->credential) {
                                        free(data->credential);
+                                       data->credential = NULL;
                                }
 
                                free(data);
                                free(stt);
+                               data = NULL;
+                               stt = NULL;
 
                                return 0;
                        }
index 3728b02..e64a8cb 100644 (file)
@@ -428,9 +428,9 @@ int stt_dbus_request_hello()
        DBusMessage* msg;
 
        msg = dbus_message_new_method_call(
-               STT_SERVER_SERVICE_NAME,
-               STT_SERVER_SERVICE_OBJECT_PATH,
-               STT_SERVER_SERVICE_INTERFACE,
+               STT_SERVER_SERVICE_NAME, 
+               STT_SERVER_SERVICE_OBJECT_PATH, 
+               STT_SERVER_SERVICE_INTERFACE, 
                STT_METHOD_HELLO);
 
        if (NULL == msg) {
@@ -483,9 +483,9 @@ int stt_dbus_request_initialize(int uid, bool* silence_supported, bool* credenti
        DBusMessage* msg;
 
        msg = dbus_message_new_method_call(
-               STT_SERVER_SERVICE_NAME,
-               STT_SERVER_SERVICE_OBJECT_PATH,
-               STT_SERVER_SERVICE_INTERFACE,
+               STT_SERVER_SERVICE_NAME, 
+               STT_SERVER_SERVICE_OBJECT_PATH, 
+               STT_SERVER_SERVICE_INTERFACE, 
                STT_METHOD_INITIALIZE);
 
        if (NULL == msg) {
@@ -554,9 +554,9 @@ int stt_dbus_request_finalize(int uid)
        DBusMessage* msg;
 
        msg = dbus_message_new_method_call(
-               STT_SERVER_SERVICE_NAME,
-               STT_SERVER_SERVICE_OBJECT_PATH,
-               STT_SERVER_SERVICE_INTERFACE,
+               STT_SERVER_SERVICE_NAME, 
+               STT_SERVER_SERVICE_OBJECT_PATH, 
+               STT_SERVER_SERVICE_INTERFACE, 
                STT_METHOD_FINALIZE);
 
        if (NULL == msg) {
@@ -582,7 +582,7 @@ int stt_dbus_request_finalize(int uid)
        }
 
        if (NULL != result_msg) {
-               dbus_message_get_args(result_msg, &err,
+               dbus_message_get_args(result_msg, &err, 
                                DBUS_TYPE_INT32, &result,
                                DBUS_TYPE_INVALID);
 
@@ -613,9 +613,9 @@ int stt_dbus_request_set_current_engine(int uid, const char* engine_id, bool* si
        DBusMessage* msg;
 
        msg = dbus_message_new_method_call(
-               STT_SERVER_SERVICE_NAME,
-               STT_SERVER_SERVICE_OBJECT_PATH,
-               STT_SERVER_SERVICE_INTERFACE,
+               STT_SERVER_SERVICE_NAME, 
+               STT_SERVER_SERVICE_OBJECT_PATH, 
+               STT_SERVER_SERVICE_INTERFACE, 
                STT_METHOD_SET_CURRENT_ENGINE);
 
        if (NULL == msg) {
@@ -644,8 +644,8 @@ int stt_dbus_request_set_current_engine(int uid, const char* engine_id, bool* si
        }
 
        if (NULL != result_msg) {
-               dbus_message_get_args(result_msg, &err,
-                       DBUS_TYPE_INT32, &result,
+               dbus_message_get_args(result_msg, &err, 
+                       DBUS_TYPE_INT32, &result, 
                        DBUS_TYPE_INT32, silence_supported,
                        DBUS_TYPE_INT32, credential_needed,
                        DBUS_TYPE_INVALID);
@@ -683,9 +683,9 @@ int stt_dbus_request_check_app_agreed(int uid, const char* appid, bool* value)
        DBusMessage* msg;
 
        msg = dbus_message_new_method_call(
-               STT_SERVER_SERVICE_NAME,
-               STT_SERVER_SERVICE_OBJECT_PATH,
-               STT_SERVER_SERVICE_INTERFACE,
+               STT_SERVER_SERVICE_NAME, 
+               STT_SERVER_SERVICE_OBJECT_PATH, 
+               STT_SERVER_SERVICE_INTERFACE, 
                STT_METHOD_CHECK_APP_AGREED);
 
        if (NULL == msg) {
@@ -752,9 +752,9 @@ int stt_dbus_request_get_support_langs(int uid, stt_h stt, stt_supported_languag
        DBusMessage* msg;
 
        msg = dbus_message_new_method_call(
-               STT_SERVER_SERVICE_NAME,
-               STT_SERVER_SERVICE_OBJECT_PATH,
-               STT_SERVER_SERVICE_INTERFACE,
+               STT_SERVER_SERVICE_NAME, 
+               STT_SERVER_SERVICE_OBJECT_PATH, 
+               STT_SERVER_SERVICE_INTERFACE, 
                STT_METHOD_GET_SUPPORT_LANGS);
 
        if (NULL == msg) {
@@ -837,9 +837,9 @@ int stt_dbus_request_get_default_lang(int uid, char** language)
        DBusMessage* msg;
 
        msg = dbus_message_new_method_call(
-               STT_SERVER_SERVICE_NAME,
-               STT_SERVER_SERVICE_OBJECT_PATH,
-               STT_SERVER_SERVICE_INTERFACE,
+               STT_SERVER_SERVICE_NAME, 
+               STT_SERVER_SERVICE_OBJECT_PATH, 
+               STT_SERVER_SERVICE_INTERFACE, 
                STT_METHOD_GET_CURRENT_LANG);
 
        if (NULL == msg) {
@@ -1051,9 +1051,9 @@ int stt_dbus_request_is_recognition_type_supported(int uid, const char* type, bo
        DBusMessage* msg;
 
        msg = dbus_message_new_method_call(
-                  STT_SERVER_SERVICE_NAME,
-                  STT_SERVER_SERVICE_OBJECT_PATH,
-                  STT_SERVER_SERVICE_INTERFACE,
+                  STT_SERVER_SERVICE_NAME, 
+                  STT_SERVER_SERVICE_OBJECT_PATH, 
+                  STT_SERVER_SERVICE_INTERFACE, 
                   STT_METHOD_IS_TYPE_SUPPORTED);
 
        if (NULL == msg) {
@@ -1120,9 +1120,9 @@ int stt_dbus_request_set_start_sound(int uid, const char* file)
        DBusMessage* msg;
 
        msg = dbus_message_new_method_call(
-                  STT_SERVER_SERVICE_NAME,
-                  STT_SERVER_SERVICE_OBJECT_PATH,
-                  STT_SERVER_SERVICE_INTERFACE,
+                  STT_SERVER_SERVICE_NAME, 
+                  STT_SERVER_SERVICE_OBJECT_PATH, 
+                  STT_SERVER_SERVICE_INTERFACE, 
                   STT_METHOD_SET_START_SOUND);
 
        if (NULL == msg) {
@@ -1181,9 +1181,9 @@ int stt_dbus_request_unset_start_sound(int uid)
        DBusMessage* msg;
 
        msg = dbus_message_new_method_call(
-                  STT_SERVER_SERVICE_NAME,
-                  STT_SERVER_SERVICE_OBJECT_PATH,
-                  STT_SERVER_SERVICE_INTERFACE,
+                  STT_SERVER_SERVICE_NAME, 
+                  STT_SERVER_SERVICE_OBJECT_PATH, 
+                  STT_SERVER_SERVICE_INTERFACE, 
                   STT_METHOD_UNSET_START_SOUND);
 
        if (NULL == msg) {
@@ -1246,9 +1246,9 @@ int stt_dbus_request_set_stop_sound(int uid, const char* file)
        DBusMessage* msg;
 
        msg = dbus_message_new_method_call(
-                  STT_SERVER_SERVICE_NAME,
-                  STT_SERVER_SERVICE_OBJECT_PATH,
-                  STT_SERVER_SERVICE_INTERFACE,
+                  STT_SERVER_SERVICE_NAME, 
+                  STT_SERVER_SERVICE_OBJECT_PATH, 
+                  STT_SERVER_SERVICE_INTERFACE, 
                   STT_METHOD_SET_STOP_SOUND);
 
        if (NULL == msg) {
@@ -1307,9 +1307,9 @@ int stt_dbus_request_unset_stop_sound(int uid)
        DBusMessage* msg;
 
        msg = dbus_message_new_method_call(
-                  STT_SERVER_SERVICE_NAME,
-                  STT_SERVER_SERVICE_OBJECT_PATH,
-                  STT_SERVER_SERVICE_INTERFACE,
+                  STT_SERVER_SERVICE_NAME, 
+                  STT_SERVER_SERVICE_OBJECT_PATH, 
+                  STT_SERVER_SERVICE_INTERFACE, 
                   STT_METHOD_UNSET_STOP_SOUND);
 
        if (NULL == msg) {
@@ -1490,8 +1490,8 @@ int stt_dbus_request_stop(int uid)
                SLOG(LOG_DEBUG, TAG_STTC, ">>>> stt stop : uid(%d)", uid);
        }
 
-       dbus_message_append_args(msg,
-               DBUS_TYPE_INT32, &uid,
+       dbus_message_append_args(msg, 
+               DBUS_TYPE_INT32, &uid, 
                DBUS_TYPE_INVALID);
 #if 1
        if (g_conn_sender) {
@@ -1570,8 +1570,8 @@ int stt_dbus_request_cancel(int uid)
                SLOG(LOG_DEBUG, TAG_STTC, ">>>> stt cancel : uid(%d)", uid);
        }
 
-       dbus_message_append_args(msg,
-               DBUS_TYPE_INT32, &uid,
+       dbus_message_append_args(msg, 
+               DBUS_TYPE_INT32, &uid, 
                DBUS_TYPE_INVALID);
 #if 1
        if (g_conn_sender) {
index 3a36dfe..86c3471 100644 (file)
@@ -45,17 +45,10 @@ typedef struct _sttengine_info {
 
 static GSList* g_engine_list;
 
-static int     g_engine_id_count = 0;
-
 
 #define STT_FILE_CONFIG_HANDLE 100000
 
 
-const char* stt_tag(void)
-{
-       return TAG_STTFC;
-}
-
 static const char* __stt_file_get_error_code(stt_file_error_e err)
 {
        switch (err) {
@@ -75,7 +68,7 @@ static const char* __stt_file_get_error_code(stt_file_error_e err)
        }
 }
 
-void __stt_file_engine_info_cb(const char* engine_uuid, const char* engine_name, const char* setting_ug_name,
+void __stt_file_engine_info_cb(const char* engine_uuid, const char* engine_name, const char* setting_ug_name, 
                      bool use_network, void* user_data)
 {
        sttengine_info_s* temp = (sttengine_info_s*)user_data;
@@ -88,6 +81,7 @@ void __stt_file_engine_info_cb(const char* engine_uuid, const char* engine_name,
 
 static int __stt_file_get_engine_info(const char* filepath, sttengine_info_s** info)
 {
+#ifdef __UNUSED_CODES__
        if (NULL == filepath || NULL == info) {
                SLOG(LOG_ERROR, TAG_STTFC, "[Engine Agent ERROR] Invalid Parameter");
                return STT_FILE_ERROR_INVALID_PARAMETER;
@@ -104,7 +98,7 @@ static int __stt_file_get_engine_info(const char* filepath, sttengine_info_s** i
                return STT_FILE_ERROR_ENGINE_NOT_FOUND;
        }
 
-       /* link engine to daemon */
+       /* link engine to stt-service */
        dlsym(handle, "sttp_load_engine");
        if ((error = dlerror()) != NULL) {
                SLOG(LOG_WARN, TAG_STTFC, "[Engine Agent] Invalid engine. Fail to open sttp_load_engine : %s", error);
@@ -164,6 +158,7 @@ static int __stt_file_get_engine_info(const char* filepath, sttengine_info_s** i
        SLOG(LOG_DEBUG, TAG_STTFC, "  ");
 
        *info = temp;
+#endif
 
        return STT_FILE_ERROR_NONE;
 }
@@ -213,10 +208,10 @@ void __stt_file_relseae_engine_info(void)
                                if (engine->is_loaded) {
                                        SECURE_SLOG(LOG_DEBUG, TAG_STTFC, "[Engine Agent] Unload engine id(%d)", engine->engine_id);
 
-                                       if (0 != stt_engine_deinitialize(engine->engine_id))
+                                       if (0 != stt_engine_deinitialize())
                                                SECURE_SLOG(LOG_WARN, TAG_STTFC, "[Engine Agent] Fail to deinitialize engine id(%d)", engine->engine_id);
 
-                                       if (0 != stt_engine_unload(engine->engine_id))
+                                       if (0 != stt_engine_unload())
                                                SECURE_SLOG(LOG_WARN, TAG_STTFC, "[Engine Agent] Fail to unload engine id(%d)", engine->engine_id);
 
                                        engine->is_loaded = false;
@@ -255,7 +250,7 @@ static sttengine_info_s* __stt_file_get_engine_by_id(int engine_id)
        return NULL;
 }
 
-void __stt_file_result_cb(sttp_result_event_e event, const char* type, const char** data, int data_count,
+void __stt_file_result_cb(stte_result_event_e event, const char* type, const char** data, int data_count,
                 const char* msg, void* time_info, void *user_data)
 {
 
@@ -293,7 +288,7 @@ void __stt_file_result_cb(sttp_result_event_e event, const char* type, const cha
 
        client->time_info = NULL;
 
-       if (STTP_RESULT_EVENT_FINAL_RESULT == event || STTP_RESULT_EVENT_ERROR == event) {
+       if (STTE_RESULT_EVENT_FINAL_RESULT == event || STTE_RESULT_EVENT_ERROR == event) {
                SLOG(LOG_DEBUG, TAG_STTFC, "[STT FILE] State change : 'Ready'");
 
                client->before_state = client->current_state;
@@ -312,12 +307,20 @@ void __stt_file_result_cb(sttp_result_event_e event, const char* type, const cha
        return;
 }
 
-void __stt_file_silence_cb(sttp_silence_type_e type, void *user_data)
+void __stt_file_speech_status_cb(stte_speech_status_e status, void *user_data)
 {
+       /* it seems to be no necessity yet */
        SLOG(LOG_WARN, TAG_STTFC, "[WARNING] This callback should NOT be called.");
        return;
 }
 
+void __stt_file_error_cb(stte_error_e error, const char* msg)
+{
+       /* it seems to be no necessity yet */
+       SLOG(LOG_DEBUG, TAG_STTFC, "[STT FILE] Error callback is called");
+       return;
+}
+
 static int __stt_file_load_engine(sttengine_info_s* engine)
 {
        if (NULL == engine) {
@@ -325,12 +328,12 @@ static int __stt_file_load_engine(sttengine_info_s* engine)
                return STT_FILE_ERROR_INVALID_PARAMETER;
        }
 
-       if (0 != stt_engine_load(engine->engine_id, engine->engine_path)) {
+       if (0 != stt_engine_load(engine->engine_path, NULL)) {
                SLOG(LOG_ERROR, TAG_STTFC, "[STT FILE ERROR] Fail to load engine(%s)", engine->engine_path);
                return STT_FILE_ERROR_OPERATION_FAILED;
        }
 
-       int ret = stt_engine_initialize(engine->engine_id, __stt_file_result_cb, __stt_file_silence_cb);
+       int ret = stt_engine_initialize(true);
        if (0 != ret) {
                SECURE_SLOG(LOG_ERROR, TAG_STTFC, "[Engine Agent ERROR] Fail to initialize engine : id(%d) path(%s)", engine->engine_id, engine->engine_path);
                return STT_FILE_ERROR_OPERATION_FAILED;
@@ -368,7 +371,7 @@ int stt_file_initialize(void)
                        }
 
                        if (NULL != dirp) {
-                               sttengine_info_s* info;
+                               sttengine_info_s* info = NULL;
                                char* filepath;
                                int filesize;
 
@@ -524,7 +527,7 @@ int stt_file_deinitialize(void)
        switch (client->current_state) {
        case STT_FILE_STATE_PROCESSING:
                /* Cancel file recognition */
-               stt_engine_recognize_cancel_file(client->current_engine_id);
+               stt_engine_recognize_cancel_file();
 
        case STT_FILE_STATE_READY:
                /* Unload engine */
@@ -739,8 +742,8 @@ int stt_file_set_engine(const char* engine_id)
        client->current_engine_id = engine->engine_id;
 
        if (-1 != temp_old_engine) {
-               stt_engine_deinitialize(temp_old_engine);
-               stt_engine_unload(temp_old_engine);
+               stt_engine_deinitialize();
+               stt_engine_unload();
        }
 
        SLOG(LOG_DEBUG, TAG_STTFC, "=====");
@@ -862,7 +865,7 @@ int stt_file_start(const char* language, const char* type, const char* filepath,
                client->current_engine_id, language, type, filepath, audio_type, sample_rate);
 
        int ret = -1;
-       ret = stt_engine_recognize_start_file(client->current_engine_id, language, type, filepath, audio_type, sample_rate, NULL);
+       ret = stt_engine_recognize_start_file(language, type, filepath, audio_type, sample_rate, NULL);
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Fail to start file recognition");
                SLOG(LOG_DEBUG, TAG_STTFC, "=====");
@@ -911,7 +914,7 @@ int stt_file_cancel(void)
        }
 
        int ret = -1;
-       ret = stt_engine_recognize_cancel_file(client->current_engine_id);
+       ret = stt_engine_recognize_cancel_file();
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Fail to cancel file recognition");
                SLOG(LOG_DEBUG, TAG_STTFC, "=====");
@@ -937,7 +940,7 @@ int stt_file_cancel(void)
        return STT_FILE_ERROR_NONE;
 }
 
-bool __stt_file_result_time_cb(int index, sttp_result_time_event_e event, const char* text, long start_time, long end_time, void* user_data)
+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)
 {
        SLOG(LOG_DEBUG, TAG_STTFC, "(%d) event(%d) text(%s) start(%ld) end(%ld)",
                index, event, text, start_time, end_time);
@@ -981,7 +984,7 @@ int stt_file_foreach_detailed_result(stt_file_result_time_cb callback, void* use
        client->result_time_cb = callback;
        client->result_time_user_data = user_data;
 
-       stt_engine_foreach_result_time(client->current_engine_id, client->time_info, __stt_file_result_time_cb, NULL);
+       stt_engine_foreach_result_time(client->time_info, __stt_file_result_time_cb, NULL);
 
        client->result_time_cb = NULL;
        client->result_time_user_data = NULL;
@@ -1010,10 +1013,15 @@ int stt_file_set_recognition_result_cb(stt_file_recognition_result_cb callback,
                return STT_FILE_ERROR_INVALID_STATE;
        }
 
+       int ret = stt_engine_set_recognition_result_cb(__stt_file_result_cb, NULL);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Fail to set recognition result cb");
+       }
+
        client->recognition_result_cb = callback;
        client->recognition_result_user_data = user_data;
 
-       return 0;
+       return ret;
 }
 
 int stt_file_unset_recognition_result_cb(void)
@@ -1031,10 +1039,15 @@ int stt_file_unset_recognition_result_cb(void)
                return STT_FILE_ERROR_INVALID_STATE;
        }
 
+       int ret = stt_engine_set_recognition_result_cb(NULL, NULL);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTFC, "[ERROR] Fail to set recognition result cb");
+       }
+
        client->recognition_result_cb = NULL;
        client->recognition_result_user_data = NULL;
 
-       return 0;
+       return ret;
 }
 
 int stt_file_set_state_changed_cb(stt_file_state_changed_cb callback, void* user_data)
index 6d7a95f..eaa6fe0 100644 (file)
@@ -453,6 +453,7 @@ int __stt_config_set_auto_language()
                g_config_info->language = strdup(tmp_language);
 
                free(tmp_language);
+               tmp_language = NULL;
        }
 
        return 0;
@@ -652,6 +653,64 @@ int __stt_config_mgr_check_engine_is_valid(const char* engine_id)
        return STT_CONFIG_ERROR_NONE;
 }
 
+static void __get_engine_list(const char* directory)
+{
+       DIR *dp = NULL;
+       int ret = -1;
+       struct dirent entry;
+       struct dirent *dirp = NULL;
+
+       if (NULL == directory) {
+               SLOG(LOG_ERROR, stt_tag(), "[Directory ERROR] Directory is NULL");
+               return;
+       }
+
+       dp  = opendir(directory);
+       if (NULL != dp) {
+               do {
+                       ret = readdir_r(dp, &entry, &dirp);
+                       if (0 != ret) {
+                               SLOG(LOG_ERROR, stt_tag(), "[File ERROR] Fail to read directory");
+                               break;
+                       }
+
+                       if (NULL != dirp) {
+                               if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name))
+                                       continue;
+
+                               stt_engine_info_s* info;
+                               char* filepath = NULL;
+                               int filesize;
+
+                               filesize = strlen(STT_DEFAULT_ENGINE_INFO) + strlen(dirp->d_name) + 5;
+                               filepath = (char*)calloc(filesize, sizeof(char));
+
+                               if (NULL != filepath) {
+                                       snprintf(filepath, filesize, "%s/%s", directory, dirp->d_name);
+                               } else {
+                                       SLOG(LOG_ERROR, stt_tag(), "[Config ERROR] Memory not enough!!");
+                                       continue;
+                               }
+
+                               if (0 == stt_parser_get_engine_info(filepath, &info)) {
+                                       g_engine_list = g_slist_append(g_engine_list, info);
+                               }
+
+                               if (NULL != filepath) {
+                                       free(filepath);
+                                       filepath = NULL;
+                               }
+                       }
+               } while (NULL != dirp);
+
+               closedir(dp);
+       } else {
+               SLOG(LOG_WARN, stt_tag(), "[Config WARNING] Fail to open directory"); 
+       }
+
+       return;
+}
+
 int stt_config_mgr_initialize(int uid)
 {
        GSList *iter = NULL;
@@ -692,54 +751,14 @@ int stt_config_mgr_initialize(int uid)
        }
 
        /* Get file name from default engine directory */
-       DIR *dp = NULL;
-       int ret = -1;
-       struct dirent entry;
-       struct dirent *dirp = NULL;
-
        g_engine_list = NULL;
 
        SLOG(LOG_WARN, stt_tag(), "[CONFIG] default engine info(%s)", STT_DEFAULT_ENGINE_INFO);
-       dp  = opendir(STT_DEFAULT_ENGINE_INFO);
-       if (NULL != dp) {
-               do {
-                       ret = readdir_r(dp, &entry, &dirp);
-                       if (0 != ret) {
-                               SLOG(LOG_ERROR, stt_tag(), "[File ERROR] Fail to read directory");
-                               break;
-                       }
-
-                       if (NULL != dirp) {
-                               if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name))
-                                       continue;
-
-                               stt_engine_info_s* info;
-                               char* filepath;
-                               int filesize;
-
-                               filesize = strlen(STT_DEFAULT_ENGINE_INFO) + strlen(dirp->d_name) + 5;
-                               filepath = (char*)calloc(filesize, sizeof(char));
-
-                               if (NULL != filepath) {
-                                       snprintf(filepath, filesize, "%s/%s", STT_DEFAULT_ENGINE_INFO, dirp->d_name);
-                               } else {
-                                       SLOG(LOG_ERROR, stt_tag(), "[Config ERROR] Memory not enough!!");
-                                       continue;
-                               }
 
-                               if (0 == stt_parser_get_engine_info(filepath, &info)) {
-                                       g_engine_list = g_slist_append(g_engine_list, info);
-                               }
-
-                               if (NULL != filepath)
-                                       free(filepath);
-                       }
-               } while (NULL != dirp);
-
-               closedir(dp);
-       } else {
-               SLOG(LOG_WARN, stt_tag(), "[Config WARNING] Fail to open default directory");
-       }
+       SLOG(LOG_DEBUG, stt_tag(), "[CONFIG] Get default engine list");
+       __get_engine_list(STT_DEFAULT_ENGINE_INFO);
+       SLOG(LOG_DEBUG, stt_tag(), "[CONFIG] Get download engine list");
+       __get_engine_list(STT_DOWNLOAD_ENGINE_INFO);
 
        __stt_config_mgr_print_engine_info();
 
@@ -785,8 +804,8 @@ int stt_config_mgr_initialize(int uid)
                }
        }
 
-       /* print daemon config */
-       SLOG(LOG_DEBUG, stt_tag(), "== Daemon config ==");
+       /* print stt-service config */
+       SLOG(LOG_DEBUG, stt_tag(), "== STT service config ==");
        SLOG(LOG_DEBUG, stt_tag(), " engine : %s", g_config_info->engine_id);
        SLOG(LOG_DEBUG, stt_tag(), " setting : %s", g_config_info->setting);
        SLOG(LOG_DEBUG, stt_tag(), " auto language : %s", g_config_info->auto_lang ? "on" : "off");
@@ -967,7 +986,7 @@ int stt_config_mgr_get_engine_list(stt_config_supported_engine_cb callback, void
                        return STT_CONFIG_ERROR_OPERATION_FAILED;
                }
 
-               if (false == callback(engine_info->uuid, engine_info->name,
+               if (false == callback(engine_info->uuid, engine_info->name, 
                        engine_info->setting, engine_info->support_silence_detection, user_data)) {
                        break;
                }
@@ -1517,7 +1536,7 @@ int __stt_config_mgr_print_engine_info()
                } else {
                        SLOG(LOG_ERROR, stt_tag(), "  language is NONE");
                }
-               SLOG(LOG_DEBUG, stt_tag(), " silence support : %s",
+               SLOG(LOG_DEBUG, stt_tag(), " silence support : %s", 
                        engine_info->support_silence_detection ? "true" : "false");
                iter = g_slist_next(iter);
                i++;
@@ -1611,7 +1630,7 @@ int stt_config_mgr_foreach_time_info(stt_config_result_time_cb callback, void* u
        while (NULL != iter) {
                data = iter->data;
 
-               if (false == callback(data->index, data->event, data->text,
+               if (false == callback(data->index, data->event, data->text, 
                        data->start_time, data->end_time, user_data)) {
                        break;
                }
index 6ea59f3..59b2b36 100644 (file)
@@ -79,6 +79,10 @@ extern "C" {
 #define STT_DEFAULT_ENGINE_INFO                tzplatform_mkpath(TZ_SYS_RO_SHARE, "/voice/stt/1.0/engine-info")
 #define STT_DEFAULT_ENGINE_SETTING     tzplatform_mkpath(TZ_SYS_RO_SHARE, "/voice/stt/1.0/engine-setting")
 
+#define STT_HOME                       tzplatform_mkpath(TZ_USER_HOME, "share/.voice/stt")
+#define STT_DOWNLOAD_BASE              tzplatform_mkpath(TZ_USER_HOME, "share/.voice/stt/1.0")
+#define STT_DOWNLOAD_ENGINE_INFO       tzplatform_mkpath(TZ_USER_HOME, "share/.voice/stt/1.0/engine-info")
+
 #define STT_BASE_LANGUAGE              "en_US"
 
 #define STT_RETRY_COUNT                        5
index e877855..2c65e04 100644 (file)
 #include <stdbool.h>
 
 #include "stt_engine.h"
+#include "sttd_engine_agent.h"
 
 /*
 * Internal data structure
 */
 
 typedef struct {
-       int     engine_id;
        char*   engine_path;
-       void    *handle;
-
-       sttpe_funcs_s*  pefuncs;
-       sttpd_funcs_s*  pdfuncs;
-
-       int (*sttp_load_engine)(sttpd_funcs_s* pdfuncs, sttpe_funcs_s* pefuncs);
-       int (*sttp_unload_engine)();
+       stte_request_callback_s *callback;
 } sttengine_s;
 
 extern const char* stt_tag();
 
-/** stt engine list */
-static GSList *g_engine_list;
+/** stt engine */
+static sttengine_s *g_engine = NULL;
 
-static const char* __stt_get_engine_error_code(sttp_error_e err)
-{
-       switch (err) {
-       case STTP_ERROR_NONE:                   return "STTP_ERROR_NONE";
-       case STTP_ERROR_OUT_OF_MEMORY:          return "STTP_ERROR_OUT_OF_MEMORY";
-       case STTP_ERROR_IO_ERROR:               return "STTP_ERROR_IO_ERROR";
-       case STTP_ERROR_INVALID_PARAMETER:      return "STTP_ERROR_INVALID_PARAMETER";
-       case STTP_ERROR_TIMED_OUT:              return "STTP_ERROR_TIMED_OUT";
-       case STTP_ERROR_RECORDER_BUSY:          return "STTP_ERROR_RECORDER_BUSY";
-       case STTP_ERROR_OUT_OF_NETWORK:         return "STTP_ERROR_OUT_OF_NETWORK";
-       case STTP_ERROR_PERMISSION_DENIED:      return "STTP_ERROR_PERMISSION_DENIED";
-       case STTP_ERROR_NOT_SUPPORTED:          return "STTP_ERROR_NOT_SUPPORTED";
-       case STTP_ERROR_INVALID_STATE:          return "STTP_ERROR_INVALID_STATE";
-       case STTP_ERROR_INVALID_LANGUAGE:       return "STTP_ERROR_INVALID_LANGUAGE";
-       case STTP_ERROR_ENGINE_NOT_FOUND:       return "STTP_ERROR_ENGINE_NOT_FOUND";
-       case STTP_ERROR_OPERATION_FAILED:       return "STTP_ERROR_OPERATION_FAILED";
-       case STTP_ERROR_NOT_SUPPORTED_FEATURE:  return "STTP_ERROR_NOT_SUPPORTED_FEATURE";
-       default:
-               return "Invalid error code";
-       }
-}
+static bool g_is_from_lib = false;
 
-static sttengine_s* __get_engine(int engine_id)
-{
-       /* check whether engine id is valid or not.*/
-       GSList *iter = NULL;
-       sttengine_s *engine = NULL;
+/** callback functions */
+static stt_engine_result_cb g_result_cb = NULL;
+static stte_private_data_set_cb g_set_private_data_cb = NULL;
+static stte_private_data_requested_cb g_get_private_data_cb = NULL;
 
-       if (g_slist_length(g_engine_list) > 0) {
-               /*Get a first item*/
-               iter = g_slist_nth(g_engine_list, 0);
 
-               while (NULL != iter) {
-                       /*Get handle data from list*/
-                       engine = iter->data;
+static int __stt_set_engine_from(bool is_from_lib)
+{
+       g_is_from_lib = is_from_lib;
+       return 0;
+}
 
-                       if (engine_id == engine->engine_id) {
-                               return engine;
-                       }
+static bool __stt_get_engine_from(void)
+{
+       return g_is_from_lib;
+}
 
-                       /*Get next item*/
-                       iter = g_slist_next(iter);
-               }
+static const char* __stt_get_engine_error_code(stte_error_e err)
+{
+       switch (err) {
+       case STTE_ERROR_NONE:                   return "STTE_ERROR_NONE";
+       case STTE_ERROR_OUT_OF_MEMORY:          return "STTE_ERROR_OUT_OF_MEMORY";
+       case STTE_ERROR_IO_ERROR:               return "STTE_ERROR_IO_ERROR";
+       case STTE_ERROR_INVALID_PARAMETER:      return "STTE_ERROR_INVALID_PARAMETER";
+       case STTE_ERROR_NETWORK_DOWN:           return "STTE_ERROR_NETWORK_DOWN";
+       case STTE_ERROR_PERMISSION_DENIED:      return "STTE_ERROR_PERMISSION_DENIED";
+       case STTE_ERROR_NOT_SUPPORTED:          return "STTE_ERROR_NOT_SUPPORTED";
+       case STTE_ERROR_INVALID_STATE:          return "STTE_ERROR_INVALID_STATE";
+       case STTE_ERROR_INVALID_LANGUAGE:       return "STTE_ERROR_INVALID_LANGUAGE";
+       case STTE_ERROR_OPERATION_FAILED:       return "STTE_ERROR_OPERATION_FAILED";
+       case STTE_ERROR_NOT_SUPPORTED_FEATURE:  return "STTE_ERROR_NOT_SUPPORTED_FEATURE";
+       case STTE_ERROR_RECORDING_TIMED_OUT:    return "STTE_ERROR_RECORDING_TIMED_OUT";
+       default:
+               return "Invalid error code";
        }
-
-       return NULL;
 }
 
 /* Register engine id */
-int stt_engine_load(int engine_id, const char* filepath)
+int stt_engine_load(const char* filepath, stte_request_callback_s *callback)
 {
-       if (NULL == filepath || engine_id < 0) {
+       if (NULL == callback || NULL == filepath) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
-               return STTP_ERROR_INVALID_PARAMETER;
+               return STTE_ERROR_INVALID_PARAMETER;
        }
 
-       sttengine_s* engine = NULL;
-       engine = __get_engine(engine_id);
-       if (NULL != engine) {
-               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is already loaded", engine_id);
-               return 0;
-       }
-
-       SECURE_SLOG(LOG_DEBUG, stt_tag(), "[Engine] Load engine id(%d), path(%s)", engine_id, filepath);
-
        /* allocation memory */
-       engine = (sttengine_s*)calloc(1, sizeof(sttengine_s));
-       if (NULL == engine) {
-               SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
-               return STTP_ERROR_OUT_OF_MEMORY;
-       }
-
-       /* load engine */
-       char *error;
-
-       engine->handle = dlopen(filepath, RTLD_LAZY);
-       if (!engine->handle) {
-               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine] Invalid engine (Fail dlopen) : %s", filepath);
-               free(engine);
-               return STTP_ERROR_OPERATION_FAILED;
-       }
-
-       engine->pefuncs = (sttpe_funcs_s*)calloc(1, sizeof(sttpe_funcs_s));
-       if (NULL == engine->pefuncs) {
-               SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
-               dlclose(engine->handle);
-               free(engine);
-               return STTP_ERROR_OUT_OF_MEMORY;
-       }
-       engine->pdfuncs = (sttpd_funcs_s*)calloc(1, sizeof(sttpd_funcs_s));
-       if (NULL == engine->pdfuncs) {
-               SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
-               dlclose(engine->handle);
-               free(engine->pefuncs);
-               free(engine);
-               return STTP_ERROR_OUT_OF_MEMORY;
-       }
-
-       engine->sttp_unload_engine = NULL;
-       engine->sttp_load_engine = NULL;
-
-       engine->sttp_unload_engine = (int (*)())dlsym(engine->handle, "sttp_unload_engine");
-       if (NULL != (error = dlerror()) || NULL == engine->sttp_unload_engine) {
-               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to link daemon to sttp_unload_engine() : %s", error);
-               dlclose(engine->handle);
-               free(engine->pefuncs);
-               free(engine->pdfuncs);
-               free(engine);
-               return STTP_ERROR_OPERATION_FAILED;
-       }
-
-       engine->sttp_load_engine = (int (*)(sttpd_funcs_s*, sttpe_funcs_s*))dlsym(engine->handle, "sttp_load_engine");
-       if (NULL != (error = dlerror()) || NULL == engine->sttp_load_engine) {
-               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to link daemon to sttp_load_engine() : %s", error);
-               dlclose(engine->handle);
-               free(engine->pefuncs);
-               free(engine->pdfuncs);
-               free(engine);
-               return STTP_ERROR_OPERATION_FAILED;
-       }
-
-       engine->engine_id = engine_id;
-       engine->engine_path = strdup(filepath);
-
-       engine->pdfuncs->version = 1;
-       engine->pdfuncs->size = sizeof(sttpd_funcs_s);
-
-       int ret = engine->sttp_load_engine(engine->pdfuncs, engine->pefuncs);
-       if (0 != ret) {
-               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail sttp_load_engine() : %s", __stt_get_engine_error_code(ret));
-               dlclose(engine->handle);
-               free(engine->pefuncs);
-               free(engine->pdfuncs);
-               free(engine->engine_path);
-               free(engine);
-               return ret;
-       }
-
-       /* engine error check */
-       if (engine->pefuncs->size != sizeof(sttpe_funcs_s)) {
-               SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine is not valid : function size is not matched");
-       }
-
-       if (NULL == engine->pefuncs->initialize ||
-               NULL == engine->pefuncs->deinitialize ||
-               NULL == engine->pefuncs->foreach_langs ||
-               NULL == engine->pefuncs->is_valid_lang ||
-               NULL == engine->pefuncs->support_silence ||
-               NULL == engine->pefuncs->support_recognition_type ||
-               NULL == engine->pefuncs->get_audio_format ||
-               NULL == engine->pefuncs->set_silence_detection ||
-               NULL == engine->pefuncs->start ||
-               NULL == engine->pefuncs->set_recording ||
-               NULL == engine->pefuncs->stop ||
-               NULL == engine->pefuncs->cancel ||
-               NULL == engine->pefuncs->foreach_result_time)
-               /* Current unused functions
-               NULL == engine->pefuncs->start_file_recognition ||
-               */
-       {
-               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] The engine functions are NOT valid");
-               dlclose(engine->handle);
-               free(engine->pefuncs);
-               free(engine->pdfuncs);
-               free(engine->engine_path);
-               free(engine);
+       if (NULL != g_engine) {
+               SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine is already loaded");
+       } else {
+               g_engine = (sttengine_s*)calloc(1, sizeof(sttengine_s));
+               if (NULL == g_engine) {
+                       SLOG(LOG_ERROR, stt_tag(), "[ERROR] Fail to allocate memory");
+                       return STTE_ERROR_OUT_OF_MEMORY;
+               }
 
-               return STTP_ERROR_OPERATION_FAILED;
+               /* load engine */
+               g_engine->callback = callback;
+               g_engine->engine_path = strdup(filepath);
        }
 
-       SLOG(LOG_DEBUG, stt_tag(), "[Engine Success] Load engine : version(%d), size(%d)", engine->pefuncs->version, engine->pefuncs->size);
-
-       g_engine_list = g_slist_append(g_engine_list, engine);
+       SLOG(LOG_DEBUG, stt_tag(), "[Engine Success] Load engine : version(%d)", g_engine->callback->version);
 
        return 0;
 }
 
 /* Unregister engine id */
-int stt_engine_unload(int engine_id)
+int stt_engine_unload()
 {
-       sttengine_s* engine = NULL;
-       engine = __get_engine(engine_id);
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
-               return STTP_ERROR_INVALID_PARAMETER;
+       if (NULL == g_engine) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] No engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
-       /* unload engine */
-       engine->sttp_unload_engine();
-       dlclose(engine->handle);
-
-       if (NULL != engine->engine_path)        free(engine->engine_path);
-       if (NULL != engine->pefuncs)            free(engine->pefuncs);
-       if (NULL != engine->pdfuncs)            free(engine->pdfuncs);
+       g_engine->callback = NULL;
 
-       g_engine_list = g_slist_remove(g_engine_list, engine);
+       if (NULL != g_engine->engine_path) {
+               free(g_engine->engine_path);
+               g_engine->engine_path = NULL;
+       }
 
-       free(engine);
+       free(g_engine);
+       g_engine = NULL;
 
        return 0;
 }
 
 
 /* Initialize / Deinitialize */
-int stt_engine_initialize(int engine_id, sttpe_result_cb result_cb, sttpe_silence_detected_cb silence_cb)
+int stt_engine_initialize(bool is_from_lib)
 {
-       if (NULL == result_cb || NULL == silence_cb) {
-               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
-               return STTP_ERROR_INVALID_PARAMETER;
+       if (NULL == g_engine) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] No engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+       if (NULL == g_engine->callback) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
-       sttengine_s* engine = NULL;
-       engine = __get_engine(engine_id);
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
-               return STTP_ERROR_INVALID_PARAMETER;
+       if (NULL == g_engine->callback->initialize) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
        int ret;
-       ret = engine->pefuncs->initialize(result_cb, silence_cb);
+       ret = __stt_set_engine_from(is_from_lib);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to set engine : %s", __stt_get_engine_error_code(ret));
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+       ret = g_engine->callback->initialize();
        if (0 != ret) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to initialize : %s", __stt_get_engine_error_code(ret));
        }
@@ -268,17 +157,25 @@ int stt_engine_initialize(int engine_id, sttpe_result_cb result_cb, sttpe_silenc
        return ret;
 }
 
-int stt_engine_deinitialize(int engine_id)
+int stt_engine_deinitialize()
 {
-       sttengine_s* engine = NULL;
-       engine = __get_engine(engine_id);
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
-               return STTP_ERROR_INVALID_PARAMETER;
+       if (NULL == g_engine) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] No engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+       if (NULL == g_engine->callback) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+       if (NULL == g_engine->callback->deinitialize) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
        int ret;
-       ret = engine->pefuncs->deinitialize();
+       ret = g_engine->callback->deinitialize();
        if (0 != ret) {
                SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] Fail to deinitialize : %s", __stt_get_engine_error_code(ret));
        }
@@ -303,22 +200,30 @@ static bool __supported_language_cb(const char* language, void* user_data)
 }
 
 /* Get option */
-int stt_engine_get_supported_langs(int engine_id, GSList** lang_list)
+int stt_engine_get_supported_langs(GSList** lang_list)
 {
        if (NULL == lang_list) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
-               return STTP_ERROR_INVALID_PARAMETER;
+               return STTE_ERROR_INVALID_PARAMETER;
+       }
+
+       if (NULL == g_engine) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] No engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+       if (NULL == g_engine->callback) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
-       sttengine_s* engine = NULL;
-       engine = __get_engine(engine_id);
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
-               return STTP_ERROR_INVALID_PARAMETER;
+       if (NULL == g_engine->callback->foreach_langs) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
        int ret;
-       ret = engine->pefuncs->foreach_langs(__supported_language_cb, (void*)lang_list);
+       ret = g_engine->callback->foreach_langs(__supported_language_cb, (void*)lang_list);
        if (0 != ret) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] get language list error : %s", __stt_get_engine_error_code(ret));
        }
@@ -326,68 +231,71 @@ int stt_engine_get_supported_langs(int engine_id, GSList** lang_list)
        return ret;
 }
 
-int stt_engine_is_valid_language(int engine_id, const char* language, bool *is_valid)
+int stt_engine_is_valid_language(const char* language, bool *is_valid)
 {
        if (NULL == language || NULL == is_valid) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
-               return STTP_ERROR_INVALID_PARAMETER;
+               return STTE_ERROR_INVALID_PARAMETER;
        }
 
-       sttengine_s* engine = NULL;
-       engine = __get_engine(engine_id);
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
-               return STTP_ERROR_INVALID_PARAMETER;
+       if (NULL == g_engine) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] No engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
-       bool result;
-       result = engine->pefuncs->is_valid_lang(language);
+       if (NULL == g_engine->callback) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
 
-       *is_valid = result;
+       if (NULL == g_engine->callback->is_valid_lang) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
 
-       return 0;
+       int ret = STTE_ERROR_NONE;
+       ret = g_engine->callback->is_valid_lang(language, is_valid);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to check valid language(%d)", ret);
+       }
+       return ret;
 }
 
-int stt_engine_set_private_data(int engine_id, const char* key, const char* data)
+int stt_engine_set_private_data(const char* key, const char* data)
 {
        if (NULL == key || NULL == data) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
-               return STTP_ERROR_INVALID_PARAMETER;
+               return STTE_ERROR_INVALID_PARAMETER;
        }
 
-       sttengine_s* engine = NULL;
-       engine = __get_engine(engine_id);
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
-               return STTP_ERROR_INVALID_PARAMETER;
+       int ret = STTE_ERROR_NONE;
+       if (NULL != g_set_private_data_cb) {
+               ret = g_set_private_data_cb(key, data);
+               if (0 != ret) {
+                       SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to set private data(%d)", ret);
+               }
        }
 
-       int ret = engine->pefuncs->set_private_data(key, data);
-       if (0 != ret) {
-               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to set private data(%d)", ret);
-       }
        return ret;
 }
 
-int stt_engine_get_private_data(int engine_id, const char* key, char** data)
+int stt_engine_get_private_data(const char* key, char** data)
 {
        if (NULL == key || NULL == data) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
-               return STTP_ERROR_INVALID_PARAMETER;
-       }
-
-       sttengine_s* engine = NULL;
-       engine = __get_engine(engine_id);
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
-               return STTP_ERROR_INVALID_PARAMETER;
+               return STTE_ERROR_INVALID_PARAMETER;
        }
 
+       int ret = STTE_ERROR_NONE;
        char* temp = NULL;
-       int ret = engine->pefuncs->get_private_data(key, &temp);
-       if (0 != ret) {
-               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to get private data(%d)", ret);
-               return ret;
+       if (NULL != g_get_private_data_cb) {
+               ret = g_get_private_data_cb(key, &temp);
+               if (0 != ret) {
+                       SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to get private data(%d)", ret);
+                       return ret;
+               }
+       } else {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] There's no private data function)");
        }
 
        if (NULL == temp)
@@ -395,26 +303,34 @@ int stt_engine_get_private_data(int engine_id, const char* key, char** data)
        else
                *data = strdup(temp);
 
-       return STTP_ERROR_NONE;
+       return STTE_ERROR_NONE;
 }
 
-int stt_engine_get_first_language(int engine_id, char** language)
+int stt_engine_get_first_language(char** language)
 {
        if (NULL == language) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
-               return STTP_ERROR_INVALID_PARAMETER;
+               return STTE_ERROR_INVALID_PARAMETER;
+       }
+
+       if (NULL == g_engine) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] No engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
-       sttengine_s* engine = NULL;
-       engine = __get_engine(engine_id);
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
-               return STTP_ERROR_INVALID_PARAMETER;
+       if (NULL == g_engine->callback) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+       if (NULL == g_engine->callback->foreach_langs || NULL == g_engine->callback->is_valid_lang) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
        GSList* lang_list = NULL;
        int ret;
-       ret = engine->pefuncs->foreach_langs(__supported_language_cb, &lang_list);
+       ret = g_engine->callback->foreach_langs(__supported_language_cb, &lang_list);
        if (0 != ret) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] get language list error : %s", __stt_get_engine_error_code(ret));
                return ret;
@@ -427,10 +343,12 @@ int stt_engine_get_first_language(int engine_id, char** language)
        if (NULL != iter) {
                data = iter->data;
 
-               if (true == engine->pefuncs->is_valid_lang(data)) {
+               bool is_valid = false;
+               ret = g_engine->callback->is_valid_lang(data, &is_valid);
+               if (0 == ret && true == is_valid) {
                        *language = strdup(data);
                } else {
-                       ret = STTP_ERROR_OPERATION_FAILED;
+                       ret = STTE_ERROR_OPERATION_FAILED;
                }
        }
 
@@ -454,92 +372,118 @@ int stt_engine_get_first_language(int engine_id, char** language)
        return ret;
 }
 
-int stt_engine_support_silence(int engine_id, bool* support)
+int stt_engine_support_silence(bool* support)
 {
        if (NULL == support) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
-               return STTP_ERROR_INVALID_PARAMETER;
+               return STTE_ERROR_INVALID_PARAMETER;
+       }
+
+       if (NULL == g_engine) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] No engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+       if (NULL == g_engine->callback) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
-       sttengine_s* engine = NULL;
-       engine = __get_engine(engine_id);
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
-               return STTP_ERROR_INVALID_PARAMETER;
+       if (NULL == g_engine->callback->support_silence) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
        bool result;
-       result = engine->pefuncs->support_silence();
+       result = g_engine->callback->support_silence();
        *support = result;
 
-       return 0;
+       return STTE_ERROR_NONE;
 }
 
-
-int stt_engine_need_app_credential(int engine_id, bool* need)
+int stt_engine_need_app_credential(bool* need)
 {
        if (NULL == need) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
-               return STTP_ERROR_INVALID_PARAMETER;
+               return STTE_ERROR_INVALID_PARAMETER;
        }
 
-       sttengine_s* engine = NULL;
-       engine = __get_engine(engine_id);
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
-               return STTP_ERROR_INVALID_PARAMETER;
+       if (NULL == g_engine) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] No engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
-       bool result;
-       if (NULL != engine->pefuncs->need_app_credential) {
-               result = engine->pefuncs->need_app_credential();
-               *need = result;
-               return STTP_ERROR_NONE;
+       if (NULL == g_engine->callback) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+       if (NULL == g_engine->callback->need_app_credential) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
-       return STTP_ERROR_OPERATION_FAILED;
+       bool result;
+       result = g_engine->callback->need_app_credential();
+       *need = result;
+
+       return STTE_ERROR_NONE;
 }
 
-int stt_engine_support_recognition_type(int engine_id, const char* type, bool* support)
+int stt_engine_support_recognition_type(const char* type, bool* support)
 {
        if (NULL == type || NULL == support) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
-               return STTP_ERROR_INVALID_PARAMETER;
+               return STTE_ERROR_INVALID_PARAMETER;
        }
 
-       sttengine_s* engine = NULL;
-       engine = __get_engine(engine_id);
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
-               return STTP_ERROR_INVALID_PARAMETER;
+       if (NULL == g_engine) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] No engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
-       bool result;
-       if (NULL != engine->pefuncs->support_recognition_type) {
-               result = engine->pefuncs->support_recognition_type(type);
-               *support = result;
-               return 0;
+       if (NULL == g_engine->callback) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+       if (NULL == g_engine->callback->support_recognition_type) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR} Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
-       return STTP_ERROR_OPERATION_FAILED;
+       int ret = STTE_ERROR_NONE;
+       ret = g_engine->callback->support_recognition_type(type, support);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to get supporting recognition type(%d)", ret);
+       }
+       return ret;
 }
 
-int stt_engine_get_audio_type(int engine_id, sttp_audio_type_e* types, int* rate, int* channels)
+int stt_engine_get_audio_type(stte_audio_type_e* types, int* rate, int* channels)
 {
        if (NULL == types || NULL == rate || NULL == channels) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
-               return STTP_ERROR_INVALID_PARAMETER;
+               return STTE_ERROR_INVALID_PARAMETER;
        }
 
-       sttengine_s* engine = NULL;
-       engine = __get_engine(engine_id);
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
-               return STTP_ERROR_INVALID_PARAMETER;
+       if (NULL == g_engine) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] No engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+       if (NULL == g_engine->callback) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+       if (NULL == g_engine->callback->get_audio_format) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
        int ret;
-       ret = engine->pefuncs->get_audio_format(types, rate, channels);
+       ret = g_engine->callback->get_audio_format(types, rate, channels);
        if (0 != ret) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to get audio format : %s", __stt_get_engine_error_code(ret));
        }
@@ -548,66 +492,89 @@ int stt_engine_get_audio_type(int engine_id, sttp_audio_type_e* types, int* rate
 }
 
 /* Set option */
-int stt_engine_set_silence_detection(int engine_id, bool value)
+int stt_engine_set_silence_detection(bool value)
 {
-       sttengine_s* engine = NULL;
-       engine = __get_engine(engine_id);
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
-               return STTP_ERROR_INVALID_PARAMETER;
+       if (NULL == g_engine) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] No engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+       if (NULL == g_engine->callback) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
-       int ret = engine->pefuncs->set_silence_detection(value);
-       if (STTP_ERROR_NOT_SUPPORTED_FEATURE == ret) {
+       if (NULL == g_engine->callback->set_silence_detection) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+       int ret = g_engine->callback->set_silence_detection(value);
+       if (STTE_ERROR_NOT_SUPPORTED_FEATURE == ret) {
                SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] Not support silence detection");
-               return STTP_ERROR_NOT_SUPPORTED_FEATURE;
        } else if (0 != ret) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to set silence detection : %d", ret);
        }
-
        return ret;
 }
 
-int stt_engine_check_app_agreed(int engine_id, const char* appid, bool* value)
+int stt_engine_check_app_agreed(const char* appid, bool* is_agreed)
 {
-       sttengine_s* engine = NULL;
-       engine = __get_engine(engine_id);
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
-               return STTP_ERROR_INVALID_PARAMETER;
+       if (NULL == is_agreed) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid parameter");
+               return STTE_ERROR_INVALID_PARAMETER;
        }
 
-       if (NULL == engine->pefuncs->check_app_agreed) {
+       if (NULL == g_engine) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] No engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+       if (NULL == g_engine->callback) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+       if (NULL == g_engine->callback->check_app_agreed) {
                SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] Not support app agreement. All app is available");
-               *value = true;
+               *is_agreed = true;
                return 0;
        }
 
-       int ret = engine->pefuncs->check_app_agreed(appid, value);
+       int ret = g_engine->callback->check_app_agreed(appid, is_agreed);
        if (0 != ret) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to get app agreement : %s", __stt_get_engine_error_code(ret));
-               *value = false;
+               *is_agreed = false;
        }
 
        return ret;
 }
 
 /* Recognition */
-int stt_engine_recognize_start(int engine_id, const char* lang, const char* recognition_type, const char* credential, void* user_param)
+int stt_engine_recognize_start(const char* lang, const char* recognition_type, const char* appid, const char* credential, void* user_param)
 {
        if (NULL == lang || NULL == recognition_type) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
-               return STTP_ERROR_INVALID_PARAMETER;
+               return STTE_ERROR_INVALID_PARAMETER;
+       }
+
+       if (NULL == g_engine) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] No engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+       if (NULL == g_engine->callback) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
-       sttengine_s* engine = NULL;
-       engine = __get_engine(engine_id);
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
-               return STTP_ERROR_INVALID_PARAMETER;
+       if (NULL == g_engine->callback->start) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
-       int ret = engine->pefuncs->start(lang, recognition_type, credential, user_param);
+       int ret = g_engine->callback->start(lang, recognition_type, appid, credential, user_param);
+
        if (0 != ret) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to start recognition : %s", __stt_get_engine_error_code(ret));
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to start recognition : lang(%s), recognition_type(%s), credential(%s)", lang, recognition_type, credential);
@@ -616,21 +583,29 @@ int stt_engine_recognize_start(int engine_id, const char* lang, const char* reco
        return ret;
 }
 
-int stt_engine_set_recording_data(int engine_id, const void* data, unsigned int length)
+int stt_engine_set_recording_data(const void* data, unsigned int length)
 {
        if (NULL == data) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
-               return STTP_ERROR_INVALID_PARAMETER;
+               return STTE_ERROR_INVALID_PARAMETER;
+       }
+
+       if (NULL == g_engine) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] No engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
-       sttengine_s* engine = NULL;
-       engine = __get_engine(engine_id);
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
-               return STTP_ERROR_INVALID_PARAMETER;
+       if (NULL == g_engine->callback) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
-       int ret = engine->pefuncs->set_recording(data, length);
+       if (NULL == g_engine->callback->set_recording) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+       int ret = g_engine->callback->set_recording(data, length);
        if (0 != ret) {
                SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] Fail to set recording : %s", __stt_get_engine_error_code(ret));
        }
@@ -638,16 +613,24 @@ int stt_engine_set_recording_data(int engine_id, const void* data, unsigned int
        return ret;
 }
 
-int stt_engine_recognize_stop(int engine_id)
+int stt_engine_recognize_stop()
 {
-       sttengine_s* engine = NULL;
-       engine = __get_engine(engine_id);
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
-               return STTP_ERROR_INVALID_PARAMETER;
+       if (NULL == g_engine) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] No engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+       if (NULL == g_engine->callback) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+       if (NULL == g_engine->callback->stop) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
-       int ret = engine->pefuncs->stop();
+       int ret = g_engine->callback->stop();
        if (0 != ret) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to stop : %s", __stt_get_engine_error_code(ret));
        }
@@ -655,16 +638,24 @@ int stt_engine_recognize_stop(int engine_id)
        return ret;
 }
 
-int stt_engine_recognize_cancel(int engine_id)
+int stt_engine_recognize_cancel()
 {
-       sttengine_s* engine = NULL;
-       engine = __get_engine(engine_id);
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
-               return STTP_ERROR_INVALID_PARAMETER;
+       if (NULL == g_engine) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] No engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
-       int ret = engine->pefuncs->cancel();
+       if (NULL == g_engine->callback) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+       if (NULL == g_engine->callback->cancel) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+       int ret = g_engine->callback->cancel();
        if (0 != ret) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to cancel : %s", __stt_get_engine_error_code(ret));
        }
@@ -672,16 +663,24 @@ int stt_engine_recognize_cancel(int engine_id)
        return ret;
 }
 
-int stt_engine_foreach_result_time(int engine_id, void* time_info, sttpe_result_time_cb callback, void* user_data)
+int stt_engine_foreach_result_time(void* time_info, stte_result_time_cb callback, void* user_data)
 {
-       sttengine_s* engine = NULL;
-       engine = __get_engine(engine_id);
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
-               return STTP_ERROR_INVALID_PARAMETER;
+       if (NULL == g_engine) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] No engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+       if (NULL == g_engine->callback) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
-       int ret = engine->pefuncs->foreach_result_time(time_info, callback, user_data);
+       if (NULL == g_engine->callback->foreach_result_time) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+       int ret = g_engine->callback->foreach_result_time(time_info, callback, user_data);
        if (0 != ret) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to foreach result time : %s", __stt_get_engine_error_code(ret));
        }
@@ -689,52 +688,139 @@ int stt_engine_foreach_result_time(int engine_id, void* time_info, sttpe_result_
        return ret;
 }
 
-int stt_engine_recognize_start_file(int engine_id, const char* lang, const char* recognition_type,
-                                    const char* filepath, sttp_audio_type_e audio_type, int sample_rate, void* user_param)
+int stt_engine_recognize_start_file(const char* lang, const char* recognition_type, 
+                                    const char* filepath, stte_audio_type_e audio_type, int sample_rate, void* user_param)
 {
        if (NULL == filepath || NULL == lang || NULL == recognition_type) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid Parameter");
-               return STTP_ERROR_INVALID_PARAMETER;
+               return STTE_ERROR_INVALID_PARAMETER;
        }
 
-       sttengine_s* engine = NULL;
-       engine = __get_engine(engine_id);
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
-               return STTP_ERROR_INVALID_PARAMETER;
+       if (NULL == g_engine) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] No engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
-       if (NULL == engine->pefuncs->start_file) {
+       if (NULL == g_engine->callback) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+#ifdef __UNUSED_CODES__
+       if (NULL == g_engine->callback->start_file) {
                SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine API is invalid");
-               return STTP_ERROR_NOT_SUPPORTED_FEATURE;
+               return STTE_ERROR_NOT_SUPPORTED_FEATURE;
        }
 
-       int ret = engine->pefuncs->start_file(lang, recognition_type, filepath, audio_type, sample_rate, user_param);
+       int ret = g_engine->callback->start_file(lang, recognition_type, filepath, audio_type, sample_rate, user_param);
        if (0 != ret) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to start file recognition : %s", __stt_get_engine_error_code(ret));
        }
-
-       return ret;
+#endif
+       return 0;
 }
 
-int stt_engine_recognize_cancel_file(int engine_id)
+int stt_engine_recognize_cancel_file()
 {
-       sttengine_s* engine = NULL;
-       engine = __get_engine(engine_id);
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine id(%d) is invalid", engine_id);
-               return STTP_ERROR_INVALID_PARAMETER;
+       if (NULL == g_engine) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] No engine");
+               return STTE_ERROR_OPERATION_FAILED;
+       }
+
+       if (NULL == g_engine->callback) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid engine");
+               return STTE_ERROR_OPERATION_FAILED;
        }
 
-       if (NULL == engine->pefuncs->cancel_file) {
+#ifdef __UNUSED_CODES__
+       if (NULL == g_engine->callback->cancel_file) {
                SLOG(LOG_WARN, stt_tag(), "[Engine WARNING] engine API is invalid");
-               return STTP_ERROR_NOT_SUPPORTED_FEATURE;
+               return STTE_ERROR_NOT_SUPPORTED_FEATURE;
        }
 
-       int ret = engine->pefuncs->cancel_file();
+       int ret = g_engine->callback->cancel_file();
        if (0 != ret) {
                SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to start file recognition : %s", __stt_get_engine_error_code(ret));
        }
+#endif
+       return 0;
+}
+
+int stt_engine_set_recognition_result_cb(stt_engine_result_cb result_cb, void* user_data)
+{
+       if (NULL == result_cb) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid parameter");
+               return STTE_ERROR_INVALID_PARAMETER;
+       }
+
+       g_result_cb = result_cb;
+
+       return 0;
+}
+
+int stt_engine_send_result(stte_result_event_e event, const char* type, const char** result, int result_count,
+                               const char* msg, void* time_info, void* user_data)
+{
+       if (NULL == type || NULL == result) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid parameter");
+       }
+
+       int ret = STTE_ERROR_NONE;
+       if (false == __stt_get_engine_from()) {
+               ret = sttd_engine_agent_send_result(event, type, result, result_count, msg, time_info, user_data);
+               if (0 != ret) {
+                       SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to send result");
+               }
+       } else {
+               g_result_cb(event, type, result, result_count, msg, time_info, user_data);
+       }
+       return ret;
+}
+
+int stt_engine_send_error(stte_error_e error, const char* msg)
+{
+       if (NULL == msg) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid parameter");
+       }
+
+       int ret = STTE_ERROR_NONE;
+       ret = sttd_engine_agent_send_error(error, msg);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to send error info");
+       }
+       return ret;
+}
 
+int stt_engine_send_speech_status(stte_speech_status_e status, void* user_data)
+{
+       int ret = STTE_ERROR_NONE;
+       ret = sttd_engine_agent_send_speech_status(status, user_data);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Fail to send speech status");
+       }
        return ret;
 }
+
+int stt_engine_set_private_data_set_cb(stte_private_data_set_cb private_data_set_cb, void* user_data)
+{
+       if (NULL == private_data_set_cb) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid parameter");
+               return STTE_ERROR_INVALID_PARAMETER;
+       }
+
+       g_set_private_data_cb = private_data_set_cb;
+
+       return 0;
+}
+
+int stt_engine_set_private_data_requested_cb(stte_private_data_requested_cb private_data_requested_cb, void* user_data)
+{
+       if (NULL == private_data_requested_cb) {
+               SLOG(LOG_ERROR, stt_tag(), "[Engine ERROR] Invalid parameter");
+               return STTE_ERROR_INVALID_PARAMETER;
+       }
+
+       g_get_private_data_cb = private_data_requested_cb;
+
+       return 0;
+}
index 8a333ff..d47f804 100644 (file)
 #define __STT_ENGINE_H_
 
 #include <glib.h>
-#include "sttp.h"
+#include "stte.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+
+typedef void (*stt_engine_result_cb)(stte_result_event_e event, const char* type, const char** data, int data_count,
+                               const char* msg, void* time_info, void* user_data);
+
 /*
 * STT Engine Interfaces
 */
 
 
 /* Register engine id */
-int stt_engine_load(int engine_id, const char* filepath);
+int stt_engine_load(const char* filepath, stte_request_callback_s *callback);
 
 /* Unregister engine id */
-int stt_engine_unload(int engine_id);
+int stt_engine_unload();
 
 
 /* Init / Deinit */
-int stt_engine_initialize(int engine_id, sttpe_result_cb result_cb, sttpe_silence_detected_cb silence_cb);
+int stt_engine_initialize(bool is_from_lib);
 
-int stt_engine_deinitialize(int engine_id);
+int stt_engine_deinitialize();
 
 /* Get option */
-int stt_engine_get_supported_langs(int engine_id, GSList** lang_list);
+int stt_engine_get_supported_langs(GSList** lang_list);
 
-int stt_engine_is_valid_language(int engine_id, const char* language, bool *is_valid);
+int stt_engine_is_valid_language(const char* language, bool *is_valid);
 
-int stt_engine_set_private_data(int engine_id, const char* key, const char* data);
+int stt_engine_set_private_data(const char* key, const char* data);
 
-int stt_engine_get_private_data(int engine_id, const char* key, char** data);
+int stt_engine_get_private_data(const char* key, char** data);
 
-int stt_engine_get_first_language(int engine_id, char** language);
+int stt_engine_get_first_language(char** language);
 
-int stt_engine_support_silence(int engine_id, bool* support);
+int stt_engine_support_silence(bool* support);
 
-int stt_engine_need_app_credential(int engine_id, bool* need);
+int stt_engine_need_app_credential(bool* need);
 
-int stt_engine_support_recognition_type(int engine_id, const char* type, bool* support);
+int stt_engine_support_recognition_type(const char* type, bool* support);
 
-int stt_engine_get_audio_type(int engine_id, sttp_audio_type_e* types, int* rate, int* channels);
+int stt_engine_get_audio_type(stte_audio_type_e* types, int* rate, int* channels);
 
 /* Set option */
-int stt_engine_set_silence_detection(int engine_id, bool value);
+int stt_engine_set_silence_detection(bool value);
 
 /* Get right */
-int stt_engine_check_app_agreed(int engine_id, const char* appid, bool* value);
+int stt_engine_check_app_agreed(const char* appid, bool* is_agreed);
 
 /* Recognition */
-int stt_engine_recognize_start(int engine_id, const char* lang, const char* recognition_type, const char* credential, void* user_param);
+int stt_engine_recognize_start(const char* lang, const char* recognition_type, const char* appid, const char* credential, void* user_param);
 
-int stt_engine_set_recording_data(int engine_id, const void* data, unsigned int length);
+int stt_engine_set_recording_data(const void* data, unsigned int length);
 
-int stt_engine_recognize_stop(int engine_id);
+int stt_engine_recognize_stop();
 
-int stt_engine_recognize_cancel(int engine_id);
+int stt_engine_recognize_cancel();
 
-int stt_engine_foreach_result_time(int engine_id, void* time_info, sttpe_result_time_cb callback, void* user_data);
+int stt_engine_foreach_result_time(void* time_info, stte_result_time_cb callback, void* user_data);
 
 
 /* File recognition */
-int stt_engine_recognize_start_file(int engine_id, const char* lang, const char* recognition_type,
-                               const char* filepath, sttp_audio_type_e audio_type, int sample_rate, void* user_param);
+int stt_engine_recognize_start_file(const char* lang, const char* recognition_type, 
+                               const char* filepath, stte_audio_type_e audio_type, int sample_rate, void* user_param);
+
+int stt_engine_recognize_cancel_file();
+
+int stt_engine_set_recognition_result_cb(stt_engine_result_cb result_cb, void* user_data);
+
+int stt_engine_send_result(stte_result_event_e event, const char* type, const char** result, int result_count,
+                               const char* msg, void* time_info, void* user_data);
+
+int stt_engine_send_error(stte_error_e error, const char* msg);
+
+int stt_engine_send_speech_status(stte_speech_status_e status, void* user_data);
+
+int stt_engine_set_private_data_set_cb(stte_private_data_set_cb private_data_set_cb, void* user_data);
 
-int stt_engine_recognize_cancel_file(int engine_id);
+int stt_engine_set_private_data_requested_cb(stte_private_data_requested_cb private_data_requested_cb, void* user_data);
 
 
 #ifdef __cplusplus
index e89d6f3..e58d761 100644 (file)
  * To use of STT, use the following steps:<br>
  * 1. Create a handle <br>
  * 2. Register callback functions for notifications <br>
- * 3. Prepare stt-daemon asynchronously <br>
+ * 3. Prepare stt-service asynchronously <br>
  * 4. Start recording for recognition <br>
  * 5. Stop recording <br>
  * 6. Get result after processing <br>
  * 7. Destroy a handle <br>
  *
  * The STT has a client-server for the service of multi-applications.
- * The STT daemon as a server always works in the background for the STT service.
- * If the daemon is not working, client library will invoke it and client will communicate with it.
- * The daemon has engines and the recorder so client does not have the recorder itself.
- * Only the client request commands to the daemon for the service.
+ * The STT service always works in the background as a server.
+ * If the service is not working, client library will invoke it and client will communicate with it.
+ * The service has engines and the recorder so client does not have the recorder itself.
+ * Only the client request commands to the STT service for using STT.
  *
  * @section CAPI_STT_MODULE_STATE_DIAGRAM State Diagram
  * The following diagram shows the life cycle and the states of the STT.
  * <tr>
  * <td>stt_prepare()</td>
  * <td>Created</td>
- * <td>This function works asynchronously. If daemon fork is failed, application gets the error callback.</td>
+ * <td>This function works asynchronously. If the STT service fork is failed, application gets the error callback.</td>
  * </tr>
  * <tr>
  * <td>stt_unprepare()</td>
diff --git a/doc/uix_stt_engine_main_doc.h b/doc/uix_stt_engine_main_doc.h
new file mode 100755 (executable)
index 0000000..9d91867
--- /dev/null
@@ -0,0 +1,180 @@
+/*
+ * Copyright (c) 2011-2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#ifndef __TIZEN_UIX_STT_ENGINE_DOC_H__
+#define __TIZEN_UIX_STT_ENGINE_DOC_H__
+
+/**
+ * @ingroup CAPI_UIX_FRAMEWORK
+ * @defgroup CAPI_UIX_STTE_MODULE STT Engine
+ * @brief The @ref CAPI_UIX_STTE_MODULE APIs provide functions to operate Speech-To-Text Engine.
+ *
+ *
+ * @section CAPI_UIX_STTE_MODULE_HEADER Required Header
+ *      \#include <stte.h>
+ *
+ *
+ * @section CAPI_UIX_STTE_MODULE_OVERVIEW Overview
+ * Speech-To-Text Engine (below STTE) is an engine for recording speech and resulting in texts of speech recognition.
+ * Using the @ref CAPI_UIX_STTE_MODULE APIs, STTE developers can provide STTE service users, who want to apply STTE, with functions necessary to operate the engine.
+ * According to the indispensability of STTE services, there are two ways to provide them to the users. <br>
+ *
+ * <b>A. Required STTE services</b> <br>
+ * These services are indispensable to operate STTE. Therefore, the STTE developers MUST implement callback functions corresponding to the required STTE services.
+ * The following is a list of the callback functions. <br>
+ *
+ * <table>
+ * <tr>
+ * <th>FUNCTION</th>
+ * <th>DESCRIPTION</th>
+ * </tr>
+ * <tr>
+ * <td>stte_get_info_cb()</td>
+ * <td>Called when the engine service user requests the basic information of STT engine.</td>
+ * </tr>
+ * <tr>
+ * <td>stte_initialize_cb()</td>
+ * <td>Called when the engine service user initializes STT engine.</td>
+ * </tr>
+ * <tr>
+ * <td>stte_deinitialize_cb()</td>
+ * <td>Called when the engine service user deinitializes STT engine.</td>
+ * </tr>
+ * <tr>
+ * <td>stte_is_valid_language_cb()</td>
+ * <td>Called when the engine service user checks whether the corresponding language is valid or not.</td>
+ * </tr>
+ * <tr>
+ * <td>stte_foreach_supported_langs_cb()</td>
+ * <td>Called when the engine service user gets the whole supported language list.</td>
+ * </tr>
+ * <tr>
+ * <td>stte_support_silence_detection_cb()</td>
+ * <td>Called when the engine service user checks whether STT engine supports silence detection.</td>
+ * </tr>
+ * <tr>
+ * <td>stte_set_silence_detection_cb()</td>
+ * <td>Called when the engine service user sets the silence detection.</td>
+ * </tr>
+ * <tr>
+ * <td>stte_support_recognition_type_cb()</td>
+ * <td>Called when the engine service user checks whether STT engine supports the corresponding recognition type.</td>
+ * </tr>
+ * <tr>
+ * <td>stte_get_recording_format_cb()</td>
+ * <td>Called when the engine service user gets the proper recording format of STT engine.</td>
+ * </tr>
+ * <tr>
+ * <td>stte_set_recording_data_cb()</td>
+ * <td>Called when the engine service user sets and sends the recording data for speech recognition.</td>
+ * </tr>
+ * <tr>
+ * <td>stte_foreach_result_time_cb()</td>
+ * <td>Called when the engine service user gets the result time information(stamp).</td>
+ * </tr>
+ * <tr>
+ * <td>stte_start_cb()</td>
+ * <td>Called when the engine service user starts to recognize the recording data.</td>
+ * </tr>
+ * <tr>
+ * <td>stte_stop_cb()</td>
+ * <td>Called when the engine service user stops to recognize the recording data.</td>
+ * </tr>
+ * <tr>
+ * <td>stte_cancel_cb()</td>
+ * <td>Called when the engine service user cancels to recognize the recording data.</td>
+ * </tr>
+ * <tr>
+ * <td>stte_check_app_agreed_cb()</td>
+ * <td>Called when the engine service user requests for STT engine to check whether the application agreed the usage of STT engine.</td>
+ * </tr>
+ * <tr>
+ * <td>stte_need_app_credential_cb()</td>
+ * <td>Called when the engine service user checks whether STT engine needs the application's credential.</td>
+ * </tr>
+ * </table>
+ *
+ * The STTE developers can register the above callback functions at a time with using a structure 'stte_request_callback_s' and an API 'stte_main()'.
+ * To operate STTE, the following steps should be used: <br>
+ * 1. Create a structure 'stte_request_callback_s'. <br>
+ * 2. Implement callback functions. (NOTE that the callback functions should return appropriate values in accordance with the instruction.
+ *     If the callback function returns an unstated value, STT framework will handle it as #STTE_ERROR_OPERATION_FAILED.)<br>
+ * 3. Register callback functions using 'stte_main()'. (The registered callback functions will be called when the STTE service users request the STTE services.) <br>
+ * 4. Use 'service_app_main()' for working STTE. <br>
+ *
+ * <b>B. Optional STTE services</b> <br>
+ * Unlike the required STTE services, these services are optional to operate STTE. The followings are optional STTE services. <br>
+ * - receive/provide the private data <br>
+ *
+ * If the STTE developers want to provide the above services, use the following APIs and implement the corresponding callback functions: <br>
+ * <table>
+ * <tr>
+ * <th>FUNCTION</th>
+ * <th>DESCRIPTION</th>
+ * <th>CORRESPONDING CALLBACK</th>
+ * </tr>
+ * <tr>
+ * <td>stte_set_private_data_set_cb()</td>
+ * <td>Sets a callback function for receiving the private data from the engine service user.</td>
+ * <td>stte_private_data_set_cb()</td>
+ * </tr>
+ * <tr>
+ * <td>stte_set_private_data_requested_cb()</td>
+ * <td>Sets a callback function for providing the private data to the engine service user.</td>
+ * <td>stte_private_data_requested_cb()</td>
+ * </tr>
+ * </table>
+ * <br>
+ *
+ * Using the above APIs, the STTE developers can register the optional callback functions respectively.
+ * (For normal operation, put those APIs before 'service_app_main()' starts.)
+ *
+ * Unlike callback functions, the following APIs are functions for getting and sending data. The STTE developers can use these APIs when they implement STTE services: <br>
+ * <table>
+ * <tr>
+ * <th>FUNCTION</th>
+ * <th>DESCRIPTION</th>
+ * </tr>
+ * <tr>
+ * <td>stte_send_result()</td>
+ * <td>Sends the recognition result to the engine service user.</td>
+ * </tr>
+ * <tr>
+ * <td>stte_send_error()</td>
+ * <td>Sends the error to the engine service user.</td>
+ * </tr>
+ * <tr>
+ * <td>stte_send_speech_status()</td>
+ * <td>Sends the speech status to the engine service user when STT engine notifies the change of the speech status.</td>
+ * </tr>
+ * </table>
+ *
+ *
+ * @section CAPI_UIX_STTE_MODULE_FEATURE Related Features
+ * This API is related with the following features:<br>
+ *  - http://tizen.org/feature/speech.recognition<br>
+ *  - http://tizen.org/feature/microphone<br>
+ *
+ * It is recommended to design feature related codes in your application for reliability.<br>
+ * You can check if a device supports the related features for this API by using @ref CAPI_SYSTEM_SYSTEM_INFO_MODULE, thereby controlling the procedure of your application.<br>
+ * To ensure your application is only running on the device with specific features, please define the features in your manifest file using the manifest editor in the SDK.<br>
+ * More details on featuring your application can be found from <a href="https://developer.tizen.org/development/tools/native-tools/manifest-text-editor#feature"><b>Feature Element</b>.</a>
+ *
+ */
+
+#endif /* __TIZEN_UIX_STT_ENGINE_DOC_H__ */
+
index aa165da..dfabff1 100644 (file)
@@ -12,4 +12,4 @@ INSTALL(FILES "${CMAKE_BINARY_DIR}/include/${PROJECT_NAME}-engine.pc" DESTINATIO
 INSTALL(FILES "${CMAKE_BINARY_DIR}/include/stt.h" DESTINATION ${INCLUDEDIR})
 INSTALL(FILES "${CMAKE_BINARY_DIR}/include/stt_file.h" DESTINATION ${INCLUDEDIR})
 INSTALL(FILES "${CMAKE_BINARY_DIR}/include/stt_setting.h" DESTINATION ${INCLUDEDIR})
-INSTALL(FILES "${CMAKE_BINARY_DIR}/server/sttp.h" DESTINATION ${INCLUDEDIR})
+INSTALL(FILES "${CMAKE_BINARY_DIR}/include/stte.h" DESTINATION ${INCLUDEDIR})
index 36f4cb2..667443f 100644 (file)
@@ -7,4 +7,5 @@ Name: lib@PROJECT_NAME@_engine
 Description: Speech To Text client engine header
 Requires: glib-2.0 dbus-1
 Version: @VERSION@
+Libs: -L${libdir} -l@PROJECT_NAME@_engine
 Cflags: -I${includedir}
index d111be0..03340c2 100755 (executable)
@@ -42,7 +42,7 @@ typedef enum {
        STT_ERROR_OUT_OF_MEMORY                 = TIZEN_ERROR_OUT_OF_MEMORY,    /**< Out of Memory */
        STT_ERROR_IO_ERROR                      = TIZEN_ERROR_IO_ERROR,         /**< I/O error */
        STT_ERROR_INVALID_PARAMETER             = TIZEN_ERROR_INVALID_PARAMETER,/**< Invalid parameter */
-       STT_ERROR_TIMED_OUT                     = TIZEN_ERROR_TIMED_OUT,        /**< No answer from the daemon */
+       STT_ERROR_TIMED_OUT                     = TIZEN_ERROR_TIMED_OUT,        /**< No answer from the STT service */
        STT_ERROR_RECORDER_BUSY                 = TIZEN_ERROR_RESOURCE_BUSY,    /**< Device or resource busy */
        STT_ERROR_OUT_OF_NETWORK                = TIZEN_ERROR_NETWORK_DOWN,     /**< Network is down */
        STT_ERROR_PERMISSION_DENIED             = TIZEN_ERROR_PERMISSION_DENIED,/**< Permission denied */
@@ -481,7 +481,7 @@ int stt_set_credential(stt_h stt, const char* credential);
  * @retval #STT_ERROR_INVALID_PARAMETER Invalid parameter
  * @retval #STT_ERROR_INVALID_STATE Invalid state
  * @retval #STT_ERROR_NOT_SUPPORTED STT NOT supported
- * @retval #STT_ERROR_TIMED_OUT No answer from the daemon
+ * @retval #STT_ERROR_TIMED_OUT No answer from the STT service
  *
  * @pre The state should be #STT_STATE_READY.
  *
@@ -509,7 +509,7 @@ int stt_set_private_data(stt_h stt, const char* key, const char* data);
  * @retval #STT_ERROR_INVALID_PARAMETER Invalid parameter
  * @retval #STT_ERROR_INVALID_STATE Invalid state
  * @retval #STT_ERROR_NOT_SUPPORTED STT NOT supported
- * @retval #STT_ERROR_TIMED_OUT No answer from the daemon
+ * @retval #STT_ERROR_TIMED_OUT No answer from the STT service
  *
  * @pre The state should be #STT_STATE_READY.
  *
@@ -518,7 +518,7 @@ int stt_set_private_data(stt_h stt, const char* key, const char* data);
 int stt_get_private_data(stt_h stt, const char* key, char** data);
 
 /**
- * @brief Connects the daemon asynchronously.
+ * @brief Connects the STT service asynchronously.
  * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  * @privlevel public
  * @privilege %http://tizen.org/privilege/recorder
@@ -541,7 +541,7 @@ int stt_get_private_data(stt_h stt, const char* key, char** data);
 int stt_prepare(stt_h stt);
 
 /**
- * @brief Disconnects the daemon.
+ * @brief Disconnects the STT service.
  * @since_tizen @if MOBILE 2.3 @elseif WEARABLE 2.3.1 @endif
  * @privlevel public
  * @privilege %http://tizen.org/privilege/recorder
@@ -788,7 +788,7 @@ int stt_unset_stop_sound(stt_h stt);
  * @privlevel public
  * @privilege %http://tizen.org/privilege/recorder
  *
- * @remarks This function starts recording in the daemon and sending recording data to engine. \n
+ * @remarks This function starts recording in the STT service and sending recording data to engine. \n
  * This work continues until stt_stop(), stt_cancel() or silence detected by engine.
  *
  * @param[in] stt The STT handle
index b2ffdf3..f274444 100644 (file)
@@ -38,7 +38,7 @@ typedef enum {
        STT_SETTING_ERROR_OUT_OF_MEMORY         = TIZEN_ERROR_OUT_OF_MEMORY,    /**< Out of Memory */
        STT_SETTING_ERROR_IO_ERROR              = TIZEN_ERROR_IO_ERROR,         /**< I/O error */
        STT_SETTING_ERROR_INVALID_PARAMETER     = TIZEN_ERROR_INVALID_PARAMETER,/**< Invalid parameter */
-       STT_SETTING_ERROR_TIMED_OUT             = TIZEN_ERROR_TIMED_OUT,        /**< No answer from the daemon */
+       STT_SETTING_ERROR_TIMED_OUT             = TIZEN_ERROR_TIMED_OUT,        /**< No answer from the service */
        STT_SETTING_ERROR_OUT_OF_NETWORK        = TIZEN_ERROR_NETWORK_DOWN,     /**< Out of network */
        STT_SETTING_ERROR_PERMISSION_DENIED     = TIZEN_ERROR_PERMISSION_DENIED,/**< Permission denied */
        STT_SETTING_ERROR_NOT_SUPPORTED         = TIZEN_ERROR_NOT_SUPPORTED,    /**< STT is NOT supported */
@@ -120,7 +120,7 @@ typedef void (*stt_setting_config_changed_cb)(void *user_data);
 *
 * @return 0 on success, otherwise a negative error value.
 * @retval #STT_SETTING_ERROR_NONE Success.
-* @retval #STT_SETTING_ERROR_TIMED_OUT stt daemon is blocked or stt daemon do not exist.
+* @retval #STT_SETTING_ERROR_TIMED_OUT stt service is blocked or stt service do not exist.
 * @retval #STT_SETTING_ERROR_INVALID_STATE STT setting has Already been initialized.
 * @retval #STT_SETTING_ERROR_ENGINE_NOT_FOUND No available stt-engine. Engine should be installed.
 * @retval #STT_SETTING_ERROR_NOT_SUPPORTED STT NOT supported
@@ -130,7 +130,7 @@ typedef void (*stt_setting_config_changed_cb)(void *user_data);
 int stt_setting_initialize(void);
 
 /**
-* @brief finalize stt setting and disconnect to stt-daemon.
+* @brief finalize stt setting and disconnect to stt-service.
 *
 * @return 0 on success, otherwise a negative error value.
 * @retval #STT_SETTING_ERROR_NONE Success.
diff --git a/include/stte.h b/include/stte.h
new file mode 100755 (executable)
index 0000000..0f448f3
--- /dev/null
@@ -0,0 +1,835 @@
+/*
+*  Copyright (c) 2011-2016 Samsung Electronics Co., Ltd All Rights Reserved
+*  Licensed under the Apache License, Version 2.0 (the "License");
+*  you may not use this file except in compliance with the License.
+*  You may obtain a copy of the License at
+*  http://www.apache.org/licenses/LICENSE-2.0
+*  Unless required by applicable law or agreed to in writing, software
+*  distributed under the License is distributed on an "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+*  See the License for the specific language governing permissions and
+*  limitations under the License.
+*/
+
+#ifndef __STT_ENGINE_MAIN_H__
+#define __STT_ENGINE_MAIN_H__
+
+#include <tizen.h>
+
+/**
+* @addtogroup CAPI_UIX_STTE_MODULE
+* @{
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+* @brief Enumerations for error codes.
+* @since_tizen 3.0
+*/
+typedef enum {
+       STTE_ERROR_NONE                         = TIZEN_ERROR_NONE,                     /**< Successful */
+       STTE_ERROR_OUT_OF_MEMORY                = TIZEN_ERROR_OUT_OF_MEMORY,            /**< Out of Memory */
+       STTE_ERROR_IO_ERROR                     = TIZEN_ERROR_IO_ERROR,                 /**< I/O error */
+       STTE_ERROR_INVALID_PARAMETER            = TIZEN_ERROR_INVALID_PARAMETER,        /**< Invalid parameter */
+       STTE_ERROR_NETWORK_DOWN                 = TIZEN_ERROR_NETWORK_DOWN,             /**< Network down(Out of network) */
+       STTE_ERROR_INVALID_STATE                = TIZEN_ERROR_STT | 0x01,               /**< Invalid state */
+       STTE_ERROR_INVALID_LANGUAGE             = TIZEN_ERROR_STT | 0x02,               /**< Invalid language */
+       STTE_ERROR_OPERATION_FAILED             = TIZEN_ERROR_STT | 0x04,               /**< Operation failed */
+       STTE_ERROR_NOT_SUPPORTED_FEATURE        = TIZEN_ERROR_STT | 0x05,               /**< Not supported feature */
+       STTE_ERROR_NOT_SUPPORTED                = TIZEN_ERROR_NOT_SUPPORTED,            /**< Not supported */
+       STTE_ERROR_PERMISSION_DENIED            = TIZEN_ERROR_PERMISSION_DENIED,        /**< Permission denied */
+       STTE_ERROR_RECORDING_TIMED_OUT          = TIZEN_ERROR_STT | 0x06                /**< Recording timed out */
+} stte_error_e;
+
+/**
+* @brief Enumerations for audio type.
+* @since_tizen 3.0
+*/
+typedef enum {
+       STTE_AUDIO_TYPE_PCM_S16_LE = 0,         /**< Signed 16bit audio type, Little endian */
+       STTE_AUDIO_TYPE_PCM_U8                  /**< Unsigned 8bit audio type */
+} stte_audio_type_e;
+
+/**
+* @brief Enumerations for callback event.
+* @since_tizen 3.0
+*/
+typedef enum {
+       STTE_RESULT_EVENT_FINAL_RESULT = 0,     /**< Event when either the full matched or the final result is delivered */
+       STTE_RESULT_EVENT_PARTIAL_RESULT,       /**< Event when the partial matched result is delivered */
+       STTE_RESULT_EVENT_ERROR                 /**< Event when the recognition has failed */
+} stte_result_event_e;
+
+/**
+* @brief Enumerations for result time callback event.
+* @since_tizen 3.0
+*/
+typedef enum {
+       STTE_RESULT_TIME_EVENT_BEGINNING = 0,   /**< Event when the token is beginning type */
+       STTE_RESULT_TIME_EVENT_MIDDLE,          /**< Event when the token is middle type */
+       STTE_RESULT_TIME_EVENT_END              /**< Event when the token is end type */
+} stte_result_time_event_e;
+
+/**
+* @brief Enumerations for speech status.
+* @since_tizen 3.0
+*/
+typedef enum {
+       STTE_SPEECH_STATUS_BEGINNING_POINT_DETECTED = 0,        /**< Beginning point of speech is detected */
+       STTE_SPEECH_STATUS_END_POINT_DETECTED           /**< End point of speech is detected */
+} stte_speech_status_e;
+
+/**
+* @brief Definition for free form dictation and default type.
+* @since_tizen 3.0
+*/
+#define STTE_RECOGNITION_TYPE_FREE             "stt.recognition.type.FREE"
+
+/**
+* @brief Definition for free form dictation continuously.
+* @since_tizen 3.0
+*/
+#define STTE_RECOGNITION_TYPE_FREE_PARTIAL     "stt.recognition.type.FREE.PARTIAL"
+
+/**
+* @brief Definition for None message.
+* @since_tizen 3.0
+*/
+#define STTE_RESULT_MESSAGE_NONE               "stt.result.message.none"
+
+/**
+* @brief Definition for failed recognition because the speech started too soon.
+* @since_tizen 3.0
+*/
+#define STTE_RESULT_MESSAGE_ERROR_TOO_SOON     "stt.result.message.error.too.soon"
+
+/**
+* @brief Definition for failed recognition because the speech started too short.
+* @since_tizen 3.0
+*/
+#define STTE_RESULT_MESSAGE_ERROR_TOO_SHORT    "stt.result.message.error.too.short"
+
+/**
+* @brief Definition for failed recognition because the speech started too long.
+* @since_tizen 3.0
+*/
+#define STTE_RESULT_MESSAGE_ERROR_TOO_LONG     "stt.result.message.error.too.long"
+
+/**
+* @brief Definition for failed recognition because the speech started too quiet to listen.
+* @since_tizen 3.0
+*/
+#define STTE_RESULT_MESSAGE_ERROR_TOO_QUIET    "stt.result.message.error.too.quiet"
+
+/**
+* @brief Definition for failed recognition because the speech started too loud to listen.
+* @since_tizen 3.0
+*/
+#define STTE_RESULT_MESSAGE_ERROR_TOO_LOUD     "stt.result.message.error.too.loud"
+
+/**
+* @brief Definition for failed recognition because the speech started too fast to listen.
+* @since_tizen 3.0
+*/
+#define STTE_RESULT_MESSAGE_ERROR_TOO_FAST     "stt.result.message.error.too.fast"
+
+
+/**
+* @brief Called when STT engine provides the time stamp of result to the engine service user.
+* @details This callback function is implemented by the engine service user. Therefore, the engine developer does NOT have to implement this callback function.
+* @since_tizen 3.0
+*
+* @remarks This callback function is called in stte_foreach_result_time_cb() for adding time information.
+*      @a user_data must be transferred from stte_foreach_result_time_cb().
+*
+* @param[in] index The result index
+* @param[in] event The token event
+* @param[in] text The result text
+* @param[in] start_time The time started speaking the result text
+* @param[in] end_time The time finished speaking the result text
+* @param[in] user_data The user data passed from stte_foreach_result_time_cb()
+*
+* @return @c true to continue with the next iteration of the loop \n @c false to break out of the loop
+*
+* @pre stte_send_result() should be called.
+*
+* @see stte_send_result()
+* @see stte_foreach_result_time_cb()
+*/
+typedef bool (*stte_result_time_cb)(int index, stte_result_time_event_e event, const char* text,
+                               long start_time, long end_time, void* user_data);
+
+
+/**
+* @brief Called when STT engine informs the engine service user about whole supported language list.
+* @details This callback function is implemented by the engine service user. Therefore, the engine developer does NOT have to implement this callback function.
+* @since_tizen 3.0
+*
+* @remarks This callback function is called in stte_foreach_supported_langs_cb() to inform the whole supported language list.
+*      @a user_data must be transferred from stte_foreach_supported_langs_cb().
+*
+* @param[in] language The language is specified as an ISO 3166 alpha-2 two letter country-code
+*      followed by ISO 639-1 for the two-letter language code \n
+*      For example, "ko_KR" for Korean, "en_US" for American English
+* @param[in] user_data The user data passed from stte_foreach_supported_langs_cb()
+*
+* @return @c true to continue with the next iteration of the loop \n @c false to break out of the loop
+*
+* @pre stte_foreach_supported_langs_cb() will invoke this callback function.
+*
+* @see stte_foreach_supported_langs_cb()
+*/
+typedef bool (*stte_supported_language_cb)(const char* language, void* user_data);
+
+/**
+* @brief Called when the engine service user initializes STT engine.
+* @details This callback function is called by the engine service user to request for STT engine to be started.
+* @since_tizen 3.0
+*
+* @remarks This callback function is mandatory and must be registered using stte_main().
+*
+* @return 0 on success, otherwise a negative error value
+* @retval #STTE_ERROR_NONE Successful
+* @retval #STTE_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #STTE_ERROR_INVALID_STATE Already initialized
+* @retval #STTE_ERROR_OPERATION_FAILED Operation failure
+*
+* @see stte_deinitialize_cb()
+*/
+typedef int (*stte_initialize_cb)(void);
+
+/**
+* @brief Called when the engine service user deinitializes STT engine
+* @details This callback function is called by the engine service user to request for STT engine to be deinitialized.
+* @since_tizen 3.0
+*
+* @remarks This callback function is mandatory and must be registered using stte_main().
+*      NOTE that the engine may be terminated automatically.
+*      When this callback function is invoked, the release of resources is necessary.
+*
+* @return 0 on success, otherwise a negative error value
+* @retval #STTE_ERROR_NONE Successful
+* @retval #STTE_ERROR_INVALID_STATE Not initialized
+*
+* @see stte_initialize_cb()
+*/
+typedef int (*stte_deinitialize_cb)(void);
+
+/**
+* @brief Called when the engine service user gets the whole supported language list.
+* @since_tizen 3.0
+*
+* @remarks This callback function is mandatory and must be registered using stte_main().
+*      In this function, the engine service user's callback function 'stte_supported_language_cb()' is invoked repeatedly for getting all supported languages, and @a user_data must be transferred to 'stte_supported_language_cb()'.
+*      If 'stte_supported_language_cb()' returns @c false, it should be stopped to call 'stte_supported_language_cb()'.
+*
+* @param[in] callback The callback function
+* @param[in] user_data The user data which must be passed to the callback function 'stte_supported_language_cb()'
+*
+* @return 0 on success, otherwise a negative error value
+* @retval #STTE_ERROR_NONE Successful
+* @retval #STTE_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #STTE_ERROR_INVALID_STATE Not initialized
+*
+* @post        This callback function invokes stte_supported_language_cb() repeatedly for getting supported languages.
+*
+* @see stte_supported_language_cb()
+*/
+typedef int (*stte_foreach_supported_langs_cb)(stte_supported_language_cb callback, void* user_data);
+
+/**
+* @brief Called when the engine service user checks whether the corresponding language is valid or not in STT engine.
+* @since_tizen 3.0
+*
+* @remarks This callback function is mandatory and must be registered using stte_main().
+*
+* @param[in] language The language is specified as an ISO 3166 alpha-2 two letter country-code
+*      followed by ISO 639-1 for the two-letter language code \n
+*      For example, "ko_KR" for Korean, "en_US" for American English
+* @param[out] is_valid A variable for checking whether the corresponding language is valid or not. \n @c true to be valid, @c false to be invalid.
+*
+* @return 0 on success, otherwise a negative error value
+* @retval #STTE_ERROR_NONE Successful
+* @retval #STTE_ERROR_INVALID_PARAMETER Invalid parameter
+*
+* @see stte_foreach_supported_languages_cb()
+*/
+typedef int (*stte_is_valid_language_cb)(const char* language, bool* is_valid);
+
+/**
+* @brief Called when the engine service user checks whether STT engine supports silence detection.
+* @since_tizen 3.0
+*
+* @remarks This callback function is mandatory and must be registered using stte_main().
+*
+* @return @c true to support silence detection, @c false not to support silence detection
+*
+* @see stte_set_silence_detection_cb()
+*/
+typedef bool (*stte_support_silence_detection_cb)(void);
+
+/**
+* @brief Called when the engine service user checks whether STT engine supports the corresponding recognition type.
+* @since_tizen 3.0
+*
+* @remarks This callback function is mandatory and must be registered using stte_main().
+*
+* @param[in] type The type for recognition (e.g. #STTE_RECOGNITION_TYPE_FREE)
+* @param[out] is_supported A variable for checking whether STT engine supports the corresponding recognition type. \n @c true to support recognition type, @c false not to support recognition type.
+*
+* @return 0 on success, otherwise a negative error value
+* @retval #STTE_ERROR_NONE Successful
+* @retval #STTE_ERROR_INVALID_PARAMETER Invalid parameter
+*
+*/
+typedef int (*stte_support_recognition_type_cb)(const char* type, bool* is_supported);
+
+/**
+* @brief Called when the engine service user gets the proper recording format of STT engine.
+* @since_tizen 3.0
+*
+* @remarks This callback function is mandatory and must be registered using stte_main().
+*      The recording format is used for creating the recorder.
+*
+* @param[out] types The format used by the recorder.
+* @param[out] rate The sample rate used by the recorder.
+* @param[out] channels The number of channels used by the recorder.
+*
+* @return 0 on success, otherwise a negative error value
+* @retval #STTE_ERROR_NONE Successful
+* @retval #STTE_ERROR_INVALID_STATE Not initialized
+*/
+typedef int (*stte_get_recording_format_cb)(stte_audio_type_e* types, int* rate, int* channels);
+
+/**
+* @brief Called when the engine service user sets the silence detection.
+* @since_tizen 3.0
+*
+* @remarks This callback function is mandatory and must be registered using stte_main().
+*      If the engine service user sets this option as 'TRUE', STT engine will detect the silence (EPD) and send the callback event about it.
+*
+* @param[in] is_set A variable for setting the silence detection. \n @c true to detect the silence, @c false not to detect the silence.
+*
+* @return 0 on success, otherwise a negative error value
+* @retval #STTE_ERROR_NONE Successful
+* @retval #STTE_ERROR_INVALID_STATE Not initialized
+* @retval #STTE_ERROR_NOT_SUPPORTED_FEATURE Not supported feature
+*/
+typedef int (*stte_set_silence_detection_cb)(bool is_set);
+
+/**
+* @brief Called when the engine service user requests for STT engine to check whether the application agreed the usage of STT engine.
+* @details This callback function is called when the engine service user requests for STT engine to check the application's agreement about using the engine.
+*      According to the need, the engine developer can provide some user interfaces to check the agreement.
+* @since_tizen 3.0
+*
+* @remarks This callback function is mandatory and must be registered using stte_main().
+*      If the STT engine developer wants not to check the agreement, the developer has need to return proper values as @a is_agreed in accordance with the intention. \n @c true if the developer regards that every application agreed the usage of the engine, @c false if the developer regards that every application disagreed.
+*      NOTE that, however, there may be any legal issue unless the developer checks the agreement. Therefore, we suggest that the engine developers should provide a function to check the agreement.
+*
+* @param[in] appid The Application ID
+* @param[out] is_agreed A variable for checking whether the application agreed to use STT engine or not. \n @c true to agree, @c false to disagree.
+*
+* @return 0 on success, otherwise a negative error value
+* @retval #STTE_ERROR_NONE Successful
+* @retval #STTE_ERROR_INVALID_STATE Not initialized
+* @retval #STTE_ERROR_NOT_SUPPORTED_FEATURE Not supported feature
+*/
+typedef int (*stte_check_app_agreed_cb)(const char* appid, bool* is_agreed);
+
+/**
+* @brief Called when the engine service user checks whether STT engine needs the application's credential.
+* @since_tizen 3.0
+*
+* @remarks This callback function is mandatory and must be registered using stte_main().
+*
+* @return @c true if STT engine needs the application's credential, otherwise @c false
+*/
+typedef bool (*stte_need_app_credential_cb)(void);
+
+/**
+* @brief Called when the engine service user gets the result time information(stamp).
+* @since_tizen 3.0
+*
+* @remarks This callback function is mandatory and must be registered using stte_main().
+*      In this function, the engine service user's callback function 'stte_result_time_cb()' is invoked repeatedly for sending the time information to the engine service user, and @a user_data must be transferred to 'stte_result_time_cb()'.
+*      If 'stte_result_time_cb()' returns @c false, it should be stopped to call 'stte_result_time_cb()'.
+*      @a time_info is transferred from stte_send_result(). The type of @a time_info is up to the STT engine developer.
+*
+* @param[in] time_info The time information
+* @param[in] callback The callback function
+* @param[in] user_data The user data which must be passed to the callback function 'stte_result_time_cb()'
+*
+* @return 0 on success, otherwise a negative error value
+* @retval #STTE_ERROR_NONE Successful
+* @retval #STTE_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #STTE_ERROR_INVALID_STATE Not initialized
+*
+* @pre stte_send_result() will invoke this function.
+* @post        This function invokes stte_result_time_cb() repeatedly for getting result time information.
+*
+* @see stte_result_time_cb()
+*/
+typedef int (*stte_foreach_result_time_cb)(void* time_info, stte_result_time_cb callback, void* user_data);
+
+/**
+* @brief Called when the engine service user starts to recognize the recording data.
+* @since_tizen 3.0
+*
+* @remarks This callback function is mandatory and must be registered using stte_main().
+*      In this callback function, STT engine must transfer the recognition result and @a user_data to the engine service user using stte_send_result().
+*      Also, if STT engine needs the application's credential, it sets the credential granted to the application.
+*
+* @param[in] language The language is specified as an ISO 3166 alpha-2 two letter country-code
+*      followed by ISO 639-1 for the two-letter language code \n
+*      For example, "ko_KR" for Korean, "en_US" for American English
+* @param[in] type The recognition type. (e.g. #STTE_RECOGNITION_TYPE_FREE)
+* @param[in] appid The Application ID
+* @param[in] credential The credential granted to the application
+* @param[in] user_data The user data to be passed to the callback function.
+*
+* @return 0 on success, otherwise a negative error value
+* @retval #STTE_ERROR_NONE Successful
+* @retval #STTE_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #STTE_ERROR_INVALID_STATE Invalid state
+* @retval #STTE_ERROR_INVALID_LANGUAGE Invalid language
+* @retval #STTE_ERROR_OPERATION_FAILED Operation failure
+* @retval #STTE_ERROR_NETWORK_DOWN Out of network
+*
+* @pre The engine is not in recognition processing.
+*
+* @see stte_set_recording_data_cb()
+* @see stte_stop_cb()
+* @see stte_cancel_cb()
+* @see stte_need_app_credential_cb()
+*/
+typedef int (*stte_start_cb)(const char* language, const char* type, const char* appid, const char* credential, void *user_data);
+
+/**
+* @brief Called when the engine service user sets and sends the recording data for speech recognition.
+* @details This callback function is called by the engine service user to send the recording data to STT engine.
+*      The engine receives the recording data and uses for speech recognition.
+* @since_tizen 3.0
+*
+* @remarks This callback function is mandatory and must be registered using stte_main().
+*      Also, this function should be returned immediately after recording data copy.
+*
+* @param[in] data The recording data
+* @param[in] length The length of recording data
+*
+* @return 0 on success, otherwise a negative error value
+* @retval #STTE_ERROR_NONE Successful
+* @retval #STTE_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #STTE_ERROR_INVALID_STATE Invalid state
+* @retval #STTE_ERROR_OPERATION_FAILED Operation failure
+*
+* @pre stte_start_cb() should succeed.
+* @post If the engine supports partial result, stte_send_result() should be invoked.
+*
+* @see stte_start_cb()
+* @see stte_cancel_cb()
+* @see stte_stop_cb()
+*/
+typedef int (*stte_set_recording_data_cb)(const void* data, unsigned int length);
+
+/**
+* @brief Called when the engine service user stops to recognize the recording data.
+* @details This callback function is called by the engine service user to stop recording and to get the recognition result.
+* @since_tizen 3.0
+*
+* @remarks This callback function is mandatory and must be registered using stte_main().
+*
+* @return 0 on success, otherwise a negative error value
+* @retval #STTE_ERROR_NONE Successful
+* @retval #STTE_ERROR_INVALID_STATE Invalid state
+* @retval #STTE_ERROR_OPERATION_FAILED Operation failure
+* @retval #STTE_ERROR_NETWORK_DOWN Out of network
+*
+* @pre stte_start_cb() should succeed.
+* @post After processing of the engine, stte_send_result() must be called.
+*
+* @see stte_start_cb()
+* @see stte_set_recording_data_cb()
+* @see stte_cancel_cb()
+* @see stte_send_result()
+*/
+typedef int (*stte_stop_cb)(void);
+
+/**
+* @brief Called when the engine service user cancels to recognize the recording data.
+* @details This callback function is called by the engine service user to cancel to recognize the recording data.
+*      Also, when starting the recorder is failed, this function is called.
+* @since_tizen 3.0
+*
+* @remarks This callback function is mandatory and must be registered using stte_main().
+*
+* @return 0 on success, otherwise a negative error value.
+* @retval #STTE_ERROR_NONE Successful.
+* @retval #STTE_ERROR_INVALID_STATE Invalid state.
+*
+* @pre STT engine is in recognition processing or recording.
+*
+* @see stte_start_cb()
+* @see stte_stop_cb()
+*/
+typedef int (*stte_cancel_cb)(void);
+
+/**
+* @brief Called when the engine service user requests the basic information of STT engine.
+* @since_tizen 3.0
+*
+* @remarks This callback function is mandatory and must be registered using stte_main().
+*      The allocated @a engine_uuid, @a engine_name, and @a engine_setting will be released internally.
+*      In order to upload the engine at Tizen Appstore, both a service app and a ui app are necessary.
+*      Therefore, @a engine_setting must be transferred to the engine service user.
+*
+* @param[out] engine_uuid UUID of engine
+* @param[out] engine_name Name of engine
+* @param[out] engine_setting The engine setting application(ui app)'s app id
+* @param[out] use_network A variable for checking whether the network is used or not
+*
+* @return 0 on success, otherwise a negative error code on failure
+* @retval #STTE_ERROR_NONE Successful
+* @retval #STTE_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #STTE_ERROR_OPERATION_FAILED Operation failure
+*
+*/
+typedef int (*stte_get_info_cb)(char** engine_uuid, char** engine_name, char** engine_setting, bool* use_network);
+
+/**
+* @brief Called when STT engine receives the private data from the engine service user.
+* @details This callback function is called when the engine service user sends the private data to STT engine.
+* @since_tizen 3.0
+*
+* @remarks This callback function is optional and is registered using stte_set_private_data_set_cb().
+*
+* @param[in] key The key field of private data.
+* @param[in] data The data field of private data.
+*
+* @return 0 on success, otherwise a negative error value
+* @retval #STTE_ERROR_NONE Successful
+* @retval #STTE_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #STTE_ERROR_OPERATION_FAILED Operation failure
+*
+* @see stte_private_data_requested_cb()
+* @see stte_set_private_data_set_cb()
+*/
+typedef int (*stte_private_data_set_cb)(const char* key, const char* data);
+
+/**
+* @brief Called when STT engine provides the engine service user with the private data.
+* @details This callback function is called when the engine service user gets the private data from STT engine.
+* @since_tizen 3.0
+*
+* @remarks This callback function is optional and is registered using stte_set_private_data_requested_cb().
+*
+* @param[out] key The key field of private data.
+* @param[out] data The data field of private data.
+*
+* @return 0 on success, otherwise a negative error value
+* @retval #STTE_ERROR_NONE Successful
+* @retval #STTE_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #STTE_ERROR_OPERATION_FAILED Operation failure
+*
+* @see stte_private_data_set_cb()
+* @see stte_set_private_data_requested_cb()
+*/
+typedef int (*stte_private_data_requested_cb)(const char* key, char** data);
+
+/**
+* @brief A structure for the STT engine functions.
+* @details This structure contains essential callback functions for operating STT engine.
+* @since_tizen 3.0
+*
+* @remarks These functions are mandatory for operating STT engine. Therefore, all functions MUST be implemented.
+*/
+typedef struct {
+       int version;                                                            /**< The version of the structure 'stte_request_callback_s' */
+       stte_get_info_cb                        get_info;                       /**< Called when the engine service user requests the basic information of STT engine */
+
+       stte_initialize_cb                      initialize;                     /**< Called when the engine service user initializes STT engine */
+       stte_deinitialize_cb                    deinitialize;                   /**< Called when the engine service user deinitializes STT engine */
+
+       stte_foreach_supported_langs_cb         foreach_langs;                  /**< Called when the engine service user gets the whole supported language list */
+       stte_is_valid_language_cb               is_valid_lang;                  /**< Called when the engine service user checks whether the corresponding language is valid or not*/
+       stte_support_silence_detection_cb       support_silence;                /**< Called when the engine service user checks whether STT engine supports silence detection*/
+       stte_support_recognition_type_cb        support_recognition_type;       /**< Called when the engine service user checks whether STT engine supports the corresponding recognition type */
+       stte_get_recording_format_cb            get_audio_format;               /**< Called when the engine service user gets the proper recording format of STT engine */
+       stte_foreach_result_time_cb             foreach_result_time;            /**< Called when the engine service user gets the result time information(stamp) */
+
+       stte_set_silence_detection_cb           set_silence_detection;          /**< Called when the engine service user sets the silence detection */
+
+       stte_start_cb                           start;                          /**< Called when the engine service user starts to recognize the recording data */
+       stte_set_recording_data_cb              set_recording;                  /**< Called when the engine service user sets and sends the recording data for speech recognition */
+       stte_stop_cb                            stop;                           /**< Called when the engine service user stops to recognize the recording data */
+       stte_cancel_cb                          cancel;                         /**< Called when the engine service user cancels to recognize the recording data */
+
+       stte_check_app_agreed_cb                check_app_agreed;               /**< Called when the engine service user requests for STT engine to check whether the application agreed the usage of STT engine */
+       stte_need_app_credential_cb             need_app_credential;            /**< Called when the engine service user checks whether STT engine needs the application's credential */
+} stte_request_callback_s;
+
+/**
+* @brief Main function for Speech-To-Text (STT) engine.
+* @details This function is the main function for operating STT engine.
+* @since_tizen 3.0
+*
+* @privlevel public
+* @privilege %http://tizen.org/privilege/recorder
+*
+* @remarks The service_app_main() should be used for working the engine after this function.
+*
+* @param[in] argc The argument count(original)
+* @param[in] argv The argument(original)
+* @param[in] callback The structure of engine request callback function
+*
+* @return This function returns zero on success, or negative with error code on failure
+* @retval #STTE_ERROR_NONE Successful
+* @retval #STTE_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #STTE_ERROR_PERMISSION_DENIED        Permission denied
+* @retval #STTE_ERROR_NOT_SUPPORTED Not supported
+* @retval #STTE_ERROR_OPERATION_FAILED Operation failure
+*
+* @see stte_request_callback_s
+*
+* @code
+#include <stte.h>
+
+// Required callback functions - MUST BE IMPLEMENTED
+static int sttengine_get_info_cb(char** engine_uuid, char** engine_name, char** engine_setting, bool* use_network);
+static int sttengine_initialize_cb(void);
+static int sttengine_deinitialize_cb(void);
+static int sttengine_is_valid_language_cb(const char* language, bool* is_valid);
+static int sttengine_foreach_supported_langs_cb(stte_supported_language_cb callback, void* user_data);
+static bool sttengine_support_silence_detection_cb(void);
+static int sttengine_set_silence_detection_cb(bool is_set);
+static int sttengine_support_recognition_type_cb(const char* type, bool* is_supported);
+static int sttengine_get_recording_format_cb(stte_audio_type_e* types, int* rate, int* channels);
+static int sttengine_set_recording_data_cb(const void* data, unsigned int length);
+static int sttengine_foreach_result_time_cb(void* time_info, stte_result_time_cb callback, void* user_data);
+static int sttengine_start_cb(const char* language, const char* type, const char* appid, const char* credential, void *user_data);
+static int sttengine_stop_cb(void);
+static int sttengine_cancel_cb(void);
+static int sttengine_check_app_agreed_cb(const char* appid, bool* is_agreed);
+static bool sttengine_need_app_credential_cb(void);
+
+// Optional callback function
+static int sttengine_private_data_set_cb(const char* key, const char* data);
+
+int main(int argc, char* argv[])
+{
+       // 1. Create a structure 'stte_request_callback_s'
+       stte_request_callback_s engine_callback = { 0, };
+
+       engine_callback.size = sizeof(stte_request_callback_s);
+       engine_callback.version = 1;
+       engine_callback.get_info = sttengine_get_info_cb;
+
+       engine_callback.initialize = sttengine_initialize_cb;
+       engine_callback.deinitialize = sttengine_deinitialize_cb;
+
+       engine_callback.foreach_langs = sttengine_foreach_supported_langs_cb;
+       engine_callback.is_valid_lang = sttengine_is_valid_language_cb;
+       engine_callback.support_silence = sttengine_support_silence_detection_cb;
+       engine_callback.support_recognition_type = sttengine_support_recognition_type_cb;
+
+       engine_callback.get_audio_format = sttengine_get_recording_format_cb;
+       engine_callback.foreach_result_time = sttengine_foreach_result_time_cb;
+
+       engine_callback.set_silence_detection = sttengine_set_silence_detection_cb;
+
+       engine_callback.start = sttengine_start_cb;
+       engine_callback.set_recording = sttengine_set_recording_data_cb;
+       engine_callback.stop = sttengine_stop_cb;
+       engine_callback.cancel = sttengine_cancel_cb;
+
+       engine_callback.check_app_agreed = sttengine_check_app_agreed_cb;
+       engine_callback.need_app_credential = sttengine_need_app_credential_cb;
+
+       // 2. Run 'stte_main()'
+       if (0 != stte_main(argc, argv, &engine_callback)) {
+               return -1;
+       }
+
+       // Optional
+       stte_set_private_data_set_cb(sttengine_private_data_set_cb);
+
+       // 3. Set event callbacks for service app and Run 'service_app_main()'
+       char ad[50] = { 0, };
+
+       service_app_lifecycle_callback_s event_callback;
+       app_event_handler_h handlers[5] = { NULL, };
+
+       event_callback.create = service_app_create;
+       event_callback.terminate = service_app_terminate;
+       event_callback.app_control = service_app_control;
+
+       service_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, service_app_low_battery, &ad);
+       service_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, service_app_low_memory, &ad);
+       service_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, service_app_lang_changed, &ad);
+       service_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, service_app_region_changed, &ad);
+
+       return service_app_main(argc, argv, &event_callback, ad);
+}
+
+* @endcode
+*/
+int stte_main(int argc, char** argv, stte_request_callback_s *callback);
+
+
+/**
+* @brief Sends the recognition result to the engine service user.
+* @since_tizen 3.0
+*
+* @remarks This API is used in stte_set_recording_data_cb() and stte_stop_cb(), when STT engine sends the recognition result to the engine service user.
+*      This function is called in the following situations; 1) after stte_stop_cb() is called, 2) the end point of speech is detected from recording, or 3) partial result is occurred.
+*      The recognition result and @a user_data must be transferred to the engine service user through this function.
+*      Also, @a time_info must be transferred to stte_foreach_result_time_cb(). The type of @a time_info is up to the STT engine developer.
+*
+* @param[in] event The result event
+* @param[in] type The recognition type (e.g. #STTE_RECOGNITION_TYPE_FREE, #STTE_RECOGNITION_TYPE_FREE_PARTIAL)
+* @param[in] result Result texts
+* @param[in] result_count Result text count
+* @param[in] msg Engine message (e.g. #STTE_RESULT_MESSAGE_NONE, #STTE_RESULT_MESSAGE_ERROR_TOO_SHORT)
+* @param[in] time_info The time information
+* @param[in] user_data The user data passed from stte_start_cb()
+*
+* @return 0 on success, otherwise a negative error value
+* @retval #STTE_ERROR_NONE Successful
+* @retval #STTE_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #STTE_ERROR_PERMISSION_DENIED        Permission denied
+* @retval #STTE_ERROR_NOT_SUPPORTED Not supported
+* @retval #STTE_ERROR_OPERATION_FAILED Operation failure
+*
+* @pre The stte_main() function should be invoked before this function is called.
+*      stte_stop_cb() will invoke this function.
+* @post This function invokes stte_foreach_result_time_cb().
+*
+* @see stte_start_cb()
+* @see stte_set_recording_data_cb()
+* @see stte_stop_cb()
+* @see stte_foreach_result_time_cb()
+*/
+int stte_send_result(stte_result_event_e event, const char* type, const char** result, int result_count,
+                               const char* msg, void* time_info, void* user_data);
+
+
+/**
+* @brief Sends the error to the engine service user.
+* @details The following error codes can be delivered.\n
+*      #STTE_ERROR_NONE,\n
+*      #STTE_ERROR_OUT_OF_MEMORY,\n
+*      #STTE_ERROR_IO_ERROR,\n
+*      #STTE_ERROR_INVALID_PARAMETER,\n
+*      #STTE_ERROR_NETWORK_DOWN,\n
+*      #STTE_ERROR_INVALID_STATE,\n
+*      #STTE_ERROR_INVALID_LANGUAGE,\n
+*      #STTE_ERROR_OPERATION_FAILED,\n
+*      #STTE_ERROR_NOT_SUPPORTED_FEATURE,\n
+*      #STTE_ERROR_NOT_SUPPORTED,\n
+*      #STTE_ERROR_PERMISSION_DENIED,\n
+*      #STTE_ERROR_RECORDING_TIMED_OUT.\n
+*
+* @since_tizen 3.0
+*
+* @param[in] error The error reason
+* @param[in] msg The error message
+*
+* @return 0 on success, otherwise a negative error value
+* @retval #STTE_ERROR_NONE Successful
+* @retval #STTE_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #STTE_ERROR_PERMISSION_DENIED        Permission denied
+* @retval #STTE_ERROR_NOT_SUPPORTED Not supported
+* @retval #STTE_ERROR_OPERATION_FAILED Operation failure
+*
+* @pre The stte_main() function should be invoked before this function is called.
+*/
+int stte_send_error(stte_error_e error, const char* msg);
+
+/**
+* @brief Sends the speech status to the engine service user when STT engine notifies the change of the speech status.
+* @since_tizen 3.0
+*
+* @remarks This API is invoked when STT engine wants to notify the change of the speech status anytime.
+*      NOTE that this API can be invoked for recognizing the speech.
+*
+* @param[in] status The status of speech (e.g. STTE_SPEECH_STATUS_START_POINT_DETECTED or STTE_SPEECH_STATUS_END_POINT_DETECTED)
+* @param[in] user_data The user data passed from the start function.
+*
+* @return 0 on success, otherwise a negative error value
+* @retval #STTE_ERROR_NONE Successful
+* @retval #STTE_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #STTE_ERROR_PERMISSION_DENIED        Permission denied
+* @retval #STTE_ERROR_NOT_SUPPORTED Not supported
+* @retval #STTE_ERROR_OPERATION_FAILED Operation failure
+*
+* @pre The stte_main() function should be invoked before this function is called.
+*      stte_start_cb() and stte_set_recording_data_cb() will invoke this function.
+*
+* @see stte_start_cb()
+* @see stte_set_recording_data_cb()
+*/
+int stte_send_speech_status(stte_speech_status_e status, void* user_data);
+
+
+/**
+* @brief Sets a callback function for setting the private data.
+* @since_tizen 3.0
+*
+* @privlevel public
+* @privilege %http://tizen.org/privilege/recorder
+*
+* @remarks The stte_private_data_set_cb() function is called when the engine service user sends the private data.
+*
+* @param[in] callback_func stte_private_data_set event callback function
+*
+* @return 0 on success, otherwise a negative error value
+* @retval #STTE_ERROR_NONE Successful
+* @retval #STTE_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #STTE_ERROR_PERMISSION_DENIED        Permission denied
+* @retval #STTE_ERROR_NOT_SUPPORTED Not supported
+* @retval #STTE_ERROR_OPERATION_FAILED Operation failure
+*
+* @pre The stte_main() function should be invoked before this function is called.
+*
+* @see stte_private_data_set_cb()
+*/
+int stte_set_private_data_set_cb(stte_private_data_set_cb callback_func);
+
+/**
+* @brief Sets a callback function for requesting the private data.
+* @since_tizen 3.0
+*
+* @privlevel public
+* @privilege %http://tizen.org/privilege/recorder
+*
+* @remarks The stte_private_data_requested_cb() function is called when the engine service user gets the private data from STT engine.
+*
+* @param[in] callback_func stte_private_data_requested event callback function
+*
+* @return 0 on success, otherwise a negative error value
+* @retval #STTE_ERROR_NONE Successful
+* @retval #STTE_ERROR_INVALID_PARAMETER Invalid parameter
+* @retval #STTE_ERROR_PERMISSION_DENIED        Permission denied
+* @retval #STTE_ERROR_NOT_SUPPORTED Not supported
+* @retval #STTE_ERROR_OPERATION_FAILED Operation failure
+*
+* @pre The stte_main() function should be invoked before this function is called.
+*
+* @see stte_private_data_requested_cb()
+*/
+int stte_set_private_data_requested_cb(stte_private_data_requested_cb callback_func);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+ * @}@}
+ */
+
+#endif /* __STT_ENGINE_MAIN_H__ */
index ba3d7df..a5d7f48 100644 (file)
@@ -1,3 +1,4 @@
 [D-BUS Service]
 Name=org.tizen.voice.sttserver
-Exec=/usr/bin/stt-daemon
+Exec=/bin/sh -c "launch_app org.tizen.stt-engine-default"
+
index 4c5e017..d74c63b 100644 (file)
@@ -1,6 +1,6 @@
 Name:       stt
 Summary:    Speech To Text client library and daemon
-Version:    0.2.55
+Version:    0.2.56
 Release:    1
 Group:      Graphics & UI Framework/Voice Framework
 License:    Apache-2.0
@@ -111,7 +111,6 @@ mkdir -p %{TZ_SYS_RO_SHARE}/voice/test
 %license LICENSE.APLv2
 %defattr(-,root,root,-)
 %{_libdir}/lib*.so
-%{_bindir}/stt-daemon
 /etc/dbus-1/session.d/stt-server.conf
 %{TZ_SYS_RO_SHARE}/voice/stt/1.0/stt-config.xml
 %{TZ_SYS_RO_SHARE}/dbus-1/services/org.tizen.voice*
@@ -137,4 +136,4 @@ mkdir -p %{TZ_SYS_RO_SHARE}/voice/test
 %files engine-devel
 %defattr(-,root,root,-)
 %{_libdir}/pkgconfig/stt-engine.pc
-%{_includedir}/sttp.h
+%{_includedir}/stte.h
index 0d8cc6a..b97dd87 100644 (file)
@@ -4,7 +4,7 @@ SET(SRCS
        sttd_dbus_server.c
        sttd_dbus.c
        sttd_engine_agent.c
-       sttd_main.c
+       stte.c
        sttd_recorder.c
        sttd_server.c
        ../common/stt_config_mgr.c
@@ -16,22 +16,25 @@ SET(SRCS
 INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR})
 INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/common)
 INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/server)
+INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/include)
 
 FOREACH(flag ${pkgs_CFLAGS})
        SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}")
 ENDFOREACH(flag)
 
-SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIE")
-SET(CMAKE_C_FLAGS_DEBUG "-O0 -g -fPIE")
-SET(CMAKE_C_FLAGS_RELEASE "-O2 -fPIE")
-SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie")
+SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}")
+#SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -fPIE")
+#SET(CMAKE_C_FLAGS_DEBUG "-O0 -g -fPIE")
+#SET(CMAKE_C_FLAGS_RELEASE "-O2 -fPIE")
+#SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie")
 
 ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"")
 
 ## Executable ##
-ADD_EXECUTABLE("${PROJECT_NAME}-daemon" ${SRCS})
-TARGET_LINK_LIBRARIES("${PROJECT_NAME}-daemon" -ldl -lm ${pkgs_LDFLAGS})
+ADD_LIBRARY("${PROJECT_NAME}_engine" SHARED ${SRCS})
+#TARGET_LINK_LIBRARIES("${PROJECT_NAME}_engine" -ldl -lm ${pkgs_LDFLAGS})
+TARGET_LINK_LIBRARIES("${PROJECT_NAME}_engine" ${pkgs_LDFLAGS})
 
 ## Install
-INSTALL(TARGETS "${PROJECT_NAME}-daemon" DESTINATION bin)
+INSTALL(TARGETS "${PROJECT_NAME}_engine" DESTINATION ${LIBDIR} COMPONENT RuntimeLibraries)
 
index 09bce31..7d836dd 100644 (file)
@@ -73,9 +73,9 @@ void __config_bool_changed_cb(stt_config_type_e type, bool bool_value, void* use
        return;
 }
 
-int sttd_config_initialize(sttd_config_engine_changed_cb engine_cb,
-                          sttd_config_language_changed_cb lang_cb,
-                          sttd_config_silence_changed_cb silence_cb,
+int sttd_config_initialize(sttd_config_engine_changed_cb engine_cb, 
+                          sttd_config_language_changed_cb lang_cb, 
+                          sttd_config_silence_changed_cb silence_cb, 
                           void* user_data)
 {
        if (NULL == engine_cb || NULL == lang_cb || NULL == silence_cb) {
@@ -90,7 +90,7 @@ int sttd_config_initialize(sttd_config_engine_changed_cb engine_cb,
                return -1;
        }
 
-       ret = stt_config_mgr_set_callback(getpid(), __sttd_config_engine_changed_cb, __sttd_config_lang_changed_cb,
+       ret = stt_config_mgr_set_callback(getpid(), __sttd_config_engine_changed_cb, __sttd_config_lang_changed_cb, 
                __config_bool_changed_cb, NULL);
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[ERROR] Fail to set config changed : %d", ret);
index 5ab5d76..f6d4c99 100644 (file)
@@ -26,9 +26,9 @@ typedef void (*sttd_config_language_changed_cb)(const char* language, void* user
 typedef void (*sttd_config_silence_changed_cb)(bool value, void* user_data);
 
 
-int sttd_config_initialize(sttd_config_engine_changed_cb engine_cb,
-                       sttd_config_language_changed_cb lang_cb,
-                       sttd_config_silence_changed_cb silence_cb,
+int sttd_config_initialize(sttd_config_engine_changed_cb engine_cb, 
+                       sttd_config_language_changed_cb lang_cb, 
+                       sttd_config_silence_changed_cb silence_cb, 
                        void* user_data);
 
 int sttd_config_finalize();
index efa4fda..a4469e6 100644 (file)
@@ -571,7 +571,7 @@ int sttd_dbus_server_set_private_data(DBusConnection* conn, DBusMessage* msg)
        int uid;
        char* key;
        char* data;
-       int ret = 0;
+       int ret = STTD_ERROR_OPERATION_FAILED;
        dbus_message_get_args(msg, &err,
                DBUS_TYPE_INT32, &uid,
                DBUS_TYPE_STRING, &key,
@@ -604,7 +604,7 @@ int sttd_dbus_server_set_private_data(DBusConnection* conn, DBusMessage* msg)
                }
 
                if (!dbus_connection_send(conn, reply, NULL)) {
-                       SLOG(LOG_ERROR, TAG_STTD, "[OUT ERROR] Fail to send reply");
+                       SLOG(LOG_ERROR, TAG_STTD, "[OUT ERROR] Out Of Memory!");
                }
 
                dbus_connection_flush(conn);
@@ -627,8 +627,7 @@ int sttd_dbus_server_get_private_data(DBusConnection* conn, DBusMessage* msg)
        int uid;
        char* key = NULL;
        char* data = NULL;
-
-       int ret = 0;
+       int ret = STTD_ERROR_OPERATION_FAILED;
        dbus_message_get_args(msg, &err,
                DBUS_TYPE_INT32, &uid,
                DBUS_TYPE_STRING, &key,
@@ -662,7 +661,7 @@ int sttd_dbus_server_get_private_data(DBusConnection* conn, DBusMessage* msg)
                }
 
                if (!dbus_connection_send(conn, reply, NULL)) {
-                       SLOG(LOG_ERROR, TAG_STTD, "[OUT ERROR] Fail to send reply");
+                       SLOG(LOG_ERROR, TAG_STTD, "[OUT ERROR] Out Of Memory!");
                }
 
                dbus_connection_flush(conn);
index 6429f04..81417d5 100644 (file)
@@ -20,6 +20,7 @@
 #include "sttd_main.h"
 #include "sttd_client_data.h"
 #include "sttd_config.h"
+#include "sttd_dbus.h"
 #include "sttd_recorder.h"
 #include "sttd_engine_agent.h"
 
 * Internal data structure
 */
 
-typedef struct {
-       int     uid;
-       int     engine_id;
-       bool    use_default_engine;
-} sttengine_client_s;
-
 typedef struct _sttengine_info {
-       int     engine_id;
-
        char*   engine_uuid;
        char*   engine_path;
        char*   engine_name;
@@ -57,46 +50,30 @@ typedef struct _sttengine_info {
 /** stt engine agent init */
 static bool    g_agent_init;
 
-/** list */
-static GSList* g_engine_client_list;
-static GSList* g_engine_list;
+static sttengine_info_s* g_engine_info = NULL;
 
 /** default engine info */
-static int     g_default_engine_id;
-static char*   g_default_language;
+static char*   g_default_language = NULL;
 static bool    g_default_silence_detected;
 
-static int     g_engine_id_count;
-
-/** current engine id */
-static int     g_recording_engine_id;
-
 /** callback functions */
-static result_callback g_result_cb;
-static result_time_callback g_result_time_cb;
-static silence_dectection_callback g_silence_cb;
-
+static result_callback g_result_cb = NULL;
+static result_time_callback g_result_time_cb = NULL;
+static speech_status_callback g_speech_status_cb = NULL;
+static error_callback g_error_cb = NULL;
 
 /** callback functions */
-void __result_cb(sttp_result_event_e event, const char* type, const char** data, int data_count,
-                const char* msg, void* time_info, void *user_data);
-
-bool __result_time_cb(int index, sttp_result_time_event_e event, const char* text,
+bool __result_time_cb(int index, stte_result_time_event_e event, const char* text,
                      long start_time, long end_time, void* user_data);
 
-void __detect_silence_cb(sttp_silence_type_e type, void* user_data);
-
 bool __supported_language_cb(const char* language, void* user_data);
 
-void __engine_info_cb(const char* engine_uuid, const char* engine_name, const char* setting_ug_name,
-                     bool use_network, void* user_data);
-
 /*
 * Internal Interfaces
 */
 
 /** get engine info */
-int __internal_get_engine_info(const char* filepath, sttengine_info_s** info);
+int __internal_get_engine_info(stte_request_callback_s *callback, sttengine_info_s** info);
 
 int __log_enginelist();
 
@@ -104,22 +81,20 @@ int __log_enginelist();
 * STT Engine Agent Interfaces
 */
 int sttd_engine_agent_init(result_callback result_cb, result_time_callback time_cb,
-                          silence_dectection_callback silence_cb)
+                          speech_status_callback speech_status_cb, error_callback error_cb)
 {
        /* initialize static data */
-       if (NULL == result_cb || NULL == time_cb || NULL == silence_cb) {
+       if (NULL == result_cb || NULL == time_cb || NULL == speech_status_cb || NULL == error_cb) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine agent ERROR] Invalid parameter");
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
        g_result_cb = result_cb;
        g_result_time_cb = time_cb;
-       g_silence_cb = silence_cb;
+       g_speech_status_cb = speech_status_cb;
+       g_error_cb = error_cb;
 
-       g_default_engine_id = -1;
        g_default_language = NULL;
-       g_engine_id_count = 1;
-       g_recording_engine_id = -1;
 
        if (0 != sttd_config_get_default_language(&(g_default_language))) {
                SLOG(LOG_WARN, TAG_STTD, "[Engine Agent WARNING] There is No default voice in config");
@@ -137,7 +112,7 @@ int sttd_engine_agent_init(result_callback result_cb, result_time_callback time_
                g_default_silence_detected = (bool)temp;
        }
 
-       g_agent_init = false;
+       g_agent_init = true;
 
        return 0;
 }
@@ -152,6 +127,7 @@ int __engine_agent_clear_engine(sttengine_info_s *engine)
                if (NULL != engine->first_lang)         free(engine->first_lang);
 
                free(engine);
+               engine = NULL;
        }
 
        return 0;
@@ -159,153 +135,96 @@ int __engine_agent_clear_engine(sttengine_info_s *engine)
 
 int sttd_engine_agent_release()
 {
-       /* Release client list */
-       GSList *iter = NULL;
-       sttengine_client_s *client = NULL;
+       if (NULL != g_engine_info) {
+               if (g_engine_info->is_loaded) {
+                       SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Unload engine");
 
-       if (g_slist_length(g_engine_client_list) > 0) {
-               /* Get a first item */
-               iter = g_slist_nth(g_engine_client_list, 0);
-
-               while (NULL != iter) {
-                       /* Get handle data from list */
-                       client = iter->data;
-                       g_engine_client_list = g_slist_remove_link(g_engine_client_list, iter);
-
-                       if (NULL != client)
-                               free(client);
-
-                       iter = g_slist_nth(g_engine_client_list, 0);
-               }
-       }
-
-       g_slist_free(g_engine_client_list);
-
-       /* Release engine list */
-       sttengine_info_s *engine = NULL;
-
-       if (0 < g_slist_length(g_engine_list)) {
-               /* Get a first item */
-               iter = g_slist_nth(g_engine_list, 0);
+                       if (0 != stt_engine_deinitialize()) {
+                               SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to deinitialize");
+                       }
 
-               while (NULL != iter) {
-                       /* Get handle data from list */
-                       engine = iter->data;
-                       g_engine_list = g_slist_remove_link(g_engine_list, iter);
+                       if (0 != stt_engine_unload()) {
+                               SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to unload engine");
+                       }
 
-                       /* Check engine unload */
-                       if (engine->is_loaded) {
-                               SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Unload engine id(%d)", engine->engine_id);
+                       if (NULL != g_engine_info->engine_uuid) {
+                               free(g_engine_info->engine_uuid);
+                               g_engine_info->engine_uuid = NULL;
+                       }
 
-                               if (0 != stt_engine_deinitialize(engine->engine_id))
-                                       SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to deinitialize engine id(%d)", engine->engine_id);
+                       if (NULL != g_engine_info->engine_path) {
+                               free(g_engine_info->engine_path);
+                               g_engine_info->engine_path = NULL;
+                       }
 
-                               if (0 != stt_engine_unload(engine->engine_id))
-                                       SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to unload engine id(%d)", engine->engine_id);
+                       if (NULL != g_engine_info->engine_name) {
+                               free(g_engine_info->engine_name);
+                               g_engine_info->engine_name = NULL;
+                       }
 
-                               engine->is_loaded = false;
+                       if (NULL != g_engine_info->engine_setting_path) {
+                               free(g_engine_info->engine_setting_path);
+                               g_engine_info->engine_setting_path = NULL;
                        }
 
-                       __engine_agent_clear_engine(engine);
+                       if (NULL != g_engine_info->first_lang) {
+                               free(g_engine_info->first_lang);
+                               g_engine_info->first_lang = NULL;
+                       }
 
-                       iter = g_slist_nth(g_engine_list, 0);
+                       g_engine_info->is_loaded = false;
                }
+
+               __engine_agent_clear_engine(g_engine_info);
        }
 
        g_result_cb = NULL;
-       g_silence_cb = NULL;
+       g_speech_status_cb = NULL;
+       g_error_cb = NULL;
+       g_result_time_cb = NULL;
 
        g_agent_init = false;
-       g_default_engine_id = -1;
 
        return 0;
 }
 
-void __engine_info_cb(const char* engine_uuid, const char* engine_name, const char* setting_ug_name,
-                     bool use_network, void* user_data)
-{
-       sttengine_info_s* temp = (sttengine_info_s*)user_data;
-
-       temp->engine_uuid = g_strdup(engine_uuid);
-       temp->engine_name = g_strdup(engine_name);
-       temp->engine_setting_path = g_strdup(setting_ug_name);
-       temp->use_network = use_network;
-}
-
-int __internal_get_engine_info(const char* filepath, sttengine_info_s** info)
+int __internal_get_engine_info(stte_request_callback_s *callback, sttengine_info_s** info)
 {
-       if (NULL == filepath || NULL == info) {
-               SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Invalid Parameter");
-               return STTD_ERROR_INVALID_PARAMETER;
-       }
-
-       /* load engine */
-       char *error;
-       void* handle;
-
-       handle = dlopen(filepath, RTLD_LAZY);
-
-       if (!handle) {
-               SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Invalid engine : %s, error(%s)", filepath, (NULL == dlerror()) ? "NULL" : dlerror());
-               return STTD_ERROR_ENGINE_NOT_FOUND;
-       }
-
-       /* link engine to daemon */
-       dlsym(handle, "sttp_load_engine");
-       if ((error = dlerror()) != NULL) {
-               SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Invalid engine. Fail to open sttp_load_engine : %s", error);
-               dlclose(handle);
-               return STTD_ERROR_ENGINE_NOT_FOUND;
-       }
-
-       dlsym(handle, "sttp_unload_engine");
-       if ((error = dlerror()) != NULL) {
-               SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Invalid engine. Fail to open sttp_unload_engine : %s", error);
-               dlclose(handle);
-               return STTD_ERROR_ENGINE_NOT_FOUND;
-       }
-
-       int (*get_engine_info)(sttpe_engine_info_cb callback, void* user_data);
-
-       get_engine_info = (int (*)(sttpe_engine_info_cb, void*))dlsym(handle, "sttp_get_engine_info");
-       if ((error = dlerror()) != NULL || NULL == get_engine_info) {
-               SLOG(LOG_WARN, TAG_STTD, "[Engine Agent WARNING] Invalid engine. Fail to open sttp_get_engine_info : %s", error);
-               dlclose(handle);
-               return STTD_ERROR_ENGINE_NOT_FOUND;
-       }
-
        sttengine_info_s* temp;
        temp = (sttengine_info_s*)calloc(1, sizeof(sttengine_info_s));
        if (NULL == temp) {
-               SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to allocate memory");
-               dlclose(handle);
+               SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] fail to allocate memory");
                return STTD_ERROR_OUT_OF_MEMORY;
        }
 
-       /* get engine info */
-       if (0 != get_engine_info(__engine_info_cb, (void*)temp)) {
-               SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get engine info from engine");
-               dlclose(handle);
+       if (NULL == callback) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Invalid engine");
                free(temp);
                return STTD_ERROR_ENGINE_NOT_FOUND;
        }
 
-       /* close engine */
-       dlclose(handle);
+       if (NULL == callback->get_info) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Invalid engine");
+               free(temp);
+               return STTD_ERROR_ENGINE_NOT_FOUND;
+       }
 
-       temp->engine_id = g_engine_id_count;
-       g_engine_id_count++;
+       if (0 != callback->get_info(&(temp->engine_uuid), &(temp->engine_name), &(temp->engine_setting_path), &(temp->use_network))) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get engine info");
+               free(temp);
+               return STTD_ERROR_ENGINE_NOT_FOUND;
+       }
 
-       temp->engine_path = g_strdup(filepath);
+       /* todo - removed? */
+       temp->engine_path = strdup("empty");
        temp->is_loaded = false;
 
        SLOG(LOG_DEBUG, TAG_STTD, "----- Valid Engine");
-       SECURE_SLOG(LOG_DEBUG, TAG_STTD, "Engine id : %d", temp->engine_id);
-       SECURE_SLOG(LOG_DEBUG, TAG_STTD, "Engine uuid : %s", temp->engine_uuid);
-       SECURE_SLOG(LOG_DEBUG, TAG_STTD, "Engine name : %s", temp->engine_name);
-       SECURE_SLOG(LOG_DEBUG, TAG_STTD, "Engine path : %s", temp->engine_path);
-       SECURE_SLOG(LOG_DEBUG, TAG_STTD, "Engine setting path : %s", temp->engine_setting_path);
-       SECURE_SLOG(LOG_DEBUG, TAG_STTD, "Use network : %s", temp->use_network ? "true" : "false");
+       SLOG(LOG_DEBUG, TAG_STTD, "Engine uuid : %s", (NULL == temp->engine_uuid) ? "NULL" : temp->engine_uuid);
+       SLOG(LOG_DEBUG, TAG_STTD, "Engine name : %s", (NULL == temp->engine_name) ? "NULL" : temp->engine_name);
+       SLOG(LOG_DEBUG, TAG_STTD, "Engine path : %s", (NULL == temp->engine_path) ? "NULL" : temp->engine_path);
+       SLOG(LOG_DEBUG, TAG_STTD, "Engine setting path : %s", (NULL == temp->engine_setting_path) ? "NULL" : temp->engine_setting_path);
+       SLOG(LOG_DEBUG, TAG_STTD, "Use network : %s", temp->use_network ? "true" : "false");
        SLOG(LOG_DEBUG, TAG_STTD, "-----");
        SLOG(LOG_DEBUG, TAG_STTD, "  ");
 
@@ -316,401 +235,152 @@ int __internal_get_engine_info(const char* filepath, sttengine_info_s** info)
 
 bool __is_engine(const char* filepath)
 {
-       GSList *iter = NULL;
-       sttengine_info_s *engine = NULL;
-
-       if (0 < g_slist_length(g_engine_list)) {
-               /* Get a first item */
-               iter = g_slist_nth(g_engine_list, 0);
-
-               while (NULL != iter) {
-                       /* Get handle data from list */
-                       engine = iter->data;
-
-                       if (0 == strcmp(engine->engine_path, filepath)) {
-                               return true;
-                       }
+       if (NULL == filepath) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] No filepath");
+               return false;
+       }
 
-                       iter = g_slist_next(iter);
+       if (NULL != g_engine_info) {
+               if (!strcmp(g_engine_info->engine_path, filepath)) {
+                       return true;
                }
        }
 
        return false;
 }
 
-int sttd_engine_agent_initialize_engine_list()
+int __engine_agent_check_engine_unload()
 {
-       /* Get file name from default engine directory */
-       DIR *dp = NULL;
-       int ret = -1;
-       struct dirent entry;
-       struct dirent *dirp = NULL;
-
-       dp  = opendir(STT_DEFAULT_ENGINE);
-       if (NULL != dp) {
-               do {
-                       ret = readdir_r(dp, &entry, &dirp);
-                       if (0 != ret) {
-                               SLOG(LOG_ERROR, TAG_STTD, "[File ERROR] Fail to read directory");
-                               break;
-                       }
-
-                       if (NULL != dirp) {
-                               sttengine_info_s* info;
-                               char* filepath;
-                               int filesize;
-
-                               filesize = strlen(STT_DEFAULT_ENGINE) + strlen(dirp->d_name) + 5;
-                               filepath = (char*)calloc(filesize, sizeof(char));
+       /* Check the count of client to use this engine */
+       if (NULL == g_engine_info) {
+               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] No engine");
+       } else {
+               if (g_engine_info->is_loaded) {
+                       /* unload engine */
+#ifndef AUDIO_CREATE_ON_START
+                       SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Destroy recorder");
+                       if (0 != sttd_recorder_destroy())
+                               SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to destroy recorder");
+#endif
+                       SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Unload engine");
+                       if (0 != stt_engine_deinitialize())
+                               SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to deinitialize engine");
 
-                               if (NULL != filepath) {
-                                       snprintf(filepath, filesize, "%s/%s", STT_DEFAULT_ENGINE, dirp->d_name);
-                               } else {
-                                       SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Memory not enough!!");
-                                       continue;
-                               }
+                       if (0 != stt_engine_unload())
+                               SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to unload engine");
 
-                               if (false  == __is_engine(filepath)) {
-                                       /* get its info and update engine list */
-                                       if (0 == __internal_get_engine_info(filepath, &info)) {
-                                               /* add engine info to g_engine_list */
-                                               g_engine_list = g_slist_append(g_engine_list, info);
-                                       }
-                               }
+                       g_engine_info->is_loaded = false;
+               }
+       }
 
-                               if (NULL != filepath)
-                                       free(filepath);
-                       }
-               } while (NULL != dirp);
+       return 0;
+}
 
-               closedir(dp);
-       } else {
-               SLOG(LOG_WARN, TAG_STTD, "[Engine Agent WARNING] Fail to open default directory");
+int sttd_engine_agent_load_current_engine(stte_request_callback_s *callback)
+{
+       if (false == g_agent_init) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
+               return STTD_ERROR_OPERATION_FAILED;
        }
 
-       if (0 >= g_slist_length(g_engine_list)) {
-               SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] No Engine");
-               return STTD_ERROR_ENGINE_NOT_FOUND;
+       /* Get current engine info */
+       sttengine_info_s* info;
+       int ret = __internal_get_engine_info(callback, &info);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get engine info");
+               return ret;
+       } else {
+               g_engine_info = info;
        }
 
        __log_enginelist();
 
        /* Set default engine */
-       GSList *iter = NULL;
-       sttengine_info_s *engine = NULL;
        char* cur_engine_uuid = NULL;
        bool is_default_engine = false;
 
        /* get current engine from config */
        if (0 == sttd_config_get_default_engine(&cur_engine_uuid)) {
                SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] current engine from config : %s", cur_engine_uuid);
-
-               if (0 < g_slist_length(g_engine_list)) {
-                       /* Get a first item */
-                       iter = g_slist_nth(g_engine_list, 0);
-
-                       while (NULL != iter) {
-                               /* Get handle data from list */
-                               engine = iter->data;
-
-                               if (0 == strcmp(engine->engine_uuid, cur_engine_uuid)) {
-                                       is_default_engine = true;
-                                       g_default_engine_id = engine->engine_id;
-                                       break;
-                               }
-
-                               iter = g_slist_next(iter);
+               if (NULL != g_engine_info->engine_uuid) {
+                       if (!strcmp(g_engine_info->engine_uuid, cur_engine_uuid)) {
+                               is_default_engine = true;
                        }
                }
-
-               if (cur_engine_uuid != NULL)
+               if (NULL != cur_engine_uuid) {
                        free(cur_engine_uuid);
+                       cur_engine_uuid = NULL;
+               }
        } else {
                SLOG(LOG_WARN, TAG_STTD, "[Engine Agent WARNING] There is not current engine from config");
        }
 
        if (false == is_default_engine) {
-               if (0 < g_slist_length(g_engine_list)) {
-                       /* Get a first item */
-                       iter = g_slist_nth(g_engine_list, 0);
-
-                       /* Get handle data from list */
-                       engine = iter->data;
-
-                       if (NULL != engine) {
-                               is_default_engine = true;
-                               g_default_engine_id = engine->engine_id;
-                       }
-               }
-       }
-
-       if (NULL != engine) {
-               if (NULL != engine->engine_uuid) {
-                       SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Default engine Id(%d) uuid(%s)", engine->engine_id, engine->engine_uuid);
-
-                       if (false == is_default_engine) {
-                               if (0 != sttd_config_set_default_engine(engine->engine_uuid))
-                                       SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set default engine ");
-                       }
-               }
+               SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Current engine is not Default engine");
        } else {
-               SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Default engine is NULL");
-               return STTD_ERROR_ENGINE_NOT_FOUND;
-       }
-
-       g_agent_init = true;
-
-       return 0;
-}
-
-sttengine_info_s* __engine_agent_get_engine_by_id(int engine_id)
-{
-       GSList *iter = NULL;
-       sttengine_info_s *data = NULL;
-
-       iter = g_slist_nth(g_engine_list, 0);
-
-       while (NULL != iter) {
-
-               data = iter->data;
-
-               if (data->engine_id == engine_id)
-                       return data;
-
-               iter = g_slist_next(iter);
-       }
-
-       return NULL;
-}
-
-sttengine_info_s* __engine_agent_get_engine_by_uuid(const char* engine_uuid)
-{
-       GSList *iter = NULL;
-       sttengine_info_s *data = NULL;
-
-       iter = g_slist_nth(g_engine_list, 0);
-
-       while (NULL != iter) {
-
-               data = iter->data;
-
-               if (0 == strcmp(data->engine_uuid, engine_uuid))
-                       return data;
-
-               iter = g_slist_next(iter);
-       }
-
-       return NULL;
-}
-
-sttengine_client_s* __engine_agent_get_client(int uid)
-{
-       GSList *iter = NULL;
-       sttengine_client_s *data = NULL;
-
-       if (0 < g_slist_length(g_engine_client_list)) {
-               iter = g_slist_nth(g_engine_client_list, 0);
-
-               while (NULL != iter) {
-                       /* Get handle data from list */
-                       data = iter->data;
-
-                       if (uid == data->uid)
-                               return data;
-
-                       iter = g_slist_next(iter);
-               }
-       }
-
-       return NULL;
-}
-
-sttengine_info_s* __engine_agent_get_engine_by_uid(int uid)
-{
-       sttengine_client_s *data;
-
-       data = __engine_agent_get_client(uid);
-       if (NULL != data)
-               return __engine_agent_get_engine_by_id(data->engine_id);
-
-       return NULL;
-}
-
-int __engine_agent_check_engine_unload(int engine_id)
-{
-       /* Check the count of client to use this engine */
-       GSList *iter = NULL;
-       int client_count = 0;
-       sttengine_client_s *data = NULL;
-
-       if (0 < g_slist_length(g_engine_client_list)) {
-               iter = g_slist_nth(g_engine_client_list, 0);
-
-               while (NULL != iter) {
-                       /* Get handle data from list */
-                       data = iter->data;
-
-                       if (data->engine_id == engine_id)
-                               client_count++;
-
-                       iter = g_slist_next(iter);
-               }
-       }
-
-       if (0 == client_count) {
-               sttengine_info_s* engine = NULL;
-               engine = __engine_agent_get_engine_by_id(engine_id);
-               if (NULL == engine) {
-                       SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get engine from client(%d)", engine_id);
-               } else {
-                       if (engine->is_loaded) {
-                               /* unload engine */
-#ifndef AUDIO_CREATE_ON_START
-                               SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Destroy recorder");
-                               if (0 != sttd_recorder_destroy(engine->engine_id))
-                                       SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to destroy recorder(%d)", engine->engine_id);
-#endif
-                               SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Unload engine id(%d)", engine_id);
-                               if (0 != stt_engine_deinitialize(engine->engine_id))
-                                       SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to deinitialize engine id(%d)", engine->engine_id);
-
-                               if (0 != stt_engine_unload(engine->engine_id))
-                                       SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to unload engine id(%d)", engine->engine_id);
-
-                               engine->is_loaded = false;
-                       }
-               }
-       }
-
-       return 0;
-}
-
-int sttd_engine_agent_load_current_engine(int uid, const char* engine_uuid)
-{
-       if (false == g_agent_init) {
-               SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
-               return STTD_ERROR_OPERATION_FAILED;
-       }
-
-       sttengine_client_s* client = NULL;
-       sttengine_info_s* engine = NULL;
-       int before_engine = -1;
-
-       client = __engine_agent_get_client(uid);
-
-       if (NULL == client) {
-               client = (sttengine_client_s*)calloc(1, sizeof(sttengine_client_s));
-               if (NULL == client) {
-                       SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to allocate memory");
-                       return STTD_ERROR_OUT_OF_MEMORY;
-               }
-
-               /* initialize */
-               client->uid = uid;
-               client->engine_id = -1;
-
-               g_engine_client_list = g_slist_append(g_engine_client_list, client);
-
-               SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Registered client(%d)", uid);
-       }
-
-       if (NULL == engine_uuid) {
-               /* Set default engine */
-               engine = __engine_agent_get_engine_by_id(g_default_engine_id);
-
-               if (NULL == engine) {
-                       SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get default engine : %d", g_default_engine_id);
-                       return STTD_ERROR_OPERATION_FAILED;
-               }
-               before_engine = client->engine_id;
-
-               client->engine_id = engine->engine_id;
-               client->use_default_engine = true;
-       } else {
-               /* Set engine by uid */
-               engine = __engine_agent_get_engine_by_uuid(engine_uuid);
-
-               if (NULL == engine) {
-                       SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get engine : %s", engine_uuid);
-                       return STTD_ERROR_OPERATION_FAILED;
-               }
-               before_engine = client->engine_id;
-
-               client->engine_id = engine->engine_id;
-               client->use_default_engine = false;
-       }
-
-       if (-1 != before_engine) {
-               /* Unload engine if reference count is 0 */
-               __engine_agent_check_engine_unload(before_engine);
-       }
-
-       if (true == engine->is_loaded) {
-               SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine] engine id(%d) is already loaded", engine->engine_id);
-               return 0;
+               SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Current engine is Default engine");
        }
 
        /* Load engine */
-       int ret;
-       ret = stt_engine_load(engine->engine_id, engine->engine_path);
+       ret = stt_engine_load(g_engine_info->engine_path, callback);
        if (0 != ret) {
-               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to load engine : id(%d) path(%s)", engine->engine_id, engine->engine_path);
+               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to load engine : path(%s)", g_engine_info->engine_path);
                return ret;
        }
 
-       ret = stt_engine_initialize(engine->engine_id, __result_cb, __detect_silence_cb);
+       ret = stt_engine_initialize(false);
        if (0 != ret) {
-               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to initialize engine : id(%d) path(%s)", engine->engine_id, engine->engine_path);
+               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to initialize engine : path(%s)", g_engine_info->engine_path);
                return ret;
        }
 
-       ret = stt_engine_set_silence_detection(engine->engine_id, g_default_silence_detected);
+       ret = stt_engine_set_silence_detection(g_default_silence_detected);
        if (0 != ret) {
                SLOG(LOG_WARN, TAG_STTD, "[Engine Agent WARNING] Not support silence detection");
-               engine->support_silence_detection = false;
+               g_engine_info->support_silence_detection = false;
        } else {
                SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Silence detection : %s", g_default_silence_detected ? "true" : "false");
-               engine->support_silence_detection = true;
-               engine->silence_detection = g_default_silence_detected;
+               g_engine_info->support_silence_detection = true;
+               g_engine_info->silence_detection = g_default_silence_detected;
        }
 
        /* Set first language */
        char* tmp_lang = NULL;
-       ret = stt_engine_get_first_language(engine->engine_id, &tmp_lang);
+       ret = stt_engine_get_first_language(&tmp_lang);
        if (0 == ret && NULL != tmp_lang) {
-               engine->first_lang = strdup(tmp_lang);
+               g_engine_info->first_lang = strdup(tmp_lang);
                free(tmp_lang);
        } else {
-               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get first language from engine : %d %s", engine->engine_id, engine->engine_name);
+               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get first language from engine : %s", g_engine_info->engine_name);
                return ret;
        }
 
 #ifndef AUDIO_CREATE_ON_START
        /* Ready recorder */
-       sttp_audio_type_e atype;
+       stte_audio_type_e atype;
        int rate;
        int channels;
 
-       ret = stt_engine_get_audio_type(engine->engine_id, &atype, &rate, &channels);
+       ret = stt_engine_get_audio_type(&atype, &rate, &channels);
        if (0 != ret) {
-               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get audio type : %d %s", engine->engine_id, engine->engine_name);
+               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get audio type : %d %s", g_engine_info->engine_name);
                return ret;
        }
 
-       ret = sttd_recorder_create(engine->engine_id, uid, atype, channels, rate);
+       ret = sttd_recorder_create(atype, channels, rate);
        if (0 != ret) {
-               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to create recorder : %d %s", engine->engine_id, engine->engine_name);
+               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to create recorder : %s", g_engine_info->engine_name);
                return ret;
        }
 #endif
 
-       engine->is_loaded = true;
-       SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent SUCCESS] The %s(%d) has been loaded !!!", engine->engine_name, engine->engine_id);
+       g_engine_info->is_loaded = true;
+       SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent SUCCESS] The %s has been loaded !!!", g_engine_info->engine_name);
 
        return 0;
 }
 
-int sttd_engine_agent_unload_current_engine(int uid)
+int sttd_engine_agent_unload_current_engine()
 {
        if (false == g_agent_init) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized ");
@@ -718,44 +388,14 @@ int sttd_engine_agent_unload_current_engine(int uid)
        }
 
        /* Remove client */
-       int engine_id = -1;
-
-       GSList *iter = NULL;
-       sttengine_client_s *data = NULL;
-
-       if (0 < g_slist_length(g_engine_client_list)) {
-               iter = g_slist_nth(g_engine_client_list, 0);
-
-               while (NULL != iter) {
-                       /* Get handle data from list */
-                       data = iter->data;
-
-                       if (NULL != data) {
-                               if (uid == data->uid) {
-                                       g_engine_client_list = g_slist_remove_link(g_engine_client_list, iter);
-                                       engine_id = data->engine_id;
-                                       free(data);
-                                       break;
-                               }
-                       }
-
-                       iter = g_slist_next(iter);
-               }
-       }
-
-       if (-1 != engine_id) {
-               __engine_agent_check_engine_unload(engine_id);
-       }
+       __engine_agent_check_engine_unload();
 
        return 0;
 }
 
 bool sttd_engine_agent_is_default_engine()
 {
-       if (g_default_engine_id > 0)
                return true;
-
-       return false;
 }
 
 int sttd_engine_agent_get_engine_list(GSList** engine_list)
@@ -765,43 +405,12 @@ int sttd_engine_agent_get_engine_list(GSList** engine_list)
                return STTD_ERROR_OPERATION_FAILED;
        }
 
-       GSList *iter = NULL;
-       sttengine_info_s *data = NULL;
-
-       iter = g_slist_nth(g_engine_list, 0);
-
-       SLOG(LOG_DEBUG, TAG_STTD, "----- [Engine Agent] engine list -----");
-
-       while (NULL != iter) {
-               engine_s* temp_engine;
-
-               temp_engine = (engine_s*)calloc(1, sizeof(engine_s));
-               if (NULL == temp_engine) {
-                       SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to allocate memory");
-                       return STTD_ERROR_OUT_OF_MEMORY;
-               }
-
-               data = iter->data;
-
-               temp_engine->engine_id = strdup(data->engine_uuid);
-               temp_engine->engine_name = strdup(data->engine_name);
-               temp_engine->ug_name = strdup(data->engine_setting_path);
-
-               *engine_list = g_slist_append(*engine_list, temp_engine);
-
-               iter = g_slist_next(iter);
-
-               SECURE_SLOG(LOG_DEBUG, TAG_STTD, " -- Engine id(%s)", temp_engine->engine_id);
-               SECURE_SLOG(LOG_DEBUG, TAG_STTD, "    Engine name(%s)", temp_engine->engine_name);
-               SECURE_SLOG(LOG_DEBUG, TAG_STTD, "    Engine ug name(%s)", temp_engine->ug_name);
-       }
-
        SLOG(LOG_DEBUG, TAG_STTD, "--------------------------------------");
 
        return 0;
 }
 
-int sttd_engine_agent_get_current_engine(int uid, char** engine_uuid)
+int sttd_engine_agent_get_current_engine(char** engine_uuid)
 {
        if (false == g_agent_init) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
@@ -813,41 +422,35 @@ int sttd_engine_agent_get_current_engine(int uid, char** engine_uuid)
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       sttengine_info_s* engine;
-       engine = __engine_agent_get_engine_by_uid(uid);
-
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine of uid(%d) is not valid", uid);
+       if (NULL == g_engine_info) {
+               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine is not valid");
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       if (false == engine->is_loaded) {
+       if (false == g_engine_info->is_loaded) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
                return STTD_ERROR_OPERATION_FAILED;
        }
 
-       *engine_uuid = strdup(engine->engine_uuid);
+       *engine_uuid = strdup(g_engine_info->engine_uuid);
 
        return 0;
 }
 
-bool sttd_engine_agent_need_network(int uid)
+bool sttd_engine_agent_need_network()
 {
        if (false == g_agent_init) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
                return STTD_ERROR_OPERATION_FAILED;
        }
 
-       sttengine_info_s* engine;
-       engine = __engine_agent_get_engine_by_uid(uid);
-
-       if (NULL != engine)
-               return engine->use_network;
+       if (NULL != g_engine_info)
+               return g_engine_info->use_network;
 
        return false;
 }
 
-int sttd_engine_agent_supported_langs(int uid, GSList** lang_list)
+int sttd_engine_agent_supported_langs(GSList** lang_list)
 {
        if (false == g_agent_init) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
@@ -859,20 +462,17 @@ int sttd_engine_agent_supported_langs(int uid, GSList** lang_list)
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       sttengine_info_s* engine = NULL;
-       engine = __engine_agent_get_engine_by_uid(uid);
-
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine of uid(%d) is not valid", uid);
+       if (NULL == g_engine_info) {
+               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine is not valid");
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       if (false == engine->is_loaded) {
+       if (false == g_engine_info->is_loaded) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
                return STTD_ERROR_OPERATION_FAILED;
        }
 
-       int ret = stt_engine_get_supported_langs(engine->engine_id, lang_list);
+       int ret = stt_engine_get_supported_langs(lang_list);
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] get language list error(%d)", ret);
        }
@@ -880,7 +480,7 @@ int sttd_engine_agent_supported_langs(int uid, GSList** lang_list)
        return ret;
 }
 
-int sttd_engine_agent_get_default_lang(int uid, char** lang)
+int sttd_engine_agent_get_default_lang(char** lang)
 {
        if (false == g_agent_init) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
@@ -892,37 +492,32 @@ int sttd_engine_agent_get_default_lang(int uid, char** lang)
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       sttengine_info_s* engine = NULL;
-       engine = __engine_agent_get_engine_by_uid(uid);
-
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine of uid(%d) is not valid", uid);
+       if (NULL == g_engine_info) {
+               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine is not valid");
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       if (false == engine->is_loaded) {
+       if (false == g_engine_info->is_loaded) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
                return STTD_ERROR_OPERATION_FAILED;
        }
 
        /* get default language */
        bool is_valid = false;
-       int ret = -1;
-       ret = stt_engine_is_valid_language(engine->engine_id, g_default_language, &is_valid);
-       if (0 != ret) {
+       if (0 != stt_engine_is_valid_language(g_default_language, &is_valid)) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to check valid language");
-               return ret;
+               return STTD_ERROR_OPERATION_FAILED;
        }
 
        if (true == is_valid) {
                *lang = strdup(g_default_language);
        } else
-               *lang = strdup(engine->first_lang);
+               *lang = strdup(g_engine_info->first_lang);
 
        return 0;
 }
 
-int sttd_engine_agent_set_private_data(int uid, const char* key, const char* data)
+int sttd_engine_agent_set_private_data(const char* key, const char* data)
 {
        if (false == g_agent_init) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
@@ -934,22 +529,19 @@ int sttd_engine_agent_set_private_data(int uid, const char* key, const char* dat
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       sttengine_info_s* engine = NULL;
-       engine = __engine_agent_get_engine_by_uid(uid);
-
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine of uid(%d) is not valid", uid);
+       if (NULL == g_engine_info) {
+               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine is not valid");
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       if (false == engine->is_loaded) {
+       if (false == g_engine_info->is_loaded) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
                return STTD_ERROR_OPERATION_FAILED;
        }
 
        /* set private data */
        int ret = -1;
-       ret = stt_engine_set_private_data(engine->engine_id, key, data);
+       ret = stt_engine_set_private_data(key, data);
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set private data");
        }
@@ -957,7 +549,7 @@ int sttd_engine_agent_set_private_data(int uid, const char* key, const char* dat
        return ret;
 }
 
-int sttd_engine_agent_get_private_data(int uid, const char* key, char** data)
+int sttd_engine_agent_get_private_data(const char* key, char** data)
 {
        if (false == g_agent_init) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
@@ -969,22 +561,19 @@ int sttd_engine_agent_get_private_data(int uid, const char* key, char** data)
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       sttengine_info_s* engine = NULL;
-       engine = __engine_agent_get_engine_by_uid(uid);
-
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine of uid(%d) is not valid", uid);
+       if (NULL == g_engine_info) {
+               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine is not valid");
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       if (false == engine->is_loaded) {
+       if (false == g_engine_info->is_loaded) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
                return STTD_ERROR_OPERATION_FAILED;
        }
 
        /* get default language */
        int ret = -1;
-       ret = stt_engine_get_private_data(engine->engine_id, key, data);
+       ret = stt_engine_get_private_data(key, data);
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get private data");
        }
@@ -992,7 +581,7 @@ int sttd_engine_agent_get_private_data(int uid, const char* key, char** data)
        return ret;
 }
 
-int sttd_engine_agent_get_option_supported(int uid, bool* silence)
+int sttd_engine_agent_get_option_supported(bool* silence)
 {
        if (false == g_agent_init) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
@@ -1004,20 +593,17 @@ int sttd_engine_agent_get_option_supported(int uid, bool* silence)
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       sttengine_info_s* engine = NULL;
-       engine = __engine_agent_get_engine_by_uid(uid);
-
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] uid(%d) is not valid", uid);
+       if (NULL == g_engine_info) {
+               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Engine is not valid");
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       if (false == engine->is_loaded) {
+       if (false == g_engine_info->is_loaded) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
                return STTD_ERROR_OPERATION_FAILED;
        }
 
-       *silence = engine->support_silence_detection;
+       *silence = g_engine_info->support_silence_detection;
 
        return 0;
 }
@@ -1034,15 +620,12 @@ int sttd_engine_agent_is_credential_needed(int uid, bool* credential)
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       sttengine_info_s* engine = NULL;
-       engine = __engine_agent_get_engine_by_uid(uid);
-
-       if (NULL == engine) {
+       if (NULL == g_engine_info) {
                SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] uid(%d) is not valid", uid);
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       if (false == engine->is_loaded) {
+       if (false == g_engine_info->is_loaded) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
                return STTD_ERROR_OPERATION_FAILED;
        }
@@ -1050,7 +633,7 @@ int sttd_engine_agent_is_credential_needed(int uid, bool* credential)
        bool temp = false;
        int ret;
 
-       ret = stt_engine_need_app_credential(engine->engine_id, &temp);
+       ret = stt_engine_need_app_credential(&temp);
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get to support recognition type : %d", ret);
                return ret;
@@ -1060,7 +643,7 @@ int sttd_engine_agent_is_credential_needed(int uid, bool* credential)
        return 0;
 }
 
-int sttd_engine_agent_is_recognition_type_supported(int uid, const char* type, bool* support)
+int sttd_engine_agent_is_recognition_type_supported(const char* type, bool* support)
 {
        if (false == g_agent_init) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
@@ -1072,15 +655,12 @@ int sttd_engine_agent_is_recognition_type_supported(int uid, const char* type, b
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       sttengine_info_s* engine = NULL;
-       engine = __engine_agent_get_engine_by_uid(uid);
-
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine of uid(%d) is not valid", uid);
+       if (NULL == g_engine_info) {
+               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine is not valid");
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       if (false == engine->is_loaded) {
+       if (false == g_engine_info->is_loaded) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
                return STTD_ERROR_OPERATION_FAILED;
        }
@@ -1088,7 +668,7 @@ int sttd_engine_agent_is_recognition_type_supported(int uid, const char* type, b
        bool temp = false;
        int ret;
 
-       ret = stt_engine_support_recognition_type(engine->engine_id, type, &temp);
+       ret = stt_engine_support_recognition_type(type, &temp);
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get to support recognition type : %d", ret);
                return ret;
@@ -1113,7 +693,7 @@ int __set_option(sttengine_info_s* engine, int silence)
                if (2 == silence) {
                        /* default option set */
                        if (g_default_silence_detected != engine->silence_detection) {
-                               if (0 != stt_engine_set_silence_detection(engine->engine_id, g_default_silence_detected)) {
+                               if (0 != stt_engine_set_silence_detection(g_default_silence_detected)) {
                                        SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set silence detection : %s", g_default_silence_detected ? "true" : "false");
                                } else {
                                        engine->silence_detection = g_default_silence_detected;
@@ -1122,7 +702,7 @@ int __set_option(sttengine_info_s* engine, int silence)
                        }
                } else {
                        if (silence != engine->silence_detection) {
-                               if (0 != stt_engine_set_silence_detection(engine->engine_id, silence)) {
+                               if (0 != stt_engine_set_silence_detection(silence)) {
                                        SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set silence detection : %s", silence ? "true" : "false");
                                } else {
                                        engine->silence_detection = silence;
@@ -1136,7 +716,7 @@ int __set_option(sttengine_info_s* engine, int silence)
 }
 
 int sttd_engine_agent_recognize_start_engine(int uid, const char* lang, const char* recognition_type,
-                                     int silence, const char* credential, void* user_param)
+                                     int silence, const char* appid, const char* credential, void* user_param)
 {
        if (false == g_agent_init) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
@@ -1148,20 +728,17 @@ int sttd_engine_agent_recognize_start_engine(int uid, const char* lang, const ch
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       sttengine_info_s* engine = NULL;
-       engine = __engine_agent_get_engine_by_uid(uid);
-
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine of uid(%d) is not valid", uid);
+       if (NULL == g_engine_info) {
+               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine is not valid");
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       if (false == engine->is_loaded) {
+       if (false == g_engine_info->is_loaded) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
                return STTD_ERROR_OPERATION_FAILED;
        }
 
-       if (0 != __set_option(engine, silence)) {
+       if (0 != __set_option(g_engine_info, silence)) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to set options");
                return STTD_ERROR_OPERATION_FAILED;
        }
@@ -1172,7 +749,7 @@ int sttd_engine_agent_recognize_start_engine(int uid, const char* lang, const ch
        char* temp = NULL;
        if (0 == strncmp(lang, "default", strlen("default"))) {
                bool is_valid = false;
-               ret = stt_engine_is_valid_language(engine->engine_id, g_default_language, &is_valid);
+               ret = stt_engine_is_valid_language(g_default_language, &is_valid);
                if (0 != ret) {
                        SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to check valid language");
                        return ret;
@@ -1182,7 +759,7 @@ int sttd_engine_agent_recognize_start_engine(int uid, const char* lang, const ch
                        temp = strdup(g_default_language);
                        SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent DEBUG] Default language is %s", temp);
                } else {
-                       temp = strdup(engine->first_lang);
+                       temp = strdup(g_engine_info->first_lang);
                        SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent DEBUG] Default language is engine first lang : %s", temp);
                }
        } else {
@@ -1191,46 +768,44 @@ int sttd_engine_agent_recognize_start_engine(int uid, const char* lang, const ch
 
        SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Start engine");
 
-       ret = stt_engine_recognize_start(engine->engine_id, temp, recognition_type, credential, user_param);
+       ret = stt_engine_recognize_start(temp, recognition_type, appid, credential, user_param);
        if (NULL != temp)       free(temp);
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Recognition start error(%d)", ret);
-               sttd_recorder_destroy(engine->engine_id);
+               sttd_recorder_destroy();
                return ret;
        }
 
 #ifdef AUDIO_CREATE_ON_START
        /* Ready recorder */
-       sttp_audio_type_e atype;
+       stte_audio_type_e atype;
        int rate;
        int channels;
 
-       ret = stt_engine_get_audio_type(engine->engine_id, &atype, &rate, &channels);
+       ret = stt_engine_get_audio_type(&atype, &rate, &channels);
        if (0 != ret) {
-               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get audio type : %d %s", engine->engine_id, engine->engine_name);
+               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get audio type : %s", g_engine_info->engine_name);
                return ret;
        }
 
        SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Create recorder");
 
-       ret = sttd_recorder_create(engine->engine_id, uid, atype, channels, rate);
+       ret = sttd_recorder_create(atype, channels, rate);
        if (0 != ret) {
-               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to create recorder : %d %s", engine->engine_id, engine->engine_name);
+               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to create recorder : %s", g_engine_info->engine_name);
                return ret;
        }
 #endif
 
 #if 0
-       SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Start recorder");
+       SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Start recorder(%d)", uid);
 
-       ret = sttd_recorder_start(engine->engine_id);
+       ret = sttd_recorder_start(uid);
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to start recorder : result(%d)", ret);
                return ret;
        }
 
-       g_recording_engine_id = engine->engine_id;
-       SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] g_recording_engine_id : %d", g_recording_engine_id);
 #endif
 
        return 0;
@@ -1238,15 +813,12 @@ int sttd_engine_agent_recognize_start_engine(int uid, const char* lang, const ch
 
 int sttd_engine_agent_recognize_start_recorder(int uid)
 {
-       sttengine_info_s* engine = NULL;
-       engine = __engine_agent_get_engine_by_uid(uid);
-
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine of uid(%d) is not valid", uid);
+       if (NULL == g_engine_info) {
+               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine is not valid");
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       if (false == engine->is_loaded) {
+       if (false == g_engine_info->is_loaded) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
                return STTD_ERROR_OPERATION_FAILED;
        }
@@ -1254,21 +826,18 @@ int sttd_engine_agent_recognize_start_recorder(int uid)
        SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Start recorder");
 
        int ret;
-       ret = sttd_recorder_start(engine->engine_id);
+       ret = sttd_recorder_start(uid);
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to start recorder : result(%d)", ret);
-               stt_engine_recognize_cancel(engine->engine_id);
-               sttd_recorder_stop(engine->engine_id);
+               stt_engine_recognize_cancel();
+               sttd_recorder_stop();
                return ret;
        }
 
-       g_recording_engine_id = engine->engine_id;
-       SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] g_recording_engine_id : %d", g_recording_engine_id);
-
        return 0;
 }
 
-int sttd_engine_agent_set_recording_data(int uid, const void* data, unsigned int length)
+int sttd_engine_agent_set_recording_data(const void* data, unsigned int length)
 {
        if (false == g_agent_init) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
@@ -1280,20 +849,17 @@ int sttd_engine_agent_set_recording_data(int uid, const void* data, unsigned int
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       sttengine_info_s* engine = NULL;
-       engine = __engine_agent_get_engine_by_uid(uid);
-
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine of uid(%d) is not valid", uid);
+       if (NULL == g_engine_info) {
+               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine is not valid");
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       if (false == engine->is_loaded) {
+       if (false == g_engine_info->is_loaded) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
                return STTD_ERROR_OPERATION_FAILED;
        }
 
-       int ret = stt_engine_set_recording_data(engine->engine_id, data, length);
+       int ret = stt_engine_set_recording_data(data, length);
        if (0 != ret) {
                SLOG(LOG_WARN, TAG_STTD, "[Engine Agent WARNING] set recording error(%d)", ret);
        }
@@ -1301,29 +867,26 @@ int sttd_engine_agent_set_recording_data(int uid, const void* data, unsigned int
        return ret;
 }
 
-int sttd_engine_agent_recognize_stop_recorder(int uid)
+int sttd_engine_agent_recognize_stop_recorder()
 {
        if (false == g_agent_init) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
                return STTD_ERROR_OPERATION_FAILED;
        }
 
-       sttengine_info_s* engine = NULL;
-       engine = __engine_agent_get_engine_by_uid(uid);
-
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine of uid(%d) is not valid", uid);
+       if (NULL == g_engine_info) {
+               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine is not valid");
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       if (false == engine->is_loaded) {
+       if (false == g_engine_info->is_loaded) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
                return STTD_ERROR_OPERATION_FAILED;
        }
 
        SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Stop recorder");
        int ret;
-       ret = sttd_recorder_stop(engine->engine_id);
+       ret = sttd_recorder_stop();
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to stop recorder : result(%d)", ret);
                return ret;
@@ -1331,30 +894,27 @@ int sttd_engine_agent_recognize_stop_recorder(int uid)
 
 #ifdef AUDIO_CREATE_ON_START
        SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Destroy recorder");
-       if (0 != sttd_recorder_destroy(engine->engine_id))
-               SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to destroy recorder(%d)", engine->engine_id);
+       if (0 != sttd_recorder_destroy())
+               SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to destroy recorder");
 #endif
 
        SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent Success] Stop recorder");
        return 0;
 }
 
-int sttd_engine_agent_recognize_stop_engine(int uid)
+int sttd_engine_agent_recognize_stop_engine()
 {
        if (false == g_agent_init) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
                return STTD_ERROR_OPERATION_FAILED;
        }
 
-       sttengine_info_s* engine = NULL;
-       engine = __engine_agent_get_engine_by_uid(uid);
-
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine of uid(%d) is not valid", uid);
+       if (NULL == g_engine_info) {
+               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine is not valid");
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       if (false == engine->is_loaded) {
+       if (false == g_engine_info->is_loaded) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
                return STTD_ERROR_OPERATION_FAILED;
        }
@@ -1362,7 +922,7 @@ int sttd_engine_agent_recognize_stop_engine(int uid)
        SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Stop engine");
 
        int ret;
-       ret = stt_engine_recognize_stop(engine->engine_id);
+       ret = stt_engine_recognize_stop();
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] stop recognition error(%d)", ret);
                return ret;
@@ -1373,22 +933,19 @@ int sttd_engine_agent_recognize_stop_engine(int uid)
        return 0;
 }
 
-int sttd_engine_agent_recognize_cancel(int uid)
+int sttd_engine_agent_recognize_cancel()
 {
        if (false == g_agent_init) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
                return STTD_ERROR_OPERATION_FAILED;
        }
 
-       sttengine_info_s* engine = NULL;
-       engine = __engine_agent_get_engine_by_uid(uid);
-
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine of uid(%d) is not valid", uid);
+       if (NULL == g_engine_info) {
+               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine is not valid");
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       if (false == engine->is_loaded) {
+       if (false == g_engine_info->is_loaded) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
                return STTD_ERROR_OPERATION_FAILED;
        }
@@ -1396,7 +953,7 @@ int sttd_engine_agent_recognize_cancel(int uid)
        SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Cancel engine");
 
        int ret;
-       ret = stt_engine_recognize_cancel(engine->engine_id);
+       ret = stt_engine_recognize_cancel();
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] cancel recognition error(%d)", ret);
                return ret;
@@ -1404,7 +961,7 @@ int sttd_engine_agent_recognize_cancel(int uid)
 
        SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Stop recorder");
 
-       ret = sttd_recorder_stop(engine->engine_id);
+       ret = sttd_recorder_stop();
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to stop recorder : result(%d)", ret);
                return ret;
@@ -1412,12 +969,10 @@ int sttd_engine_agent_recognize_cancel(int uid)
 
 #ifdef AUDIO_CREATE_ON_START
        SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Destroy recorder");
-       if (0 != sttd_recorder_destroy(engine->engine_id))
-               SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to destroy recorder(%d)", engine->engine_id);
+       if (0 != sttd_recorder_destroy())
+               SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to destroy recorder");
 #endif
 
-       g_recording_engine_id = -1;
-
        SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent Success] Cancel recognition");
 
        return 0;
@@ -1442,40 +997,12 @@ int sttd_engine_agent_set_default_engine(const char* engine_uuid)
 
        __log_enginelist();
 
-       sttengine_info_s* engine;
-       engine = __engine_agent_get_engine_by_uuid(engine_uuid);
-       if (NULL == engine) {
+       if (NULL == g_engine_info) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Default engine is not valid");
                return STTD_ERROR_ENGINE_NOT_FOUND;
        }
 
-       SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Default engine id(%d) engine uuid(%s)", engine->engine_id, engine->engine_uuid);
-
-       g_default_engine_id = engine->engine_id;
-
-       /* Update default engine of client */
-       GSList *iter = NULL;
-       sttengine_client_s *data = NULL;
-
-       if (0 < g_slist_length(g_engine_client_list)) {
-               iter = g_slist_nth(g_engine_client_list, 0);
-
-               while (NULL != iter) {
-                       /* Get handle data from list */
-                       data = iter->data;
-
-                       if (true == data->use_default_engine) {
-                               SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] uid(%d) change engine from id(%d) to id(%d)",
-                                       data->uid, data->engine_id, engine->engine_id);
-
-                               if (0 != sttd_engine_agent_load_current_engine(data->uid, NULL)) {
-                                       SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to load current engine : uid(%d)", data->uid);
-                               }
-                       }
-
-                       iter = g_slist_next(iter);
-               }
-       }
+       SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Default engine uuid(%s)", g_engine_info->engine_uuid);
 
        return 0;
 }
@@ -1512,28 +1039,25 @@ int sttd_engine_agent_set_silence_detection(bool value)
        return 0;
 }
 
-int sttd_engine_agent_check_app_agreed(int uid, const char* appid, bool* result)
+int sttd_engine_agent_check_app_agreed(const char* appid, bool* result)
 {
        if (false == g_agent_init) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not Initialized");
                return STTD_ERROR_OPERATION_FAILED;
        }
 
-       sttengine_info_s* engine = NULL;
-       engine = __engine_agent_get_engine_by_uid(uid);
-
-       if (NULL == engine) {
-               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine of uid(%d) is not valid", uid);
+       if (NULL == g_engine_info) {
+               SECURE_SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] The engine of is not valid");
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
-       if (false == engine->is_loaded) {
+       if (false == g_engine_info->is_loaded) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Not loaded engine");
                return STTD_ERROR_OPERATION_FAILED;
        }
 
        int ret;
-       ret = stt_engine_check_app_agreed(engine->engine_id, appid, result);
+       ret = stt_engine_check_app_agreed(appid, result);
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] cancel recognition error(%d)", ret);
                return ret;
@@ -1544,119 +1068,97 @@ int sttd_engine_agent_check_app_agreed(int uid, const char* appid, bool* result)
        return 0;
 }
 
-static void __recorder_destroy(void* data)
-{
-       sttp_result_event_e event = (sttp_result_event_e)data;
-
-       SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Destroy recorder by ecore_thread_safe func");
-
-       if (0 != sttd_recorder_destroy(g_recording_engine_id)) {
-               SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to destroy recorder(%d)", g_recording_engine_id);
-       }
-
-       if (event == STTP_RESULT_EVENT_FINAL_RESULT || event == STTP_RESULT_EVENT_ERROR) {
-               g_recording_engine_id = -1;
-       }
-}
-
-
-/*
-* STT Engine Callback Functions                                                                                        `                                 *
-*/
-
-void __result_cb(sttp_result_event_e event, const char* type, const char** data, int data_count,
+int sttd_engine_agent_send_result(stte_result_event_e event, const char* type, const char** result, int result_count,
                 const char* msg, void* time_info, void *user_data)
 {
        if (false == g_agent_init) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Result Callback : Not Initialized");
-               return;
+               return STTD_ERROR_OPERATION_FAILED;
        }
 
        SLOG(LOG_DEBUG, TAG_STTD, "[Server] === Result time callback ===");
 
        if (NULL != time_info) {
                /* Get the time info */
-               int ret = stt_engine_foreach_result_time(g_recording_engine_id, time_info, __result_time_cb, NULL);
+               int ret = stt_engine_foreach_result_time(time_info, __result_time_cb, NULL);
                if (0 != ret) {
                        SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Fail to get time info : %d", ret);
+                       return ret;
                }
        }
 
        SLOG(LOG_DEBUG, TAG_STTD, "[Server] ============================");
 
-       g_result_cb(event, type, data, data_count, msg, user_data);
+       g_result_cb(event, type, result, result_count, msg, user_data);
 
 #ifdef AUDIO_CREATE_ON_START
-       if (event == STTP_RESULT_EVENT_ERROR) {
-#if 1
-               ecore_main_loop_thread_safe_call_async(__recorder_destroy, (void*)event);
-#else
+       if (event == STTE_RESULT_EVENT_ERROR) {
                SLOG(LOG_DEBUG, TAG_STTD, "[Engine Agent] Destroy recorder");
-               if (0 != sttd_recorder_destroy(g_recording_engine_id))
-                       SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to destroy recorder(%d)", g_recording_engine_id);
-#endif
+               if (0 != sttd_recorder_destroy())
+                       SECURE_SLOG(LOG_WARN, TAG_STTD, "[Engine Agent] Fail to destroy recorder");
        }
 #endif
 
-#ifndef AUDIO_CREATE_ON_START
-       if (event == STTP_RESULT_EVENT_FINAL_RESULT || event == STTP_RESULT_EVENT_ERROR) {
-               g_recording_engine_id = -1;
-       }
-#endif
-       return;
+       return STTD_ERROR_NONE;
 }
 
-bool __result_time_cb(int index, sttp_result_time_event_e event, const char* text, long start_time, long end_time, void* user_data)
+int sttd_engine_agent_send_error(stte_error_e error, const char* msg)
 {
-       return g_result_time_cb(index, event, text, start_time, end_time, user_data);
+       /* check uid */
+       int uid = stt_client_get_current_recognition();
+
+       char* err_msg = strdup(msg);
+       int ret = STTE_ERROR_NONE;
+
+       ret = sttdc_send_error_signal(uid, error, err_msg);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to send error info.");
+       }
+
+       if (NULL != err_msg) {
+               free(err_msg);
+               err_msg = NULL;
+       }
+
+       g_error_cb(error, msg);
+
+       return ret;
 }
 
-void __detect_silence_cb(sttp_silence_type_e type, void* user_data)
+int sttd_engine_agent_send_speech_status(stte_speech_status_e status, void* user_data)
 {
        if (false == g_agent_init) {
                SLOG(LOG_ERROR, TAG_STTD, "[Engine Agent ERROR] Silence Callback : Not Initialized");
-               return;
+               return STTD_ERROR_OPERATION_FAILED;
        }
 
-       g_silence_cb(type, user_data);
-       return;
+       g_speech_status_cb(status, user_data);
+       return STTD_ERROR_NONE;
+}
+
+bool __result_time_cb(int index, stte_result_time_event_e event, const char* text, long start_time, long end_time, void* user_data)
+{
+       return g_result_time_cb(index, event, text, start_time, end_time, user_data);
 }
 
 /* A function forging */
 int __log_enginelist()
 {
-       GSList *iter = NULL;
-       sttengine_info_s *data = NULL;
-
-       if (0 < g_slist_length(g_engine_list)) {
-
-               /* Get a first item */
-               iter = g_slist_nth(g_engine_list, 0);
-
-               SLOG(LOG_DEBUG, TAG_STTD, "--------------- engine list -------------------");
-
-               int i = 1;
-               while (NULL != iter) {
-                       /* Get handle data from list */
-                       data = iter->data;
-
-                       SECURE_SLOG(LOG_DEBUG, TAG_STTD, "[%dth]", i);
-                       SECURE_SLOG(LOG_DEBUG, TAG_STTD, "  engine uuid : %s", data->engine_uuid);
-                       SECURE_SLOG(LOG_DEBUG, TAG_STTD, "  engine name : %s", data->engine_name);
-                       SECURE_SLOG(LOG_DEBUG, TAG_STTD, "  engine path : %s", data->engine_path);
-                       SECURE_SLOG(LOG_DEBUG, TAG_STTD, "  use network : %s", data->use_network ? "true" : "false");
-                       SECURE_SLOG(LOG_DEBUG, TAG_STTD, "  is loaded : %s", data->is_loaded ? "true" : "false");
-                       if (NULL != data->first_lang)
-                               SECURE_SLOG(LOG_DEBUG, TAG_STTD, "  default lang : %s", data->first_lang);
-
-                       iter = g_slist_next(iter);
-                       i++;
+       if (NULL != g_engine_info) {
+               SLOG(LOG_DEBUG, TAG_STTD, "------------------ engine -----------------------");
+               SLOG(LOG_DEBUG, TAG_STTD, "engine uuid : %s", g_engine_info->engine_uuid);
+               SLOG(LOG_DEBUG, TAG_STTD, "engine name : %s", g_engine_info->engine_name);
+               SLOG(LOG_DEBUG, TAG_STTD, "engine path : %s", g_engine_info->engine_path);
+               SLOG(LOG_DEBUG, TAG_STTD, "use network : %s", g_engine_info->use_network ? "true" : "false");
+               SLOG(LOG_DEBUG, TAG_STTD, "is loaded   : %s", g_engine_info->is_loaded ? "true" : "false");
+               if (NULL != g_engine_info->first_lang) {
+                       SLOG(LOG_DEBUG, TAG_STTD, "default lang : %s", g_engine_info->first_lang);
                }
-               SLOG(LOG_DEBUG, TAG_STTD, "----------------------------------------------");
+               SLOG(LOG_DEBUG, TAG_STTD, "-------------------------------------------------");
        } else {
-               SLOG(LOG_DEBUG, TAG_STTD, "-------------- engine list -------------------");
-               SLOG(LOG_DEBUG, TAG_STTD, "  No Engine in engine directory");
-               SLOG(LOG_DEBUG, TAG_STTD, "----------------------------------------------");
+               SLOG(LOG_DEBUG, TAG_STTD, "------------------ engine -----------------------");
+               SLOG(LOG_DEBUG, TAG_STTD, "     No engine");
+               SLOG(LOG_DEBUG, TAG_STTD, "-------------------------------------------------");
        }
 
        return 0;
index 8217b3e..2175f35 100644 (file)
@@ -17,7 +17,7 @@
 #define __STTD_ENGINE_AGENT_H_
 
 #include "sttd_main.h"
-#include "sttp.h"
+#include "stte.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -29,14 +29,15 @@ extern "C" {
 
 #define        ENGINE_PATH_SIZE 256
 
-typedef void (*result_callback)(sttp_result_event_e event, const char* type, 
+typedef void (*result_callback)(stte_result_event_e event, const char* type, 
                                const char** data, int data_count, const char* msg, void *user_data);
 
-typedef bool (*result_time_callback)(int index, sttp_result_time_event_e event, const char* text, 
+typedef bool (*result_time_callback)(int index, stte_result_time_event_e event, const char* text, 
                                long start_time, long end_time, void *user_data);
 
-typedef void (*silence_dectection_callback)(sttp_silence_type_e type, void *user_data);
+typedef void (*speech_status_callback)(stte_speech_status_e status, void *user_data);
 
+typedef void (*error_callback)(stte_error_e error, const char* msg);
 
 
 /*
@@ -45,43 +46,43 @@ typedef void (*silence_dectection_callback)(sttp_silence_type_e type, void *user
 
 /** Init / Release engine agent */
 int sttd_engine_agent_init(result_callback result_cb, result_time_callback time_cb, 
-                          silence_dectection_callback silence_cb);
+                          speech_status_callback speech_status_cb, error_callback error_cb);
 
 int sttd_engine_agent_release();
 
 
 /** Manage engine */
-int sttd_engine_agent_initialize_engine_list();
+int sttd_engine_agent_initialize_engine_list(stte_request_callback_s *callback);
 
 
 /** load / unload engine */
-int sttd_engine_agent_load_current_engine(int uid, const char* engine_uuid);
+int sttd_engine_agent_load_current_engine(stte_request_callback_s *callback);
 
-int sttd_engine_agent_unload_current_engine(int uid);
+int sttd_engine_agent_unload_current_engine();
 
 bool sttd_engine_agent_is_default_engine();
 
 int sttd_engine_agent_get_engine_list(GSList** engine_list);
 
-int sttd_engine_agent_get_current_engine(int uid, char** engine_uuid);
+int sttd_engine_agent_get_current_engine(char** engine_uuid);
 
 
 /** Get/Set app option */
-bool sttd_engine_agent_need_network(int uid);
+bool sttd_engine_agent_need_network();
 
-int sttd_engine_agent_supported_langs(int uid, GSList** lang_list);
+int sttd_engine_agent_supported_langs(GSList** lang_list);
 
-int sttd_engine_agent_get_default_lang(int uid, char** lang);
+int sttd_engine_agent_get_default_lang(char** lang);
 
-int sttd_engine_agent_set_private_data(int uid, const char* key, const char* data);
+int sttd_engine_agent_set_private_data(const char* key, const char* data);
 
-int sttd_engine_agent_get_private_data(int uid, const char* key, char** data);
+int sttd_engine_agent_get_private_data(const char* key, char** data);
 
-int sttd_engine_agent_get_option_supported(int uid, bool* silence);
+int sttd_engine_agent_get_option_supported(bool* silence);
 
 int sttd_engine_agent_is_credential_needed(int uid, bool* credential);
 
-int sttd_engine_agent_is_recognition_type_supported(int uid, const char* type, bool* support);
+int sttd_engine_agent_is_recognition_type_supported(const char* type, bool* support);
 
 int sttd_engine_agent_set_default_engine(const char* engine_uuid);
 
@@ -89,23 +90,31 @@ int sttd_engine_agent_set_default_language(const char* language);
 
 int sttd_engine_agent_set_silence_detection(bool value);
 
-int sttd_engine_agent_check_app_agreed(int uid, const char* appid, bool* result);
+int sttd_engine_agent_check_app_agreed(const char* appid, bool* result);
 
 /** Control engine */
 int sttd_engine_agent_recognize_start_engine(int uid, const char* lang, const char* recognition_type, 
-                               int silence, const char* credential, void* user_param);
+                               int silence, const char* appid, const char* credential, void* user_param);
 
 int sttd_engine_agent_recognize_start_recorder(int uid);
 
-int sttd_engine_agent_set_recording_data(int uid, const void* data, unsigned int length);
+int sttd_engine_agent_set_recording_data(const void* data, unsigned int length);
 
-int sttd_engine_agent_recognize_stop(int uid);
+int sttd_engine_agent_recognize_stop();
 
-int sttd_engine_agent_recognize_stop_recorder(int uid);
+int sttd_engine_agent_recognize_stop_recorder();
 
-int sttd_engine_agent_recognize_stop_engine(int uid);
+int sttd_engine_agent_recognize_stop_engine();
 
-int sttd_engine_agent_recognize_cancel(int uid);
+int sttd_engine_agent_recognize_cancel();
+
+/** Send engine's information */
+int sttd_engine_agent_send_result(stte_result_event_e event, const char* type, const char** result, int result_count,
+                const char* msg, void* time_info, void *user_data);
+
+int sttd_engine_agent_send_error(stte_error_e error, const char* msg);
+
+int sttd_engine_agent_send_speech_status(stte_speech_status_e status, void* user_data);
 
 
 #ifdef __cplusplus
index ac773e3..25a10ce 100644 (file)
@@ -43,7 +43,7 @@ typedef enum {
        STTD_ERROR_OUT_OF_MEMORY                = TIZEN_ERROR_OUT_OF_MEMORY,    /**< Out of Memory */
        STTD_ERROR_IO_ERROR                     = TIZEN_ERROR_IO_ERROR,         /**< I/O error */
        STTD_ERROR_INVALID_PARAMETER            = TIZEN_ERROR_INVALID_PARAMETER,/**< Invalid parameter */
-       STTD_ERROR_TIMED_OUT                    = TIZEN_ERROR_TIMED_OUT,        /**< No answer from the daemon */
+       STTD_ERROR_TIMED_OUT                    = TIZEN_ERROR_TIMED_OUT,        /**< No answer from the STT service */
        STTD_ERROR_RECORDER_BUSY                = TIZEN_ERROR_RESOURCE_BUSY,    /**< Device or resource busy */
        STTD_ERROR_OUT_OF_NETWORK               = TIZEN_ERROR_NETWORK_DOWN,     /**< Network is down */
        STTD_ERROR_PERMISSION_DENIED            = TIZEN_ERROR_PERMISSION_DENIED,/**< Permission denied */
index 75c0fa3..dc5f660 100644 (file)
@@ -28,7 +28,6 @@
 #include "sttd_dbus.h"
 #include "sttd_recorder.h"
 #include "sttd_main.h"
-#include "sttp.h"
 
 
 #define FRAME_LENGTH 160
@@ -43,15 +42,12 @@ typedef enum {
 } sttd_recorder_state;
 
 typedef struct {
-       int                     engine_id;
        int                     uid;
        audio_in_h              audio_h;
-       sttp_audio_type_e       audio_type;
+       stte_audio_type_e       audio_type;
 } stt_recorder_s;
 
-static GSList *g_recorder_list;
-
-static int g_recording_engine_id;
+static stt_recorder_s* g_recorder = NULL;
 
 static stt_recorder_audio_cb   g_audio_cb;
 
@@ -100,17 +96,15 @@ static void _bt_hid_audio_data_receive_cb(bt_hid_voice_data_s *voice_data, void
        if (NULL != g_audio_cb) {
                if (0 != g_audio_cb((void*)voice_data->audio_buf, (unsigned int)voice_data->length)) {
                        SLOG(LOG_ERROR, TAG_STTD, "[Recorder ERROR] Fail to read audio");
-                       sttd_recorder_stop(g_recording_engine_id);
+                       sttd_recorder_stop();
                }
 
-               stt_recorder_s* recorder;
-               recorder = __get_recorder(g_recording_engine_id);
-               if (NULL == recorder) {
+               if (NULL == g_recorder) {
                        return;
                }
 
-               float vol_db = get_volume_decibel((char*)voice_data->audio_buf, (int)voice_data->length, recorder->audio_type);
-               if (0 != sttdc_send_set_volume(recorder->uid, vol_db)) {
+               float vol_db = get_volume_decibel((char*)voice_data->audio_buf, (int)voice_data->length, g_recorder->audio_type);
+               if (0 != sttdc_send_set_volume(g_recorder->uid, vol_db)) {
                        SLOG(LOG_ERROR, TAG_STTD, "[Recorder] Fail to send recording volume(%f)", vol_db);
                }
        }
@@ -209,7 +203,7 @@ int sttd_recorder_initialize(stt_recorder_audio_cb audio_cb, stt_recorder_interr
        g_audio_cb = audio_cb;
        g_interrupt_cb = interrupt_cb;
        g_recorder_state = STTD_RECORDER_STATE_NONE;
-       g_recording_engine_id = -1;
+       g_recorder = NULL;
 
        if (0 != sound_manager_create_stream_information(SOUND_STREAM_TYPE_VOICE_RECOGNITION, __recorder_focus_state_cb, NULL, &g_stream_info_h)) {
                SLOG(LOG_ERROR, TAG_STTD, "[Recorder ERROR] Fail to create stream info");
@@ -240,6 +234,14 @@ int sttd_recorder_deinitialize()
                SLOG(LOG_ERROR, TAG_STTD, "[Recorder ERROR] Fail to destroy stream info");
        }
 
+       if (NULL != g_recorder) {
+               audio_in_destroy(g_recorder->audio_h);
+               g_recorder->audio_h = NULL;
+               free(g_recorder);
+               g_recorder = NULL;
+       }
+
+#ifdef __UNUSED_CODES__
        /* Remove all recorder */
        GSList *iter = NULL;
        stt_recorder_s *recorder = NULL;
@@ -260,6 +262,7 @@ int sttd_recorder_deinitialize()
 
                iter = g_slist_nth(g_recorder_list, 0);
        }
+#endif
 
 #ifdef TV_BT_MODE
        bt_hid_host_deinitialize();
@@ -272,26 +275,6 @@ int sttd_recorder_deinitialize()
        return 0;
 }
 
-static stt_recorder_s* __get_recorder(int engine_id)
-{
-       GSList *iter = NULL;
-       stt_recorder_s *recorder = NULL;
-
-       iter = g_slist_nth(g_recorder_list, 0);
-
-       while (NULL != iter) {
-               recorder = iter->data;
-
-               if (recorder->engine_id == engine_id) {
-                       return recorder;
-               }
-
-               iter = g_slist_next(iter);
-       }
-
-       return NULL;
-}
-
 int sttd_recorder_set_audio_session()
 {
        return 0;
@@ -302,10 +285,10 @@ int sttd_recorder_unset_audio_session()
        return 0;
 }
 
-int sttd_recorder_create(int engine_id, int uid, sttp_audio_type_e type, int channel, unsigned int sample_rate)
+int sttd_recorder_create(stte_audio_type_e type, int channel, unsigned int sample_rate)
 {
        /* Check engine id is valid */
-       if (NULL != __get_recorder(engine_id)) {
+       if (NULL != g_recorder) {
                SLOG(LOG_WARN, TAG_STTD, "[Recorder WARNING] Engine id is already registered");
                return STTD_ERROR_INVALID_PARAMETER;
        }
@@ -326,8 +309,8 @@ int sttd_recorder_create(int engine_id, int uid, sttp_audio_type_e type, int cha
        }
 
        switch (type) {
-       case STTP_AUDIO_TYPE_PCM_S16_LE:        audio_type = AUDIO_SAMPLE_TYPE_S16_LE;  break;
-       case STTP_AUDIO_TYPE_PCM_U8:            audio_type = AUDIO_SAMPLE_TYPE_U8;      break;
+       case STTE_AUDIO_TYPE_PCM_S16_LE:        audio_type = AUDIO_SAMPLE_TYPE_S16_LE;  break;
+       case STTE_AUDIO_TYPE_PCM_U8:            audio_type = AUDIO_SAMPLE_TYPE_U8;      break;
        default:
                SLOG(LOG_ERROR, TAG_STTD, "[Recorder ERROR] Invalid Audio Type");
                return STTD_ERROR_OPERATION_FAILED;
@@ -360,28 +343,25 @@ int sttd_recorder_create(int engine_id, int uid, sttp_audio_type_e type, int cha
                return STTD_ERROR_OUT_OF_MEMORY;
        }
 
-       recorder->engine_id = engine_id;
-       recorder->uid = uid;
+       recorder->uid = -1;
        recorder->audio_h = temp_in_h;
        recorder->audio_type = type;
 
-       g_recorder_list = g_slist_append(g_recorder_list, recorder);
+       g_recorder = recorder;
 
        g_recorder_state = STTD_RECORDER_STATE_READY;
 
        return 0;
 }
 
-int sttd_recorder_destroy(int engine_id)
+int sttd_recorder_destroy()
 {
        // critical section required because this function can be called from stt engine thread context
        SLOG(LOG_WARN, TAG_STTD, "[Recorder WARNING] Enter critical section");
        pthread_mutex_lock(&sttd_audio_in_handle_mutex);
 
        /* Check engine id is valid */
-       stt_recorder_s* recorder;
-       recorder = __get_recorder(engine_id);
-       if (NULL == recorder) {
+       if (NULL == g_recorder) {
                SLOG(LOG_WARN, TAG_STTD, "[Recorder WARNING] Engine id is not valid");
                pthread_mutex_unlock(&sttd_audio_in_handle_mutex);
                return STTD_ERROR_INVALID_PARAMETER;
@@ -390,8 +370,8 @@ int sttd_recorder_destroy(int engine_id)
 #ifndef TV_BT_MODE
        int ret;
        if (STTD_RECORDER_STATE_RECORDING == g_recorder_state) {
-               if (recorder->audio_h) {
-                       ret = audio_in_unprepare(recorder->audio_h);
+               if (g_recorder->audio_h) {
+                       ret = audio_in_unprepare(g_recorder->audio_h);
                        if (AUDIO_IO_ERROR_NONE != ret) {
                                SLOG(LOG_ERROR, TAG_STTD, "[Recorder ERROR] Fail to unprepare audioin : %d", ret);
                        }
@@ -400,13 +380,14 @@ int sttd_recorder_destroy(int engine_id)
                g_recorder_state = STTD_RECORDER_STATE_READY;
        }
 
-       if (recorder->audio_h) {
-               ret = audio_in_destroy(recorder->audio_h);
+       if (g_recorder->audio_h) {
+               ret = audio_in_destroy(g_recorder->audio_h);
                if (AUDIO_IO_ERROR_NONE != ret) {
                        SLOG(LOG_ERROR, TAG_STTD, "[Recorder ERROR] Fail to destroy audioin : %d", ret);
                }
-               recorder->audio_h = NULL;
+               g_recorder->audio_h = NULL;
        }
+
 #else
        if (STTD_RECORDER_STATE_RECORDING == g_recorder_state) {
                g_recorder_state = STTD_RECORDER_STATE_READY;
@@ -415,9 +396,8 @@ int sttd_recorder_destroy(int engine_id)
        bt_hid_unset_audio_data_receive_cb();
 #endif
 
-       g_recorder_list = g_slist_remove(g_recorder_list, recorder);
-
-       free(recorder);
+       free(g_recorder);
+       g_recorder = NULL;
 
        pthread_mutex_unlock(&sttd_audio_in_handle_mutex);
        SLOG(LOG_WARN, TAG_STTD, "[Recorder WARNING] Leave critical section");
@@ -425,7 +405,7 @@ int sttd_recorder_destroy(int engine_id)
        return 0;
 }
 
-static float get_volume_decibel(char* data, int size, sttp_audio_type_e type)
+static float get_volume_decibel(char* data, int size, stte_audio_type_e type)
 {
        #define MAX_AMPLITUDE_MEAN_16   32768
        #define MAX_AMPLITUDE_MEAN_08   128
@@ -437,7 +417,7 @@ static float get_volume_decibel(char* data, int size, sttp_audio_type_e type)
        float rms = 0.0;
        unsigned long long square_sum = 0;
 
-       if (type == STTP_AUDIO_TYPE_PCM_S16_LE)
+       if (type == STTE_AUDIO_TYPE_PCM_S16_LE)
                depthByte = 2;
        else
                depthByte = 1;
@@ -475,9 +455,7 @@ Eina_Bool __read_audio_func(void *data)
        static char g_buffer[BUFFER_LENGTH];
 
        /* Check engine id is valid */
-       stt_recorder_s* recorder;
-       recorder = __get_recorder(g_recording_engine_id);
-       if (NULL == recorder) {
+       if (NULL == g_recorder) {
                return EINA_FALSE;
        }
 
@@ -486,7 +464,7 @@ Eina_Bool __read_audio_func(void *data)
                return EINA_FALSE;
        }
 
-       read_byte = audio_in_read(recorder->audio_h, g_buffer, BUFFER_LENGTH);
+       read_byte = audio_in_read(g_recorder->audio_h, g_buffer, BUFFER_LENGTH);
        if (0 > read_byte) {
                SLOG(LOG_WARN, TAG_STTD, "[Recorder WARNING] Fail to read audio : %d", read_byte);
                g_recorder_state = STTD_RECORDER_STATE_READY;
@@ -495,13 +473,13 @@ Eina_Bool __read_audio_func(void *data)
 
        if (0 != g_audio_cb(g_buffer, read_byte)) {
                SLOG(LOG_WARN, TAG_STTD, "[Recorder WARNING] Fail audio callback");
-               sttd_recorder_stop(g_recording_engine_id);
+               sttd_recorder_stop();
                return EINA_FALSE;
        }
 
        if (0 == g_buffer_count % 30) {
-               float vol_db = get_volume_decibel(g_buffer, BUFFER_LENGTH, recorder->audio_type);
-               if (0 != sttdc_send_set_volume(recorder->uid, vol_db)) {
+               float vol_db = get_volume_decibel(g_buffer, BUFFER_LENGTH, g_recorder->audio_type);
+               if (0 != sttdc_send_set_volume(g_recorder->uid, vol_db)) {
                        SLOG(LOG_ERROR, TAG_STTD, "[Recorder] Fail to send recording volume(%f)", vol_db);
                }
        }
@@ -526,7 +504,7 @@ Eina_Bool __read_audio_func(void *data)
 }
 #endif
 
-int sttd_recorder_start(int engine_id)
+int sttd_recorder_start(int uid)
 {
        if (STTD_RECORDER_STATE_RECORDING == g_recorder_state)
                return 0;
@@ -534,9 +512,7 @@ int sttd_recorder_start(int engine_id)
        int ret = -1;
 #ifndef TV_BT_MODE
        /* Check engine id is valid */
-       stt_recorder_s* recorder;
-       recorder = __get_recorder(engine_id);
-       if (NULL == recorder) {
+       if (NULL == g_recorder) {
                SLOG(LOG_WARN, TAG_STTD, "[Recorder WARNING] Engine id is not valid");
                return STTD_ERROR_INVALID_PARAMETER;
        }
@@ -545,13 +521,13 @@ int sttd_recorder_start(int engine_id)
        if (SOUND_MANAGER_ERROR_NONE != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Recorder ERROR] Fail to acquire focus : %d", ret);
        } else {
-               ret = audio_in_set_stream_info(recorder->audio_h, g_stream_info_h);
+               ret = audio_in_set_stream_info(g_recorder->audio_h, g_stream_info_h);
                if (AUDIO_IO_ERROR_NONE != ret) {
                        SLOG(LOG_ERROR, TAG_STTD, "[Recorder ERROR] Fail to set stream info");
                }
        }
 
-       ret = audio_in_prepare(recorder->audio_h);
+       ret = audio_in_prepare(g_recorder->audio_h);
        if (AUDIO_IO_ERROR_NONE != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Recorder ERROR] Fail to start audio : %d", ret);
                return STTD_ERROR_RECORDER_BUSY;
@@ -585,7 +561,7 @@ int sttd_recorder_start(int engine_id)
        }
 #endif
        g_recorder_state = STTD_RECORDER_STATE_RECORDING;
-       g_recording_engine_id = engine_id;
+       g_recorder->uid = uid;
 
        g_buffer_count = 0;
 
@@ -606,22 +582,22 @@ int sttd_recorder_start(int engine_id)
        return 0;
 }
 
-int sttd_recorder_stop(int engine_id)
+int sttd_recorder_stop()
 {
        if (STTD_RECORDER_STATE_READY == g_recorder_state)
                return 0;
 
        /* Check engine id is valid */
-       stt_recorder_s* recorder;
-       recorder = __get_recorder(engine_id);
-       if (NULL == recorder) {
+       if (NULL == g_recorder) {
                SLOG(LOG_WARN, TAG_STTD, "[Recorder WARNING] Engine id is not valid");
                return STTD_ERROR_INVALID_PARAMETER;
        }
 
+       g_recorder->uid = -1;
+
        int ret;
 #ifndef TV_BT_MODE
-       ret = audio_in_unprepare(recorder->audio_h);
+       ret = audio_in_unprepare(g_recorder->audio_h);
        if (AUDIO_IO_ERROR_NONE != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Recorder ERROR] Fail to unprepare audioin : %d", ret);
        }
@@ -649,7 +625,6 @@ int sttd_recorder_stop(int engine_id)
 #endif
 
        g_recorder_state = STTD_RECORDER_STATE_READY;
-       g_recording_engine_id = -1;
 
        ret = sound_manager_release_focus(g_stream_info_h, SOUND_STREAM_FOCUS_FOR_RECORDING, NULL);
        if (SOUND_MANAGER_ERROR_NONE != ret) {
index 7cf6946..946a283 100644 (file)
@@ -15,7 +15,7 @@
 #ifndef __STTD_RECORDER_H__
 #define __STTD_RECORDER_H__
 
-#include "sttp.h"
+#include "stte.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -34,13 +34,14 @@ int sttd_recorder_set_audio_session();
 
 int sttd_recorder_unset_audio_session();
 
-int sttd_recorder_create(int engine_id, int uid, sttp_audio_type_e type, int channel, unsigned int sample_rate);
+int sttd_recorder_create(stte_audio_type_e type, int channel, unsigned int sample_rate);
 
-int sttd_recorder_destroy(int engine_id);
+int sttd_recorder_destroy();
 
-int sttd_recorder_start(int engine_id);
+int sttd_recorder_start(int uid);
+
+int sttd_recorder_stop();
 
-int sttd_recorder_stop(int engine_id);
 
 #ifdef __cplusplus
 }
index b782585..b39402f 100644 (file)
@@ -92,7 +92,7 @@ static void __cancel_recognition_internal()
 
        if (0 != uid) {
                /* cancel engine recognition */
-               int ret = sttd_engine_agent_recognize_cancel(uid);
+               int ret = sttd_engine_agent_recognize_cancel();
                if (0 != ret) {
                        SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to cancel : result(%d)", ret);
                }
@@ -135,7 +135,7 @@ int __server_audio_recorder_callback(const void* data, const unsigned int length
 
        uid = stt_client_get_current_recognition();
        if (0 != uid) {
-               ret = sttd_engine_agent_set_recording_data(uid, data, length);
+               ret = sttd_engine_agent_set_recording_data(data, length);
                if (ret < 0) {
                        ecore_main_loop_thread_safe_call_async(__cancel_by_error, NULL);
                        return -1;
@@ -179,7 +179,7 @@ void __cancel_by_no_record(void *data)
        return;
 }
 
-void __server_recognition_result_callback(sttp_result_event_e event, const char* type,
+void __server_recognition_result_callback(stte_result_event_e event, const char* type,
                                        const char** data, int data_count, const char* msg, void *user_data)
 {
        // critical section
@@ -202,7 +202,7 @@ void __server_recognition_result_callback(sttp_result_event_e event, const char*
        SLOG(LOG_DEBUG, TAG_STTD, "[Server] uid (%d), event(%d)", uid, event);
 
        /* send result to client */
-       if (STTP_RESULT_EVENT_FINAL_RESULT == event) {
+       if (STTE_RESULT_EVENT_FINAL_RESULT == event) {
                if (APP_STATE_PROCESSING != state) {
                        SLOG(LOG_WARN, TAG_STTD, "[Server WARNING] Current state is NOT 'Processing'.");
                }
@@ -241,7 +241,7 @@ void __server_recognition_result_callback(sttp_result_event_e event, const char*
                sttd_client_set_state(uid, APP_STATE_READY);
                stt_client_unset_current_recognition();
 
-       } else if (STTP_RESULT_EVENT_PARTIAL_RESULT == event) {
+       } else if (STTE_RESULT_EVENT_PARTIAL_RESULT == event) {
                SLOG(LOG_DEBUG, TAG_STTD, "[Server] The partial result from engine is event[%d] data_count[%d]", event,  data_count);
 
                sttd_config_time_save();
@@ -256,7 +256,7 @@ void __server_recognition_result_callback(sttp_result_event_e event, const char*
                        }
                }
 
-       } else if (STTP_RESULT_EVENT_ERROR == event) {
+       } else if (STTE_RESULT_EVENT_ERROR == event) {
                SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] The event of recognition result is ERROR");
 
                /* Delete timer for processing time out */
@@ -290,7 +290,7 @@ void __server_recognition_result_callback(sttp_result_event_e event, const char*
        return;
 }
 
-bool __server_result_time_callback(int index, sttp_result_time_event_e event, const char* text, long start_time, long end_time, void* user_data)
+bool __server_result_time_callback(int index, stte_result_time_event_e event, const char* text, long start_time, long end_time, void* user_data)
 {
        pthread_mutex_lock(&sttpe_result_time_mutex);
 
@@ -315,9 +315,9 @@ bool __server_result_time_callback(int index, sttp_result_time_event_e event, co
        return true;
 }
 
-void __server_silence_dectection_callback(sttp_silence_type_e type, void *user_param)
+void __server_speech_status_callback(stte_speech_status_e status, void *user_param)
 {
-       SLOG(LOG_DEBUG, TAG_STTD, "===== Silence Detection Callback");
+       SLOG(LOG_DEBUG, TAG_STTD, "===== Speech status detected Callback");
 
        int uid = stt_client_get_current_recognition();
        if (0 != uid) {
@@ -332,14 +332,10 @@ void __server_silence_dectection_callback(sttp_silence_type_e type, void *user_p
                        return;
                }
 
-               if (STTP_SILENCE_TYPE_NO_RECORD_TIMEOUT == type) {
-                       SLOG(LOG_DEBUG, TAG_STTD, "Silence Detection type - No Record");
-                       ecore_main_loop_thread_safe_call_async(__cancel_by_no_record, NULL);
-                       if (0 != sttdc_send_error_signal(uid, STTP_ERROR_NO_SPEECH, "No speech while recording")) {
-                               SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] No speech while recording");
-                       }
-               } else if (STTP_SILENCE_TYPE_END_OF_SPEECH_DETECTED == type) {
-                       SLOG(LOG_DEBUG, TAG_STTD, "Silence Detection type - End of Speech");
+               if (STTE_SPEECH_STATUS_BEGINNING_POINT_DETECTED == status) {
+                       SLOG(LOG_DEBUG, TAG_STTD, "Begin Speech detected");
+               } else if (STTE_SPEECH_STATUS_END_POINT_DETECTED == status) {
+                       SLOG(LOG_DEBUG, TAG_STTD, "End Speech detected");
                        ecore_main_loop_thread_safe_call_async(__stop_by_silence, NULL);
                }
        } else {
@@ -352,6 +348,12 @@ void __server_silence_dectection_callback(sttp_silence_type_e type, void *user_p
        return;
 }
 
+void __server_error_callback(stte_error_e error, const char* msg)
+{
+       SLOG(LOG_DEBUG, TAG_STTD, "[Server] Error Callback is called");
+       return;
+}
+
 void __sttd_server_engine_changed_cb(const char* engine_id, const char* language, bool support_silence, bool need_credential, void* user_data)
 {
        if (NULL == engine_id) {
@@ -462,7 +464,7 @@ static void __register_sig_handler()
        signal(SIGQUIT, __sig_handler);
 }
 
-int sttd_initialize()
+int sttd_initialize(stte_request_callback_s *callback)
 {
        int ret = 0;
 
@@ -489,21 +491,17 @@ int sttd_initialize()
 
        /* Engine Agent initialize */
        ret = sttd_engine_agent_init(__server_recognition_result_callback, __server_result_time_callback,
-               __server_silence_dectection_callback);
+               __server_speech_status_callback, __server_error_callback);
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to engine agent initialize : result(%d)", ret);
                return ret;
        }
 
-       /* Update engine list */
-       ret = sttd_engine_agent_initialize_engine_list();
+       /* load engine */
+       ret = sttd_engine_agent_load_current_engine(callback);
        if (0 != ret) {
-               if (STTD_ERROR_ENGINE_NOT_FOUND == ret) {
-                       SLOG(LOG_WARN, TAG_STTD, "[Server WARNING] There is no stt engine");
-               } else {
-                       SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to update engine list : %d", ret);
-                       return ret;
-               }
+               SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to load default engine");
+               return ret;
        }
 
        SLOG(LOG_DEBUG, TAG_STTD, "[Server SUCCESS] initialize");
@@ -649,16 +647,6 @@ Eina_Bool sttd_cleanup_client(void *data)
 
 int sttd_server_initialize(int pid, int uid, bool* silence, bool* credential)
 {
-       if (false == sttd_engine_agent_is_default_engine()) {
-               /* Update installed engine */
-               sttd_engine_agent_initialize_engine_list();
-
-               if (false == sttd_engine_agent_is_default_engine()) {
-                       SLOG(LOG_WARN, TAG_STTD, "[Server WARNING] No stt-engine");
-                       return STTD_ERROR_ENGINE_NOT_FOUND;
-               }
-       }
-
        int ret = STTD_ERROR_NONE;
 
        /* check if uid is valid */
@@ -668,14 +656,7 @@ int sttd_server_initialize(int pid, int uid, bool* silence, bool* credential)
                return STTD_ERROR_NONE;
        }
 
-       /* load engine */
-       ret = sttd_engine_agent_load_current_engine(uid, NULL);
-       if (0 != ret) {
-               SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to load default engine");
-               return ret;
-       }
-
-       ret = sttd_engine_agent_get_option_supported(uid, silence);
+       ret = sttd_engine_agent_get_option_supported(silence);
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to get engine options supported");
                return ret;
@@ -699,7 +680,14 @@ int sttd_server_initialize(int pid, int uid, bool* silence, bool* credential)
 
 static Eina_Bool __quit_ecore_loop(void *data)
 {
+       SLOG(LOG_DEBUG, TAG_STTD, "[Server] Quit");
+
+       stt_network_finalize();
+       sttd_finalize();
        ecore_main_loop_quit();
+
+       SLOG(LOG_DEBUG, TAG_STTD, "");
+
        return EINA_FALSE;
 }
 
@@ -735,10 +723,6 @@ int sttd_server_finalize(int uid)
                stt_client_unset_current_recognition();
        }
 
-       if (0 != sttd_engine_agent_unload_current_engine(uid)) {
-               SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to unload engine");
-       }
-
        /* Remove client information */
        if (0 != sttd_client_delete(uid)) {
                SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to delete client");
@@ -794,13 +778,13 @@ int sttd_server_set_current_engine(int uid, const char* engine_id, bool* silence
        }
 
        int ret;
-       ret = sttd_engine_agent_load_current_engine(uid, engine_id);
+       ret = sttd_engine_agent_load_current_engine(NULL);
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to set engine : %d", ret);
                return ret;
        }
 
-       ret = sttd_engine_agent_get_option_supported(uid, silence);
+       ret = sttd_engine_agent_get_option_supported(silence);
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to engine options : %d", ret);
                return ret;
@@ -830,7 +814,7 @@ int sttd_server_get_current_engine(int uid, char** engine_id)
        }
 
        int ret;
-       ret = sttd_engine_agent_get_current_engine(uid, engine_id);
+       ret = sttd_engine_agent_get_current_engine(engine_id);
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to get engine : %d", ret);
                return ret;
@@ -857,7 +841,7 @@ int sttd_server_check_app_agreed(int uid, const char* appid, bool* available)
        /* Ask engine available */
        int ret;
        bool temp = false;
-       ret = sttd_engine_agent_check_app_agreed(uid, appid, &temp);
+       ret = sttd_engine_agent_check_app_agreed(appid, &temp);
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to get engine available : %d", ret);
                return ret;
@@ -884,7 +868,7 @@ int sttd_server_get_supported_languages(int uid, GSList** lang_list)
        }
 
        /* get language list from engine */
-       int ret = sttd_engine_agent_supported_langs(uid, lang_list);
+       int ret = sttd_engine_agent_supported_langs(lang_list);
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to get supported languages");
                return ret;
@@ -910,7 +894,7 @@ int sttd_server_get_current_langauage(int uid, char** current_lang)
        }
 
        /*get current language from engine */
-       int ret = sttd_engine_agent_get_default_lang(uid, current_lang);
+       int ret = sttd_engine_agent_get_default_lang(current_lang);
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to get default language :result(%d)", ret);
                return ret;
@@ -937,7 +921,7 @@ int sttd_server_set_private_data(int uid, const char* key, const char* data)
 
        /* set private data to engine */
        int ret = -1;
-       ret = sttd_engine_agent_set_private_data(uid, key, data);
+       ret = sttd_engine_agent_set_private_data(key, data);
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to set private data :result(%d)", ret);
                return ret;
@@ -964,13 +948,13 @@ int sttd_server_get_private_data(int uid, const char* key, char** data)
 
        /* get private data to engine */
        int ret = -1;
-       ret = sttd_engine_agent_get_private_data(uid, key, data);
+       ret = sttd_engine_agent_get_private_data(key, data);
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to get private data :result(%d)", ret);
                return ret;
        }
 
-       SLOG(LOG_DEBUG, TAG_STTD, "[Server SUCCESS] Get private data");
+       SLOG(LOG_DEBUG, TAG_STTD, "[Server SUCCESS] Get private data, key(%s), data(%s)", key, *data);
 
        return STTD_ERROR_NONE;
 }
@@ -990,7 +974,7 @@ int sttd_server_is_recognition_type_supported(int uid, const char* type, int* su
        }
 
        bool temp;
-       int ret = sttd_engine_agent_is_recognition_type_supported(uid, type, &temp);
+       int ret = sttd_engine_agent_is_recognition_type_supported(type, &temp);
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to get recognition type supported : result(%d)", ret);
                return ret;
@@ -1057,16 +1041,16 @@ Eina_Bool __check_recording_state(void *data)
 
        if (APP_STATE_READY == state) {
                /* Cancel stt */
-               SLOG(LOG_DEBUG, TAG_STTD, "[Server] The state of uid(%d) is 'Ready'. The daemon should cancel recording", uid);
+               SLOG(LOG_DEBUG, TAG_STTD, "[Server] The state of uid(%d) is 'Ready'. The STT service should cancel recording", uid);
                sttd_server_cancel(uid);
        } else if (APP_STATE_PROCESSING == state) {
                /* Cancel stt and send change state */
-               SLOG(LOG_DEBUG, TAG_STTD, "[Server] The state of uid(%d) is 'Processing'. The daemon should cancel recording", uid);
+               SLOG(LOG_DEBUG, TAG_STTD, "[Server] The state of uid(%d) is 'Processing'. The STT service should cancel recording", uid);
                sttd_server_cancel(uid);
                sttdc_send_set_state(uid, (int)APP_STATE_READY);
        } else {
                /* Normal state */
-               SLOG(LOG_DEBUG, TAG_STTD, "[Server] The states of daemon and client are identical");
+               SLOG(LOG_DEBUG, TAG_STTD, "[Server] The states of STT service and client are identical");
                return EINA_TRUE;
        }
 
@@ -1154,7 +1138,7 @@ int sttd_server_start(int uid, const char* lang, const char* recognition_type, i
        int ret = 0;
        if (false == stt_client_get_app_agreed(uid)) {
                bool temp = false;
-               ret = sttd_engine_agent_check_app_agreed(uid, appid, &temp);
+               ret = sttd_engine_agent_check_app_agreed(appid, &temp);
                if (0 != ret) {
                        SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to get engine available : %d", ret);
                        return ret;
@@ -1169,7 +1153,7 @@ int sttd_server_start(int uid, const char* lang, const char* recognition_type, i
        }
 
        /* check if engine use network */
-       if (true == sttd_engine_agent_need_network(uid)) {
+       if (true == sttd_engine_agent_need_network()) {
                if (false == stt_network_is_connected()) {
                        SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Disconnect network. Current engine needs to network connection.");
                        return STTD_ERROR_OUT_OF_NETWORK;
@@ -1222,7 +1206,7 @@ int sttd_server_start(int uid, const char* lang, const char* recognition_type, i
        }
 
        /* 3. Create recorder & engine initialize */
-       ret = sttd_engine_agent_recognize_start_engine(uid, lang, recognition_type, silence, credential, NULL);
+       ret = sttd_engine_agent_recognize_start_engine(uid, lang, recognition_type, silence, appid, credential, NULL);
        if (0 != ret) {
                stt_client_unset_current_recognition();
                sttd_recorder_unset_audio_session();
@@ -1230,7 +1214,7 @@ int sttd_server_start(int uid, const char* lang, const char* recognition_type, i
                return ret;
        }
 
-       if (0 != strcmp(STTP_RECOGNITION_TYPE_FREE_PARTIAL, recognition_type)) {
+       if (0 != strcmp(STTE_RECOGNITION_TYPE_FREE_PARTIAL, recognition_type)) {
                g_recording_timer = ecore_timer_add(g_recording_timeout, __stop_by_recording_timeout, NULL);
        }
 
@@ -1247,7 +1231,7 @@ int sttd_server_start(int uid, const char* lang, const char* recognition_type, i
                        stt_client_unset_current_recognition();
                        sttd_recorder_unset_audio_session();
 
-                       sttd_engine_agent_recognize_cancel(uid);
+                       sttd_engine_agent_recognize_cancel();
                        ecore_timer_del(g_recording_timer);
                        sttd_client_set_state(uid, APP_STATE_READY);
 
@@ -1276,12 +1260,12 @@ Eina_Bool __time_out_for_processing(void *data)
        if (0 == uid)   return EINA_FALSE;
 
        /* Cancel engine */
-       int ret = sttd_engine_agent_recognize_cancel(uid);
+       int ret = sttd_engine_agent_recognize_cancel();
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to cancel : result(%d)", ret);
        }
 
-       if (0 != sttdc_send_result(uid, STTP_RESULT_EVENT_FINAL_RESULT, NULL, 0, "Time out not to receive recognition result.")) {
+       if (0 != sttdc_send_result(uid, STTE_RESULT_EVENT_FINAL_RESULT, NULL, 0, "Time out not to receive recognition result.")) {
                SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to send result ");
 
                /* send error msg */
@@ -1317,7 +1301,7 @@ void __sttd_server_engine_stop(void* data)
        }
 
        /* Stop engine */
-       ret = sttd_engine_agent_recognize_stop_engine(uid);
+       ret = sttd_engine_agent_recognize_stop_engine();
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to stop engine : result(%d)", ret);
                return;
@@ -1368,10 +1352,10 @@ int sttd_server_stop(int uid)
 
        int ret;
        /* 1. Stop recorder */
-       ret = sttd_engine_agent_recognize_stop_recorder(uid);
+       ret = sttd_engine_agent_recognize_stop_recorder();
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to stop recorder : result(%d)", ret);
-               if (0 != sttd_engine_agent_recognize_cancel(uid)) {
+               if (0 != sttd_engine_agent_recognize_cancel()) {
                        SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to cancel recognize");
                }
                if (NULL != sound)      free(sound);
@@ -1405,7 +1389,7 @@ int sttd_server_stop(int uid)
                }
 
                /* Stop engine */
-               ret = sttd_engine_agent_recognize_stop_engine(uid);
+               ret = sttd_engine_agent_recognize_stop_engine();
                if (0 != ret) {
                        stt_client_unset_current_recognition();
                        SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to stop engine : result(%d)", ret);
@@ -1468,7 +1452,7 @@ int sttd_server_cancel(int uid)
        sttd_client_set_state(uid, APP_STATE_READY);
 
        /* cancel engine recognition */
-       int ret = sttd_engine_agent_recognize_cancel(uid);
+       int ret = sttd_engine_agent_recognize_cancel();
        if (0 != ret) {
                SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to cancel : result(%d)", ret);
                return ret;
index ec77117..0fd6dd9 100644 (file)
@@ -17,6 +17,7 @@
 
 #include <Ecore.h>
 #include "sttd_main.h"
+#include "stte.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -26,7 +27,7 @@ extern "C" {
 /*
 * Daemon functions
 */
-int sttd_initialize();
+int sttd_initialize(stte_request_callback_s *callback);
 
 int sttd_finalize();
 
diff --git a/server/stte.c b/server/stte.c
new file mode 100755 (executable)
index 0000000..acbc3a7
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+*  Copyright (c) 2011-2016 Samsung Electronics Co., Ltd All Rights Reserved
+*  Licensed under the Apache License, Version 2.0 (the "License");
+*  you may not use this file except in compliance with the License.
+*  You may obtain a copy of the License at
+*  http://www.apache.org/licenses/LICENSE-2.0
+*  Unless required by applicable law or agreed to in writing, software
+*  distributed under the License is distributed on an "AS IS" BASIS,
+*  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+*  See the License for the specific language governing permissions and
+*  limitations under the License.
+*/
+
+#include <Ecore.h>
+
+#include "stt_engine.h"
+#include "stt_defs.h"
+#include "stt_network.h"
+#include "sttd_dbus.h"
+#include "sttd_server.h"
+
+#include "stte.h"
+
+
+#define CLIENT_CLEAN_UP_TIME 500
+
+static Ecore_Timer* g_check_client_timer = NULL;
+
+int stte_main(int argc, char**argv, stte_request_callback_s *callback)
+{
+       SLOG(LOG_DEBUG, TAG_STTD, "===== Start engine");
+
+       if (!ecore_init()) {
+               SLOG(LOG_ERROR, TAG_STTD, "[ERROR] Fail to initialize Ecore");
+               return EXIT_FAILURE;
+       }
+
+       if (0 != sttd_dbus_open_connection()) {
+               SLOG(LOG_ERROR, TAG_STTD, "[ERROR] Fail to open connection");
+               return EXIT_FAILURE;
+       }
+
+       if (0 != sttd_initialize(callback)) {
+               SLOG(LOG_ERROR, TAG_STTD, "[ERROR] Fail to initialize stt-service");
+               return EXIT_FAILURE;
+       }
+
+       stt_network_initialize();
+
+       g_check_client_timer = ecore_timer_add(CLIENT_CLEAN_UP_TIME, sttd_cleanup_client, NULL);
+       if (NULL == g_check_client_timer) {
+               SLOG(LOG_WARN, TAG_STTD, "[Main Warning] Fail to create timer of client check");
+       }
+
+       SLOG(LOG_DEBUG, TAG_STTD, "[Main] stt-service start...");
+
+       SLOG(LOG_DEBUG, TAG_STTD, "=====");
+       SLOG(LOG_DEBUG, TAG_STTD, "  ");
+       SLOG(LOG_DEBUG, TAG_STTD, "  ");
+
+       return 0;
+}
+
+int stte_send_result(stte_result_event_e event, const char* type, const char** result, int result_count,
+                               const char* msg, void* time_info, void* user_data)
+{
+       if (NULL == type || NULL == result) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Invalid parameter");
+       }
+
+       int ret = STTE_ERROR_NONE;
+       ret = stt_engine_send_result(event, type, result, result_count, msg, time_info, user_data);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to send result");
+       }
+       return ret;
+}
+
+int stte_send_error(stte_error_e error, const char* msg)
+{
+       if (NULL == msg) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Invalid parameter");
+       }
+
+       int ret = STTE_ERROR_NONE;
+       ret = stt_engine_send_error(error, msg);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to send error info");
+       }
+       return ret;
+}
+
+int stte_send_speech_status(stte_speech_status_e status, void* user_data)
+{
+       int ret = STTE_ERROR_NONE;
+       ret = stt_engine_send_speech_status(status, user_data);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to send speech status");
+       }
+       return ret;
+}
+
+int stte_set_private_data_set_cb(stte_private_data_set_cb callback)
+{
+       int ret = STTE_ERROR_NONE;
+       ret = stt_engine_set_private_data_set_cb(callback, NULL);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to send speech status");
+       }
+       return ret;
+}
+
+int stte_set_private_data_requested_cb(stte_private_data_requested_cb callback)
+{
+       int ret = STTE_ERROR_NONE;
+       ret = stt_engine_set_private_data_requested_cb(callback, NULL);
+       if (0 != ret) {
+               SLOG(LOG_ERROR, TAG_STTD, "[Server ERROR] Fail to send speech status");
+       }
+       return ret;
+}
index 5d98a06..5eef8d3 100644 (file)
@@ -201,7 +201,9 @@ static void __stt_recognition_result_cb(stt_h stt, stt_result_event_e event, con
                SLOG(LOG_DEBUG, TAG_STT_TEST, "( %s )", data[0]);
        }
 
+       if (STT_RESULT_EVENT_FINAL_RESULT == event) {
        ecore_timer_add(0, __stt_finalize, NULL);
+       }
 }
 
 int main(int argc, char *argv[])
@@ -292,6 +294,13 @@ int main(int argc, char *argv[])
                        return 0;
                }
 
+               SLOG(LOG_DEBUG, TAG_STT_TEST, "STT set credential");
+               ret = stt_set_credential(g_stt, "1Q2W3E4R5T");
+               if (STT_ERROR_NONE != ret) {
+                       SLOG(LOG_ERROR, TAG_STT_TEST, "Fail to set credential");
+                       return 0;
+               }
+
                SLOG(LOG_DEBUG, TAG_STT_TEST, "STT prepare");
                ret = stt_prepare(g_stt);
                if (STT_ERROR_NONE != ret) {