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 int tts_set_mode(tts_h tts, tts_mode_e mode)
134 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set TTS mode");
136 tts_client_s* client = tts_client_get(tts);
139 if (NULL == client) {
140 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
141 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
142 SLOG(LOG_DEBUG, TAG_TTSC, " ");
143 return TTS_ERROR_INVALID_PARAMETER;
147 if (client->current_state != TTS_STATE_CREATED) {
148 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
149 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
150 SLOG(LOG_DEBUG, TAG_TTSC, " ");
151 return TTS_ERROR_INVALID_STATE;
154 if (TTS_MODE_DEFAULT <= mode && mode <= TTS_MODE_SCREEN_READER) {
157 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] mode is not valid : %d", mode);
158 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
159 SLOG(LOG_DEBUG, TAG_TTSC, " ");
160 return TTS_ERROR_INVALID_PARAMETER;
163 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
164 SLOG(LOG_DEBUG, TAG_TTSC, " ");
166 return TTS_ERROR_NONE;
169 int tts_get_mode(tts_h tts, tts_mode_e* mode)
171 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get TTS mode");
173 tts_client_s* client = tts_client_get(tts);
176 if (NULL == client) {
177 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
178 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
179 SLOG(LOG_DEBUG, TAG_TTSC, " ");
180 return TTS_ERROR_INVALID_PARAMETER;
184 if (client->current_state != TTS_STATE_CREATED) {
185 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
186 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
187 SLOG(LOG_DEBUG, TAG_TTSC, " ");
188 return TTS_ERROR_INVALID_STATE;
192 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter(mode) is NULL");
193 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
194 SLOG(LOG_DEBUG, TAG_TTSC, " ");
195 return TTS_ERROR_INVALID_PARAMETER;
198 *mode = client->mode;
200 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
201 SLOG(LOG_DEBUG, TAG_TTSC, " ");
203 return TTS_ERROR_NONE;
206 static Eina_Bool __tts_connect_daemon(void *data)
208 tts_h tts = (tts_h)data;
210 tts_client_s* client = tts_client_get(tts);
213 if (NULL == client) {
214 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
219 if (0 != tts_dbus_request_hello()) {
220 if (false == g_is_daemon_started) {
221 g_is_daemon_started = true;
222 __tts_check_tts_daemon();
227 SLOG(LOG_DEBUG, TAG_TTSC, "===== Connect daemon");
229 /* do request initialize */
232 ret = tts_dbus_request_initialize(client->uid);
234 if (TTS_ERROR_ENGINE_NOT_FOUND == ret) {
235 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Engine not found");
237 client->reason = TTS_ERROR_ENGINE_NOT_FOUND;
240 ecore_timer_add(0, __tts_notify_error, (void*)client->tts);
243 } else if (TTS_ERROR_NONE != ret) {
244 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to connection");
246 client->reason = TTS_ERROR_TIMED_OUT;
249 ecore_timer_add(0, __tts_notify_error, (void*)client->tts);
252 /* success to connect tts-daemon */
255 client->before_state = client->current_state;
256 client->current_state = TTS_STATE_READY;
258 ecore_timer_add(0, __tts_notify_state_changed, (void*)client->tts);
260 g_connect_timer = NULL;
262 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] uid(%d)", client->uid);
264 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
265 SLOG(LOG_DEBUG, TAG_TTSC, " ");
270 int tts_prepare(tts_h tts)
272 SLOG(LOG_DEBUG, TAG_TTSC, "===== Prepare TTS");
274 tts_client_s* client = tts_client_get(tts);
277 if (NULL == client) {
278 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
279 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
280 SLOG(LOG_DEBUG, TAG_TTSC, " ");
281 return TTS_ERROR_INVALID_PARAMETER;
285 if (client->current_state != TTS_STATE_CREATED) {
286 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
287 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
288 SLOG(LOG_DEBUG, TAG_TTSC, " ");
289 return TTS_ERROR_INVALID_STATE;
292 g_connect_timer = ecore_timer_add(0, __tts_connect_daemon, (void*)tts);
294 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
295 SLOG(LOG_DEBUG, TAG_TTSC, " ");
297 return TTS_ERROR_NONE;
300 int tts_unprepare(tts_h tts)
302 SLOG(LOG_DEBUG, TAG_TTSC, "===== Unprepare TTS");
304 tts_client_s* client = tts_client_get(tts);
307 if (NULL == client) {
308 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
309 return TTS_ERROR_INVALID_PARAMETER;
313 if (client->current_state != TTS_STATE_READY) {
314 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'READY'");
315 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
316 SLOG(LOG_DEBUG, TAG_TTSC, " ");
317 return TTS_ERROR_INVALID_STATE;
320 int ret = tts_dbus_request_finalize(client->uid);
322 SLOG(LOG_WARN, TAG_TTSC, "[ERROR] Fail to request finalize");
324 g_is_daemon_started = false;
326 client->before_state = client->current_state;
327 client->current_state = TTS_STATE_CREATED;
329 ecore_timer_add(0, __tts_notify_state_changed, (void*)tts);
331 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
332 SLOG(LOG_DEBUG, TAG_TTSC, " ");
334 return TTS_ERROR_NONE;
337 int tts_foreach_supported_voices(tts_h tts, tts_supported_voice_cb callback, void* user_data)
339 SLOG(LOG_DEBUG, TAG_TTSC, "===== Foreach supported voices");
341 if (NULL == tts || NULL == callback) {
342 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
343 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
344 SLOG(LOG_DEBUG, TAG_TTSC, " ");
345 return TTS_ERROR_INVALID_PARAMETER;
348 tts_client_s* client = tts_client_get(tts);
351 if (NULL == client) {
352 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
353 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
354 SLOG(LOG_DEBUG, TAG_TTSC, " ");
355 return TTS_ERROR_INVALID_PARAMETER;
358 if (TTS_STATE_READY != client->current_state) {
359 SLOG(LOG_ERROR, TAG_TTSC, "Current state is NOT 'READY'.");
360 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
361 SLOG(LOG_DEBUG, TAG_TTSC, " ");
362 return TTS_ERROR_INVALID_STATE;
366 ret = tts_dbus_request_get_support_voice(client->uid, client->tts, callback, user_data);
368 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
371 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
372 SLOG(LOG_DEBUG, TAG_TTSC, " ");
377 int tts_get_default_voice(tts_h tts, char** lang, tts_voice_type_e* vctype)
379 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get default voice");
382 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
383 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
384 SLOG(LOG_DEBUG, TAG_TTSC, " ");
385 return TTS_ERROR_INVALID_PARAMETER;
388 tts_client_s* client = tts_client_get(tts);
390 if (NULL == client) {
391 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
392 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
393 SLOG(LOG_DEBUG, TAG_TTSC, " ");
394 return TTS_ERROR_INVALID_PARAMETER;
397 if (TTS_STATE_READY != client->current_state) {
398 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is NOT 'READY'. ");
399 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
400 SLOG(LOG_DEBUG, TAG_TTSC, " ");
401 return TTS_ERROR_INVALID_STATE;
404 /* Request call remote method */
406 ret = tts_dbus_request_get_default_voice(client->uid, lang, vctype );
409 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
412 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
413 SLOG(LOG_DEBUG, TAG_TTSC, " ");
418 int tts_get_max_text_count(tts_h tts, int* count)
420 if (NULL == tts || NULL == count) {
421 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Input parameter is null");
422 return TTS_ERROR_INVALID_PARAMETER;
425 tts_client_s* client = tts_client_get(tts);
427 if (NULL == client) {
428 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : A handle is not valid");
429 return TTS_ERROR_INVALID_PARAMETER;
432 if (TTS_STATE_READY != client->current_state) {
433 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Current state is NOT 'READY'.");
434 return TTS_ERROR_INVALID_STATE;
437 *count = MAX_TEXT_COUNT;
439 SLOG(LOG_DEBUG, TAG_TTSC, "[Suceess] Get max text count");
440 return TTS_ERROR_NONE;
443 int tts_get_state(tts_h tts, tts_state_e* state)
445 if (NULL == tts || NULL == state) {
446 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : Input parameter is null");
447 return TTS_ERROR_INVALID_PARAMETER;
450 tts_client_s* client = tts_client_get(tts);
452 if (NULL == client) {
453 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
454 return TTS_ERROR_INVALID_PARAMETER;
457 *state = client->current_state;
460 case TTS_STATE_CREATED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Created'"); break;
461 case TTS_STATE_READY: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Ready'"); break;
462 case TTS_STATE_PLAYING: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Playing'"); break;
463 case TTS_STATE_PAUSED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Paused'"); break;
466 return TTS_ERROR_NONE;
469 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)
471 SLOG(LOG_DEBUG, TAG_TTSC, "===== Add text");
473 if (NULL == tts || NULL == utt_id) {
474 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
475 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
476 SLOG(LOG_DEBUG, TAG_TTSC, " ");
477 return TTS_ERROR_INVALID_PARAMETER;
480 tts_client_s* client = tts_client_get(tts);
482 if (NULL == client) {
483 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
484 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
485 SLOG(LOG_DEBUG, TAG_TTSC, " ");
486 return TTS_ERROR_INVALID_PARAMETER;
489 if (TTS_STATE_CREATED == client->current_state) {
490 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
491 return TTS_ERROR_INVALID_STATE;
494 /* change default language value */
497 if (NULL == language)
498 temp = strdup("default");
500 temp = strdup(language);
502 client->current_utt_id ++;
503 if (client->current_utt_id == 10000) {
504 client->current_utt_id = 1;
509 ret = tts_dbus_request_add_text(client->uid, text, temp, voice_type, speed, client->current_utt_id);
511 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
514 *utt_id = client->current_utt_id;
519 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
520 SLOG(LOG_DEBUG, TAG_TTSC, " ");
525 int tts_play(tts_h tts)
527 SLOG(LOG_DEBUG, TAG_TTSC, "===== Play tts");
530 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
531 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
532 SLOG(LOG_DEBUG, TAG_TTSC, " ");
533 return TTS_ERROR_INVALID_PARAMETER;
536 tts_client_s* client = tts_client_get(tts);
538 if (NULL == client) {
539 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
540 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
541 SLOG(LOG_DEBUG, TAG_TTSC, " ");
542 return TTS_ERROR_INVALID_PARAMETER;
545 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
546 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
547 return TTS_ERROR_INVALID_STATE;
551 ret = tts_dbus_request_play(client->uid);
553 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Request play : result(%d)", ret);
554 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
555 SLOG(LOG_DEBUG, TAG_TTSC, " ");
559 client->before_state = client->current_state;
560 client->current_state = TTS_STATE_PLAYING;
562 if (NULL != client->state_changed_cb) {
563 ecore_timer_add(0, __tts_notify_state_changed, (void*)tts);
565 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
568 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
569 SLOG(LOG_DEBUG, TAG_TTSC, " ");
571 return TTS_ERROR_NONE;
575 int tts_stop(tts_h tts)
577 SLOG(LOG_DEBUG, TAG_TTSC, "===== Stop tts");
580 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
581 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
582 SLOG(LOG_DEBUG, TAG_TTSC, " ");
583 return TTS_ERROR_INVALID_PARAMETER;
586 tts_client_s* client = tts_client_get(tts);
588 if (NULL == client) {
589 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
590 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
591 SLOG(LOG_DEBUG, TAG_TTSC, " ");
592 return TTS_ERROR_INVALID_PARAMETER;
595 if (TTS_STATE_CREATED == client->current_state) {
596 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
597 return TTS_ERROR_INVALID_STATE;
601 ret = tts_dbus_request_stop(client->uid);
603 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
604 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
605 SLOG(LOG_DEBUG, TAG_TTSC, " ");
609 client->before_state = client->current_state;
610 client->current_state = TTS_STATE_READY;
612 if (NULL != client->state_changed_cb) {
613 ecore_timer_add(0, __tts_notify_state_changed, (void*)tts);
615 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
618 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
619 SLOG(LOG_DEBUG, TAG_TTSC, " ");
621 return TTS_ERROR_NONE;
625 int tts_pause(tts_h tts)
627 SLOG(LOG_DEBUG, TAG_TTSC, "===== Pause tts");
630 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
631 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
632 SLOG(LOG_DEBUG, TAG_TTSC, " ");
633 return TTS_ERROR_INVALID_PARAMETER;
636 tts_client_s* client = tts_client_get(tts);
638 if (NULL == client) {
639 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
640 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
641 SLOG(LOG_DEBUG, TAG_TTSC, " ");
642 return TTS_ERROR_INVALID_PARAMETER;
645 if (TTS_STATE_PLAYING != client->current_state) {
646 SLOG(LOG_ERROR, TAG_TTSC, "[Error] The Current state is NOT 'playing'. So this request should be not running.");
647 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
648 SLOG(LOG_DEBUG, TAG_TTSC, " ");
649 return TTS_ERROR_INVALID_STATE;
653 ret = tts_dbus_request_pause(client->uid);
655 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Request pause : result(%d)", ret);
656 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
657 SLOG(LOG_DEBUG, TAG_TTSC, " ");
661 client->before_state = client->current_state;
662 client->current_state = TTS_STATE_PAUSED;
664 if (NULL != client->state_changed_cb) {
665 ecore_timer_add(0, __tts_notify_state_changed, (void*)tts);
667 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
670 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
671 SLOG(LOG_DEBUG, TAG_TTSC, " ");
673 return TTS_ERROR_NONE;
676 static Eina_Bool __tts_notify_error(void *data)
678 tts_h tts = (tts_h)data;
680 tts_client_s* client = tts_client_get(tts);
683 if (NULL == client) {
684 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify error msg : A handle is not valid");
688 if (NULL != client->error_cb) {
689 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of error");
690 tts_client_use_callback(client);
691 client->error_cb(client->tts, client->utt_id, client->reason, client->error_user_data );
692 tts_client_not_use_callback(client);
694 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
700 int __tts_cb_error(int uid, tts_error_e reason, int utt_id)
702 tts_client_s* client = tts_client_get_by_uid(uid);
704 if (NULL == client) {
705 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
706 return TTS_ERROR_INVALID_PARAMETER;
709 client->utt_id = utt_id;
710 client->reason = reason;
712 /* call callback function */
713 if (NULL != client->error_cb) {
714 ecore_timer_add(0, __tts_notify_error, client->tts);
716 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
722 static Eina_Bool __tts_notify_state_changed(void *data)
724 tts_h tts = (tts_h)data;
726 tts_client_s* client = tts_client_get(tts);
729 if (NULL == client) {
730 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify state changed : A handle is not valid");
734 if (NULL != client->state_changed_cb) {
735 tts_client_use_callback(client);
736 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
737 tts_client_not_use_callback(client);
738 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
740 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
746 int __tts_cb_set_state(int uid, int state)
748 tts_client_s* client = tts_client_get_by_uid(uid);
749 if( NULL == client ) {
750 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] The handle is not valid");
754 tts_state_e state_from_daemon = (tts_state_e)state;
756 if (client->current_state == state_from_daemon) {
757 SLOG(LOG_DEBUG, TAG_TTSC, "Current state has already been %d", client->current_state);
761 if (NULL != client->state_changed_cb) {
762 ecore_timer_add(0, __tts_notify_state_changed, client->tts);
764 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
767 client->before_state = client->current_state;
768 client->current_state = state_from_daemon;
773 static Eina_Bool __tts_notify_utt_started(void *data)
775 tts_h tts = (tts_h)data;
777 tts_client_s* client = tts_client_get(tts);
780 if (NULL == client) {
781 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to notify utt started : A handle is not valid");
785 if (NULL != client->utt_started_cb) {
786 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance started ");
787 tts_client_use_callback(client);
788 client->utt_started_cb(client->tts, client->utt_id, client->utt_started_user_data);
789 tts_client_not_use_callback(client);
791 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance started ");
797 int __tts_cb_utt_started(int uid, int utt_id)
799 tts_client_s* client = tts_client_get_by_uid(uid);
801 if (NULL == client) {
802 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
803 return TTS_ERROR_INVALID_PARAMETER;
806 SLOG(LOG_DEBUG, TAG_TTSC, "utterance started : utt id(%d) ", utt_id);
808 client->utt_id = utt_id;
810 /* call callback function */
811 if (NULL != client->utt_started_cb) {
812 ecore_timer_add(0, __tts_notify_utt_started, client->tts);
814 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance started ");
820 static Eina_Bool __tts_notify_utt_completed(void *data)
822 tts_h tts = (tts_h)data;
824 tts_client_s* client = tts_client_get(tts);
827 if (NULL == client) {
828 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to notify utt completed : A handle is not valid");
832 if (NULL != client->utt_completeted_cb) {
833 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance completed ");
834 tts_client_use_callback(client);
835 client->utt_completeted_cb(client->tts, client->utt_id, client->utt_completed_user_data);
836 tts_client_not_use_callback(client);
838 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance completed ");
844 int __tts_cb_utt_completed(int uid, int utt_id)
846 tts_client_s* client = tts_client_get_by_uid(uid);
848 if (NULL == client) {
849 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
850 return TTS_ERROR_INVALID_PARAMETER;
853 SLOG(LOG_DEBUG, TAG_TTSC, "utterance completed : uttid(%d) ", utt_id);
855 client->utt_id = utt_id;
857 /* call callback function */
858 if (NULL != client->utt_completeted_cb) {
859 ecore_timer_add(0, __tts_notify_utt_completed, client->tts);
861 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance completed ");
867 int tts_set_state_changed_cb(tts_h tts, tts_state_changed_cb callback, void* user_data)
869 if (NULL == tts || NULL == callback) {
870 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Input parameter is null");
871 return TTS_ERROR_INVALID_PARAMETER;
874 tts_client_s* client = tts_client_get(tts);
876 if (NULL == client) {
877 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : A handle is not valid");
878 return TTS_ERROR_INVALID_PARAMETER;
881 if (TTS_STATE_CREATED != client->current_state) {
882 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Current state is not 'Created'.");
883 return TTS_ERROR_INVALID_STATE;
886 client->state_changed_cb = callback;
887 client->state_changed_user_data = user_data;
889 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set state changed cb");
894 int tts_unset_state_changed_cb(tts_h tts)
897 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Input parameter is null");
898 return TTS_ERROR_INVALID_PARAMETER;
901 tts_client_s* client = tts_client_get(tts);
903 if (NULL == client) {
904 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : A handle is not valid");
905 return TTS_ERROR_INVALID_PARAMETER;
908 if (TTS_STATE_CREATED != client->current_state) {
909 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Current state is not 'Created'.");
910 return TTS_ERROR_INVALID_STATE;
913 client->state_changed_cb = NULL;
914 client->state_changed_user_data = NULL;
916 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset state changed cb");
921 int tts_set_utterance_started_cb(tts_h tts, tts_utterance_started_cb callback, void* user_data)
923 if (NULL == tts || NULL == callback) {
924 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Input parameter is null");
925 return TTS_ERROR_INVALID_PARAMETER;
928 tts_client_s* client = tts_client_get(tts);
930 if (NULL == client) {
931 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : A handle is not valid");
932 return TTS_ERROR_INVALID_PARAMETER;
935 if (TTS_STATE_CREATED != client->current_state) {
936 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Current state is not 'Created'.");
937 return TTS_ERROR_INVALID_STATE;
940 client->utt_started_cb = callback;
941 client->utt_started_user_data = user_data;
943 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt started cb");
948 int tts_unset_utterance_started_cb(tts_h tts)
951 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Input parameter is null");
952 return TTS_ERROR_INVALID_PARAMETER;
955 tts_client_s* client = tts_client_get(tts);
957 if (NULL == client) {
958 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : A handle is not valid");
959 return TTS_ERROR_INVALID_PARAMETER;
962 if (TTS_STATE_CREATED != client->current_state) {
963 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Current state is not 'Created'.");
964 return TTS_ERROR_INVALID_STATE;
967 client->utt_started_cb = NULL;
968 client->utt_started_user_data = NULL;
970 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt started cb");
975 int tts_set_utterance_completed_cb(tts_h tts, tts_utterance_completed_cb callback, void* user_data)
977 if (NULL == tts || NULL == callback) {
978 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Input parameter is null");
979 return TTS_ERROR_INVALID_PARAMETER;
982 tts_client_s* client = tts_client_get(tts);
984 if (NULL == client) {
985 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : A handle is not valid");
986 return TTS_ERROR_INVALID_PARAMETER;
989 if (TTS_STATE_CREATED != client->current_state) {
990 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Current state is not 'Created'.");
991 return TTS_ERROR_INVALID_STATE;
994 client->utt_completeted_cb = callback;
995 client->utt_completed_user_data = user_data;
997 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt completed cb");
1002 int tts_unset_utterance_completed_cb(tts_h tts)
1005 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Input parameter is null");
1006 return TTS_ERROR_INVALID_PARAMETER;
1009 tts_client_s* client = tts_client_get(tts);
1011 if (NULL == client) {
1012 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : A handle is not valid");
1013 return TTS_ERROR_INVALID_PARAMETER;
1016 if (TTS_STATE_CREATED != client->current_state) {
1017 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Current state is not 'Created'.");
1018 return TTS_ERROR_INVALID_STATE;
1021 client->utt_completeted_cb = NULL;
1022 client->utt_completed_user_data = NULL;
1024 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt completed cb");
1028 int tts_set_error_cb(tts_h tts, tts_error_cb callback, void* user_data)
1030 if (NULL == tts || NULL == callback) {
1031 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Input parameter is null");
1032 return TTS_ERROR_INVALID_PARAMETER;
1035 tts_client_s* client = tts_client_get(tts);
1037 if (NULL == client) {
1038 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : A handle is not valid");
1039 return TTS_ERROR_INVALID_PARAMETER;
1042 if (TTS_STATE_CREATED != client->current_state) {
1043 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Current state is not 'Created'.");
1044 return TTS_ERROR_INVALID_STATE;
1047 client->error_cb = callback;
1048 client->error_user_data = user_data;
1050 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set error cb");
1055 int tts_unset_error_cb(tts_h tts)
1058 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Input parameter is null");
1059 return TTS_ERROR_INVALID_PARAMETER;
1062 tts_client_s* client = tts_client_get(tts);
1064 if (NULL == client) {
1065 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : A handle is not valid");
1066 return TTS_ERROR_INVALID_PARAMETER;
1069 if (TTS_STATE_CREATED != client->current_state) {
1070 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Current state is not 'Created'.");
1071 return TTS_ERROR_INVALID_STATE;
1074 client->error_cb = NULL;
1075 client->error_user_data = NULL;
1077 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset error cb");
1082 int __get_cmd_line(char *file, char *buf)
1086 fp = fopen(file, "r");
1088 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get command line");
1092 memset(buf, 0, 256);
1093 if (NULL == fgets(buf, 256, fp)) {
1094 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to fget command line");
1102 static bool _tts_is_alive()
1105 struct dirent *entry;
1106 struct stat filestat;
1112 dir = opendir("/proc");
1114 SLOG(LOG_ERROR, TAG_TTSC, "process checking is FAILED");
1118 while ((entry = readdir(dir)) != NULL) {
1119 if (0 != lstat(entry->d_name, &filestat))
1122 if (!S_ISDIR(filestat.st_mode))
1125 pid = atoi(entry->d_name);
1126 if (pid <= 0) continue;
1128 sprintf(tempPath, "/proc/%d/cmdline", pid);
1129 if (0 != __get_cmd_line(tempPath, cmdLine)) {
1133 if ( 0 == strncmp(cmdLine, "[tts-daemon]", strlen("[tts-daemon]")) ||
1134 0 == strncmp(cmdLine, "tts-daemon", strlen("tts-daemon")) ||
1135 0 == strncmp(cmdLine, "/usr/bin/tts-daemon", strlen("/usr/bin/tts-daemon"))) {
1136 SLOG(LOG_DEBUG, TAG_TTSC, "tts-daemon is ALIVE !!");
1142 SLOG(LOG_DEBUG, TAG_TTSC, "THERE IS NO tts-daemon !!");
1148 static int __tts_check_tts_daemon()
1150 if (TRUE == _tts_is_alive()) {
1154 /* fork-exec tts-daemom */
1161 SLOG(LOG_ERROR, TAG_TTSC, "Fail to create tts-daemon");
1166 for (i = 0;i < _NSIG;i++)
1169 execl("/usr/bin/tts-daemon", "/usr/bin/tts-daemon", NULL);