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 Ecore_Timer* g_connect_timer = NULL;
34 static void __stt_notify_state_changed(void *data);
35 static Eina_Bool __stt_notify_error(void *data);
37 static int g_count_check_daemon = 0;
44 static const char* __stt_get_error_code(stt_error_e err)
47 case STT_ERROR_NONE: return "STT_ERROR_NONE";
48 case STT_ERROR_OUT_OF_MEMORY: return "STT_ERROR_OUT_OF_MEMORY";
49 case STT_ERROR_IO_ERROR: return "STT_ERROR_IO_ERROR";
50 case STT_ERROR_INVALID_PARAMETER: return "STT_ERROR_INVALID_PARAMETER";
51 case STT_ERROR_TIMED_OUT: return "STT_ERROR_TIMED_OUT";
52 case STT_ERROR_RECORDER_BUSY: return "STT_ERROR_RECORDER_BUSY";
53 case STT_ERROR_OUT_OF_NETWORK: return "STT_ERROR_OUT_OF_NETWORK";
54 case STT_ERROR_PERMISSION_DENIED: return "STT_ERROR_PERMISSION_DENIED";
55 case STT_ERROR_NOT_SUPPORTED: return "STT_ERROR_NOT_SUPPORTED";
56 case STT_ERROR_INVALID_STATE: return "STT_ERROR_INVALID_STATE";
57 case STT_ERROR_INVALID_LANGUAGE: return "STT_ERROR_INVALID_LANGUAGE";
58 case STT_ERROR_ENGINE_NOT_FOUND: return "STT_ERROR_ENGINE_NOT_FOUND";
59 case STT_ERROR_OPERATION_FAILED: return "STT_ERROR_OPERATION_FAILED";
60 case STT_ERROR_NOT_SUPPORTED_FEATURE: return "STT_ERROR_NOT_SUPPORTED_FEATURE";
62 return "Invalid error code";
66 static int __stt_convert_config_error_code(stt_config_error_e code)
68 if (code == STT_CONFIG_ERROR_NONE) return STT_ERROR_NONE;
69 if (code == STT_CONFIG_ERROR_OUT_OF_MEMORY) return STT_ERROR_OUT_OF_MEMORY;
70 if (code == STT_CONFIG_ERROR_IO_ERROR) return STT_ERROR_IO_ERROR;
71 if (code == STT_CONFIG_ERROR_INVALID_PARAMETER) return STT_ERROR_INVALID_PARAMETER;
72 if (code == STT_CONFIG_ERROR_PERMISSION_DENIED) return STT_ERROR_PERMISSION_DENIED;
73 if (code == STT_CONFIG_ERROR_NOT_SUPPORTED) return STT_ERROR_NOT_SUPPORTED;
74 if (code == STT_CONFIG_ERROR_INVALID_STATE) return STT_ERROR_INVALID_STATE;
75 if (code == STT_CONFIG_ERROR_INVALID_LANGUAGE) return STT_ERROR_INVALID_LANGUAGE;
76 if (code == STT_CONFIG_ERROR_ENGINE_NOT_FOUND) return STT_ERROR_ENGINE_NOT_FOUND;
77 if (code == STT_CONFIG_ERROR_OPERATION_FAILED) return STT_ERROR_OPERATION_FAILED;
82 void __stt_config_lang_changed_cb(const char* before_language, const char* current_language, void* user_data)
84 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "Language changed : Before lang(%s) Current lang(%s)",
85 before_language, current_language);
87 if (0 == strcmp(before_language, current_language)) {
91 GList* client_list = NULL;
92 client_list = stt_client_get_client_list();
95 stt_client_s *data = NULL;
97 if (g_list_length(client_list) > 0) {
98 /* Get a first item */
99 iter = g_list_first(client_list);
101 while (NULL != iter) {
103 if (NULL != data->default_lang_changed_cb) {
104 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "Call default language changed callback : uid(%d)", data->uid);
105 data->default_lang_changed_cb(data->stt, before_language, current_language,
106 data->default_lang_changed_user_data);
110 iter = g_list_next(iter);
117 int stt_create(stt_h* stt)
119 bool stt_supported = false;
120 bool mic_supported = false;
121 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
122 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
123 if (false == stt_supported || false == mic_supported) {
124 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
125 return STT_ERROR_NOT_SUPPORTED;
130 SLOG(LOG_DEBUG, TAG_STTC, "===== Create STT");
133 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is null");
134 return STT_ERROR_INVALID_PARAMETER;
137 if (0 == stt_client_get_size()) {
138 if (0 != stt_dbus_open_connection()) {
139 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to open connection");
140 return STT_ERROR_OPERATION_FAILED;
144 if (0 != stt_client_new(stt)) {
145 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to create client!");
146 return STT_ERROR_OUT_OF_MEMORY;
149 stt_client_s* client = stt_client_get(*stt);
150 if (NULL == client) {
151 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to create client");
152 stt_client_destroy(*stt);
153 return STT_ERROR_OPERATION_FAILED;
156 int ret = stt_config_mgr_initialize(client->uid);
157 ret = __stt_convert_config_error_code(ret);
159 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to init config manager : %s", __stt_get_error_code(ret));
160 stt_client_destroy(*stt);
164 ret = stt_config_mgr_set_callback(client->uid, NULL, __stt_config_lang_changed_cb, NULL, NULL);
165 ret = __stt_convert_config_error_code(ret);
167 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set config changed : %s", __stt_get_error_code(ret));
168 stt_client_destroy(*stt);
172 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "[Success] uid(%d)", (*stt)->handle);
174 SLOG(LOG_DEBUG, TAG_STTC, "=====");
175 SLOG(LOG_DEBUG, TAG_STTC, " ");
177 return STT_ERROR_NONE;
180 int stt_destroy(stt_h stt)
182 bool stt_supported = false;
183 bool mic_supported = false;
184 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
185 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
186 if (false == stt_supported || false == mic_supported) {
187 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
188 return STT_ERROR_NOT_SUPPORTED;
193 SLOG(LOG_DEBUG, TAG_STTC, "===== Destroy STT");
196 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input handle is null");
197 SLOG(LOG_DEBUG, TAG_STTC, "=====");
198 SLOG(LOG_DEBUG, TAG_STTC, " ");
199 return STT_ERROR_INVALID_PARAMETER;
202 stt_client_s* client = stt_client_get(stt);
205 if (NULL == client) {
206 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
207 return STT_ERROR_INVALID_PARAMETER;
210 /* check used callback */
211 if (0 != stt_client_get_use_callback(client)) {
212 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Cannot destroy in Callback function");
213 return STT_ERROR_OPERATION_FAILED;
216 stt_config_mgr_finalize(client->uid);
221 switch (client->current_state) {
222 case STT_STATE_PROCESSING:
223 case STT_STATE_RECORDING:
224 case STT_STATE_READY:
225 ret = stt_dbus_request_finalize(client->uid);
227 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request finalize : %s", __stt_get_error_code(ret));
229 case STT_STATE_CREATED:
230 if (NULL != g_connect_timer) {
231 SLOG(LOG_DEBUG, TAG_STTC, "Connect Timer is deleted");
232 ecore_timer_del(g_connect_timer);
233 g_connect_timer = NULL;
237 stt_client_destroy(stt);
243 if (0 == stt_client_get_size()) {
244 if (0 != stt_dbus_close_connection()) {
245 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to close connection");
251 SLOG(LOG_DEBUG, TAG_STTC, "=====");
252 SLOG(LOG_DEBUG, TAG_STTC, " ");
254 return STT_ERROR_NONE;
257 bool __stt_config_supported_engine_cb(const char* engine_id, const char* engine_name,
258 const char* setting, bool support_silence, void* user_data)
260 stt_h stt = (stt_h)user_data;
262 stt_client_s* client = stt_client_get(stt);
263 if (NULL == client) {
264 SLOG(LOG_ERROR, TAG_STTC, "[WARNING] A handle is not valid");
268 /* call callback function */
269 if (NULL != client->supported_engine_cb) {
270 return client->supported_engine_cb(stt, engine_id, engine_name, client->supported_engine_user_data);
272 SLOG(LOG_WARN, TAG_STTC, "No registered callback function of supported engine");
278 int stt_foreach_supported_engines(stt_h stt, stt_supported_engine_cb callback, void* user_data)
280 bool stt_supported = false;
281 bool mic_supported = false;
282 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
283 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
284 if (false == stt_supported || false == mic_supported) {
285 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
286 return STT_ERROR_NOT_SUPPORTED;
291 SLOG(LOG_DEBUG, TAG_STTC, "===== Foreach Supported engine");
293 if (NULL == stt || NULL == callback) {
294 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
295 SLOG(LOG_DEBUG, TAG_STTC, "=====");
296 SLOG(LOG_DEBUG, TAG_STTC, " ");
297 return STT_ERROR_INVALID_PARAMETER;
300 stt_client_s* client = stt_client_get(stt);
303 if (NULL == client) {
304 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
305 SLOG(LOG_DEBUG, TAG_STTC, "=====");
306 SLOG(LOG_DEBUG, TAG_STTC, " ");
307 return STT_ERROR_INVALID_PARAMETER;
310 if (client->current_state != STT_STATE_CREATED) {
311 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not CREATE");
312 SLOG(LOG_DEBUG, TAG_STTC, "=====");
313 SLOG(LOG_DEBUG, TAG_STTC, " ");
314 return STT_ERROR_INVALID_STATE;
317 client->supported_engine_cb = callback;
318 client->supported_engine_user_data = user_data;
321 ret = stt_config_mgr_get_engine_list(__stt_config_supported_engine_cb, client->stt);
322 ret = __stt_convert_config_error_code(ret);
324 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get engines : %s", __stt_get_error_code(ret));
327 client->supported_engine_cb = NULL;
328 client->supported_engine_user_data = NULL;
330 SLOG(LOG_DEBUG, TAG_STTC, "=====");
331 SLOG(LOG_DEBUG, TAG_STTC, " ");
336 int stt_get_engine(stt_h stt, char** engine_id)
338 bool stt_supported = false;
339 bool mic_supported = false;
340 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
341 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
342 if (false == stt_supported || false == mic_supported) {
343 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
344 return STT_ERROR_NOT_SUPPORTED;
349 SLOG(LOG_DEBUG, TAG_STTC, "===== Get current engine");
351 if (NULL == stt || NULL == engine_id) {
352 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
353 SLOG(LOG_DEBUG, TAG_STTC, "=====");
354 SLOG(LOG_DEBUG, TAG_STTC, " ");
355 return STT_ERROR_INVALID_PARAMETER;
358 stt_client_s* client = stt_client_get(stt);
361 if (NULL == client) {
362 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
363 SLOG(LOG_DEBUG, TAG_STTC, "=====");
364 SLOG(LOG_DEBUG, TAG_STTC, " ");
365 return STT_ERROR_INVALID_PARAMETER;
368 if (client->current_state != STT_STATE_CREATED) {
369 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not CREATE");
370 SLOG(LOG_DEBUG, TAG_STTC, "=====");
371 SLOG(LOG_DEBUG, TAG_STTC, " ");
372 return STT_ERROR_INVALID_STATE;
376 ret = stt_config_mgr_get_engine(engine_id);
377 ret = __stt_convert_config_error_code(ret);
379 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request get current engine : %s", __stt_get_error_code(ret));
381 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current engine uuid = %s", *engine_id);
384 SLOG(LOG_DEBUG, TAG_STTC, "=====");
385 SLOG(LOG_DEBUG, TAG_STTC, " ");
390 int stt_set_engine(stt_h stt, const char* engine_id)
392 bool stt_supported = false;
393 bool mic_supported = false;
394 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
395 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
396 if (false == stt_supported || false == mic_supported) {
397 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
398 return STT_ERROR_NOT_SUPPORTED;
403 SLOG(LOG_DEBUG, TAG_STTC, "===== Set current engine");
405 if (NULL == stt || NULL == engine_id) {
406 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
407 SLOG(LOG_DEBUG, TAG_STTC, "=====");
408 SLOG(LOG_DEBUG, TAG_STTC, " ");
409 return STT_ERROR_INVALID_PARAMETER;
412 stt_client_s* client = stt_client_get(stt);
415 if (NULL == client) {
416 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
417 SLOG(LOG_DEBUG, TAG_STTC, "=====");
418 SLOG(LOG_DEBUG, TAG_STTC, " ");
419 return STT_ERROR_INVALID_PARAMETER;
423 if (client->current_state != STT_STATE_CREATED) {
424 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not CREATE");
425 SLOG(LOG_DEBUG, TAG_STTC, "=====");
426 SLOG(LOG_DEBUG, TAG_STTC, " ");
427 return STT_ERROR_INVALID_STATE;
430 if (NULL != client->current_engine_id) {
431 free(client->current_engine_id);
434 client->current_engine_id = strdup(engine_id);
436 SLOG(LOG_DEBUG, TAG_STTC, "=====");
437 SLOG(LOG_DEBUG, TAG_STTC, " ");
442 static Eina_Bool __stt_connect_daemon(void *data)
444 stt_client_s* client = (stt_client_s*)data;
446 if (NULL == client) {
447 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
453 ret = stt_dbus_request_hello();
455 if (STT_ERROR_INVALID_STATE == ret) {
461 g_connect_timer = NULL;
462 SLOG(LOG_DEBUG, TAG_STTC, "===== Connect daemon");
464 /* request initialization */
466 bool silence_supported = false;
468 ret = stt_dbus_request_initialize(client->uid, &silence_supported);
470 if (STT_ERROR_ENGINE_NOT_FOUND == ret) {
471 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to initialize : %s", __stt_get_error_code(ret));
473 client->reason = STT_ERROR_ENGINE_NOT_FOUND;
474 ecore_timer_add(0, __stt_notify_error, (void*)client);
478 } else if (STT_ERROR_NONE != ret) {
479 SLOG(LOG_ERROR, TAG_STTC, "[WARNING] Fail to connection. Retry to connect");
482 /* success to connect stt-daemon */
483 client->silence_supported = silence_supported;
484 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "Supported options : silence(%s)", silence_supported ? "true" : "false");
487 if (NULL != client->current_engine_id) {
490 silence_supported = false;
492 ret = stt_dbus_request_set_current_engine(client->uid, client->current_engine_id, &silence_supported);
494 if (STT_ERROR_TIMED_OUT != ret) {
495 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set current engine : %s", __stt_get_error_code(ret));
498 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
501 if (STT_RETRY_COUNT == count) {
502 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
507 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current engine uuid = %s", client->current_engine_id);
509 /* success to change engine */
510 client->silence_supported = silence_supported;
511 SLOG(LOG_DEBUG, TAG_STTC, "Supported options : silence(%s)", silence_supported ? "true" : "false");
516 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] uid(%d)", client->uid);
518 client->before_state = client->current_state;
519 client->current_state = STT_STATE_READY;
521 if (NULL != client->state_changed_cb) {
522 stt_client_use_callback(client);
523 client->state_changed_cb(client->stt, client->before_state,
524 client->current_state, client->state_changed_user_data);
525 stt_client_not_use_callback(client);
526 SLOG(LOG_DEBUG, TAG_STTC, "State changed callback is called");
528 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
531 SLOG(LOG_DEBUG, TAG_STTC, "=====");
532 SLOG(LOG_DEBUG, TAG_STTC, " ");
537 int stt_prepare(stt_h stt)
539 bool stt_supported = false;
540 bool mic_supported = false;
541 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
542 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
543 if (false == stt_supported || false == mic_supported) {
544 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
545 return STT_ERROR_NOT_SUPPORTED;
550 SLOG(LOG_DEBUG, TAG_STTC, "===== Prepare STT");
552 stt_client_s* client = stt_client_get(stt);
555 if (NULL == client) {
556 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
557 SLOG(LOG_DEBUG, TAG_STTC, "=====");
558 SLOG(LOG_DEBUG, TAG_STTC, " ");
559 return STT_ERROR_INVALID_PARAMETER;
563 if (client->current_state != STT_STATE_CREATED) {
564 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not 'CREATED'");
565 SLOG(LOG_DEBUG, TAG_STTC, "=====");
566 SLOG(LOG_DEBUG, TAG_STTC, " ");
567 return STT_ERROR_INVALID_STATE;
570 g_count_check_daemon = 0;
571 g_connect_timer = ecore_timer_add(0, __stt_connect_daemon, (void*)client);
573 SLOG(LOG_DEBUG, TAG_STTC, "=====");
574 SLOG(LOG_DEBUG, TAG_STTC, " ");
576 return STT_ERROR_NONE;
579 int stt_unprepare(stt_h stt)
581 bool stt_supported = false;
582 bool mic_supported = false;
583 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
584 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
585 if (false == stt_supported || false == mic_supported) {
586 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
587 return STT_ERROR_NOT_SUPPORTED;
592 SLOG(LOG_DEBUG, TAG_STTC, "===== Unprepare 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_READY) {
604 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not 'READY'");
605 SLOG(LOG_DEBUG, TAG_STTC, "=====");
606 SLOG(LOG_DEBUG, TAG_STTC, " ");
607 return STT_ERROR_INVALID_STATE;
613 ret = stt_dbus_request_finalize(client->uid);
615 if (STT_ERROR_TIMED_OUT != ret) {
616 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request finalize : %s", __stt_get_error_code(ret));
619 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
622 if (STT_RETRY_COUNT == count) {
623 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
630 client->internal_state = STT_INTERNAL_STATE_NONE;
632 client->before_state = client->current_state;
633 client->current_state = STT_STATE_CREATED;
635 if (NULL != client->state_changed_cb) {
636 stt_client_use_callback(client);
637 client->state_changed_cb(client->stt, client->before_state,
638 client->current_state, client->state_changed_user_data);
639 stt_client_not_use_callback(client);
641 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
644 SLOG(LOG_DEBUG, TAG_STTC, "=====");
645 SLOG(LOG_DEBUG, TAG_STTC, " ");
647 return STT_ERROR_NONE;
650 bool __stt_config_supported_language_cb(const char* engine_id, const char* language, void* user_data)
652 stt_h stt = (stt_h)user_data;
654 stt_client_s* client = stt_client_get(stt);
655 if (NULL == client) {
656 SLOG(LOG_ERROR, TAG_STTC, "[WARNING] A handle is not valid");
660 /* call callback function */
661 if (NULL != client->supported_lang_cb) {
662 return client->supported_lang_cb(stt, language, client->supported_lang_user_data);
664 SLOG(LOG_WARN, TAG_STTC, "No registered callback function of supported languages");
670 int stt_foreach_supported_languages(stt_h stt, stt_supported_language_cb callback, void* user_data)
672 bool stt_supported = false;
673 bool mic_supported = false;
674 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
675 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
676 if (false == stt_supported || false == mic_supported) {
677 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
678 return STT_ERROR_NOT_SUPPORTED;
683 SLOG(LOG_DEBUG, TAG_STTC, "===== Foreach Supported Language");
685 if (NULL == stt || NULL == callback) {
686 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
687 SLOG(LOG_DEBUG, TAG_STTC, "=====");
688 SLOG(LOG_DEBUG, TAG_STTC, " ");
689 return STT_ERROR_INVALID_PARAMETER;
692 stt_client_s* client = stt_client_get(stt);
695 if (NULL == client) {
696 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
697 SLOG(LOG_DEBUG, TAG_STTC, "=====");
698 SLOG(LOG_DEBUG, TAG_STTC, " ");
699 return STT_ERROR_INVALID_PARAMETER;
703 char* current_engine_id = NULL;
705 if (NULL == client->current_engine_id) {
706 ret = stt_config_mgr_get_engine(¤t_engine_id);
707 ret = __stt_convert_config_error_code(ret);
709 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get default engine id : %s", __stt_get_error_code(ret));
713 current_engine_id = strdup(client->current_engine_id);
714 if (NULL == current_engine_id) {
715 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to allocate memory");
716 return STT_ERROR_OUT_OF_MEMORY;
720 client->supported_lang_cb = callback;
721 client->supported_lang_user_data = user_data;
723 ret = stt_config_mgr_get_language_list(current_engine_id, __stt_config_supported_language_cb, client->stt);
724 ret = __stt_convert_config_error_code(ret);
726 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get languages : %s", __stt_get_error_code(ret));
729 if (NULL != current_engine_id) {
730 free(current_engine_id);
733 client->supported_lang_cb = NULL;
734 client->supported_lang_user_data = NULL;
736 SLOG(LOG_DEBUG, TAG_STTC, "=====");
737 SLOG(LOG_DEBUG, TAG_STTC, " ");
742 int stt_get_default_language(stt_h stt, char** language)
744 bool stt_supported = false;
745 bool mic_supported = false;
746 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
747 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
748 if (false == stt_supported || false == mic_supported) {
749 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
750 return STT_ERROR_NOT_SUPPORTED;
755 SLOG(LOG_DEBUG, TAG_STTC, "===== Get Default Language");
757 if (NULL == stt || NULL == language) {
758 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
759 SLOG(LOG_DEBUG, TAG_STTC, "=====");
760 SLOG(LOG_DEBUG, TAG_STTC, " ");
761 return STT_ERROR_INVALID_PARAMETER;
764 stt_client_s* client = stt_client_get(stt);
767 if (NULL == client) {
768 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
769 SLOG(LOG_DEBUG, TAG_STTC, "=====");
770 SLOG(LOG_DEBUG, TAG_STTC, " ");
771 return STT_ERROR_INVALID_PARAMETER;
775 ret = stt_config_mgr_get_default_language(language);
776 ret = __stt_convert_config_error_code(ret);
778 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get default language : %s", __stt_get_error_code(ret));
780 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current language = %s", *language);
783 SLOG(LOG_DEBUG, TAG_STTC, "=====");
784 SLOG(LOG_DEBUG, TAG_STTC, " ");
789 int stt_get_state(stt_h stt, stt_state_e* state)
791 bool stt_supported = false;
792 bool mic_supported = false;
793 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
794 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
795 if (false == stt_supported || false == mic_supported) {
796 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
797 return STT_ERROR_NOT_SUPPORTED;
802 if (NULL == stt || NULL == state) {
803 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
804 return STT_ERROR_INVALID_PARAMETER;
807 stt_client_s* client = stt_client_get(stt);
809 if (NULL == client) {
810 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
811 return STT_ERROR_INVALID_PARAMETER;
814 *state = client->current_state;
817 case STT_STATE_CREATED: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'CREATED'"); break;
818 case STT_STATE_READY: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'Ready'"); break;
819 case STT_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'Recording'"); break;
820 case STT_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'Processing'"); break;
821 default: SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid value"); break;
824 return STT_ERROR_NONE;
827 int stt_is_recognition_type_supported(stt_h stt, const char* type, bool* support)
829 bool stt_supported = false;
830 bool mic_supported = false;
831 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
832 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
833 if (false == stt_supported || false == mic_supported) {
834 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
835 return STT_ERROR_NOT_SUPPORTED;
840 if (NULL == stt || NULL == type || NULL == support) {
841 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
842 return STT_ERROR_INVALID_PARAMETER;
845 stt_client_s* client = stt_client_get(stt);
847 if (NULL == client) {
848 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not valid");
849 return STT_ERROR_INVALID_PARAMETER;
853 if (client->current_state != STT_STATE_READY) {
854 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not READY");
855 return STT_ERROR_INVALID_STATE;
861 ret = stt_dbus_request_is_recognition_type_supported(client->uid, type, support);
863 if (STT_ERROR_TIMED_OUT != ret) {
864 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get recognition type supported : %s", __stt_get_error_code(ret));
867 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
870 if (STT_RETRY_COUNT == count) {
871 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
876 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] recognition type is %s", *support ? "true " : "false");
881 return STT_ERROR_NONE;
884 int stt_set_silence_detection(stt_h stt, stt_option_silence_detection_e type)
886 bool stt_supported = false;
887 bool mic_supported = false;
888 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
889 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
890 if (false == stt_supported || false == mic_supported) {
891 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
892 return STT_ERROR_NOT_SUPPORTED;
898 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
899 return STT_ERROR_INVALID_PARAMETER;
902 stt_client_s* client = stt_client_get(stt);
904 if (NULL == client) {
905 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
906 return STT_ERROR_INVALID_PARAMETER;
910 if (client->current_state != STT_STATE_READY) {
911 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not READY");
912 return STT_ERROR_INVALID_STATE;
915 if (true == client->silence_supported) {
916 if (type >= STT_OPTION_SILENCE_DETECTION_FALSE && type <= STT_OPTION_SILENCE_DETECTION_AUTO) {
917 client->silence = type;
919 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Type is invalid");
920 return STT_ERROR_INVALID_PARAMETER;
923 return STT_ERROR_NOT_SUPPORTED_FEATURE;
926 return STT_ERROR_NONE;
929 int stt_set_start_sound(stt_h stt, const char* filename)
931 bool stt_supported = false;
932 bool mic_supported = false;
933 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
934 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
935 if (false == stt_supported || false == mic_supported) {
936 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
937 return STT_ERROR_NOT_SUPPORTED;
942 SLOG(LOG_DEBUG, TAG_STTC, "===== STT SET START SOUND");
944 if (NULL == stt || NULL == filename) {
945 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
946 return STT_ERROR_INVALID_PARAMETER;
949 if (0 != access(filename, F_OK)) {
950 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] File does not exist");
951 return STT_ERROR_INVALID_PARAMETER;
954 stt_client_s* client = stt_client_get(stt);
955 if (NULL == client) {
956 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
957 return STT_ERROR_INVALID_PARAMETER;
961 if (client->current_state != STT_STATE_READY) {
962 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not READY");
963 return STT_ERROR_INVALID_STATE;
969 ret = stt_dbus_request_set_start_sound(client->uid, filename);
971 if (STT_ERROR_TIMED_OUT != ret) {
972 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set start sound : %s", __stt_get_error_code(ret));
975 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
978 if (STT_RETRY_COUNT == count) {
979 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
984 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Set start sound : %s", filename);
989 return STT_ERROR_NONE;
992 int stt_unset_start_sound(stt_h stt)
994 bool stt_supported = false;
995 bool mic_supported = false;
996 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
997 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
998 if (false == stt_supported || false == mic_supported) {
999 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1000 return STT_ERROR_NOT_SUPPORTED;
1005 SLOG(LOG_DEBUG, TAG_STTC, "===== STT UNSET START SOUND");
1008 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1009 return STT_ERROR_INVALID_PARAMETER;
1012 stt_client_s* client = stt_client_get(stt);
1014 if (NULL == client) {
1015 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
1016 return STT_ERROR_INVALID_PARAMETER;
1020 if (client->current_state != STT_STATE_READY) {
1021 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not READY");
1022 return STT_ERROR_INVALID_STATE;
1028 ret = stt_dbus_request_unset_start_sound(client->uid);
1030 if (STT_ERROR_TIMED_OUT != ret) {
1031 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to unset start sound : %s", __stt_get_error_code(ret));
1034 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1037 if (STT_RETRY_COUNT == count) {
1038 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1043 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Unset start sound");
1048 return STT_ERROR_NONE;
1051 int stt_set_stop_sound(stt_h stt, const char* filename)
1053 bool stt_supported = false;
1054 bool mic_supported = false;
1055 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
1056 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
1057 if (false == stt_supported || false == mic_supported) {
1058 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1059 return STT_ERROR_NOT_SUPPORTED;
1064 SLOG(LOG_DEBUG, TAG_STTC, "===== STT SET STOP SOUND");
1066 if (NULL == stt || NULL == filename) {
1067 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1068 return STT_ERROR_INVALID_PARAMETER;
1071 if (0 != access(filename, F_OK)) {
1072 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] File does not exist");
1073 return STT_ERROR_INVALID_PARAMETER;
1076 stt_client_s* client = stt_client_get(stt);
1078 if (NULL == client) {
1079 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
1080 return STT_ERROR_INVALID_PARAMETER;
1084 if (client->current_state != STT_STATE_READY) {
1085 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not READY");
1086 return STT_ERROR_INVALID_STATE;
1092 ret = stt_dbus_request_set_stop_sound(client->uid, filename);
1094 if (STT_ERROR_TIMED_OUT != ret) {
1095 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set stop sound : %s", __stt_get_error_code(ret));
1098 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1101 if (STT_RETRY_COUNT == count) {
1102 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1107 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Set stop sound : %s", filename);
1112 return STT_ERROR_NONE;
1115 int stt_unset_stop_sound(stt_h stt)
1117 bool stt_supported = false;
1118 bool mic_supported = false;
1119 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
1120 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
1121 if (false == stt_supported || false == mic_supported) {
1122 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1123 return STT_ERROR_NOT_SUPPORTED;
1128 SLOG(LOG_DEBUG, TAG_STTC, "===== STT UNSET STOP SOUND");
1131 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1132 return STT_ERROR_INVALID_PARAMETER;
1135 stt_client_s* client = stt_client_get(stt);
1137 if (NULL == client) {
1138 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
1139 return STT_ERROR_INVALID_PARAMETER;
1143 if (client->current_state != STT_STATE_READY) {
1144 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not READY");
1145 return STT_ERROR_INVALID_STATE;
1151 ret = stt_dbus_request_unset_stop_sound(client->uid);
1153 if (STT_ERROR_TIMED_OUT != ret) {
1154 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to unset stop sound : %s", __stt_get_error_code(ret));
1157 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1160 if (STT_RETRY_COUNT == count) {
1161 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1166 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Unset stop sound");
1171 return STT_ERROR_NONE;
1174 int stt_start(stt_h stt, const char* language, const char* type)
1176 bool stt_supported = false;
1177 bool mic_supported = false;
1178 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
1179 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
1180 if (false == stt_supported || false == mic_supported) {
1181 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1182 return STT_ERROR_NOT_SUPPORTED;
1187 SLOG(LOG_DEBUG, TAG_STTC, "===== STT START");
1190 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1191 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1192 SLOG(LOG_DEBUG, TAG_STTC, " ");
1193 return STT_ERROR_INVALID_PARAMETER;
1196 stt_client_s* client = stt_client_get(stt);
1199 if (NULL == client) {
1200 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1201 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1202 SLOG(LOG_DEBUG, TAG_STTC, " ");
1203 return STT_ERROR_INVALID_PARAMETER;
1207 if (client->current_state != STT_STATE_READY) {
1208 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not READY");
1209 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1210 SLOG(LOG_DEBUG, TAG_STTC, " ");
1211 return STT_ERROR_INVALID_STATE;
1214 if (STT_INTERNAL_STATE_NONE != client->internal_state) {
1215 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is NOT none : %d", client->internal_state);
1216 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1217 SLOG(LOG_DEBUG, TAG_STTC, " ");
1218 return STT_ERROR_INVALID_STATE;
1222 char appid[128] = {0, };
1223 ret = aul_app_get_appid_bypid(getpid(), appid, sizeof(appid));
1225 if ((AUL_R_OK != ret) || (0 == strlen(appid))) {
1226 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get application ID");
1228 SLOG(LOG_DEBUG, TAG_STTC, "[DEBUG] Current app id is %s", appid);
1232 if (NULL == language) {
1233 temp = strdup("default");
1235 temp = strdup(language);
1242 ret = stt_dbus_request_start(client->uid, temp, type, client->silence, appid);
1245 if (STT_ERROR_TIMED_OUT != ret) {
1246 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to start : %s", __stt_get_error_code(ret));
1247 if (NULL != temp) free(temp);
1250 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry to start");
1253 if (STT_RETRY_COUNT == count) {
1254 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1255 if (NULL != temp) free(temp);
1261 if (NULL != temp) free(temp);
1263 if (STT_RESULT_STATE_DONE == ret) {
1264 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Start is done : %d", ret);
1265 client->before_state = client->current_state;
1266 client->current_state = STT_STATE_RECORDING;
1268 if (NULL != client->state_changed_cb) {
1269 ecore_main_loop_thread_safe_call_async(__stt_notify_state_changed, client);
1271 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
1273 } else if (STT_RESULT_STATE_NOT_DONE == ret) {
1274 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Start is not done : %d", ret);
1275 client->internal_state = STT_INTERNAL_STATE_STARTING;
1277 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid result : %d", ret);
1280 ret = STT_ERROR_NONE;
1285 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1286 SLOG(LOG_DEBUG, TAG_STTC, " ");
1291 int stt_stop(stt_h stt)
1293 bool stt_supported = false;
1294 bool mic_supported = false;
1295 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
1296 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
1297 if (false == stt_supported || false == mic_supported) {
1298 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1299 return STT_ERROR_NOT_SUPPORTED;
1304 SLOG(LOG_DEBUG, TAG_STTC, "===== STT STOP");
1307 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1308 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1309 SLOG(LOG_DEBUG, TAG_STTC, " ");
1310 return STT_ERROR_INVALID_PARAMETER;
1313 stt_client_s* client = stt_client_get(stt);
1316 if (NULL == client) {
1317 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1318 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1319 SLOG(LOG_DEBUG, TAG_STTC, " ");
1320 return STT_ERROR_INVALID_PARAMETER;
1324 if (client->current_state != STT_STATE_RECORDING) {
1325 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Current state is NOT RECORDING");
1326 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1327 SLOG(LOG_DEBUG, TAG_STTC, " ");
1328 return STT_ERROR_INVALID_STATE;
1331 if (STT_INTERNAL_STATE_NONE != client->internal_state) {
1332 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is NOT none : %d", client->internal_state);
1333 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1334 SLOG(LOG_DEBUG, TAG_STTC, " ");
1335 return STT_ERROR_INVALID_STATE;
1342 ret = stt_dbus_request_stop(client->uid);
1345 if (STT_ERROR_TIMED_OUT != ret) {
1346 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to stop : %s", __stt_get_error_code(ret));
1349 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry stop");
1352 if (STT_RETRY_COUNT == count) {
1353 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1358 if (STT_RESULT_STATE_DONE == ret) {
1359 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Stop is done : %d", ret);
1360 client->before_state = client->current_state;
1361 client->current_state = STT_STATE_PROCESSING;
1363 if (NULL != client->state_changed_cb) {
1364 ecore_main_loop_thread_safe_call_async(__stt_notify_state_changed, client);
1365 SLOG(LOG_DEBUG, TAG_STTC, "State changed callback is called");
1367 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
1369 } else if (STT_RESULT_STATE_NOT_DONE == ret) {
1370 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Stop is not done : %d", ret);
1371 client->internal_state = STT_INTERNAL_STATE_STOPING;
1373 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid result : %d", ret);
1375 ret = STT_ERROR_NONE;
1380 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1381 SLOG(LOG_DEBUG, TAG_STTC, " ");
1387 int stt_cancel(stt_h stt)
1389 bool stt_supported = false;
1390 bool mic_supported = false;
1391 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
1392 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
1393 if (false == stt_supported || false == mic_supported) {
1394 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1395 return STT_ERROR_NOT_SUPPORTED;
1400 SLOG(LOG_DEBUG, TAG_STTC, "===== STT CANCEL");
1403 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input handle is null");
1404 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1405 SLOG(LOG_DEBUG, TAG_STTC, " ");
1406 return STT_ERROR_INVALID_PARAMETER;
1409 stt_client_s* client = stt_client_get(stt);
1412 if (NULL == client) {
1413 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1414 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1415 SLOG(LOG_DEBUG, TAG_STTC, " ");
1416 return STT_ERROR_INVALID_PARAMETER;
1420 if (STT_STATE_RECORDING != client->current_state && STT_STATE_PROCESSING != client->current_state) {
1421 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid state : Current state is 'Ready'");
1422 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1423 SLOG(LOG_DEBUG, TAG_STTC, " ");
1424 return STT_ERROR_INVALID_STATE;
1427 if (STT_INTERNAL_STATE_NONE != client->internal_state) {
1428 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is NOT none : %d", client->internal_state);
1429 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1430 SLOG(LOG_DEBUG, TAG_STTC, " ");
1431 return STT_ERROR_INVALID_STATE;
1438 ret = stt_dbus_request_cancel(client->uid);
1441 if (STT_ERROR_TIMED_OUT != ret) {
1442 SLOG(LOG_DEBUG, TAG_STTC, "[ERROR] Fail to cancel : %s", __stt_get_error_code(ret));
1445 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1448 if (STT_RETRY_COUNT == count) {
1449 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1454 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS]");
1456 client->before_state = client->current_state;
1457 client->current_state = STT_STATE_READY;
1459 if (NULL != client->state_changed_cb) {
1460 ecore_main_loop_thread_safe_call_async(__stt_notify_state_changed, client);
1461 SLOG(LOG_DEBUG, TAG_STTC, "State changed callback is called");
1463 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
1465 ret = STT_ERROR_NONE;
1470 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1471 SLOG(LOG_DEBUG, TAG_STTC, " ");
1476 static int __stt_get_audio_volume(float* volume)
1478 FILE* fp = fopen(STT_AUDIO_VOLUME_PATH, "rb");
1480 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to open Volume File");
1481 return STT_ERROR_OPERATION_FAILED;
1484 int readlen = fread((void*)volume, sizeof(*volume), 1, fp);
1493 int stt_get_recording_volume(stt_h stt, float* volume)
1495 bool stt_supported = false;
1496 bool mic_supported = false;
1497 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
1498 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
1499 if (false == stt_supported || false == mic_supported) {
1500 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1501 return STT_ERROR_NOT_SUPPORTED;
1506 if (NULL == stt || NULL == volume) {
1507 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1508 return STT_ERROR_INVALID_PARAMETER;
1511 stt_client_s* client = stt_client_get(stt);
1514 if (NULL == client) {
1515 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1516 return STT_ERROR_INVALID_PARAMETER;
1519 if (STT_STATE_RECORDING != client->current_state) {
1520 SLOG(LOG_DEBUG, TAG_STTC, "[ERROR] Invalid state : NO 'Recording' state");
1521 return STT_ERROR_INVALID_STATE;
1525 ret = __stt_get_audio_volume(volume);
1527 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get audio volume : %s", __stt_get_error_code(ret));
1528 return STT_ERROR_OPERATION_FAILED;
1531 return STT_ERROR_NONE;
1534 bool __stt_result_time_cb(int index, int event, const char* text, long start_time, long end_time, void* user_data)
1536 stt_client_s* client = (stt_client_s*)user_data;
1539 if (NULL == client) {
1540 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
1544 if (NULL != client->result_time_cb) {
1545 SLOG(LOG_DEBUG, TAG_STTC, "(%d) event(%d) text(%s) start(%ld) end(%ld)",
1546 index, event, text, start_time, end_time);
1547 client->result_time_cb(client->stt, index, (stt_result_time_event_e)event,
1548 text, start_time, end_time, client->result_time_user_data);
1550 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Callback is NULL");
1557 int stt_foreach_detailed_result(stt_h stt, stt_result_time_cb callback, void* user_data)
1559 bool stt_supported = false;
1560 bool mic_supported = false;
1561 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
1562 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
1563 if (false == stt_supported || false == mic_supported) {
1564 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1565 return STT_ERROR_NOT_SUPPORTED;
1570 SLOG(LOG_DEBUG, TAG_STTC, "===== STT FOREACH DETAILED RESULT");
1572 if (NULL == callback) {
1573 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1574 return STT_ERROR_INVALID_PARAMETER;
1577 stt_client_s* client = stt_client_get(stt);
1580 if (NULL == client) {
1581 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail : A handle is not valid");
1582 return STT_ERROR_INVALID_PARAMETER;
1585 client->result_time_cb = callback;
1586 client->result_time_user_data = user_data;
1589 ret = stt_config_mgr_foreach_time_info(__stt_result_time_cb, client);
1590 ret = __stt_convert_config_error_code(ret);
1592 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to foreach time info : %s", __stt_get_error_code(ret));
1595 client->result_time_cb = NULL;
1596 client->result_time_user_data = NULL;
1598 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1599 SLOG(LOG_DEBUG, TAG_STTC, " ");
1604 static Eina_Bool __stt_notify_error(void *data)
1606 stt_client_s* client = (stt_client_s*)data;
1609 if (NULL == client) {
1610 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
1614 if (NULL == stt_client_get_by_uid(client->uid))
1617 if (NULL != client->error_cb) {
1618 stt_client_use_callback(client);
1619 client->error_cb(client->stt, client->reason, client->error_user_data);
1620 stt_client_not_use_callback(client);
1621 SLOG(LOG_DEBUG, TAG_STTC, "Error callback is called");
1623 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Error callback is null");
1629 int __stt_cb_error(int uid, int reason)
1631 stt_client_s* client = stt_client_get_by_uid(uid);
1632 if (NULL == client) {
1633 SLOG(LOG_ERROR, TAG_STTC, "Handle not found\n");
1637 client->reason = reason;
1639 if (NULL != client->error_cb) {
1640 ecore_timer_add(0, __stt_notify_error, client);
1642 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Error callback is null");
1648 static void __stt_notify_state_changed(void *data)
1650 stt_client_s* client = (stt_client_s*)data;
1653 if (NULL == client) {
1654 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
1658 if (NULL == stt_client_get_by_uid(client->uid)) {
1662 if (STT_INTERNAL_STATE_STARTING == client->internal_state && STT_STATE_RECORDING == client->current_state) {
1663 client->internal_state = STT_INTERNAL_STATE_NONE;
1664 SLOG(LOG_DEBUG, TAG_STTC, "Internal state change NULL");
1665 } else if (STT_INTERNAL_STATE_STOPING == client->internal_state && STT_STATE_PROCESSING == client->current_state) {
1666 client->internal_state = STT_INTERNAL_STATE_NONE;
1667 SLOG(LOG_DEBUG, TAG_STTC, "Internal state change NULL");
1670 if (NULL != client->state_changed_cb) {
1671 stt_client_use_callback(client);
1672 client->state_changed_cb(client->stt, client->before_state,
1673 client->current_state, client->state_changed_user_data);
1674 stt_client_not_use_callback(client);
1675 SLOG(LOG_DEBUG, TAG_STTC, "State changed callback is called");
1677 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
1683 static Eina_Bool __stt_notify_result(void *data)
1685 stt_client_s* client = (stt_client_s*)data;
1688 if (NULL == client) {
1689 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
1693 if (NULL == stt_client_get_by_uid(client->uid)) {
1697 if (NULL != client->recognition_result_cb) {
1698 stt_client_use_callback(client);
1699 client->recognition_result_cb(client->stt, client->event, (const char**)client->data_list, client->data_count,
1700 client->msg, client->recognition_result_user_data);
1701 stt_client_not_use_callback(client);
1702 SLOG(LOG_DEBUG, TAG_STTC, "client recognition result callback called");
1704 SLOG(LOG_WARN, TAG_STTC, "[WARNING] User recognition result callback is NULL");
1707 if (NULL != client->msg) {
1712 if (NULL != client->data_list) {
1714 temp = client->data_list;
1717 for (i = 0; i < client->data_count; i++) {
1718 if (NULL != temp[i]) {
1722 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result data is error");
1725 free(client->data_list);
1726 client->data_list = NULL;
1729 client->data_count = 0;
1731 stt_config_mgr_remove_time_info_file();
1733 if (STT_RESULT_EVENT_FINAL_RESULT == client->event || STT_RESULT_EVENT_ERROR == client->event) {
1734 client->before_state = client->current_state;
1735 client->current_state = STT_STATE_READY;
1737 if (NULL != client->state_changed_cb) {
1738 ecore_main_loop_thread_safe_call_async(__stt_notify_state_changed, client);
1740 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
1747 int __stt_cb_result(int uid, int event, char** data, int data_count, const char* msg)
1749 stt_client_s* client = NULL;
1751 client = stt_client_get_by_uid(uid);
1752 if (NULL == client) {
1753 SLOG(LOG_ERROR, TAG_STTC, "Handle is NOT valid");
1754 return STT_ERROR_INVALID_PARAMETER;
1757 if (NULL != msg) SLOG(LOG_DEBUG, TAG_STTC, "Recognition Result Message = %s", msg);
1760 for (i = 0; i < data_count; i++) {
1761 if (NULL != data[i]) SECURE_SLOG(LOG_DEBUG, TAG_STTC, "Recognition Result[%d] = %s", i, data[i]);
1764 if (NULL != client->recognition_result_cb) {
1765 client->event = event;
1767 client->msg = strdup(msg);
1770 client->data_count = data_count;
1772 if (data_count > 0) {
1774 temp = (char**)calloc(data_count, sizeof(char*));
1776 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to allocate memory");
1777 return STT_ERROR_OUT_OF_MEMORY;
1780 for (i = 0; i < data_count; i++) {
1781 if (NULL != data[i])
1782 temp[i] = strdup(data[i]);
1784 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result data is error");
1787 client->data_list = temp;
1790 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] User result callback is null");
1793 ecore_timer_add(0, __stt_notify_result, client);
1795 return STT_ERROR_NONE;
1798 int __stt_cb_set_state(int uid, int state)
1800 stt_client_s* client = stt_client_get_by_uid(uid);
1801 if (NULL == client) {
1802 SLOG(LOG_ERROR, TAG_STTC, "Handle not found");
1806 stt_state_e state_from_daemon = (stt_state_e)state;
1808 if (client->current_state == state_from_daemon) {
1809 SLOG(LOG_DEBUG, TAG_STTC, "Current state has already been %d", client->current_state);
1813 client->before_state = client->current_state;
1814 client->current_state = state_from_daemon;
1816 ecore_main_loop_thread_safe_call_async(__stt_notify_state_changed, client);
1820 int stt_set_recognition_result_cb(stt_h stt, stt_recognition_result_cb callback, void* user_data)
1822 bool stt_supported = false;
1823 bool mic_supported = false;
1824 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
1825 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
1826 if (false == stt_supported || false == mic_supported) {
1827 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1828 return STT_ERROR_NOT_SUPPORTED;
1833 if (stt == NULL || callback == NULL)
1834 return STT_ERROR_INVALID_PARAMETER;
1836 stt_client_s* client = stt_client_get(stt);
1839 if (NULL == client) {
1840 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1841 return STT_ERROR_INVALID_PARAMETER;
1844 if (STT_STATE_CREATED != client->current_state) {
1845 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'");
1846 return STT_ERROR_INVALID_STATE;
1849 client->recognition_result_cb = callback;
1850 client->recognition_result_user_data = user_data;
1855 int stt_unset_recognition_result_cb(stt_h stt)
1857 bool stt_supported = false;
1858 bool mic_supported = false;
1859 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
1860 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
1861 if (false == stt_supported || false == mic_supported) {
1862 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1863 return STT_ERROR_NOT_SUPPORTED;
1869 return STT_ERROR_INVALID_PARAMETER;
1871 stt_client_s* client = stt_client_get(stt);
1874 if (NULL == client) {
1875 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1876 return STT_ERROR_INVALID_PARAMETER;
1879 if (STT_STATE_CREATED != client->current_state) {
1880 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'");
1881 return STT_ERROR_INVALID_STATE;
1884 client->recognition_result_cb = NULL;
1885 client->recognition_result_user_data = NULL;
1890 int stt_set_state_changed_cb(stt_h stt, stt_state_changed_cb callback, void* user_data)
1892 bool stt_supported = false;
1893 bool mic_supported = false;
1894 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
1895 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
1896 if (false == stt_supported || false == mic_supported) {
1897 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1898 return STT_ERROR_NOT_SUPPORTED;
1903 if (NULL == stt || NULL == callback)
1904 return STT_ERROR_INVALID_PARAMETER;
1906 stt_client_s* client = stt_client_get(stt);
1909 if (NULL == client) {
1910 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1911 return STT_ERROR_INVALID_PARAMETER;
1914 if (STT_STATE_CREATED != client->current_state) {
1915 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'");
1916 return STT_ERROR_INVALID_STATE;
1919 client->state_changed_cb = callback;
1920 client->state_changed_user_data = user_data;
1925 int stt_unset_state_changed_cb(stt_h stt)
1927 bool stt_supported = false;
1928 bool mic_supported = false;
1929 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
1930 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
1931 if (false == stt_supported || false == mic_supported) {
1932 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1933 return STT_ERROR_NOT_SUPPORTED;
1939 return STT_ERROR_INVALID_PARAMETER;
1941 stt_client_s* client = stt_client_get(stt);
1944 if (NULL == client) {
1945 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1946 return STT_ERROR_INVALID_PARAMETER;
1949 if (STT_STATE_CREATED != client->current_state) {
1950 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'");
1951 return STT_ERROR_INVALID_STATE;
1954 client->state_changed_cb = NULL;
1955 client->state_changed_user_data = NULL;
1960 int stt_set_error_cb(stt_h stt, stt_error_cb callback, void* user_data)
1962 bool stt_supported = false;
1963 bool mic_supported = false;
1964 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
1965 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
1966 if (false == stt_supported || false == mic_supported) {
1967 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1968 return STT_ERROR_NOT_SUPPORTED;
1973 if (NULL == stt || NULL == callback)
1974 return STT_ERROR_INVALID_PARAMETER;
1976 stt_client_s* client = stt_client_get(stt);
1979 if (NULL == client) {
1980 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1981 return STT_ERROR_INVALID_PARAMETER;
1984 if (STT_STATE_CREATED != client->current_state) {
1985 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'");
1986 return STT_ERROR_INVALID_STATE;
1989 client->error_cb = callback;
1990 client->error_user_data = user_data;
1995 int stt_unset_error_cb(stt_h stt)
1997 bool stt_supported = false;
1998 bool mic_supported = false;
1999 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
2000 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
2001 if (false == stt_supported || false == mic_supported) {
2002 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
2003 return STT_ERROR_NOT_SUPPORTED;
2009 return STT_ERROR_INVALID_PARAMETER;
2011 stt_client_s* client = stt_client_get(stt);
2014 if (NULL == client) {
2015 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
2016 return STT_ERROR_INVALID_PARAMETER;
2019 if (STT_STATE_CREATED != client->current_state) {
2020 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'");
2021 return STT_ERROR_INVALID_STATE;
2024 client->error_cb = NULL;
2025 client->error_user_data = NULL;
2030 int stt_set_default_language_changed_cb(stt_h stt, stt_default_language_changed_cb callback, void* user_data)
2032 bool stt_supported = false;
2033 bool mic_supported = false;
2034 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
2035 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
2036 if (false == stt_supported || false == mic_supported) {
2037 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
2038 return STT_ERROR_NOT_SUPPORTED;
2043 if (NULL == stt || NULL == callback)
2044 return STT_ERROR_INVALID_PARAMETER;
2046 stt_client_s* client = stt_client_get(stt);
2049 if (NULL == client) {
2050 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
2051 return STT_ERROR_INVALID_PARAMETER;
2054 if (STT_STATE_CREATED != client->current_state) {
2055 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'");
2056 return STT_ERROR_INVALID_STATE;
2059 client->default_lang_changed_cb = callback;
2060 client->default_lang_changed_user_data = user_data;
2065 int stt_unset_default_language_changed_cb(stt_h stt)
2067 bool stt_supported = false;
2068 bool mic_supported = false;
2069 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
2070 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
2071 if (false == stt_supported || false == mic_supported) {
2072 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
2073 return STT_ERROR_NOT_SUPPORTED;
2079 return STT_ERROR_INVALID_PARAMETER;
2081 stt_client_s* client = stt_client_get(stt);
2084 if (NULL == client) {
2085 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
2086 return STT_ERROR_INVALID_PARAMETER;
2089 if (STT_STATE_CREATED != client->current_state) {
2090 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'");
2091 return STT_ERROR_INVALID_STATE;
2094 client->default_lang_changed_cb = NULL;
2095 client->default_lang_changed_user_data = NULL;