2 * Copyright (c) 2011-2014 Samsung Electronics Co., Ltd All Rights Reserved
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 * http://www.apache.org/licenses/LICENSE-2.0
7 * Unless required by applicable law or agreed to in writing, software
8 * distributed under the License is distributed on an "AS IS" BASIS,
9 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 * See the License for the specific language governing permissions and
11 * limitations under the License.
15 #include <cynara-client.h>
16 #include <cynara-error.h>
17 #include <cynara-session.h>
23 #include <sys/types.h>
25 #include <system_info.h>
29 #include "stt_client.h"
31 #include "stt_config_mgr.h"
35 static void __stt_notify_state_changed(void *data);
36 static Eina_Bool __stt_notify_error(void *data);
38 static Ecore_Timer* g_connect_timer = NULL;
39 static float g_volume_db = 0;
41 static int g_feature_enabled = -1;
43 static int g_privilege_allowed = -1;
44 static cynara *p_cynara = NULL;
46 static bool g_err_callback_status = false;
53 static int __stt_get_feature_enabled()
55 if (0 == g_feature_enabled) {
56 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
57 return STT_ERROR_NOT_SUPPORTED;
58 } else if (-1 == g_feature_enabled) {
59 bool stt_supported = false;
60 bool mic_supported = false;
61 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
62 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
63 if (false == stt_supported || false == mic_supported) {
64 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
65 g_feature_enabled = 0;
66 return STT_ERROR_NOT_SUPPORTED;
69 g_feature_enabled = 1;
71 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get feature value");
72 return STT_ERROR_NOT_SUPPORTED;
75 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get feature value");
76 return STT_ERROR_NOT_SUPPORTED;
83 static int __check_privilege_initialize()
85 int ret = cynara_initialize(&p_cynara, NULL);
86 if (CYNARA_API_SUCCESS != ret)
87 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] fail to initialize");
89 return ret == CYNARA_API_SUCCESS;
92 static int __check_privilege(const char* uid, const char * privilege)
95 char smack_label[1024] = "/proc/self/attr/current";
101 fp = fopen(smack_label, "r");
103 if (fread(smack_label, 1, sizeof(smack_label), fp) <= 0)
104 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] fail to fread");
109 pid_t pid = getpid();
110 char *session = cynara_session_from_pid(pid);
111 int ret = cynara_check(p_cynara, smack_label, session, uid, privilege);
112 SLOG(LOG_DEBUG, TAG_STTC, "[Client]cynara_check returned %d(%s)", ret, (CYNARA_API_ACCESS_ALLOWED == ret) ? "Allowed" : "Denied");
116 if (ret != CYNARA_API_ACCESS_ALLOWED)
121 static void __check_privilege_deinitialize()
124 cynara_finish(p_cynara);
128 static int __stt_check_privilege()
132 if (0 == g_privilege_allowed) {
133 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Permission is denied");
134 return STT_ERROR_PERMISSION_DENIED;
135 } else if (-1 == g_privilege_allowed) {
136 if (false == __check_privilege_initialize()){
137 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] privilege initialize is failed");
138 return STT_ERROR_PERMISSION_DENIED;
140 snprintf(uid, 16, "%d", getuid());
141 if (false == __check_privilege(uid, STT_PRIVILEGE)) {
142 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Permission is denied");
143 g_privilege_allowed = 0;
144 __check_privilege_deinitialize();
145 return STT_ERROR_PERMISSION_DENIED;
147 __check_privilege_deinitialize();
150 g_privilege_allowed = 1;
151 return STT_ERROR_NONE;
154 static const char* __stt_get_error_code(stt_error_e err)
157 case STT_ERROR_NONE: return "STT_ERROR_NONE";
158 case STT_ERROR_OUT_OF_MEMORY: return "STT_ERROR_OUT_OF_MEMORY";
159 case STT_ERROR_IO_ERROR: return "STT_ERROR_IO_ERROR";
160 case STT_ERROR_INVALID_PARAMETER: return "STT_ERROR_INVALID_PARAMETER";
161 case STT_ERROR_TIMED_OUT: return "STT_ERROR_TIMED_OUT";
162 case STT_ERROR_RECORDER_BUSY: return "STT_ERROR_RECORDER_BUSY";
163 case STT_ERROR_OUT_OF_NETWORK: return "STT_ERROR_OUT_OF_NETWORK";
164 case STT_ERROR_PERMISSION_DENIED: return "STT_ERROR_PERMISSION_DENIED";
165 case STT_ERROR_NOT_SUPPORTED: return "STT_ERROR_NOT_SUPPORTED";
166 case STT_ERROR_INVALID_STATE: return "STT_ERROR_INVALID_STATE";
167 case STT_ERROR_INVALID_LANGUAGE: return "STT_ERROR_INVALID_LANGUAGE";
168 case STT_ERROR_ENGINE_NOT_FOUND: return "STT_ERROR_ENGINE_NOT_FOUND";
169 case STT_ERROR_OPERATION_FAILED: return "STT_ERROR_OPERATION_FAILED";
170 case STT_ERROR_NOT_SUPPORTED_FEATURE: return "STT_ERROR_NOT_SUPPORTED_FEATURE";
172 return "Invalid error code";
176 static int __stt_convert_config_error_code(stt_config_error_e code)
178 if (code == STT_CONFIG_ERROR_NONE) return STT_ERROR_NONE;
179 if (code == STT_CONFIG_ERROR_OUT_OF_MEMORY) return STT_ERROR_OUT_OF_MEMORY;
180 if (code == STT_CONFIG_ERROR_IO_ERROR) return STT_ERROR_IO_ERROR;
181 if (code == STT_CONFIG_ERROR_INVALID_PARAMETER) return STT_ERROR_INVALID_PARAMETER;
182 if (code == STT_CONFIG_ERROR_PERMISSION_DENIED) return STT_ERROR_PERMISSION_DENIED;
183 if (code == STT_CONFIG_ERROR_NOT_SUPPORTED) return STT_ERROR_NOT_SUPPORTED;
184 if (code == STT_CONFIG_ERROR_INVALID_STATE) return STT_ERROR_INVALID_STATE;
185 if (code == STT_CONFIG_ERROR_INVALID_LANGUAGE) return STT_ERROR_INVALID_LANGUAGE;
186 if (code == STT_CONFIG_ERROR_ENGINE_NOT_FOUND) return STT_ERROR_ENGINE_NOT_FOUND;
187 if (code == STT_CONFIG_ERROR_OPERATION_FAILED) return STT_ERROR_OPERATION_FAILED;
192 void __stt_config_lang_changed_cb(const char* before_language, const char* current_language, void* user_data)
194 SLOG(LOG_DEBUG, TAG_STTC, "Language changed : Before lang(%s) Current lang(%s)",
195 before_language, current_language);
197 if (0 == strcmp(before_language, current_language)) {
201 GList* client_list = NULL;
202 client_list = stt_client_get_client_list();
205 stt_client_s *data = NULL;
207 if (g_list_length(client_list) > 0) {
208 /* Get a first item */
209 iter = g_list_first(client_list);
211 while (NULL != iter) {
213 if (NULL != data->default_lang_changed_cb) {
214 SLOG(LOG_DEBUG, TAG_STTC, "Call default language changed callback : uid(%d)", data->uid);
215 data->default_lang_changed_cb(data->stt, before_language, current_language,
216 data->default_lang_changed_user_data);
220 iter = g_list_next(iter);
227 void __stt_config_engine_changed_cb(const char* engine_id, const char* setting, const char* language, bool support_silence, bool need_credential, void* user_data)
229 stt_h stt = (stt_h)user_data;
231 stt_client_s* client = stt_client_get(stt);
232 if (NULL == client) {
233 SLOG(LOG_ERROR, TAG_STTC, "[WARNING] A handle is not valid");
237 if (NULL != engine_id) SLOG(LOG_DEBUG, TAG_STTC, "Engine id(%s)", engine_id);
238 if (NULL != setting) SLOG(LOG_DEBUG, TAG_STTC, "Engine setting(%s)", setting);
239 if (NULL != language) SLOG(LOG_DEBUG, TAG_STTC, "Language(%s)", language);
240 SLOG(LOG_DEBUG, TAG_STTC, "Silence(%s), Credential(%s)", support_silence ? "on" : "off", need_credential ? "need" : "no need");
242 /* call callback function */
243 if (NULL != client->engine_changed_cb) {
244 client->engine_changed_cb(stt, engine_id, language, support_silence, need_credential, client->engine_changed_user_data);
246 SLOG(LOG_WARN, TAG_STTC, "No registered callback function of supported languages");
251 static int __stt_check_handle(stt_h stt, stt_client_s** client)
254 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input handle is null");
255 return STT_ERROR_INVALID_PARAMETER;
258 stt_client_s* temp = NULL;
259 temp = stt_client_get(stt);
263 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
264 return STT_ERROR_INVALID_PARAMETER;
268 return STT_ERROR_NONE;
271 int stt_create(stt_h* stt)
273 if (0 != __stt_get_feature_enabled()) {
274 return STT_ERROR_NOT_SUPPORTED;
276 if (0 != __stt_check_privilege()) {
277 return STT_ERROR_PERMISSION_DENIED;
280 SLOG(LOG_DEBUG, TAG_STTC, "===== Create STT");
283 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is null");
284 return STT_ERROR_INVALID_PARAMETER;
287 if (0 == stt_client_get_size()) {
288 if (0 != stt_dbus_open_connection()) {
289 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to open connection");
290 return STT_ERROR_OPERATION_FAILED;
294 if (0 != stt_client_new(stt)) {
295 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to create client!");
296 return STT_ERROR_OUT_OF_MEMORY;
299 stt_client_s* client = stt_client_get(*stt);
300 if (NULL == client) {
301 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to create client");
302 stt_client_destroy(*stt);
303 return STT_ERROR_OPERATION_FAILED;
306 int ret = stt_config_mgr_initialize(client->uid);
307 ret = __stt_convert_config_error_code(ret);
309 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to init config manager : %s", __stt_get_error_code(ret));
310 stt_client_destroy(*stt);
314 ret = stt_config_mgr_set_callback(client->uid, __stt_config_engine_changed_cb, __stt_config_lang_changed_cb, NULL, client->stt);
315 ret = __stt_convert_config_error_code(ret);
317 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set config changed : %s", __stt_get_error_code(ret));
318 stt_client_destroy(*stt);
322 SLOG(LOG_DEBUG, TAG_STTC, "[Success] uid(%d)", (*stt)->handle);
324 SLOG(LOG_DEBUG, TAG_STTC, "=====");
325 SLOG(LOG_DEBUG, TAG_STTC, " ");
327 return STT_ERROR_NONE;
330 int stt_destroy(stt_h stt)
332 if (0 != __stt_get_feature_enabled()) {
333 return STT_ERROR_NOT_SUPPORTED;
335 if (0 != __stt_check_privilege()) {
336 return STT_ERROR_PERMISSION_DENIED;
339 SLOG(LOG_DEBUG, TAG_STTC, "===== Destroy STT");
342 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input handle is null");
343 return STT_ERROR_INVALID_PARAMETER;
346 stt_client_s* client = stt_client_get(stt);
349 if (NULL == client) {
350 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
351 return STT_ERROR_INVALID_PARAMETER;
354 /* check used callback */
355 if (0 != stt_client_get_use_callback(client)) {
356 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Cannot destroy in Callback function");
357 return STT_ERROR_OPERATION_FAILED;
360 stt_config_mgr_finalize(client->uid);
365 switch (client->current_state) {
366 case STT_STATE_PROCESSING:
367 case STT_STATE_RECORDING:
368 case STT_STATE_READY:
369 ret = stt_dbus_request_finalize(client->uid);
371 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request finalize : %s", __stt_get_error_code(ret));
373 case STT_STATE_CREATED:
374 if (NULL != g_connect_timer) {
375 SLOG(LOG_DEBUG, TAG_STTC, "Connect Timer is deleted");
376 ecore_timer_del(g_connect_timer);
377 g_connect_timer = NULL;
381 stt_client_destroy(stt);
387 if (0 == stt_client_get_size()) {
388 if (0 != stt_dbus_close_connection()) {
389 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to close connection");
395 SLOG(LOG_DEBUG, TAG_STTC, "=====");
396 SLOG(LOG_DEBUG, TAG_STTC, " ");
398 return STT_ERROR_NONE;
401 bool __stt_config_supported_engine_cb(const char* engine_id, const char* engine_name,
402 const char* setting, bool support_silence, void* user_data)
404 stt_h stt = (stt_h)user_data;
406 stt_client_s* client = stt_client_get(stt);
407 if (NULL == client) {
408 SLOG(LOG_ERROR, TAG_STTC, "[WARNING] A handle is not valid");
412 /* call callback function */
413 if (NULL != client->supported_engine_cb) {
414 return client->supported_engine_cb(stt, engine_id, engine_name, client->supported_engine_user_data);
416 SLOG(LOG_WARN, TAG_STTC, "No registered callback function of supported engine");
422 int stt_foreach_supported_engines(stt_h stt, stt_supported_engine_cb callback, void* user_data)
424 if (0 != __stt_get_feature_enabled()) {
425 return STT_ERROR_NOT_SUPPORTED;
427 if (0 != __stt_check_privilege()) {
428 return STT_ERROR_PERMISSION_DENIED;
431 SLOG(LOG_DEBUG, TAG_STTC, "===== Foreach Supported engine");
433 if (NULL == stt || NULL == callback) {
434 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
435 return STT_ERROR_INVALID_PARAMETER;
438 stt_client_s* client = stt_client_get(stt);
441 if (NULL == client) {
442 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
443 return STT_ERROR_INVALID_PARAMETER;
446 if (client->current_state != STT_STATE_CREATED) {
447 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not CREATED", client->current_state);
448 return STT_ERROR_INVALID_STATE;
451 client->supported_engine_cb = callback;
452 client->supported_engine_user_data = user_data;
455 ret = stt_config_mgr_get_engine_list(__stt_config_supported_engine_cb, client->stt);
456 ret = __stt_convert_config_error_code(ret);
458 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get engines : %s", __stt_get_error_code(ret));
461 client->supported_engine_cb = NULL;
462 client->supported_engine_user_data = NULL;
464 SLOG(LOG_DEBUG, TAG_STTC, "=====");
465 SLOG(LOG_DEBUG, TAG_STTC, " ");
470 int stt_get_engine(stt_h stt, char** engine_id)
472 if (0 != __stt_get_feature_enabled()) {
473 return STT_ERROR_NOT_SUPPORTED;
476 SLOG(LOG_DEBUG, TAG_STTC, "===== Get current engine");
478 if (NULL == stt || NULL == engine_id) {
479 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
480 return STT_ERROR_INVALID_PARAMETER;
483 stt_client_s* client = stt_client_get(stt);
486 if (NULL == client) {
487 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
488 return STT_ERROR_INVALID_PARAMETER;
491 if (client->current_state != STT_STATE_CREATED) {
492 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not CREATED", client->current_state);
493 return STT_ERROR_INVALID_STATE;
498 if (NULL != client->current_engine_id) {
499 *engine_id = strdup(client->current_engine_id);
500 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current engine uuid = %s", *engine_id);
503 ret = stt_config_mgr_get_engine(engine_id);
504 ret = __stt_convert_config_error_code(ret);
506 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request get current engine : %s", __stt_get_error_code(ret));
508 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current engine uuid = %s", *engine_id);
512 SLOG(LOG_DEBUG, TAG_STTC, "=====");
513 SLOG(LOG_DEBUG, TAG_STTC, " ");
518 int stt_set_engine(stt_h stt, const char* engine_id)
520 if (0 != __stt_get_feature_enabled()) {
521 return STT_ERROR_NOT_SUPPORTED;
523 if (0 != __stt_check_privilege()) {
524 return STT_ERROR_PERMISSION_DENIED;
527 SLOG(LOG_DEBUG, TAG_STTC, "===== Set current engine");
529 if (NULL == stt || NULL == engine_id) {
530 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
531 return STT_ERROR_INVALID_PARAMETER;
534 stt_client_s* client = stt_client_get(stt);
537 if (NULL == client) {
538 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
539 return STT_ERROR_INVALID_PARAMETER;
543 if (client->current_state != STT_STATE_CREATED) {
544 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not CREATED", client->current_state);
545 return STT_ERROR_INVALID_STATE;
548 if (NULL != client->current_engine_id) {
549 free(client->current_engine_id);
552 client->current_engine_id = strdup(engine_id);
554 SLOG(LOG_DEBUG, TAG_STTC, "=====");
555 SLOG(LOG_DEBUG, TAG_STTC, " ");
560 int stt_set_credential(stt_h stt, const char* credential)
562 if (0 != __stt_get_feature_enabled()) {
563 return STT_ERROR_NOT_SUPPORTED;
565 if (0 != __stt_check_privilege()) {
566 return STT_ERROR_PERMISSION_DENIED;
569 SLOG(LOG_DEBUG, TAG_STTC, "===== Set credential");
571 if (NULL == stt || NULL == credential) {
572 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL, stt(%s), credential(%a)", stt, credential);
573 return STT_ERROR_INVALID_PARAMETER;
576 stt_client_s* client = stt_client_get(stt);
579 if (NULL == client) {
580 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
581 return STT_ERROR_INVALID_PARAMETER;
585 if (client->current_state != STT_STATE_CREATED && client->current_state != STT_STATE_READY) {
586 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not CREATED or READY", client->current_state);
587 return STT_ERROR_INVALID_STATE;
590 client->credential = strdup(credential);
592 SLOG(LOG_DEBUG, TAG_STTC, "=====");
593 SLOG(LOG_DEBUG, TAG_STTC, " ");
595 return STT_ERROR_NONE;
598 int stt_set_private_data(stt_h stt, const char* key, const char* data)
600 stt_client_s* client = NULL;
602 if (0 != __stt_get_feature_enabled()) {
603 return STT_ERROR_NOT_SUPPORTED;
605 if (0 != __stt_check_privilege()) {
606 return STT_ERROR_PERMISSION_DENIED;
608 if (0 != __stt_check_handle(stt, &client)) {
609 return STT_ERROR_INVALID_PARAMETER;
612 SLOG(LOG_DEBUG, TAG_STTC, "===== Set private data");
614 if (NULL == key || NULL == data) {
615 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid parameter");
616 return STT_ERROR_INVALID_PARAMETER;
620 if (STT_STATE_READY != client->current_state) {
621 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
622 return STT_ERROR_INVALID_STATE;
628 ret = stt_dbus_request_set_private_data(client->uid, key, data);
630 if (STT_ERROR_TIMED_OUT != ret) {
631 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set private data : %s", __stt_get_error_code(ret));
634 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry : %s", __stt_get_error_code(ret));
637 if (STT_RETRY_COUNT == count) {
638 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
645 SLOG(LOG_DEBUG, TAG_STTC, "=====");
646 SLOG(LOG_DEBUG, TAG_STTC, "");
648 return STT_ERROR_NONE;
651 int stt_get_private_data(stt_h stt, const char* key, char** data)
653 stt_client_s* client = NULL;
655 if (0 != __stt_get_feature_enabled()) {
656 return STT_ERROR_NOT_SUPPORTED;
658 if (0 != __stt_check_privilege()) {
659 return STT_ERROR_PERMISSION_DENIED;
661 if (0 != __stt_check_handle(stt, &client)) {
662 return STT_ERROR_INVALID_PARAMETER;
665 SLOG(LOG_DEBUG, TAG_STTC, "===== Get private data");
667 if (NULL == key || NULL == data) {
668 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid parameter");
669 return STT_ERROR_INVALID_PARAMETER;
673 if (STT_STATE_READY != client->current_state) {
674 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
675 return STT_ERROR_INVALID_STATE;
681 ret = stt_dbus_request_get_private_data(client->uid, key, data);
683 if (STT_ERROR_TIMED_OUT != ret) {
684 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get private data : %s", __stt_get_error_code(ret));
687 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry : %s", __stt_get_error_code(ret));
690 if (STT_RETRY_COUNT == count) {
691 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
698 SLOG(LOG_DEBUG, TAG_STTC, "=====");
699 SLOG(LOG_DEBUG, TAG_STTC, "");
701 return STT_ERROR_NONE;
703 static Eina_Bool __stt_connect_daemon(void *data)
705 stt_client_s* client = (stt_client_s*)data;
707 if (NULL == client) {
708 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
709 g_connect_timer = NULL;
715 ret = stt_dbus_request_hello();
718 if (STT_ERROR_INVALID_STATE == ret) {
719 g_connect_timer = NULL;
725 g_connect_timer = NULL;
726 SLOG(LOG_DEBUG, TAG_STTC, "===== Connect daemon");
728 /* request initialization */
729 bool silence_supported = false;
730 bool credential_needed = false;
732 ret = stt_dbus_request_initialize(client->uid, &silence_supported, &credential_needed);
734 if (STT_ERROR_ENGINE_NOT_FOUND == ret) {
735 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to initialize : %s", __stt_get_error_code(ret));
737 client->reason = STT_ERROR_ENGINE_NOT_FOUND;
738 ecore_timer_add(0, __stt_notify_error, (void*)client);
742 } else if (STT_ERROR_NONE != ret) {
743 SLOG(LOG_ERROR, TAG_STTC, "[WARNING] Fail to connection. Retry to connect");
746 /* success to connect stt-daemon */
747 client->silence_supported = silence_supported;
748 client->credential_needed = credential_needed;
749 SLOG(LOG_DEBUG, TAG_STTC, "Supported options : silence(%s), credential(%s)", silence_supported ? "support" : "no support", credential_needed ? "need" : "no need");
752 if (NULL != client->current_engine_id) {
755 silence_supported = false;
756 credential_needed = false;
758 ret = stt_dbus_request_set_current_engine(client->uid, client->current_engine_id, &silence_supported, &credential_needed);
760 if (STT_ERROR_TIMED_OUT != ret) {
761 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set current engine : %s", __stt_get_error_code(ret));
764 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
767 if (STT_RETRY_COUNT == count) {
768 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
773 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current engine uuid = %s", client->current_engine_id);
775 /* success to change engine */
776 client->silence_supported = silence_supported;
777 SLOG(LOG_DEBUG, TAG_STTC, "Supported options : silence(%s), credential(%s)", silence_supported ? "support" : "no support", credential_needed ? "need" : "no need");
782 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] uid(%d)", client->uid);
784 client->before_state = client->current_state;
785 client->current_state = STT_STATE_READY;
787 if (NULL != client->state_changed_cb) {
788 stt_client_use_callback(client);
789 client->state_changed_cb(client->stt, client->before_state,
790 client->current_state, client->state_changed_user_data);
791 stt_client_not_use_callback(client);
792 SLOG(LOG_DEBUG, TAG_STTC, "State changed callback is called");
794 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
797 SLOG(LOG_DEBUG, TAG_STTC, "=====");
798 SLOG(LOG_DEBUG, TAG_STTC, " ");
803 int stt_prepare(stt_h stt)
805 if (0 != __stt_get_feature_enabled()) {
806 return STT_ERROR_NOT_SUPPORTED;
808 if (0 != __stt_check_privilege()) {
809 return STT_ERROR_PERMISSION_DENIED;
812 SLOG(LOG_DEBUG, TAG_STTC, "===== Prepare STT");
814 stt_client_s* client = stt_client_get(stt);
817 if (NULL == client) {
818 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
819 return STT_ERROR_INVALID_PARAMETER;
823 if (client->current_state != STT_STATE_CREATED) {
824 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not 'CREATED'", client->current_state);
825 return STT_ERROR_INVALID_STATE;
828 g_connect_timer = ecore_timer_add(0, __stt_connect_daemon, (void*)client);
830 SLOG(LOG_DEBUG, TAG_STTC, "=====");
831 SLOG(LOG_DEBUG, TAG_STTC, " ");
833 return STT_ERROR_NONE;
836 int stt_unprepare(stt_h stt)
838 if (0 != __stt_get_feature_enabled()) {
839 return STT_ERROR_NOT_SUPPORTED;
841 if (0 != __stt_check_privilege()) {
842 return STT_ERROR_PERMISSION_DENIED;
845 SLOG(LOG_DEBUG, TAG_STTC, "===== Unprepare STT");
847 stt_client_s* client = stt_client_get(stt);
850 if (NULL == client) {
851 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
852 return STT_ERROR_INVALID_PARAMETER;
856 if (client->current_state != STT_STATE_READY) {
857 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", client->current_state);
858 return STT_ERROR_INVALID_STATE;
864 ret = stt_dbus_request_finalize(client->uid);
866 if (STT_ERROR_TIMED_OUT != ret) {
867 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request finalize : %s", __stt_get_error_code(ret));
870 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
873 if (STT_RETRY_COUNT == count) {
874 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
881 client->internal_state = STT_INTERNAL_STATE_NONE;
883 client->before_state = client->current_state;
884 client->current_state = STT_STATE_CREATED;
886 if (NULL != client->state_changed_cb) {
887 stt_client_use_callback(client);
888 client->state_changed_cb(client->stt, client->before_state,
889 client->current_state, client->state_changed_user_data);
890 stt_client_not_use_callback(client);
892 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
895 if (g_connect_timer) {
896 ecore_timer_del(g_connect_timer);
897 g_connect_timer = NULL;
900 SLOG(LOG_DEBUG, TAG_STTC, "=====");
901 SLOG(LOG_DEBUG, TAG_STTC, " ");
903 return STT_ERROR_NONE;
906 bool __stt_config_supported_language_cb(const char* engine_id, const char* language, void* user_data)
908 stt_h stt = (stt_h)user_data;
910 stt_client_s* client = stt_client_get(stt);
911 if (NULL == client) {
912 SLOG(LOG_ERROR, TAG_STTC, "[WARNING] A handle is not valid");
916 /* call callback function */
917 if (NULL != client->supported_lang_cb) {
918 return client->supported_lang_cb(stt, language, client->supported_lang_user_data);
920 SLOG(LOG_WARN, TAG_STTC, "No registered callback function of supported languages");
926 int stt_foreach_supported_languages(stt_h stt, stt_supported_language_cb callback, void* user_data)
928 if (0 != __stt_get_feature_enabled()) {
929 return STT_ERROR_NOT_SUPPORTED;
931 if (0 != __stt_check_privilege()) {
932 return STT_ERROR_PERMISSION_DENIED;
935 SLOG(LOG_DEBUG, TAG_STTC, "===== Foreach Supported Language");
937 if (NULL == stt || NULL == callback) {
938 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
939 return STT_ERROR_INVALID_PARAMETER;
942 stt_client_s* client = stt_client_get(stt);
945 if (NULL == client) {
946 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
947 return STT_ERROR_INVALID_PARAMETER;
951 char* current_engine_id = NULL;
953 if (NULL == client->current_engine_id) {
954 ret = stt_config_mgr_get_engine(¤t_engine_id);
955 ret = __stt_convert_config_error_code(ret);
957 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get default engine id : %s", __stt_get_error_code(ret));
961 current_engine_id = strdup(client->current_engine_id);
962 if (NULL == current_engine_id) {
963 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to allocate memory");
964 return STT_ERROR_OUT_OF_MEMORY;
968 client->supported_lang_cb = callback;
969 client->supported_lang_user_data = user_data;
971 ret = stt_config_mgr_get_language_list(current_engine_id, __stt_config_supported_language_cb, client->stt);
972 ret = __stt_convert_config_error_code(ret);
974 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get languages : %s", __stt_get_error_code(ret));
977 if (NULL != current_engine_id) {
978 free(current_engine_id);
981 client->supported_lang_cb = NULL;
982 client->supported_lang_user_data = NULL;
984 SLOG(LOG_DEBUG, TAG_STTC, "=====");
985 SLOG(LOG_DEBUG, TAG_STTC, " ");
990 int stt_get_default_language(stt_h stt, char** language)
992 if (0 != __stt_get_feature_enabled()) {
993 return STT_ERROR_NOT_SUPPORTED;
995 if (0 != __stt_check_privilege()) {
996 return STT_ERROR_PERMISSION_DENIED;
999 SLOG(LOG_DEBUG, TAG_STTC, "===== Get Default Language");
1001 if (NULL == stt || NULL == language) {
1002 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1003 return STT_ERROR_INVALID_PARAMETER;
1006 stt_client_s* client = stt_client_get(stt);
1007 if (NULL == client) {
1008 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1009 return STT_ERROR_INVALID_PARAMETER;
1013 ret = stt_config_mgr_get_default_language(language);
1014 ret = __stt_convert_config_error_code(ret);
1016 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get default language : %s", __stt_get_error_code(ret));
1018 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current language = %s", *language);
1021 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1022 SLOG(LOG_DEBUG, TAG_STTC, " ");
1027 int stt_get_state(stt_h stt, stt_state_e* state)
1029 if (0 != __stt_get_feature_enabled()) {
1030 return STT_ERROR_NOT_SUPPORTED;
1032 if (0 != __stt_check_privilege()) {
1033 return STT_ERROR_PERMISSION_DENIED;
1036 if (NULL == stt || NULL == state) {
1037 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1038 return STT_ERROR_INVALID_PARAMETER;
1041 stt_client_s* client = stt_client_get(stt);
1042 if (NULL == client) {
1043 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
1044 return STT_ERROR_INVALID_PARAMETER;
1047 *state = client->current_state;
1050 case STT_STATE_CREATED: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'CREATED'"); break;
1051 case STT_STATE_READY: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'Ready'"); break;
1052 case STT_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'Recording'"); break;
1053 case STT_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'Processing'"); break;
1054 default: SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid value"); break;
1057 return STT_ERROR_NONE;
1060 int stt_get_error_message(stt_h stt, char** err_msg)
1062 if (0 != __stt_get_feature_enabled()) {
1063 return STT_ERROR_NOT_SUPPORTED;
1065 if (0 != __stt_check_privilege()) {
1066 return STT_ERROR_PERMISSION_DENIED;
1069 if (NULL == stt || NULL == err_msg) {
1070 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1071 return STT_ERROR_INVALID_PARAMETER;
1074 if (false == g_err_callback_status) {
1075 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] This callback should be called during an err_callback");
1076 return STT_ERROR_OPERATION_FAILED;
1079 stt_client_s* client = stt_client_get(stt);
1080 if (NULL == client) {
1081 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get error msg : A handle is not valid");
1082 return STT_ERROR_INVALID_PARAMETER;
1085 if (NULL != client->err_msg) {
1086 *err_msg = strdup(client->err_msg);
1087 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Error msg (%s)", *err_msg);
1089 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Error msg (NULL)");
1092 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1093 SLOG(LOG_DEBUG, TAG_STTC, " ");
1095 return STT_ERROR_NONE;
1098 int stt_is_recognition_type_supported(stt_h stt, const char* type, bool* support)
1100 if (0 != __stt_get_feature_enabled()) {
1101 return STT_ERROR_NOT_SUPPORTED;
1103 if (0 != __stt_check_privilege()) {
1104 return STT_ERROR_PERMISSION_DENIED;
1107 if (NULL == stt || NULL == type || NULL == support) {
1108 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1109 return STT_ERROR_INVALID_PARAMETER;
1112 stt_client_s* client = stt_client_get(stt);
1113 if (NULL == client) {
1114 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not valid");
1115 return STT_ERROR_INVALID_PARAMETER;
1119 if (client->current_state != STT_STATE_READY) {
1120 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
1121 return STT_ERROR_INVALID_STATE;
1127 ret = stt_dbus_request_is_recognition_type_supported(client->uid, type, support);
1129 if (STT_ERROR_TIMED_OUT != ret) {
1130 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get recognition type supported : %s", __stt_get_error_code(ret));
1133 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1136 if (STT_RETRY_COUNT == count) {
1137 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1142 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] recognition type is %s", *support ? "true " : "false");
1147 return STT_ERROR_NONE;
1150 int stt_set_silence_detection(stt_h stt, stt_option_silence_detection_e type)
1152 if (0 != __stt_get_feature_enabled()) {
1153 return STT_ERROR_NOT_SUPPORTED;
1155 if (0 != __stt_check_privilege()) {
1156 return STT_ERROR_PERMISSION_DENIED;
1160 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1161 return STT_ERROR_INVALID_PARAMETER;
1164 stt_client_s* client = stt_client_get(stt);
1165 if (NULL == client) {
1166 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
1167 return STT_ERROR_INVALID_PARAMETER;
1171 if (client->current_state != STT_STATE_READY) {
1172 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
1173 return STT_ERROR_INVALID_STATE;
1176 if (true == client->silence_supported) {
1177 if (type >= STT_OPTION_SILENCE_DETECTION_FALSE && type <= STT_OPTION_SILENCE_DETECTION_AUTO) {
1178 client->silence = type;
1180 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Type is invalid");
1181 return STT_ERROR_INVALID_PARAMETER;
1184 return STT_ERROR_NOT_SUPPORTED_FEATURE;
1187 return STT_ERROR_NONE;
1190 int stt_set_start_sound(stt_h stt, const char* filename)
1192 if (0 != __stt_get_feature_enabled()) {
1193 return STT_ERROR_NOT_SUPPORTED;
1195 if (0 != __stt_check_privilege()) {
1196 return STT_ERROR_PERMISSION_DENIED;
1199 SLOG(LOG_DEBUG, TAG_STTC, "===== STT SET START SOUND");
1201 if (NULL == stt || NULL == filename) {
1202 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1203 return STT_ERROR_INVALID_PARAMETER;
1206 if (0 != access(filename, F_OK)) {
1207 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] File does not exist");
1208 return STT_ERROR_INVALID_PARAMETER;
1211 stt_client_s* client = stt_client_get(stt);
1212 if (NULL == client) {
1213 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
1214 return STT_ERROR_INVALID_PARAMETER;
1218 if (client->current_state != STT_STATE_READY) {
1219 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
1220 return STT_ERROR_INVALID_STATE;
1226 ret = stt_dbus_request_set_start_sound(client->uid, filename);
1228 if (STT_ERROR_TIMED_OUT != ret) {
1229 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set start sound : %s", __stt_get_error_code(ret));
1232 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1235 if (STT_RETRY_COUNT == count) {
1236 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1241 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Set start sound : %s", filename);
1246 return STT_ERROR_NONE;
1249 int stt_unset_start_sound(stt_h stt)
1251 if (0 != __stt_get_feature_enabled()) {
1252 return STT_ERROR_NOT_SUPPORTED;
1254 if (0 != __stt_check_privilege()) {
1255 return STT_ERROR_PERMISSION_DENIED;
1258 SLOG(LOG_DEBUG, TAG_STTC, "===== STT UNSET START SOUND");
1261 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1262 return STT_ERROR_INVALID_PARAMETER;
1265 stt_client_s* client = stt_client_get(stt);
1267 if (NULL == client) {
1268 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
1269 return STT_ERROR_INVALID_PARAMETER;
1273 if (client->current_state != STT_STATE_READY) {
1274 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
1275 return STT_ERROR_INVALID_STATE;
1281 ret = stt_dbus_request_unset_start_sound(client->uid);
1283 if (STT_ERROR_TIMED_OUT != ret) {
1284 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to unset start sound : %s", __stt_get_error_code(ret));
1287 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1290 if (STT_RETRY_COUNT == count) {
1291 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1296 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Unset start sound");
1301 return STT_ERROR_NONE;
1304 int stt_set_stop_sound(stt_h stt, const char* filename)
1306 if (0 != __stt_get_feature_enabled()) {
1307 return STT_ERROR_NOT_SUPPORTED;
1309 if (0 != __stt_check_privilege()) {
1310 return STT_ERROR_PERMISSION_DENIED;
1313 SLOG(LOG_DEBUG, TAG_STTC, "===== STT SET STOP SOUND");
1315 if (NULL == stt || NULL == filename) {
1316 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1317 return STT_ERROR_INVALID_PARAMETER;
1320 if (0 != access(filename, F_OK)) {
1321 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] File does not exist");
1322 return STT_ERROR_INVALID_PARAMETER;
1325 stt_client_s* client = stt_client_get(stt);
1327 if (NULL == client) {
1328 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
1329 return STT_ERROR_INVALID_PARAMETER;
1333 if (client->current_state != STT_STATE_READY) {
1334 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
1335 return STT_ERROR_INVALID_STATE;
1341 ret = stt_dbus_request_set_stop_sound(client->uid, filename);
1343 if (STT_ERROR_TIMED_OUT != ret) {
1344 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set stop sound : %s", __stt_get_error_code(ret));
1347 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1350 if (STT_RETRY_COUNT == count) {
1351 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1356 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Set stop sound : %s", filename);
1361 return STT_ERROR_NONE;
1364 int stt_unset_stop_sound(stt_h stt)
1366 if (0 != __stt_get_feature_enabled()) {
1367 return STT_ERROR_NOT_SUPPORTED;
1369 if (0 != __stt_check_privilege()) {
1370 return STT_ERROR_PERMISSION_DENIED;
1373 SLOG(LOG_DEBUG, TAG_STTC, "===== STT UNSET STOP SOUND");
1376 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1377 return STT_ERROR_INVALID_PARAMETER;
1380 stt_client_s* client = stt_client_get(stt);
1382 if (NULL == client) {
1383 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
1384 return STT_ERROR_INVALID_PARAMETER;
1388 if (client->current_state != STT_STATE_READY) {
1389 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
1390 return STT_ERROR_INVALID_STATE;
1396 ret = stt_dbus_request_unset_stop_sound(client->uid);
1398 if (STT_ERROR_TIMED_OUT != ret) {
1399 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to unset stop sound : %s", __stt_get_error_code(ret));
1402 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1405 if (STT_RETRY_COUNT == count) {
1406 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1411 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Unset stop sound");
1416 return STT_ERROR_NONE;
1419 int stt_start(stt_h stt, const char* language, const char* type)
1421 if (0 != __stt_get_feature_enabled()) {
1422 return STT_ERROR_NOT_SUPPORTED;
1424 if (0 != __stt_check_privilege()) {
1425 return STT_ERROR_PERMISSION_DENIED;
1428 SLOG(LOG_DEBUG, TAG_STTC, "===== STT START");
1431 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1432 return STT_ERROR_INVALID_PARAMETER;
1435 stt_client_s* client = stt_client_get(stt);
1436 if (NULL == client) {
1437 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1438 return STT_ERROR_INVALID_PARAMETER;
1442 if (client->current_state != STT_STATE_READY) {
1443 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
1444 return STT_ERROR_INVALID_STATE;
1447 if (STT_INTERNAL_STATE_NONE != client->internal_state) {
1448 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is NOT none : %d", client->internal_state);
1449 return STT_ERROR_IN_PROGRESS_TO_RECORDING;
1453 char appid[128] = {0, };
1454 ret = aul_app_get_appid_bypid(getpid(), appid, sizeof(appid));
1456 if ((AUL_R_OK != ret) || (0 == strlen(appid))) {
1457 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get application ID");
1459 SLOG(LOG_DEBUG, TAG_STTC, "[DEBUG] Current app id is %s", appid);
1463 if (NULL == language) {
1464 temp = strdup("default");
1466 temp = strdup(language);
1469 if (true == client->credential_needed && NULL == client->credential) {
1470 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Do not have app credential for this engine(%s)", client->current_engine_id);
1471 return STT_ERROR_PERMISSION_DENIED;
1474 ret = stt_dbus_request_start(client->uid, temp, type, client->silence, appid, client->credential);
1476 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to start : %s", __stt_get_error_code(ret));
1478 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Start is successful but not done");
1479 client->internal_state = STT_INTERNAL_STATE_STARTING;
1482 if (NULL != temp) free(temp);
1484 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1485 SLOG(LOG_DEBUG, TAG_STTC, " ");
1490 int stt_stop(stt_h stt)
1492 if (0 != __stt_get_feature_enabled()) {
1493 return STT_ERROR_NOT_SUPPORTED;
1495 if (0 != __stt_check_privilege()) {
1496 return STT_ERROR_PERMISSION_DENIED;
1499 SLOG(LOG_DEBUG, TAG_STTC, "===== STT STOP");
1502 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1503 return STT_ERROR_INVALID_PARAMETER;
1506 stt_client_s* client = stt_client_get(stt);
1507 if (NULL == client) {
1508 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1509 return STT_ERROR_INVALID_PARAMETER;
1513 if (client->current_state != STT_STATE_RECORDING) {
1514 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Current state(%d) is NOT RECORDING", client->current_state);
1515 return STT_ERROR_INVALID_STATE;
1518 if (STT_INTERNAL_STATE_NONE != client->internal_state) {
1519 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is NOT none : %d", client->internal_state);
1520 return STT_ERROR_IN_PROGRESS_TO_PROCESSING;
1523 int ret = stt_dbus_request_stop(client->uid);
1526 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to stop : %s", __stt_get_error_code(ret));
1528 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Stop is successful but not done");
1529 client->internal_state = STT_INTERNAL_STATE_STOPING;
1532 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1533 SLOG(LOG_DEBUG, TAG_STTC, " ");
1539 int stt_cancel(stt_h stt)
1541 if (0 != __stt_get_feature_enabled()) {
1542 return STT_ERROR_NOT_SUPPORTED;
1544 if (0 != __stt_check_privilege()) {
1545 return STT_ERROR_PERMISSION_DENIED;
1548 SLOG(LOG_DEBUG, TAG_STTC, "===== STT CANCEL");
1551 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input handle is null");
1552 return STT_ERROR_INVALID_PARAMETER;
1555 stt_client_s* client = stt_client_get(stt);
1558 if (NULL == client) {
1559 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1560 return STT_ERROR_INVALID_PARAMETER;
1564 if (STT_STATE_RECORDING != client->current_state && STT_STATE_PROCESSING != client->current_state) {
1565 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid state : Current state(%d) is 'Ready'", client->current_state);
1566 return STT_ERROR_INVALID_STATE;
1569 if (STT_INTERNAL_STATE_NONE != client->internal_state) {
1570 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is NOT none : %d", client->internal_state);
1571 return STT_ERROR_IN_PROGRESS_TO_READY;
1574 int ret = stt_dbus_request_cancel(client->uid);
1576 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to cancel : %s", __stt_get_error_code(ret));
1578 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Cancel is successful but not done");
1579 client->internal_state = STT_INTERNAL_STATE_CANCELING;
1582 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1583 SLOG(LOG_DEBUG, TAG_STTC, " ");
1588 int __stt_cb_set_volume(int uid, float volume)
1590 stt_client_s* client = NULL;
1592 client = stt_client_get_by_uid(uid);
1593 if (NULL == client) {
1594 SLOG(LOG_ERROR, TAG_STTC, "Handle is NOT valid");
1595 return STT_ERROR_INVALID_PARAMETER;
1598 if (STT_STATE_RECORDING != client->current_state) {
1599 SLOG(LOG_DEBUG, TAG_STTC, "[ERROR] Invalid state : NO 'Recording' state, cur(%d)", client->current_state);
1600 return STT_ERROR_INVALID_STATE;
1603 g_volume_db = volume;
1604 SLOG(LOG_DEBUG, TAG_STTC, "Set volume (%f)", g_volume_db);
1609 int stt_get_recording_volume(stt_h stt, float* volume)
1611 if (0 != __stt_get_feature_enabled()) {
1612 return STT_ERROR_NOT_SUPPORTED;
1614 if (0 != __stt_check_privilege()) {
1615 return STT_ERROR_PERMISSION_DENIED;
1618 if (NULL == stt || NULL == volume) {
1619 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1620 return STT_ERROR_INVALID_PARAMETER;
1623 stt_client_s* client = stt_client_get(stt);
1626 if (NULL == client) {
1627 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1628 return STT_ERROR_INVALID_PARAMETER;
1631 if (STT_STATE_RECORDING != client->current_state) {
1632 SLOG(LOG_DEBUG, TAG_STTC, "[ERROR] Invalid state : NO 'Recording' state, cur(%d)", client->current_state);
1633 return STT_ERROR_INVALID_STATE;
1636 *volume = g_volume_db;
1638 return STT_ERROR_NONE;
1641 bool __stt_result_time_cb(int index, int event, const char* text, long start_time, long end_time, void* user_data)
1643 stt_client_s* client = (stt_client_s*)user_data;
1646 if (NULL == client) {
1647 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
1651 if (NULL != client->result_time_cb) {
1652 SLOG(LOG_DEBUG, TAG_STTC, "(%d) event(%d) text(%s) start(%ld) end(%ld)",
1653 index, event, text, start_time, end_time);
1654 client->result_time_cb(client->stt, index, (stt_result_time_event_e)event,
1655 text, start_time, end_time, client->result_time_user_data);
1657 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Callback is NULL");
1664 int stt_foreach_detailed_result(stt_h stt, stt_result_time_cb callback, void* user_data)
1666 if (0 != __stt_get_feature_enabled()) {
1667 return STT_ERROR_NOT_SUPPORTED;
1669 if (0 != __stt_check_privilege()) {
1670 return STT_ERROR_PERMISSION_DENIED;
1673 SLOG(LOG_DEBUG, TAG_STTC, "===== STT FOREACH DETAILED RESULT");
1675 if (NULL == callback) {
1676 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1677 return STT_ERROR_INVALID_PARAMETER;
1680 stt_client_s* client = stt_client_get(stt);
1683 if (NULL == client) {
1684 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail : A handle is not valid");
1685 return STT_ERROR_INVALID_PARAMETER;
1688 client->result_time_cb = callback;
1689 client->result_time_user_data = user_data;
1692 ret = stt_config_mgr_foreach_time_info(__stt_result_time_cb, client);
1693 ret = __stt_convert_config_error_code(ret);
1695 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to foreach time info : %s", __stt_get_error_code(ret));
1698 client->result_time_cb = NULL;
1699 client->result_time_user_data = NULL;
1701 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1702 SLOG(LOG_DEBUG, TAG_STTC, " ");
1707 static Eina_Bool __stt_notify_error(void *data)
1709 stt_client_s* client = (stt_client_s*)data;
1711 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Error from sttd");
1714 if (NULL == client) {
1715 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
1719 if (NULL == stt_client_get_by_uid(client->uid))
1722 if (NULL != client->error_cb) {
1723 stt_client_use_callback(client);
1724 g_err_callback_status = true;
1725 client->error_cb(client->stt, client->reason, client->error_user_data);
1726 g_err_callback_status = false;
1727 stt_client_not_use_callback(client);
1728 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Error callback is called : reason [%d]", client->reason);
1730 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Error callback is null");
1736 int __stt_cb_error(int uid, int reason, char* err_msg)
1738 stt_client_s* client = stt_client_get_by_uid(uid);
1739 if (NULL == client) {
1740 SLOG(LOG_ERROR, TAG_STTC, "Handle not found");
1744 client->reason = reason;
1745 client->internal_state = STT_INTERNAL_STATE_NONE;
1746 if (NULL != client->err_msg) {
1747 free(client->err_msg);
1748 client->err_msg = NULL;
1750 client->err_msg = strdup(err_msg);
1752 SLOG(LOG_INFO, TAG_STTC, "internal state is initialized to 0");
1754 if (NULL != client->error_cb) {
1755 ecore_timer_add(0, __stt_notify_error, client);
1757 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Error callback is null");
1763 static void __stt_notify_state_changed(void *data)
1765 stt_client_s* client = (stt_client_s*)data;
1768 if (NULL == client) {
1769 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
1773 if (NULL == stt_client_get_by_uid(client->uid)) {
1777 if (STT_INTERNAL_STATE_STARTING == client->internal_state && STT_STATE_RECORDING == client->current_state) {
1778 client->internal_state = STT_INTERNAL_STATE_NONE;
1779 SLOG(LOG_DEBUG, TAG_STTC, "Internal state change to NONE");
1780 } else if (STT_INTERNAL_STATE_STOPING == client->internal_state && STT_STATE_PROCESSING == client->current_state) {
1781 client->internal_state = STT_INTERNAL_STATE_NONE;
1782 SLOG(LOG_DEBUG, TAG_STTC, "Internal state change to NONE");
1783 } else if (STT_INTERNAL_STATE_CANCELING == client->internal_state && STT_STATE_READY == client->current_state) {
1784 client->internal_state = STT_INTERNAL_STATE_NONE;
1785 SLOG(LOG_DEBUG, TAG_STTC, "Internal state change to NONE");
1788 if (NULL != client->state_changed_cb) {
1789 stt_client_use_callback(client);
1790 client->state_changed_cb(client->stt, client->before_state,
1791 client->current_state, client->state_changed_user_data);
1792 stt_client_not_use_callback(client);
1793 SLOG(LOG_DEBUG, TAG_STTC, "State changed callback is called");
1795 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
1801 static Eina_Bool __stt_notify_result(void *data)
1803 stt_client_s* client = (stt_client_s*)data;
1806 if (NULL == client) {
1807 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
1811 if (NULL == stt_client_get_by_uid(client->uid)) {
1815 if (NULL != client->recognition_result_cb) {
1816 stt_client_use_callback(client);
1817 client->recognition_result_cb(client->stt, client->event, (const char**)client->data_list, client->data_count,
1818 client->msg, client->recognition_result_user_data);
1819 stt_client_not_use_callback(client);
1820 SLOG(LOG_DEBUG, TAG_STTC, "client recognition result callback called");
1822 SLOG(LOG_WARN, TAG_STTC, "[WARNING] User recognition result callback is NULL");
1825 if (NULL != client->msg) {
1830 if (NULL != client->data_list) {
1832 temp = client->data_list;
1835 for (i = 0; i < client->data_count; i++) {
1836 if (NULL != temp[i]) {
1840 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result data is error");
1843 free(client->data_list);
1844 client->data_list = NULL;
1847 client->data_count = 0;
1849 stt_config_mgr_remove_time_info_file();
1851 if (STT_RESULT_EVENT_FINAL_RESULT == client->event || STT_RESULT_EVENT_ERROR == client->event) {
1852 client->before_state = client->current_state;
1853 client->current_state = STT_STATE_READY;
1855 if (NULL != client->state_changed_cb) {
1856 ecore_main_loop_thread_safe_call_async(__stt_notify_state_changed, client);
1858 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
1865 int __stt_cb_result(int uid, int event, char** data, int data_count, const char* msg)
1867 stt_client_s* client = NULL;
1869 client = stt_client_get_by_uid(uid);
1870 if (NULL == client) {
1871 SLOG(LOG_ERROR, TAG_STTC, "Handle is NOT valid");
1872 return STT_ERROR_INVALID_PARAMETER;
1876 SLOG(LOG_DEBUG, TAG_STTC, "Recognition Result Message = %s", msg);
1879 for (i = 0; i < data_count; i++) {
1880 if (NULL != data[i])
1881 SLOG(LOG_DEBUG, TAG_STTC, "Recognition Result[%d] = %s", i, data[i]);
1884 if (NULL != client->recognition_result_cb) {
1885 client->event = event;
1887 client->msg = strdup(msg);
1890 client->data_count = data_count;
1892 if (data_count > 0) {
1894 temp = (char**)calloc(data_count, sizeof(char*));
1896 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to allocate memory");
1897 return STT_ERROR_OUT_OF_MEMORY;
1900 for (i = 0; i < data_count; i++) {
1901 if (NULL != data[i])
1902 temp[i] = strdup(data[i]);
1904 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result data is error");
1907 client->data_list = temp;
1910 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] User result callback is null");
1913 ecore_timer_add(0, __stt_notify_result, client);
1915 return STT_ERROR_NONE;
1918 int __stt_cb_set_state(int uid, int state)
1920 stt_client_s* client = stt_client_get_by_uid(uid);
1921 if (NULL == client) {
1922 SLOG(LOG_ERROR, TAG_STTC, "Handle not found");
1926 stt_state_e state_from_daemon = (stt_state_e)state;
1928 if (client->current_state == state_from_daemon) {
1929 SLOG(LOG_DEBUG, TAG_STTC, "Current state has already been %d", client->current_state);
1933 client->before_state = client->current_state;
1934 client->current_state = state_from_daemon;
1936 ecore_main_loop_thread_safe_call_async(__stt_notify_state_changed, client);
1940 int stt_set_recognition_result_cb(stt_h stt, stt_recognition_result_cb callback, void* user_data)
1942 if (0 != __stt_get_feature_enabled()) {
1943 return STT_ERROR_NOT_SUPPORTED;
1945 if (0 != __stt_check_privilege()) {
1946 return STT_ERROR_PERMISSION_DENIED;
1949 if (stt == NULL || callback == NULL)
1950 return STT_ERROR_INVALID_PARAMETER;
1952 stt_client_s* client = stt_client_get(stt);
1955 if (NULL == client) {
1956 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1957 return STT_ERROR_INVALID_PARAMETER;
1960 if (STT_STATE_CREATED != client->current_state) {
1961 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
1962 return STT_ERROR_INVALID_STATE;
1965 client->recognition_result_cb = callback;
1966 client->recognition_result_user_data = user_data;
1971 int stt_unset_recognition_result_cb(stt_h stt)
1973 if (0 != __stt_get_feature_enabled()) {
1974 return STT_ERROR_NOT_SUPPORTED;
1976 if (0 != __stt_check_privilege()) {
1977 return STT_ERROR_PERMISSION_DENIED;
1981 return STT_ERROR_INVALID_PARAMETER;
1983 stt_client_s* client = stt_client_get(stt);
1986 if (NULL == client) {
1987 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1988 return STT_ERROR_INVALID_PARAMETER;
1991 if (STT_STATE_CREATED != client->current_state) {
1992 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
1993 return STT_ERROR_INVALID_STATE;
1996 client->recognition_result_cb = NULL;
1997 client->recognition_result_user_data = NULL;
2002 int stt_set_state_changed_cb(stt_h stt, stt_state_changed_cb callback, void* user_data)
2004 if (0 != __stt_get_feature_enabled()) {
2005 return STT_ERROR_NOT_SUPPORTED;
2007 if (0 != __stt_check_privilege()) {
2008 return STT_ERROR_PERMISSION_DENIED;
2011 if (NULL == stt || NULL == callback)
2012 return STT_ERROR_INVALID_PARAMETER;
2014 stt_client_s* client = stt_client_get(stt);
2017 if (NULL == client) {
2018 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
2019 return STT_ERROR_INVALID_PARAMETER;
2022 if (STT_STATE_CREATED != client->current_state) {
2023 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2024 return STT_ERROR_INVALID_STATE;
2027 client->state_changed_cb = callback;
2028 client->state_changed_user_data = user_data;
2033 int stt_unset_state_changed_cb(stt_h stt)
2035 if (0 != __stt_get_feature_enabled()) {
2036 return STT_ERROR_NOT_SUPPORTED;
2038 if (0 != __stt_check_privilege()) {
2039 return STT_ERROR_PERMISSION_DENIED;
2043 return STT_ERROR_INVALID_PARAMETER;
2045 stt_client_s* client = stt_client_get(stt);
2048 if (NULL == client) {
2049 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
2050 return STT_ERROR_INVALID_PARAMETER;
2053 if (STT_STATE_CREATED != client->current_state) {
2054 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2055 return STT_ERROR_INVALID_STATE;
2058 client->state_changed_cb = NULL;
2059 client->state_changed_user_data = NULL;
2064 int stt_set_error_cb(stt_h stt, stt_error_cb callback, void* user_data)
2066 if (0 != __stt_get_feature_enabled()) {
2067 return STT_ERROR_NOT_SUPPORTED;
2069 if (0 != __stt_check_privilege()) {
2070 return STT_ERROR_PERMISSION_DENIED;
2073 if (NULL == stt || NULL == callback)
2074 return STT_ERROR_INVALID_PARAMETER;
2076 stt_client_s* client = stt_client_get(stt);
2079 if (NULL == client) {
2080 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
2081 return STT_ERROR_INVALID_PARAMETER;
2084 if (STT_STATE_CREATED != client->current_state) {
2085 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2086 return STT_ERROR_INVALID_STATE;
2089 client->error_cb = callback;
2090 client->error_user_data = user_data;
2095 int stt_unset_error_cb(stt_h stt)
2097 if (0 != __stt_get_feature_enabled()) {
2098 return STT_ERROR_NOT_SUPPORTED;
2100 if (0 != __stt_check_privilege()) {
2101 return STT_ERROR_PERMISSION_DENIED;
2105 return STT_ERROR_INVALID_PARAMETER;
2107 stt_client_s* client = stt_client_get(stt);
2110 if (NULL == client) {
2111 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
2112 return STT_ERROR_INVALID_PARAMETER;
2115 if (STT_STATE_CREATED != client->current_state) {
2116 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2117 return STT_ERROR_INVALID_STATE;
2120 client->error_cb = NULL;
2121 client->error_user_data = NULL;
2126 int stt_set_default_language_changed_cb(stt_h stt, stt_default_language_changed_cb callback, void* user_data)
2128 if (0 != __stt_get_feature_enabled()) {
2129 return STT_ERROR_NOT_SUPPORTED;
2131 if (0 != __stt_check_privilege()) {
2132 return STT_ERROR_PERMISSION_DENIED;
2135 if (NULL == stt || NULL == callback)
2136 return STT_ERROR_INVALID_PARAMETER;
2138 stt_client_s* client = stt_client_get(stt);
2141 if (NULL == client) {
2142 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
2143 return STT_ERROR_INVALID_PARAMETER;
2146 if (STT_STATE_CREATED != client->current_state) {
2147 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2148 return STT_ERROR_INVALID_STATE;
2151 client->default_lang_changed_cb = callback;
2152 client->default_lang_changed_user_data = user_data;
2157 int stt_unset_default_language_changed_cb(stt_h stt)
2159 if (0 != __stt_get_feature_enabled()) {
2160 return STT_ERROR_NOT_SUPPORTED;
2162 if (0 != __stt_check_privilege()) {
2163 return STT_ERROR_PERMISSION_DENIED;
2167 return STT_ERROR_INVALID_PARAMETER;
2169 stt_client_s* client = stt_client_get(stt);
2172 if (NULL == client) {
2173 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
2174 return STT_ERROR_INVALID_PARAMETER;
2177 if (STT_STATE_CREATED != client->current_state) {
2178 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2179 return STT_ERROR_INVALID_STATE;
2182 client->default_lang_changed_cb = NULL;
2183 client->default_lang_changed_user_data = NULL;
2188 int stt_set_engine_changed_cb(stt_h stt, stt_engine_changed_cb callback, void* user_data)
2190 if (0 != __stt_get_feature_enabled()) {
2191 return STT_ERROR_NOT_SUPPORTED;
2193 if (0 != __stt_check_privilege()) {
2194 return STT_ERROR_PERMISSION_DENIED;
2197 if (NULL == stt || NULL == callback)
2198 return STT_ERROR_INVALID_PARAMETER;
2200 stt_client_s* client = stt_client_get(stt);
2203 if (NULL == client) {
2204 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
2205 return STT_ERROR_INVALID_PARAMETER;
2208 if (STT_STATE_CREATED != client->current_state) {
2209 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2210 return STT_ERROR_INVALID_STATE;
2213 client->engine_changed_cb = callback;
2214 client->engine_changed_user_data = user_data;
2219 int stt_unset_engine_changed_cb(stt_h stt)
2221 if (0 != __stt_get_feature_enabled()) {
2222 return STT_ERROR_NOT_SUPPORTED;
2224 if (0 != __stt_check_privilege()) {
2225 return STT_ERROR_PERMISSION_DENIED;
2229 return STT_ERROR_INVALID_PARAMETER;
2231 stt_client_s* client = stt_client_get(stt);
2234 if (NULL == client) {
2235 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
2236 return STT_ERROR_INVALID_PARAMETER;
2239 if (STT_STATE_CREATED != client->current_state) {
2240 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2241 return STT_ERROR_INVALID_STATE;
2244 client->engine_changed_cb = NULL;
2245 client->engine_changed_user_data = NULL;