2 * Copyright (c) 2011-2016 Samsung Electronics Co., Ltd All Rights Reserved
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 * http://www.apache.org/licenses/LICENSE-2.0
7 * Unless required by applicable law or agreed to in writing, software
8 * distributed under the License is distributed on an "AS IS" BASIS,
9 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 * See the License for the specific language governing permissions and
11 * limitations under the License.
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>
30 #include "stt_client.h"
32 #include "stt_config_mgr.h"
33 #include "stt_internal.h"
37 static void __stt_notify_state_changed(void *data);
38 static Eina_Bool __stt_notify_error(void *data);
40 static Ecore_Timer* g_connect_timer = NULL;
41 static float g_volume_db = 0;
43 static int g_feature_enabled = -1;
45 static int g_privilege_allowed = -1;
46 static cynara *p_cynara = NULL;
48 static bool g_err_callback_status = false;
55 static int __stt_get_feature_enabled()
57 if (0 == g_feature_enabled) {
58 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
59 return STT_ERROR_NOT_SUPPORTED;
60 } else if (-1 == g_feature_enabled) {
61 bool stt_supported = false;
62 bool mic_supported = false;
63 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
64 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
65 if (false == stt_supported || false == mic_supported) {
66 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
67 g_feature_enabled = 0;
68 return STT_ERROR_NOT_SUPPORTED;
71 g_feature_enabled = 1;
73 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get feature value");
74 return STT_ERROR_NOT_SUPPORTED;
77 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get feature value");
78 return STT_ERROR_NOT_SUPPORTED;
85 static int __check_privilege_initialize()
87 int ret = cynara_initialize(&p_cynara, NULL);
88 if (CYNARA_API_SUCCESS != ret)
89 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] fail to initialize");
91 return ret == CYNARA_API_SUCCESS;
94 static int __check_privilege(const char* uid, const char * privilege)
97 char label_path[1024] = "/proc/self/attr/current";
98 char smack_label[1024] = {'\0',};
104 fp = fopen(label_path, "r");
106 if (fread(smack_label, 1, sizeof(smack_label), fp) <= 0)
107 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] fail to fread");
112 pid_t pid = getpid();
113 char *session = cynara_session_from_pid(pid);
114 int ret = cynara_check(p_cynara, smack_label, session, uid, privilege);
115 SLOG(LOG_DEBUG, TAG_STTC, "[Client]cynara_check returned %d(%s)", ret, (CYNARA_API_ACCESS_ALLOWED == ret) ? "Allowed" : "Denied");
121 if (ret != CYNARA_API_ACCESS_ALLOWED)
126 static void __check_privilege_deinitialize()
129 cynara_finish(p_cynara);
133 static int __stt_check_privilege()
137 if (0 == g_privilege_allowed) {
138 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Permission is denied");
139 return STT_ERROR_PERMISSION_DENIED;
140 } else if (-1 == g_privilege_allowed) {
141 if (false == __check_privilege_initialize()) {
142 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] privilege initialize is failed");
143 return STT_ERROR_PERMISSION_DENIED;
145 snprintf(uid, 16, "%d", getuid());
146 if (false == __check_privilege(uid, STT_PRIVILEGE)) {
147 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Permission is denied");
148 g_privilege_allowed = 0;
149 __check_privilege_deinitialize();
150 return STT_ERROR_PERMISSION_DENIED;
152 __check_privilege_deinitialize();
155 g_privilege_allowed = 1;
156 return STT_ERROR_NONE;
159 static const char* __stt_get_error_code(stt_error_e err)
162 case STT_ERROR_NONE: return "STT_ERROR_NONE";
163 case STT_ERROR_OUT_OF_MEMORY: return "STT_ERROR_OUT_OF_MEMORY";
164 case STT_ERROR_IO_ERROR: return "STT_ERROR_IO_ERROR";
165 case STT_ERROR_INVALID_PARAMETER: return "STT_ERROR_INVALID_PARAMETER";
166 case STT_ERROR_TIMED_OUT: return "STT_ERROR_TIMED_OUT";
167 case STT_ERROR_RECORDER_BUSY: return "STT_ERROR_RECORDER_BUSY";
168 case STT_ERROR_OUT_OF_NETWORK: return "STT_ERROR_OUT_OF_NETWORK";
169 case STT_ERROR_PERMISSION_DENIED: return "STT_ERROR_PERMISSION_DENIED";
170 case STT_ERROR_NOT_SUPPORTED: return "STT_ERROR_NOT_SUPPORTED";
171 case STT_ERROR_INVALID_STATE: return "STT_ERROR_INVALID_STATE";
172 case STT_ERROR_INVALID_LANGUAGE: return "STT_ERROR_INVALID_LANGUAGE";
173 case STT_ERROR_ENGINE_NOT_FOUND: return "STT_ERROR_ENGINE_NOT_FOUND";
174 case STT_ERROR_OPERATION_FAILED: return "STT_ERROR_OPERATION_FAILED";
175 case STT_ERROR_NOT_SUPPORTED_FEATURE: return "STT_ERROR_NOT_SUPPORTED_FEATURE";
176 case STT_ERROR_SERVICE_RESET: return "STT_ERROR_SERVICE_RESET";
178 return "Invalid error code";
182 static int __stt_convert_config_error_code(stt_config_error_e code)
184 if (code == STT_CONFIG_ERROR_NONE) return STT_ERROR_NONE;
185 if (code == STT_CONFIG_ERROR_OUT_OF_MEMORY) return STT_ERROR_OUT_OF_MEMORY;
186 if (code == STT_CONFIG_ERROR_IO_ERROR) return STT_ERROR_IO_ERROR;
187 if (code == STT_CONFIG_ERROR_INVALID_PARAMETER) return STT_ERROR_INVALID_PARAMETER;
188 if (code == STT_CONFIG_ERROR_PERMISSION_DENIED) return STT_ERROR_PERMISSION_DENIED;
189 if (code == STT_CONFIG_ERROR_NOT_SUPPORTED) return STT_ERROR_NOT_SUPPORTED;
190 if (code == STT_CONFIG_ERROR_INVALID_STATE) return STT_ERROR_INVALID_STATE;
191 if (code == STT_CONFIG_ERROR_INVALID_LANGUAGE) return STT_ERROR_INVALID_LANGUAGE;
192 if (code == STT_CONFIG_ERROR_ENGINE_NOT_FOUND) return STT_ERROR_ENGINE_NOT_FOUND;
193 if (code == STT_CONFIG_ERROR_OPERATION_FAILED) return STT_ERROR_OPERATION_FAILED;
198 void __stt_config_lang_changed_cb(const char* before_language, const char* current_language, void* user_data)
200 SLOG(LOG_DEBUG, TAG_STTC, "Language changed : Before lang(%s) Current lang(%s)",
201 before_language, current_language);
203 if (0 == strcmp(before_language, current_language)) {
207 GList* client_list = NULL;
208 client_list = stt_client_get_client_list();
211 stt_client_s *data = NULL;
213 if (g_list_length(client_list) > 0) {
214 /* Get a first item */
215 iter = g_list_first(client_list);
217 while (NULL != iter) {
219 if (NULL != data->default_lang_changed_cb) {
220 SLOG(LOG_DEBUG, TAG_STTC, "Call default language changed callback : uid(%d)", data->uid);
221 data->default_lang_changed_cb(data->stt, before_language, current_language,
222 data->default_lang_changed_user_data);
226 iter = g_list_next(iter);
233 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)
235 stt_h stt = (stt_h)user_data;
237 stt_client_s* client = stt_client_get(stt);
238 if (NULL == client) {
239 SLOG(LOG_ERROR, TAG_STTC, "[WARNING] A handle is not valid");
243 if (NULL != engine_id) SLOG(LOG_DEBUG, TAG_STTC, "Engine id(%s)", engine_id);
244 if (NULL != setting) SLOG(LOG_DEBUG, TAG_STTC, "Engine setting(%s)", setting);
245 if (NULL != language) SLOG(LOG_DEBUG, TAG_STTC, "Language(%s)", language);
246 SLOG(LOG_DEBUG, TAG_STTC, "Silence(%s), Credential(%s)", support_silence ? "on" : "off", need_credential ? "need" : "no need");
248 /* call callback function */
249 if (NULL != client->engine_changed_cb) {
250 client->engine_changed_cb(stt, engine_id, language, support_silence, need_credential, client->engine_changed_user_data);
252 SLOG(LOG_WARN, TAG_STTC, "No registered callback function for engine change");
257 static int __stt_check_handle(stt_h stt, stt_client_s** client)
260 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input handle is null");
261 return STT_ERROR_INVALID_PARAMETER;
264 stt_client_s* temp = NULL;
265 temp = stt_client_get(stt);
269 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
270 return STT_ERROR_INVALID_PARAMETER;
274 return STT_ERROR_NONE;
277 int stt_create(stt_h* stt)
279 if (0 != __stt_get_feature_enabled()) {
280 return STT_ERROR_NOT_SUPPORTED;
282 if (0 != __stt_check_privilege()) {
283 return STT_ERROR_PERMISSION_DENIED;
286 SLOG(LOG_DEBUG, TAG_STTC, "===== Create STT");
289 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is null");
290 return STT_ERROR_INVALID_PARAMETER;
293 if (0 == stt_client_get_size()) {
294 if (0 != stt_dbus_open_connection()) {
295 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to open connection");
296 return STT_ERROR_OPERATION_FAILED;
300 if (0 != stt_client_new(stt)) {
301 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to create client!");
302 return STT_ERROR_OUT_OF_MEMORY;
305 stt_client_s* client = stt_client_get(*stt);
306 if (NULL == client) {
307 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to create client");
308 stt_client_destroy(*stt);
309 return STT_ERROR_OPERATION_FAILED;
312 int ret = stt_config_mgr_initialize(client->uid);
313 ret = __stt_convert_config_error_code(ret);
315 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to init config manager : %s", __stt_get_error_code(ret));
316 stt_client_destroy(*stt);
320 ret = stt_config_mgr_set_callback(client->uid, __stt_config_engine_changed_cb, __stt_config_lang_changed_cb, NULL, client->stt);
321 ret = __stt_convert_config_error_code(ret);
323 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set config changed : %s", __stt_get_error_code(ret));
324 stt_client_destroy(*stt);
328 SLOG(LOG_DEBUG, TAG_STTC, "[Success] uid(%d)", (*stt)->handle);
330 SLOG(LOG_DEBUG, TAG_STTC, "=====");
331 SLOG(LOG_DEBUG, TAG_STTC, " ");
333 return STT_ERROR_NONE;
336 int stt_destroy(stt_h stt)
338 stt_client_s* client = NULL;
339 if (0 != __stt_get_feature_enabled()) {
340 return STT_ERROR_NOT_SUPPORTED;
342 if (0 != __stt_check_privilege()) {
343 return STT_ERROR_PERMISSION_DENIED;
345 if (0 != __stt_check_handle(stt, &client)) {
346 return STT_ERROR_INVALID_PARAMETER;
349 SLOG(LOG_DEBUG, TAG_STTC, "===== Destroy STT");
351 /* check used callback */
352 if (0 != stt_client_get_use_callback(client)) {
353 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Cannot destroy in Callback function");
354 return STT_ERROR_OPERATION_FAILED;
357 stt_config_mgr_finalize(client->uid);
362 switch (client->current_state) {
363 case STT_STATE_PROCESSING:
364 case STT_STATE_RECORDING:
365 case STT_STATE_READY:
366 ret = stt_dbus_request_finalize(client->uid);
368 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request finalize : %s", __stt_get_error_code(ret));
370 case STT_STATE_CREATED:
371 if (NULL != g_connect_timer) {
372 SLOG(LOG_DEBUG, TAG_STTC, "Connect Timer is deleted");
373 ecore_timer_del(g_connect_timer);
374 g_connect_timer = NULL;
378 stt_client_destroy(stt);
384 if (0 == stt_client_get_size()) {
385 if (0 != stt_dbus_close_connection()) {
386 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to close connection");
392 SLOG(LOG_DEBUG, TAG_STTC, "=====");
393 SLOG(LOG_DEBUG, TAG_STTC, " ");
395 return STT_ERROR_NONE;
398 bool __stt_config_supported_engine_cb(const char* engine_id, const char* engine_name,
399 const char* setting, bool support_silence, void* user_data)
401 stt_h stt = (stt_h)user_data;
403 stt_client_s* client = stt_client_get(stt);
404 if (NULL == client) {
405 SLOG(LOG_ERROR, TAG_STTC, "[WARNING] A handle is not valid");
409 /* call callback function */
410 if (NULL != client->supported_engine_cb) {
411 return client->supported_engine_cb(stt, engine_id, engine_name, client->supported_engine_user_data);
413 SLOG(LOG_WARN, TAG_STTC, "No registered callback function of supported engine");
419 int stt_foreach_supported_engines(stt_h stt, stt_supported_engine_cb callback, void* user_data)
421 stt_client_s* client = NULL;
422 if (0 != __stt_get_feature_enabled()) {
423 return STT_ERROR_NOT_SUPPORTED;
425 if (0 != __stt_check_privilege()) {
426 return STT_ERROR_PERMISSION_DENIED;
428 if (0 != __stt_check_handle(stt, &client)) {
429 return STT_ERROR_INVALID_PARAMETER;
432 SLOG(LOG_DEBUG, TAG_STTC, "===== Foreach Supported engine");
434 if (NULL == callback) {
435 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
436 return STT_ERROR_INVALID_PARAMETER;
439 if (client->current_state != STT_STATE_CREATED) {
440 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not CREATED", client->current_state);
441 return STT_ERROR_INVALID_STATE;
444 client->supported_engine_cb = callback;
445 client->supported_engine_user_data = user_data;
448 ret = stt_config_mgr_get_engine_list(__stt_config_supported_engine_cb, client->stt);
449 ret = __stt_convert_config_error_code(ret);
451 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get engines : %s", __stt_get_error_code(ret));
454 client->supported_engine_cb = NULL;
455 client->supported_engine_user_data = NULL;
457 SLOG(LOG_DEBUG, TAG_STTC, "=====");
458 SLOG(LOG_DEBUG, TAG_STTC, " ");
463 int stt_get_engine(stt_h stt, char** engine_id)
465 stt_client_s* client = NULL;
466 if (0 != __stt_get_feature_enabled()) {
467 return STT_ERROR_NOT_SUPPORTED;
469 if (0 != __stt_check_privilege()) {
470 return STT_ERROR_PERMISSION_DENIED;
472 if (0 != __stt_check_handle(stt, &client)) {
473 return STT_ERROR_INVALID_PARAMETER;
476 SLOG(LOG_DEBUG, TAG_STTC, "===== Get current engine");
478 if (NULL == engine_id) {
479 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
480 return STT_ERROR_INVALID_PARAMETER;
483 if (client->current_state != STT_STATE_CREATED) {
484 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not CREATED", client->current_state);
485 return STT_ERROR_INVALID_STATE;
490 if (NULL != client->current_engine_id) {
491 *engine_id = strdup(client->current_engine_id);
492 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current engine uuid = %s", *engine_id);
495 ret = stt_config_mgr_get_engine(engine_id);
496 ret = __stt_convert_config_error_code(ret);
498 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request get current engine : %s", __stt_get_error_code(ret));
500 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current engine uuid = %s", *engine_id);
504 SLOG(LOG_DEBUG, TAG_STTC, "=====");
505 SLOG(LOG_DEBUG, TAG_STTC, " ");
510 int __stt_set_buxtonkey(const char* engine_id)
513 struct buxton_client * bux_cli;
514 struct buxton_layer * bux_layer;
515 struct buxton_value * bux_val;
517 int ret = buxton_open(&bux_cli, NULL, NULL);
519 SLOG(LOG_ERROR, stt_tag(), "[DBUS-BUXTON2] Fail to open buxton client");
520 return STT_ERROR_OPERATION_FAILED;
522 SLOG(LOG_DEBUG, stt_tag(), "[DBUS-BUXTON2] buxton_open: %d", ret);
523 bux_layer = buxton_create_layer("system");
524 if (NULL == bux_layer) {
525 SLOG(LOG_ERROR, stt_tag(), "[DBUS-BUXTON2] buxton_create_layer FAIL");
526 buxton_close(bux_cli);
528 return STT_ERROR_OPERATION_FAILED;
530 bux_val = buxton_value_create_string(engine_id);
531 if (NULL == bux_val) {
532 SLOG(LOG_ERROR, stt_tag(), "[DBUS-BUXTON2] buxton_value_create_string FAIL");
533 buxton_free_layer(bux_layer);
534 buxton_close(bux_cli);
537 return STT_ERROR_OPERATION_FAILED;
540 ret = buxton_set_value_sync(bux_cli, bux_layer, STT_ENGINE_DB_CUSTOM, bux_val);
542 SLOG(LOG_ERROR, stt_tag(), "[DBUS-BUXTON2] Fail to set value sync");
543 buxton_value_free(bux_val);
544 buxton_free_layer(bux_layer);
545 buxton_close(bux_cli);
550 return STT_ERROR_OPERATION_FAILED;
552 SLOG(LOG_DEBUG, stt_tag(), "[DBUS-BUXTON2] buxton_set_value_sync: %d, %s", ret, STT_ENGINE_DB_CUSTOM);
554 buxton_value_free(bux_val);
555 buxton_free_layer(bux_layer);
556 buxton_close(bux_cli);
562 return STT_ERROR_NONE;
565 int stt_set_engine(stt_h stt, const char* engine_id)
567 stt_client_s* client = NULL;
568 if (0 != __stt_get_feature_enabled()) {
569 return STT_ERROR_NOT_SUPPORTED;
571 if (0 != __stt_check_privilege()) {
572 return STT_ERROR_PERMISSION_DENIED;
574 if (0 != __stt_check_handle(stt, &client)) {
575 return STT_ERROR_INVALID_PARAMETER;
578 SLOG(LOG_DEBUG, TAG_STTC, "===== Set current engine");
580 if (NULL == engine_id) {
581 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
582 return STT_ERROR_INVALID_PARAMETER;
586 if (client->current_state != STT_STATE_CREATED) {
587 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not CREATED", client->current_state);
588 return STT_ERROR_INVALID_STATE;
591 if (NULL != client->current_engine_id) {
592 free(client->current_engine_id);
593 client->current_engine_id = NULL;
596 SLOG(LOG_DEBUG, TAG_STTC, "===== engined_id(%s)", engine_id);
598 client->current_engine_id = strdup(engine_id);
601 int ret = __stt_set_buxtonkey(engine_id);
603 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] set buxtonkey Failed!!!");
607 SLOG(LOG_DEBUG, TAG_STTC, "=====");
608 SLOG(LOG_DEBUG, TAG_STTC, " ");
613 int stt_set_credential(stt_h stt, const char* credential)
615 stt_client_s* client = NULL;
616 if (0 != __stt_get_feature_enabled()) {
617 return STT_ERROR_NOT_SUPPORTED;
619 if (0 != __stt_check_privilege()) {
620 return STT_ERROR_PERMISSION_DENIED;
622 if (0 != __stt_check_handle(stt, &client)) {
623 return STT_ERROR_INVALID_PARAMETER;
626 SLOG(LOG_DEBUG, TAG_STTC, "===== Set credential");
628 if (NULL == credential) {
629 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
630 return STT_ERROR_INVALID_PARAMETER;
634 if (client->current_state != STT_STATE_CREATED && client->current_state != STT_STATE_READY) {
635 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not CREATED or READY", client->current_state);
636 return STT_ERROR_INVALID_STATE;
639 if (NULL != client->credential) {
640 free(client->credential);
641 client->credential = NULL;
643 client->credential = strdup(credential);
645 SLOG(LOG_DEBUG, TAG_STTC, "=====");
646 SLOG(LOG_DEBUG, TAG_STTC, " ");
648 return STT_ERROR_NONE;
651 int stt_set_private_data(stt_h stt, const char* key, const char* data)
653 stt_client_s* client = NULL;
654 if (0 != __stt_get_feature_enabled()) {
655 return STT_ERROR_NOT_SUPPORTED;
657 if (0 != __stt_check_privilege()) {
658 return STT_ERROR_PERMISSION_DENIED;
660 if (0 != __stt_check_handle(stt, &client)) {
661 return STT_ERROR_INVALID_PARAMETER;
664 SLOG(LOG_DEBUG, TAG_STTC, "===== Set private data");
666 if (NULL == key || NULL == data) {
667 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid parameter");
668 return STT_ERROR_INVALID_PARAMETER;
672 if (STT_STATE_READY != client->current_state) {
673 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
674 return STT_ERROR_INVALID_STATE;
680 ret = stt_dbus_request_set_private_data(client->uid, key, data);
682 if (STT_ERROR_TIMED_OUT != ret) {
683 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set private data : %s", __stt_get_error_code(ret));
686 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry : %s", __stt_get_error_code(ret));
689 if (STT_RETRY_COUNT == count) {
690 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
697 SLOG(LOG_DEBUG, TAG_STTC, "=====");
698 SLOG(LOG_DEBUG, TAG_STTC, "");
700 return STT_ERROR_NONE;
703 int stt_get_private_data(stt_h stt, const char* key, char** data)
705 stt_client_s* client = NULL;
706 if (0 != __stt_get_feature_enabled()) {
707 return STT_ERROR_NOT_SUPPORTED;
709 if (0 != __stt_check_privilege()) {
710 return STT_ERROR_PERMISSION_DENIED;
712 if (0 != __stt_check_handle(stt, &client)) {
713 return STT_ERROR_INVALID_PARAMETER;
716 SLOG(LOG_DEBUG, TAG_STTC, "===== Get private data");
718 if (NULL == key || NULL == data) {
719 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid parameter");
720 return STT_ERROR_INVALID_PARAMETER;
724 if (STT_STATE_READY != client->current_state) {
725 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
726 return STT_ERROR_INVALID_STATE;
732 ret = stt_dbus_request_get_private_data(client->uid, key, data);
734 if (STT_ERROR_TIMED_OUT != ret) {
735 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get private data : %s", __stt_get_error_code(ret));
738 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry : %s", __stt_get_error_code(ret));
741 if (STT_RETRY_COUNT == count) {
742 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
749 if (0 == strncmp(*data, "NULL", strlen(*data))) {
754 SLOG(LOG_DEBUG, TAG_STTC, "=====");
755 SLOG(LOG_DEBUG, TAG_STTC, "");
757 return STT_ERROR_NONE;
759 static Eina_Bool __stt_connect_daemon(void *data)
761 stt_client_s* client = (stt_client_s*)data;
763 if (NULL == client) {
764 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
765 g_connect_timer = NULL;
771 ret = stt_dbus_request_hello(client->uid);
774 if (STT_ERROR_INVALID_STATE == ret) {
775 g_connect_timer = NULL;
781 g_connect_timer = NULL;
782 SLOG(LOG_DEBUG, TAG_STTC, "===== Connect stt-service");
784 /* request initialization */
785 bool silence_supported = false;
786 bool credential_needed = false;
788 ret = stt_dbus_request_initialize(client->uid, &silence_supported, &credential_needed);
790 if (STT_ERROR_ENGINE_NOT_FOUND == ret) {
791 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to initialize : %s", __stt_get_error_code(ret));
793 client->reason = STT_ERROR_ENGINE_NOT_FOUND;
794 ecore_timer_add(0, __stt_notify_error, (void*)client);
798 } else if (STT_ERROR_NONE != ret) {
799 SLOG(LOG_ERROR, TAG_STTC, "[WARNING] Fail to connection. Retry to connect");
802 /* success to connect stt-service */
803 client->silence_supported = silence_supported;
804 client->credential_needed = credential_needed;
805 SLOG(LOG_DEBUG, TAG_STTC, "Supported options : silence(%s), credential(%s)", silence_supported ? "support" : "no support", credential_needed ? "need" : "no need");
808 #ifdef __UNUSED_CODES__
809 if (NULL != client->current_engine_id) {
812 silence_supported = false;
813 credential_needed = false;
814 SLOG(LOG_DEBUG, TAG_STTC, "[WARNING] current_engine_id(%s)", client->current_engine_id);
817 ret = stt_dbus_request_set_current_engine(client->uid, client->current_engine_id, &silence_supported, &credential_needed);
819 if (STT_ERROR_TIMED_OUT != ret) {
820 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set current engine : %s", __stt_get_error_code(ret));
823 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
826 if (STT_RETRY_COUNT == count) {
827 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
832 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current engine uuid = %s", client->current_engine_id);
834 /* success to change engine */
835 client->silence_supported = silence_supported;
836 SLOG(LOG_DEBUG, TAG_STTC, "Supported options : silence(%s), credential(%s)", silence_supported ? "support" : "no support", credential_needed ? "need" : "no need");
841 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] uid(%d)", client->uid);
843 client->before_state = client->current_state;
844 client->current_state = STT_STATE_READY;
846 if (NULL != client->state_changed_cb) {
847 stt_client_use_callback(client);
848 client->state_changed_cb(client->stt, client->before_state,
849 client->current_state, client->state_changed_user_data);
850 stt_client_not_use_callback(client);
851 SLOG(LOG_DEBUG, TAG_STTC, "State changed callback is called");
853 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
856 SLOG(LOG_DEBUG, TAG_STTC, "=====");
857 SLOG(LOG_DEBUG, TAG_STTC, " ");
862 int stt_prepare(stt_h stt)
864 stt_client_s* client = NULL;
865 if (0 != __stt_get_feature_enabled()) {
866 return STT_ERROR_NOT_SUPPORTED;
868 if (0 != __stt_check_privilege()) {
869 return STT_ERROR_PERMISSION_DENIED;
871 if (0 != __stt_check_handle(stt, &client)) {
872 return STT_ERROR_INVALID_PARAMETER;
876 if (client->current_state != STT_STATE_CREATED) {
877 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not 'CREATED'", client->current_state);
878 return STT_ERROR_INVALID_STATE;
881 g_connect_timer = ecore_timer_add(0, __stt_connect_daemon, (void*)client);
883 SLOG(LOG_DEBUG, TAG_STTC, "=====");
884 SLOG(LOG_DEBUG, TAG_STTC, " ");
886 return STT_ERROR_NONE;
889 int stt_unprepare(stt_h stt)
891 stt_client_s* client = NULL;
892 if (0 != __stt_get_feature_enabled()) {
893 return STT_ERROR_NOT_SUPPORTED;
895 if (0 != __stt_check_privilege()) {
896 return STT_ERROR_PERMISSION_DENIED;
898 if (0 != __stt_check_handle(stt, &client)) {
899 return STT_ERROR_INVALID_PARAMETER;
902 SLOG(LOG_DEBUG, TAG_STTC, "===== Unprepare STT");
905 if (client->current_state != STT_STATE_READY) {
906 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", client->current_state);
907 return STT_ERROR_INVALID_STATE;
913 ret = stt_dbus_request_finalize(client->uid);
915 if (STT_ERROR_TIMED_OUT != ret) {
916 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request finalize : %s", __stt_get_error_code(ret));
919 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
922 if (STT_RETRY_COUNT == count) {
923 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
930 client->internal_state = STT_INTERNAL_STATE_NONE;
932 client->before_state = client->current_state;
933 client->current_state = STT_STATE_CREATED;
935 if (NULL != client->state_changed_cb) {
936 stt_client_use_callback(client);
937 client->state_changed_cb(client->stt, client->before_state,
938 client->current_state, client->state_changed_user_data);
939 stt_client_not_use_callback(client);
941 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
944 if (g_connect_timer) {
945 ecore_timer_del(g_connect_timer);
946 g_connect_timer = NULL;
949 SLOG(LOG_DEBUG, TAG_STTC, "=====");
950 SLOG(LOG_DEBUG, TAG_STTC, " ");
952 return STT_ERROR_NONE;
955 bool __stt_config_supported_language_cb(const char* engine_id, const char* language, void* user_data)
957 stt_h stt = (stt_h)user_data;
959 stt_client_s* client = stt_client_get(stt);
960 if (NULL == client) {
961 SLOG(LOG_ERROR, TAG_STTC, "[WARNING] A handle is not valid");
965 /* call callback function */
966 if (NULL != client->supported_lang_cb) {
967 return client->supported_lang_cb(stt, language, client->supported_lang_user_data);
969 SLOG(LOG_WARN, TAG_STTC, "No registered callback function of supported languages");
975 int stt_foreach_supported_languages(stt_h stt, stt_supported_language_cb callback, void* user_data)
977 stt_client_s* client = NULL;
978 if (0 != __stt_get_feature_enabled()) {
979 return STT_ERROR_NOT_SUPPORTED;
981 if (0 != __stt_check_privilege()) {
982 return STT_ERROR_PERMISSION_DENIED;
984 if (0 != __stt_check_handle(stt, &client)) {
985 return STT_ERROR_INVALID_PARAMETER;
988 SLOG(LOG_DEBUG, TAG_STTC, "===== Foreach Supported Language");
990 if (NULL == callback) {
991 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
992 return STT_ERROR_INVALID_PARAMETER;
996 char* current_engine_id = NULL;
998 if (NULL == client->current_engine_id) {
999 ret = stt_config_mgr_get_engine(¤t_engine_id);
1000 ret = __stt_convert_config_error_code(ret);
1002 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get default engine id : %s", __stt_get_error_code(ret));
1006 current_engine_id = strdup(client->current_engine_id);
1007 if (NULL == current_engine_id) {
1008 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to allocate memory");
1009 return STT_ERROR_OUT_OF_MEMORY;
1013 client->supported_lang_cb = callback;
1014 client->supported_lang_user_data = user_data;
1016 ret = stt_config_mgr_get_language_list(current_engine_id, __stt_config_supported_language_cb, client->stt);
1017 ret = __stt_convert_config_error_code(ret);
1019 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get languages : %s", __stt_get_error_code(ret));
1022 if (NULL != current_engine_id) {
1023 free(current_engine_id);
1024 current_engine_id = NULL;
1027 client->supported_lang_cb = NULL;
1028 client->supported_lang_user_data = NULL;
1030 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1031 SLOG(LOG_DEBUG, TAG_STTC, " ");
1036 int stt_get_default_language(stt_h stt, char** language)
1038 stt_client_s* client = NULL;
1039 if (0 != __stt_get_feature_enabled()) {
1040 return STT_ERROR_NOT_SUPPORTED;
1042 if (0 != __stt_check_privilege()) {
1043 return STT_ERROR_PERMISSION_DENIED;
1045 if (0 != __stt_check_handle(stt, &client)) {
1046 return STT_ERROR_INVALID_PARAMETER;
1049 SLOG(LOG_DEBUG, TAG_STTC, "===== Get Default Language");
1051 if (NULL == language) {
1052 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1053 return STT_ERROR_INVALID_PARAMETER;
1057 ret = stt_config_mgr_get_default_language(language);
1058 ret = __stt_convert_config_error_code(ret);
1060 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get default language : %s", __stt_get_error_code(ret));
1062 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current language = %s", *language);
1065 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1066 SLOG(LOG_DEBUG, TAG_STTC, " ");
1071 int stt_get_state(stt_h stt, stt_state_e* state)
1073 stt_client_s* client = NULL;
1074 if (0 != __stt_get_feature_enabled()) {
1075 return STT_ERROR_NOT_SUPPORTED;
1077 if (0 != __stt_check_privilege()) {
1078 return STT_ERROR_PERMISSION_DENIED;
1080 if (0 != __stt_check_handle(stt, &client)) {
1081 return STT_ERROR_INVALID_PARAMETER;
1084 if (NULL == state) {
1085 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1086 return STT_ERROR_INVALID_PARAMETER;
1089 *state = client->current_state;
1092 case STT_STATE_CREATED: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'CREATED'"); break;
1093 case STT_STATE_READY: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'Ready'"); break;
1094 case STT_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'Recording'"); break;
1095 case STT_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'Processing'"); break;
1096 default: SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid value"); break;
1099 return STT_ERROR_NONE;
1102 int stt_get_error_message(stt_h stt, char** err_msg)
1104 stt_client_s* client = NULL;
1105 if (0 != __stt_get_feature_enabled()) {
1106 return STT_ERROR_NOT_SUPPORTED;
1108 if (0 != __stt_check_privilege()) {
1109 return STT_ERROR_PERMISSION_DENIED;
1111 if (0 != __stt_check_handle(stt, &client)) {
1112 return STT_ERROR_INVALID_PARAMETER;
1115 if (NULL == err_msg) {
1116 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1117 return STT_ERROR_INVALID_PARAMETER;
1120 if (false == g_err_callback_status) {
1121 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] This callback should be called during an err_callback");
1122 return STT_ERROR_OPERATION_FAILED;
1125 if (NULL != client->err_msg) {
1126 *err_msg = strdup(client->err_msg);
1127 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Error msg (%s)", *err_msg);
1129 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Error msg (NULL)");
1132 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1133 SLOG(LOG_DEBUG, TAG_STTC, " ");
1135 return STT_ERROR_NONE;
1138 int stt_is_recognition_type_supported(stt_h stt, const char* type, bool* support)
1140 stt_client_s* client = NULL;
1141 if (0 != __stt_get_feature_enabled()) {
1142 return STT_ERROR_NOT_SUPPORTED;
1144 if (0 != __stt_check_privilege()) {
1145 return STT_ERROR_PERMISSION_DENIED;
1147 if (0 != __stt_check_handle(stt, &client)) {
1148 return STT_ERROR_INVALID_PARAMETER;
1151 if (NULL == type || NULL == support) {
1152 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1153 return STT_ERROR_INVALID_PARAMETER;
1157 if (client->current_state != STT_STATE_READY) {
1158 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
1159 return STT_ERROR_INVALID_STATE;
1165 ret = stt_dbus_request_is_recognition_type_supported(client->uid, type, support);
1167 if (STT_ERROR_TIMED_OUT != ret) {
1168 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get recognition type supported : %s", __stt_get_error_code(ret));
1171 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1174 if (STT_RETRY_COUNT == count) {
1175 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1180 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] recognition type is %s", *support ? "true " : "false");
1185 return STT_ERROR_NONE;
1188 int stt_set_silence_detection(stt_h stt, stt_option_silence_detection_e type)
1190 stt_client_s* client = NULL;
1191 if (0 != __stt_get_feature_enabled()) {
1192 return STT_ERROR_NOT_SUPPORTED;
1194 if (0 != __stt_check_privilege()) {
1195 return STT_ERROR_PERMISSION_DENIED;
1197 if (0 != __stt_check_handle(stt, &client)) {
1198 return STT_ERROR_INVALID_PARAMETER;
1202 if (client->current_state != STT_STATE_READY) {
1203 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
1204 return STT_ERROR_INVALID_STATE;
1207 if (true == client->silence_supported) {
1208 if (type >= STT_OPTION_SILENCE_DETECTION_FALSE && type <= STT_OPTION_SILENCE_DETECTION_AUTO) {
1209 client->silence = type;
1211 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Type is invalid");
1212 return STT_ERROR_INVALID_PARAMETER;
1215 return STT_ERROR_NOT_SUPPORTED_FEATURE;
1218 return STT_ERROR_NONE;
1221 int stt_set_start_sound(stt_h stt, const char* filename)
1223 stt_client_s* client = NULL;
1224 if (0 != __stt_get_feature_enabled()) {
1225 return STT_ERROR_NOT_SUPPORTED;
1227 if (0 != __stt_check_privilege()) {
1228 return STT_ERROR_PERMISSION_DENIED;
1230 if (0 != __stt_check_handle(stt, &client)) {
1231 return STT_ERROR_INVALID_PARAMETER;
1234 SLOG(LOG_DEBUG, TAG_STTC, "===== STT SET START SOUND");
1236 if (NULL == filename) {
1237 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1238 return STT_ERROR_INVALID_PARAMETER;
1241 if (0 != access(filename, F_OK)) {
1242 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] File does not exist");
1243 return STT_ERROR_INVALID_PARAMETER;
1247 if (client->current_state != STT_STATE_READY) {
1248 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
1249 return STT_ERROR_INVALID_STATE;
1255 ret = stt_dbus_request_set_start_sound(client->uid, filename);
1257 if (STT_ERROR_TIMED_OUT != ret) {
1258 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set start sound : %s", __stt_get_error_code(ret));
1261 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1264 if (STT_RETRY_COUNT == count) {
1265 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1270 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Set start sound : %s", filename);
1275 return STT_ERROR_NONE;
1278 int stt_unset_start_sound(stt_h stt)
1280 stt_client_s* client = NULL;
1281 if (0 != __stt_get_feature_enabled()) {
1282 return STT_ERROR_NOT_SUPPORTED;
1284 if (0 != __stt_check_privilege()) {
1285 return STT_ERROR_PERMISSION_DENIED;
1287 if (0 != __stt_check_handle(stt, &client)) {
1288 return STT_ERROR_INVALID_PARAMETER;
1291 SLOG(LOG_DEBUG, TAG_STTC, "===== STT UNSET START SOUND");
1294 if (client->current_state != STT_STATE_READY) {
1295 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
1296 return STT_ERROR_INVALID_STATE;
1302 ret = stt_dbus_request_unset_start_sound(client->uid);
1304 if (STT_ERROR_TIMED_OUT != ret) {
1305 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to unset start sound : %s", __stt_get_error_code(ret));
1308 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1311 if (STT_RETRY_COUNT == count) {
1312 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1317 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Unset start sound");
1322 return STT_ERROR_NONE;
1325 int stt_set_stop_sound(stt_h stt, const char* filename)
1327 stt_client_s* client = NULL;
1328 if (0 != __stt_get_feature_enabled()) {
1329 return STT_ERROR_NOT_SUPPORTED;
1331 if (0 != __stt_check_privilege()) {
1332 return STT_ERROR_PERMISSION_DENIED;
1334 if (0 != __stt_check_handle(stt, &client)) {
1335 return STT_ERROR_INVALID_PARAMETER;
1338 SLOG(LOG_DEBUG, TAG_STTC, "===== STT SET STOP SOUND");
1340 if (NULL == filename) {
1341 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1342 return STT_ERROR_INVALID_PARAMETER;
1345 if (0 != access(filename, F_OK)) {
1346 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] File does not exist");
1347 return STT_ERROR_INVALID_PARAMETER;
1351 if (client->current_state != STT_STATE_READY) {
1352 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
1353 return STT_ERROR_INVALID_STATE;
1359 ret = stt_dbus_request_set_stop_sound(client->uid, filename);
1361 if (STT_ERROR_TIMED_OUT != ret) {
1362 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set stop sound : %s", __stt_get_error_code(ret));
1365 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1368 if (STT_RETRY_COUNT == count) {
1369 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1374 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Set stop sound : %s", filename);
1379 return STT_ERROR_NONE;
1382 int stt_unset_stop_sound(stt_h stt)
1384 stt_client_s* client = NULL;
1385 if (0 != __stt_get_feature_enabled()) {
1386 return STT_ERROR_NOT_SUPPORTED;
1388 if (0 != __stt_check_privilege()) {
1389 return STT_ERROR_PERMISSION_DENIED;
1391 if (0 != __stt_check_handle(stt, &client)) {
1392 return STT_ERROR_INVALID_PARAMETER;
1395 SLOG(LOG_DEBUG, TAG_STTC, "===== STT UNSET STOP SOUND");
1398 if (client->current_state != STT_STATE_READY) {
1399 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
1400 return STT_ERROR_INVALID_STATE;
1406 ret = stt_dbus_request_unset_stop_sound(client->uid);
1408 if (STT_ERROR_TIMED_OUT != ret) {
1409 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to unset stop sound : %s", __stt_get_error_code(ret));
1412 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1415 if (STT_RETRY_COUNT == count) {
1416 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1421 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Unset stop sound");
1426 return STT_ERROR_NONE;
1429 int stt_start(stt_h stt, const char* language, const char* type)
1431 stt_client_s* client = NULL;
1432 if (0 != __stt_get_feature_enabled()) {
1433 return STT_ERROR_NOT_SUPPORTED;
1435 if (0 != __stt_check_privilege()) {
1436 return STT_ERROR_PERMISSION_DENIED;
1438 if (0 != __stt_check_handle(stt, &client)) {
1439 return STT_ERROR_INVALID_PARAMETER;
1442 SLOG(LOG_DEBUG, TAG_STTC, "===== STT START");
1445 if (client->current_state != STT_STATE_READY) {
1446 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
1447 return STT_ERROR_INVALID_STATE;
1450 if (STT_INTERNAL_STATE_NONE != client->internal_state) {
1451 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is NOT none : %d", client->internal_state);
1452 return STT_ERROR_IN_PROGRESS_TO_RECORDING;
1456 char appid[128] = {0, };
1457 ret = aul_app_get_appid_bypid(getpid(), appid, sizeof(appid));
1459 if ((AUL_R_OK != ret) || (0 == strlen(appid))) {
1460 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get application ID");
1462 SLOG(LOG_DEBUG, TAG_STTC, "[DEBUG] Current app id is %s", appid);
1466 if (NULL == language) {
1467 temp = strdup("default");
1469 temp = strdup(language);
1472 if (true == client->credential_needed && NULL == client->credential) {
1473 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Do not have app credential for this engine(%s)", client->current_engine_id);
1474 return STT_ERROR_PERMISSION_DENIED;
1477 ret = stt_dbus_request_start(client->uid, temp, type, client->silence, appid, client->credential);
1479 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to start : %s", __stt_get_error_code(ret));
1481 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Start is successful but not done");
1482 client->internal_state = STT_INTERNAL_STATE_STARTING;
1485 if (NULL != temp) free(temp);
1487 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1488 SLOG(LOG_DEBUG, TAG_STTC, " ");
1493 int stt_stop(stt_h stt)
1495 stt_client_s* client = NULL;
1496 if (0 != __stt_get_feature_enabled()) {
1497 return STT_ERROR_NOT_SUPPORTED;
1499 if (0 != __stt_check_privilege()) {
1500 return STT_ERROR_PERMISSION_DENIED;
1502 if (0 != __stt_check_handle(stt, &client)) {
1503 return STT_ERROR_INVALID_PARAMETER;
1506 SLOG(LOG_DEBUG, TAG_STTC, "===== STT STOP");
1509 if (client->current_state != STT_STATE_RECORDING) {
1510 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Current state(%d) is NOT RECORDING", client->current_state);
1511 return STT_ERROR_INVALID_STATE;
1514 if (STT_INTERNAL_STATE_STARTING == client->internal_state) {
1515 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is STARTING : %d", client->internal_state);
1516 return STT_ERROR_IN_PROGRESS_TO_RECORDING;
1517 } else if (STT_INTERNAL_STATE_CANCELING == client->internal_state) {
1518 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is CANCELING : %d", client->internal_state);
1519 return STT_ERROR_IN_PROGRESS_TO_READY;
1520 } else if (STT_INTERNAL_STATE_STOPPING == client->internal_state) {
1521 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is STOPPING : %d", client->internal_state);
1522 return STT_ERROR_IN_PROGRESS_TO_PROCESSING;
1525 int ret = stt_dbus_request_stop(client->uid);
1528 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to stop : %s", __stt_get_error_code(ret));
1530 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Stop is successful but not done");
1531 client->internal_state = STT_INTERNAL_STATE_STOPPING;
1534 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1535 SLOG(LOG_DEBUG, TAG_STTC, " ");
1541 int stt_cancel(stt_h stt)
1543 stt_client_s* client = NULL;
1544 if (0 != __stt_get_feature_enabled()) {
1545 return STT_ERROR_NOT_SUPPORTED;
1547 if (0 != __stt_check_privilege()) {
1548 return STT_ERROR_PERMISSION_DENIED;
1550 if (0 != __stt_check_handle(stt, &client)) {
1551 return STT_ERROR_INVALID_PARAMETER;
1554 SLOG(LOG_DEBUG, TAG_STTC, "===== STT CANCEL");
1557 if (STT_STATE_RECORDING != client->current_state && STT_STATE_PROCESSING != client->current_state) {
1558 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid state : Current state(%d) is 'Ready'", client->current_state);
1559 return STT_ERROR_INVALID_STATE;
1562 if (STT_INTERNAL_STATE_STARTING == client->internal_state) {
1563 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is STARTING : %d", client->internal_state);
1564 return STT_ERROR_IN_PROGRESS_TO_RECORDING;
1565 } else if (STT_INTERNAL_STATE_STOPPING == client->internal_state) {
1566 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is STOPPING : %d", client->internal_state);
1567 return STT_ERROR_IN_PROGRESS_TO_PROCESSING;
1568 } else if (STT_INTERNAL_STATE_CANCELING == client->internal_state) {
1569 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is CANCELING : %d", client->internal_state);
1570 return STT_ERROR_IN_PROGRESS_TO_READY;
1573 int ret = stt_dbus_request_cancel(client->uid);
1575 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to cancel : %s", __stt_get_error_code(ret));
1577 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Cancel is successful but not done");
1578 client->internal_state = STT_INTERNAL_STATE_CANCELING;
1581 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1582 SLOG(LOG_DEBUG, TAG_STTC, " ");
1587 int __stt_cb_set_volume(int uid, float volume)
1589 stt_client_s* client = NULL;
1591 client = stt_client_get_by_uid(uid);
1592 if (NULL == client) {
1593 SLOG(LOG_ERROR, TAG_STTC, "Handle is NOT valid");
1594 return STT_ERROR_INVALID_PARAMETER;
1597 if (STT_STATE_RECORDING != client->current_state) {
1598 SLOG(LOG_DEBUG, TAG_STTC, "[ERROR] Invalid state : NO 'Recording' state, cur(%d)", client->current_state);
1599 return STT_ERROR_INVALID_STATE;
1602 g_volume_db = volume;
1603 SLOG(LOG_DEBUG, TAG_STTC, "Set volume (%f)", g_volume_db);
1608 int stt_get_recording_volume(stt_h stt, float* volume)
1610 stt_client_s* client = NULL;
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;
1617 if (0 != __stt_check_handle(stt, &client)) {
1618 return STT_ERROR_INVALID_PARAMETER;
1621 if (NULL == volume) {
1622 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1623 return STT_ERROR_INVALID_PARAMETER;
1626 if (STT_STATE_RECORDING != client->current_state) {
1627 SLOG(LOG_DEBUG, TAG_STTC, "[ERROR] Invalid state : NO 'Recording' state, cur(%d)", client->current_state);
1628 return STT_ERROR_INVALID_STATE;
1631 *volume = g_volume_db;
1633 return STT_ERROR_NONE;
1636 bool __stt_result_time_cb(int index, int event, const char* text, long start_time, long end_time, void* user_data)
1638 stt_client_s* client = (stt_client_s*)user_data;
1641 if (NULL == client) {
1642 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
1646 if (NULL != client->result_time_cb) {
1647 SLOG(LOG_DEBUG, TAG_STTC, "(%d) event(%d) text(%s) start(%ld) end(%ld)",
1648 index, event, text, start_time, end_time);
1649 client->result_time_cb(client->stt, index, (stt_result_time_event_e)event,
1650 text, start_time, end_time, client->result_time_user_data);
1652 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Callback is NULL");
1659 int stt_foreach_detailed_result(stt_h stt, stt_result_time_cb callback, void* user_data)
1661 stt_client_s* client = NULL;
1662 if (0 != __stt_get_feature_enabled()) {
1663 return STT_ERROR_NOT_SUPPORTED;
1665 if (0 != __stt_check_privilege()) {
1666 return STT_ERROR_PERMISSION_DENIED;
1668 if (0 != __stt_check_handle(stt, &client)) {
1669 return STT_ERROR_INVALID_PARAMETER;
1672 SLOG(LOG_DEBUG, TAG_STTC, "===== STT FOREACH DETAILED RESULT");
1674 if (NULL == callback) {
1675 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1676 return STT_ERROR_INVALID_PARAMETER;
1679 client->result_time_cb = callback;
1680 client->result_time_user_data = user_data;
1683 ret = stt_config_mgr_foreach_time_info(__stt_result_time_cb, client);
1684 ret = __stt_convert_config_error_code(ret);
1686 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to foreach time info : %s", __stt_get_error_code(ret));
1689 client->result_time_cb = NULL;
1690 client->result_time_user_data = NULL;
1692 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1693 SLOG(LOG_DEBUG, TAG_STTC, " ");
1698 static Eina_Bool __stt_notify_error(void *data)
1700 stt_client_s* client = (stt_client_s*)data;
1702 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Error from sttd");
1705 if (NULL == client) {
1706 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
1710 if (NULL == stt_client_get_by_uid(client->uid))
1713 if (NULL != client->error_cb) {
1714 stt_client_use_callback(client);
1715 g_err_callback_status = true;
1716 client->error_cb(client->stt, client->reason, client->error_user_data);
1717 g_err_callback_status = false;
1718 stt_client_not_use_callback(client);
1719 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Error callback is called : reason [%d]", client->reason);
1721 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Error callback is null");
1727 int __stt_cb_error(int uid, int reason, char* err_msg)
1729 stt_client_s* client = stt_client_get_by_uid(uid);
1730 if (NULL == client) {
1731 SLOG(LOG_ERROR, TAG_STTC, "Handle not found");
1735 client->reason = reason;
1736 client->internal_state = STT_INTERNAL_STATE_NONE;
1737 if (NULL != client->err_msg) {
1738 free(client->err_msg);
1739 client->err_msg = NULL;
1741 client->err_msg = strdup(err_msg);
1743 SLOG(LOG_INFO, TAG_STTC, "internal state is initialized to 0");
1745 if (NULL != client->error_cb) {
1746 ecore_timer_add(0, __stt_notify_error, client);
1748 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Error callback is null");
1751 if (STT_ERROR_SERVICE_RESET == reason) {
1752 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Service reset");
1754 client->current_state = STT_STATE_CREATED;
1755 if (0 != stt_prepare(client->stt)) {
1756 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to prepare");
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_STOPPING == 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 static void __stt_notify_speech_status(void *data)
1942 stt_client_s* client = (stt_client_s*)data;
1945 if (NULL == client) {
1946 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify speech status : A handle is not valid");
1950 if (NULL == stt_client_get_by_uid(client->uid)) {
1954 if (NULL != client->speech_status_cb) {
1955 stt_client_use_callback(client);
1956 client->speech_status_cb(client->stt, client->speech_status, client->speech_status_user_data);
1957 stt_client_not_use_callback(client);
1958 SLOG(LOG_DEBUG, TAG_STTC, "Speech status callback is called");
1960 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Speech status callback is null");
1966 int __stt_cb_speech_status(int uid, int status)
1968 stt_client_s* client = stt_client_get_by_uid(uid);
1969 if (NULL == client) {
1970 SLOG(LOG_ERROR, TAG_STTC, "Handle not found");
1974 client->speech_status = status;
1976 ecore_main_loop_thread_safe_call_async(__stt_notify_speech_status, client);
1980 int stt_set_recognition_result_cb(stt_h stt, stt_recognition_result_cb callback, void* user_data)
1982 stt_client_s* client = NULL;
1983 if (0 != __stt_get_feature_enabled()) {
1984 return STT_ERROR_NOT_SUPPORTED;
1986 if (0 != __stt_check_privilege()) {
1987 return STT_ERROR_PERMISSION_DENIED;
1989 if (0 != __stt_check_handle(stt, &client)) {
1990 return STT_ERROR_INVALID_PARAMETER;
1993 if (callback == NULL)
1994 return STT_ERROR_INVALID_PARAMETER;
1996 if (STT_STATE_CREATED != client->current_state) {
1997 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
1998 return STT_ERROR_INVALID_STATE;
2001 client->recognition_result_cb = callback;
2002 client->recognition_result_user_data = user_data;
2007 int stt_unset_recognition_result_cb(stt_h stt)
2009 stt_client_s* client = NULL;
2010 if (0 != __stt_get_feature_enabled()) {
2011 return STT_ERROR_NOT_SUPPORTED;
2013 if (0 != __stt_check_privilege()) {
2014 return STT_ERROR_PERMISSION_DENIED;
2016 if (0 != __stt_check_handle(stt, &client)) {
2017 return STT_ERROR_INVALID_PARAMETER;
2020 if (STT_STATE_CREATED != client->current_state) {
2021 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2022 return STT_ERROR_INVALID_STATE;
2025 client->recognition_result_cb = NULL;
2026 client->recognition_result_user_data = NULL;
2031 int stt_set_state_changed_cb(stt_h stt, stt_state_changed_cb callback, void* user_data)
2033 stt_client_s* client = NULL;
2034 if (0 != __stt_get_feature_enabled()) {
2035 return STT_ERROR_NOT_SUPPORTED;
2037 if (0 != __stt_check_privilege()) {
2038 return STT_ERROR_PERMISSION_DENIED;
2040 if (0 != __stt_check_handle(stt, &client)) {
2041 return STT_ERROR_INVALID_PARAMETER;
2044 if (NULL == callback)
2045 return STT_ERROR_INVALID_PARAMETER;
2047 if (STT_STATE_CREATED != client->current_state) {
2048 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2049 return STT_ERROR_INVALID_STATE;
2052 client->state_changed_cb = callback;
2053 client->state_changed_user_data = user_data;
2058 int stt_unset_state_changed_cb(stt_h stt)
2060 stt_client_s* client = NULL;
2061 if (0 != __stt_get_feature_enabled()) {
2062 return STT_ERROR_NOT_SUPPORTED;
2064 if (0 != __stt_check_privilege()) {
2065 return STT_ERROR_PERMISSION_DENIED;
2067 if (0 != __stt_check_handle(stt, &client)) {
2068 return STT_ERROR_INVALID_PARAMETER;
2071 if (STT_STATE_CREATED != client->current_state) {
2072 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2073 return STT_ERROR_INVALID_STATE;
2076 client->state_changed_cb = NULL;
2077 client->state_changed_user_data = NULL;
2082 int stt_set_error_cb(stt_h stt, stt_error_cb callback, void* user_data)
2084 stt_client_s* client = NULL;
2085 if (0 != __stt_get_feature_enabled()) {
2086 return STT_ERROR_NOT_SUPPORTED;
2088 if (0 != __stt_check_privilege()) {
2089 return STT_ERROR_PERMISSION_DENIED;
2091 if (0 != __stt_check_handle(stt, &client)) {
2092 return STT_ERROR_INVALID_PARAMETER;
2095 if (NULL == callback)
2096 return STT_ERROR_INVALID_PARAMETER;
2098 if (STT_STATE_CREATED != client->current_state) {
2099 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2100 return STT_ERROR_INVALID_STATE;
2103 client->error_cb = callback;
2104 client->error_user_data = user_data;
2109 int stt_unset_error_cb(stt_h stt)
2111 stt_client_s* client = NULL;
2112 if (0 != __stt_get_feature_enabled()) {
2113 return STT_ERROR_NOT_SUPPORTED;
2115 if (0 != __stt_check_privilege()) {
2116 return STT_ERROR_PERMISSION_DENIED;
2118 if (0 != __stt_check_handle(stt, &client)) {
2119 return STT_ERROR_INVALID_PARAMETER;
2122 if (STT_STATE_CREATED != client->current_state) {
2123 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2124 return STT_ERROR_INVALID_STATE;
2127 client->error_cb = NULL;
2128 client->error_user_data = NULL;
2133 int stt_set_default_language_changed_cb(stt_h stt, stt_default_language_changed_cb callback, void* user_data)
2135 stt_client_s* client = NULL;
2136 if (0 != __stt_get_feature_enabled()) {
2137 return STT_ERROR_NOT_SUPPORTED;
2139 if (0 != __stt_check_privilege()) {
2140 return STT_ERROR_PERMISSION_DENIED;
2142 if (0 != __stt_check_handle(stt, &client)) {
2143 return STT_ERROR_INVALID_PARAMETER;
2146 if (NULL == callback)
2147 return STT_ERROR_INVALID_PARAMETER;
2149 if (STT_STATE_CREATED != client->current_state) {
2150 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2151 return STT_ERROR_INVALID_STATE;
2154 client->default_lang_changed_cb = callback;
2155 client->default_lang_changed_user_data = user_data;
2160 int stt_unset_default_language_changed_cb(stt_h stt)
2162 stt_client_s* client = NULL;
2163 if (0 != __stt_get_feature_enabled()) {
2164 return STT_ERROR_NOT_SUPPORTED;
2166 if (0 != __stt_check_privilege()) {
2167 return STT_ERROR_PERMISSION_DENIED;
2169 if (0 != __stt_check_handle(stt, &client)) {
2170 return STT_ERROR_INVALID_PARAMETER;
2173 if (STT_STATE_CREATED != client->current_state) {
2174 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2175 return STT_ERROR_INVALID_STATE;
2178 client->default_lang_changed_cb = NULL;
2179 client->default_lang_changed_user_data = NULL;
2184 int stt_set_engine_changed_cb(stt_h stt, stt_engine_changed_cb callback, void* user_data)
2186 stt_client_s* client = NULL;
2187 if (0 != __stt_get_feature_enabled()) {
2188 return STT_ERROR_NOT_SUPPORTED;
2190 if (0 != __stt_check_privilege()) {
2191 return STT_ERROR_PERMISSION_DENIED;
2193 if (0 != __stt_check_handle(stt, &client)) {
2194 return STT_ERROR_INVALID_PARAMETER;
2197 if (NULL == callback)
2198 return STT_ERROR_INVALID_PARAMETER;
2200 if (STT_STATE_CREATED != client->current_state) {
2201 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2202 return STT_ERROR_INVALID_STATE;
2205 client->engine_changed_cb = callback;
2206 client->engine_changed_user_data = user_data;
2211 int stt_unset_engine_changed_cb(stt_h stt)
2213 stt_client_s* client = NULL;
2214 if (0 != __stt_get_feature_enabled()) {
2215 return STT_ERROR_NOT_SUPPORTED;
2217 if (0 != __stt_check_privilege()) {
2218 return STT_ERROR_PERMISSION_DENIED;
2220 if (0 != __stt_check_handle(stt, &client)) {
2221 return STT_ERROR_INVALID_PARAMETER;
2224 if (STT_STATE_CREATED != client->current_state) {
2225 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2226 return STT_ERROR_INVALID_STATE;
2229 client->engine_changed_cb = NULL;
2230 client->engine_changed_user_data = NULL;
2235 int stt_set_speech_status_cb(stt_h stt, stt_speech_status_cb callback, void* user_data)
2237 stt_client_s* client = NULL;
2238 if (0 != __stt_get_feature_enabled()) {
2239 return STT_ERROR_NOT_SUPPORTED;
2241 if (0 != __stt_check_privilege()) {
2242 return STT_ERROR_PERMISSION_DENIED;
2244 if (0 != __stt_check_handle(stt, &client)) {
2245 return STT_ERROR_INVALID_PARAMETER;
2248 if (NULL == callback)
2249 return STT_ERROR_INVALID_PARAMETER;
2251 if (STT_STATE_CREATED != client->current_state) {
2252 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2253 return STT_ERROR_INVALID_STATE;
2256 client->speech_status_cb = callback;
2257 client->speech_status_user_data = user_data;
2262 int stt_unset_speech_status_cb(stt_h stt)
2264 stt_client_s* client = NULL;
2265 if (0 != __stt_get_feature_enabled()) {
2266 return STT_ERROR_NOT_SUPPORTED;
2268 if (0 != __stt_check_privilege()) {
2269 return STT_ERROR_PERMISSION_DENIED;
2271 if (0 != __stt_check_handle(stt, &client)) {
2272 return STT_ERROR_INVALID_PARAMETER;
2275 if (STT_STATE_CREATED != client->current_state) {
2276 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2277 return STT_ERROR_INVALID_STATE;
2280 client->speech_status_cb = NULL;
2281 client->speech_status_user_data = NULL;