2 * Copyright (c) 2011 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>
21 #include "stt_client.h"
24 #define CONNECTION_RETRY_COUNT 3
26 int __check_stt_daemon();
28 int stt_create(stt_h* stt)
32 SLOG(LOG_DEBUG, TAG_STTC, "===== Create STT");
35 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is null");
36 return STT_ERROR_INVALID_PARAMETER;
39 /* check stt-daemon. */
42 if (0 == stt_client_get_size()) {
43 if (0 != stt_dbus_open_connection()) {
44 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to open connection\n ");
45 return STT_ERROR_OPERATION_FAILED;
49 if (0 != stt_client_new(stt)) {
50 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to create client!!!!!");
51 return STT_ERROR_OUT_OF_MEMORY;
54 /* request initialization */
57 ret = stt_dbus_request_initialize((*stt)->handle);
59 if (STT_ERROR_ENGINE_NOT_FOUND == ret) {
60 stt_client_destroy(*stt);
61 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to initialize : STT Engine Not founded");
65 if(CONNECTION_RETRY_COUNT == i) {
66 stt_client_destroy(*stt);
67 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to initialize : TIMED OUT");
68 return STT_ERROR_TIMED_OUT;
72 /* success to connect stt-daemon */
77 SLOG(LOG_DEBUG, TAG_STTC, "[Success] uid(%d)", (*stt)->handle);
79 SLOG(LOG_DEBUG, TAG_STTC, "=====");
80 SLOG(LOG_DEBUG, TAG_STTC, " ");
82 return STT_ERROR_NONE;
85 int stt_destroy(stt_h stt)
87 SLOG(LOG_DEBUG, TAG_STTC, "===== Destroy STT");
90 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input handle is null");
91 SLOG(LOG_DEBUG, TAG_STTC, "=====");
92 SLOG(LOG_DEBUG, TAG_STTC, " ");
93 return STT_ERROR_INVALID_PARAMETER;
96 stt_client_s* client = stt_client_get(stt);
100 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
101 return STT_ERROR_INVALID_PARAMETER;
104 int ret = stt_dbus_request_finalize(client->uid);
106 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to request finalize");
110 stt_client_destroy(stt);
112 SLOG(LOG_DEBUG, TAG_STTC, "Success: destroy");
114 if (0 == stt_client_get_size()) {
115 if (0 != stt_dbus_close_connection()) {
116 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to close connection\n ");
120 SLOG(LOG_DEBUG, TAG_STTC, "=====");
121 SLOG(LOG_DEBUG, TAG_STTC, " ");
123 return STT_ERROR_NONE;
126 int stt_foreach_supported_languages(stt_h stt, stt_supported_language_cb callback, void* user_data)
128 SLOG(LOG_DEBUG, TAG_STTC, "===== Foreach Supported Language");
130 if (NULL == stt || NULL == callback) {
131 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
132 SLOG(LOG_DEBUG, TAG_STTC, "=====");
133 SLOG(LOG_DEBUG, TAG_STTC, " ");
134 return STT_ERROR_INVALID_PARAMETER;
137 stt_client_s* client = stt_client_get(stt);
140 if (NULL == client) {
141 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
142 SLOG(LOG_DEBUG, TAG_STTC, "=====");
143 SLOG(LOG_DEBUG, TAG_STTC, " ");
144 return STT_ERROR_INVALID_PARAMETER;
148 ret = stt_dbus_request_get_support_langs(client->uid, client->stt, callback, user_data);
150 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get languages");
152 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS]");
155 SLOG(LOG_DEBUG, TAG_STTC, "=====");
156 SLOG(LOG_DEBUG, TAG_STTC, " ");
158 return STT_ERROR_NONE;
162 int stt_get_default_language(stt_h stt, char** language)
164 SLOG(LOG_DEBUG, TAG_STTC, "===== Get Default Language");
166 if (NULL == stt || NULL == language) {
167 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
168 SLOG(LOG_DEBUG, TAG_STTC, "=====");
169 SLOG(LOG_DEBUG, TAG_STTC, " ");
170 return STT_ERROR_INVALID_PARAMETER;
173 stt_client_s* client = stt_client_get(stt);
176 if (NULL == client) {
177 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
178 SLOG(LOG_DEBUG, TAG_STTC, "=====");
179 SLOG(LOG_DEBUG, TAG_STTC, " ");
180 return STT_ERROR_INVALID_PARAMETER;
184 ret = stt_dbus_request_get_default_lang(client->uid, language);
187 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail : request get default language");
189 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Current language = %s", *language);
192 SLOG(LOG_DEBUG, TAG_STTC, "=====");
193 SLOG(LOG_DEBUG, TAG_STTC, " ");
198 int stt_get_state(stt_h stt, stt_state_e* state)
200 if (NULL == stt || NULL == state) {
201 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
202 return STT_ERROR_INVALID_PARAMETER;
205 stt_client_s* client = stt_client_get(stt);
207 if (NULL == client) {
208 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
209 return STT_ERROR_INVALID_PARAMETER;
212 *state = client->current_state;
215 case STT_STATE_READY: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'Ready'"); break;
216 case STT_STATE_RECORDING: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'Recording'"); break;
217 case STT_STATE_PROCESSING: SLOG(LOG_DEBUG, TAG_STTC, "Current state is 'Processing'"); break;
220 return STT_ERROR_NONE;
223 int stt_is_partial_result_supported(stt_h stt, bool* partial_result)
225 if (NULL == stt || NULL == partial_result) {
226 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
227 return STT_ERROR_INVALID_PARAMETER;
230 stt_client_s* client = stt_client_get(stt);
232 if (NULL == client) {
233 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not valid");
234 return STT_ERROR_INVALID_PARAMETER;
238 ret = stt_dbus_request_is_partial_result_supported(client->uid, partial_result);
241 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get partial result supported");
243 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS] Partial result supporting is %s", *partial_result ? "true " : "false");
246 return STT_ERROR_NONE;
249 int stt_set_profanity_filter(stt_h stt, stt_option_profanity_e type)
252 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
253 return STT_ERROR_INVALID_PARAMETER;
256 stt_client_s* client = stt_client_get(stt);
258 if (NULL == client) {
259 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
260 return STT_ERROR_INVALID_PARAMETER;
263 if (type >= STT_OPTION_PROFANITY_FALSE && type <= STT_OPTION_PROFANITY_AUTO)
264 client->profanity = type;
266 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Type is invalid");
267 return STT_ERROR_INVALID_PARAMETER;
270 return STT_ERROR_NONE;
273 int stt_set_punctuation_override(stt_h stt, stt_option_punctuation_e type)
276 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
277 return STT_ERROR_INVALID_PARAMETER;
280 stt_client_s* client = stt_client_get(stt);
282 if (NULL == client) {
283 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
284 return STT_ERROR_INVALID_PARAMETER;
287 if (type >= STT_OPTION_PUNCTUATION_FALSE && type <= STT_OPTION_PUNCTUATION_AUTO)
288 client->punctuation = type;
290 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Type is invalid");
291 return STT_ERROR_INVALID_PARAMETER;
294 return STT_ERROR_NONE;
297 int stt_set_silence_detection(stt_h stt, stt_option_silence_detection_e type)
300 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
301 return STT_ERROR_INVALID_PARAMETER;
304 stt_client_s* client = stt_client_get(stt);
306 if (NULL == client) {
307 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Get state : A handle is not valid");
308 return STT_ERROR_INVALID_PARAMETER;
311 if (type >= STT_OPTION_SILENCE_DETECTION_FALSE && type <= STT_OPTION_SILENCE_DETECTION_AUTO)
312 client->silence = type;
314 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Type is invalid");
315 return STT_ERROR_INVALID_PARAMETER;
318 return STT_ERROR_NONE;
321 int stt_start(stt_h stt, const char* language, const char* type)
323 SLOG(LOG_DEBUG, TAG_STTC, "===== STT START");
326 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
327 SLOG(LOG_DEBUG, TAG_STTC, "=====");
328 SLOG(LOG_DEBUG, TAG_STTC, " ");
329 return STT_ERROR_INVALID_PARAMETER;
332 stt_client_s* client = stt_client_get(stt);
335 if (NULL == client) {
336 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
337 SLOG(LOG_DEBUG, TAG_STTC, "=====");
338 SLOG(LOG_DEBUG, TAG_STTC, " ");
339 return STT_ERROR_INVALID_PARAMETER;
343 if (client->current_state != STT_STATE_READY) {
344 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State: Current state is not READY");
345 SLOG(LOG_DEBUG, TAG_STTC, "=====");
346 SLOG(LOG_DEBUG, TAG_STTC, " ");
347 return STT_ERROR_INVALID_STATE;
351 if (NULL == language) {
352 temp = strdup("default");
354 temp = strdup(language);
359 ret = stt_dbus_request_start(client->uid, temp, type, client->profanity, client->punctuation, client->silence);
362 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to start");
364 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS]");
366 if (NULL != client->state_changed_cb) {
367 client->state_changed_cb(client->stt, client->current_state, STT_STATE_RECORDING, client->state_changed_user_data);
368 SLOG(LOG_DEBUG, TAG_STTC, "Called state changed : STT_STATE_RECORDING");
370 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Don't register state changed callback");
373 client->current_state = STT_STATE_RECORDING;
378 SLOG(LOG_DEBUG, TAG_STTC, "=====");
379 SLOG(LOG_DEBUG, TAG_STTC, " ");
384 int stt_stop(stt_h stt)
386 SLOG(LOG_DEBUG, TAG_STTC, "===== STT STOP");
389 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] [ERROR] Input parameter is NULL");
390 SLOG(LOG_DEBUG, TAG_STTC, "=====");
391 SLOG(LOG_DEBUG, TAG_STTC, " ");
392 return STT_ERROR_INVALID_PARAMETER;
395 stt_client_s* client = stt_client_get(stt);
398 if (NULL == client) {
399 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
400 SLOG(LOG_DEBUG, TAG_STTC, "=====");
401 SLOG(LOG_DEBUG, TAG_STTC, " ");
402 return STT_ERROR_INVALID_PARAMETER;
406 if (client->current_state != STT_STATE_RECORDING) {
407 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Invalid State : Current state is NOT RECORDING");
408 SLOG(LOG_DEBUG, TAG_STTC, "=====");
409 SLOG(LOG_DEBUG, TAG_STTC, " ");
410 return STT_ERROR_INVALID_STATE;
415 ret = stt_dbus_request_stop(client->uid);
417 SLOG(LOG_DEBUG, TAG_STTC, "[ERROR] Fail to stop");
419 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS]");
421 if (NULL != client->state_changed_cb) {
422 client->state_changed_cb(client->stt, client->current_state, STT_STATE_PROCESSING, client->state_changed_user_data);
423 SLOG(LOG_DEBUG, TAG_STTC, "Called state changed : STT_STATE_PROCESSING");
425 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Don't register state changed callback");
428 client->current_state = STT_STATE_PROCESSING;
431 SLOG(LOG_DEBUG, TAG_STTC, "=====");
432 SLOG(LOG_DEBUG, TAG_STTC, " ");
438 int stt_cancel(stt_h stt)
440 SLOG(LOG_DEBUG, TAG_STTC, "===== STT CANCEL");
443 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input handle is null");
444 SLOG(LOG_DEBUG, TAG_STTC, "=====");
445 SLOG(LOG_DEBUG, TAG_STTC, " ");
446 return STT_ERROR_INVALID_PARAMETER;
449 stt_client_s* client = stt_client_get(stt);
452 if (NULL == client) {
453 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
454 SLOG(LOG_DEBUG, TAG_STTC, "=====");
455 SLOG(LOG_DEBUG, TAG_STTC, " ");
456 return STT_ERROR_INVALID_PARAMETER;
460 if (STT_STATE_RECORDING != client->current_state && STT_STATE_PROCESSING != client->current_state) {
461 SLOG(LOG_DEBUG, TAG_STTC, "[ERROR] Invalid state : Current state is 'Ready'");
462 SLOG(LOG_DEBUG, TAG_STTC, "=====");
463 SLOG(LOG_DEBUG, TAG_STTC, " ");
464 return STT_ERROR_INVALID_STATE;
469 ret = stt_dbus_request_cancel(client->uid);
471 SLOG(LOG_DEBUG, TAG_STTC, "[ERROR] Fail to cancel");
473 SLOG(LOG_DEBUG, TAG_STTC, "[SUCCESS]");
474 if (NULL != client->state_changed_cb) {
475 client->state_changed_cb(client->stt, client->current_state, STT_STATE_READY, client->state_changed_user_data);
476 SLOG(LOG_DEBUG, TAG_STTC, "Called state changed : STT_STATE_READY");
478 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Don't register state changed callback");
481 client->current_state = STT_STATE_READY;
484 SLOG(LOG_DEBUG, TAG_STTC, "=====");
485 SLOG(LOG_DEBUG, TAG_STTC, " ");
490 int stt_get_recording_volume(stt_h stt, float* volume)
492 if (NULL == stt || NULL == volume) {
493 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Input parameter is NULL");
494 return STT_ERROR_INVALID_PARAMETER;
497 stt_client_s* client = stt_client_get(stt);
500 if (NULL == client) {
501 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
502 return STT_ERROR_INVALID_PARAMETER;
505 if (STT_STATE_RECORDING != client->current_state) {
506 SLOG(LOG_DEBUG, TAG_STTC, "[ERROR] Invalid state : NO 'Recording' state");
507 return STT_ERROR_INVALID_STATE;
511 ret = stt_dbus_request_get_audio_volume(client->uid, volume);
513 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Fail to get audio volume");
517 return STT_ERROR_NONE;
520 int __stt_cb_error(int uid, int reason)
522 stt_client_s* client = stt_client_get_by_uid(uid);
523 if( NULL == client ) {
524 SLOG(LOG_ERROR, TAG_STTC, "Handle not found\n");
528 client->current_state = STT_STATE_READY;
530 if (NULL != client->error_cb) {
531 stt_client_use_callback(client);
532 client->error_cb(client->stt, reason, client->error_user_data);
533 stt_client_not_use_callback(client);
534 SLOG(LOG_DEBUG, TAG_STTC, "client error callback called");
536 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Error occur but user callback is null");
542 int __stt_cb_result(int uid, const char* type, const char** data, int data_count, const char* msg)
544 stt_client_s* client = NULL;
546 client = stt_client_get_by_uid(uid);
547 if (NULL == client) {
548 SLOG(LOG_ERROR, TAG_STTC, "Handle is NOT valid");
552 SLOG(LOG_DEBUG, TAG_STTC, "Recognition Result Message = %s", msg);
555 for (i = 0;i < data_count;i++) {
557 SLOG(LOG_DEBUG, TAG_STTC, "Recognition Result[%d] = %s", i, data[i]);
560 if (NULL != client->result_cb) {
561 stt_client_use_callback(client);
562 client->result_cb(client->stt, type, data, data_count, msg, client->result_user_data);
563 stt_client_not_use_callback(client);
564 SLOG(LOG_DEBUG, TAG_STTC, "client result callback called");
566 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] User result callback is null");
569 if (NULL != client->state_changed_cb) {
570 client->state_changed_cb(client->stt, client->current_state, STT_STATE_READY, client->state_changed_user_data);
571 SLOG(LOG_DEBUG, TAG_STTC, "client state changed callback called");
573 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Don't register result callback");
576 client->current_state = STT_STATE_READY;
581 int __stt_cb_partial_result(int uid, const char* data)
583 stt_client_s* client = NULL;
585 client = stt_client_get_by_uid(uid);
586 if (NULL == client) {
587 SLOG(LOG_ERROR, TAG_STTC, "Handle is NOT valid");
591 if (client->current_state == STT_STATE_READY) {
592 SLOG(LOG_ERROR, TAG_STTC, "Current state has already been 'Ready' state");
596 if (client->partial_result_cb) {
597 stt_client_use_callback(client);
598 client->partial_result_cb(client->stt, data, client->partial_result_user_data);
599 stt_client_not_use_callback(client);
600 SLOG(LOG_DEBUG, TAG_STTC, "client partial result callback called");
602 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Don't register partial result callback");
608 int __stt_cb_stop_by_daemon(int uid)
610 stt_client_s* client = stt_client_get_by_uid(uid);
611 if( NULL == client ) {
612 SLOG(LOG_ERROR, TAG_STTC, "Handle not found\n");
616 if (client->current_state != STT_STATE_RECORDING) {
617 SLOG(LOG_ERROR, TAG_STTC, "Current state is NOT 'Recording' state");
621 if (NULL != client->state_changed_cb) {
622 stt_client_use_callback(client);
623 client->state_changed_cb(client->stt, client->current_state, STT_STATE_PROCESSING, client->state_changed_user_data);
624 stt_client_not_use_callback(client);
625 SLOG(LOG_DEBUG, TAG_STTC, "client state changed callback called");
627 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Error occur but user callback is null");
630 client->current_state = STT_STATE_PROCESSING;
635 int stt_set_result_cb(stt_h stt, stt_result_cb callback, void* user_data)
637 if (stt == NULL || callback == NULL)
638 return STT_ERROR_INVALID_PARAMETER;
640 stt_client_s* client = stt_client_get(stt);
643 if (NULL == client) {
644 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
645 return STT_ERROR_INVALID_PARAMETER;
648 if (STT_STATE_READY != client->current_state) {
649 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'.");
650 return STT_ERROR_INVALID_STATE;
653 client->result_cb = callback;
654 client->result_user_data = user_data;
659 int stt_unset_result_cb(stt_h stt)
662 return STT_ERROR_INVALID_PARAMETER;
664 stt_client_s* client = stt_client_get(stt);
667 if (NULL == client) {
668 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
669 return STT_ERROR_INVALID_PARAMETER;
672 if (STT_STATE_READY != client->current_state) {
673 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'.");
674 return STT_ERROR_INVALID_STATE;
677 client->result_cb = NULL;
678 client->result_user_data = NULL;
683 int stt_set_partial_result_cb(stt_h stt, stt_partial_result_cb callback, void* user_data)
685 if (NULL == stt || NULL == callback)
686 return STT_ERROR_INVALID_PARAMETER;
688 stt_client_s* client = stt_client_get(stt);
691 if (NULL == client) {
692 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
693 return STT_ERROR_INVALID_PARAMETER;
696 if (STT_STATE_READY != client->current_state) {
697 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'.");
698 return STT_ERROR_INVALID_STATE;
701 client->partial_result_cb = callback;
702 client->partial_result_user_data = user_data;
707 int stt_unset_partial_result_cb(stt_h stt)
710 return STT_ERROR_INVALID_PARAMETER;
712 stt_client_s* client = stt_client_get(stt);
715 if (NULL == client) {
716 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
717 return STT_ERROR_INVALID_PARAMETER;
720 if (STT_STATE_READY != client->current_state) {
721 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'.");
722 return STT_ERROR_INVALID_STATE;
725 client->partial_result_cb = NULL;
726 client->partial_result_user_data = NULL;
731 int stt_set_state_changed_cb(stt_h stt, stt_state_changed_cb callback, void* user_data)
733 if (NULL == stt || NULL == callback)
734 return STT_ERROR_INVALID_PARAMETER;
736 stt_client_s* client = stt_client_get(stt);
739 if (NULL == client) {
740 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
741 return STT_ERROR_INVALID_PARAMETER;
744 if (STT_STATE_READY != client->current_state) {
745 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'.");
746 return STT_ERROR_INVALID_STATE;
749 client->state_changed_cb = callback;
750 client->state_changed_user_data = user_data;
755 int stt_unset_state_changed_cb(stt_h stt)
758 return STT_ERROR_INVALID_PARAMETER;
760 stt_client_s* client = stt_client_get(stt);
763 if (NULL == client) {
764 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
765 return STT_ERROR_INVALID_PARAMETER;
768 if (STT_STATE_READY != client->current_state) {
769 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'.");
770 return STT_ERROR_INVALID_STATE;
773 client->state_changed_cb = NULL;
774 client->state_changed_user_data = NULL;
780 int stt_set_error_cb(stt_h stt, stt_error_cb callback, void* user_data)
782 if (NULL == stt || NULL == callback)
783 return STT_ERROR_INVALID_PARAMETER;
785 stt_client_s* client = stt_client_get(stt);
788 if (NULL == client) {
789 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
790 return STT_ERROR_INVALID_PARAMETER;
793 if (STT_STATE_READY != client->current_state) {
794 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'.");
795 return STT_ERROR_INVALID_STATE;
798 client->error_cb = callback;
799 client->error_user_data = user_data;
804 int stt_unset_error_cb(stt_h stt)
807 return STT_ERROR_INVALID_PARAMETER;
809 stt_client_s* client = stt_client_get(stt);
812 if (NULL == client) {
813 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] A handle is not available");
814 return STT_ERROR_INVALID_PARAMETER;
817 if (STT_STATE_READY != client->current_state) {
818 SLOG(LOG_ERROR, TAG_STTC, "[ERROR] Current state is not 'ready'.");
819 return STT_ERROR_INVALID_STATE;
822 client->error_cb = NULL;
823 client->error_user_data = NULL;
828 static bool __stt_is_alive()
835 memset(buff, '\0', 256);
836 memset(cmd, '\0', 256);
838 if ((fp = popen("ps -eo \"cmd\"", "r")) == NULL) {
839 SLOG(LOG_DEBUG, TAG_STTC, "[ERROR] popen error \n");
843 while(fgets(buff, 255, fp)) {
849 sscanf(buff, "%s", cmd);
851 if( 0 == strncmp(cmd, "[stt-daemon]", strlen("[stt-daemon]")) ||
852 0 == strncmp(cmd, "stt-daemon", strlen("stt-daemon")) ||
853 0 == strncmp(cmd, "/usr/bin/stt-daemon", strlen("/usr/bin/stt-daemon"))
865 static void __my_sig_child(int signo, siginfo_t *info, void *data)
868 pid_t child_pid, child_pgid;
870 child_pgid = getpgid(info->si_pid);
871 SLOG(LOG_DEBUG, TAG_STTC, "Signal handler: dead pid = %d, pgid = %d\n", info->si_pid, child_pgid);
873 while((child_pid = waitpid(-1, &status, WNOHANG)) > 0) {
874 if(child_pid == child_pgid)
875 killpg(child_pgid, SIGKILL);
882 int __check_stt_daemon()
884 if( TRUE == __stt_is_alive() )
887 /* fork-exec stt-daemon */
888 SLOG(LOG_DEBUG, TAG_STTC, "THERE IS NO stt-daemon \n");
891 struct sigaction act, dummy;
893 act.sa_handler = NULL;
894 act.sa_sigaction = __my_sig_child;
895 sigemptyset(&act.sa_mask);
896 act.sa_flags = SA_NOCLDSTOP | SA_SIGINFO;
898 if(sigaction(SIGCHLD, &act, &dummy) < 0) {
899 SLOG(LOG_DEBUG, TAG_STTC, "%s\n", "Cannot make a signal handler\n");
907 SLOG(LOG_DEBUG, TAG_STTC, "[STT ERROR] fail to create STT-DAEMON \n");
912 for (i = 0;i < _NSIG;i++)
915 execl("/usr/bin/stt-daemon", "/usr/bin/stt-daemon", NULL);