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 static Ecore_Timer* g_connect_timer = NULL;
31 /* Function definition */
32 static int __tts_check_tts_daemon();
33 static Eina_Bool __tts_notify_state_changed(void *data);
34 static Eina_Bool __tts_notify_error(void *data);
36 int tts_create(tts_h* tts)
38 SLOG(LOG_DEBUG, TAG_TTSC, "===== Create TTS");
42 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
43 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
44 SLOG(LOG_DEBUG, TAG_TTSC, " ");
45 return TTS_ERROR_INVALID_PARAMETER;
48 if (0 == tts_client_get_size()) {
49 if (0 != tts_dbus_open_connection()) {
50 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to open dbus connection");
51 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
52 SLOG(LOG_DEBUG, TAG_TTSC, " ");
53 return TTS_ERROR_OPERATION_FAILED;
57 if (0 != tts_client_new(tts)) {
58 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to create client!!!!!");
59 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
60 SLOG(LOG_DEBUG, TAG_TTSC, " ");
61 return TTS_ERROR_OUT_OF_MEMORY;
64 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
65 SLOG(LOG_DEBUG, TAG_TTSC, " ");
67 return TTS_ERROR_NONE;
70 int tts_destroy(tts_h tts)
72 SLOG(LOG_DEBUG, TAG_TTSC, "===== Destroy TTS");
75 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
76 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
77 SLOG(LOG_DEBUG, TAG_TTSC, " ");
78 return TTS_ERROR_INVALID_PARAMETER;
81 tts_client_s* client = tts_client_get(tts);
85 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
86 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
87 SLOG(LOG_DEBUG, TAG_TTSC, " ");
88 return TTS_ERROR_INVALID_PARAMETER;
91 /* check used callback */
92 if (0 != tts_client_get_use_callback(client)) {
93 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Cannot destroy in Callback function");
94 return TTS_ERROR_OPERATION_FAILED;
100 switch (client->current_state) {
101 case TTS_STATE_PAUSED:
102 case TTS_STATE_PLAYING:
103 case TTS_STATE_READY:
104 /* Request Finalize */
105 ret = tts_dbus_request_finalize(client->uid);
107 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request finalize");
109 g_is_daemon_started = false;
110 case TTS_STATE_CREATED:
111 if (NULL != g_connect_timer) {
112 SLOG(LOG_DEBUG, TAG_TTSC, "Connect Timer is deleted");
113 ecore_timer_del(g_connect_timer);
116 tts_client_destroy(tts);
120 if (0 == tts_client_get_size()) {
121 if (0 != tts_dbus_close_connection()) {
122 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to close connection");
126 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
127 SLOG(LOG_DEBUG, TAG_TTSC, " ");
129 return TTS_ERROR_NONE;
132 static Eina_Bool __tts_connect_daemon(void *data)
134 tts_h tts = (tts_h)data;
136 tts_client_s* client = tts_client_get(tts);
139 if (NULL == client) {
140 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
145 if (0 != tts_dbus_request_hello()) {
146 if (false == g_is_daemon_started) {
147 g_is_daemon_started = true;
148 __tts_check_tts_daemon();
153 SLOG(LOG_DEBUG, TAG_TTSC, "===== Connect daemon");
155 /* do request initialize */
158 ret = tts_dbus_request_initialize(client->uid);
160 if (TTS_ERROR_ENGINE_NOT_FOUND == ret) {
161 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Engine not found");
163 client->reason = TTS_ERROR_ENGINE_NOT_FOUND;
166 ecore_timer_add(0, __tts_notify_error, (void*)client->tts);
169 } else if (TTS_ERROR_NONE != ret) {
170 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to connection");
172 client->reason = TTS_ERROR_TIMED_OUT;
175 ecore_timer_add(0, __tts_notify_error, (void*)client->tts);
178 /* success to connect tts-daemon */
181 client->before_state = client->current_state;
182 client->current_state = TTS_STATE_READY;
184 ecore_timer_add(0, __tts_notify_state_changed, (void*)client->tts);
186 g_connect_timer = NULL;
188 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] uid(%d)", client->uid);
190 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
191 SLOG(LOG_DEBUG, TAG_TTSC, " ");
196 int tts_prepare(tts_h tts)
198 SLOG(LOG_DEBUG, TAG_TTSC, "===== Prepare TTS");
200 tts_client_s* client = tts_client_get(tts);
203 if (NULL == client) {
204 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
205 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
206 SLOG(LOG_DEBUG, TAG_TTSC, " ");
207 return TTS_ERROR_INVALID_PARAMETER;
211 if (client->current_state != TTS_STATE_CREATED) {
212 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
213 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
214 SLOG(LOG_DEBUG, TAG_TTSC, " ");
215 return TTS_ERROR_INVALID_STATE;
218 g_connect_timer = ecore_timer_add(0, __tts_connect_daemon, (void*)tts);
220 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
221 SLOG(LOG_DEBUG, TAG_TTSC, " ");
223 return TTS_ERROR_NONE;
226 int tts_unprepare(tts_h tts)
228 SLOG(LOG_DEBUG, TAG_TTSC, "===== Unprepare TTS");
230 tts_client_s* client = tts_client_get(tts);
233 if (NULL == client) {
234 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
235 return TTS_ERROR_INVALID_PARAMETER;
239 if (client->current_state != TTS_STATE_READY) {
240 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'READY'");
241 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
242 SLOG(LOG_DEBUG, TAG_TTSC, " ");
243 return TTS_ERROR_INVALID_STATE;
246 int ret = tts_dbus_request_finalize(client->uid);
248 SLOG(LOG_WARN, TAG_TTSC, "[ERROR] Fail to request finalize");
250 g_is_daemon_started = false;
252 client->before_state = client->current_state;
253 client->current_state = TTS_STATE_CREATED;
255 ecore_timer_add(0, __tts_notify_state_changed, (void*)tts);
257 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
258 SLOG(LOG_DEBUG, TAG_TTSC, " ");
260 return TTS_ERROR_NONE;
263 int tts_foreach_supported_voices(tts_h tts, tts_supported_voice_cb callback, void* user_data)
265 SLOG(LOG_DEBUG, TAG_TTSC, "===== Foreach supported voices");
267 if (NULL == tts || NULL == callback) {
268 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
269 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
270 SLOG(LOG_DEBUG, TAG_TTSC, " ");
271 return TTS_ERROR_INVALID_PARAMETER;
274 tts_client_s* client = tts_client_get(tts);
277 if (NULL == client) {
278 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
279 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
280 SLOG(LOG_DEBUG, TAG_TTSC, " ");
281 return TTS_ERROR_INVALID_PARAMETER;
284 if (TTS_STATE_READY != client->current_state) {
285 SLOG(LOG_ERROR, TAG_TTSC, "Current state is NOT 'READY'.");
286 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
287 SLOG(LOG_DEBUG, TAG_TTSC, " ");
288 return TTS_ERROR_INVALID_STATE;
292 ret = tts_dbus_request_get_support_voice(client->uid, client->tts, callback, user_data);
294 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
297 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
298 SLOG(LOG_DEBUG, TAG_TTSC, " ");
303 int tts_get_default_voice(tts_h tts, char** lang, tts_voice_type_e* vctype)
305 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get default voice");
308 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
309 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
310 SLOG(LOG_DEBUG, TAG_TTSC, " ");
311 return TTS_ERROR_INVALID_PARAMETER;
314 tts_client_s* client = tts_client_get(tts);
316 if (NULL == client) {
317 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
318 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
319 SLOG(LOG_DEBUG, TAG_TTSC, " ");
320 return TTS_ERROR_INVALID_PARAMETER;
323 if (TTS_STATE_READY != client->current_state) {
324 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is NOT 'READY'. ");
325 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
326 SLOG(LOG_DEBUG, TAG_TTSC, " ");
327 return TTS_ERROR_INVALID_STATE;
330 /* Request call remote method */
332 ret = tts_dbus_request_get_default_voice(client->uid, lang, vctype );
335 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
338 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
339 SLOG(LOG_DEBUG, TAG_TTSC, " ");
344 int tts_get_max_text_count(tts_h tts, int* count)
346 if (NULL == tts || NULL == count) {
347 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Input parameter is null");
348 return TTS_ERROR_INVALID_PARAMETER;
351 tts_client_s* client = tts_client_get(tts);
353 if (NULL == client) {
354 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : A handle is not valid");
355 return TTS_ERROR_INVALID_PARAMETER;
358 if (TTS_STATE_READY != client->current_state) {
359 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Current state is NOT 'READY'.");
360 return TTS_ERROR_INVALID_STATE;
363 *count = MAX_TEXT_COUNT;
365 SLOG(LOG_DEBUG, TAG_TTSC, "[Suceess] Get max text count");
366 return TTS_ERROR_NONE;
369 int tts_get_state(tts_h tts, tts_state_e* state)
371 if (NULL == tts || NULL == state) {
372 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : Input parameter is null");
373 return TTS_ERROR_INVALID_PARAMETER;
376 tts_client_s* client = tts_client_get(tts);
378 if (NULL == client) {
379 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
380 return TTS_ERROR_INVALID_PARAMETER;
383 *state = client->current_state;
386 case TTS_STATE_CREATED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Created'"); break;
387 case TTS_STATE_READY: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Ready'"); break;
388 case TTS_STATE_PLAYING: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Playing'"); break;
389 case TTS_STATE_PAUSED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Paused'"); break;
392 return TTS_ERROR_NONE;
395 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)
397 SLOG(LOG_DEBUG, TAG_TTSC, "===== Add text");
399 if (NULL == tts || NULL == utt_id) {
400 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
401 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
402 SLOG(LOG_DEBUG, TAG_TTSC, " ");
403 return TTS_ERROR_INVALID_PARAMETER;
406 tts_client_s* client = tts_client_get(tts);
408 if (NULL == client) {
409 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
410 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
411 SLOG(LOG_DEBUG, TAG_TTSC, " ");
412 return TTS_ERROR_INVALID_PARAMETER;
415 if (TTS_STATE_CREATED == client->current_state) {
416 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
417 return TTS_ERROR_INVALID_STATE;
420 /* change default language value */
423 if (NULL == language)
424 temp = strdup("default");
426 temp = strdup(language);
428 client->current_utt_id ++;
429 if (client->current_utt_id == 10000) {
430 client->current_utt_id = 1;
435 ret = tts_dbus_request_add_text(client->uid, text, temp, voice_type, speed, client->current_utt_id);
437 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
440 *utt_id = client->current_utt_id;
445 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
446 SLOG(LOG_DEBUG, TAG_TTSC, " ");
451 int tts_play(tts_h tts)
453 SLOG(LOG_DEBUG, TAG_TTSC, "===== Play tts");
456 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
457 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
458 SLOG(LOG_DEBUG, TAG_TTSC, " ");
459 return TTS_ERROR_INVALID_PARAMETER;
462 tts_client_s* client = tts_client_get(tts);
464 if (NULL == client) {
465 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
466 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
467 SLOG(LOG_DEBUG, TAG_TTSC, " ");
468 return TTS_ERROR_INVALID_PARAMETER;
471 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
472 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
473 return TTS_ERROR_INVALID_STATE;
477 ret = tts_dbus_request_play(client->uid);
479 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Request play : result(%d)", ret);
480 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
481 SLOG(LOG_DEBUG, TAG_TTSC, " ");
485 client->before_state = client->current_state;
486 client->current_state = TTS_STATE_PLAYING;
488 if (NULL != client->state_changed_cb) {
489 ecore_timer_add(0, __tts_notify_state_changed, (void*)tts);
491 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
494 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
495 SLOG(LOG_DEBUG, TAG_TTSC, " ");
497 return TTS_ERROR_NONE;
501 int tts_stop(tts_h tts)
503 SLOG(LOG_DEBUG, TAG_TTSC, "===== Stop tts");
506 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
507 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
508 SLOG(LOG_DEBUG, TAG_TTSC, " ");
509 return TTS_ERROR_INVALID_PARAMETER;
512 tts_client_s* client = tts_client_get(tts);
514 if (NULL == client) {
515 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
516 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
517 SLOG(LOG_DEBUG, TAG_TTSC, " ");
518 return TTS_ERROR_INVALID_PARAMETER;
521 if (TTS_STATE_CREATED == client->current_state) {
522 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
523 return TTS_ERROR_INVALID_STATE;
527 ret = tts_dbus_request_stop(client->uid);
529 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
530 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
531 SLOG(LOG_DEBUG, TAG_TTSC, " ");
535 client->before_state = client->current_state;
536 client->current_state = TTS_STATE_READY;
538 if (NULL != client->state_changed_cb) {
539 ecore_timer_add(0, __tts_notify_state_changed, (void*)tts);
541 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
544 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
545 SLOG(LOG_DEBUG, TAG_TTSC, " ");
547 return TTS_ERROR_NONE;
551 int tts_pause(tts_h tts)
553 SLOG(LOG_DEBUG, TAG_TTSC, "===== Pause tts");
556 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
557 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
558 SLOG(LOG_DEBUG, TAG_TTSC, " ");
559 return TTS_ERROR_INVALID_PARAMETER;
562 tts_client_s* client = tts_client_get(tts);
564 if (NULL == client) {
565 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
566 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
567 SLOG(LOG_DEBUG, TAG_TTSC, " ");
568 return TTS_ERROR_INVALID_PARAMETER;
571 if (TTS_STATE_PLAYING != client->current_state) {
572 SLOG(LOG_ERROR, TAG_TTSC, "[Error] The Current state is NOT 'playing'. So this request should be not running.");
573 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
574 SLOG(LOG_DEBUG, TAG_TTSC, " ");
575 return TTS_ERROR_INVALID_STATE;
579 ret = tts_dbus_request_pause(client->uid);
581 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Request pause : result(%d)", ret);
582 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
583 SLOG(LOG_DEBUG, TAG_TTSC, " ");
587 client->before_state = client->current_state;
588 client->current_state = TTS_STATE_PAUSED;
590 if (NULL != client->state_changed_cb) {
591 ecore_timer_add(0, __tts_notify_state_changed, (void*)tts);
593 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
596 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
597 SLOG(LOG_DEBUG, TAG_TTSC, " ");
599 return TTS_ERROR_NONE;
602 static Eina_Bool __tts_notify_error(void *data)
604 tts_h tts = (tts_h)data;
606 tts_client_s* client = tts_client_get(tts);
609 if (NULL == client) {
610 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify error msg : A handle is not valid");
614 if (NULL != client->error_cb) {
615 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of error");
616 tts_client_use_callback(client);
617 client->error_cb(client->tts, client->utt_id, client->reason, client->error_user_data );
618 tts_client_not_use_callback(client);
620 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
626 int __tts_cb_error(int uid, tts_error_e reason, int utt_id)
628 tts_client_s* client = tts_client_get_by_uid(uid);
630 if (NULL == client) {
631 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
632 return TTS_ERROR_INVALID_PARAMETER;
635 client->utt_id = utt_id;
636 client->reason = reason;
638 /* call callback function */
639 if (NULL != client->error_cb) {
640 ecore_timer_add(0, __tts_notify_error, client->tts);
642 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
648 static Eina_Bool __tts_notify_state_changed(void *data)
650 tts_h tts = (tts_h)data;
652 tts_client_s* client = tts_client_get(tts);
655 if (NULL == client) {
656 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify state changed : A handle is not valid");
660 if (NULL != client->state_changed_cb) {
661 tts_client_use_callback(client);
662 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
663 tts_client_not_use_callback(client);
664 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
666 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
672 int __tts_cb_set_state(int uid, int state)
674 tts_client_s* client = tts_client_get_by_uid(uid);
675 if( NULL == client ) {
676 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] The handle is not valid");
680 tts_state_e state_from_daemon = (tts_state_e)state;
682 if (client->current_state == state_from_daemon) {
683 SLOG(LOG_DEBUG, TAG_TTSC, "Current state has already been %d", client->current_state);
687 if (NULL != client->state_changed_cb) {
688 ecore_timer_add(0, __tts_notify_state_changed, client->tts);
690 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
693 client->before_state = client->current_state;
694 client->current_state = state_from_daemon;
699 static Eina_Bool __tts_notify_utt_started(void *data)
701 tts_h tts = (tts_h)data;
703 tts_client_s* client = tts_client_get(tts);
706 if (NULL == client) {
707 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to notify utt started : A handle is not valid");
711 if (NULL != client->utt_started_cb) {
712 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance started ");
713 tts_client_use_callback(client);
714 client->utt_started_cb(client->tts, client->utt_id, client->utt_started_user_data);
715 tts_client_not_use_callback(client);
717 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance started ");
723 int __tts_cb_utt_started(int uid, int utt_id)
725 tts_client_s* client = tts_client_get_by_uid(uid);
727 if (NULL == client) {
728 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
729 return TTS_ERROR_INVALID_PARAMETER;
732 SLOG(LOG_DEBUG, TAG_TTSC, "utterance started : utt id(%d) ", utt_id);
734 client->utt_id = utt_id;
736 /* call callback function */
737 if (NULL != client->utt_started_cb) {
738 ecore_timer_add(0, __tts_notify_utt_started, client->tts);
740 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance started ");
746 static Eina_Bool __tts_notify_utt_completed(void *data)
748 tts_h tts = (tts_h)data;
750 tts_client_s* client = tts_client_get(tts);
753 if (NULL == client) {
754 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to notify utt completed : A handle is not valid");
758 if (NULL != client->utt_completeted_cb) {
759 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance completed ");
760 tts_client_use_callback(client);
761 client->utt_completeted_cb(client->tts, client->utt_id, client->utt_completed_user_data);
762 tts_client_not_use_callback(client);
764 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance completed ");
770 int __tts_cb_utt_completed(int uid, int utt_id)
772 tts_client_s* client = tts_client_get_by_uid(uid);
774 if (NULL == client) {
775 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
776 return TTS_ERROR_INVALID_PARAMETER;
779 SLOG(LOG_DEBUG, TAG_TTSC, "utterance completed : uttid(%d) ", utt_id);
781 client->utt_id = utt_id;
783 /* call callback function */
784 if (NULL != client->utt_completeted_cb) {
785 ecore_timer_add(0, __tts_notify_utt_completed, client->tts);
787 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance completed ");
793 int tts_set_state_changed_cb(tts_h tts, tts_state_changed_cb callback, void* user_data)
795 if (NULL == tts || NULL == callback) {
796 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Input parameter is null");
797 return TTS_ERROR_INVALID_PARAMETER;
800 tts_client_s* client = tts_client_get(tts);
802 if (NULL == client) {
803 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : A handle is not valid");
804 return TTS_ERROR_INVALID_PARAMETER;
807 if (TTS_STATE_CREATED != client->current_state) {
808 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Current state is not 'Created'.");
809 return TTS_ERROR_INVALID_STATE;
812 client->state_changed_cb = callback;
813 client->state_changed_user_data = user_data;
815 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set state changed cb");
820 int tts_unset_state_changed_cb(tts_h tts)
823 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Input parameter is null");
824 return TTS_ERROR_INVALID_PARAMETER;
827 tts_client_s* client = tts_client_get(tts);
829 if (NULL == client) {
830 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : A handle is not valid");
831 return TTS_ERROR_INVALID_PARAMETER;
834 if (TTS_STATE_CREATED != client->current_state) {
835 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Current state is not 'Created'.");
836 return TTS_ERROR_INVALID_STATE;
839 client->state_changed_cb = NULL;
840 client->state_changed_user_data = NULL;
842 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset state changed cb");
847 int tts_set_utterance_started_cb(tts_h tts, tts_utterance_started_cb callback, void* user_data)
849 if (NULL == tts || NULL == callback) {
850 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Input parameter is null");
851 return TTS_ERROR_INVALID_PARAMETER;
854 tts_client_s* client = tts_client_get(tts);
856 if (NULL == client) {
857 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : A handle is not valid");
858 return TTS_ERROR_INVALID_PARAMETER;
861 if (TTS_STATE_CREATED != client->current_state) {
862 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Current state is not 'Created'.");
863 return TTS_ERROR_INVALID_STATE;
866 client->utt_started_cb = callback;
867 client->utt_started_user_data = user_data;
869 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt started cb");
874 int tts_unset_utterance_started_cb(tts_h tts)
877 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Input parameter is null");
878 return TTS_ERROR_INVALID_PARAMETER;
881 tts_client_s* client = tts_client_get(tts);
883 if (NULL == client) {
884 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : A handle is not valid");
885 return TTS_ERROR_INVALID_PARAMETER;
888 if (TTS_STATE_CREATED != client->current_state) {
889 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Current state is not 'Created'.");
890 return TTS_ERROR_INVALID_STATE;
893 client->utt_started_cb = NULL;
894 client->utt_started_user_data = NULL;
896 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt started cb");
901 int tts_set_utterance_completed_cb(tts_h tts, tts_utterance_completed_cb callback, void* user_data)
903 if (NULL == tts || NULL == callback) {
904 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Input parameter is null");
905 return TTS_ERROR_INVALID_PARAMETER;
908 tts_client_s* client = tts_client_get(tts);
910 if (NULL == client) {
911 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : A handle is not valid");
912 return TTS_ERROR_INVALID_PARAMETER;
915 if (TTS_STATE_CREATED != client->current_state) {
916 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Current state is not 'Created'.");
917 return TTS_ERROR_INVALID_STATE;
920 client->utt_completeted_cb = callback;
921 client->utt_completed_user_data = user_data;
923 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt completed cb");
928 int tts_unset_utterance_completed_cb(tts_h tts)
931 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Input parameter is null");
932 return TTS_ERROR_INVALID_PARAMETER;
935 tts_client_s* client = tts_client_get(tts);
937 if (NULL == client) {
938 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : A handle is not valid");
939 return TTS_ERROR_INVALID_PARAMETER;
942 if (TTS_STATE_CREATED != client->current_state) {
943 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Current state is not 'Created'.");
944 return TTS_ERROR_INVALID_STATE;
947 client->utt_completeted_cb = NULL;
948 client->utt_completed_user_data = NULL;
950 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt completed cb");
954 int tts_set_error_cb(tts_h tts, tts_error_cb callback, void* user_data)
956 if (NULL == tts || NULL == callback) {
957 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Input parameter is null");
958 return TTS_ERROR_INVALID_PARAMETER;
961 tts_client_s* client = tts_client_get(tts);
963 if (NULL == client) {
964 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : A handle is not valid");
965 return TTS_ERROR_INVALID_PARAMETER;
968 if (TTS_STATE_CREATED != client->current_state) {
969 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Current state is not 'Created'.");
970 return TTS_ERROR_INVALID_STATE;
973 client->error_cb = callback;
974 client->error_user_data = user_data;
976 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set error cb");
981 int tts_unset_error_cb(tts_h tts)
984 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Input parameter is null");
985 return TTS_ERROR_INVALID_PARAMETER;
988 tts_client_s* client = tts_client_get(tts);
990 if (NULL == client) {
991 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : A handle is not valid");
992 return TTS_ERROR_INVALID_PARAMETER;
995 if (TTS_STATE_CREATED != client->current_state) {
996 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Current state is not 'Created'.");
997 return TTS_ERROR_INVALID_STATE;
1000 client->error_cb = NULL;
1001 client->error_user_data = NULL;
1003 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset error cb");
1008 int __get_cmd_line(char *file, char *buf)
1012 fp = fopen(file, "r");
1014 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get command line");
1018 memset(buf, 0, 256);
1019 if (NULL == fgets(buf, 256, fp)) {
1020 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to fget command line");
1028 static bool _tts_is_alive()
1031 struct dirent *entry;
1032 struct stat filestat;
1038 dir = opendir("/proc");
1040 SLOG(LOG_ERROR, TAG_TTSC, "process checking is FAILED");
1044 while ((entry = readdir(dir)) != NULL) {
1045 if (0 != lstat(entry->d_name, &filestat))
1048 if (!S_ISDIR(filestat.st_mode))
1051 pid = atoi(entry->d_name);
1052 if (pid <= 0) continue;
1054 sprintf(tempPath, "/proc/%d/cmdline", pid);
1055 if (0 != __get_cmd_line(tempPath, cmdLine)) {
1059 if ( 0 == strncmp(cmdLine, "[tts-daemon]", strlen("[tts-daemon]")) ||
1060 0 == strncmp(cmdLine, "tts-daemon", strlen("tts-daemon")) ||
1061 0 == strncmp(cmdLine, "/usr/bin/tts-daemon", strlen("/usr/bin/tts-daemon"))) {
1062 SLOG(LOG_DEBUG, TAG_TTSC, "tts-daemon is ALIVE !!");
1068 SLOG(LOG_DEBUG, TAG_TTSC, "THERE IS NO tts-daemon !!");
1074 static int __tts_check_tts_daemon()
1076 if (TRUE == _tts_is_alive()) {
1080 /* fork-exec tts-daemom */
1087 SLOG(LOG_ERROR, TAG_TTSC, "Fail to create tts-daemon");
1092 for (i = 0;i < _NSIG;i++)
1095 execl("/usr/bin/tts-daemon", "/usr/bin/tts-daemon", NULL);