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>
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");
118 if (ret != CYNARA_API_ACCESS_ALLOWED)
123 static void __check_privilege_deinitialize()
126 cynara_finish(p_cynara);
130 static int __stt_check_privilege()
134 if (0 == g_privilege_allowed) {
135 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Permission is denied");
136 return STT_ERROR_PERMISSION_DENIED;
137 } else if (-1 == g_privilege_allowed) {
138 if (false == __check_privilege_initialize()) {
139 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] privilege initialize is failed");
140 return STT_ERROR_PERMISSION_DENIED;
142 snprintf(uid, 16, "%d", getuid());
143 if (false == __check_privilege(uid, STT_PRIVILEGE)) {
144 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Permission is denied");
145 g_privilege_allowed = 0;
146 __check_privilege_deinitialize();
147 return STT_ERROR_PERMISSION_DENIED;
149 __check_privilege_deinitialize();
152 g_privilege_allowed = 1;
153 return STT_ERROR_NONE;
156 static const char* __stt_get_error_code(stt_error_e err)
159 case STT_ERROR_NONE: return "STT_ERROR_NONE";
160 case STT_ERROR_OUT_OF_MEMORY: return "STT_ERROR_OUT_OF_MEMORY";
161 case STT_ERROR_IO_ERROR: return "STT_ERROR_IO_ERROR";
162 case STT_ERROR_INVALID_PARAMETER: return "STT_ERROR_INVALID_PARAMETER";
163 case STT_ERROR_TIMED_OUT: return "STT_ERROR_TIMED_OUT";
164 case STT_ERROR_RECORDER_BUSY: return "STT_ERROR_RECORDER_BUSY";
165 case STT_ERROR_OUT_OF_NETWORK: return "STT_ERROR_OUT_OF_NETWORK";
166 case STT_ERROR_PERMISSION_DENIED: return "STT_ERROR_PERMISSION_DENIED";
167 case STT_ERROR_NOT_SUPPORTED: return "STT_ERROR_NOT_SUPPORTED";
168 case STT_ERROR_INVALID_STATE: return "STT_ERROR_INVALID_STATE";
169 case STT_ERROR_INVALID_LANGUAGE: return "STT_ERROR_INVALID_LANGUAGE";
170 case STT_ERROR_ENGINE_NOT_FOUND: return "STT_ERROR_ENGINE_NOT_FOUND";
171 case STT_ERROR_OPERATION_FAILED: return "STT_ERROR_OPERATION_FAILED";
172 case STT_ERROR_NOT_SUPPORTED_FEATURE: return "STT_ERROR_NOT_SUPPORTED_FEATURE";
173 case STT_ERROR_SERVICE_RESET: return "STT_ERROR_SERVICE_RESET";
175 return "Invalid error code";
179 static int __stt_convert_config_error_code(stt_config_error_e code)
181 if (code == STT_CONFIG_ERROR_NONE) return STT_ERROR_NONE;
182 if (code == STT_CONFIG_ERROR_OUT_OF_MEMORY) return STT_ERROR_OUT_OF_MEMORY;
183 if (code == STT_CONFIG_ERROR_IO_ERROR) return STT_ERROR_IO_ERROR;
184 if (code == STT_CONFIG_ERROR_INVALID_PARAMETER) return STT_ERROR_INVALID_PARAMETER;
185 if (code == STT_CONFIG_ERROR_PERMISSION_DENIED) return STT_ERROR_PERMISSION_DENIED;
186 if (code == STT_CONFIG_ERROR_NOT_SUPPORTED) return STT_ERROR_NOT_SUPPORTED;
187 if (code == STT_CONFIG_ERROR_INVALID_STATE) return STT_ERROR_INVALID_STATE;
188 if (code == STT_CONFIG_ERROR_INVALID_LANGUAGE) return STT_ERROR_INVALID_LANGUAGE;
189 if (code == STT_CONFIG_ERROR_ENGINE_NOT_FOUND) return STT_ERROR_ENGINE_NOT_FOUND;
190 if (code == STT_CONFIG_ERROR_OPERATION_FAILED) return STT_ERROR_OPERATION_FAILED;
195 void __stt_config_lang_changed_cb(const char* before_language, const char* current_language, void* user_data)
197 SLOG(LOG_DEBUG, TAG_STTC, "Language changed : Before lang(%s) Current lang(%s)",
198 before_language, current_language);
200 if (0 == strcmp(before_language, current_language)) {
204 GList* client_list = NULL;
205 client_list = stt_client_get_client_list();
208 stt_client_s *data = NULL;
210 if (g_list_length(client_list) > 0) {
211 /* Get a first item */
212 iter = g_list_first(client_list);
214 while (NULL != iter) {
216 if (NULL != data->default_lang_changed_cb) {
217 SLOG(LOG_DEBUG, TAG_STTC, "Call default language changed callback : uid(%d)", data->uid);
218 data->default_lang_changed_cb(data->stt, before_language, current_language,
219 data->default_lang_changed_user_data);
223 iter = g_list_next(iter);
230 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)
232 stt_h stt = (stt_h)user_data;
234 stt_client_s* client = stt_client_get(stt);
235 if (NULL == client) {
236 SLOG(LOG_ERROR, TAG_STTC, "[WARNING] A handle is not valid");
240 if (NULL != engine_id) SLOG(LOG_DEBUG, TAG_STTC, "Engine id(%s)", engine_id);
241 if (NULL != setting) SLOG(LOG_DEBUG, TAG_STTC, "Engine setting(%s)", setting);
242 if (NULL != language) SLOG(LOG_DEBUG, TAG_STTC, "Language(%s)", language);
243 SLOG(LOG_DEBUG, TAG_STTC, "Silence(%s), Credential(%s)", support_silence ? "on" : "off", need_credential ? "need" : "no need");
245 /* call callback function */
246 if (NULL != client->engine_changed_cb) {
247 client->engine_changed_cb(stt, engine_id, language, support_silence, need_credential, client->engine_changed_user_data);
249 SLOG(LOG_WARN, TAG_STTC, "No registered callback function for engine change");
254 static int __stt_check_handle(stt_h stt, stt_client_s** client)
257 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input handle is null");
258 return STT_ERROR_INVALID_PARAMETER;
261 stt_client_s* temp = NULL;
262 temp = stt_client_get(stt);
266 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
267 return STT_ERROR_INVALID_PARAMETER;
271 return STT_ERROR_NONE;
274 int stt_create(stt_h* stt)
276 if (0 != __stt_get_feature_enabled()) {
277 return STT_ERROR_NOT_SUPPORTED;
279 if (0 != __stt_check_privilege()) {
280 return STT_ERROR_PERMISSION_DENIED;
283 SLOG(LOG_DEBUG, TAG_STTC, "===== Create STT");
286 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is null");
287 return STT_ERROR_INVALID_PARAMETER;
290 if (0 == stt_client_get_size()) {
291 if (0 != stt_dbus_open_connection()) {
292 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to open connection");
293 return STT_ERROR_OPERATION_FAILED;
297 if (0 != stt_client_new(stt)) {
298 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to create client!");
299 return STT_ERROR_OUT_OF_MEMORY;
302 stt_client_s* client = stt_client_get(*stt);
303 if (NULL == client) {
304 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to create client");
305 stt_client_destroy(*stt);
306 return STT_ERROR_OPERATION_FAILED;
309 int ret = stt_config_mgr_initialize(client->uid);
310 ret = __stt_convert_config_error_code(ret);
312 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to init config manager : %s", __stt_get_error_code(ret));
313 stt_client_destroy(*stt);
317 ret = stt_config_mgr_set_callback(client->uid, __stt_config_engine_changed_cb, __stt_config_lang_changed_cb, NULL, client->stt);
318 ret = __stt_convert_config_error_code(ret);
320 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set config changed : %s", __stt_get_error_code(ret));
321 stt_client_destroy(*stt);
325 SLOG(LOG_DEBUG, TAG_STTC, "[Success] uid(%d)", (*stt)->handle);
327 SLOG(LOG_DEBUG, TAG_STTC, "=====");
328 SLOG(LOG_DEBUG, TAG_STTC, " ");
330 return STT_ERROR_NONE;
333 int stt_destroy(stt_h stt)
335 stt_client_s* client = NULL;
336 if (0 != __stt_get_feature_enabled()) {
337 return STT_ERROR_NOT_SUPPORTED;
339 if (0 != __stt_check_privilege()) {
340 return STT_ERROR_PERMISSION_DENIED;
342 if (0 != __stt_check_handle(stt, &client)) {
343 return STT_ERROR_INVALID_PARAMETER;
346 SLOG(LOG_DEBUG, TAG_STTC, "===== Destroy STT");
348 /* check used callback */
349 if (0 != stt_client_get_use_callback(client)) {
350 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Cannot destroy in Callback function");
351 return STT_ERROR_OPERATION_FAILED;
354 stt_config_mgr_finalize(client->uid);
359 switch (client->current_state) {
360 case STT_STATE_PROCESSING:
361 case STT_STATE_RECORDING:
362 case STT_STATE_READY:
363 ret = stt_dbus_request_finalize(client->uid);
365 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request finalize : %s", __stt_get_error_code(ret));
367 case STT_STATE_CREATED:
368 if (NULL != g_connect_timer) {
369 SLOG(LOG_DEBUG, TAG_STTC, "Connect Timer is deleted");
370 ecore_timer_del(g_connect_timer);
371 g_connect_timer = NULL;
375 stt_client_destroy(stt);
381 if (0 == stt_client_get_size()) {
382 if (0 != stt_dbus_close_connection()) {
383 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to close connection");
389 SLOG(LOG_DEBUG, TAG_STTC, "=====");
390 SLOG(LOG_DEBUG, TAG_STTC, " ");
392 return STT_ERROR_NONE;
395 bool __stt_config_supported_engine_cb(const char* engine_id, const char* engine_name,
396 const char* setting, bool support_silence, void* user_data)
398 stt_h stt = (stt_h)user_data;
400 stt_client_s* client = stt_client_get(stt);
401 if (NULL == client) {
402 SLOG(LOG_ERROR, TAG_STTC, "[WARNING] A handle is not valid");
406 /* call callback function */
407 if (NULL != client->supported_engine_cb) {
408 return client->supported_engine_cb(stt, engine_id, engine_name, client->supported_engine_user_data);
410 SLOG(LOG_WARN, TAG_STTC, "No registered callback function of supported engine");
416 int stt_foreach_supported_engines(stt_h stt, stt_supported_engine_cb callback, void* user_data)
418 stt_client_s* client = NULL;
419 if (0 != __stt_get_feature_enabled()) {
420 return STT_ERROR_NOT_SUPPORTED;
422 if (0 != __stt_check_privilege()) {
423 return STT_ERROR_PERMISSION_DENIED;
425 if (0 != __stt_check_handle(stt, &client)) {
426 return STT_ERROR_INVALID_PARAMETER;
429 SLOG(LOG_DEBUG, TAG_STTC, "===== Foreach Supported engine");
431 if (NULL == callback) {
432 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
433 return STT_ERROR_INVALID_PARAMETER;
436 if (client->current_state != STT_STATE_CREATED) {
437 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not CREATED", client->current_state);
438 return STT_ERROR_INVALID_STATE;
441 client->supported_engine_cb = callback;
442 client->supported_engine_user_data = user_data;
445 ret = stt_config_mgr_get_engine_list(__stt_config_supported_engine_cb, client->stt);
446 ret = __stt_convert_config_error_code(ret);
448 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get engines : %s", __stt_get_error_code(ret));
451 client->supported_engine_cb = NULL;
452 client->supported_engine_user_data = NULL;
454 SLOG(LOG_DEBUG, TAG_STTC, "=====");
455 SLOG(LOG_DEBUG, TAG_STTC, " ");
460 int stt_get_engine(stt_h stt, char** engine_id)
462 stt_client_s* client = NULL;
463 if (0 != __stt_get_feature_enabled()) {
464 return STT_ERROR_NOT_SUPPORTED;
466 if (0 != __stt_check_privilege()) {
467 return STT_ERROR_PERMISSION_DENIED;
469 if (0 != __stt_check_handle(stt, &client)) {
470 return STT_ERROR_INVALID_PARAMETER;
473 SLOG(LOG_DEBUG, TAG_STTC, "===== Get current engine");
475 if (NULL == engine_id) {
476 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
477 return STT_ERROR_INVALID_PARAMETER;
480 if (client->current_state != STT_STATE_CREATED) {
481 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not CREATED", client->current_state);
482 return STT_ERROR_INVALID_STATE;
487 if (NULL != client->current_engine_id) {
488 *engine_id = strdup(client->current_engine_id);
489 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current engine uuid = %s", *engine_id);
492 ret = stt_config_mgr_get_engine(engine_id);
493 ret = __stt_convert_config_error_code(ret);
495 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request get current engine : %s", __stt_get_error_code(ret));
497 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current engine uuid = %s", *engine_id);
501 SLOG(LOG_DEBUG, TAG_STTC, "=====");
502 SLOG(LOG_DEBUG, TAG_STTC, " ");
507 int stt_set_engine(stt_h stt, const char* engine_id)
509 stt_client_s* client = NULL;
510 if (0 != __stt_get_feature_enabled()) {
511 return STT_ERROR_NOT_SUPPORTED;
513 if (0 != __stt_check_privilege()) {
514 return STT_ERROR_PERMISSION_DENIED;
516 if (0 != __stt_check_handle(stt, &client)) {
517 return STT_ERROR_INVALID_PARAMETER;
520 SLOG(LOG_DEBUG, TAG_STTC, "===== Set current engine");
522 if (NULL == engine_id) {
523 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
524 return STT_ERROR_INVALID_PARAMETER;
528 if (client->current_state != STT_STATE_CREATED) {
529 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not CREATED", client->current_state);
530 return STT_ERROR_INVALID_STATE;
533 if (NULL != client->current_engine_id) {
534 free(client->current_engine_id);
535 client->current_engine_id = NULL;
538 SLOG(LOG_DEBUG, TAG_STTC, "===== engined_id(%s)", engine_id);
540 client->current_engine_id = strdup(engine_id);
542 SLOG(LOG_DEBUG, TAG_STTC, "=====");
543 SLOG(LOG_DEBUG, TAG_STTC, " ");
548 int stt_set_credential(stt_h stt, const char* credential)
550 stt_client_s* client = NULL;
551 if (0 != __stt_get_feature_enabled()) {
552 return STT_ERROR_NOT_SUPPORTED;
554 if (0 != __stt_check_privilege()) {
555 return STT_ERROR_PERMISSION_DENIED;
557 if (0 != __stt_check_handle(stt, &client)) {
558 return STT_ERROR_INVALID_PARAMETER;
561 SLOG(LOG_DEBUG, TAG_STTC, "===== Set credential");
563 if (NULL == credential) {
564 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
565 return STT_ERROR_INVALID_PARAMETER;
569 if (client->current_state != STT_STATE_CREATED && client->current_state != STT_STATE_READY) {
570 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not CREATED or READY", client->current_state);
571 return STT_ERROR_INVALID_STATE;
574 if (NULL != client->credential) {
575 free(client->credential);
576 client->credential = NULL;
578 client->credential = strdup(credential);
580 SLOG(LOG_DEBUG, TAG_STTC, "=====");
581 SLOG(LOG_DEBUG, TAG_STTC, " ");
583 return STT_ERROR_NONE;
586 int stt_set_private_data(stt_h stt, const char* key, const char* data)
588 stt_client_s* client = NULL;
589 if (0 != __stt_get_feature_enabled()) {
590 return STT_ERROR_NOT_SUPPORTED;
592 if (0 != __stt_check_privilege()) {
593 return STT_ERROR_PERMISSION_DENIED;
595 if (0 != __stt_check_handle(stt, &client)) {
596 return STT_ERROR_INVALID_PARAMETER;
599 SLOG(LOG_DEBUG, TAG_STTC, "===== Set private data");
601 if (NULL == key || NULL == data) {
602 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid parameter");
603 return STT_ERROR_INVALID_PARAMETER;
607 if (STT_STATE_READY != client->current_state) {
608 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
609 return STT_ERROR_INVALID_STATE;
615 ret = stt_dbus_request_set_private_data(client->uid, key, data);
617 if (STT_ERROR_TIMED_OUT != ret) {
618 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set private data : %s", __stt_get_error_code(ret));
621 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry : %s", __stt_get_error_code(ret));
624 if (STT_RETRY_COUNT == count) {
625 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
632 SLOG(LOG_DEBUG, TAG_STTC, "=====");
633 SLOG(LOG_DEBUG, TAG_STTC, "");
635 return STT_ERROR_NONE;
638 int stt_get_private_data(stt_h stt, const char* key, char** data)
640 stt_client_s* client = NULL;
641 if (0 != __stt_get_feature_enabled()) {
642 return STT_ERROR_NOT_SUPPORTED;
644 if (0 != __stt_check_privilege()) {
645 return STT_ERROR_PERMISSION_DENIED;
647 if (0 != __stt_check_handle(stt, &client)) {
648 return STT_ERROR_INVALID_PARAMETER;
651 SLOG(LOG_DEBUG, TAG_STTC, "===== Get private data");
653 if (NULL == key || NULL == data) {
654 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid parameter");
655 return STT_ERROR_INVALID_PARAMETER;
659 if (STT_STATE_READY != client->current_state) {
660 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
661 return STT_ERROR_INVALID_STATE;
667 ret = stt_dbus_request_get_private_data(client->uid, key, data);
669 if (STT_ERROR_TIMED_OUT != ret) {
670 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get private data : %s", __stt_get_error_code(ret));
673 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry : %s", __stt_get_error_code(ret));
676 if (STT_RETRY_COUNT == count) {
677 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
684 if (0 == strncmp(*data, "NULL", strlen(*data))) {
689 SLOG(LOG_DEBUG, TAG_STTC, "=====");
690 SLOG(LOG_DEBUG, TAG_STTC, "");
692 return STT_ERROR_NONE;
694 static Eina_Bool __stt_connect_daemon(void *data)
696 stt_client_s* client = (stt_client_s*)data;
698 if (NULL == client) {
699 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
700 g_connect_timer = NULL;
706 ret = stt_dbus_request_hello();
709 if (STT_ERROR_INVALID_STATE == ret) {
710 g_connect_timer = NULL;
716 g_connect_timer = NULL;
717 SLOG(LOG_DEBUG, TAG_STTC, "===== Connect stt-service");
719 /* request initialization */
720 bool silence_supported = false;
721 bool credential_needed = false;
723 ret = stt_dbus_request_initialize(client->uid, &silence_supported, &credential_needed);
725 if (STT_ERROR_ENGINE_NOT_FOUND == ret) {
726 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to initialize : %s", __stt_get_error_code(ret));
728 client->reason = STT_ERROR_ENGINE_NOT_FOUND;
729 ecore_timer_add(0, __stt_notify_error, (void*)client);
733 } else if (STT_ERROR_NONE != ret) {
734 SLOG(LOG_ERROR, TAG_STTC, "[WARNING] Fail to connection. Retry to connect");
737 /* success to connect stt-service */
738 client->silence_supported = silence_supported;
739 client->credential_needed = credential_needed;
740 SLOG(LOG_DEBUG, TAG_STTC, "Supported options : silence(%s), credential(%s)", silence_supported ? "support" : "no support", credential_needed ? "need" : "no need");
743 #ifdef __UNUSED_CODES__
744 if (NULL != client->current_engine_id) {
747 silence_supported = false;
748 credential_needed = false;
749 SLOG(LOG_DEBUG, TAG_STTC, "[WARNING] current_engine_id(%s)", client->current_engine_id);
752 ret = stt_dbus_request_set_current_engine(client->uid, client->current_engine_id, &silence_supported, &credential_needed);
754 if (STT_ERROR_TIMED_OUT != ret) {
755 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set current engine : %s", __stt_get_error_code(ret));
758 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
761 if (STT_RETRY_COUNT == count) {
762 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
767 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current engine uuid = %s", client->current_engine_id);
769 /* success to change engine */
770 client->silence_supported = silence_supported;
771 SLOG(LOG_DEBUG, TAG_STTC, "Supported options : silence(%s), credential(%s)", silence_supported ? "support" : "no support", credential_needed ? "need" : "no need");
776 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] uid(%d)", client->uid);
778 client->before_state = client->current_state;
779 client->current_state = STT_STATE_READY;
781 if (NULL != client->state_changed_cb) {
782 stt_client_use_callback(client);
783 client->state_changed_cb(client->stt, client->before_state,
784 client->current_state, client->state_changed_user_data);
785 stt_client_not_use_callback(client);
786 SLOG(LOG_DEBUG, TAG_STTC, "State changed callback is called");
788 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
791 SLOG(LOG_DEBUG, TAG_STTC, "=====");
792 SLOG(LOG_DEBUG, TAG_STTC, " ");
797 int stt_prepare(stt_h stt)
799 stt_client_s* client = NULL;
800 if (0 != __stt_get_feature_enabled()) {
801 return STT_ERROR_NOT_SUPPORTED;
803 if (0 != __stt_check_privilege()) {
804 return STT_ERROR_PERMISSION_DENIED;
806 if (0 != __stt_check_handle(stt, &client)) {
807 return STT_ERROR_INVALID_PARAMETER;
811 if (client->current_state != STT_STATE_CREATED) {
812 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not 'CREATED'", client->current_state);
813 return STT_ERROR_INVALID_STATE;
816 g_connect_timer = ecore_timer_add(0, __stt_connect_daemon, (void*)client);
818 SLOG(LOG_DEBUG, TAG_STTC, "=====");
819 SLOG(LOG_DEBUG, TAG_STTC, " ");
821 return STT_ERROR_NONE;
824 int stt_unprepare(stt_h stt)
826 stt_client_s* client = NULL;
827 if (0 != __stt_get_feature_enabled()) {
828 return STT_ERROR_NOT_SUPPORTED;
830 if (0 != __stt_check_privilege()) {
831 return STT_ERROR_PERMISSION_DENIED;
833 if (0 != __stt_check_handle(stt, &client)) {
834 return STT_ERROR_INVALID_PARAMETER;
837 SLOG(LOG_DEBUG, TAG_STTC, "===== Unprepare STT");
840 if (client->current_state != STT_STATE_READY) {
841 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", client->current_state);
842 return STT_ERROR_INVALID_STATE;
848 ret = stt_dbus_request_finalize(client->uid);
850 if (STT_ERROR_TIMED_OUT != ret) {
851 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request finalize : %s", __stt_get_error_code(ret));
854 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
857 if (STT_RETRY_COUNT == count) {
858 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
865 client->internal_state = STT_INTERNAL_STATE_NONE;
867 client->before_state = client->current_state;
868 client->current_state = STT_STATE_CREATED;
870 if (NULL != client->state_changed_cb) {
871 stt_client_use_callback(client);
872 client->state_changed_cb(client->stt, client->before_state,
873 client->current_state, client->state_changed_user_data);
874 stt_client_not_use_callback(client);
876 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
879 if (g_connect_timer) {
880 ecore_timer_del(g_connect_timer);
881 g_connect_timer = NULL;
884 SLOG(LOG_DEBUG, TAG_STTC, "=====");
885 SLOG(LOG_DEBUG, TAG_STTC, " ");
887 return STT_ERROR_NONE;
890 bool __stt_config_supported_language_cb(const char* engine_id, const char* language, void* user_data)
892 stt_h stt = (stt_h)user_data;
894 stt_client_s* client = stt_client_get(stt);
895 if (NULL == client) {
896 SLOG(LOG_ERROR, TAG_STTC, "[WARNING] A handle is not valid");
900 /* call callback function */
901 if (NULL != client->supported_lang_cb) {
902 return client->supported_lang_cb(stt, language, client->supported_lang_user_data);
904 SLOG(LOG_WARN, TAG_STTC, "No registered callback function of supported languages");
910 int stt_foreach_supported_languages(stt_h stt, stt_supported_language_cb callback, void* user_data)
912 stt_client_s* client = NULL;
913 if (0 != __stt_get_feature_enabled()) {
914 return STT_ERROR_NOT_SUPPORTED;
916 if (0 != __stt_check_privilege()) {
917 return STT_ERROR_PERMISSION_DENIED;
919 if (0 != __stt_check_handle(stt, &client)) {
920 return STT_ERROR_INVALID_PARAMETER;
923 SLOG(LOG_DEBUG, TAG_STTC, "===== Foreach Supported Language");
925 if (NULL == callback) {
926 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
927 return STT_ERROR_INVALID_PARAMETER;
931 char* current_engine_id = NULL;
933 if (NULL == client->current_engine_id) {
934 ret = stt_config_mgr_get_engine(¤t_engine_id);
935 ret = __stt_convert_config_error_code(ret);
937 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get default engine id : %s", __stt_get_error_code(ret));
941 current_engine_id = strdup(client->current_engine_id);
942 if (NULL == current_engine_id) {
943 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to allocate memory");
944 return STT_ERROR_OUT_OF_MEMORY;
948 client->supported_lang_cb = callback;
949 client->supported_lang_user_data = user_data;
951 ret = stt_config_mgr_get_language_list(current_engine_id, __stt_config_supported_language_cb, client->stt);
952 ret = __stt_convert_config_error_code(ret);
954 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get languages : %s", __stt_get_error_code(ret));
957 if (NULL != current_engine_id) {
958 free(current_engine_id);
959 current_engine_id = NULL;
962 client->supported_lang_cb = NULL;
963 client->supported_lang_user_data = NULL;
965 SLOG(LOG_DEBUG, TAG_STTC, "=====");
966 SLOG(LOG_DEBUG, TAG_STTC, " ");
971 int stt_get_default_language(stt_h stt, char** language)
973 stt_client_s* client = NULL;
974 if (0 != __stt_get_feature_enabled()) {
975 return STT_ERROR_NOT_SUPPORTED;
977 if (0 != __stt_check_privilege()) {
978 return STT_ERROR_PERMISSION_DENIED;
980 if (0 != __stt_check_handle(stt, &client)) {
981 return STT_ERROR_INVALID_PARAMETER;
984 SLOG(LOG_DEBUG, TAG_STTC, "===== Get Default Language");
986 if (NULL == language) {
987 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
988 return STT_ERROR_INVALID_PARAMETER;
992 ret = stt_config_mgr_get_default_language(language);
993 ret = __stt_convert_config_error_code(ret);
995 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get default language : %s", __stt_get_error_code(ret));
997 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current language = %s", *language);
1000 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1001 SLOG(LOG_DEBUG, TAG_STTC, " ");
1006 int stt_get_state(stt_h stt, stt_state_e* state)
1008 stt_client_s* client = NULL;
1009 if (0 != __stt_get_feature_enabled()) {
1010 return STT_ERROR_NOT_SUPPORTED;
1012 if (0 != __stt_check_privilege()) {
1013 return STT_ERROR_PERMISSION_DENIED;
1015 if (0 != __stt_check_handle(stt, &client)) {
1016 return STT_ERROR_INVALID_PARAMETER;
1019 if (NULL == state) {
1020 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1021 return STT_ERROR_INVALID_PARAMETER;
1024 *state = client->current_state;
1027 case STT_STATE_CREATED: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'CREATED'"); break;
1028 case STT_STATE_READY: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'Ready'"); break;
1029 case STT_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'Recording'"); break;
1030 case STT_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'Processing'"); break;
1031 default: SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid value"); break;
1034 return STT_ERROR_NONE;
1037 int stt_get_error_message(stt_h stt, char** err_msg)
1039 stt_client_s* client = NULL;
1040 if (0 != __stt_get_feature_enabled()) {
1041 return STT_ERROR_NOT_SUPPORTED;
1043 if (0 != __stt_check_privilege()) {
1044 return STT_ERROR_PERMISSION_DENIED;
1046 if (0 != __stt_check_handle(stt, &client)) {
1047 return STT_ERROR_INVALID_PARAMETER;
1050 if (NULL == err_msg) {
1051 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1052 return STT_ERROR_INVALID_PARAMETER;
1055 if (false == g_err_callback_status) {
1056 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] This callback should be called during an err_callback");
1057 return STT_ERROR_OPERATION_FAILED;
1060 if (NULL != client->err_msg) {
1061 *err_msg = strdup(client->err_msg);
1062 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Error msg (%s)", *err_msg);
1064 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Error msg (NULL)");
1067 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1068 SLOG(LOG_DEBUG, TAG_STTC, " ");
1070 return STT_ERROR_NONE;
1073 int stt_is_recognition_type_supported(stt_h stt, const char* type, bool* support)
1075 stt_client_s* client = NULL;
1076 if (0 != __stt_get_feature_enabled()) {
1077 return STT_ERROR_NOT_SUPPORTED;
1079 if (0 != __stt_check_privilege()) {
1080 return STT_ERROR_PERMISSION_DENIED;
1082 if (0 != __stt_check_handle(stt, &client)) {
1083 return STT_ERROR_INVALID_PARAMETER;
1086 if (NULL == type || NULL == support) {
1087 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1088 return STT_ERROR_INVALID_PARAMETER;
1092 if (client->current_state != STT_STATE_READY) {
1093 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
1094 return STT_ERROR_INVALID_STATE;
1100 ret = stt_dbus_request_is_recognition_type_supported(client->uid, type, support);
1102 if (STT_ERROR_TIMED_OUT != ret) {
1103 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get recognition type supported : %s", __stt_get_error_code(ret));
1106 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1109 if (STT_RETRY_COUNT == count) {
1110 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1115 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] recognition type is %s", *support ? "true " : "false");
1120 return STT_ERROR_NONE;
1123 int stt_set_silence_detection(stt_h stt, stt_option_silence_detection_e type)
1125 stt_client_s* client = NULL;
1126 if (0 != __stt_get_feature_enabled()) {
1127 return STT_ERROR_NOT_SUPPORTED;
1129 if (0 != __stt_check_privilege()) {
1130 return STT_ERROR_PERMISSION_DENIED;
1132 if (0 != __stt_check_handle(stt, &client)) {
1133 return STT_ERROR_INVALID_PARAMETER;
1137 if (client->current_state != STT_STATE_READY) {
1138 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
1139 return STT_ERROR_INVALID_STATE;
1142 if (true == client->silence_supported) {
1143 if (type >= STT_OPTION_SILENCE_DETECTION_FALSE && type <= STT_OPTION_SILENCE_DETECTION_AUTO) {
1144 client->silence = type;
1146 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Type is invalid");
1147 return STT_ERROR_INVALID_PARAMETER;
1150 return STT_ERROR_NOT_SUPPORTED_FEATURE;
1153 return STT_ERROR_NONE;
1156 int stt_set_start_sound(stt_h stt, const char* filename)
1158 stt_client_s* client = NULL;
1159 if (0 != __stt_get_feature_enabled()) {
1160 return STT_ERROR_NOT_SUPPORTED;
1162 if (0 != __stt_check_privilege()) {
1163 return STT_ERROR_PERMISSION_DENIED;
1165 if (0 != __stt_check_handle(stt, &client)) {
1166 return STT_ERROR_INVALID_PARAMETER;
1169 SLOG(LOG_DEBUG, TAG_STTC, "===== STT SET START SOUND");
1171 if (NULL == filename) {
1172 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1173 return STT_ERROR_INVALID_PARAMETER;
1176 if (0 != access(filename, F_OK)) {
1177 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] File does not exist");
1178 return STT_ERROR_INVALID_PARAMETER;
1182 if (client->current_state != STT_STATE_READY) {
1183 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
1184 return STT_ERROR_INVALID_STATE;
1190 ret = stt_dbus_request_set_start_sound(client->uid, filename);
1192 if (STT_ERROR_TIMED_OUT != ret) {
1193 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set start sound : %s", __stt_get_error_code(ret));
1196 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1199 if (STT_RETRY_COUNT == count) {
1200 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1205 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Set start sound : %s", filename);
1210 return STT_ERROR_NONE;
1213 int stt_unset_start_sound(stt_h stt)
1215 stt_client_s* client = NULL;
1216 if (0 != __stt_get_feature_enabled()) {
1217 return STT_ERROR_NOT_SUPPORTED;
1219 if (0 != __stt_check_privilege()) {
1220 return STT_ERROR_PERMISSION_DENIED;
1222 if (0 != __stt_check_handle(stt, &client)) {
1223 return STT_ERROR_INVALID_PARAMETER;
1226 SLOG(LOG_DEBUG, TAG_STTC, "===== STT UNSET START SOUND");
1229 if (client->current_state != STT_STATE_READY) {
1230 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
1231 return STT_ERROR_INVALID_STATE;
1237 ret = stt_dbus_request_unset_start_sound(client->uid);
1239 if (STT_ERROR_TIMED_OUT != ret) {
1240 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to unset start sound : %s", __stt_get_error_code(ret));
1243 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1246 if (STT_RETRY_COUNT == count) {
1247 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1252 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Unset start sound");
1257 return STT_ERROR_NONE;
1260 int stt_set_stop_sound(stt_h stt, const char* filename)
1262 stt_client_s* client = NULL;
1263 if (0 != __stt_get_feature_enabled()) {
1264 return STT_ERROR_NOT_SUPPORTED;
1266 if (0 != __stt_check_privilege()) {
1267 return STT_ERROR_PERMISSION_DENIED;
1269 if (0 != __stt_check_handle(stt, &client)) {
1270 return STT_ERROR_INVALID_PARAMETER;
1273 SLOG(LOG_DEBUG, TAG_STTC, "===== STT SET STOP SOUND");
1275 if (NULL == filename) {
1276 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1277 return STT_ERROR_INVALID_PARAMETER;
1280 if (0 != access(filename, F_OK)) {
1281 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] File does not exist");
1282 return STT_ERROR_INVALID_PARAMETER;
1286 if (client->current_state != STT_STATE_READY) {
1287 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
1288 return STT_ERROR_INVALID_STATE;
1294 ret = stt_dbus_request_set_stop_sound(client->uid, filename);
1296 if (STT_ERROR_TIMED_OUT != ret) {
1297 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set stop sound : %s", __stt_get_error_code(ret));
1300 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1303 if (STT_RETRY_COUNT == count) {
1304 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1309 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Set stop sound : %s", filename);
1314 return STT_ERROR_NONE;
1317 int stt_unset_stop_sound(stt_h stt)
1319 stt_client_s* client = NULL;
1320 if (0 != __stt_get_feature_enabled()) {
1321 return STT_ERROR_NOT_SUPPORTED;
1323 if (0 != __stt_check_privilege()) {
1324 return STT_ERROR_PERMISSION_DENIED;
1326 if (0 != __stt_check_handle(stt, &client)) {
1327 return STT_ERROR_INVALID_PARAMETER;
1330 SLOG(LOG_DEBUG, TAG_STTC, "===== STT UNSET STOP SOUND");
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_unset_stop_sound(client->uid);
1343 if (STT_ERROR_TIMED_OUT != ret) {
1344 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to unset 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] Unset stop sound");
1361 return STT_ERROR_NONE;
1364 int stt_start(stt_h stt, const char* language, const char* type)
1366 stt_client_s* client = NULL;
1367 if (0 != __stt_get_feature_enabled()) {
1368 return STT_ERROR_NOT_SUPPORTED;
1370 if (0 != __stt_check_privilege()) {
1371 return STT_ERROR_PERMISSION_DENIED;
1373 if (0 != __stt_check_handle(stt, &client)) {
1374 return STT_ERROR_INVALID_PARAMETER;
1377 SLOG(LOG_DEBUG, TAG_STTC, "===== STT START");
1380 if (client->current_state != STT_STATE_READY) {
1381 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
1382 return STT_ERROR_INVALID_STATE;
1385 if (STT_INTERNAL_STATE_NONE != client->internal_state) {
1386 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is NOT none : %d", client->internal_state);
1387 return STT_ERROR_IN_PROGRESS_TO_RECORDING;
1391 char appid[128] = {0, };
1392 ret = aul_app_get_appid_bypid(getpid(), appid, sizeof(appid));
1394 if ((AUL_R_OK != ret) || (0 == strlen(appid))) {
1395 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get application ID");
1397 SLOG(LOG_DEBUG, TAG_STTC, "[DEBUG] Current app id is %s", appid);
1401 if (NULL == language) {
1402 temp = strdup("default");
1404 temp = strdup(language);
1407 if (true == client->credential_needed && NULL == client->credential) {
1408 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Do not have app credential for this engine(%s)", client->current_engine_id);
1409 return STT_ERROR_PERMISSION_DENIED;
1412 ret = stt_dbus_request_start(client->uid, temp, type, client->silence, appid, client->credential);
1414 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to start : %s", __stt_get_error_code(ret));
1416 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Start is successful but not done");
1417 client->internal_state = STT_INTERNAL_STATE_STARTING;
1420 if (NULL != temp) free(temp);
1422 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1423 SLOG(LOG_DEBUG, TAG_STTC, " ");
1428 int stt_stop(stt_h stt)
1430 stt_client_s* client = NULL;
1431 if (0 != __stt_get_feature_enabled()) {
1432 return STT_ERROR_NOT_SUPPORTED;
1434 if (0 != __stt_check_privilege()) {
1435 return STT_ERROR_PERMISSION_DENIED;
1437 if (0 != __stt_check_handle(stt, &client)) {
1438 return STT_ERROR_INVALID_PARAMETER;
1441 SLOG(LOG_DEBUG, TAG_STTC, "===== STT STOP");
1444 if (client->current_state != STT_STATE_RECORDING) {
1445 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Current state(%d) is NOT RECORDING", client->current_state);
1446 return STT_ERROR_INVALID_STATE;
1449 if (STT_INTERNAL_STATE_STARTING == client->internal_state) {
1450 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is STARTING : %d", client->internal_state);
1451 return STT_ERROR_IN_PROGRESS_TO_RECORDING;
1452 } else if (STT_INTERNAL_STATE_CANCELING == client->internal_state) {
1453 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is CANCELING : %d", client->internal_state);
1454 return STT_ERROR_IN_PROGRESS_TO_READY;
1455 } else if (STT_INTERNAL_STATE_STOPPING == client->internal_state) {
1456 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is STOPPING : %d", client->internal_state);
1457 return STT_ERROR_IN_PROGRESS_TO_PROCESSING;
1460 int ret = stt_dbus_request_stop(client->uid);
1463 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to stop : %s", __stt_get_error_code(ret));
1465 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Stop is successful but not done");
1466 client->internal_state = STT_INTERNAL_STATE_STOPPING;
1469 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1470 SLOG(LOG_DEBUG, TAG_STTC, " ");
1476 int stt_cancel(stt_h stt)
1478 stt_client_s* client = NULL;
1479 if (0 != __stt_get_feature_enabled()) {
1480 return STT_ERROR_NOT_SUPPORTED;
1482 if (0 != __stt_check_privilege()) {
1483 return STT_ERROR_PERMISSION_DENIED;
1485 if (0 != __stt_check_handle(stt, &client)) {
1486 return STT_ERROR_INVALID_PARAMETER;
1489 SLOG(LOG_DEBUG, TAG_STTC, "===== STT CANCEL");
1492 if (STT_STATE_RECORDING != client->current_state && STT_STATE_PROCESSING != client->current_state) {
1493 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid state : Current state(%d) is 'Ready'", client->current_state);
1494 return STT_ERROR_INVALID_STATE;
1497 if (STT_INTERNAL_STATE_STARTING == client->internal_state) {
1498 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is STARTING : %d", client->internal_state);
1499 return STT_ERROR_IN_PROGRESS_TO_RECORDING;
1500 } else if (STT_INTERNAL_STATE_STOPPING == client->internal_state) {
1501 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is STOPPING : %d", client->internal_state);
1502 return STT_ERROR_IN_PROGRESS_TO_PROCESSING;
1503 } else if (STT_INTERNAL_STATE_CANCELING == client->internal_state) {
1504 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is CANCELING : %d", client->internal_state);
1505 return STT_ERROR_IN_PROGRESS_TO_READY;
1508 int ret = stt_dbus_request_cancel(client->uid);
1510 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to cancel : %s", __stt_get_error_code(ret));
1512 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Cancel is successful but not done");
1513 client->internal_state = STT_INTERNAL_STATE_CANCELING;
1516 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1517 SLOG(LOG_DEBUG, TAG_STTC, " ");
1522 int __stt_cb_set_volume(int uid, float volume)
1524 stt_client_s* client = NULL;
1526 client = stt_client_get_by_uid(uid);
1527 if (NULL == client) {
1528 SLOG(LOG_ERROR, TAG_STTC, "Handle is NOT valid");
1529 return STT_ERROR_INVALID_PARAMETER;
1532 if (STT_STATE_RECORDING != client->current_state) {
1533 SLOG(LOG_DEBUG, TAG_STTC, "[ERROR] Invalid state : NO 'Recording' state, cur(%d)", client->current_state);
1534 return STT_ERROR_INVALID_STATE;
1537 g_volume_db = volume;
1538 SLOG(LOG_DEBUG, TAG_STTC, "Set volume (%f)", g_volume_db);
1543 int stt_get_recording_volume(stt_h stt, float* volume)
1545 stt_client_s* client = NULL;
1546 if (0 != __stt_get_feature_enabled()) {
1547 return STT_ERROR_NOT_SUPPORTED;
1549 if (0 != __stt_check_privilege()) {
1550 return STT_ERROR_PERMISSION_DENIED;
1552 if (0 != __stt_check_handle(stt, &client)) {
1553 return STT_ERROR_INVALID_PARAMETER;
1556 if (NULL == volume) {
1557 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1558 return STT_ERROR_INVALID_PARAMETER;
1561 if (STT_STATE_RECORDING != client->current_state) {
1562 SLOG(LOG_DEBUG, TAG_STTC, "[ERROR] Invalid state : NO 'Recording' state, cur(%d)", client->current_state);
1563 return STT_ERROR_INVALID_STATE;
1566 *volume = g_volume_db;
1568 return STT_ERROR_NONE;
1571 bool __stt_result_time_cb(int index, int event, const char* text, long start_time, long end_time, void* user_data)
1573 stt_client_s* client = (stt_client_s*)user_data;
1576 if (NULL == client) {
1577 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
1581 if (NULL != client->result_time_cb) {
1582 SLOG(LOG_DEBUG, TAG_STTC, "(%d) event(%d) text(%s) start(%ld) end(%ld)",
1583 index, event, text, start_time, end_time);
1584 client->result_time_cb(client->stt, index, (stt_result_time_event_e)event,
1585 text, start_time, end_time, client->result_time_user_data);
1587 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Callback is NULL");
1594 int stt_foreach_detailed_result(stt_h stt, stt_result_time_cb callback, void* user_data)
1596 stt_client_s* client = NULL;
1597 if (0 != __stt_get_feature_enabled()) {
1598 return STT_ERROR_NOT_SUPPORTED;
1600 if (0 != __stt_check_privilege()) {
1601 return STT_ERROR_PERMISSION_DENIED;
1603 if (0 != __stt_check_handle(stt, &client)) {
1604 return STT_ERROR_INVALID_PARAMETER;
1607 SLOG(LOG_DEBUG, TAG_STTC, "===== STT FOREACH DETAILED RESULT");
1609 if (NULL == callback) {
1610 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1611 return STT_ERROR_INVALID_PARAMETER;
1614 client->result_time_cb = callback;
1615 client->result_time_user_data = user_data;
1618 ret = stt_config_mgr_foreach_time_info(__stt_result_time_cb, client);
1619 ret = __stt_convert_config_error_code(ret);
1621 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to foreach time info : %s", __stt_get_error_code(ret));
1624 client->result_time_cb = NULL;
1625 client->result_time_user_data = NULL;
1627 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1628 SLOG(LOG_DEBUG, TAG_STTC, " ");
1633 static Eina_Bool __stt_notify_error(void *data)
1635 stt_client_s* client = (stt_client_s*)data;
1637 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Error from sttd");
1640 if (NULL == client) {
1641 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
1645 if (NULL == stt_client_get_by_uid(client->uid))
1648 if (NULL != client->error_cb) {
1649 stt_client_use_callback(client);
1650 g_err_callback_status = true;
1651 client->error_cb(client->stt, client->reason, client->error_user_data);
1652 g_err_callback_status = false;
1653 stt_client_not_use_callback(client);
1654 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Error callback is called : reason [%d]", client->reason);
1656 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Error callback is null");
1662 int __stt_cb_error(int uid, int reason, char* err_msg)
1664 stt_client_s* client = stt_client_get_by_uid(uid);
1665 if (NULL == client) {
1666 SLOG(LOG_ERROR, TAG_STTC, "Handle not found");
1670 client->reason = reason;
1671 client->internal_state = STT_INTERNAL_STATE_NONE;
1672 if (NULL != client->err_msg) {
1673 free(client->err_msg);
1674 client->err_msg = NULL;
1676 client->err_msg = strdup(err_msg);
1678 SLOG(LOG_INFO, TAG_STTC, "internal state is initialized to 0");
1680 if (NULL != client->error_cb) {
1681 ecore_timer_add(0, __stt_notify_error, client);
1683 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Error callback is null");
1686 if (STT_ERROR_SERVICE_RESET == reason) {
1687 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Service reset");
1689 client->current_state = STT_STATE_CREATED;
1690 if (0 != stt_prepare(client->stt)) {
1691 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to prepare");
1698 static void __stt_notify_state_changed(void *data)
1700 stt_client_s* client = (stt_client_s*)data;
1703 if (NULL == client) {
1704 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
1708 if (NULL == stt_client_get_by_uid(client->uid)) {
1712 if (STT_INTERNAL_STATE_STARTING == client->internal_state && STT_STATE_RECORDING == client->current_state) {
1713 client->internal_state = STT_INTERNAL_STATE_NONE;
1714 SLOG(LOG_DEBUG, TAG_STTC, "Internal state change to NONE");
1715 } else if (STT_INTERNAL_STATE_STOPPING == client->internal_state && STT_STATE_PROCESSING == client->current_state) {
1716 client->internal_state = STT_INTERNAL_STATE_NONE;
1717 SLOG(LOG_DEBUG, TAG_STTC, "Internal state change to NONE");
1718 } else if (STT_INTERNAL_STATE_CANCELING == client->internal_state && STT_STATE_READY == client->current_state) {
1719 client->internal_state = STT_INTERNAL_STATE_NONE;
1720 SLOG(LOG_DEBUG, TAG_STTC, "Internal state change to NONE");
1723 if (NULL != client->state_changed_cb) {
1724 stt_client_use_callback(client);
1725 client->state_changed_cb(client->stt, client->before_state,
1726 client->current_state, client->state_changed_user_data);
1727 stt_client_not_use_callback(client);
1728 SLOG(LOG_DEBUG, TAG_STTC, "State changed callback is called");
1730 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
1736 static Eina_Bool __stt_notify_result(void *data)
1738 stt_client_s* client = (stt_client_s*)data;
1741 if (NULL == client) {
1742 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
1746 if (NULL == stt_client_get_by_uid(client->uid)) {
1750 if (NULL != client->recognition_result_cb) {
1751 stt_client_use_callback(client);
1752 client->recognition_result_cb(client->stt, client->event, (const char**)client->data_list, client->data_count,
1753 client->msg, client->recognition_result_user_data);
1754 stt_client_not_use_callback(client);
1755 SLOG(LOG_DEBUG, TAG_STTC, "client recognition result callback called");
1757 SLOG(LOG_WARN, TAG_STTC, "[WARNING] User recognition result callback is NULL");
1760 if (NULL != client->msg) {
1765 if (NULL != client->data_list) {
1767 temp = client->data_list;
1770 for (i = 0; i < client->data_count; i++) {
1771 if (NULL != temp[i]) {
1775 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result data is error");
1778 free(client->data_list);
1779 client->data_list = NULL;
1782 client->data_count = 0;
1784 stt_config_mgr_remove_time_info_file();
1786 if (STT_RESULT_EVENT_FINAL_RESULT == client->event || STT_RESULT_EVENT_ERROR == client->event) {
1787 client->before_state = client->current_state;
1788 client->current_state = STT_STATE_READY;
1790 if (NULL != client->state_changed_cb) {
1791 ecore_main_loop_thread_safe_call_async(__stt_notify_state_changed, client);
1793 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
1800 int __stt_cb_result(int uid, int event, char** data, int data_count, const char* msg)
1802 stt_client_s* client = NULL;
1804 client = stt_client_get_by_uid(uid);
1805 if (NULL == client) {
1806 SLOG(LOG_ERROR, TAG_STTC, "Handle is NOT valid");
1807 return STT_ERROR_INVALID_PARAMETER;
1811 SLOG(LOG_DEBUG, TAG_STTC, "Recognition Result Message = %s", msg);
1814 for (i = 0; i < data_count; i++) {
1815 if (NULL != data[i])
1816 SLOG(LOG_DEBUG, TAG_STTC, "Recognition Result[%d] = %s", i, data[i]);
1819 if (NULL != client->recognition_result_cb) {
1820 client->event = event;
1822 client->msg = strdup(msg);
1825 client->data_count = data_count;
1827 if (data_count > 0) {
1829 temp = (char**)calloc(data_count, sizeof(char*));
1831 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to allocate memory");
1832 return STT_ERROR_OUT_OF_MEMORY;
1835 for (i = 0; i < data_count; i++) {
1836 if (NULL != data[i])
1837 temp[i] = strdup(data[i]);
1839 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result data is error");
1842 client->data_list = temp;
1845 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] User result callback is null");
1848 ecore_timer_add(0, __stt_notify_result, client);
1850 return STT_ERROR_NONE;
1853 int __stt_cb_set_state(int uid, int state)
1855 stt_client_s* client = stt_client_get_by_uid(uid);
1856 if (NULL == client) {
1857 SLOG(LOG_ERROR, TAG_STTC, "Handle not found");
1861 stt_state_e state_from_daemon = (stt_state_e)state;
1863 if (client->current_state == state_from_daemon) {
1864 SLOG(LOG_DEBUG, TAG_STTC, "Current state has already been %d", client->current_state);
1868 client->before_state = client->current_state;
1869 client->current_state = state_from_daemon;
1871 ecore_main_loop_thread_safe_call_async(__stt_notify_state_changed, client);
1875 int stt_set_recognition_result_cb(stt_h stt, stt_recognition_result_cb callback, void* user_data)
1877 stt_client_s* client = NULL;
1878 if (0 != __stt_get_feature_enabled()) {
1879 return STT_ERROR_NOT_SUPPORTED;
1881 if (0 != __stt_check_privilege()) {
1882 return STT_ERROR_PERMISSION_DENIED;
1884 if (0 != __stt_check_handle(stt, &client)) {
1885 return STT_ERROR_INVALID_PARAMETER;
1888 if (callback == NULL)
1889 return STT_ERROR_INVALID_PARAMETER;
1891 if (STT_STATE_CREATED != client->current_state) {
1892 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
1893 return STT_ERROR_INVALID_STATE;
1896 client->recognition_result_cb = callback;
1897 client->recognition_result_user_data = user_data;
1902 int stt_unset_recognition_result_cb(stt_h stt)
1904 stt_client_s* client = NULL;
1905 if (0 != __stt_get_feature_enabled()) {
1906 return STT_ERROR_NOT_SUPPORTED;
1908 if (0 != __stt_check_privilege()) {
1909 return STT_ERROR_PERMISSION_DENIED;
1911 if (0 != __stt_check_handle(stt, &client)) {
1912 return STT_ERROR_INVALID_PARAMETER;
1915 if (STT_STATE_CREATED != client->current_state) {
1916 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
1917 return STT_ERROR_INVALID_STATE;
1920 client->recognition_result_cb = NULL;
1921 client->recognition_result_user_data = NULL;
1926 int stt_set_state_changed_cb(stt_h stt, stt_state_changed_cb callback, void* user_data)
1928 stt_client_s* client = NULL;
1929 if (0 != __stt_get_feature_enabled()) {
1930 return STT_ERROR_NOT_SUPPORTED;
1932 if (0 != __stt_check_privilege()) {
1933 return STT_ERROR_PERMISSION_DENIED;
1935 if (0 != __stt_check_handle(stt, &client)) {
1936 return STT_ERROR_INVALID_PARAMETER;
1939 if (NULL == callback)
1940 return STT_ERROR_INVALID_PARAMETER;
1942 if (STT_STATE_CREATED != client->current_state) {
1943 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
1944 return STT_ERROR_INVALID_STATE;
1947 client->state_changed_cb = callback;
1948 client->state_changed_user_data = user_data;
1953 int stt_unset_state_changed_cb(stt_h stt)
1955 stt_client_s* client = NULL;
1956 if (0 != __stt_get_feature_enabled()) {
1957 return STT_ERROR_NOT_SUPPORTED;
1959 if (0 != __stt_check_privilege()) {
1960 return STT_ERROR_PERMISSION_DENIED;
1962 if (0 != __stt_check_handle(stt, &client)) {
1963 return STT_ERROR_INVALID_PARAMETER;
1966 if (STT_STATE_CREATED != client->current_state) {
1967 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
1968 return STT_ERROR_INVALID_STATE;
1971 client->state_changed_cb = NULL;
1972 client->state_changed_user_data = NULL;
1977 int stt_set_error_cb(stt_h stt, stt_error_cb callback, void* user_data)
1979 stt_client_s* client = NULL;
1980 if (0 != __stt_get_feature_enabled()) {
1981 return STT_ERROR_NOT_SUPPORTED;
1983 if (0 != __stt_check_privilege()) {
1984 return STT_ERROR_PERMISSION_DENIED;
1986 if (0 != __stt_check_handle(stt, &client)) {
1987 return STT_ERROR_INVALID_PARAMETER;
1990 if (NULL == callback)
1991 return STT_ERROR_INVALID_PARAMETER;
1993 if (STT_STATE_CREATED != client->current_state) {
1994 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
1995 return STT_ERROR_INVALID_STATE;
1998 client->error_cb = callback;
1999 client->error_user_data = user_data;
2004 int stt_unset_error_cb(stt_h stt)
2006 stt_client_s* client = NULL;
2007 if (0 != __stt_get_feature_enabled()) {
2008 return STT_ERROR_NOT_SUPPORTED;
2010 if (0 != __stt_check_privilege()) {
2011 return STT_ERROR_PERMISSION_DENIED;
2013 if (0 != __stt_check_handle(stt, &client)) {
2014 return STT_ERROR_INVALID_PARAMETER;
2017 if (STT_STATE_CREATED != client->current_state) {
2018 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2019 return STT_ERROR_INVALID_STATE;
2022 client->error_cb = NULL;
2023 client->error_user_data = NULL;
2028 int stt_set_default_language_changed_cb(stt_h stt, stt_default_language_changed_cb callback, void* user_data)
2030 stt_client_s* client = NULL;
2031 if (0 != __stt_get_feature_enabled()) {
2032 return STT_ERROR_NOT_SUPPORTED;
2034 if (0 != __stt_check_privilege()) {
2035 return STT_ERROR_PERMISSION_DENIED;
2037 if (0 != __stt_check_handle(stt, &client)) {
2038 return STT_ERROR_INVALID_PARAMETER;
2041 if (NULL == callback)
2042 return STT_ERROR_INVALID_PARAMETER;
2044 if (STT_STATE_CREATED != client->current_state) {
2045 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2046 return STT_ERROR_INVALID_STATE;
2049 client->default_lang_changed_cb = callback;
2050 client->default_lang_changed_user_data = user_data;
2055 int stt_unset_default_language_changed_cb(stt_h stt)
2057 stt_client_s* client = NULL;
2058 if (0 != __stt_get_feature_enabled()) {
2059 return STT_ERROR_NOT_SUPPORTED;
2061 if (0 != __stt_check_privilege()) {
2062 return STT_ERROR_PERMISSION_DENIED;
2064 if (0 != __stt_check_handle(stt, &client)) {
2065 return STT_ERROR_INVALID_PARAMETER;
2068 if (STT_STATE_CREATED != client->current_state) {
2069 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2070 return STT_ERROR_INVALID_STATE;
2073 client->default_lang_changed_cb = NULL;
2074 client->default_lang_changed_user_data = NULL;
2079 int stt_set_engine_changed_cb(stt_h stt, stt_engine_changed_cb callback, void* user_data)
2081 stt_client_s* client = NULL;
2082 if (0 != __stt_get_feature_enabled()) {
2083 return STT_ERROR_NOT_SUPPORTED;
2085 if (0 != __stt_check_privilege()) {
2086 return STT_ERROR_PERMISSION_DENIED;
2088 if (0 != __stt_check_handle(stt, &client)) {
2089 return STT_ERROR_INVALID_PARAMETER;
2092 if (NULL == callback)
2093 return STT_ERROR_INVALID_PARAMETER;
2095 if (STT_STATE_CREATED != client->current_state) {
2096 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2097 return STT_ERROR_INVALID_STATE;
2100 client->engine_changed_cb = callback;
2101 client->engine_changed_user_data = user_data;
2106 int stt_unset_engine_changed_cb(stt_h stt)
2108 stt_client_s* client = NULL;
2109 if (0 != __stt_get_feature_enabled()) {
2110 return STT_ERROR_NOT_SUPPORTED;
2112 if (0 != __stt_check_privilege()) {
2113 return STT_ERROR_PERMISSION_DENIED;
2115 if (0 != __stt_check_handle(stt, &client)) {
2116 return STT_ERROR_INVALID_PARAMETER;
2119 if (STT_STATE_CREATED != client->current_state) {
2120 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2121 return STT_ERROR_INVALID_STATE;
2124 client->engine_changed_cb = NULL;
2125 client->engine_changed_user_data = NULL;