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.
18 #include <sys/types.h>
22 #include "tts_client.h"
25 #define MAX_TEXT_COUNT 1000
27 static bool g_is_daemon_started = false;
29 /* Function definition */
30 static int __tts_check_tts_daemon();
31 static Eina_Bool __tts_notify_state_changed(void *data);
32 static Eina_Bool __tts_notify_error(void *data);
34 int tts_create(tts_h* tts)
36 SLOG(LOG_DEBUG, TAG_TTSC, "===== Create TTS");
40 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
41 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
42 SLOG(LOG_DEBUG, TAG_TTSC, " ");
43 return TTS_ERROR_INVALID_PARAMETER;
46 if (0 == tts_client_get_size()) {
47 if (0 != tts_dbus_open_connection()) {
48 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to open dbus connection");
49 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
50 SLOG(LOG_DEBUG, TAG_TTSC, " ");
51 return TTS_ERROR_OPERATION_FAILED;
55 if (0 != tts_client_new(tts)) {
56 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to create client!!!!!");
57 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
58 SLOG(LOG_DEBUG, TAG_TTSC, " ");
59 return TTS_ERROR_OUT_OF_MEMORY;
62 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
63 SLOG(LOG_DEBUG, TAG_TTSC, " ");
65 return TTS_ERROR_NONE;
68 int tts_destroy(tts_h tts)
70 SLOG(LOG_DEBUG, TAG_TTSC, "===== Destroy TTS");
73 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
74 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
75 SLOG(LOG_DEBUG, TAG_TTSC, " ");
76 return TTS_ERROR_INVALID_PARAMETER;
79 tts_client_s* client = tts_client_get(tts);
83 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
84 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
85 SLOG(LOG_DEBUG, TAG_TTSC, " ");
86 return TTS_ERROR_INVALID_PARAMETER;
92 switch (client->current_state) {
93 case TTS_STATE_PAUSED:
94 case TTS_STATE_PLAYING:
96 /* Request Finalize */
97 ret = tts_dbus_request_finalize(client->uid);
99 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request finalize");
101 g_is_daemon_started = false;
102 case TTS_STATE_CREATED:
104 tts_client_destroy(tts);
108 if (0 == tts_client_get_size()) {
109 if (0 != tts_dbus_close_connection()) {
110 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to close connection");
114 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
115 SLOG(LOG_DEBUG, TAG_TTSC, " ");
117 return TTS_ERROR_NONE;
120 static Eina_Bool __tts_connect_daemon(void *data)
122 SLOG(LOG_DEBUG, TAG_TTSC, "===== Connect daemon");
124 tts_h tts = (tts_h)data;
126 tts_client_s* client = tts_client_get(tts);
129 if (NULL == client) {
130 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
131 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
132 SLOG(LOG_DEBUG, TAG_TTSC, " ");
137 if (0 != tts_dbus_request_hello()) {
138 if (false == g_is_daemon_started) {
139 g_is_daemon_started = true;
140 __tts_check_tts_daemon();
145 /* do request initialize */
148 ret = tts_dbus_request_initialize(client->uid);
150 if (TTS_ERROR_ENGINE_NOT_FOUND == ret) {
151 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Engine not found");
153 client->reason = TTS_ERROR_ENGINE_NOT_FOUND;
156 ecore_timer_add(0, __tts_notify_error, (void*)client->tts);
159 } else if (TTS_ERROR_NONE != ret) {
160 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to connection");
162 client->reason = TTS_ERROR_TIMED_OUT;
165 ecore_timer_add(0, __tts_notify_error, (void*)client->tts);
168 /* success to connect tts-daemon */
171 client->before_state = client->current_state;
172 client->current_state = TTS_STATE_READY;
174 ecore_timer_add(0, __tts_notify_state_changed, (void*)client->tts);
176 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] uid(%d)", client->uid);
178 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
179 SLOG(LOG_DEBUG, TAG_TTSC, " ");
185 int tts_prepare(tts_h tts)
187 SLOG(LOG_DEBUG, TAG_TTSC, "===== Prepare TTS");
189 tts_client_s* client = tts_client_get(tts);
192 if (NULL == client) {
193 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
194 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
195 SLOG(LOG_DEBUG, TAG_TTSC, " ");
196 return TTS_ERROR_INVALID_PARAMETER;
200 if (client->current_state != TTS_STATE_CREATED) {
201 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
202 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
203 SLOG(LOG_DEBUG, TAG_TTSC, " ");
204 return TTS_ERROR_INVALID_STATE;
207 ecore_timer_add(0, __tts_connect_daemon, (void*)tts);
209 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
210 SLOG(LOG_DEBUG, TAG_TTSC, " ");
212 return TTS_ERROR_NONE;
215 int tts_unprepare(tts_h tts)
217 SLOG(LOG_DEBUG, TAG_TTSC, "===== Unprepare TTS");
219 tts_client_s* client = tts_client_get(tts);
222 if (NULL == client) {
223 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
224 return TTS_ERROR_INVALID_PARAMETER;
228 if (client->current_state != TTS_STATE_READY) {
229 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'READY'");
230 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
231 SLOG(LOG_DEBUG, TAG_TTSC, " ");
232 return TTS_ERROR_INVALID_STATE;
235 int ret = tts_dbus_request_finalize(client->uid);
237 SLOG(LOG_WARN, TAG_TTSC, "[ERROR] Fail to request finalize");
239 g_is_daemon_started = false;
241 client->before_state = client->current_state;
242 client->current_state = TTS_STATE_CREATED;
244 ecore_timer_add(0, __tts_notify_state_changed, (void*)tts);
246 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
247 SLOG(LOG_DEBUG, TAG_TTSC, " ");
249 return TTS_ERROR_NONE;
252 int tts_foreach_supported_voices(tts_h tts, tts_supported_voice_cb callback, void* user_data)
254 SLOG(LOG_DEBUG, TAG_TTSC, "===== Foreach supported voices");
256 if (NULL == tts || NULL == callback) {
257 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
258 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
259 SLOG(LOG_DEBUG, TAG_TTSC, " ");
260 return TTS_ERROR_INVALID_PARAMETER;
263 tts_client_s* client = tts_client_get(tts);
266 if (NULL == client) {
267 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
268 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
269 SLOG(LOG_DEBUG, TAG_TTSC, " ");
270 return TTS_ERROR_INVALID_PARAMETER;
273 if (TTS_STATE_READY != client->current_state) {
274 SLOG(LOG_ERROR, TAG_TTSC, "Current state is NOT 'READY'.");
275 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
276 SLOG(LOG_DEBUG, TAG_TTSC, " ");
277 return TTS_ERROR_INVALID_STATE;
281 ret = tts_dbus_request_get_support_voice(client->uid, client->tts, callback, user_data);
283 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
286 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
287 SLOG(LOG_DEBUG, TAG_TTSC, " ");
292 int tts_get_default_voice(tts_h tts, char** lang, tts_voice_type_e* vctype)
294 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get default voice");
297 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
298 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
299 SLOG(LOG_DEBUG, TAG_TTSC, " ");
300 return TTS_ERROR_INVALID_PARAMETER;
303 tts_client_s* client = tts_client_get(tts);
305 if (NULL == client) {
306 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
307 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
308 SLOG(LOG_DEBUG, TAG_TTSC, " ");
309 return TTS_ERROR_INVALID_PARAMETER;
312 if (TTS_STATE_READY != client->current_state) {
313 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is NOT 'READY'. ");
314 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
315 SLOG(LOG_DEBUG, TAG_TTSC, " ");
316 return TTS_ERROR_INVALID_STATE;
319 /* Request call remote method */
321 ret = tts_dbus_request_get_default_voice(client->uid, lang, vctype );
324 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
327 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
328 SLOG(LOG_DEBUG, TAG_TTSC, " ");
333 int tts_get_max_text_count(tts_h tts, int* count)
335 if (NULL == tts || NULL == count) {
336 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Input parameter is null");
337 return TTS_ERROR_INVALID_PARAMETER;
340 tts_client_s* client = tts_client_get(tts);
342 if (NULL == client) {
343 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : A handle is not valid");
344 return TTS_ERROR_INVALID_PARAMETER;
347 if (TTS_STATE_READY != client->current_state) {
348 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Current state is NOT 'READY'.");
349 return TTS_ERROR_INVALID_STATE;
352 *count = MAX_TEXT_COUNT;
354 SLOG(LOG_DEBUG, TAG_TTSC, "[Suceess] Get max text count");
355 return TTS_ERROR_NONE;
358 int tts_get_state(tts_h tts, tts_state_e* state)
360 if (NULL == tts || NULL == state) {
361 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : Input parameter is null");
362 return TTS_ERROR_INVALID_PARAMETER;
365 tts_client_s* client = tts_client_get(tts);
367 if (NULL == client) {
368 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
369 return TTS_ERROR_INVALID_PARAMETER;
372 *state = client->current_state;
375 case TTS_STATE_CREATED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Created'"); break;
376 case TTS_STATE_READY: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Ready'"); break;
377 case TTS_STATE_PLAYING: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Playing'"); break;
378 case TTS_STATE_PAUSED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Paused'"); break;
381 return TTS_ERROR_NONE;
384 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)
386 SLOG(LOG_DEBUG, TAG_TTSC, "===== Add text");
388 if (NULL == tts || NULL == utt_id) {
389 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
390 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
391 SLOG(LOG_DEBUG, TAG_TTSC, " ");
392 return TTS_ERROR_INVALID_PARAMETER;
395 tts_client_s* client = tts_client_get(tts);
397 if (NULL == client) {
398 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
399 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
400 SLOG(LOG_DEBUG, TAG_TTSC, " ");
401 return TTS_ERROR_INVALID_PARAMETER;
404 if (TTS_STATE_CREATED == client->current_state) {
405 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
406 return TTS_ERROR_INVALID_STATE;
409 /* change default language value */
412 if (NULL == language)
413 temp = strdup("default");
415 temp = strdup(language);
417 client->current_utt_id ++;
418 if (client->current_utt_id == 10000) {
419 client->current_utt_id = 1;
424 ret = tts_dbus_request_add_text(client->uid, text, temp, voice_type, speed, client->current_utt_id);
426 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
429 *utt_id = client->current_utt_id;
434 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
435 SLOG(LOG_DEBUG, TAG_TTSC, " ");
440 int tts_play(tts_h tts)
442 SLOG(LOG_DEBUG, TAG_TTSC, "===== Play tts");
445 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
446 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
447 SLOG(LOG_DEBUG, TAG_TTSC, " ");
448 return TTS_ERROR_INVALID_PARAMETER;
451 tts_client_s* client = tts_client_get(tts);
453 if (NULL == client) {
454 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
455 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
456 SLOG(LOG_DEBUG, TAG_TTSC, " ");
457 return TTS_ERROR_INVALID_PARAMETER;
460 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
461 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
462 return TTS_ERROR_INVALID_STATE;
466 ret = tts_dbus_request_play(client->uid);
468 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Request play : result(%d)", ret);
469 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
470 SLOG(LOG_DEBUG, TAG_TTSC, " ");
474 client->before_state = client->current_state;
475 client->current_state = TTS_STATE_PLAYING;
477 if (NULL != client->state_changed_cb) {
478 ecore_timer_add(0, __tts_notify_state_changed, (void*)tts);
480 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
483 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
484 SLOG(LOG_DEBUG, TAG_TTSC, " ");
486 return TTS_ERROR_NONE;
490 int tts_stop(tts_h tts)
492 SLOG(LOG_DEBUG, TAG_TTSC, "===== Stop tts");
495 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
496 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
497 SLOG(LOG_DEBUG, TAG_TTSC, " ");
498 return TTS_ERROR_INVALID_PARAMETER;
501 tts_client_s* client = tts_client_get(tts);
503 if (NULL == client) {
504 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
505 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
506 SLOG(LOG_DEBUG, TAG_TTSC, " ");
507 return TTS_ERROR_INVALID_PARAMETER;
510 if (TTS_STATE_CREATED == client->current_state) {
511 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
512 return TTS_ERROR_INVALID_STATE;
516 ret = tts_dbus_request_stop(client->uid);
518 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
519 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
520 SLOG(LOG_DEBUG, TAG_TTSC, " ");
524 client->before_state = client->current_state;
525 client->current_state = TTS_STATE_READY;
527 if (NULL != client->state_changed_cb) {
528 ecore_timer_add(0, __tts_notify_state_changed, (void*)tts);
530 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
533 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
534 SLOG(LOG_DEBUG, TAG_TTSC, " ");
536 return TTS_ERROR_NONE;
540 int tts_pause(tts_h tts)
542 SLOG(LOG_DEBUG, TAG_TTSC, "===== Pause tts");
545 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
546 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
547 SLOG(LOG_DEBUG, TAG_TTSC, " ");
548 return TTS_ERROR_INVALID_PARAMETER;
551 tts_client_s* client = tts_client_get(tts);
553 if (NULL == client) {
554 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
555 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
556 SLOG(LOG_DEBUG, TAG_TTSC, " ");
557 return TTS_ERROR_INVALID_PARAMETER;
560 if (TTS_STATE_PLAYING != client->current_state) {
561 SLOG(LOG_ERROR, TAG_TTSC, "[Error] The Current state is NOT 'playing'. So this request should be not running.");
562 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
563 SLOG(LOG_DEBUG, TAG_TTSC, " ");
564 return TTS_ERROR_INVALID_STATE;
568 ret = tts_dbus_request_pause(client->uid);
570 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Request pause : result(%d)", ret);
571 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
572 SLOG(LOG_DEBUG, TAG_TTSC, " ");
576 client->before_state = client->current_state;
577 client->current_state = TTS_STATE_PAUSED;
579 if (NULL != client->state_changed_cb) {
580 ecore_timer_add(0, __tts_notify_state_changed, (void*)tts);
582 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
585 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
586 SLOG(LOG_DEBUG, TAG_TTSC, " ");
588 return TTS_ERROR_NONE;
591 static Eina_Bool __tts_notify_error(void *data)
593 tts_h tts = (tts_h)data;
595 tts_client_s* client = tts_client_get(tts);
598 if (NULL == client) {
599 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify error msg : A handle is not valid");
603 if (NULL != client->error_cb) {
604 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of error");
605 tts_client_use_callback(client);
606 client->error_cb(client->tts, client->utt_id, client->reason, client->error_user_data );
607 tts_client_not_use_callback(client);
609 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
615 int __tts_cb_error(int uid, tts_error_e reason, int utt_id)
617 tts_client_s* client = tts_client_get_by_uid(uid);
619 if (NULL == client) {
620 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
621 return TTS_ERROR_INVALID_PARAMETER;
624 client->utt_id = utt_id;
625 client->reason = reason;
627 /* call callback function */
628 if (NULL != client->error_cb) {
629 ecore_timer_add(0, __tts_notify_error, client->tts);
631 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
637 static Eina_Bool __tts_notify_state_changed(void *data)
639 tts_h tts = (tts_h)data;
641 tts_client_s* client = tts_client_get(tts);
644 if (NULL == client) {
645 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify state changed : A handle is not valid");
649 if (NULL != client->state_changed_cb) {
650 tts_client_use_callback(client);
651 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
652 tts_client_not_use_callback(client);
653 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
655 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
661 int __tts_cb_set_state(int uid, int state)
663 tts_client_s* client = tts_client_get_by_uid(uid);
664 if( NULL == client ) {
665 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] The handle is not valid");
669 tts_state_e state_from_daemon = (tts_state_e)state;
671 if (client->current_state == state_from_daemon) {
672 SLOG(LOG_DEBUG, TAG_TTSC, "Current state has already been %d", client->current_state);
676 if (NULL != client->state_changed_cb) {
677 ecore_timer_add(0, __tts_notify_state_changed, client->tts);
679 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
682 client->before_state = client->current_state;
683 client->current_state = state_from_daemon;
688 static Eina_Bool __tts_notify_utt_started(void *data)
690 tts_h tts = (tts_h)data;
692 tts_client_s* client = tts_client_get(tts);
695 if (NULL == client) {
696 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to notify utt started : A handle is not valid");
700 if (NULL != client->utt_started_cb) {
701 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance started ");
702 tts_client_use_callback(client);
703 client->utt_started_cb(client->tts, client->utt_id, client->utt_started_user_data);
704 tts_client_not_use_callback(client);
706 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance started ");
712 int __tts_cb_utt_started(int uid, int utt_id)
714 tts_client_s* client = tts_client_get_by_uid(uid);
716 if (NULL == client) {
717 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
718 return TTS_ERROR_INVALID_PARAMETER;
721 SLOG(LOG_DEBUG, TAG_TTSC, "utterance started : utt id(%d) ", utt_id);
723 client->utt_id = utt_id;
725 /* call callback function */
726 if (NULL != client->utt_started_cb) {
727 ecore_timer_add(0, __tts_notify_utt_started, client->tts);
729 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance started ");
735 static Eina_Bool __tts_notify_utt_completed(void *data)
737 tts_h tts = (tts_h)data;
739 tts_client_s* client = tts_client_get(tts);
742 if (NULL == client) {
743 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to notify utt completed : A handle is not valid");
747 if (NULL != client->utt_completeted_cb) {
748 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance completed ");
749 tts_client_use_callback(client);
750 client->utt_completeted_cb(client->tts, client->utt_id, client->utt_completed_user_data);
751 tts_client_not_use_callback(client);
753 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance completed ");
759 int __tts_cb_utt_completed(int uid, int utt_id)
761 tts_client_s* client = tts_client_get_by_uid(uid);
763 if (NULL == client) {
764 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
765 return TTS_ERROR_INVALID_PARAMETER;
768 SLOG(LOG_DEBUG, TAG_TTSC, "utterance completed : uttid(%d) ", utt_id);
770 client->utt_id = utt_id;
772 /* call callback function */
773 if (NULL != client->utt_completeted_cb) {
774 ecore_timer_add(0, __tts_notify_utt_completed, client->tts);
776 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance completed ");
782 int tts_set_state_changed_cb(tts_h tts, tts_state_changed_cb callback, void* user_data)
784 if (NULL == tts || NULL == callback) {
785 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Input parameter is null");
786 return TTS_ERROR_INVALID_PARAMETER;
789 tts_client_s* client = tts_client_get(tts);
791 if (NULL == client) {
792 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : A handle is not valid");
793 return TTS_ERROR_INVALID_PARAMETER;
796 if (TTS_STATE_CREATED != client->current_state) {
797 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Current state is not 'Created'.");
798 return TTS_ERROR_INVALID_STATE;
801 client->state_changed_cb = callback;
802 client->state_changed_user_data = user_data;
804 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set state changed cb");
809 int tts_unset_state_changed_cb(tts_h tts)
812 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Input parameter is null");
813 return TTS_ERROR_INVALID_PARAMETER;
816 tts_client_s* client = tts_client_get(tts);
818 if (NULL == client) {
819 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : A handle is not valid");
820 return TTS_ERROR_INVALID_PARAMETER;
823 if (TTS_STATE_CREATED != client->current_state) {
824 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Current state is not 'Created'.");
825 return TTS_ERROR_INVALID_STATE;
828 client->state_changed_cb = NULL;
829 client->state_changed_user_data = NULL;
831 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset state changed cb");
836 int tts_set_utterance_started_cb(tts_h tts, tts_utterance_started_cb callback, void* user_data)
838 if (NULL == tts || NULL == callback) {
839 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Input parameter is null");
840 return TTS_ERROR_INVALID_PARAMETER;
843 tts_client_s* client = tts_client_get(tts);
845 if (NULL == client) {
846 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : A handle is not valid");
847 return TTS_ERROR_INVALID_PARAMETER;
850 if (TTS_STATE_CREATED != client->current_state) {
851 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Current state is not 'Created'.");
852 return TTS_ERROR_INVALID_STATE;
855 client->utt_started_cb = callback;
856 client->utt_started_user_data = user_data;
858 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt started cb");
863 int tts_unset_utterance_started_cb(tts_h tts)
866 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Input parameter is null");
867 return TTS_ERROR_INVALID_PARAMETER;
870 tts_client_s* client = tts_client_get(tts);
872 if (NULL == client) {
873 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : A handle is not valid");
874 return TTS_ERROR_INVALID_PARAMETER;
877 if (TTS_STATE_CREATED != client->current_state) {
878 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Current state is not 'Created'.");
879 return TTS_ERROR_INVALID_STATE;
882 client->utt_started_cb = NULL;
883 client->utt_started_user_data = NULL;
885 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt started cb");
890 int tts_set_utterance_completed_cb(tts_h tts, tts_utterance_completed_cb callback, void* user_data)
892 if (NULL == tts || NULL == callback) {
893 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Input parameter is null");
894 return TTS_ERROR_INVALID_PARAMETER;
897 tts_client_s* client = tts_client_get(tts);
899 if (NULL == client) {
900 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : A handle is not valid");
901 return TTS_ERROR_INVALID_PARAMETER;
904 if (TTS_STATE_CREATED != client->current_state) {
905 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Current state is not 'Created'.");
906 return TTS_ERROR_INVALID_STATE;
909 client->utt_completeted_cb = callback;
910 client->utt_completed_user_data = user_data;
912 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt completed cb");
917 int tts_unset_utterance_completed_cb(tts_h tts)
920 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Input parameter is null");
921 return TTS_ERROR_INVALID_PARAMETER;
924 tts_client_s* client = tts_client_get(tts);
926 if (NULL == client) {
927 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : A handle is not valid");
928 return TTS_ERROR_INVALID_PARAMETER;
931 if (TTS_STATE_CREATED != client->current_state) {
932 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Current state is not 'Created'.");
933 return TTS_ERROR_INVALID_STATE;
936 client->utt_completeted_cb = NULL;
937 client->utt_completed_user_data = NULL;
939 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt completed cb");
943 int tts_set_error_cb(tts_h tts, tts_error_cb callback, void* user_data)
945 if (NULL == tts || NULL == callback) {
946 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Input parameter is null");
947 return TTS_ERROR_INVALID_PARAMETER;
950 tts_client_s* client = tts_client_get(tts);
952 if (NULL == client) {
953 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : A handle is not valid");
954 return TTS_ERROR_INVALID_PARAMETER;
957 if (TTS_STATE_CREATED != client->current_state) {
958 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Current state is not 'Created'.");
959 return TTS_ERROR_INVALID_STATE;
962 client->error_cb = callback;
963 client->error_user_data = user_data;
965 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set error cb");
970 int tts_unset_error_cb(tts_h tts)
973 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Input parameter is null");
974 return TTS_ERROR_INVALID_PARAMETER;
977 tts_client_s* client = tts_client_get(tts);
979 if (NULL == client) {
980 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : A handle is not valid");
981 return TTS_ERROR_INVALID_PARAMETER;
984 if (TTS_STATE_CREATED != client->current_state) {
985 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Current state is not 'Created'.");
986 return TTS_ERROR_INVALID_STATE;
989 client->error_cb = NULL;
990 client->error_user_data = NULL;
992 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset error cb");
997 int __get_cmd_line(char *file, char *buf)
1002 fp = fopen(file, "r");
1004 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get command line");
1008 memset(buf, 0, 256);
1009 fgets(buf, 256, fp);
1015 static bool _tts_is_alive()
1018 struct dirent *entry;
1019 struct stat filestat;
1025 dir = opendir("/proc");
1027 SLOG(LOG_ERROR, TAG_TTSC, "process checking is FAILED");
1031 while ((entry = readdir(dir)) != NULL) {
1032 if (0 != lstat(entry->d_name, &filestat))
1035 if (!S_ISDIR(filestat.st_mode))
1038 pid = atoi(entry->d_name);
1039 if (pid <= 0) continue;
1041 sprintf(tempPath, "/proc/%d/cmdline", pid);
1042 if (0 != __get_cmd_line(tempPath, cmdLine)) {
1046 if ( 0 == strncmp(cmdLine, "[tts-daemon]", strlen("[tts-daemon]")) ||
1047 0 == strncmp(cmdLine, "tts-daemon", strlen("tts-daemon")) ||
1048 0 == strncmp(cmdLine, "/usr/bin/tts-daemon", strlen("/usr/bin/tts-daemon"))) {
1049 SLOG(LOG_DEBUG, TAG_TTSC, "tts-daemon is ALIVE !!");
1055 SLOG(LOG_DEBUG, TAG_TTSC, "THERE IS NO tts-daemon !!");
1061 static int __tts_check_tts_daemon()
1063 if (TRUE == _tts_is_alive()) {
1067 /* fork-exec tts-daemom */
1074 SLOG(LOG_ERROR, TAG_TTSC, "Fail to create tts-daemon");
1079 for (i = 0;i < _NSIG;i++)
1082 execl("/usr/bin/tts-daemon", "/usr/bin/tts-daemon", NULL);