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 int tts_set_mode(tts_h tts, tts_mode_e mode)
122 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set TTS mode");
124 tts_client_s* client = tts_client_get(tts);
127 if (NULL == client) {
128 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
129 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
130 SLOG(LOG_DEBUG, TAG_TTSC, " ");
131 return TTS_ERROR_INVALID_PARAMETER;
135 if (client->current_state != TTS_STATE_CREATED) {
136 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
137 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
138 SLOG(LOG_DEBUG, TAG_TTSC, " ");
139 return TTS_ERROR_INVALID_STATE;
142 if (TTS_MODE_DEFAULT <= mode && mode <= TTS_MODE_SCREEN_READER) {
145 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] mode is not valid : %d", mode);
146 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
147 SLOG(LOG_DEBUG, TAG_TTSC, " ");
148 return TTS_ERROR_INVALID_PARAMETER;
151 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
152 SLOG(LOG_DEBUG, TAG_TTSC, " ");
154 return TTS_ERROR_NONE;
157 int tts_get_mode(tts_h tts, tts_mode_e* mode)
159 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get TTS mode");
161 tts_client_s* client = tts_client_get(tts);
164 if (NULL == client) {
165 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
166 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
167 SLOG(LOG_DEBUG, TAG_TTSC, " ");
168 return TTS_ERROR_INVALID_PARAMETER;
172 if (client->current_state != TTS_STATE_CREATED) {
173 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
174 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
175 SLOG(LOG_DEBUG, TAG_TTSC, " ");
176 return TTS_ERROR_INVALID_STATE;
180 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter(mode) is NULL");
181 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
182 SLOG(LOG_DEBUG, TAG_TTSC, " ");
183 return TTS_ERROR_INVALID_PARAMETER;
186 *mode = client->mode;
188 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
189 SLOG(LOG_DEBUG, TAG_TTSC, " ");
191 return TTS_ERROR_NONE;
194 static Eina_Bool __tts_connect_daemon(void *data)
196 SLOG(LOG_DEBUG, TAG_TTSC, "===== Connect daemon");
198 tts_h tts = (tts_h)data;
200 tts_client_s* client = tts_client_get(tts);
203 if (NULL == client) {
204 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
205 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
206 SLOG(LOG_DEBUG, TAG_TTSC, " ");
211 if (0 != tts_dbus_request_hello()) {
212 if (false == g_is_daemon_started) {
213 g_is_daemon_started = true;
214 __tts_check_tts_daemon();
219 /* do request initialize */
222 ret = tts_dbus_request_initialize(client->uid);
224 if (TTS_ERROR_ENGINE_NOT_FOUND == ret) {
225 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Engine not found");
227 client->reason = TTS_ERROR_ENGINE_NOT_FOUND;
230 ecore_timer_add(0, __tts_notify_error, (void*)client->tts);
233 } else if (TTS_ERROR_NONE != ret) {
234 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to connection");
236 client->reason = TTS_ERROR_TIMED_OUT;
239 ecore_timer_add(0, __tts_notify_error, (void*)client->tts);
242 /* success to connect tts-daemon */
245 client->before_state = client->current_state;
246 client->current_state = TTS_STATE_READY;
248 ecore_timer_add(0, __tts_notify_state_changed, (void*)client->tts);
250 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] uid(%d)", client->uid);
252 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
253 SLOG(LOG_DEBUG, TAG_TTSC, " ");
258 int tts_prepare(tts_h tts)
260 SLOG(LOG_DEBUG, TAG_TTSC, "===== Prepare TTS");
262 tts_client_s* client = tts_client_get(tts);
265 if (NULL == client) {
266 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
267 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
268 SLOG(LOG_DEBUG, TAG_TTSC, " ");
269 return TTS_ERROR_INVALID_PARAMETER;
273 if (client->current_state != TTS_STATE_CREATED) {
274 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
275 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
276 SLOG(LOG_DEBUG, TAG_TTSC, " ");
277 return TTS_ERROR_INVALID_STATE;
280 ecore_timer_add(0, __tts_connect_daemon, (void*)tts);
282 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
283 SLOG(LOG_DEBUG, TAG_TTSC, " ");
285 return TTS_ERROR_NONE;
288 int tts_unprepare(tts_h tts)
290 SLOG(LOG_DEBUG, TAG_TTSC, "===== Unprepare TTS");
292 tts_client_s* client = tts_client_get(tts);
295 if (NULL == client) {
296 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
297 return TTS_ERROR_INVALID_PARAMETER;
301 if (client->current_state != TTS_STATE_READY) {
302 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'READY'");
303 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
304 SLOG(LOG_DEBUG, TAG_TTSC, " ");
305 return TTS_ERROR_INVALID_STATE;
308 int ret = tts_dbus_request_finalize(client->uid);
310 SLOG(LOG_WARN, TAG_TTSC, "[ERROR] Fail to request finalize");
312 g_is_daemon_started = false;
314 client->before_state = client->current_state;
315 client->current_state = TTS_STATE_CREATED;
317 ecore_timer_add(0, __tts_notify_state_changed, (void*)tts);
319 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
320 SLOG(LOG_DEBUG, TAG_TTSC, " ");
322 return TTS_ERROR_NONE;
325 int tts_foreach_supported_voices(tts_h tts, tts_supported_voice_cb callback, void* user_data)
327 SLOG(LOG_DEBUG, TAG_TTSC, "===== Foreach supported voices");
329 if (NULL == tts || NULL == callback) {
330 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
331 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
332 SLOG(LOG_DEBUG, TAG_TTSC, " ");
333 return TTS_ERROR_INVALID_PARAMETER;
336 tts_client_s* client = tts_client_get(tts);
339 if (NULL == client) {
340 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
341 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
342 SLOG(LOG_DEBUG, TAG_TTSC, " ");
343 return TTS_ERROR_INVALID_PARAMETER;
346 if (TTS_STATE_READY != client->current_state) {
347 SLOG(LOG_ERROR, TAG_TTSC, "Current state is NOT 'READY'.");
348 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
349 SLOG(LOG_DEBUG, TAG_TTSC, " ");
350 return TTS_ERROR_INVALID_STATE;
354 ret = tts_dbus_request_get_support_voice(client->uid, client->tts, callback, user_data);
356 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
359 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
360 SLOG(LOG_DEBUG, TAG_TTSC, " ");
365 int tts_get_default_voice(tts_h tts, char** lang, tts_voice_type_e* vctype)
367 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get default voice");
370 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
371 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
372 SLOG(LOG_DEBUG, TAG_TTSC, " ");
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] A handle is not valid");
380 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
381 SLOG(LOG_DEBUG, TAG_TTSC, " ");
382 return TTS_ERROR_INVALID_PARAMETER;
385 if (TTS_STATE_READY != client->current_state) {
386 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is NOT 'READY'. ");
387 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
388 SLOG(LOG_DEBUG, TAG_TTSC, " ");
389 return TTS_ERROR_INVALID_STATE;
392 /* Request call remote method */
394 ret = tts_dbus_request_get_default_voice(client->uid, lang, vctype );
397 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
400 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
401 SLOG(LOG_DEBUG, TAG_TTSC, " ");
406 int tts_get_max_text_count(tts_h tts, int* count)
408 if (NULL == tts || NULL == count) {
409 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Input parameter is null");
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] Get max text count : A handle is not valid");
417 return TTS_ERROR_INVALID_PARAMETER;
420 if (TTS_STATE_READY != client->current_state) {
421 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Current state is NOT 'READY'.");
422 return TTS_ERROR_INVALID_STATE;
425 *count = MAX_TEXT_COUNT;
427 SLOG(LOG_DEBUG, TAG_TTSC, "[Suceess] Get max text count");
428 return TTS_ERROR_NONE;
431 int tts_get_state(tts_h tts, tts_state_e* state)
433 if (NULL == tts || NULL == state) {
434 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : Input parameter is null");
435 return TTS_ERROR_INVALID_PARAMETER;
438 tts_client_s* client = tts_client_get(tts);
440 if (NULL == client) {
441 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
442 return TTS_ERROR_INVALID_PARAMETER;
445 *state = client->current_state;
448 case TTS_STATE_CREATED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Created'"); break;
449 case TTS_STATE_READY: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Ready'"); break;
450 case TTS_STATE_PLAYING: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Playing'"); break;
451 case TTS_STATE_PAUSED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Paused'"); break;
454 return TTS_ERROR_NONE;
457 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)
459 SLOG(LOG_DEBUG, TAG_TTSC, "===== Add text");
461 if (NULL == tts || NULL == utt_id) {
462 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
463 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
464 SLOG(LOG_DEBUG, TAG_TTSC, " ");
465 return TTS_ERROR_INVALID_PARAMETER;
468 tts_client_s* client = tts_client_get(tts);
470 if (NULL == client) {
471 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
472 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
473 SLOG(LOG_DEBUG, TAG_TTSC, " ");
474 return TTS_ERROR_INVALID_PARAMETER;
477 if (TTS_STATE_CREATED == client->current_state) {
478 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
479 return TTS_ERROR_INVALID_STATE;
482 /* change default language value */
485 if (NULL == language)
486 temp = strdup("default");
488 temp = strdup(language);
490 client->current_utt_id ++;
491 if (client->current_utt_id == 10000) {
492 client->current_utt_id = 1;
497 ret = tts_dbus_request_add_text(client->uid, text, temp, voice_type, speed, client->current_utt_id);
499 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
502 *utt_id = client->current_utt_id;
507 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
508 SLOG(LOG_DEBUG, TAG_TTSC, " ");
513 int tts_play(tts_h tts)
515 SLOG(LOG_DEBUG, TAG_TTSC, "===== Play tts");
518 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
519 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
520 SLOG(LOG_DEBUG, TAG_TTSC, " ");
521 return TTS_ERROR_INVALID_PARAMETER;
524 tts_client_s* client = tts_client_get(tts);
526 if (NULL == client) {
527 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
528 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
529 SLOG(LOG_DEBUG, TAG_TTSC, " ");
530 return TTS_ERROR_INVALID_PARAMETER;
533 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
534 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
535 return TTS_ERROR_INVALID_STATE;
539 ret = tts_dbus_request_play(client->uid);
541 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Request play : result(%d)", ret);
542 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
543 SLOG(LOG_DEBUG, TAG_TTSC, " ");
547 client->before_state = client->current_state;
548 client->current_state = TTS_STATE_PLAYING;
550 if (NULL != client->state_changed_cb) {
551 ecore_timer_add(0, __tts_notify_state_changed, (void*)tts);
553 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
556 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
557 SLOG(LOG_DEBUG, TAG_TTSC, " ");
559 return TTS_ERROR_NONE;
563 int tts_stop(tts_h tts)
565 SLOG(LOG_DEBUG, TAG_TTSC, "===== Stop tts");
568 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
569 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
570 SLOG(LOG_DEBUG, TAG_TTSC, " ");
571 return TTS_ERROR_INVALID_PARAMETER;
574 tts_client_s* client = tts_client_get(tts);
576 if (NULL == client) {
577 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
578 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
579 SLOG(LOG_DEBUG, TAG_TTSC, " ");
580 return TTS_ERROR_INVALID_PARAMETER;
583 if (TTS_STATE_CREATED == client->current_state) {
584 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
585 return TTS_ERROR_INVALID_STATE;
589 ret = tts_dbus_request_stop(client->uid);
591 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
592 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
593 SLOG(LOG_DEBUG, TAG_TTSC, " ");
597 client->before_state = client->current_state;
598 client->current_state = TTS_STATE_READY;
600 if (NULL != client->state_changed_cb) {
601 ecore_timer_add(0, __tts_notify_state_changed, (void*)tts);
603 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
606 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
607 SLOG(LOG_DEBUG, TAG_TTSC, " ");
609 return TTS_ERROR_NONE;
613 int tts_pause(tts_h tts)
615 SLOG(LOG_DEBUG, TAG_TTSC, "===== Pause tts");
618 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
619 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
620 SLOG(LOG_DEBUG, TAG_TTSC, " ");
621 return TTS_ERROR_INVALID_PARAMETER;
624 tts_client_s* client = tts_client_get(tts);
626 if (NULL == client) {
627 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
628 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
629 SLOG(LOG_DEBUG, TAG_TTSC, " ");
630 return TTS_ERROR_INVALID_PARAMETER;
633 if (TTS_STATE_PLAYING != client->current_state) {
634 SLOG(LOG_ERROR, TAG_TTSC, "[Error] The Current state is NOT 'playing'. So this request should be not running.");
635 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
636 SLOG(LOG_DEBUG, TAG_TTSC, " ");
637 return TTS_ERROR_INVALID_STATE;
641 ret = tts_dbus_request_pause(client->uid);
643 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Request pause : result(%d)", ret);
644 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
645 SLOG(LOG_DEBUG, TAG_TTSC, " ");
649 client->before_state = client->current_state;
650 client->current_state = TTS_STATE_PAUSED;
652 if (NULL != client->state_changed_cb) {
653 ecore_timer_add(0, __tts_notify_state_changed, (void*)tts);
655 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
658 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
659 SLOG(LOG_DEBUG, TAG_TTSC, " ");
661 return TTS_ERROR_NONE;
664 static Eina_Bool __tts_notify_error(void *data)
666 tts_h tts = (tts_h)data;
668 tts_client_s* client = tts_client_get(tts);
671 if (NULL == client) {
672 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify error msg : A handle is not valid");
676 if (NULL != client->error_cb) {
677 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of error");
678 tts_client_use_callback(client);
679 client->error_cb(client->tts, client->utt_id, client->reason, client->error_user_data );
680 tts_client_not_use_callback(client);
682 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
688 int __tts_cb_error(int uid, tts_error_e reason, int utt_id)
690 tts_client_s* client = tts_client_get_by_uid(uid);
692 if (NULL == client) {
693 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
694 return TTS_ERROR_INVALID_PARAMETER;
697 client->utt_id = utt_id;
698 client->reason = reason;
700 /* call callback function */
701 if (NULL != client->error_cb) {
702 ecore_timer_add(0, __tts_notify_error, client->tts);
704 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
710 static Eina_Bool __tts_notify_state_changed(void *data)
712 tts_h tts = (tts_h)data;
714 tts_client_s* client = tts_client_get(tts);
717 if (NULL == client) {
718 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify state changed : A handle is not valid");
722 if (NULL != client->state_changed_cb) {
723 tts_client_use_callback(client);
724 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
725 tts_client_not_use_callback(client);
726 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
728 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
734 int __tts_cb_set_state(int uid, int state)
736 tts_client_s* client = tts_client_get_by_uid(uid);
737 if( NULL == client ) {
738 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] The handle is not valid");
742 tts_state_e state_from_daemon = (tts_state_e)state;
744 if (client->current_state == state_from_daemon) {
745 SLOG(LOG_DEBUG, TAG_TTSC, "Current state has already been %d", client->current_state);
749 if (NULL != client->state_changed_cb) {
750 ecore_timer_add(0, __tts_notify_state_changed, client->tts);
752 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
755 client->before_state = client->current_state;
756 client->current_state = state_from_daemon;
761 static Eina_Bool __tts_notify_utt_started(void *data)
763 tts_h tts = (tts_h)data;
765 tts_client_s* client = tts_client_get(tts);
768 if (NULL == client) {
769 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to notify utt started : A handle is not valid");
773 if (NULL != client->utt_started_cb) {
774 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance started ");
775 tts_client_use_callback(client);
776 client->utt_started_cb(client->tts, client->utt_id, client->utt_started_user_data);
777 tts_client_not_use_callback(client);
779 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance started ");
785 int __tts_cb_utt_started(int uid, int utt_id)
787 tts_client_s* client = tts_client_get_by_uid(uid);
789 if (NULL == client) {
790 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
791 return TTS_ERROR_INVALID_PARAMETER;
794 SLOG(LOG_DEBUG, TAG_TTSC, "utterance started : utt id(%d) ", utt_id);
796 client->utt_id = utt_id;
798 /* call callback function */
799 if (NULL != client->utt_started_cb) {
800 ecore_timer_add(0, __tts_notify_utt_started, client->tts);
802 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance started ");
808 static Eina_Bool __tts_notify_utt_completed(void *data)
810 tts_h tts = (tts_h)data;
812 tts_client_s* client = tts_client_get(tts);
815 if (NULL == client) {
816 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to notify utt completed : A handle is not valid");
820 if (NULL != client->utt_completeted_cb) {
821 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance completed ");
822 tts_client_use_callback(client);
823 client->utt_completeted_cb(client->tts, client->utt_id, client->utt_completed_user_data);
824 tts_client_not_use_callback(client);
826 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance completed ");
832 int __tts_cb_utt_completed(int uid, int utt_id)
834 tts_client_s* client = tts_client_get_by_uid(uid);
836 if (NULL == client) {
837 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
838 return TTS_ERROR_INVALID_PARAMETER;
841 SLOG(LOG_DEBUG, TAG_TTSC, "utterance completed : uttid(%d) ", utt_id);
843 client->utt_id = utt_id;
845 /* call callback function */
846 if (NULL != client->utt_completeted_cb) {
847 ecore_timer_add(0, __tts_notify_utt_completed, client->tts);
849 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance completed ");
855 int tts_set_state_changed_cb(tts_h tts, tts_state_changed_cb callback, void* user_data)
857 if (NULL == tts || NULL == callback) {
858 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Input parameter is null");
859 return TTS_ERROR_INVALID_PARAMETER;
862 tts_client_s* client = tts_client_get(tts);
864 if (NULL == client) {
865 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : A handle is not valid");
866 return TTS_ERROR_INVALID_PARAMETER;
869 if (TTS_STATE_CREATED != client->current_state) {
870 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Current state is not 'Created'.");
871 return TTS_ERROR_INVALID_STATE;
874 client->state_changed_cb = callback;
875 client->state_changed_user_data = user_data;
877 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set state changed cb");
882 int tts_unset_state_changed_cb(tts_h tts)
885 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Input parameter is null");
886 return TTS_ERROR_INVALID_PARAMETER;
889 tts_client_s* client = tts_client_get(tts);
891 if (NULL == client) {
892 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : A handle is not valid");
893 return TTS_ERROR_INVALID_PARAMETER;
896 if (TTS_STATE_CREATED != client->current_state) {
897 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Current state is not 'Created'.");
898 return TTS_ERROR_INVALID_STATE;
901 client->state_changed_cb = NULL;
902 client->state_changed_user_data = NULL;
904 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset state changed cb");
909 int tts_set_utterance_started_cb(tts_h tts, tts_utterance_started_cb callback, void* user_data)
911 if (NULL == tts || NULL == callback) {
912 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Input parameter is null");
913 return TTS_ERROR_INVALID_PARAMETER;
916 tts_client_s* client = tts_client_get(tts);
918 if (NULL == client) {
919 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : A handle is not valid");
920 return TTS_ERROR_INVALID_PARAMETER;
923 if (TTS_STATE_CREATED != client->current_state) {
924 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Current state is not 'Created'.");
925 return TTS_ERROR_INVALID_STATE;
928 client->utt_started_cb = callback;
929 client->utt_started_user_data = user_data;
931 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt started cb");
936 int tts_unset_utterance_started_cb(tts_h tts)
939 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Input parameter is null");
940 return TTS_ERROR_INVALID_PARAMETER;
943 tts_client_s* client = tts_client_get(tts);
945 if (NULL == client) {
946 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : A handle is not valid");
947 return TTS_ERROR_INVALID_PARAMETER;
950 if (TTS_STATE_CREATED != client->current_state) {
951 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Current state is not 'Created'.");
952 return TTS_ERROR_INVALID_STATE;
955 client->utt_started_cb = NULL;
956 client->utt_started_user_data = NULL;
958 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt started cb");
963 int tts_set_utterance_completed_cb(tts_h tts, tts_utterance_completed_cb callback, void* user_data)
965 if (NULL == tts || NULL == callback) {
966 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Input parameter is null");
967 return TTS_ERROR_INVALID_PARAMETER;
970 tts_client_s* client = tts_client_get(tts);
972 if (NULL == client) {
973 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : A handle is not valid");
974 return TTS_ERROR_INVALID_PARAMETER;
977 if (TTS_STATE_CREATED != client->current_state) {
978 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Current state is not 'Created'.");
979 return TTS_ERROR_INVALID_STATE;
982 client->utt_completeted_cb = callback;
983 client->utt_completed_user_data = user_data;
985 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt completed cb");
990 int tts_unset_utterance_completed_cb(tts_h tts)
993 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Input parameter is null");
994 return TTS_ERROR_INVALID_PARAMETER;
997 tts_client_s* client = tts_client_get(tts);
999 if (NULL == client) {
1000 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : A handle is not valid");
1001 return TTS_ERROR_INVALID_PARAMETER;
1004 if (TTS_STATE_CREATED != client->current_state) {
1005 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Current state is not 'Created'.");
1006 return TTS_ERROR_INVALID_STATE;
1009 client->utt_completeted_cb = NULL;
1010 client->utt_completed_user_data = NULL;
1012 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt completed cb");
1016 int tts_set_error_cb(tts_h tts, tts_error_cb callback, void* user_data)
1018 if (NULL == tts || NULL == callback) {
1019 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Input parameter is null");
1020 return TTS_ERROR_INVALID_PARAMETER;
1023 tts_client_s* client = tts_client_get(tts);
1025 if (NULL == client) {
1026 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : A handle is not valid");
1027 return TTS_ERROR_INVALID_PARAMETER;
1030 if (TTS_STATE_CREATED != client->current_state) {
1031 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Current state is not 'Created'.");
1032 return TTS_ERROR_INVALID_STATE;
1035 client->error_cb = callback;
1036 client->error_user_data = user_data;
1038 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set error cb");
1043 int tts_unset_error_cb(tts_h tts)
1046 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Input parameter is null");
1047 return TTS_ERROR_INVALID_PARAMETER;
1050 tts_client_s* client = tts_client_get(tts);
1052 if (NULL == client) {
1053 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : A handle is not valid");
1054 return TTS_ERROR_INVALID_PARAMETER;
1057 if (TTS_STATE_CREATED != client->current_state) {
1058 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Current state is not 'Created'.");
1059 return TTS_ERROR_INVALID_STATE;
1062 client->error_cb = NULL;
1063 client->error_user_data = NULL;
1065 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset error cb");
1070 int __get_cmd_line(char *file, char *buf)
1074 fp = fopen(file, "r");
1076 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get command line");
1080 memset(buf, 0, 256);
1081 if (NULL == fgets(buf, 256, fp)) {
1082 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to fget command line");
1090 static bool _tts_is_alive()
1093 struct dirent *entry;
1094 struct stat filestat;
1100 dir = opendir("/proc");
1102 SLOG(LOG_ERROR, TAG_TTSC, "process checking is FAILED");
1106 while ((entry = readdir(dir)) != NULL) {
1107 if (0 != lstat(entry->d_name, &filestat))
1110 if (!S_ISDIR(filestat.st_mode))
1113 pid = atoi(entry->d_name);
1114 if (pid <= 0) continue;
1116 sprintf(tempPath, "/proc/%d/cmdline", pid);
1117 if (0 != __get_cmd_line(tempPath, cmdLine)) {
1121 if ( 0 == strncmp(cmdLine, "[tts-daemon]", strlen("[tts-daemon]")) ||
1122 0 == strncmp(cmdLine, "tts-daemon", strlen("tts-daemon")) ||
1123 0 == strncmp(cmdLine, "/usr/bin/tts-daemon", strlen("/usr/bin/tts-daemon"))) {
1124 SLOG(LOG_DEBUG, TAG_TTSC, "tts-daemon is ALIVE !!");
1130 SLOG(LOG_DEBUG, TAG_TTSC, "THERE IS NO tts-daemon !!");
1136 static int __tts_check_tts_daemon()
1138 if (TRUE == _tts_is_alive()) {
1142 /* fork-exec tts-daemom */
1149 SLOG(LOG_ERROR, TAG_TTSC, "Fail to create tts-daemon");
1154 for (i = 0;i < _NSIG;i++)
1157 execl("/usr/bin/tts-daemon", "/usr/bin/tts-daemon", NULL);