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 bool g_is_daemon_started = false;
34 static Ecore_Timer* g_connect_timer = NULL;
36 static Eina_Bool __stt_notify_state_changed(void *data);
37 static Eina_Bool __stt_notify_error(void *data);
39 static int g_stt_daemon_pid = -1;
40 static int g_count_check_daemon = 0;
47 static const char* __stt_get_error_code(stt_error_e err)
50 case STT_ERROR_NONE: return "STT_ERROR_NONE";
51 case STT_ERROR_OUT_OF_MEMORY: return "STT_ERROR_OUT_OF_MEMORY";
52 case STT_ERROR_IO_ERROR: return "STT_ERROR_IO_ERROR";
53 case STT_ERROR_INVALID_PARAMETER: return "STT_ERROR_INVALID_PARAMETER";
54 case STT_ERROR_TIMED_OUT: return "STT_ERROR_TIMED_OUT";
55 case STT_ERROR_RECORDER_BUSY: return "STT_ERROR_RECORDER_BUSY";
56 case STT_ERROR_OUT_OF_NETWORK: return "STT_ERROR_OUT_OF_NETWORK";
57 case STT_ERROR_PERMISSION_DENIED: return "STT_ERROR_PERMISSION_DENIED";
58 case STT_ERROR_NOT_SUPPORTED: return "STT_ERROR_NOT_SUPPORTED";
59 case STT_ERROR_INVALID_STATE: return "STT_ERROR_INVALID_STATE";
60 case STT_ERROR_INVALID_LANGUAGE: return "STT_ERROR_INVALID_LANGUAGE";
61 case STT_ERROR_ENGINE_NOT_FOUND: return "STT_ERROR_ENGINE_NOT_FOUND";
62 case STT_ERROR_OPERATION_FAILED: return "STT_ERROR_OPERATION_FAILED";
63 case STT_ERROR_NOT_SUPPORTED_FEATURE: return "STT_ERROR_NOT_SUPPORTED_FEATURE";
65 return "Invalid error code";
69 static int __stt_convert_config_error_code(stt_config_error_e code)
71 if (code == STT_CONFIG_ERROR_NONE) return STT_ERROR_NONE;
72 if (code == STT_CONFIG_ERROR_OUT_OF_MEMORY) return STT_ERROR_OUT_OF_MEMORY;
73 if (code == STT_CONFIG_ERROR_IO_ERROR) return STT_ERROR_IO_ERROR;
74 if (code == STT_CONFIG_ERROR_INVALID_PARAMETER) return STT_ERROR_INVALID_PARAMETER;
75 if (code == STT_CONFIG_ERROR_PERMISSION_DENIED) return STT_ERROR_PERMISSION_DENIED;
76 if (code == STT_CONFIG_ERROR_NOT_SUPPORTED) return STT_ERROR_NOT_SUPPORTED;
77 if (code == STT_CONFIG_ERROR_INVALID_STATE) return STT_ERROR_INVALID_STATE;
78 if (code == STT_CONFIG_ERROR_INVALID_LANGUAGE) return STT_ERROR_INVALID_LANGUAGE;
79 if (code == STT_CONFIG_ERROR_ENGINE_NOT_FOUND) return STT_ERROR_ENGINE_NOT_FOUND;
80 if (code == STT_CONFIG_ERROR_OPERATION_FAILED) return STT_ERROR_OPERATION_FAILED;
85 void __stt_config_lang_changed_cb(const char* before_language, const char* current_language, void* user_data)
87 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "Language changed : Before lang(%s) Current lang(%s)",
88 before_language, current_language);
90 if (0 == strcmp(before_language, current_language)) {
94 GList* client_list = NULL;
95 client_list = stt_client_get_client_list();
98 stt_client_s *data = NULL;
100 if (g_list_length(client_list) > 0) {
101 /* Get a first item */
102 iter = g_list_first(client_list);
104 while (NULL != iter) {
106 if (NULL != data->default_lang_changed_cb) {
107 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "Call default language changed callback : uid(%d)", data->uid);
108 data->default_lang_changed_cb(data->stt, before_language, current_language,
109 data->default_lang_changed_user_data);
113 iter = g_list_next(iter);
120 int stt_create(stt_h* stt)
122 bool stt_supported = false;
123 bool mic_supported = false;
124 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
125 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
126 if (false == stt_supported || false == mic_supported) {
127 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
128 return STT_ERROR_NOT_SUPPORTED;
133 SLOG(LOG_DEBUG, TAG_STTC, "===== Create STT");
136 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is null");
137 return STT_ERROR_INVALID_PARAMETER;
140 if (0 == stt_client_get_size()) {
141 if (0 != stt_dbus_open_connection()) {
142 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to open connection");
143 return STT_ERROR_OPERATION_FAILED;
147 if (0 != stt_client_new(stt)) {
148 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to create client!");
149 return STT_ERROR_OUT_OF_MEMORY;
152 stt_client_s* client = stt_client_get(*stt);
153 if (NULL == client) {
154 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to create client");
155 stt_client_destroy(*stt);
156 return STT_ERROR_OPERATION_FAILED;
159 int ret = stt_config_mgr_initialize(client->uid);
160 ret = __stt_convert_config_error_code(ret);
162 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to init config manager : %s", __stt_get_error_code(ret));
163 stt_client_destroy(*stt);
167 ret = stt_config_mgr_set_callback(client->uid, NULL, __stt_config_lang_changed_cb, NULL, NULL);
168 ret = __stt_convert_config_error_code(ret);
170 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set config changed : %s", __stt_get_error_code(ret));
171 stt_client_destroy(*stt);
175 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "[Success] uid(%d)", (*stt)->handle);
177 SLOG(LOG_DEBUG, TAG_STTC, "=====");
178 SLOG(LOG_DEBUG, TAG_STTC, " ");
180 return STT_ERROR_NONE;
183 int stt_destroy(stt_h stt)
185 bool stt_supported = false;
186 bool mic_supported = false;
187 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
188 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
189 if (false == stt_supported || false == mic_supported) {
190 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
191 return STT_ERROR_NOT_SUPPORTED;
196 SLOG(LOG_DEBUG, TAG_STTC, "===== Destroy STT");
199 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input handle is null");
200 SLOG(LOG_DEBUG, TAG_STTC, "=====");
201 SLOG(LOG_DEBUG, TAG_STTC, " ");
202 return STT_ERROR_INVALID_PARAMETER;
205 stt_client_s* client = stt_client_get(stt);
208 if (NULL == client) {
209 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
210 return STT_ERROR_INVALID_PARAMETER;
213 /* check used callback */
214 if (0 != stt_client_get_use_callback(client)) {
215 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Cannot destroy in Callback function");
216 return STT_ERROR_OPERATION_FAILED;
219 stt_config_mgr_finalize(client->uid);
224 switch (client->current_state) {
225 case STT_STATE_PROCESSING:
226 case STT_STATE_RECORDING:
227 case STT_STATE_READY:
228 ret = stt_dbus_request_finalize(client->uid);
230 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request finalize : %s", __stt_get_error_code(ret));
233 g_is_daemon_started = false;
234 case STT_STATE_CREATED:
235 if (NULL != g_connect_timer) {
236 SLOG(LOG_DEBUG, TAG_STTC, "Connect Timer is deleted");
237 ecore_timer_del(g_connect_timer);
238 g_connect_timer = NULL;
242 stt_client_destroy(stt);
248 if (0 == stt_client_get_size()) {
249 if (0 != stt_dbus_close_connection()) {
250 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to close connection");
254 SLOG(LOG_DEBUG, TAG_STTC, "=====");
255 SLOG(LOG_DEBUG, TAG_STTC, " ");
257 return STT_ERROR_NONE;
260 bool __stt_config_supported_engine_cb(const char* engine_id, const char* engine_name,
261 const char* setting, bool support_silence, void* user_data)
263 stt_h stt = (stt_h)user_data;
265 stt_client_s* client = stt_client_get(stt);
266 if (NULL == client) {
267 SLOG(LOG_ERROR, TAG_STTC, "[WARNING] A handle is not valid");
271 /* call callback function */
272 if (NULL != client->supported_engine_cb) {
273 return client->supported_engine_cb(stt, engine_id, engine_name, client->supported_engine_user_data);
275 SLOG(LOG_WARN, TAG_STTC, "No registered callback function of supported engine");
281 int stt_foreach_supported_engines(stt_h stt, stt_supported_engine_cb callback, void* user_data)
283 bool stt_supported = false;
284 bool mic_supported = false;
285 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
286 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
287 if (false == stt_supported || false == mic_supported) {
288 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
289 return STT_ERROR_NOT_SUPPORTED;
294 SLOG(LOG_DEBUG, TAG_STTC, "===== Foreach Supported engine");
296 if (NULL == stt || NULL == callback) {
297 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
298 SLOG(LOG_DEBUG, TAG_STTC, "=====");
299 SLOG(LOG_DEBUG, TAG_STTC, " ");
300 return STT_ERROR_INVALID_PARAMETER;
303 stt_client_s* client = stt_client_get(stt);
306 if (NULL == client) {
307 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
308 SLOG(LOG_DEBUG, TAG_STTC, "=====");
309 SLOG(LOG_DEBUG, TAG_STTC, " ");
310 return STT_ERROR_INVALID_PARAMETER;
313 if (client->current_state != STT_STATE_CREATED) {
314 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not CREATE");
315 SLOG(LOG_DEBUG, TAG_STTC, "=====");
316 SLOG(LOG_DEBUG, TAG_STTC, " ");
317 return STT_ERROR_INVALID_STATE;
320 client->supported_engine_cb = callback;
321 client->supported_engine_user_data = user_data;
324 ret = stt_config_mgr_get_engine_list(__stt_config_supported_engine_cb, client->stt);
325 ret = __stt_convert_config_error_code(ret);
327 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get engines : %s", __stt_get_error_code(ret));
330 client->supported_engine_cb = NULL;
331 client->supported_engine_user_data = NULL;
333 SLOG(LOG_DEBUG, TAG_STTC, "=====");
334 SLOG(LOG_DEBUG, TAG_STTC, " ");
339 int stt_get_engine(stt_h stt, char** engine_id)
341 bool stt_supported = false;
342 bool mic_supported = false;
343 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
344 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
345 if (false == stt_supported || false == mic_supported) {
346 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
347 return STT_ERROR_NOT_SUPPORTED;
352 SLOG(LOG_DEBUG, TAG_STTC, "===== Get current engine");
354 if (NULL == stt || NULL == engine_id) {
355 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
356 SLOG(LOG_DEBUG, TAG_STTC, "=====");
357 SLOG(LOG_DEBUG, TAG_STTC, " ");
358 return STT_ERROR_INVALID_PARAMETER;
361 stt_client_s* client = stt_client_get(stt);
364 if (NULL == client) {
365 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
366 SLOG(LOG_DEBUG, TAG_STTC, "=====");
367 SLOG(LOG_DEBUG, TAG_STTC, " ");
368 return STT_ERROR_INVALID_PARAMETER;
371 if (client->current_state != STT_STATE_CREATED) {
372 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not CREATE");
373 SLOG(LOG_DEBUG, TAG_STTC, "=====");
374 SLOG(LOG_DEBUG, TAG_STTC, " ");
375 return STT_ERROR_INVALID_STATE;
379 ret = stt_config_mgr_get_engine(engine_id);
380 ret = __stt_convert_config_error_code(ret);
382 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request get current engine : %s", __stt_get_error_code(ret));
384 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current engine uuid = %s", *engine_id);
387 SLOG(LOG_DEBUG, TAG_STTC, "=====");
388 SLOG(LOG_DEBUG, TAG_STTC, " ");
393 int stt_set_engine(stt_h stt, const char* engine_id)
395 bool stt_supported = false;
396 bool mic_supported = false;
397 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
398 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
399 if (false == stt_supported || false == mic_supported) {
400 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
401 return STT_ERROR_NOT_SUPPORTED;
406 SLOG(LOG_DEBUG, TAG_STTC, "===== Set current engine");
408 if (NULL == stt || NULL == engine_id) {
409 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
410 SLOG(LOG_DEBUG, TAG_STTC, "=====");
411 SLOG(LOG_DEBUG, TAG_STTC, " ");
412 return STT_ERROR_INVALID_PARAMETER;
415 stt_client_s* client = stt_client_get(stt);
418 if (NULL == client) {
419 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
420 SLOG(LOG_DEBUG, TAG_STTC, "=====");
421 SLOG(LOG_DEBUG, TAG_STTC, " ");
422 return STT_ERROR_INVALID_PARAMETER;
426 if (client->current_state != STT_STATE_CREATED) {
427 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not CREATE");
428 SLOG(LOG_DEBUG, TAG_STTC, "=====");
429 SLOG(LOG_DEBUG, TAG_STTC, " ");
430 return STT_ERROR_INVALID_STATE;
433 if (NULL != client->current_engine_id) {
434 free(client->current_engine_id);
437 client->current_engine_id = strdup(engine_id);
439 if (client->current_state == STT_STATE_READY) {
441 bool silence_supported = false;
443 ret = stt_dbus_request_set_current_engine(client->uid, engine_id, &silence_supported);
446 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set current engine : %s", __stt_get_error_code(ret));
449 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current engine uuid = %s", engine_id);
451 /* success to change engine */
452 client->silence_supported = silence_supported;
453 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "Supported options : silence(%s)", silence_supported ? "true" : "false");
457 SLOG(LOG_DEBUG, TAG_STTC, "=====");
458 SLOG(LOG_DEBUG, TAG_STTC, " ");
463 static int __read_proc(const char *path, char *buf, int size)
468 if (NULL == buf || NULL == path) {
472 fd = open(path, O_RDONLY);
477 ret = read(fd, buf, size - 1);
488 static bool __stt_check_daemon_exist()
494 fp = fopen(STT_PID_FILE_PATH, "r");
499 g_stt_daemon_pid = -1;
501 if (0 >= fscanf(fp, "%d", &pid)) {
502 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "Fail to read pid");
508 snprintf(buf, sizeof(buf), "/proc/%d/cmdline", pid);
509 ret = __read_proc(buf, buf, sizeof(buf));
513 if (!strcmp(buf, "/usr/bin/stt-daemon")) {
514 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "Daemon existed - [%d]%s", pid, buf);
515 g_stt_daemon_pid = pid;
522 static void* __fork_stt_daemon(void* NotUsed)
529 SLOG(LOG_DEBUG, TAG_STTC, "[STT ERROR] fail to create STT-DAEMON");
534 for (i = 0;i < _NSIG;i++)
537 execl("/usr/bin/stt-daemon", "/usr/bin/stt-daemon", NULL);
547 static Eina_Bool __stt_connect_daemon(void *data)
549 stt_client_s* client = (stt_client_s*)data;
551 if (NULL == client) {
552 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
558 ret = stt_dbus_request_hello();
560 if (STT_DAEMON_NORMAL != ret) {
561 if (STT_ERROR_INVALID_STATE == ret) {
565 if (STT_DAEMON_ON_TERMINATING == ret) {
566 /* Todo - Wait for terminating and do it again*/
571 bool check = __stt_check_daemon_exist();
573 g_count_check_daemon++;
574 if (3 < g_count_check_daemon) {
575 /* Todo - Kill daemon and restart */
576 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "Need to Kill daemon");
581 if (false == g_is_daemon_started) {
582 g_is_daemon_started = true;
586 thread_id = pthread_create(&thread, NULL, __fork_stt_daemon, NULL);
588 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to make thread");
589 g_connect_timer = NULL;
593 pthread_detach(thread);
602 g_connect_timer = NULL;
603 SLOG(LOG_DEBUG, TAG_STTC, "===== Connect daemon");
605 /* request initialization */
607 bool silence_supported = false;
609 ret = stt_dbus_request_initialize(client->uid, &silence_supported);
611 if (STT_ERROR_ENGINE_NOT_FOUND == ret) {
612 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to initialize : %s", __stt_get_error_code(ret));
614 client->reason = STT_ERROR_ENGINE_NOT_FOUND;
615 ecore_timer_add(0, __stt_notify_error, (void*)client);
619 } else if (STT_ERROR_NONE != ret) {
620 SLOG(LOG_ERROR, TAG_STTC, "[WARNING] Fail to connection. Retry to connect");
623 /* success to connect stt-daemon */
624 client->silence_supported = silence_supported;
625 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "Supported options : silence(%s)", silence_supported ? "true" : "false");
628 if (NULL != client->current_engine_id) {
631 silence_supported = false;
633 ret = stt_dbus_request_set_current_engine(client->uid, client->current_engine_id, &silence_supported);
635 if (STT_ERROR_TIMED_OUT != ret) {
636 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set current engine : %s", __stt_get_error_code(ret));
639 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
643 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
648 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current engine uuid = %s", client->current_engine_id);
650 /* success to change engine */
651 client->silence_supported = silence_supported;
652 SLOG(LOG_DEBUG, TAG_STTC, "Supported options : silence(%s)", silence_supported ? "true" : "false");
657 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] uid(%d)", client->uid);
659 client->before_state = client->current_state;
660 client->current_state = STT_STATE_READY;
662 if (NULL != client->state_changed_cb) {
663 stt_client_use_callback(client);
664 client->state_changed_cb(client->stt, client->before_state,
665 client->current_state, client->state_changed_user_data);
666 stt_client_not_use_callback(client);
667 SLOG(LOG_DEBUG, TAG_STTC, "State changed callback is called");
669 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
672 SLOG(LOG_DEBUG, TAG_STTC, "=====");
673 SLOG(LOG_DEBUG, TAG_STTC, " ");
678 int stt_prepare(stt_h stt)
680 bool stt_supported = false;
681 bool mic_supported = false;
682 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
683 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
684 if (false == stt_supported || false == mic_supported) {
685 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
686 return STT_ERROR_NOT_SUPPORTED;
691 SLOG(LOG_DEBUG, TAG_STTC, "===== Prepare STT");
693 stt_client_s* client = stt_client_get(stt);
696 if (NULL == client) {
697 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
698 SLOG(LOG_DEBUG, TAG_STTC, "=====");
699 SLOG(LOG_DEBUG, TAG_STTC, " ");
700 return STT_ERROR_INVALID_PARAMETER;
704 if (client->current_state != STT_STATE_CREATED) {
705 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not 'CREATED'");
706 SLOG(LOG_DEBUG, TAG_STTC, "=====");
707 SLOG(LOG_DEBUG, TAG_STTC, " ");
708 return STT_ERROR_INVALID_STATE;
711 g_count_check_daemon = 0;
712 g_connect_timer = ecore_timer_add(0, __stt_connect_daemon, (void*)client);
714 SLOG(LOG_DEBUG, TAG_STTC, "=====");
715 SLOG(LOG_DEBUG, TAG_STTC, " ");
717 return STT_ERROR_NONE;
720 int stt_unprepare(stt_h stt)
722 bool supported = false;
723 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &supported)) {
724 if (false == supported) {
725 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
726 return STT_ERROR_NOT_SUPPORTED;
730 SLOG(LOG_DEBUG, TAG_STTC, "===== Unprepare STT");
732 stt_client_s* client = stt_client_get(stt);
735 if (NULL == client) {
736 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
737 return STT_ERROR_INVALID_PARAMETER;
741 if (client->current_state != STT_STATE_READY) {
742 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not 'READY'");
743 SLOG(LOG_DEBUG, TAG_STTC, "=====");
744 SLOG(LOG_DEBUG, TAG_STTC, " ");
745 return STT_ERROR_INVALID_STATE;
751 ret = stt_dbus_request_finalize(client->uid);
753 if (STT_ERROR_TIMED_OUT != ret) {
754 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request finalize : %s", __stt_get_error_code(ret));
757 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
761 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
768 g_is_daemon_started = false;
770 client->internal_state = STT_INTERNAL_STATE_NONE;
772 client->before_state = client->current_state;
773 client->current_state = STT_STATE_CREATED;
775 if (NULL != client->state_changed_cb) {
776 stt_client_use_callback(client);
777 client->state_changed_cb(client->stt, client->before_state,
778 client->current_state, client->state_changed_user_data);
779 stt_client_not_use_callback(client);
781 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
784 SLOG(LOG_DEBUG, TAG_STTC, "=====");
785 SLOG(LOG_DEBUG, TAG_STTC, " ");
787 return STT_ERROR_NONE;
790 bool __stt_config_supported_language_cb(const char* engine_id, const char* language, void* user_data)
792 stt_h stt = (stt_h)user_data;
794 stt_client_s* client = stt_client_get(stt);
795 if (NULL == client) {
796 SLOG(LOG_ERROR, TAG_STTC, "[WARNING] A handle is not valid");
800 /* call callback function */
801 if (NULL != client->supported_lang_cb) {
802 return client->supported_lang_cb(stt, language, client->supported_lang_user_data);
804 SLOG(LOG_WARN, TAG_STTC, "No registered callback function of supported languages");
810 int stt_foreach_supported_languages(stt_h stt, stt_supported_language_cb callback, void* user_data)
812 bool stt_supported = false;
813 bool mic_supported = false;
814 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
815 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
816 if (false == stt_supported || false == mic_supported) {
817 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
818 return STT_ERROR_NOT_SUPPORTED;
823 SLOG(LOG_DEBUG, TAG_STTC, "===== Foreach Supported Language");
825 if (NULL == stt || NULL == callback) {
826 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
827 SLOG(LOG_DEBUG, TAG_STTC, "=====");
828 SLOG(LOG_DEBUG, TAG_STTC, " ");
829 return STT_ERROR_INVALID_PARAMETER;
832 stt_client_s* client = stt_client_get(stt);
835 if (NULL == client) {
836 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
837 SLOG(LOG_DEBUG, TAG_STTC, "=====");
838 SLOG(LOG_DEBUG, TAG_STTC, " ");
839 return STT_ERROR_INVALID_PARAMETER;
843 char* current_engine_id = NULL;
845 if (NULL == client->current_engine_id) {
846 ret = stt_config_mgr_get_engine(¤t_engine_id);
847 ret = __stt_convert_config_error_code(ret);
849 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get default engine id : %s", __stt_get_error_code(ret));
853 current_engine_id = strdup(client->current_engine_id);
856 client->supported_lang_cb = callback;
857 client->supported_lang_user_data = user_data;
859 ret = stt_config_mgr_get_language_list(current_engine_id, __stt_config_supported_language_cb, client->stt);
860 ret = __stt_convert_config_error_code(ret);
862 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get languages : %s", __stt_get_error_code(ret));
865 if (NULL != current_engine_id) {
866 free(current_engine_id);
869 client->supported_lang_cb = NULL;
870 client->supported_lang_user_data = NULL;
872 SLOG(LOG_DEBUG, TAG_STTC, "=====");
873 SLOG(LOG_DEBUG, TAG_STTC, " ");
878 int stt_get_default_language(stt_h stt, char** language)
880 bool stt_supported = false;
881 bool mic_supported = false;
882 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
883 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
884 if (false == stt_supported || false == mic_supported) {
885 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
886 return STT_ERROR_NOT_SUPPORTED;
891 SLOG(LOG_DEBUG, TAG_STTC, "===== Get Default Language");
893 if (NULL == stt || NULL == language) {
894 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
895 SLOG(LOG_DEBUG, TAG_STTC, "=====");
896 SLOG(LOG_DEBUG, TAG_STTC, " ");
897 return STT_ERROR_INVALID_PARAMETER;
900 stt_client_s* client = stt_client_get(stt);
903 if (NULL == client) {
904 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
905 SLOG(LOG_DEBUG, TAG_STTC, "=====");
906 SLOG(LOG_DEBUG, TAG_STTC, " ");
907 return STT_ERROR_INVALID_PARAMETER;
911 ret = stt_config_mgr_get_default_language(language);
912 ret = __stt_convert_config_error_code(ret);
914 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get default language : %s", __stt_get_error_code(ret));
916 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current language = %s", *language);
919 SLOG(LOG_DEBUG, TAG_STTC, "=====");
920 SLOG(LOG_DEBUG, TAG_STTC, " ");
925 int stt_get_state(stt_h stt, stt_state_e* state)
927 bool stt_supported = false;
928 bool mic_supported = false;
929 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
930 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
931 if (false == stt_supported || false == mic_supported) {
932 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
933 return STT_ERROR_NOT_SUPPORTED;
938 if (NULL == stt || NULL == state) {
939 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
940 return STT_ERROR_INVALID_PARAMETER;
943 stt_client_s* client = stt_client_get(stt);
945 if (NULL == client) {
946 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
947 return STT_ERROR_INVALID_PARAMETER;
950 *state = client->current_state;
953 case STT_STATE_CREATED: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'CREATED'"); break;
954 case STT_STATE_READY: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'Ready'"); break;
955 case STT_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'Recording'"); break;
956 case STT_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'Processing'"); break;
957 default: SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid value"); break;
960 return STT_ERROR_NONE;
963 int stt_is_recognition_type_supported(stt_h stt, const char* type, bool* support)
965 bool stt_supported = false;
966 bool mic_supported = false;
967 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
968 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
969 if (false == stt_supported || false == mic_supported) {
970 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
971 return STT_ERROR_NOT_SUPPORTED;
976 if (NULL == stt || NULL == type || NULL == support) {
977 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
978 return STT_ERROR_INVALID_PARAMETER;
981 stt_client_s* client = stt_client_get(stt);
983 if (NULL == client) {
984 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not valid");
985 return STT_ERROR_INVALID_PARAMETER;
989 if (client->current_state != STT_STATE_READY) {
990 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not READY");
991 return STT_ERROR_INVALID_STATE;
997 ret = stt_dbus_request_is_recognition_type_supported(client->uid, type, support);
999 if (STT_ERROR_TIMED_OUT != ret) {
1000 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get recognition type supported : %s", __stt_get_error_code(ret));
1003 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1007 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1012 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] recognition type is %s", *support ? "true " : "false");
1017 return STT_ERROR_NONE;
1020 int stt_set_silence_detection(stt_h stt, stt_option_silence_detection_e type)
1022 bool stt_supported = false;
1023 bool mic_supported = false;
1024 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
1025 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
1026 if (false == stt_supported || false == mic_supported) {
1027 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1028 return STT_ERROR_NOT_SUPPORTED;
1034 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1035 return STT_ERROR_INVALID_PARAMETER;
1038 stt_client_s* client = stt_client_get(stt);
1040 if (NULL == client) {
1041 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
1042 return STT_ERROR_INVALID_PARAMETER;
1046 if (client->current_state != STT_STATE_READY) {
1047 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not READY");
1048 return STT_ERROR_INVALID_STATE;
1051 if (true == client->silence_supported) {
1052 if (type >= STT_OPTION_SILENCE_DETECTION_FALSE && type <= STT_OPTION_SILENCE_DETECTION_AUTO) {
1053 client->silence = type;
1055 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Type is invalid");
1056 return STT_ERROR_INVALID_PARAMETER;
1059 return STT_ERROR_NOT_SUPPORTED_FEATURE;
1062 return STT_ERROR_NONE;
1065 int stt_set_start_sound(stt_h stt, const char* filename)
1067 bool stt_supported = false;
1068 bool mic_supported = false;
1069 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
1070 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
1071 if (false == stt_supported || false == mic_supported) {
1072 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1073 return STT_ERROR_NOT_SUPPORTED;
1078 SLOG(LOG_DEBUG, TAG_STTC, "===== STT SET START SOUND");
1080 if (NULL == stt || NULL == filename) {
1081 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1082 return STT_ERROR_INVALID_PARAMETER;
1085 stt_client_s* client = stt_client_get(stt);
1087 if (NULL == client) {
1088 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
1089 return STT_ERROR_INVALID_PARAMETER;
1093 if (client->current_state != STT_STATE_READY) {
1094 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not READY");
1095 return STT_ERROR_INVALID_STATE;
1101 ret = stt_dbus_request_set_start_sound(client->uid, filename);
1103 if (STT_ERROR_TIMED_OUT != ret) {
1104 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set start sound : %s", __stt_get_error_code(ret));
1107 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1111 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1116 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Set start sound : %s", filename);
1121 return STT_ERROR_NONE;
1124 int stt_unset_start_sound(stt_h stt)
1126 bool stt_supported = false;
1127 bool mic_supported = false;
1128 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
1129 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
1130 if (false == stt_supported || false == mic_supported) {
1131 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1132 return STT_ERROR_NOT_SUPPORTED;
1137 SLOG(LOG_DEBUG, TAG_STTC, "===== STT UNSET START SOUND");
1140 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1141 return STT_ERROR_INVALID_PARAMETER;
1144 stt_client_s* client = stt_client_get(stt);
1146 if (NULL == client) {
1147 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
1148 return STT_ERROR_INVALID_PARAMETER;
1152 if (client->current_state != STT_STATE_READY) {
1153 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not READY");
1154 return STT_ERROR_INVALID_STATE;
1160 ret = stt_dbus_request_unset_start_sound(client->uid);
1162 if (STT_ERROR_TIMED_OUT != ret) {
1163 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to unset start sound : %s", __stt_get_error_code(ret));
1166 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1170 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1175 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Unset start sound");
1180 return STT_ERROR_NONE;
1183 int stt_set_stop_sound(stt_h stt, const char* filename)
1185 bool stt_supported = false;
1186 bool mic_supported = false;
1187 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
1188 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
1189 if (false == stt_supported || false == mic_supported) {
1190 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1191 return STT_ERROR_NOT_SUPPORTED;
1196 SLOG(LOG_DEBUG, TAG_STTC, "===== STT SET STOP SOUND");
1198 if (NULL == stt || NULL == filename) {
1199 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1200 return STT_ERROR_INVALID_PARAMETER;
1203 stt_client_s* client = stt_client_get(stt);
1205 if (NULL == client) {
1206 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
1207 return STT_ERROR_INVALID_PARAMETER;
1211 if (client->current_state != STT_STATE_READY) {
1212 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not READY");
1213 return STT_ERROR_INVALID_STATE;
1219 ret = stt_dbus_request_set_stop_sound(client->uid, filename);
1221 if (STT_ERROR_TIMED_OUT != ret) {
1222 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to set stop sound : %s", __stt_get_error_code(ret));
1225 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1229 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1234 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Set stop sound : %s", filename);
1239 return STT_ERROR_NONE;
1242 int stt_unset_stop_sound(stt_h stt)
1244 bool stt_supported = false;
1245 bool mic_supported = false;
1246 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
1247 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
1248 if (false == stt_supported || false == mic_supported) {
1249 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1250 return STT_ERROR_NOT_SUPPORTED;
1255 SLOG(LOG_DEBUG, TAG_STTC, "===== STT UNSET STOP SOUND");
1258 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1259 return STT_ERROR_INVALID_PARAMETER;
1262 stt_client_s* client = stt_client_get(stt);
1264 if (NULL == client) {
1265 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
1266 return STT_ERROR_INVALID_PARAMETER;
1270 if (client->current_state != STT_STATE_READY) {
1271 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not READY");
1272 return STT_ERROR_INVALID_STATE;
1278 ret = stt_dbus_request_unset_stop_sound(client->uid);
1280 if (STT_ERROR_TIMED_OUT != ret) {
1281 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to unset stop sound : %s", __stt_get_error_code(ret));
1284 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1288 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1293 SECURE_SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Unset stop sound");
1298 return STT_ERROR_NONE;
1301 int stt_start(stt_h stt, const char* language, const char* type)
1303 bool stt_supported = false;
1304 bool mic_supported = false;
1305 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
1306 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
1307 if (false == stt_supported || false == mic_supported) {
1308 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1309 return STT_ERROR_NOT_SUPPORTED;
1314 SLOG(LOG_DEBUG, TAG_STTC, "===== STT START");
1317 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1318 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1319 SLOG(LOG_DEBUG, TAG_STTC, " ");
1320 return STT_ERROR_INVALID_PARAMETER;
1323 stt_client_s* client = stt_client_get(stt);
1326 if (NULL == client) {
1327 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1328 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1329 SLOG(LOG_DEBUG, TAG_STTC, " ");
1330 return STT_ERROR_INVALID_PARAMETER;
1334 if (client->current_state != STT_STATE_READY) {
1335 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not READY");
1336 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1337 SLOG(LOG_DEBUG, TAG_STTC, " ");
1338 return STT_ERROR_INVALID_STATE;
1341 if (STT_INTERNAL_STATE_NONE != client->internal_state) {
1342 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is NOT none : %d", client->internal_state);
1343 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1344 SLOG(LOG_DEBUG, TAG_STTC, " ");
1345 return STT_ERROR_INVALID_STATE;
1348 char appid[128] = {0, };
1349 aul_app_get_appid_bypid(getpid(), appid, sizeof(appid));
1351 if (0 == strlen(appid)) {
1352 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get application ID");
1354 SLOG(LOG_DEBUG, TAG_STTC, "[DEBUG] Current app id is %s", appid);
1358 if (NULL == language) {
1359 temp = strdup("default");
1361 temp = strdup(language);
1368 ret = stt_dbus_request_start(client->uid, temp, type, client->silence, appid);
1371 if (STT_ERROR_TIMED_OUT != ret) {
1372 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to start : %s", __stt_get_error_code(ret));
1373 if (NULL != temp) free(temp);
1376 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry to start");
1380 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1381 if (NULL != temp) free(temp);
1387 if (NULL != temp) free(temp);
1389 if (STT_RESULT_STATE_DONE == ret) {
1390 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Start is done : %d", ret);
1391 client->before_state = client->current_state;
1392 client->current_state = STT_STATE_RECORDING;
1394 if (NULL != client->state_changed_cb) {
1395 stt_client_use_callback(client);
1396 client->state_changed_cb(client->stt, client->before_state,
1397 client->current_state, client->state_changed_user_data);
1398 stt_client_not_use_callback(client);
1399 SLOG(LOG_DEBUG, TAG_STTC, "State changed callback is called");
1401 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
1403 } else if (STT_RESULT_STATE_NOT_DONE == ret) {
1404 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Start is not done : %d", ret);
1405 client->internal_state = STT_INTERNAL_STATE_STARTING;
1407 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid result : %d", ret);
1410 ret = STT_ERROR_NONE;
1415 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1416 SLOG(LOG_DEBUG, TAG_STTC, " ");
1421 int stt_stop(stt_h stt)
1423 bool stt_supported = false;
1424 bool mic_supported = false;
1425 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
1426 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
1427 if (false == stt_supported || false == mic_supported) {
1428 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1429 return STT_ERROR_NOT_SUPPORTED;
1434 SLOG(LOG_DEBUG, TAG_STTC, "===== STT STOP");
1437 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1438 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1439 SLOG(LOG_DEBUG, TAG_STTC, " ");
1440 return STT_ERROR_INVALID_PARAMETER;
1443 stt_client_s* client = stt_client_get(stt);
1446 if (NULL == client) {
1447 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1448 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1449 SLOG(LOG_DEBUG, TAG_STTC, " ");
1450 return STT_ERROR_INVALID_PARAMETER;
1454 if (client->current_state != STT_STATE_RECORDING) {
1455 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Current state is NOT RECORDING");
1456 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1457 SLOG(LOG_DEBUG, TAG_STTC, " ");
1458 return STT_ERROR_INVALID_STATE;
1461 if (STT_INTERNAL_STATE_NONE != client->internal_state) {
1462 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is NOT none : %d", client->internal_state);
1463 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1464 SLOG(LOG_DEBUG, TAG_STTC, " ");
1465 return STT_ERROR_INVALID_STATE;
1472 ret = stt_dbus_request_stop(client->uid);
1475 if (STT_ERROR_TIMED_OUT != ret) {
1476 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to stop : %s", __stt_get_error_code(ret));
1479 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry stop");
1483 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1488 if (STT_RESULT_STATE_DONE == ret) {
1489 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Stop is done : %d", ret);
1490 client->before_state = client->current_state;
1491 client->current_state = STT_STATE_PROCESSING;
1493 if (NULL != client->state_changed_cb) {
1494 stt_client_use_callback(client);
1495 client->state_changed_cb(client->stt, client->before_state,
1496 client->current_state, client->state_changed_user_data);
1497 stt_client_not_use_callback(client);
1498 SLOG(LOG_DEBUG, TAG_STTC, "State changed callback is called");
1500 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
1502 } else if (STT_RESULT_STATE_NOT_DONE == ret) {
1503 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Stop is not done : %d", ret);
1504 client->internal_state = STT_INTERNAL_STATE_STOPING;
1506 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid result : %d", ret);
1508 ret = STT_ERROR_NONE;
1513 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1514 SLOG(LOG_DEBUG, TAG_STTC, " ");
1520 int stt_cancel(stt_h stt)
1522 bool stt_supported = false;
1523 bool mic_supported = false;
1524 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
1525 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
1526 if (false == stt_supported || false == mic_supported) {
1527 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1528 return STT_ERROR_NOT_SUPPORTED;
1533 SLOG(LOG_DEBUG, TAG_STTC, "===== STT CANCEL");
1536 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input handle is null");
1537 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1538 SLOG(LOG_DEBUG, TAG_STTC, " ");
1539 return STT_ERROR_INVALID_PARAMETER;
1542 stt_client_s* client = stt_client_get(stt);
1545 if (NULL == client) {
1546 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1547 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1548 SLOG(LOG_DEBUG, TAG_STTC, " ");
1549 return STT_ERROR_INVALID_PARAMETER;
1553 if (STT_STATE_RECORDING != client->current_state && STT_STATE_PROCESSING != client->current_state) {
1554 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid state : Current state is 'Ready'");
1555 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1556 SLOG(LOG_DEBUG, TAG_STTC, " ");
1557 return STT_ERROR_INVALID_STATE;
1560 if (STT_INTERNAL_STATE_NONE != client->internal_state) {
1561 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Internal state is NOT none : %d", client->internal_state);
1562 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1563 SLOG(LOG_DEBUG, TAG_STTC, " ");
1564 return STT_ERROR_INVALID_STATE;
1571 ret = stt_dbus_request_cancel(client->uid);
1574 if (STT_ERROR_TIMED_OUT != ret) {
1575 SLOG(LOG_DEBUG, TAG_STTC, "[ERROR] Fail to cancel : %s", __stt_get_error_code(ret));
1578 SLOG(LOG_WARN, TAG_STTC, "[WARNING] retry");
1582 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request");
1587 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS]");
1589 client->before_state = client->current_state;
1590 client->current_state = STT_STATE_READY;
1592 if (NULL != client->state_changed_cb) {
1593 stt_client_use_callback(client);
1594 client->state_changed_cb(client->stt, client->before_state,
1595 client->current_state, client->state_changed_user_data);
1596 stt_client_not_use_callback(client);
1597 SLOG(LOG_DEBUG, TAG_STTC, "State changed callback is called");
1599 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
1601 ret = STT_ERROR_NONE;
1606 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1607 SLOG(LOG_DEBUG, TAG_STTC, " ");
1612 static int __stt_get_audio_volume(float* volume)
1614 FILE* fp = fopen(STT_AUDIO_VOLUME_PATH, "rb");
1616 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to open Volume File");
1617 return STT_ERROR_OPERATION_FAILED;
1620 int readlen = fread((void*)volume, sizeof(*volume), 1, fp);
1629 int stt_get_recording_volume(stt_h stt, float* volume)
1631 bool stt_supported = false;
1632 bool mic_supported = false;
1633 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
1634 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
1635 if (false == stt_supported || false == mic_supported) {
1636 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1637 return STT_ERROR_NOT_SUPPORTED;
1642 if (NULL == stt || NULL == volume) {
1643 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1644 return STT_ERROR_INVALID_PARAMETER;
1647 stt_client_s* client = stt_client_get(stt);
1650 if (NULL == client) {
1651 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1652 return STT_ERROR_INVALID_PARAMETER;
1655 if (STT_STATE_RECORDING != client->current_state) {
1656 SLOG(LOG_DEBUG, TAG_STTC, "[ERROR] Invalid state : NO 'Recording' state");
1657 return STT_ERROR_INVALID_STATE;
1661 ret = __stt_get_audio_volume(volume);
1663 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get audio volume : %s", __stt_get_error_code(ret));
1664 return STT_ERROR_OPERATION_FAILED;
1667 return STT_ERROR_NONE;
1670 bool __stt_result_time_cb(int index, int event, const char* text, long start_time, long end_time, void* user_data)
1672 stt_client_s* client = (stt_client_s*)user_data;
1675 if (NULL == client) {
1676 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
1680 if (NULL != client->result_time_cb) {
1681 SLOG(LOG_DEBUG, TAG_STTC, "(%d) event(%d) text(%s) start(%ld) end(%ld)",
1682 index, event, text, start_time, end_time);
1683 client->result_time_cb(client->stt, index, (stt_result_time_event_e)event,
1684 text, start_time, end_time, client->result_time_user_data);
1686 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Callback is NULL");
1693 int stt_foreach_detailed_result(stt_h stt, stt_result_time_cb callback, void* user_data)
1695 bool stt_supported = false;
1696 bool mic_supported = false;
1697 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
1698 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
1699 if (false == stt_supported || false == mic_supported) {
1700 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1701 return STT_ERROR_NOT_SUPPORTED;
1706 SLOG(LOG_DEBUG, TAG_STTC, "===== STT FOREACH DETAILED RESULT");
1708 if (NULL == callback) {
1709 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
1710 return STT_ERROR_INVALID_PARAMETER;
1713 stt_client_s* client = stt_client_get(stt);
1716 if (NULL == client) {
1717 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail : A handle is not valid");
1718 return STT_ERROR_INVALID_PARAMETER;
1721 client->result_time_cb = callback;
1722 client->result_time_user_data = user_data;
1725 ret = stt_config_mgr_foreach_time_info(__stt_result_time_cb, client);
1726 ret = __stt_convert_config_error_code(ret);
1728 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to foreach time info : %s", __stt_get_error_code(ret));
1731 client->result_time_cb = NULL;
1732 client->result_time_user_data = NULL;
1734 SLOG(LOG_DEBUG, TAG_STTC, "=====");
1735 SLOG(LOG_DEBUG, TAG_STTC, " ");
1740 static Eina_Bool __stt_notify_error(void *data)
1742 stt_client_s* client = (stt_client_s*)data;
1745 if (NULL == client) {
1746 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
1750 if (NULL == stt_client_get_by_uid(client->uid))
1753 if (NULL != client->error_cb) {
1754 stt_client_use_callback(client);
1755 client->error_cb(client->stt, client->reason, client->error_user_data);
1756 stt_client_not_use_callback(client);
1757 SLOG(LOG_DEBUG, TAG_STTC, "Error callback is called");
1759 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Error callback is null");
1765 int __stt_cb_error(int uid, int reason)
1767 stt_client_s* client = stt_client_get_by_uid(uid);
1768 if( NULL == client ) {
1769 SLOG(LOG_ERROR, TAG_STTC, "Handle not found\n");
1773 client->reason = reason;
1775 if (NULL != client->error_cb) {
1776 ecore_timer_add(0, __stt_notify_error, client);
1778 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Error callback is null");
1784 static Eina_Bool __stt_notify_state_changed(void *data)
1786 stt_client_s* client = (stt_client_s*)data;
1789 if (NULL == client) {
1790 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
1794 if (NULL == stt_client_get_by_uid(client->uid))
1797 if (STT_INTERNAL_STATE_STARTING == client->internal_state && STT_STATE_RECORDING == client->current_state) {
1798 client->internal_state = STT_INTERNAL_STATE_NONE;
1799 SLOG(LOG_DEBUG, TAG_STTC, "Internal state change NULL");
1800 } else if (STT_INTERNAL_STATE_STOPING == client->internal_state && STT_STATE_PROCESSING == client->current_state) {
1801 client->internal_state = STT_INTERNAL_STATE_NONE;
1802 SLOG(LOG_DEBUG, TAG_STTC, "Internal state change NULL");
1805 if (NULL != client->state_changed_cb) {
1806 stt_client_use_callback(client);
1807 client->state_changed_cb(client->stt, client->before_state,
1808 client->current_state, client->state_changed_user_data);
1809 stt_client_not_use_callback(client);
1811 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
1817 static Eina_Bool __stt_notify_result(void *data)
1819 stt_client_s* client = (stt_client_s*)data;
1822 if (NULL == client) {
1823 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
1827 if (NULL == stt_client_get_by_uid(client->uid)) {
1831 if (NULL != client->recognition_result_cb) {
1832 stt_client_use_callback(client);
1833 client->recognition_result_cb(client->stt, client->event, (const char**)client->data_list, client->data_count,
1834 client->msg, client->recognition_result_user_data);
1835 stt_client_not_use_callback(client);
1836 SLOG(LOG_DEBUG, TAG_STTC, "client recognition result callback called");
1838 SLOG(LOG_WARN, TAG_STTC, "[WARNING] User recognition result callback is NULL");
1841 if (NULL != client->msg) {
1846 if (NULL != client->data_list) {
1848 temp = client->data_list;
1851 for (i = 0;i < client->data_count;i++) {
1852 if (NULL != temp[i]) {
1856 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result data is error");
1859 free(client->data_list);
1860 client->data_list = NULL;
1863 client->data_count = 0;
1865 stt_config_mgr_remove_time_info_file();
1867 if (STT_RESULT_EVENT_FINAL_RESULT == client->event || STT_RESULT_EVENT_ERROR == client->event) {
1868 client->before_state = client->current_state;
1869 client->current_state = STT_STATE_READY;
1871 if (NULL != client->state_changed_cb) {
1872 ecore_timer_add(0, __stt_notify_state_changed, client);
1874 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
1881 int __stt_cb_result(int uid, int event, char** data, int data_count, const char* msg)
1883 stt_client_s* client = NULL;
1885 client = stt_client_get_by_uid(uid);
1886 if (NULL == client) {
1887 SLOG(LOG_ERROR, TAG_STTC, "Handle is NOT valid");
1891 if (NULL != msg) SLOG(LOG_DEBUG, TAG_STTC, "Recognition Result Message = %s", msg);
1894 for (i = 0;i < data_count;i++) {
1895 if (NULL != data[i]) SECURE_SLOG(LOG_DEBUG, TAG_STTC, "Recognition Result[%d] = %s", i, data[i]);
1898 if (NULL != client->recognition_result_cb) {
1899 client->event = event;
1901 client->msg = strdup(msg);
1904 client->data_count = data_count;
1906 if (data_count > 0) {
1908 temp = (char**)calloc(data_count, sizeof(char*));
1910 for (i = 0;i < data_count;i++) {
1912 temp[i] = strdup(data[i]);
1914 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result data is error");
1917 client->data_list = temp;
1920 ecore_timer_add(0, __stt_notify_result, client);
1922 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] User result callback is null");
1928 int __stt_cb_set_state(int uid, int state)
1930 stt_client_s* client = stt_client_get_by_uid(uid);
1931 if( NULL == client ) {
1932 SLOG(LOG_ERROR, TAG_STTC, "Handle not found");
1936 stt_state_e state_from_daemon = (stt_state_e)state;
1938 if (client->current_state == state_from_daemon) {
1939 SLOG(LOG_DEBUG, TAG_STTC, "Current state has already been %d", client->current_state);
1943 client->before_state = client->current_state;
1944 client->current_state = state_from_daemon;
1946 ecore_timer_add(0, __stt_notify_state_changed, client);
1950 int stt_set_recognition_result_cb(stt_h stt, stt_recognition_result_cb callback, void* user_data)
1952 bool stt_supported = false;
1953 bool mic_supported = false;
1954 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
1955 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
1956 if (false == stt_supported || false == mic_supported) {
1957 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1958 return STT_ERROR_NOT_SUPPORTED;
1963 if (stt == NULL || callback == NULL)
1964 return STT_ERROR_INVALID_PARAMETER;
1966 stt_client_s* client = stt_client_get(stt);
1969 if (NULL == client) {
1970 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1971 return STT_ERROR_INVALID_PARAMETER;
1974 if (STT_STATE_CREATED != client->current_state) {
1975 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'");
1976 return STT_ERROR_INVALID_STATE;
1979 client->recognition_result_cb = callback;
1980 client->recognition_result_user_data = user_data;
1985 int stt_unset_recognition_result_cb(stt_h stt)
1987 bool stt_supported = false;
1988 bool mic_supported = false;
1989 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
1990 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
1991 if (false == stt_supported || false == mic_supported) {
1992 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
1993 return STT_ERROR_NOT_SUPPORTED;
1999 return STT_ERROR_INVALID_PARAMETER;
2001 stt_client_s* client = stt_client_get(stt);
2004 if (NULL == client) {
2005 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
2006 return STT_ERROR_INVALID_PARAMETER;
2009 if (STT_STATE_CREATED != client->current_state) {
2010 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'");
2011 return STT_ERROR_INVALID_STATE;
2014 client->recognition_result_cb = NULL;
2015 client->recognition_result_user_data = NULL;
2020 int stt_set_state_changed_cb(stt_h stt, stt_state_changed_cb callback, void* user_data)
2022 bool stt_supported = false;
2023 bool mic_supported = false;
2024 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
2025 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
2026 if (false == stt_supported || false == mic_supported) {
2027 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
2028 return STT_ERROR_NOT_SUPPORTED;
2033 if (NULL == stt || NULL == callback)
2034 return STT_ERROR_INVALID_PARAMETER;
2036 stt_client_s* client = stt_client_get(stt);
2039 if (NULL == client) {
2040 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
2041 return STT_ERROR_INVALID_PARAMETER;
2044 if (STT_STATE_CREATED != client->current_state) {
2045 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'");
2046 return STT_ERROR_INVALID_STATE;
2049 client->state_changed_cb = callback;
2050 client->state_changed_user_data = user_data;
2055 int stt_unset_state_changed_cb(stt_h stt)
2057 bool stt_supported = false;
2058 bool mic_supported = false;
2059 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
2060 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
2061 if (false == stt_supported || false == mic_supported) {
2062 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
2063 return STT_ERROR_NOT_SUPPORTED;
2069 return STT_ERROR_INVALID_PARAMETER;
2071 stt_client_s* client = stt_client_get(stt);
2074 if (NULL == client) {
2075 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
2076 return STT_ERROR_INVALID_PARAMETER;
2079 if (STT_STATE_CREATED != client->current_state) {
2080 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'");
2081 return STT_ERROR_INVALID_STATE;
2084 client->state_changed_cb = NULL;
2085 client->state_changed_user_data = NULL;
2090 int stt_set_error_cb(stt_h stt, stt_error_cb callback, void* user_data)
2092 bool stt_supported = false;
2093 bool mic_supported = false;
2094 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
2095 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
2096 if (false == stt_supported || false == mic_supported) {
2097 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
2098 return STT_ERROR_NOT_SUPPORTED;
2103 if (NULL == stt || NULL == callback)
2104 return STT_ERROR_INVALID_PARAMETER;
2106 stt_client_s* client = stt_client_get(stt);
2109 if (NULL == client) {
2110 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
2111 return STT_ERROR_INVALID_PARAMETER;
2114 if (STT_STATE_CREATED != client->current_state) {
2115 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'");
2116 return STT_ERROR_INVALID_STATE;
2119 client->error_cb = callback;
2120 client->error_user_data = user_data;
2125 int stt_unset_error_cb(stt_h stt)
2127 bool stt_supported = false;
2128 bool mic_supported = false;
2129 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
2130 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
2131 if (false == stt_supported || false == mic_supported) {
2132 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
2133 return STT_ERROR_NOT_SUPPORTED;
2139 return STT_ERROR_INVALID_PARAMETER;
2141 stt_client_s* client = stt_client_get(stt);
2144 if (NULL == client) {
2145 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
2146 return STT_ERROR_INVALID_PARAMETER;
2149 if (STT_STATE_CREATED != client->current_state) {
2150 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'");
2151 return STT_ERROR_INVALID_STATE;
2154 client->error_cb = NULL;
2155 client->error_user_data = NULL;
2160 int stt_set_default_language_changed_cb(stt_h stt, stt_default_language_changed_cb callback, void* user_data)
2162 bool stt_supported = false;
2163 bool mic_supported = false;
2164 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
2165 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
2166 if (false == stt_supported || false == mic_supported) {
2167 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
2168 return STT_ERROR_NOT_SUPPORTED;
2173 if (NULL == stt || NULL == callback)
2174 return STT_ERROR_INVALID_PARAMETER;
2176 stt_client_s* client = stt_client_get(stt);
2179 if (NULL == client) {
2180 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
2181 return STT_ERROR_INVALID_PARAMETER;
2184 if (STT_STATE_CREATED != client->current_state) {
2185 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'");
2186 return STT_ERROR_INVALID_STATE;
2189 client->default_lang_changed_cb = callback;
2190 client->default_lang_changed_user_data = user_data;
2195 int stt_unset_default_language_changed_cb(stt_h stt)
2197 bool stt_supported = false;
2198 bool mic_supported = false;
2199 if (0 == system_info_get_platform_bool(STT_FEATURE_PATH, &stt_supported)) {
2200 if (0 == system_info_get_platform_bool(STT_MIC_FEATURE_PATH, &mic_supported)) {
2201 if (false == stt_supported || false == mic_supported) {
2202 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] STT NOT supported");
2203 return STT_ERROR_NOT_SUPPORTED;
2209 return STT_ERROR_INVALID_PARAMETER;
2211 stt_client_s* client = stt_client_get(stt);
2214 if (NULL == client) {
2215 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
2216 return STT_ERROR_INVALID_PARAMETER;
2219 if (STT_STATE_CREATED != client->current_state) {
2220 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'");
2221 return STT_ERROR_INVALID_STATE;
2224 client->default_lang_changed_cb = NULL;
2225 client->default_lang_changed_user_data = NULL;