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.
18 #include "tts_client.h"
21 #define MAX_TEXT_COUNT 1000
22 #define CONNECTION_RETRY_COUNT 3
24 /* Function definition */
25 int __tts_check_tts_daemon();
27 int tts_create(tts_h* tts)
31 SLOG(LOG_DEBUG, TAG_TTSC, "===== Create TTS");
35 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
36 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
37 SLOG(LOG_DEBUG, TAG_TTSC, " ");
38 return TTS_ERROR_INVALID_PARAMETER;
41 /* Check daemon is running */
42 __tts_check_tts_daemon();
44 if (0 == tts_client_get_size()) {
45 if (0 != tts_dbus_open_connection()) {
46 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to open dbus connection\n ");
47 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
48 SLOG(LOG_DEBUG, TAG_TTSC, " ");
49 return TTS_ERROR_OPERATION_FAILED;
53 if (0 != tts_client_new(tts)) {
54 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to create client!!!!!");
55 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
56 SLOG(LOG_DEBUG, TAG_TTSC, " ");
57 return TTS_ERROR_OUT_OF_MEMORY;
60 /* do request initialize */
63 ret = tts_dbus_request_initialize((*tts)->handle);
65 if (TTS_ERROR_ENGINE_NOT_FOUND == ret) {
66 tts_client_destroy(*tts);
67 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Engine not found");
68 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
69 SLOG(LOG_DEBUG, TAG_TTSC, " ");
73 if (i == CONNECTION_RETRY_COUNT) {
74 tts_client_destroy(*tts);
75 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Connection Time out");
76 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
77 SLOG(LOG_DEBUG, TAG_TTSC, " ");
78 return TTS_ERROR_TIMED_OUT;
82 /* success to connect tts-daemon */
87 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] uid(%d)", (*tts)->handle);
89 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
90 SLOG(LOG_DEBUG, TAG_TTSC, " ");
92 return TTS_ERROR_NONE;
95 int tts_destroy(tts_h tts)
97 SLOG(LOG_DEBUG, TAG_TTSC, "===== Destroy TTS");
100 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
101 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
102 SLOG(LOG_DEBUG, TAG_TTSC, " ");
103 return TTS_ERROR_INVALID_PARAMETER;
106 tts_client_s* client = tts_client_get(tts);
109 if (NULL == client) {
110 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
111 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
112 SLOG(LOG_DEBUG, TAG_TTSC, " ");
113 return TTS_ERROR_INVALID_PARAMETER;
116 /* Request Finalize */
117 int ret = tts_dbus_request_finalize(client->uid);
119 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request finalize ");
123 tts_client_destroy(tts);
125 if (0 == tts_client_get_size()) {
126 if (0 != tts_dbus_close_connection()) {
127 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to close connection\n ");
131 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
132 SLOG(LOG_DEBUG, TAG_TTSC, " ");
134 return TTS_ERROR_NONE;
137 int tts_foreach_supported_voices(tts_h tts, tts_supported_voice_cb callback, void* user_data)
139 SLOG(LOG_DEBUG, TAG_TTSC, "===== Foreach supported voices");
141 if (NULL == tts || NULL == callback) {
142 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
143 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
144 SLOG(LOG_DEBUG, TAG_TTSC, " ");
145 return TTS_ERROR_INVALID_PARAMETER;
148 tts_client_s* client = tts_client_get(tts);
151 if (NULL == client) {
152 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
153 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
154 SLOG(LOG_DEBUG, TAG_TTSC, " ");
155 return TTS_ERROR_INVALID_PARAMETER;
158 if (TTS_STATE_READY != client->current_state) {
159 SLOG(LOG_ERROR, TAG_TTSC, "Current state is NOT 'READY'.\n");
160 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
161 SLOG(LOG_DEBUG, TAG_TTSC, " ");
162 return TTS_ERROR_INVALID_STATE;
166 ret = tts_dbus_request_get_support_voice(client->uid, client->tts, callback, user_data);
168 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
171 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
172 SLOG(LOG_DEBUG, TAG_TTSC, " ");
177 int tts_get_default_voice(tts_h tts, char** lang, tts_voice_type_e* vctype)
179 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get default voice");
182 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
183 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
184 SLOG(LOG_DEBUG, TAG_TTSC, " ");
185 return TTS_ERROR_INVALID_PARAMETER;
188 tts_client_s* client = tts_client_get(tts);
190 if (NULL == client) {
191 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
192 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
193 SLOG(LOG_DEBUG, TAG_TTSC, " ");
194 return TTS_ERROR_INVALID_PARAMETER;
197 if (TTS_STATE_READY != client->current_state) {
198 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is NOT 'READY'. ");
199 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
200 SLOG(LOG_DEBUG, TAG_TTSC, " ");
201 return TTS_ERROR_INVALID_STATE;
204 /* Request call remote method */
206 ret = tts_dbus_request_get_default_voice(client->uid, lang, vctype );
209 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
212 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
213 SLOG(LOG_DEBUG, TAG_TTSC, " ");
218 int tts_get_max_text_count(tts_h tts, int* count)
220 if (NULL == tts || NULL == count) {
221 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Input parameter is null");
222 return TTS_ERROR_INVALID_PARAMETER;
225 tts_client_s* client = tts_client_get(tts);
227 if (NULL == client) {
228 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : A handle is not valid");
229 return TTS_ERROR_INVALID_PARAMETER;
232 if (TTS_STATE_READY != client->current_state) {
233 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Current state is NOT 'READY'.");
234 return TTS_ERROR_INVALID_STATE;
237 *count = MAX_TEXT_COUNT;
239 SLOG(LOG_DEBUG, TAG_TTSC, "[Suceess] Get max text count");
240 return TTS_ERROR_NONE;
243 int tts_get_state(tts_h tts, tts_state_e* state)
245 if (NULL == tts || NULL == state) {
246 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : Input parameter is null");
247 return TTS_ERROR_INVALID_PARAMETER;
250 tts_client_s* client = tts_client_get(tts);
252 if (NULL == client) {
253 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
254 return TTS_ERROR_INVALID_PARAMETER;
257 *state = client->current_state;
260 case TTS_STATE_READY: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Ready'"); break;
261 case TTS_STATE_PLAYING: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Playing'"); break;
262 case TTS_STATE_PAUSED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Paused'"); break;
265 return TTS_ERROR_NONE;
268 int tts_add_text(tts_h tts, const char* text, const char* language, tts_voice_type_e voice_type, tts_speed_e speed, int* utt_id)
270 SLOG(LOG_DEBUG, TAG_TTSC, "===== Add text");
272 if (NULL == tts || NULL == utt_id) {
273 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
274 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
275 SLOG(LOG_DEBUG, TAG_TTSC, " ");
276 return TTS_ERROR_INVALID_PARAMETER;
279 tts_client_s* client = tts_client_get(tts);
281 if (NULL == client) {
282 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
283 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
284 SLOG(LOG_DEBUG, TAG_TTSC, " ");
285 return TTS_ERROR_INVALID_PARAMETER;
288 /* change default language value */
291 if (NULL == language)
292 temp = strdup("default");
294 temp = strdup(language);
296 client->current_utt_id ++;
297 if (client->current_utt_id == 10000) {
298 client->current_utt_id = 1;
303 ret = tts_dbus_request_add_text(client->uid, text, temp, voice_type, speed, client->current_utt_id);
305 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
308 *utt_id = client->current_utt_id;
313 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
314 SLOG(LOG_DEBUG, TAG_TTSC, " ");
319 int tts_play(tts_h tts)
321 SLOG(LOG_DEBUG, TAG_TTSC, "===== Play tts");
324 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
325 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
326 SLOG(LOG_DEBUG, TAG_TTSC, " ");
327 return TTS_ERROR_INVALID_PARAMETER;
330 tts_client_s* client = tts_client_get(tts);
332 if (NULL == client) {
333 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
334 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
335 SLOG(LOG_DEBUG, TAG_TTSC, " ");
336 return TTS_ERROR_INVALID_PARAMETER;
339 if (TTS_STATE_PLAYING == client->current_state) {
340 SLOG(LOG_ERROR, TAG_TTSC, "Current state is 'playing'. This request should be skipped.\n");
341 return TTS_ERROR_INVALID_STATE;
345 ret = tts_dbus_request_play(client->uid);
347 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
348 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
349 SLOG(LOG_DEBUG, TAG_TTSC, " ");
354 client->current_state = TTS_STATE_PLAYING;
356 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
357 SLOG(LOG_DEBUG, TAG_TTSC, " ");
359 return TTS_ERROR_NONE;
363 int tts_stop(tts_h tts)
365 SLOG(LOG_DEBUG, TAG_TTSC, "===== Stop tts");
368 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
369 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
370 SLOG(LOG_DEBUG, TAG_TTSC, " ");
371 return TTS_ERROR_INVALID_PARAMETER;
374 tts_client_s* client = tts_client_get(tts);
376 if (NULL == client) {
377 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
378 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
379 SLOG(LOG_DEBUG, TAG_TTSC, " ");
380 return TTS_ERROR_INVALID_PARAMETER;
383 SLOG(LOG_DEBUG, TAG_TTSC, "change state to ready\n");
384 client->current_state = TTS_STATE_READY;
387 ret = tts_dbus_request_stop(client->uid);
389 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
390 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
391 SLOG(LOG_DEBUG, TAG_TTSC, " ");
395 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
396 SLOG(LOG_DEBUG, TAG_TTSC, " ");
398 return TTS_ERROR_NONE;
402 int tts_pause(tts_h tts)
404 SLOG(LOG_DEBUG, TAG_TTSC, "===== Pause tts");
407 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
408 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
409 SLOG(LOG_DEBUG, TAG_TTSC, " ");
410 return TTS_ERROR_INVALID_PARAMETER;
413 tts_client_s* client = tts_client_get(tts);
415 if (NULL == client) {
416 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
417 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
418 SLOG(LOG_DEBUG, TAG_TTSC, " ");
419 return TTS_ERROR_INVALID_PARAMETER;
422 if (TTS_STATE_PLAYING != client->current_state) {
423 SLOG(LOG_ERROR, TAG_TTSC, "Error : Current state is NOT 'playing'. So this request should be not running.\n");
424 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
425 SLOG(LOG_DEBUG, TAG_TTSC, " ");
426 return TTS_ERROR_INVALID_STATE;
430 ret = tts_dbus_request_pause(client->uid);
432 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
433 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
434 SLOG(LOG_DEBUG, TAG_TTSC, " ");
438 client->current_state = TTS_STATE_PAUSED;
440 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
441 SLOG(LOG_DEBUG, TAG_TTSC, " ");
443 return TTS_ERROR_NONE;
446 int __tts_cb_error(int uid, tts_error_e reason, int utt_id)
448 tts_client_s* client = tts_client_get_by_uid(uid);
450 if (NULL == client) {
451 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
452 return TTS_ERROR_INVALID_PARAMETER;
455 /* call callback function */
456 if (NULL != client->error_cb) {
457 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of error");
458 tts_client_use_callback(client);
459 client->error_cb(client->tts, utt_id, reason, client->error_user_data );
460 tts_client_not_use_callback(client);
462 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error \n");
468 int __tts_cb_interrupt(int uid, tts_interrupted_code_e code)
470 tts_client_s* client = tts_client_get_by_uid(uid);
472 if (NULL == client) {
473 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
474 return TTS_ERROR_INVALID_PARAMETER;
477 /* change state by interrupt code */
478 if (TTS_INTERRUPTED_PAUSED == code) {
479 SLOG(LOG_DEBUG, TAG_TTSC, "change state to ready");
480 client->current_state = TTS_STATE_PAUSED;
481 } else if (TTS_INTERRUPTED_STOPPED == code) {
482 SLOG(LOG_DEBUG, TAG_TTSC, "change state to ready");
483 client->current_state = TTS_STATE_READY;
485 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Interrupt code is not available");
489 /* call callback function */
490 if (NULL != client->interrupted_cb) {
491 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of stopped \n");
492 tts_client_use_callback(client);
493 client->interrupted_cb(client->tts, code, client->interrupted_user_data);
494 tts_client_not_use_callback(client);
496 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of stopped \n");
502 int __tts_cb_utt_started(int uid, int utt_id)
504 tts_client_s* client = tts_client_get_by_uid(uid);
506 if (NULL == client) {
507 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
508 return TTS_ERROR_INVALID_PARAMETER;
511 SLOG(LOG_DEBUG, TAG_TTSC, "utterance started : uttid(%d) \n", utt_id);
513 /* call callback function */
514 if (NULL != client->utt_started_cb) {
515 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance started \n");
516 tts_client_use_callback(client);
517 client->utt_started_cb(client->tts, utt_id, client->utt_started_user_data);
518 tts_client_not_use_callback(client);
520 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance started \n");
526 int __tts_cb_utt_completed(int uid, int utt_id)
528 tts_client_s* client = tts_client_get_by_uid(uid);
530 if (NULL == client) {
531 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
532 return TTS_ERROR_INVALID_PARAMETER;
535 SLOG(LOG_DEBUG, TAG_TTSC, "utterance completed : uttid(%d) \n", utt_id);
537 /* call callback function */
538 if (NULL != client->utt_completeted_cb) {
539 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance completed \n");
540 tts_client_use_callback(client);
541 client->utt_completeted_cb(client->tts, utt_id, client->utt_completed_user_data);
542 tts_client_not_use_callback(client);
544 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance completed \n");
550 int tts_set_interrupted_cb(tts_h tts, tts_interrupted_cb callback, void* user_data)
552 if (NULL == tts || NULL == callback) {
553 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set interrupted cb : Input parameter is null");
554 return TTS_ERROR_INVALID_PARAMETER;
557 tts_client_s* client = tts_client_get(tts);
559 if (NULL == client) {
560 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set interrupted cb : A handle is not valid");
561 return TTS_ERROR_INVALID_PARAMETER;
564 if (TTS_STATE_READY != client->current_state) {
565 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set interrupted cb : Current state is not 'ready'.");
566 return TTS_ERROR_INVALID_STATE;
569 client->interrupted_cb = callback;
570 client->interrupted_user_data = user_data;
572 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set interrupted cb");
577 int tts_unset_interrupted_cb(tts_h tts)
580 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset interrupted cb : Input parameter is null");
581 return TTS_ERROR_INVALID_PARAMETER;
584 tts_client_s* client = tts_client_get(tts);
586 if (NULL == client) {
587 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset interrupted cb : A handle is not valid");
588 return TTS_ERROR_INVALID_PARAMETER;
591 if (TTS_STATE_READY != client->current_state) {
592 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset interrupted cb : Current state is not 'ready'.");
593 return TTS_ERROR_INVALID_STATE;
596 client->interrupted_cb = NULL;
597 client->interrupted_user_data = NULL;
599 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset interrupted cb");
604 int tts_set_utterance_started_cb(tts_h tts, tts_utterance_started_cb callback, void* user_data)
606 if (NULL == tts || NULL == callback) {
607 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
608 return TTS_ERROR_INVALID_PARAMETER;
611 tts_client_s* client = tts_client_get(tts);
613 if (NULL == client) {
614 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
615 return TTS_ERROR_INVALID_PARAMETER;
618 if (TTS_STATE_READY != client->current_state) {
619 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Current state is not 'ready'.");
620 return TTS_ERROR_INVALID_STATE;
623 client->utt_started_cb = callback;
624 client->utt_started_user_data = user_data;
626 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt started cb");
631 int tts_unset_utterance_started_cb(tts_h tts)
634 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Input parameter is null");
635 return TTS_ERROR_INVALID_PARAMETER;
638 tts_client_s* client = tts_client_get(tts);
640 if (NULL == client) {
641 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : A handle is not valid");
642 return TTS_ERROR_INVALID_PARAMETER;
645 if (TTS_STATE_READY != client->current_state) {
646 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Current state is not 'ready'.");
647 return TTS_ERROR_INVALID_STATE;
650 client->utt_started_cb = NULL;
651 client->utt_started_user_data = NULL;
653 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt started cb");
658 int tts_set_utterance_completed_cb(tts_h tts, tts_utterance_completed_cb callback, void* user_data)
660 if (NULL == tts || NULL == callback) {
661 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Input parameter is null");
662 return TTS_ERROR_INVALID_PARAMETER;
665 tts_client_s* client = tts_client_get(tts);
667 if (NULL == client) {
668 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : A handle is not valid");
669 return TTS_ERROR_INVALID_PARAMETER;
672 if (TTS_STATE_READY != client->current_state) {
673 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Current state is not 'ready'.");
674 return TTS_ERROR_INVALID_STATE;
677 client->utt_completeted_cb = callback;
678 client->utt_completed_user_data = user_data;
680 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt completed cb");
685 int tts_unset_utterance_completed_cb(tts_h tts)
688 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Input parameter is null");
689 return TTS_ERROR_INVALID_PARAMETER;
692 tts_client_s* client = tts_client_get(tts);
694 if (NULL == client) {
695 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : A handle is not valid");
696 return TTS_ERROR_INVALID_PARAMETER;
699 if (TTS_STATE_READY != client->current_state) {
700 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Current state is not 'ready'.");
701 return TTS_ERROR_INVALID_STATE;
704 client->utt_completeted_cb = NULL;
705 client->utt_completed_user_data = NULL;
707 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt completed cb");
711 int tts_set_error_cb(tts_h tts, tts_error_cb callback, void* user_data)
713 if (NULL == tts || NULL == callback) {
714 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Input parameter is null");
715 return TTS_ERROR_INVALID_PARAMETER;
718 tts_client_s* client = tts_client_get(tts);
720 if (NULL == client) {
721 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : A handle is not valid");
722 return TTS_ERROR_INVALID_PARAMETER;
725 if (TTS_STATE_READY != client->current_state) {
726 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Current state is not 'ready'.");
727 return TTS_ERROR_INVALID_STATE;
730 client->error_cb = callback;
731 client->error_user_data = user_data;
733 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set error cb");
738 int tts_unset_error_cb(tts_h tts)
741 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Input parameter is null");
742 return TTS_ERROR_INVALID_PARAMETER;
745 tts_client_s* client = tts_client_get(tts);
747 if (NULL == client) {
748 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : A handle is not valid");
749 return TTS_ERROR_INVALID_PARAMETER;
752 if (TTS_STATE_READY != client->current_state) {
753 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Current state is not 'ready'.");
754 return TTS_ERROR_INVALID_STATE;
757 client->error_cb = NULL;
758 client->error_user_data = NULL;
760 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset error cb");
765 static bool _tts_is_alive()
772 memset(buff, 0, sizeof(char));
773 memset(cmd, 0, sizeof(char));
775 if ((fp = popen("ps -eo \"cmd\"", "r")) == NULL) {
776 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] popen error \n");
780 while(fgets(buff, 255, fp)) {
786 sscanf(buff, "%s", cmd);
788 if (0 == strncmp(cmd, "[tts-daemon]", strlen("[tts-daemon]")) ||
789 0 == strncmp(cmd, "tts-daemon", strlen("tts-daemon")) ||
790 0 == strncmp(cmd, "/usr/bin/tts-daemon", strlen("/usr/bin/tts-daemon"))) {
791 SLOG(LOG_DEBUG, TAG_TTSC, "tts-daemon is ALIVE !! \n");
804 static void __my_sig_child(int signo, siginfo_t *info, void *data)
807 pid_t child_pid, child_pgid;
809 child_pgid = getpgid(info->si_pid);
810 SLOG(LOG_DEBUG, TAG_TTSC, "Signal handler: dead pid = %d, pgid = %d\n", info->si_pid, child_pgid);
812 while (0 < (child_pid = waitpid(-1, &status, WNOHANG))) {
813 if(child_pid == child_pgid)
814 killpg(child_pgid, SIGKILL);
820 int __tts_check_tts_daemon()
822 if (TRUE == _tts_is_alive())
825 /* fork-exec tts-daemom */
826 SLOG(LOG_DEBUG, TAG_TTSC, "THERE IS NO tts-daemon \n");
827 SLOG(LOG_DEBUG, TAG_TTSC, "START TTS-DAEMON \n");
830 struct sigaction act, dummy;
832 act.sa_handler = NULL;
833 act.sa_sigaction = __my_sig_child;
834 sigemptyset(&act.sa_mask);
835 act.sa_flags = SA_NOCLDSTOP | SA_SIGINFO;
837 if (sigaction(SIGCHLD, &act, &dummy) < 0) {
838 SLOG(LOG_ERROR, TAG_TTSC, "Cannot make a signal handler");
846 SLOG(LOG_ERROR, TAG_TTSC, "fail to create TTS-DAEMON \n");
851 for (i = 0;i < _NSIG;i++)
854 execl("/usr/bin/tts-daemon", "/usr/bin/tts-daemon", NULL);