2 * Copyright (c) 2011-2014 Samsung Electronics Co., Ltd All Rights Reserved
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 * http://www.apache.org/licenses/LICENSE-2.0
7 * Unless required by applicable law or agreed to in writing, software
8 * distributed under the License is distributed on an "AS IS" BASIS,
9 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 * See the License for the specific language governing permissions and
11 * limitations under the License.
20 #include <sys/types.h>
22 #include <system_info.h>
26 #include "stt_client.h"
28 #include "stt_config_mgr.h"
32 static void __stt_notify_state_changed(void *data);
33 static Eina_Bool __stt_notify_error(void *data);
35 static Ecore_Timer* g_connect_timer = NULL;
36 static float g_volume_db = 0;
38 static int g_feature_enabled = -1;
40 static bool g_err_callback_status = false;
47 static int __stt_get_feature_enabled()
49 if (0 == g_feature_enabled) {
50 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
51 return STT_ERROR_NOT_SUPPORTED;
52 } else if (-1 == g_feature_enabled) {
53 bool stt_supported = false;
54 bool mic_supported = false;
55 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
56 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
57 if (false == stt_supported || false == mic_supported) {
58 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
59 g_feature_enabled = 0;
60 return STT_ERROR_NOT_SUPPORTED;
63 g_feature_enabled = 1;
65 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get feature value");
66 return STT_ERROR_NOT_SUPPORTED;
69 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get feature value");
70 return STT_ERROR_NOT_SUPPORTED;
77 static const char* __stt_get_error_code(stt_error_e err)
80 case STT_ERROR_NONE: return "STT_ERROR_NONE";
81 case STT_ERROR_OUT_OF_MEMORY: return "STT_ERROR_OUT_OF_MEMORY";
82 case STT_ERROR_IO_ERROR: return "STT_ERROR_IO_ERROR";
83 case STT_ERROR_INVALID_PARAMETER: return "STT_ERROR_INVALID_PARAMETER";
84 case STT_ERROR_TIMED_OUT: return "STT_ERROR_TIMED_OUT";
85 case STT_ERROR_RECORDER_BUSY: return "STT_ERROR_RECORDER_BUSY";
86 case STT_ERROR_OUT_OF_NETWORK: return "STT_ERROR_OUT_OF_NETWORK";
87 case STT_ERROR_PERMISSION_DENIED: return "STT_ERROR_PERMISSION_DENIED";
88 case STT_ERROR_NOT_SUPPORTED: return "STT_ERROR_NOT_SUPPORTED";
89 case STT_ERROR_INVALID_STATE: return "STT_ERROR_INVALID_STATE";
90 case STT_ERROR_INVALID_LANGUAGE: return "STT_ERROR_INVALID_LANGUAGE";
91 case STT_ERROR_ENGINE_NOT_FOUND: return "STT_ERROR_ENGINE_NOT_FOUND";
92 case STT_ERROR_OPERATION_FAILED: return "STT_ERROR_OPERATION_FAILED";
93 case STT_ERROR_NOT_SUPPORTED_FEATURE: return "STT_ERROR_NOT_SUPPORTED_FEATURE";
95 return "Invalid error code";
99 static int __stt_convert_config_error_code(stt_config_error_e code)
101 if (code == STT_CONFIG_ERROR_NONE) return STT_ERROR_NONE;
102 if (code == STT_CONFIG_ERROR_OUT_OF_MEMORY) return STT_ERROR_OUT_OF_MEMORY;
103 if (code == STT_CONFIG_ERROR_IO_ERROR) return STT_ERROR_IO_ERROR;
104 if (code == STT_CONFIG_ERROR_INVALID_PARAMETER) return STT_ERROR_INVALID_PARAMETER;
105 if (code == STT_CONFIG_ERROR_PERMISSION_DENIED) return STT_ERROR_PERMISSION_DENIED;
106 if (code == STT_CONFIG_ERROR_NOT_SUPPORTED) return STT_ERROR_NOT_SUPPORTED;
107 if (code == STT_CONFIG_ERROR_INVALID_STATE) return STT_ERROR_INVALID_STATE;
108 if (code == STT_CONFIG_ERROR_INVALID_LANGUAGE) return STT_ERROR_INVALID_LANGUAGE;
109 if (code == STT_CONFIG_ERROR_ENGINE_NOT_FOUND) return STT_ERROR_ENGINE_NOT_FOUND;
110 if (code == STT_CONFIG_ERROR_OPERATION_FAILED) return STT_ERROR_OPERATION_FAILED;
115 void __stt_config_lang_changed_cb(const char* before_language, const char* current_language, void* user_data)
117 SLOG(LOG_DEBUG, TAG_STTC, "Language changed : Before lang(%s) Current lang(%s)",
118 before_language, current_language);
120 if (0 == strcmp(before_language, current_language)) {
124 GList* client_list = NULL;
125 client_list = stt_client_get_client_list();
128 stt_client_s *data = NULL;
130 if (g_list_length(client_list) > 0) {
131 /* Get a first item */
132 iter = g_list_first(client_list);
134 while (NULL != iter) {
136 if (NULL != data->default_lang_changed_cb) {
137 SLOG(LOG_DEBUG, TAG_STTC, "Call default language changed callback : uid(%d)", data->uid);
138 data->default_lang_changed_cb(data->stt, before_language, current_language,
139 data->default_lang_changed_user_data);
143 iter = g_list_next(iter);
150 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)
152 stt_h stt = (stt_h)user_data;
154 stt_client_s* client = stt_client_get(stt);
155 if (NULL == client) {
156 SLOG(LOG_ERROR, TAG_STTC, "[WARNING] A handle is not valid");
160 if (NULL != engine_id) SLOG(LOG_DEBUG, TAG_STTC, "Engine id(%s)", engine_id);
161 if (NULL != setting) SLOG(LOG_DEBUG, TAG_STTC, "Engine setting(%s)", setting);
162 if (NULL != language) SLOG(LOG_DEBUG, TAG_STTC, "Language(%s)", language);
163 SLOG(LOG_DEBUG, TAG_STTC, "Silence(%s), Credential(%s)", support_silence ? "on" : "off", need_credential ? "need" : "no need");
165 /* call callback function */
166 if (NULL != client->engine_changed_cb) {
167 client->engine_changed_cb(stt, engine_id, language, support_silence, need_credential, client->engine_changed_user_data);
169 SLOG(LOG_WARN, TAG_STTC, "No registered callback function of supported languages");
174 int stt_create(stt_h* stt)
176 if (0 != __stt_get_feature_enabled()) {
177 return STT_ERROR_NOT_SUPPORTED;
180 SLOG(LOG_DEBUG, TAG_STTC, "===== Create STT");
183 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is null");
184 return STT_ERROR_INVALID_PARAMETER;
187 if (0 == stt_client_get_size()) {
188 if (0 != stt_dbus_open_connection()) {
189 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to open connection");
190 return STT_ERROR_OPERATION_FAILED;
194 if (0 != stt_client_new(stt)) {
195 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to create client!");
196 return STT_ERROR_OUT_OF_MEMORY;
199 stt_client_s* client = stt_client_get(*stt);
200 if (NULL == client) {
201 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to create client");
202 stt_client_destroy(*stt);
203 return STT_ERROR_OPERATION_FAILED;
206 int ret = stt_config_mgr_initialize(client->uid);
207 ret = __stt_convert_config_error_code(ret);
209 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to init config manager : %s", __stt_get_error_code(ret));
210 stt_client_destroy(*stt);
214 ret = stt_config_mgr_set_callback(client->uid, __stt_config_engine_changed_cb, __stt_config_lang_changed_cb, NULL, client->stt);
215 ret = __stt_convert_config_error_code(ret);
217 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set config changed : %s", __stt_get_error_code(ret));
218 stt_client_destroy(*stt);
222 SLOG(LOG_DEBUG, TAG_STTC, "[Success] uid(%d)", (*stt)->handle);
224 SLOG(LOG_DEBUG, TAG_STTC, "=====");
225 SLOG(LOG_DEBUG, TAG_STTC, " ");
227 return STT_ERROR_NONE;
230 int stt_destroy(stt_h stt)
232 if (0 != __stt_get_feature_enabled()) {
233 return STT_ERROR_NOT_SUPPORTED;
236 SLOG(LOG_DEBUG, TAG_STTC, "===== Destroy STT");
239 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input handle is null");
240 return STT_ERROR_INVALID_PARAMETER;
243 stt_client_s* client = stt_client_get(stt);
246 if (NULL == client) {
247 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
248 return STT_ERROR_INVALID_PARAMETER;
251 /* check used callback */
252 if (0 != stt_client_get_use_callback(client)) {
253 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Cannot destroy in Callback function");
254 return STT_ERROR_OPERATION_FAILED;
257 stt_config_mgr_finalize(client->uid);
262 switch (client->current_state) {
263 case STT_STATE_PROCESSING:
264 case STT_STATE_RECORDING:
265 case STT_STATE_READY:
266 ret = stt_dbus_request_finalize(client->uid);
268 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request finalize : %s", __stt_get_error_code(ret));
270 case STT_STATE_CREATED:
271 if (NULL != g_connect_timer) {
272 SLOG(LOG_DEBUG, TAG_STTC, "Connect Timer is deleted");
273 ecore_timer_del(g_connect_timer);
274 g_connect_timer = NULL;
278 stt_client_destroy(stt);
284 if (0 == stt_client_get_size()) {
285 if (0 != stt_dbus_close_connection()) {
286 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to close connection");
292 SLOG(LOG_DEBUG, TAG_STTC, "=====");
293 SLOG(LOG_DEBUG, TAG_STTC, " ");
295 return STT_ERROR_NONE;
298 bool __stt_config_supported_engine_cb(const char* engine_id, const char* engine_name,
299 const char* setting, bool support_silence, void* user_data)
301 stt_h stt = (stt_h)user_data;
303 stt_client_s* client = stt_client_get(stt);
304 if (NULL == client) {
305 SLOG(LOG_ERROR, TAG_STTC, "[WARNING] A handle is not valid");
309 /* call callback function */
310 if (NULL != client->supported_engine_cb) {
311 return client->supported_engine_cb(stt, engine_id, engine_name, client->supported_engine_user_data);
313 SLOG(LOG_WARN, TAG_STTC, "No registered callback function of supported engine");
319 int stt_foreach_supported_engines(stt_h stt, stt_supported_engine_cb callback, void* user_data)
321 if (0 != __stt_get_feature_enabled()) {
322 return STT_ERROR_NOT_SUPPORTED;
325 SLOG(LOG_DEBUG, TAG_STTC, "===== Foreach Supported engine");
327 if (NULL == stt || NULL == callback) {
328 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
329 return STT_ERROR_INVALID_PARAMETER;
332 stt_client_s* client = stt_client_get(stt);
335 if (NULL == client) {
336 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
337 return STT_ERROR_INVALID_PARAMETER;
340 if (client->current_state != STT_STATE_CREATED) {
341 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not CREATED", client->current_state);
342 return STT_ERROR_INVALID_STATE;
345 client->supported_engine_cb = callback;
346 client->supported_engine_user_data = user_data;
349 ret = stt_config_mgr_get_engine_list(__stt_config_supported_engine_cb, client->stt);
350 ret = __stt_convert_config_error_code(ret);
352 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get engines : %s", __stt_get_error_code(ret));
355 client->supported_engine_cb = NULL;
356 client->supported_engine_user_data = NULL;
358 SLOG(LOG_DEBUG, TAG_STTC, "=====");
359 SLOG(LOG_DEBUG, TAG_STTC, " ");
364 int stt_get_engine(stt_h stt, char** engine_id)
366 if (0 != __stt_get_feature_enabled()) {
367 return STT_ERROR_NOT_SUPPORTED;
370 SLOG(LOG_DEBUG, TAG_STTC, "===== Get current engine");
372 if (NULL == stt || NULL == engine_id) {
373 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
374 return STT_ERROR_INVALID_PARAMETER;
377 stt_client_s* client = stt_client_get(stt);
380 if (NULL == client) {
381 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
382 return STT_ERROR_INVALID_PARAMETER;
385 if (client->current_state != STT_STATE_CREATED) {
386 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not CREATED", client->current_state);
387 return STT_ERROR_INVALID_STATE;
392 if (NULL != client->current_engine_id) {
393 *engine_id = strdup(client->current_engine_id);
394 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current engine uuid = %s", *engine_id);
397 ret = stt_config_mgr_get_engine(engine_id);
398 ret = __stt_convert_config_error_code(ret);
400 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request get current engine : %s", __stt_get_error_code(ret));
402 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current engine uuid = %s", *engine_id);
406 SLOG(LOG_DEBUG, TAG_STTC, "=====");
407 SLOG(LOG_DEBUG, TAG_STTC, " ");
412 int stt_set_engine(stt_h stt, const char* engine_id)
414 if (0 != __stt_get_feature_enabled()) {
415 return STT_ERROR_NOT_SUPPORTED;
418 SLOG(LOG_DEBUG, TAG_STTC, "===== Set current engine");
420 if (NULL == stt || NULL == engine_id) {
421 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
422 return STT_ERROR_INVALID_PARAMETER;
425 stt_client_s* client = stt_client_get(stt);
428 if (NULL == client) {
429 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
430 return STT_ERROR_INVALID_PARAMETER;
434 if (client->current_state != STT_STATE_CREATED) {
435 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not CREATED", client->current_state);
436 return STT_ERROR_INVALID_STATE;
439 if (NULL != client->current_engine_id) {
440 free(client->current_engine_id);
443 client->current_engine_id = strdup(engine_id);
445 SLOG(LOG_DEBUG, TAG_STTC, "=====");
446 SLOG(LOG_DEBUG, TAG_STTC, " ");
451 int stt_set_credential(stt_h stt, const char* credential)
453 if (0 != __stt_get_feature_enabled()) {
454 return STT_ERROR_NOT_SUPPORTED;
457 SLOG(LOG_DEBUG, TAG_STTC, "===== Set credential");
459 if (NULL == stt || NULL == credential) {
460 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL, stt(%s), credential(%a)", stt, credential);
461 return STT_ERROR_INVALID_PARAMETER;
464 stt_client_s* client = stt_client_get(stt);
467 if (NULL == client) {
468 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
469 return STT_ERROR_INVALID_PARAMETER;
473 if (client->current_state != STT_STATE_CREATED && client->current_state != STT_STATE_READY) {
474 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not CREATED or READY", client->current_state);
475 return STT_ERROR_INVALID_STATE;
478 client->credential = strdup(credential);
480 SLOG(LOG_DEBUG, TAG_STTC, "=====");
481 SLOG(LOG_DEBUG, TAG_STTC, " ");
483 return STT_ERROR_NONE;
486 static Eina_Bool __stt_connect_daemon(void *data)
488 stt_client_s* client = (stt_client_s*)data;
490 if (NULL == client) {
491 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
492 g_connect_timer = NULL;
498 ret = stt_dbus_request_hello();
501 if (STT_ERROR_INVALID_STATE == ret) {
502 g_connect_timer = NULL;
508 g_connect_timer = NULL;
509 SLOG(LOG_DEBUG, TAG_STTC, "===== Connect daemon");
511 /* request initialization */
512 bool silence_supported = false;
513 bool credential_needed = false;
515 ret = stt_dbus_request_initialize(client->uid, &silence_supported, &credential_needed);
517 if (STT_ERROR_ENGINE_NOT_FOUND == ret) {
518 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to initialize : %s", __stt_get_error_code(ret));
520 client->reason = STT_ERROR_ENGINE_NOT_FOUND;
521 ecore_timer_add(0, __stt_notify_error, (void*)client);
525 } else if (STT_ERROR_NONE != ret) {
526 SLOG(LOG_ERROR, TAG_STTC, "[WARNING] Fail to connection. Retry to connect");
529 /* success to connect stt-daemon */
530 client->silence_supported = silence_supported;
531 client->credential_needed = credential_needed;
532 SLOG(LOG_DEBUG, TAG_STTC, "Supported options : silence(%s), credential(%s)", silence_supported ? "support" : "no support", credential_needed ? "need" : "no need");
535 if (NULL != client->current_engine_id) {
538 silence_supported = false;
539 credential_needed = false;
541 ret = stt_dbus_request_set_current_engine(client->uid, client->current_engine_id, &silence_supported, &credential_needed);
543 if (STT_ERROR_TIMED_OUT != ret) {
544 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set current engine : %s", __stt_get_error_code(ret));
547 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
550 if (STT_RETRY_COUNT == count) {
551 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
556 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current engine uuid = %s", client->current_engine_id);
558 /* success to change engine */
559 client->silence_supported = silence_supported;
560 SLOG(LOG_DEBUG, TAG_STTC, "Supported options : silence(%s), credential(%s)", silence_supported ? "support" : "no support", credential_needed ? "need" : "no need");
565 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] uid(%d)", client->uid);
567 client->before_state = client->current_state;
568 client->current_state = STT_STATE_READY;
570 if (NULL != client->state_changed_cb) {
571 stt_client_use_callback(client);
572 client->state_changed_cb(client->stt, client->before_state,
573 client->current_state, client->state_changed_user_data);
574 stt_client_not_use_callback(client);
575 SLOG(LOG_DEBUG, TAG_STTC, "State changed callback is called");
577 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
580 SLOG(LOG_DEBUG, TAG_STTC, "=====");
581 SLOG(LOG_DEBUG, TAG_STTC, " ");
586 int stt_prepare(stt_h stt)
588 if (0 != __stt_get_feature_enabled()) {
589 return STT_ERROR_NOT_SUPPORTED;
592 SLOG(LOG_DEBUG, TAG_STTC, "===== Prepare STT");
594 stt_client_s* client = stt_client_get(stt);
597 if (NULL == client) {
598 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
599 return STT_ERROR_INVALID_PARAMETER;
603 if (client->current_state != STT_STATE_CREATED) {
604 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not 'CREATED'", client->current_state);
605 return STT_ERROR_INVALID_STATE;
608 g_connect_timer = ecore_timer_add(0, __stt_connect_daemon, (void*)client);
610 SLOG(LOG_DEBUG, TAG_STTC, "=====");
611 SLOG(LOG_DEBUG, TAG_STTC, " ");
613 return STT_ERROR_NONE;
616 int stt_unprepare(stt_h stt)
618 if (0 != __stt_get_feature_enabled()) {
619 return STT_ERROR_NOT_SUPPORTED;
622 SLOG(LOG_DEBUG, TAG_STTC, "===== Unprepare STT");
624 stt_client_s* client = stt_client_get(stt);
627 if (NULL == client) {
628 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
629 return STT_ERROR_INVALID_PARAMETER;
633 if (client->current_state != STT_STATE_READY) {
634 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not 'READY'", client->current_state);
635 return STT_ERROR_INVALID_STATE;
641 ret = stt_dbus_request_finalize(client->uid);
643 if (STT_ERROR_TIMED_OUT != ret) {
644 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request finalize : %s", __stt_get_error_code(ret));
647 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
650 if (STT_RETRY_COUNT == count) {
651 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
658 client->internal_state = STT_INTERNAL_STATE_NONE;
660 client->before_state = client->current_state;
661 client->current_state = STT_STATE_CREATED;
663 if (NULL != client->state_changed_cb) {
664 stt_client_use_callback(client);
665 client->state_changed_cb(client->stt, client->before_state,
666 client->current_state, client->state_changed_user_data);
667 stt_client_not_use_callback(client);
669 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
672 if (g_connect_timer) {
673 ecore_timer_del(g_connect_timer);
674 g_connect_timer = NULL;
677 SLOG(LOG_DEBUG, TAG_STTC, "=====");
678 SLOG(LOG_DEBUG, TAG_STTC, " ");
680 return STT_ERROR_NONE;
683 bool __stt_config_supported_language_cb(const char* engine_id, const char* language, void* user_data)
685 stt_h stt = (stt_h)user_data;
687 stt_client_s* client = stt_client_get(stt);
688 if (NULL == client) {
689 SLOG(LOG_ERROR, TAG_STTC, "[WARNING] A handle is not valid");
693 /* call callback function */
694 if (NULL != client->supported_lang_cb) {
695 return client->supported_lang_cb(stt, language, client->supported_lang_user_data);
697 SLOG(LOG_WARN, TAG_STTC, "No registered callback function of supported languages");
703 int stt_foreach_supported_languages(stt_h stt, stt_supported_language_cb callback, void* user_data)
705 if (0 != __stt_get_feature_enabled()) {
706 return STT_ERROR_NOT_SUPPORTED;
709 SLOG(LOG_DEBUG, TAG_STTC, "===== Foreach Supported Language");
711 if (NULL == stt || NULL == callback) {
712 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
713 return STT_ERROR_INVALID_PARAMETER;
716 stt_client_s* client = stt_client_get(stt);
719 if (NULL == client) {
720 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
721 return STT_ERROR_INVALID_PARAMETER;
725 char* current_engine_id = NULL;
727 if (NULL == client->current_engine_id) {
728 ret = stt_config_mgr_get_engine(¤t_engine_id);
729 ret = __stt_convert_config_error_code(ret);
731 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get default engine id : %s", __stt_get_error_code(ret));
735 current_engine_id = strdup(client->current_engine_id);
736 if (NULL == current_engine_id) {
737 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to allocate memory");
738 return STT_ERROR_OUT_OF_MEMORY;
742 client->supported_lang_cb = callback;
743 client->supported_lang_user_data = user_data;
745 ret = stt_config_mgr_get_language_list(current_engine_id, __stt_config_supported_language_cb, client->stt);
746 ret = __stt_convert_config_error_code(ret);
748 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get languages : %s", __stt_get_error_code(ret));
751 if (NULL != current_engine_id) {
752 free(current_engine_id);
755 client->supported_lang_cb = NULL;
756 client->supported_lang_user_data = NULL;
758 SLOG(LOG_DEBUG, TAG_STTC, "=====");
759 SLOG(LOG_DEBUG, TAG_STTC, " ");
764 int stt_get_default_language(stt_h stt, char** language)
766 if (0 != __stt_get_feature_enabled()) {
767 return STT_ERROR_NOT_SUPPORTED;
770 SLOG(LOG_DEBUG, TAG_STTC, "===== Get Default Language");
772 if (NULL == stt || NULL == language) {
773 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
774 return STT_ERROR_INVALID_PARAMETER;
777 stt_client_s* client = stt_client_get(stt);
778 if (NULL == client) {
779 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
780 return STT_ERROR_INVALID_PARAMETER;
784 ret = stt_config_mgr_get_default_language(language);
785 ret = __stt_convert_config_error_code(ret);
787 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get default language : %s", __stt_get_error_code(ret));
789 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current language = %s", *language);
792 SLOG(LOG_DEBUG, TAG_STTC, "=====");
793 SLOG(LOG_DEBUG, TAG_STTC, " ");
798 int stt_get_state(stt_h stt, stt_state_e* state)
800 if (0 != __stt_get_feature_enabled()) {
801 return STT_ERROR_NOT_SUPPORTED;
804 if (NULL == stt || NULL == state) {
805 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
806 return STT_ERROR_INVALID_PARAMETER;
809 stt_client_s* client = stt_client_get(stt);
810 if (NULL == client) {
811 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
812 return STT_ERROR_INVALID_PARAMETER;
815 *state = client->current_state;
818 case STT_STATE_CREATED: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'CREATED'"); break;
819 case STT_STATE_READY: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'Ready'"); break;
820 case STT_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'Recording'"); break;
821 case STT_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'Processing'"); break;
822 default: SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid value"); break;
825 return STT_ERROR_NONE;
828 int stt_get_error_message(stt_h stt, char** err_msg)
830 if (0 != __stt_get_feature_enabled()) {
831 return STT_ERROR_NOT_SUPPORTED;
834 if (NULL == stt || NULL == err_msg) {
835 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
836 return STT_ERROR_INVALID_PARAMETER;
839 if (false == g_err_callback_status) {
840 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] This callback should be called during an err_callback");
841 return STT_ERROR_OPERATION_FAILED;
844 stt_client_s* client = stt_client_get(stt);
845 if (NULL == client) {
846 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get error msg : A handle is not valid");
847 return STT_ERROR_INVALID_PARAMETER;
850 if (NULL != client->err_msg) {
851 *err_msg = strdup(client->err_msg);
852 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Error msg (%s)", *err_msg);
854 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Error msg (NULL)");
857 SLOG(LOG_DEBUG, TAG_STTC, "=====");
858 SLOG(LOG_DEBUG, TAG_STTC, " ");
860 return STT_ERROR_NONE;
863 int stt_is_recognition_type_supported(stt_h stt, const char* type, bool* support)
865 if (0 != __stt_get_feature_enabled()) {
866 return STT_ERROR_NOT_SUPPORTED;
869 if (NULL == stt || NULL == type || NULL == support) {
870 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
871 return STT_ERROR_INVALID_PARAMETER;
874 stt_client_s* client = stt_client_get(stt);
875 if (NULL == client) {
876 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not valid");
877 return STT_ERROR_INVALID_PARAMETER;
881 if (client->current_state != STT_STATE_READY) {
882 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
883 return STT_ERROR_INVALID_STATE;
889 ret = stt_dbus_request_is_recognition_type_supported(client->uid, type, support);
891 if (STT_ERROR_TIMED_OUT != ret) {
892 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get recognition type supported : %s", __stt_get_error_code(ret));
895 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
898 if (STT_RETRY_COUNT == count) {
899 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
904 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] recognition type is %s", *support ? "true " : "false");
909 return STT_ERROR_NONE;
912 int stt_set_silence_detection(stt_h stt, stt_option_silence_detection_e type)
914 if (0 != __stt_get_feature_enabled()) {
915 return STT_ERROR_NOT_SUPPORTED;
919 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
920 return STT_ERROR_INVALID_PARAMETER;
923 stt_client_s* client = stt_client_get(stt);
924 if (NULL == client) {
925 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
926 return STT_ERROR_INVALID_PARAMETER;
930 if (client->current_state != STT_STATE_READY) {
931 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
932 return STT_ERROR_INVALID_STATE;
935 if (true == client->silence_supported) {
936 if (type >= STT_OPTION_SILENCE_DETECTION_FALSE && type <= STT_OPTION_SILENCE_DETECTION_AUTO) {
937 client->silence = type;
939 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Type is invalid");
940 return STT_ERROR_INVALID_PARAMETER;
943 return STT_ERROR_NOT_SUPPORTED_FEATURE;
946 return STT_ERROR_NONE;
949 int stt_set_start_sound(stt_h stt, const char* filename)
951 if (0 != __stt_get_feature_enabled()) {
952 return STT_ERROR_NOT_SUPPORTED;
955 SLOG(LOG_DEBUG, TAG_STTC, "===== STT SET START SOUND");
957 if (NULL == stt || NULL == filename) {
958 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
959 return STT_ERROR_INVALID_PARAMETER;
962 if (0 != access(filename, F_OK)) {
963 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] File does not exist");
964 return STT_ERROR_INVALID_PARAMETER;
967 stt_client_s* client = stt_client_get(stt);
968 if (NULL == client) {
969 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
970 return STT_ERROR_INVALID_PARAMETER;
974 if (client->current_state != STT_STATE_READY) {
975 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
976 return STT_ERROR_INVALID_STATE;
982 ret = stt_dbus_request_set_start_sound(client->uid, filename);
984 if (STT_ERROR_TIMED_OUT != ret) {
985 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set start sound : %s", __stt_get_error_code(ret));
988 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
991 if (STT_RETRY_COUNT == count) {
992 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
997 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Set start sound : %s", filename);
1002 return STT_ERROR_NONE;
1005 int stt_unset_start_sound(stt_h stt)
1007 if (0 != __stt_get_feature_enabled()) {
1008 return STT_ERROR_NOT_SUPPORTED;
1011 SLOG(LOG_DEBUG, TAG_STTC, "===== STT UNSET START SOUND");
1014 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1015 return STT_ERROR_INVALID_PARAMETER;
1018 stt_client_s* client = stt_client_get(stt);
1020 if (NULL == client) {
1021 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
1022 return STT_ERROR_INVALID_PARAMETER;
1026 if (client->current_state != STT_STATE_READY) {
1027 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
1028 return STT_ERROR_INVALID_STATE;
1034 ret = stt_dbus_request_unset_start_sound(client->uid);
1036 if (STT_ERROR_TIMED_OUT != ret) {
1037 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to unset start sound : %s", __stt_get_error_code(ret));
1040 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1043 if (STT_RETRY_COUNT == count) {
1044 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1049 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Unset start sound");
1054 return STT_ERROR_NONE;
1057 int stt_set_stop_sound(stt_h stt, const char* filename)
1059 if (0 != __stt_get_feature_enabled()) {
1060 return STT_ERROR_NOT_SUPPORTED;
1063 SLOG(LOG_DEBUG, TAG_STTC, "===== STT SET STOP SOUND");
1065 if (NULL == stt || NULL == filename) {
1066 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1067 return STT_ERROR_INVALID_PARAMETER;
1070 if (0 != access(filename, F_OK)) {
1071 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] File does not exist");
1072 return STT_ERROR_INVALID_PARAMETER;
1075 stt_client_s* client = stt_client_get(stt);
1077 if (NULL == client) {
1078 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
1079 return STT_ERROR_INVALID_PARAMETER;
1083 if (client->current_state != STT_STATE_READY) {
1084 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
1085 return STT_ERROR_INVALID_STATE;
1091 ret = stt_dbus_request_set_stop_sound(client->uid, filename);
1093 if (STT_ERROR_TIMED_OUT != ret) {
1094 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set stop sound : %s", __stt_get_error_code(ret));
1097 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1100 if (STT_RETRY_COUNT == count) {
1101 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1106 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Set stop sound : %s", filename);
1111 return STT_ERROR_NONE;
1114 int stt_unset_stop_sound(stt_h stt)
1116 if (0 != __stt_get_feature_enabled()) {
1117 return STT_ERROR_NOT_SUPPORTED;
1120 SLOG(LOG_DEBUG, TAG_STTC, "===== STT UNSET STOP SOUND");
1123 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1124 return STT_ERROR_INVALID_PARAMETER;
1127 stt_client_s* client = stt_client_get(stt);
1129 if (NULL == client) {
1130 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
1131 return STT_ERROR_INVALID_PARAMETER;
1135 if (client->current_state != STT_STATE_READY) {
1136 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
1137 return STT_ERROR_INVALID_STATE;
1143 ret = stt_dbus_request_unset_stop_sound(client->uid);
1145 if (STT_ERROR_TIMED_OUT != ret) {
1146 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to unset stop sound : %s", __stt_get_error_code(ret));
1149 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1152 if (STT_RETRY_COUNT == count) {
1153 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1158 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Unset stop sound");
1163 return STT_ERROR_NONE;
1166 int stt_start(stt_h stt, const char* language, const char* type)
1168 if (0 != __stt_get_feature_enabled()) {
1169 return STT_ERROR_NOT_SUPPORTED;
1172 SLOG(LOG_DEBUG, TAG_STTC, "===== STT START");
1175 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1176 return STT_ERROR_INVALID_PARAMETER;
1179 stt_client_s* client = stt_client_get(stt);
1180 if (NULL == client) {
1181 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1182 return STT_ERROR_INVALID_PARAMETER;
1186 if (client->current_state != STT_STATE_READY) {
1187 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state(%d) is not READY", client->current_state);
1188 return STT_ERROR_INVALID_STATE;
1191 if (STT_INTERNAL_STATE_NONE != client->internal_state) {
1192 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is NOT none : %d", client->internal_state);
1193 return STT_ERROR_INVALID_STATE;
1197 char appid[128] = {0, };
1198 ret = aul_app_get_appid_bypid(getpid(), appid, sizeof(appid));
1200 if ((AUL_R_OK != ret) || (0 == strlen(appid))) {
1201 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get application ID");
1203 SLOG(LOG_DEBUG, TAG_STTC, "[DEBUG] Current app id is %s", appid);
1207 if (NULL == language) {
1208 temp = strdup("default");
1210 temp = strdup(language);
1218 ret = stt_dbus_request_start(client->uid, temp, type, client->silence, appid);
1221 if (STT_ERROR_TIMED_OUT != ret) {
1222 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to start : %s", __stt_get_error_code(ret));
1223 if (NULL != temp) free(temp);
1226 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry to start");
1229 if (STT_RETRY_COUNT == count) {
1230 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1231 if (NULL != temp) free(temp);
1237 if (NULL != temp) free(temp);
1239 if (STT_RESULT_STATE_DONE == ret) {
1240 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Start is done : %d", ret);
1241 client->before_state = client->current_state;
1242 client->current_state = STT_STATE_RECORDING;
1244 if (NULL != client->state_changed_cb) {
1245 ecore_main_loop_thread_safe_call_async(__stt_notify_state_changed, client);
1247 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
1249 } else if (STT_RESULT_STATE_NOT_DONE == ret) {
1250 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Start is not done : %d", ret);
1251 client->internal_state = STT_INTERNAL_STATE_STARTING;
1253 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid result : %d", ret);
1256 ret = STT_ERROR_NONE;
1261 if (true == client->credential_needed && NULL == client->credential) {
1262 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Do not have app credential for this engine(%s)", client->current_engine_id);
1263 return STT_ERROR_PERMISSION_DENIED;
1266 ret = stt_dbus_request_start(client->uid, temp, type, client->silence, appid, client->credential);
1268 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to start : %s", __stt_get_error_code(ret));
1270 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Start is successful but not done");
1271 client->internal_state = STT_INTERNAL_STATE_STARTING;
1274 if (NULL != temp) free(temp);
1276 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1277 SLOG(LOG_DEBUG, TAG_STTC, " ");
1282 int stt_stop(stt_h stt)
1284 if (0 != __stt_get_feature_enabled()) {
1285 return STT_ERROR_NOT_SUPPORTED;
1288 SLOG(LOG_DEBUG, TAG_STTC, "===== STT STOP");
1291 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1292 return STT_ERROR_INVALID_PARAMETER;
1295 stt_client_s* client = stt_client_get(stt);
1296 if (NULL == client) {
1297 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1298 return STT_ERROR_INVALID_PARAMETER;
1302 if (client->current_state != STT_STATE_RECORDING) {
1303 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Current state(%d) is NOT RECORDING", client->current_state);
1304 return STT_ERROR_INVALID_STATE;
1307 if (STT_INTERNAL_STATE_NONE != client->internal_state) {
1308 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is NOT none : %d", client->internal_state);
1309 return STT_ERROR_INVALID_STATE;
1316 ret = stt_dbus_request_stop(client->uid);
1319 if (STT_ERROR_TIMED_OUT != ret) {
1320 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to stop : %s", __stt_get_error_code(ret));
1323 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry stop");
1326 if (STT_RETRY_COUNT == count) {
1327 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1332 if (STT_RESULT_STATE_DONE == ret) {
1333 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Stop is done : %d", ret);
1334 client->before_state = client->current_state;
1335 client->current_state = STT_STATE_PROCESSING;
1337 if (NULL != client->state_changed_cb) {
1338 ecore_main_loop_thread_safe_call_async(__stt_notify_state_changed, client);
1339 SLOG(LOG_DEBUG, TAG_STTC, "State changed callback is called");
1341 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
1343 } else if (STT_RESULT_STATE_NOT_DONE == ret) {
1344 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Stop is not done : %d", ret);
1345 client->internal_state = STT_INTERNAL_STATE_STOPING;
1347 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid result : %d", ret);
1349 ret = STT_ERROR_NONE;
1354 int ret = stt_dbus_request_stop(client->uid);
1357 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to stop : %s", __stt_get_error_code(ret));
1359 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Stop is successful but not done");
1360 client->internal_state = STT_INTERNAL_STATE_STOPING;
1363 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1364 SLOG(LOG_DEBUG, TAG_STTC, " ");
1370 int stt_cancel(stt_h stt)
1372 if (0 != __stt_get_feature_enabled()) {
1373 return STT_ERROR_NOT_SUPPORTED;
1376 SLOG(LOG_DEBUG, TAG_STTC, "===== STT CANCEL");
1379 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input handle is null");
1380 return STT_ERROR_INVALID_PARAMETER;
1383 stt_client_s* client = stt_client_get(stt);
1386 if (NULL == client) {
1387 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1388 return STT_ERROR_INVALID_PARAMETER;
1392 if (STT_STATE_RECORDING != client->current_state && STT_STATE_PROCESSING != client->current_state) {
1393 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid state : Current state(%d) is 'Ready'", client->current_state);
1394 return STT_ERROR_INVALID_STATE;
1397 if (STT_INTERNAL_STATE_NONE != client->internal_state) {
1398 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is NOT none : %d", client->internal_state);
1399 return STT_ERROR_INVALID_STATE;
1406 ret = stt_dbus_request_cancel(client->uid);
1409 if (STT_ERROR_TIMED_OUT != ret) {
1410 SLOG(LOG_DEBUG, TAG_STTC, "[ERROR] Fail to cancel : %s", __stt_get_error_code(ret));
1413 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1416 if (STT_RETRY_COUNT == count) {
1417 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1422 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS]");
1424 client->before_state = client->current_state;
1425 client->current_state = STT_STATE_READY;
1427 if (NULL != client->state_changed_cb) {
1428 ecore_main_loop_thread_safe_call_async(__stt_notify_state_changed, client);
1429 SLOG(LOG_DEBUG, TAG_STTC, "State changed callback is called");
1431 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
1433 ret = STT_ERROR_NONE;
1438 int ret = stt_dbus_request_cancel(client->uid);
1440 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to cancel : %s", __stt_get_error_code(ret));
1442 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Cancel is successful but not done");
1443 client->internal_state = STT_INTERNAL_STATE_CANCELING;
1446 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1447 SLOG(LOG_DEBUG, TAG_STTC, " ");
1452 int __stt_cb_set_volume(int uid, float volume)
1454 stt_client_s* client = NULL;
1456 client = stt_client_get_by_uid(uid);
1457 if (NULL == client) {
1458 SLOG(LOG_ERROR, TAG_STTC, "Handle is NOT valid");
1459 return STT_ERROR_INVALID_PARAMETER;
1462 if (STT_STATE_RECORDING != client->current_state) {
1463 SLOG(LOG_DEBUG, TAG_STTC, "[ERROR] Invalid state : NO 'Recording' state, cur(%d)", client->current_state);
1464 return STT_ERROR_INVALID_STATE;
1467 g_volume_db = volume;
1468 SLOG(LOG_DEBUG, TAG_STTC, "Set volume (%f)", g_volume_db);
1473 int stt_get_recording_volume(stt_h stt, float* volume)
1475 if (0 != __stt_get_feature_enabled()) {
1476 return STT_ERROR_NOT_SUPPORTED;
1479 if (NULL == stt || NULL == volume) {
1480 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1481 return STT_ERROR_INVALID_PARAMETER;
1484 stt_client_s* client = stt_client_get(stt);
1487 if (NULL == client) {
1488 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1489 return STT_ERROR_INVALID_PARAMETER;
1492 if (STT_STATE_RECORDING != client->current_state) {
1493 SLOG(LOG_DEBUG, TAG_STTC, "[ERROR] Invalid state : NO 'Recording' state, cur(%d)", client->current_state);
1494 return STT_ERROR_INVALID_STATE;
1497 *volume = g_volume_db;
1499 return STT_ERROR_NONE;
1502 bool __stt_result_time_cb(int index, int event, const char* text, long start_time, long end_time, void* user_data)
1504 stt_client_s* client = (stt_client_s*)user_data;
1507 if (NULL == client) {
1508 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
1512 if (NULL != client->result_time_cb) {
1513 SLOG(LOG_DEBUG, TAG_STTC, "(%d) event(%d) text(%s) start(%ld) end(%ld)",
1514 index, event, text, start_time, end_time);
1515 client->result_time_cb(client->stt, index, (stt_result_time_event_e)event,
1516 text, start_time, end_time, client->result_time_user_data);
1518 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Callback is NULL");
1525 int stt_foreach_detailed_result(stt_h stt, stt_result_time_cb callback, void* user_data)
1527 if (0 != __stt_get_feature_enabled()) {
1528 return STT_ERROR_NOT_SUPPORTED;
1531 SLOG(LOG_DEBUG, TAG_STTC, "===== STT FOREACH DETAILED RESULT");
1533 if (NULL == callback) {
1534 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1535 return STT_ERROR_INVALID_PARAMETER;
1538 stt_client_s* client = stt_client_get(stt);
1541 if (NULL == client) {
1542 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail : A handle is not valid");
1543 return STT_ERROR_INVALID_PARAMETER;
1546 client->result_time_cb = callback;
1547 client->result_time_user_data = user_data;
1550 ret = stt_config_mgr_foreach_time_info(__stt_result_time_cb, client);
1551 ret = __stt_convert_config_error_code(ret);
1553 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to foreach time info : %s", __stt_get_error_code(ret));
1556 client->result_time_cb = NULL;
1557 client->result_time_user_data = NULL;
1559 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1560 SLOG(LOG_DEBUG, TAG_STTC, " ");
1565 static Eina_Bool __stt_notify_error(void *data)
1567 stt_client_s* client = (stt_client_s*)data;
1569 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Error from sttd");
1572 if (NULL == client) {
1573 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
1577 if (NULL == stt_client_get_by_uid(client->uid))
1580 if (NULL != client->error_cb) {
1581 stt_client_use_callback(client);
1582 g_err_callback_status = true;
1583 client->error_cb(client->stt, client->reason, client->error_user_data);
1584 g_err_callback_status = false;
1585 stt_client_not_use_callback(client);
1586 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Error callback is called : reason [%d]", client->reason);
1588 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Error callback is null");
1594 int __stt_cb_error(int uid, int reason, char* err_msg)
1596 stt_client_s* client = stt_client_get_by_uid(uid);
1597 if (NULL == client) {
1598 SLOG(LOG_ERROR, TAG_STTC, "Handle not found");
1602 client->reason = reason;
1603 client->internal_state = STT_INTERNAL_STATE_NONE;
1604 if (NULL != client->err_msg) {
1605 free(client->err_msg);
1606 client->err_msg = NULL;
1608 client->err_msg = strdup(err_msg);
1610 SLOG(LOG_INFO, TAG_STTC, "internal state is initialized to 0");
1612 if (NULL != client->error_cb) {
1613 ecore_timer_add(0, __stt_notify_error, client);
1615 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Error callback is null");
1621 static void __stt_notify_state_changed(void *data)
1623 stt_client_s* client = (stt_client_s*)data;
1626 if (NULL == client) {
1627 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
1631 if (NULL == stt_client_get_by_uid(client->uid)) {
1635 if (STT_INTERNAL_STATE_STARTING == client->internal_state && STT_STATE_RECORDING == client->current_state) {
1636 client->internal_state = STT_INTERNAL_STATE_NONE;
1637 SLOG(LOG_DEBUG, TAG_STTC, "Internal state change to NONE");
1638 } else if (STT_INTERNAL_STATE_STOPING == client->internal_state && STT_STATE_PROCESSING == client->current_state) {
1639 client->internal_state = STT_INTERNAL_STATE_NONE;
1640 SLOG(LOG_DEBUG, TAG_STTC, "Internal state change to NONE");
1641 } else if (STT_INTERNAL_STATE_CANCELING == client->internal_state && STT_STATE_READY == client->current_state) {
1642 client->internal_state = STT_INTERNAL_STATE_NONE;
1643 SLOG(LOG_DEBUG, TAG_STTC, "Internal state change to NONE");
1646 if (NULL != client->state_changed_cb) {
1647 stt_client_use_callback(client);
1648 client->state_changed_cb(client->stt, client->before_state,
1649 client->current_state, client->state_changed_user_data);
1650 stt_client_not_use_callback(client);
1651 SLOG(LOG_DEBUG, TAG_STTC, "State changed callback is called");
1653 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
1659 static Eina_Bool __stt_notify_result(void *data)
1661 stt_client_s* client = (stt_client_s*)data;
1664 if (NULL == client) {
1665 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
1669 if (NULL == stt_client_get_by_uid(client->uid)) {
1673 if (NULL != client->recognition_result_cb) {
1674 stt_client_use_callback(client);
1675 client->recognition_result_cb(client->stt, client->event, (const char**)client->data_list, client->data_count,
1676 client->msg, client->recognition_result_user_data);
1677 stt_client_not_use_callback(client);
1678 SLOG(LOG_DEBUG, TAG_STTC, "client recognition result callback called");
1680 SLOG(LOG_WARN, TAG_STTC, "[WARNING] User recognition result callback is NULL");
1683 if (NULL != client->msg) {
1688 if (NULL != client->data_list) {
1690 temp = client->data_list;
1693 for (i = 0; i < client->data_count; i++) {
1694 if (NULL != temp[i]) {
1698 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result data is error");
1701 free(client->data_list);
1702 client->data_list = NULL;
1705 client->data_count = 0;
1707 stt_config_mgr_remove_time_info_file();
1709 if (STT_RESULT_EVENT_FINAL_RESULT == client->event || STT_RESULT_EVENT_ERROR == client->event) {
1710 client->before_state = client->current_state;
1711 client->current_state = STT_STATE_READY;
1713 if (NULL != client->state_changed_cb) {
1714 ecore_main_loop_thread_safe_call_async(__stt_notify_state_changed, client);
1716 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
1723 int __stt_cb_result(int uid, int event, char** data, int data_count, const char* msg)
1725 stt_client_s* client = NULL;
1727 client = stt_client_get_by_uid(uid);
1728 if (NULL == client) {
1729 SLOG(LOG_ERROR, TAG_STTC, "Handle is NOT valid");
1730 return STT_ERROR_INVALID_PARAMETER;
1734 SLOG(LOG_DEBUG, TAG_STTC, "Recognition Result Message = %s", msg);
1737 for (i = 0; i < data_count; i++) {
1738 if (NULL != data[i])
1739 SLOG(LOG_DEBUG, TAG_STTC, "Recognition Result[%d] = %s", i, data[i]);
1742 if (NULL != client->recognition_result_cb) {
1743 client->event = event;
1745 client->msg = strdup(msg);
1748 client->data_count = data_count;
1750 if (data_count > 0) {
1752 temp = (char**)calloc(data_count, sizeof(char*));
1754 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to allocate memory");
1755 return STT_ERROR_OUT_OF_MEMORY;
1758 for (i = 0; i < data_count; i++) {
1759 if (NULL != data[i])
1760 temp[i] = strdup(data[i]);
1762 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result data is error");
1765 client->data_list = temp;
1768 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] User result callback is null");
1771 ecore_timer_add(0, __stt_notify_result, client);
1773 return STT_ERROR_NONE;
1776 int __stt_cb_set_state(int uid, int state)
1778 stt_client_s* client = stt_client_get_by_uid(uid);
1779 if (NULL == client) {
1780 SLOG(LOG_ERROR, TAG_STTC, "Handle not found");
1784 stt_state_e state_from_daemon = (stt_state_e)state;
1786 if (client->current_state == state_from_daemon) {
1787 SLOG(LOG_DEBUG, TAG_STTC, "Current state has already been %d", client->current_state);
1791 client->before_state = client->current_state;
1792 client->current_state = state_from_daemon;
1794 ecore_main_loop_thread_safe_call_async(__stt_notify_state_changed, client);
1798 int stt_set_recognition_result_cb(stt_h stt, stt_recognition_result_cb callback, void* user_data)
1800 if (0 != __stt_get_feature_enabled()) {
1801 return STT_ERROR_NOT_SUPPORTED;
1804 if (stt == NULL || callback == NULL)
1805 return STT_ERROR_INVALID_PARAMETER;
1807 stt_client_s* client = stt_client_get(stt);
1810 if (NULL == client) {
1811 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1812 return STT_ERROR_INVALID_PARAMETER;
1815 if (STT_STATE_CREATED != client->current_state) {
1816 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
1817 return STT_ERROR_INVALID_STATE;
1820 client->recognition_result_cb = callback;
1821 client->recognition_result_user_data = user_data;
1826 int stt_unset_recognition_result_cb(stt_h stt)
1828 if (0 != __stt_get_feature_enabled()) {
1829 return STT_ERROR_NOT_SUPPORTED;
1833 return STT_ERROR_INVALID_PARAMETER;
1835 stt_client_s* client = stt_client_get(stt);
1838 if (NULL == client) {
1839 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1840 return STT_ERROR_INVALID_PARAMETER;
1843 if (STT_STATE_CREATED != client->current_state) {
1844 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
1845 return STT_ERROR_INVALID_STATE;
1848 client->recognition_result_cb = NULL;
1849 client->recognition_result_user_data = NULL;
1854 int stt_set_state_changed_cb(stt_h stt, stt_state_changed_cb callback, void* user_data)
1856 if (0 != __stt_get_feature_enabled()) {
1857 return STT_ERROR_NOT_SUPPORTED;
1860 if (NULL == stt || NULL == callback)
1861 return STT_ERROR_INVALID_PARAMETER;
1863 stt_client_s* client = stt_client_get(stt);
1866 if (NULL == client) {
1867 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1868 return STT_ERROR_INVALID_PARAMETER;
1871 if (STT_STATE_CREATED != client->current_state) {
1872 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
1873 return STT_ERROR_INVALID_STATE;
1876 client->state_changed_cb = callback;
1877 client->state_changed_user_data = user_data;
1882 int stt_unset_state_changed_cb(stt_h stt)
1884 if (0 != __stt_get_feature_enabled()) {
1885 return STT_ERROR_NOT_SUPPORTED;
1889 return STT_ERROR_INVALID_PARAMETER;
1891 stt_client_s* client = stt_client_get(stt);
1894 if (NULL == client) {
1895 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1896 return STT_ERROR_INVALID_PARAMETER;
1899 if (STT_STATE_CREATED != client->current_state) {
1900 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
1901 return STT_ERROR_INVALID_STATE;
1904 client->state_changed_cb = NULL;
1905 client->state_changed_user_data = NULL;
1910 int stt_set_error_cb(stt_h stt, stt_error_cb callback, void* user_data)
1912 if (0 != __stt_get_feature_enabled()) {
1913 return STT_ERROR_NOT_SUPPORTED;
1916 if (NULL == stt || NULL == callback)
1917 return STT_ERROR_INVALID_PARAMETER;
1919 stt_client_s* client = stt_client_get(stt);
1922 if (NULL == client) {
1923 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1924 return STT_ERROR_INVALID_PARAMETER;
1927 if (STT_STATE_CREATED != client->current_state) {
1928 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
1929 return STT_ERROR_INVALID_STATE;
1932 client->error_cb = callback;
1933 client->error_user_data = user_data;
1938 int stt_unset_error_cb(stt_h stt)
1940 if (0 != __stt_get_feature_enabled()) {
1941 return STT_ERROR_NOT_SUPPORTED;
1945 return STT_ERROR_INVALID_PARAMETER;
1947 stt_client_s* client = stt_client_get(stt);
1950 if (NULL == client) {
1951 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1952 return STT_ERROR_INVALID_PARAMETER;
1955 if (STT_STATE_CREATED != client->current_state) {
1956 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
1957 return STT_ERROR_INVALID_STATE;
1960 client->error_cb = NULL;
1961 client->error_user_data = NULL;
1966 int stt_set_default_language_changed_cb(stt_h stt, stt_default_language_changed_cb callback, void* user_data)
1968 if (0 != __stt_get_feature_enabled()) {
1969 return STT_ERROR_NOT_SUPPORTED;
1972 if (NULL == stt || NULL == callback)
1973 return STT_ERROR_INVALID_PARAMETER;
1975 stt_client_s* client = stt_client_get(stt);
1978 if (NULL == client) {
1979 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1980 return STT_ERROR_INVALID_PARAMETER;
1983 if (STT_STATE_CREATED != client->current_state) {
1984 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
1985 return STT_ERROR_INVALID_STATE;
1988 client->default_lang_changed_cb = callback;
1989 client->default_lang_changed_user_data = user_data;
1994 int stt_unset_default_language_changed_cb(stt_h stt)
1996 if (0 != __stt_get_feature_enabled()) {
1997 return STT_ERROR_NOT_SUPPORTED;
2001 return STT_ERROR_INVALID_PARAMETER;
2003 stt_client_s* client = stt_client_get(stt);
2006 if (NULL == client) {
2007 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
2008 return STT_ERROR_INVALID_PARAMETER;
2011 if (STT_STATE_CREATED != client->current_state) {
2012 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2013 return STT_ERROR_INVALID_STATE;
2016 client->default_lang_changed_cb = NULL;
2017 client->default_lang_changed_user_data = NULL;
2022 int stt_set_engine_changed_cb(stt_h stt, stt_engine_changed_cb callback, void* user_data)
2024 if (0 != __stt_get_feature_enabled()) {
2025 return STT_ERROR_NOT_SUPPORTED;
2028 if (NULL == stt || NULL == callback)
2029 return STT_ERROR_INVALID_PARAMETER;
2031 stt_client_s* client = stt_client_get(stt);
2034 if (NULL == client) {
2035 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
2036 return STT_ERROR_INVALID_PARAMETER;
2039 if (STT_STATE_CREATED != client->current_state) {
2040 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2041 return STT_ERROR_INVALID_STATE;
2044 client->engine_changed_cb = callback;
2045 client->engine_changed_user_data = user_data;
2050 int stt_unset_engine_changed_cb(stt_h stt)
2052 if (0 != __stt_get_feature_enabled()) {
2053 return STT_ERROR_NOT_SUPPORTED;
2057 return STT_ERROR_INVALID_PARAMETER;
2059 stt_client_s* client = stt_client_get(stt);
2062 if (NULL == client) {
2063 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
2064 return STT_ERROR_INVALID_PARAMETER;
2067 if (STT_STATE_CREATED != client->current_state) {
2068 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state(%d) is not 'Created'", client->current_state);
2069 return STT_ERROR_INVALID_STATE;
2072 client->engine_changed_cb = NULL;
2073 client->engine_changed_user_data = NULL;