2 * Copyright (c) 2012, 2013 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.
16 #include <sys/types.h>
24 #include "stt_client.h"
27 #define CONNECTION_RETRY_COUNT 3
29 static bool g_is_daemon_started = false;
31 static Ecore_Timer* g_connect_timer = NULL;
33 static int __check_stt_daemon();
34 static Eina_Bool __stt_notify_state_changed(void *data);
35 static Eina_Bool __stt_notify_error(void *data);
37 int stt_create(stt_h* stt)
39 SLOG(LOG_DEBUG, TAG_STTC, "===== Create STT");
42 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is null");
43 return STT_ERROR_INVALID_PARAMETER;
46 if (0 == stt_client_get_size()) {
47 if (0 != stt_dbus_open_connection()) {
48 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to open connection");
49 return STT_ERROR_OPERATION_FAILED;
53 if (0 != stt_client_new(stt)) {
54 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to create client!");
55 return STT_ERROR_OUT_OF_MEMORY;
58 SLOG(LOG_DEBUG, TAG_STTC, "[Success] uid(%d)", (*stt)->handle);
60 SLOG(LOG_DEBUG, TAG_STTC, "=====");
61 SLOG(LOG_DEBUG, TAG_STTC, " ");
63 return STT_ERROR_NONE;
66 int stt_destroy(stt_h stt)
68 SLOG(LOG_DEBUG, TAG_STTC, "===== Destroy STT");
71 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input handle is null");
72 SLOG(LOG_DEBUG, TAG_STTC, "=====");
73 SLOG(LOG_DEBUG, TAG_STTC, " ");
74 return STT_ERROR_INVALID_PARAMETER;
77 stt_client_s* client = stt_client_get(stt);
81 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
82 return STT_ERROR_INVALID_PARAMETER;
85 /* check used callback */
86 if (0 != stt_client_get_use_callback(client)) {
87 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Cannot destroy in Callback function");
88 return STT_ERROR_OPERATION_FAILED;
94 switch (client->current_state) {
95 case STT_STATE_PROCESSING:
96 case STT_STATE_RECORDING:
98 ret = stt_dbus_request_finalize(client->uid);
100 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request finalize");
102 g_is_daemon_started = false;
103 case STT_STATE_CREATED:
104 if (NULL != g_connect_timer) {
105 SLOG(LOG_DEBUG, TAG_STTC, "Connect Timer is deleted");
106 ecore_timer_del(g_connect_timer);
109 stt_client_destroy(stt);
113 SLOG(LOG_DEBUG, TAG_STTC, "Success: destroy");
115 if (0 == stt_client_get_size()) {
116 if (0 != stt_dbus_close_connection()) {
117 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to close connection");
121 SLOG(LOG_DEBUG, TAG_STTC, "=====");
122 SLOG(LOG_DEBUG, TAG_STTC, " ");
124 return STT_ERROR_NONE;
127 static Eina_Bool __stt_connect_daemon(void *data)
129 stt_h stt = (stt_h)data;
131 stt_client_s* client = stt_client_get(stt);
133 if (NULL == client) {
134 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
135 return STT_ERROR_INVALID_PARAMETER;
139 if (0 != stt_dbus_request_hello()) {
140 if (false == g_is_daemon_started) {
141 g_is_daemon_started = true;
142 __check_stt_daemon();
147 SLOG(LOG_DEBUG, TAG_STTC, "===== Connect daemon");
149 /* request initialization */
152 bool silence_supported = false;
153 bool profanity_supported = false;
154 bool punctuation_supported = false;
157 ret = stt_dbus_request_initialize(client->uid, &silence_supported, &profanity_supported, &punctuation_supported);
159 if (STT_ERROR_ENGINE_NOT_FOUND == ret) {
160 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to initialize : STT Engine Not found");
162 client->reason = STT_ERROR_ENGINE_NOT_FOUND;
164 ecore_timer_add(0, __stt_notify_error, (void*)stt);
168 } else if(0 != ret) {
170 if(CONNECTION_RETRY_COUNT == i) {
171 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to initialize : TIMED OUT");
173 client->reason = STT_ERROR_TIMED_OUT;
175 ecore_timer_add(0, __stt_notify_error, (void*)stt);
181 /* success to connect stt-daemon */
182 stt_client_set_option_supported(client->stt, silence_supported, profanity_supported, punctuation_supported);
183 SLOG(LOG_DEBUG, TAG_STTC, "Supported options : silence(%s), profanity(%s), punctuation(%s)",
184 silence_supported ? "true" : "false", profanity_supported ? "true" : "false", punctuation_supported ? "true" : "false");
189 client->before_state = client->current_state;
190 client->current_state = STT_STATE_READY;
192 ecore_timer_add(0, __stt_notify_state_changed, (void*)stt);
194 g_connect_timer = NULL;
196 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] uid(%d)", client->uid);
198 SLOG(LOG_DEBUG, TAG_STTC, "=====");
199 SLOG(LOG_DEBUG, TAG_STTC, " ");
205 int stt_prepare(stt_h stt)
207 SLOG(LOG_DEBUG, TAG_STTC, "===== Prepare STT");
209 stt_client_s* client = stt_client_get(stt);
212 if (NULL == client) {
213 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
214 SLOG(LOG_DEBUG, TAG_STTC, "=====");
215 SLOG(LOG_DEBUG, TAG_STTC, " ");
216 return STT_ERROR_INVALID_PARAMETER;
220 if (client->current_state != STT_STATE_CREATED) {
221 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not 'CREATED'");
222 SLOG(LOG_DEBUG, TAG_STTC, "=====");
223 SLOG(LOG_DEBUG, TAG_STTC, " ");
224 return STT_ERROR_INVALID_STATE;
227 g_connect_timer = ecore_timer_add(0, __stt_connect_daemon, (void*)stt);
229 SLOG(LOG_DEBUG, TAG_STTC, "=====");
230 SLOG(LOG_DEBUG, TAG_STTC, " ");
232 return STT_ERROR_NONE;
235 int stt_unprepare(stt_h stt)
237 SLOG(LOG_DEBUG, TAG_STTC, "===== Unprepare STT");
239 stt_client_s* client = stt_client_get(stt);
242 if (NULL == client) {
243 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
244 return STT_ERROR_INVALID_PARAMETER;
248 if (client->current_state != STT_STATE_READY) {
249 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not 'READY'");
250 SLOG(LOG_DEBUG, TAG_STTC, "=====");
251 SLOG(LOG_DEBUG, TAG_STTC, " ");
252 return STT_ERROR_INVALID_STATE;
255 int ret = stt_dbus_request_finalize(client->uid);
257 SLOG(LOG_WARN, TAG_STTC, "[ERROR] Fail to request finalize");
259 g_is_daemon_started = false;
261 client->before_state = client->current_state;
262 client->current_state = STT_STATE_CREATED;
264 ecore_timer_add(0, __stt_notify_state_changed, (void*)stt);
266 SLOG(LOG_DEBUG, TAG_STTC, "=====");
267 SLOG(LOG_DEBUG, TAG_STTC, " ");
269 return STT_ERROR_NONE;
272 int stt_foreach_supported_languages(stt_h stt, stt_supported_language_cb callback, void* user_data)
274 SLOG(LOG_DEBUG, TAG_STTC, "===== Foreach Supported Language");
276 if (NULL == stt || NULL == callback) {
277 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
278 SLOG(LOG_DEBUG, TAG_STTC, "=====");
279 SLOG(LOG_DEBUG, TAG_STTC, " ");
280 return STT_ERROR_INVALID_PARAMETER;
283 stt_client_s* client = stt_client_get(stt);
286 if (NULL == client) {
287 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
288 SLOG(LOG_DEBUG, TAG_STTC, "=====");
289 SLOG(LOG_DEBUG, TAG_STTC, " ");
290 return STT_ERROR_INVALID_PARAMETER;
294 if (client->current_state != STT_STATE_READY) {
295 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not READY");
296 return STT_ERROR_INVALID_STATE;
300 ret = stt_dbus_request_get_support_langs(client->uid, client->stt, callback, user_data);
302 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get languages");
304 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS]");
307 SLOG(LOG_DEBUG, TAG_STTC, "=====");
308 SLOG(LOG_DEBUG, TAG_STTC, " ");
310 return STT_ERROR_NONE;
314 int stt_get_default_language(stt_h stt, char** language)
316 SLOG(LOG_DEBUG, TAG_STTC, "===== Get Default Language");
318 if (NULL == stt || NULL == language) {
319 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
320 SLOG(LOG_DEBUG, TAG_STTC, "=====");
321 SLOG(LOG_DEBUG, TAG_STTC, " ");
322 return STT_ERROR_INVALID_PARAMETER;
325 stt_client_s* client = stt_client_get(stt);
328 if (NULL == client) {
329 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
330 SLOG(LOG_DEBUG, TAG_STTC, "=====");
331 SLOG(LOG_DEBUG, TAG_STTC, " ");
332 return STT_ERROR_INVALID_PARAMETER;
336 if (client->current_state != STT_STATE_READY) {
337 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not READY");
338 return STT_ERROR_INVALID_STATE;
342 ret = stt_dbus_request_get_default_lang(client->uid, language);
345 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail : request get default language");
347 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current language = %s", *language);
350 SLOG(LOG_DEBUG, TAG_STTC, "=====");
351 SLOG(LOG_DEBUG, TAG_STTC, " ");
356 int stt_get_state(stt_h stt, stt_state_e* state)
358 if (NULL == stt || NULL == state) {
359 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
360 return STT_ERROR_INVALID_PARAMETER;
363 stt_client_s* client = stt_client_get(stt);
365 if (NULL == client) {
366 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
367 return STT_ERROR_INVALID_PARAMETER;
370 *state = client->current_state;
373 case STT_STATE_CREATED: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'CREATED'"); break;
374 case STT_STATE_READY: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'Ready'"); break;
375 case STT_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'Recording'"); break;
376 case STT_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'Processing'"); break;
379 return STT_ERROR_NONE;
382 int stt_is_partial_result_supported(stt_h stt, bool* partial_result)
384 if (NULL == stt || NULL == partial_result) {
385 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
386 return STT_ERROR_INVALID_PARAMETER;
389 stt_client_s* client = stt_client_get(stt);
391 if (NULL == client) {
392 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not valid");
393 return STT_ERROR_INVALID_PARAMETER;
397 if (client->current_state != STT_STATE_READY) {
398 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not READY");
399 return STT_ERROR_INVALID_STATE;
403 ret = stt_dbus_request_is_partial_result_supported(client->uid, partial_result);
406 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get partial result supported");
408 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Partial result supporting is %s", *partial_result ? "true " : "false");
411 return STT_ERROR_NONE;
414 int stt_set_profanity_filter(stt_h stt, stt_option_profanity_e type)
417 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
418 return STT_ERROR_INVALID_PARAMETER;
421 stt_client_s* client = stt_client_get(stt);
423 if (NULL == client) {
424 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
425 return STT_ERROR_INVALID_PARAMETER;
429 if (client->current_state != STT_STATE_READY) {
430 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not READY");
431 return STT_ERROR_INVALID_STATE;
434 if (true == client->profanity_supported) {
435 if (type >= STT_OPTION_PROFANITY_FALSE && type <= STT_OPTION_PROFANITY_AUTO)
436 client->profanity = type;
438 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Type is invalid");
439 return STT_ERROR_INVALID_PARAMETER;
442 return STT_ERROR_NOT_SUPPORTED_FEATURE;
445 return STT_ERROR_NONE;
448 int stt_set_punctuation_override(stt_h stt, stt_option_punctuation_e type)
451 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
452 return STT_ERROR_INVALID_PARAMETER;
455 stt_client_s* client = stt_client_get(stt);
457 if (NULL == client) {
458 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
459 return STT_ERROR_INVALID_PARAMETER;
463 if (client->current_state != STT_STATE_READY) {
464 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not READY");
465 return STT_ERROR_INVALID_STATE;
468 if (true == client->punctuation_supported) {
469 if (type >= STT_OPTION_PUNCTUATION_FALSE && type <= STT_OPTION_PUNCTUATION_AUTO)
470 client->punctuation = type;
472 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Type is invalid");
473 return STT_ERROR_INVALID_PARAMETER;
476 return STT_ERROR_NOT_SUPPORTED_FEATURE;
479 return STT_ERROR_NONE;
482 int stt_set_silence_detection(stt_h stt, stt_option_silence_detection_e type)
485 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
486 return STT_ERROR_INVALID_PARAMETER;
489 stt_client_s* client = stt_client_get(stt);
491 if (NULL == client) {
492 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
493 return STT_ERROR_INVALID_PARAMETER;
497 if (client->current_state != STT_STATE_READY) {
498 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not READY");
499 return STT_ERROR_INVALID_STATE;
502 if (true == client->silence_supported) {
503 if (type >= STT_OPTION_SILENCE_DETECTION_FALSE && type <= STT_OPTION_SILENCE_DETECTION_AUTO)
504 client->silence = type;
506 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Type is invalid");
507 return STT_ERROR_INVALID_PARAMETER;
510 return STT_ERROR_NOT_SUPPORTED_FEATURE;
513 return STT_ERROR_NONE;
516 int stt_start(stt_h stt, const char* language, const char* type)
518 SLOG(LOG_DEBUG, TAG_STTC, "===== STT START");
521 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
522 SLOG(LOG_DEBUG, TAG_STTC, "=====");
523 SLOG(LOG_DEBUG, TAG_STTC, " ");
524 return STT_ERROR_INVALID_PARAMETER;
527 stt_client_s* client = stt_client_get(stt);
530 if (NULL == client) {
531 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
532 SLOG(LOG_DEBUG, TAG_STTC, "=====");
533 SLOG(LOG_DEBUG, TAG_STTC, " ");
534 return STT_ERROR_INVALID_PARAMETER;
538 if (client->current_state != STT_STATE_READY) {
539 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not READY");
540 SLOG(LOG_DEBUG, TAG_STTC, "=====");
541 SLOG(LOG_DEBUG, TAG_STTC, " ");
542 return STT_ERROR_INVALID_STATE;
546 if (NULL == language) {
547 temp = strdup("default");
549 temp = strdup(language);
554 ret = stt_dbus_request_start(client->uid, temp, type, client->profanity, client->punctuation, client->silence);
557 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to start");
559 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS]");
561 client->before_state = client->current_state;
562 client->current_state = STT_STATE_RECORDING;
564 ecore_timer_add(0, __stt_notify_state_changed, (void*)stt);
569 SLOG(LOG_DEBUG, TAG_STTC, "=====");
570 SLOG(LOG_DEBUG, TAG_STTC, " ");
575 int stt_stop(stt_h stt)
577 SLOG(LOG_DEBUG, TAG_STTC, "===== STT STOP");
580 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] [ERROR] Input parameter is NULL");
581 SLOG(LOG_DEBUG, TAG_STTC, "=====");
582 SLOG(LOG_DEBUG, TAG_STTC, " ");
583 return STT_ERROR_INVALID_PARAMETER;
586 stt_client_s* client = stt_client_get(stt);
589 if (NULL == client) {
590 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
591 SLOG(LOG_DEBUG, TAG_STTC, "=====");
592 SLOG(LOG_DEBUG, TAG_STTC, " ");
593 return STT_ERROR_INVALID_PARAMETER;
597 if (client->current_state != STT_STATE_RECORDING) {
598 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Current state is NOT RECORDING");
599 SLOG(LOG_DEBUG, TAG_STTC, "=====");
600 SLOG(LOG_DEBUG, TAG_STTC, " ");
601 return STT_ERROR_INVALID_STATE;
606 ret = stt_dbus_request_stop(client->uid);
608 SLOG(LOG_DEBUG, TAG_STTC, "[ERROR] Fail to stop");
610 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS]");
612 client->before_state = client->current_state;
613 client->current_state = STT_STATE_PROCESSING;
615 ecore_timer_add(0, __stt_notify_state_changed, (void*)stt);
618 SLOG(LOG_DEBUG, TAG_STTC, "=====");
619 SLOG(LOG_DEBUG, TAG_STTC, " ");
625 int stt_cancel(stt_h stt)
627 SLOG(LOG_DEBUG, TAG_STTC, "===== STT CANCEL");
630 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input handle is null");
631 SLOG(LOG_DEBUG, TAG_STTC, "=====");
632 SLOG(LOG_DEBUG, TAG_STTC, " ");
633 return STT_ERROR_INVALID_PARAMETER;
636 stt_client_s* client = stt_client_get(stt);
639 if (NULL == client) {
640 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
641 SLOG(LOG_DEBUG, TAG_STTC, "=====");
642 SLOG(LOG_DEBUG, TAG_STTC, " ");
643 return STT_ERROR_INVALID_PARAMETER;
647 if (STT_STATE_RECORDING != client->current_state && STT_STATE_PROCESSING != client->current_state) {
648 SLOG(LOG_DEBUG, TAG_STTC, "[ERROR] Invalid state : Current state is 'Ready'");
649 SLOG(LOG_DEBUG, TAG_STTC, "=====");
650 SLOG(LOG_DEBUG, TAG_STTC, " ");
651 return STT_ERROR_INVALID_STATE;
656 ret = stt_dbus_request_cancel(client->uid);
658 SLOG(LOG_DEBUG, TAG_STTC, "[ERROR] Fail to cancel");
660 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS]");
662 client->before_state = client->current_state;
663 client->current_state = STT_STATE_READY;
665 ecore_timer_add(0, __stt_notify_state_changed, (void*)stt);
668 SLOG(LOG_DEBUG, TAG_STTC, "=====");
669 SLOG(LOG_DEBUG, TAG_STTC, " ");
674 static int __stt_get_audio_volume(float* volume)
676 FILE* fp = fopen(STT_AUDIO_VOLUME_PATH, "rb");
678 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to open Volume File");
679 return STT_ERROR_OPERATION_FAILED;
682 int readlen = fread((void*)volume, sizeof(*volume), 1, fp);
691 int stt_get_recording_volume(stt_h stt, float* volume)
693 if (NULL == stt || NULL == volume) {
694 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
695 return STT_ERROR_INVALID_PARAMETER;
698 stt_client_s* client = stt_client_get(stt);
701 if (NULL == client) {
702 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
703 return STT_ERROR_INVALID_PARAMETER;
706 if (STT_STATE_RECORDING != client->current_state) {
707 SLOG(LOG_DEBUG, TAG_STTC, "[ERROR] Invalid state : NO 'Recording' state");
708 return STT_ERROR_INVALID_STATE;
712 ret = __stt_get_audio_volume(volume);
714 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get audio volume");
715 return STT_ERROR_OPERATION_FAILED;
718 return STT_ERROR_NONE;
721 int stt_start_file_recognition(stt_h stt, const char* filepath, const char* language, const char* type)
723 if (NULL == stt || NULL == type || NULL == filepath) {
724 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
725 return STT_ERROR_INVALID_PARAMETER;
728 stt_client_s* client = stt_client_get(stt);
731 if (NULL == client) {
732 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
733 return STT_ERROR_INVALID_PARAMETER;
736 if (STT_STATE_READY != client->current_state) {
737 SLOG(LOG_DEBUG, TAG_STTC, "[ERROR] Invalid state : NO 'Ready' state");
738 return STT_ERROR_INVALID_STATE;
742 if (NULL == language) {
743 temp = strdup("default");
745 temp = strdup(language);
749 ret = stt_dbus_request_start_file_recognition(client->uid, filepath, temp, type, client->profanity, client->punctuation);
752 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to start");
754 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS]");
756 client->before_state = client->current_state;
757 client->current_state = STT_STATE_PROCESSING;
759 ecore_timer_add(0, __stt_notify_state_changed, (void*)stt);
764 return STT_ERROR_NONE;
767 static Eina_Bool __stt_notify_error(void *data)
769 stt_h stt = (stt_h)data;
771 stt_client_s* client = stt_client_get(stt);
774 if (NULL == client) {
775 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
779 if (NULL != client->error_cb) {
780 stt_client_use_callback(client);
781 client->error_cb(client->stt, client->reason, client->error_user_data);
782 stt_client_not_use_callback(client);
783 SLOG(LOG_DEBUG, TAG_STTC, "Error callback is called");
785 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Error callback is null");
791 int __stt_cb_error(int uid, int reason)
793 stt_client_s* client = stt_client_get_by_uid(uid);
794 if( NULL == client ) {
795 SLOG(LOG_ERROR, TAG_STTC, "Handle not found\n");
799 client->reason = reason;
801 if (NULL != client->error_cb) {
802 ecore_timer_add(0, __stt_notify_error, client->stt);
804 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Error callback is null");
810 static Eina_Bool __stt_notify_result(void *data)
812 stt_h stt = (stt_h)data;
814 stt_client_s* client = stt_client_get(stt);
817 if (NULL == client) {
818 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
822 if (NULL != client->result_cb) {
823 stt_client_use_callback(client);
824 client->result_cb(client->stt, client->type, (const char**)client->data_list, client->data_count, client->msg, client->result_user_data);
825 stt_client_not_use_callback(client);
826 SLOG(LOG_DEBUG, TAG_STTC, "client result callback called");
828 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] User result callback is null");
832 if (NULL != client->type)
835 if (NULL != client->data_list) {
837 temp = client->data_list;
840 for (i = 0;i < client->data_count;i++) {
844 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result data is error");
846 free(client->data_list);
849 if (NULL != client->msg)
852 client->data_count = 0;
857 static Eina_Bool __stt_notify_state_changed(void *data)
859 stt_h stt = (stt_h)data;
861 stt_client_s* client = stt_client_get(stt);
864 if (NULL == client) {
865 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
869 if (NULL != client->state_changed_cb) {
870 stt_client_use_callback(client);
871 client->state_changed_cb(client->stt, client->before_state, client->current_state, client->state_changed_user_data);
872 stt_client_not_use_callback(client);
873 SLOG(LOG_DEBUG, TAG_STTC, "State changed callback is called");
875 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
881 int __stt_cb_result(int uid, const char* type, const char** data, int data_count, const char* msg)
883 stt_client_s* client = NULL;
885 client = stt_client_get_by_uid(uid);
886 if (NULL == client) {
887 SLOG(LOG_ERROR, TAG_STTC, "Handle is NOT valid");
891 SLOG(LOG_DEBUG, TAG_STTC, "Recognition Result Message = %s", msg);
894 for (i = 0;i < data_count;i++) {
896 SLOG(LOG_DEBUG, TAG_STTC, "Recognition Result[%d] = %s", i, data[i]);
899 if (NULL != client->result_cb) {
900 client->type = strdup(type);
901 client->msg = strdup(msg);
902 client->data_count = data_count;
904 if (data_count > 0) {
906 temp = malloc( sizeof(char*) * data_count);
908 for (i = 0;i < data_count;i++) {
910 temp[i] = strdup(data[i]);
912 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Result data is error");
915 client->data_list = temp;
918 ecore_timer_add(0, __stt_notify_result, client->stt);
920 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] User result callback is null");
923 client->before_state = client->current_state;
924 client->current_state = STT_STATE_READY;
926 if (NULL != client->state_changed_cb) {
927 ecore_timer_add(0, __stt_notify_state_changed, client->stt);
929 SLOG(LOG_WARN, TAG_STTC, "[WARNING] State changed callback is null");
935 static Eina_Bool __stt_notify_partial_result(void *data)
937 stt_h stt = (stt_h)data;
939 stt_client_s* client = stt_client_get(stt);
942 if (NULL == client) {
943 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to notify error : A handle is not valid");
947 if (client->partial_result_cb) {
948 stt_client_use_callback(client);
949 client->partial_result_cb(client->stt, client->partial_result, client->partial_result_user_data);
950 stt_client_not_use_callback(client);
951 SLOG(LOG_DEBUG, TAG_STTC, "Partial result callback is called");
953 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Partial result callback is null");
956 if (NULL != client->partial_result)
957 free(client->partial_result);
962 int __stt_cb_partial_result(int uid, const char* data)
964 stt_client_s* client = NULL;
966 client = stt_client_get_by_uid(uid);
967 if (NULL == client) {
968 SLOG(LOG_ERROR, TAG_STTC, "Handle is NOT valid");
972 if (client->current_state == STT_STATE_READY) {
973 SLOG(LOG_ERROR, TAG_STTC, "Current state has already been 'Ready' state");
977 if (client->partial_result_cb) {
978 client->partial_result = strdup(data);
979 ecore_timer_add(0, __stt_notify_partial_result, client->stt);
981 SLOG(LOG_WARN, TAG_STTC, "[WARNING] Partial result callback is null");
987 int __stt_cb_set_state(int uid, int state)
989 stt_client_s* client = stt_client_get_by_uid(uid);
990 if( NULL == client ) {
991 SLOG(LOG_ERROR, TAG_STTC, "Handle not found");
995 stt_state_e state_from_daemon = (stt_state_e)state;
997 if (client->current_state == state_from_daemon) {
998 SLOG(LOG_DEBUG, TAG_STTC, "Current state has already been %d", client->current_state);
1002 client->before_state = client->current_state;
1003 client->current_state = state_from_daemon;
1005 ecore_timer_add(0, __stt_notify_state_changed, client->stt);
1009 int stt_set_result_cb(stt_h stt, stt_result_cb callback, void* user_data)
1011 if (stt == NULL || callback == NULL)
1012 return STT_ERROR_INVALID_PARAMETER;
1014 stt_client_s* client = stt_client_get(stt);
1017 if (NULL == client) {
1018 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1019 return STT_ERROR_INVALID_PARAMETER;
1022 if (STT_STATE_CREATED != client->current_state) {
1023 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'.");
1024 return STT_ERROR_INVALID_STATE;
1027 client->result_cb = callback;
1028 client->result_user_data = user_data;
1033 int stt_unset_result_cb(stt_h stt)
1036 return STT_ERROR_INVALID_PARAMETER;
1038 stt_client_s* client = stt_client_get(stt);
1041 if (NULL == client) {
1042 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1043 return STT_ERROR_INVALID_PARAMETER;
1046 if (STT_STATE_CREATED != client->current_state) {
1047 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'.");
1048 return STT_ERROR_INVALID_STATE;
1051 client->result_cb = NULL;
1052 client->result_user_data = NULL;
1057 int stt_set_partial_result_cb(stt_h stt, stt_partial_result_cb callback, void* user_data)
1059 if (NULL == stt || NULL == callback)
1060 return STT_ERROR_INVALID_PARAMETER;
1062 stt_client_s* client = stt_client_get(stt);
1065 if (NULL == client) {
1066 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1067 return STT_ERROR_INVALID_PARAMETER;
1070 if (STT_STATE_CREATED != client->current_state) {
1071 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'.");
1072 return STT_ERROR_INVALID_STATE;
1075 client->partial_result_cb = callback;
1076 client->partial_result_user_data = user_data;
1081 int stt_unset_partial_result_cb(stt_h stt)
1084 return STT_ERROR_INVALID_PARAMETER;
1086 stt_client_s* client = stt_client_get(stt);
1089 if (NULL == client) {
1090 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1091 return STT_ERROR_INVALID_PARAMETER;
1094 if (STT_STATE_CREATED != client->current_state) {
1095 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'.");
1096 return STT_ERROR_INVALID_STATE;
1099 client->partial_result_cb = NULL;
1100 client->partial_result_user_data = NULL;
1105 int stt_set_state_changed_cb(stt_h stt, stt_state_changed_cb callback, void* user_data)
1107 if (NULL == stt || NULL == callback)
1108 return STT_ERROR_INVALID_PARAMETER;
1110 stt_client_s* client = stt_client_get(stt);
1113 if (NULL == client) {
1114 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1115 return STT_ERROR_INVALID_PARAMETER;
1118 if (STT_STATE_CREATED != client->current_state) {
1119 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'.");
1120 return STT_ERROR_INVALID_STATE;
1123 client->state_changed_cb = callback;
1124 client->state_changed_user_data = user_data;
1129 int stt_unset_state_changed_cb(stt_h stt)
1132 return STT_ERROR_INVALID_PARAMETER;
1134 stt_client_s* client = stt_client_get(stt);
1137 if (NULL == client) {
1138 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1139 return STT_ERROR_INVALID_PARAMETER;
1142 if (STT_STATE_CREATED != client->current_state) {
1143 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'.");
1144 return STT_ERROR_INVALID_STATE;
1147 client->state_changed_cb = NULL;
1148 client->state_changed_user_data = NULL;
1154 int stt_set_error_cb(stt_h stt, stt_error_cb callback, void* user_data)
1156 if (NULL == stt || NULL == callback)
1157 return STT_ERROR_INVALID_PARAMETER;
1159 stt_client_s* client = stt_client_get(stt);
1162 if (NULL == client) {
1163 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1164 return STT_ERROR_INVALID_PARAMETER;
1167 if (STT_STATE_CREATED != client->current_state) {
1168 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'.");
1169 return STT_ERROR_INVALID_STATE;
1172 client->error_cb = callback;
1173 client->error_user_data = user_data;
1178 int stt_unset_error_cb(stt_h stt)
1181 return STT_ERROR_INVALID_PARAMETER;
1183 stt_client_s* client = stt_client_get(stt);
1186 if (NULL == client) {
1187 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
1188 return STT_ERROR_INVALID_PARAMETER;
1191 if (STT_STATE_CREATED != client->current_state) {
1192 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'.");
1193 return STT_ERROR_INVALID_STATE;
1196 client->error_cb = NULL;
1197 client->error_user_data = NULL;
1202 int __get_cmd_line(char *file, char *buf)
1206 fp = fopen(file, "r");
1208 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get command line");
1212 memset(buf, 0, 256);
1213 if (NULL == fgets(buf, 256, fp)) {
1214 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to fget command line");
1223 static bool __stt_is_alive()
1226 struct dirent *entry;
1227 struct stat filestat;
1233 dir = opendir("/proc");
1235 SLOG(LOG_ERROR, TAG_STTC, "process checking is FAILED");
1239 while ((entry = readdir(dir)) != NULL) {
1240 if (0 != lstat(entry->d_name, &filestat))
1243 if (!S_ISDIR(filestat.st_mode))
1246 pid = atoi(entry->d_name);
1247 if (pid <= 0) continue;
1249 sprintf(tempPath, "/proc/%d/cmdline", pid);
1250 if (0 != __get_cmd_line(tempPath, cmdLine)) {
1253 if ( 0 == strncmp(cmdLine, "[stt-daemon]", strlen("[stt-daemon]")) ||
1254 0 == strncmp(cmdLine, "stt-daemon", strlen("stt-daemon")) ||
1255 0 == strncmp(cmdLine, "/usr/bin/stt-daemon", strlen("/usr/bin/stt-daemon"))) {
1256 SLOG(LOG_DEBUG, TAG_STTC, "stt-daemon is ALIVE !! \n");
1261 SLOG(LOG_DEBUG, TAG_STTC, "THERE IS NO stt-daemon !! \n");
1268 static int __check_stt_daemon()
1270 if( TRUE == __stt_is_alive() )
1273 /* fork-exec stt-daemon */
1280 SLOG(LOG_DEBUG, TAG_STTC, "[STT ERROR] fail to create STT-DAEMON \n");
1285 for (i = 0;i < _NSIG;i++)
1288 execl("/usr/bin/stt-daemon", "/usr/bin/stt-daemon", NULL);