2 * Copyright (c) 2011-2014 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>
20 #include <system_info.h>
24 #include "tts_client.h"
25 #include "tts_config_mgr.h"
30 static bool g_is_daemon_started = false;
32 static bool g_is_noti_daemon_started = false;
34 static bool g_is_sr_daemon_started = false;
36 static Ecore_Timer* g_connect_timer = NULL;
38 static bool g_screen_reader;
40 /* Function definition */
41 static Eina_Bool __tts_notify_state_changed(void *data);
42 static Eina_Bool __tts_notify_error(void *data);
49 static const char* __tts_get_error_code(tts_error_e err)
52 case TTS_ERROR_NONE: return "TTS_ERROR_NONE";
53 case TTS_ERROR_OUT_OF_MEMORY: return "TTS_ERROR_OUT_OF_MEMORY";
54 case TTS_ERROR_IO_ERROR: return "TTS_ERROR_IO_ERROR";
55 case TTS_ERROR_INVALID_PARAMETER: return "TTS_ERROR_INVALID_PARAMETER";
56 case TTS_ERROR_OUT_OF_NETWORK: return "TTS_ERROR_OUT_OF_NETWORK";
57 case TTS_ERROR_TIMED_OUT: return "TTS_ERROR_TIMED_OUT";
58 case TTS_ERROR_PERMISSION_DENIED: return "TTS_ERROR_PERMISSION_DENIED";
59 case TTS_ERROR_NOT_SUPPORTED: return "TTS_ERROR_NOT_SUPPORTED";
60 case TTS_ERROR_INVALID_STATE: return "TTS_ERROR_INVALID_STATE";
61 case TTS_ERROR_INVALID_VOICE: return "TTS_ERROR_INVALID_VOICE";
62 case TTS_ERROR_ENGINE_NOT_FOUND: return "TTS_ERROR_ENGINE_NOT_FOUND";
63 case TTS_ERROR_OPERATION_FAILED: return "TTS_ERROR_OPERATION_FAILED";
64 case TTS_ERROR_AUDIO_POLICY_BLOCKED: return "TTS_ERROR_AUDIO_POLICY_BLOCKED";
66 return "Invalid error code";
71 static int __tts_convert_config_error_code(tts_config_error_e code)
73 if (code == TTS_CONFIG_ERROR_NONE) return TTS_ERROR_NONE;
74 if (code == TTS_CONFIG_ERROR_OUT_OF_MEMORY) return TTS_ERROR_OUT_OF_MEMORY;
75 if (code == TTS_CONFIG_ERROR_IO_ERROR) return TTS_ERROR_IO_ERROR;
76 if (code == TTS_CONFIG_ERROR_INVALID_PARAMETER) return TTS_ERROR_INVALID_PARAMETER;
77 if (code == TTS_CONFIG_ERROR_INVALID_STATE) return TTS_ERROR_INVALID_STATE;
78 if (code == TTS_CONFIG_ERROR_INVALID_VOICE) return TTS_ERROR_INVALID_VOICE;
79 if (code == TTS_CONFIG_ERROR_ENGINE_NOT_FOUND) return TTS_ERROR_ENGINE_NOT_FOUND;
80 if (code == TTS_CONFIG_ERROR_OPERATION_FAILED) return TTS_ERROR_OPERATION_FAILED;
81 if (code == TTS_CONFIG_ERROR_NOT_SUPPORTED_FEATURE) return TTS_ERROR_OPERATION_FAILED;
86 void __tts_config_voice_changed_cb(const char* before_lang, int before_voice_type, const char* language, int voice_type, bool auto_voice, void* user_data)
88 SECURE_SLOG(LOG_DEBUG, TAG_TTSC, "Voice changed : Before lang(%s) type(%d) , Current lang(%s), type(%d)",
89 before_lang, before_voice_type, language, voice_type);
91 GList* client_list = NULL;
92 client_list = tts_client_get_client_list();
95 tts_client_s *data = NULL;
97 if (g_list_length(client_list) > 0) {
98 /* Get a first item */
99 iter = g_list_first(client_list);
101 while (NULL != iter) {
103 if (NULL != data->default_voice_changed_cb) {
104 SECURE_SLOG(LOG_DEBUG, TAG_TTSC, "Call default voice changed callback : uid(%d)", data->uid);
105 data->default_voice_changed_cb(data->tts, before_lang, before_voice_type,
106 language, voice_type, data->default_voice_changed_user_data);
110 iter = g_list_next(iter);
117 int tts_create(tts_h* tts)
119 bool tts_supported = false;
120 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
121 if (false == tts_supported) {
122 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
123 return TTS_ERROR_NOT_SUPPORTED;
127 SLOG(LOG_DEBUG, TAG_TTSC, "===== Create TTS");
131 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
132 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
133 SLOG(LOG_DEBUG, TAG_TTSC, " ");
134 return TTS_ERROR_INVALID_PARAMETER;
137 if (0 == tts_client_get_size()) {
138 if (0 != tts_dbus_open_connection()) {
139 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to open dbus connection");
140 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
141 SLOG(LOG_DEBUG, TAG_TTSC, " ");
142 return TTS_ERROR_OPERATION_FAILED;
146 if (0 != tts_client_new(tts)) {
147 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to create client!!!!!");
148 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
149 SLOG(LOG_DEBUG, TAG_TTSC, " ");
150 return TTS_ERROR_OUT_OF_MEMORY;
153 tts_client_s* client = tts_client_get(*tts);
154 if (NULL == client) {
155 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get client");
156 return TTS_ERROR_OPERATION_FAILED;
159 int ret = tts_config_mgr_initialize(client->uid);
161 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to init config manager : %d", ret);
162 tts_client_destroy(*tts);
163 return __tts_convert_config_error_code(ret);
166 ret = tts_config_mgr_set_callback(client->uid, NULL, __tts_config_voice_changed_cb, NULL, NULL, NULL);
168 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to set config changed : %d", ret);
169 tts_client_destroy(*tts);
170 return __tts_convert_config_error_code(ret);
173 g_is_daemon_started = false;
174 g_is_noti_daemon_started = false;
175 g_is_sr_daemon_started = false;
177 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
178 SLOG(LOG_DEBUG, TAG_TTSC, " ");
180 return TTS_ERROR_NONE;
183 int tts_destroy(tts_h tts)
185 bool tts_supported = false;
186 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
187 if (false == tts_supported) {
188 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
189 return TTS_ERROR_NOT_SUPPORTED;
193 SLOG(LOG_DEBUG, TAG_TTSC, "===== Destroy TTS");
196 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
197 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
198 SLOG(LOG_DEBUG, TAG_TTSC, " ");
199 return TTS_ERROR_INVALID_PARAMETER;
202 tts_client_s* client = tts_client_get(tts);
205 if (NULL == client) {
206 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
207 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
208 SLOG(LOG_DEBUG, TAG_TTSC, " ");
209 return TTS_ERROR_INVALID_PARAMETER;
212 /* check used callback */
213 if (0 != tts_client_get_use_callback(client)) {
214 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Cannot destroy in Callback function");
215 return TTS_ERROR_OPERATION_FAILED;
218 tts_config_mgr_finalize(client->uid);
224 switch (client->current_state) {
225 case TTS_STATE_PAUSED:
226 case TTS_STATE_PLAYING:
227 case TTS_STATE_READY:
228 if (!(false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode)) {
230 ret = tts_dbus_request_finalize(client->uid);
232 if (TTS_ERROR_TIMED_OUT != ret) {
233 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
236 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry finalize");
240 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
247 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Do not request finalize : g_sr(%d) mode(%d)", g_screen_reader, client->mode);
250 if (TTS_MODE_SCREEN_READER == client->mode)
251 g_is_sr_daemon_started = false;
252 else if (TTS_MODE_NOTIFICATION == client->mode)
253 g_is_noti_daemon_started = false;
255 g_is_daemon_started = false;
257 if (0 == tts_client_get_mode_client_count(client->mode)) {
258 SLOG(LOG_DEBUG, TAG_TTSC, "Close file msg connection : mode(%d)", client->mode);
259 ret = tts_file_msg_close_connection(client->mode);
261 SLOG(LOG_WARN, TAG_TTSC, "[ERROR] Fail to close file message connection");
264 client->before_state = client->current_state;
265 client->current_state = TTS_STATE_CREATED;
267 case TTS_STATE_CREATED:
268 if (NULL != g_connect_timer) {
269 SLOG(LOG_DEBUG, TAG_TTSC, "Connect Timer is deleted");
270 ecore_timer_del(g_connect_timer);
273 tts_client_destroy(tts);
280 if (0 == tts_client_get_size()) {
281 if (0 != tts_dbus_close_connection()) {
282 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to close connection");
286 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
287 SLOG(LOG_DEBUG, TAG_TTSC, " ");
289 return TTS_ERROR_NONE;
292 void __tts_screen_reader_changed_cb(bool value)
294 g_screen_reader = value;
297 int tts_set_mode(tts_h tts, tts_mode_e mode)
299 bool tts_supported = false;
300 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
301 if (false == tts_supported) {
302 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
303 return TTS_ERROR_NOT_SUPPORTED;
307 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set TTS mode");
309 tts_client_s* client = tts_client_get(tts);
312 if (NULL == client) {
313 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
314 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
315 SLOG(LOG_DEBUG, TAG_TTSC, " ");
316 return TTS_ERROR_INVALID_PARAMETER;
320 if (client->current_state != TTS_STATE_CREATED) {
321 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
322 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
323 SLOG(LOG_DEBUG, TAG_TTSC, " ");
324 return TTS_ERROR_INVALID_STATE;
327 if (TTS_MODE_DEFAULT <= mode && mode <= TTS_MODE_SCREEN_READER) {
330 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] mode is not valid : %d", mode);
331 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
332 SLOG(LOG_DEBUG, TAG_TTSC, " ");
333 return TTS_ERROR_INVALID_PARAMETER;
336 if (TTS_MODE_SCREEN_READER == mode) {
339 ret = vconf_get_bool(TTS_ACCESSIBILITY_KEY, &screen_reader);
341 SLOG(LOG_ERROR, tts_tag(), "[Config ERROR] Fail to get screen reader");
342 return TTS_ERROR_OPERATION_FAILED;
344 g_screen_reader = (bool)screen_reader;
345 tts_config_set_screen_reader_callback(client->uid, __tts_screen_reader_changed_cb);
347 tts_config_unset_screen_reader_callback(client->uid);
350 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
351 SLOG(LOG_DEBUG, TAG_TTSC, " ");
353 return TTS_ERROR_NONE;
356 int tts_get_mode(tts_h tts, tts_mode_e* mode)
358 bool tts_supported = false;
359 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
360 if (false == tts_supported) {
361 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
362 return TTS_ERROR_NOT_SUPPORTED;
366 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get TTS mode");
368 tts_client_s* client = tts_client_get(tts);
371 if (NULL == client) {
372 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
373 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
374 SLOG(LOG_DEBUG, TAG_TTSC, " ");
375 return TTS_ERROR_INVALID_PARAMETER;
379 if (client->current_state != TTS_STATE_CREATED) {
380 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
381 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
382 SLOG(LOG_DEBUG, TAG_TTSC, " ");
383 return TTS_ERROR_INVALID_STATE;
387 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter(mode) is NULL");
388 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
389 SLOG(LOG_DEBUG, TAG_TTSC, " ");
390 return TTS_ERROR_INVALID_PARAMETER;
393 *mode = client->mode;
395 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
396 SLOG(LOG_DEBUG, TAG_TTSC, " ");
398 return TTS_ERROR_NONE;
401 static void* __fork_tts_daemon(void* data)
403 char daemon_path[64] = {'\0',};
407 mode = (tts_mode_e)data;
409 if (TTS_MODE_DEFAULT == mode) {
410 snprintf(daemon_path, 64, "%s", "/usr/bin/tts-daemon");
411 } else if (TTS_MODE_NOTIFICATION == mode) {
412 snprintf(daemon_path, 64, "%s", "/usr/bin/tts-daemon-noti");
413 } else if (TTS_MODE_SCREEN_READER == mode) {
414 snprintf(daemon_path, 64, "%s", "/usr/bin/tts-daemon-sr");
416 SLOG(LOG_ERROR, TAG_TTSC, "mode is not valid");
420 /* fork-exec daemom */
425 SLOG(LOG_ERROR, TAG_TTSC, "Fail to create daemon");
430 for (i = 0;i < _NSIG;i++)
433 execl(daemon_path, daemon_path, NULL);
443 static Eina_Bool __tts_connect_daemon(void *data)
445 tts_h tts = (tts_h)data;
446 tts_client_s* client = tts_client_get(tts);
449 if (NULL == client) {
450 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
451 g_connect_timer = NULL;
456 if (0 != tts_dbus_request_hello(client->uid)) {
460 if (TTS_MODE_SCREEN_READER == client->mode) {
461 if (false == g_is_sr_daemon_started) {
462 g_is_sr_daemon_started = true;
463 thread_id = pthread_create(&thread, NULL, __fork_tts_daemon, (void*)TTS_MODE_SCREEN_READER);
465 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to make thread");
466 g_connect_timer = NULL;
469 pthread_detach(thread);
471 } else if (TTS_MODE_NOTIFICATION == client->mode) {
472 if (false == g_is_noti_daemon_started) {
473 g_is_noti_daemon_started = true;
474 thread_id = pthread_create(&thread, NULL, __fork_tts_daemon, (void*)TTS_MODE_NOTIFICATION);
476 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to make thread");
477 g_connect_timer = NULL;
480 pthread_detach(thread);
483 if (false == g_is_daemon_started) {
484 g_is_daemon_started = true;
485 thread_id = pthread_create(&thread, NULL, __fork_tts_daemon, (void*)TTS_MODE_DEFAULT);
487 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to make thread");
488 g_connect_timer = NULL;
491 pthread_detach(thread);
498 SLOG(LOG_DEBUG, TAG_TTSC, "===== Connect daemon");
500 /* do request initialize */
502 ret = tts_dbus_request_initialize(client->uid);
504 if (TTS_ERROR_ENGINE_NOT_FOUND == ret) {
505 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to initialize : %s", __tts_get_error_code(ret));
507 client->reason = TTS_ERROR_ENGINE_NOT_FOUND;
510 ecore_timer_add(0, __tts_notify_error, (void*)client->tts);
511 g_connect_timer = NULL;
514 } else if (TTS_ERROR_NONE != ret) {
515 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to connection. Retry to connect : %s", __tts_get_error_code(ret));
519 /* success to connect tts-daemon */
522 g_connect_timer = NULL;
524 if (0 == tts_client_get_mode_client_count(client->mode)) {
525 SLOG(LOG_DEBUG, TAG_TTSC, "Open file msg connection : mode(%d)", client->mode);
526 ret = tts_file_msg_open_connection(client->mode);
528 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to open file message connection");
529 ecore_timer_add(0, __tts_notify_error, (void*)client->tts);
534 client = tts_client_get(tts);
536 if (NULL == client) {
537 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
541 client->before_state = client->current_state;
542 client->current_state = TTS_STATE_READY;
544 if (NULL != client->state_changed_cb) {
545 tts_client_use_callback(client);
546 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
547 tts_client_not_use_callback(client);
549 SLOG(LOG_WARN, TAG_TTSC, "State changed callback is NULL");
552 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
553 SLOG(LOG_DEBUG, TAG_TTSC, " ");
558 int tts_prepare(tts_h tts)
560 bool tts_supported = false;
561 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
562 if (false == tts_supported) {
563 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
564 return TTS_ERROR_NOT_SUPPORTED;
568 SLOG(LOG_DEBUG, TAG_TTSC, "===== Prepare TTS");
570 tts_client_s* client = tts_client_get(tts);
573 if (NULL == client) {
574 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
575 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
576 SLOG(LOG_DEBUG, TAG_TTSC, " ");
577 return TTS_ERROR_INVALID_PARAMETER;
581 if (client->current_state != TTS_STATE_CREATED) {
582 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
583 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
584 SLOG(LOG_DEBUG, TAG_TTSC, " ");
585 return TTS_ERROR_INVALID_STATE;
588 g_connect_timer = ecore_timer_add(0, __tts_connect_daemon, (void*)tts);
590 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
591 SLOG(LOG_DEBUG, TAG_TTSC, " ");
593 return TTS_ERROR_NONE;
596 int tts_unprepare(tts_h tts)
598 bool tts_supported = false;
599 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
600 if (false == tts_supported) {
601 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
602 return TTS_ERROR_NOT_SUPPORTED;
606 SLOG(LOG_DEBUG, TAG_TTSC, "===== Unprepare TTS");
608 tts_client_s* client = tts_client_get(tts);
611 if (NULL == client) {
612 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
613 return TTS_ERROR_INVALID_PARAMETER;
617 if (client->current_state != TTS_STATE_READY) {
618 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'READY'");
619 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
620 SLOG(LOG_DEBUG, TAG_TTSC, " ");
621 return TTS_ERROR_INVALID_STATE;
626 if (!(false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode)) {
628 ret = tts_dbus_request_finalize(client->uid);
630 if (TTS_ERROR_TIMED_OUT != ret) {
631 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
634 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry finalize : %s", __tts_get_error_code(ret));
638 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
645 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Do not request finalize : g_sr(%d) mode(%d)", g_screen_reader, client->mode);
648 if (TTS_MODE_SCREEN_READER == client->mode)
649 g_is_sr_daemon_started = false;
650 else if (TTS_MODE_NOTIFICATION == client->mode)
651 g_is_noti_daemon_started = false;
653 g_is_daemon_started = false;
655 client->before_state = client->current_state;
656 client->current_state = TTS_STATE_CREATED;
658 if (NULL != client->state_changed_cb) {
659 tts_client_use_callback(client);
660 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
661 tts_client_not_use_callback(client);
662 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
665 /* Close file message connection */
666 if (0 == tts_client_get_mode_client_count(client->mode)) {
667 SLOG(LOG_DEBUG, TAG_TTSC, "Close file msg connection : mode(%d)", client->mode);
668 ret = tts_file_msg_close_connection(client->mode);
670 SLOG(LOG_WARN, TAG_TTSC, "[ERROR] Fail to close file message connection");
673 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
674 SLOG(LOG_DEBUG, TAG_TTSC, " ");
676 return TTS_ERROR_NONE;
679 bool __tts_supported_voice_cb(const char* engine_id, const char* language, int type, void* user_data)
681 tts_h tts = (tts_h)user_data;
683 tts_client_s* client = tts_client_get(tts);
684 if (NULL == client) {
685 SLOG(LOG_ERROR, TAG_TTSC, "[WARNING] A handle is not valid");
689 /* call callback function */
690 if (NULL != client->supported_voice_cb) {
691 return client->supported_voice_cb(tts, language, type, client->supported_voice_user_data);
693 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of supported voice");
699 int tts_foreach_supported_voices(tts_h tts, tts_supported_voice_cb callback, void* user_data)
701 bool tts_supported = false;
702 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
703 if (false == tts_supported) {
704 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
705 return TTS_ERROR_NOT_SUPPORTED;
709 SLOG(LOG_DEBUG, TAG_TTSC, "===== Foreach supported voices");
711 if (NULL == tts || NULL == callback) {
712 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
713 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
714 SLOG(LOG_DEBUG, TAG_TTSC, " ");
715 return TTS_ERROR_INVALID_PARAMETER;
718 tts_client_s* client = tts_client_get(tts);
721 if (NULL == client) {
722 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
723 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
724 SLOG(LOG_DEBUG, TAG_TTSC, " ");
725 return TTS_ERROR_INVALID_PARAMETER;
729 char* current_engine = NULL;
730 ret = tts_config_mgr_get_engine(¤t_engine);
732 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get current engine : %d", ret);
733 return __tts_convert_config_error_code(ret);
736 client->supported_voice_cb = callback;
737 client->supported_voice_user_data = user_data;
739 ret = tts_config_mgr_get_voice_list(current_engine, __tts_supported_voice_cb, client->tts);
741 if (NULL != current_engine)
742 free(current_engine);
744 client->supported_voice_cb = NULL;
745 client->supported_voice_user_data = NULL;
748 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
749 ret = TTS_ERROR_OPERATION_FAILED;
752 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
753 SLOG(LOG_DEBUG, TAG_TTSC, " ");
758 int tts_get_default_voice(tts_h tts, char** lang, int* vctype)
760 bool tts_supported = false;
761 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
762 if (false == tts_supported) {
763 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
764 return TTS_ERROR_NOT_SUPPORTED;
768 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get default voice");
771 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
772 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
773 SLOG(LOG_DEBUG, TAG_TTSC, " ");
774 return TTS_ERROR_INVALID_PARAMETER;
777 tts_client_s* client = tts_client_get(tts);
779 if (NULL == client) {
780 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
781 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
782 SLOG(LOG_DEBUG, TAG_TTSC, " ");
783 return TTS_ERROR_INVALID_PARAMETER;
786 /* Request call remote method */
788 ret = tts_config_mgr_get_voice(lang, vctype);
790 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
791 return __tts_convert_config_error_code(ret);
793 SECURE_SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] Default language(%s), type(%d)", *lang, *vctype);
796 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
797 SLOG(LOG_DEBUG, TAG_TTSC, " ");
802 int tts_get_max_text_size(tts_h tts, unsigned int* size)
804 bool tts_supported = false;
805 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
806 if (false == tts_supported) {
807 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
808 return TTS_ERROR_NOT_SUPPORTED;
812 if (NULL == tts || NULL == size) {
813 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Input parameter is null");
814 return TTS_ERROR_INVALID_PARAMETER;
817 tts_client_s* client = tts_client_get(tts);
819 if (NULL == client) {
820 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : A handle is not valid");
821 return TTS_ERROR_INVALID_PARAMETER;
824 if (TTS_STATE_READY != client->current_state) {
825 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Current state is NOT 'READY'.");
826 return TTS_ERROR_INVALID_STATE;
829 *size = TTS_MAX_TEXT_SIZE;
831 SLOG(LOG_DEBUG, TAG_TTSC, "Get max text count : %d", *size);
832 return TTS_ERROR_NONE;
835 int tts_get_state(tts_h tts, tts_state_e* state)
837 bool tts_supported = false;
838 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
839 if (false == tts_supported) {
840 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
841 return TTS_ERROR_NOT_SUPPORTED;
845 if (NULL == tts || NULL == state) {
846 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : Input parameter is null");
847 return TTS_ERROR_INVALID_PARAMETER;
850 tts_client_s* client = tts_client_get(tts);
852 if (NULL == client) {
853 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
854 return TTS_ERROR_INVALID_PARAMETER;
857 *state = client->current_state;
860 case TTS_STATE_CREATED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Created'"); break;
861 case TTS_STATE_READY: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Ready'"); break;
862 case TTS_STATE_PLAYING: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Playing'"); break;
863 case TTS_STATE_PAUSED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Paused'"); break;
864 default: SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid value"); break;
867 return TTS_ERROR_NONE;
870 int tts_get_speed_range(tts_h tts, int* min, int* normal, int* max)
872 bool tts_supported = false;
873 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
874 if (false == tts_supported) {
875 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
876 return TTS_ERROR_NOT_SUPPORTED;
880 if (NULL == tts || NULL == min || NULL == normal || NULL == max) {
881 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
882 return TTS_ERROR_INVALID_PARAMETER;
885 tts_client_s* client = tts_client_get(tts);
887 if (NULL == client) {
888 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
889 return TTS_ERROR_INVALID_PARAMETER;
892 *min = TTS_SPEED_MIN;
893 *normal = TTS_SPEED_NORMAL;
894 *max = TTS_SPEED_MAX;
896 return TTS_ERROR_NONE;
899 int tts_add_text(tts_h tts, const char* text, const char* language, int voice_type, int speed, int* utt_id)
901 bool tts_supported = false;
902 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
903 if (false == tts_supported) {
904 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
905 return TTS_ERROR_NOT_SUPPORTED;
909 SLOG(LOG_DEBUG, TAG_TTSC, "===== Add text");
911 if (NULL == tts || NULL == utt_id) {
912 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
913 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
914 SLOG(LOG_DEBUG, TAG_TTSC, " ");
915 return TTS_ERROR_INVALID_PARAMETER;
918 tts_client_s* client = tts_client_get(tts);
920 if (NULL == client) {
921 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
922 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
923 SLOG(LOG_DEBUG, TAG_TTSC, " ");
924 return TTS_ERROR_INVALID_PARAMETER;
927 if (TTS_STATE_CREATED == client->current_state) {
928 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
929 return TTS_ERROR_INVALID_STATE;
932 if (TTS_MAX_TEXT_SIZE < strlen(text)) {
933 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input text size is too big.");
934 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
935 SLOG(LOG_DEBUG, TAG_TTSC, " ");
936 return TTS_ERROR_INVALID_PARAMETER;
939 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
940 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
941 return TTS_ERROR_INVALID_STATE;
944 /* check valid utf8 */
946 ict = iconv_open("utf-8", "");
947 if ((iconv_t)-1 == ict) {
948 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to init for text check");
949 return TTS_ERROR_OPERATION_FAILED;
952 size_t len = strlen(text);
954 char in_buf[TTS_MAX_TEXT_SIZE];
955 char *out_tmp = NULL;
956 char out_buf[TTS_MAX_TEXT_SIZE];
957 size_t len_tmp = sizeof(out_buf);
959 memset(in_buf, 0, TTS_MAX_TEXT_SIZE);
960 snprintf(in_buf, TTS_MAX_TEXT_SIZE, "%s", text);
963 memset(out_buf, 0, TTS_MAX_TEXT_SIZE);
967 st = iconv(ict, &in_tmp, &len, &out_tmp, &len_tmp);
968 if ((size_t)-1 == st) {
969 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Text is invalid - '%s'", in_buf);
971 return TTS_ERROR_INVALID_PARAMETER;
974 SECURE_SLOG(LOG_DEBUG, TAG_TTSC, "Text is valid - Converted text is '%s'", out_buf);
976 /* change default language value */
979 if (NULL == language)
980 temp = strdup("default");
982 temp = strdup(language);
984 client->current_utt_id ++;
985 if (client->current_utt_id == 10000) {
986 client->current_utt_id = 1;
993 ret = tts_dbus_request_add_text(client->uid, out_buf, temp, voice_type, speed, client->current_utt_id);
995 if (TTS_ERROR_TIMED_OUT != ret) {
996 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
999 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry add text : %s", __tts_get_error_code(ret));
1003 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1008 *utt_id = client->current_utt_id;
1012 if (NULL != temp) free(temp);
1014 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1015 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1020 int tts_play(tts_h tts)
1022 bool tts_supported = false;
1023 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
1024 if (false == tts_supported) {
1025 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
1026 return TTS_ERROR_NOT_SUPPORTED;
1030 SLOG(LOG_DEBUG, TAG_TTSC, "===== Play tts");
1033 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
1034 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1035 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1036 return TTS_ERROR_INVALID_PARAMETER;
1039 tts_client_s* client = tts_client_get(tts);
1041 if (NULL == client) {
1042 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
1043 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1044 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1045 return TTS_ERROR_INVALID_PARAMETER;
1048 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
1049 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
1050 return TTS_ERROR_INVALID_STATE;
1053 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1054 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1055 return TTS_ERROR_INVALID_STATE;
1061 ret = tts_dbus_request_play(client->uid);
1063 if (TTS_ERROR_TIMED_OUT != ret) {
1064 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1067 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry play : %s", __tts_get_error_code(ret));
1071 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1078 client->before_state = client->current_state;
1079 client->current_state = TTS_STATE_PLAYING;
1081 if (NULL != client->state_changed_cb) {
1082 tts_client_use_callback(client);
1083 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1084 tts_client_not_use_callback(client);
1085 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1088 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1089 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1091 return TTS_ERROR_NONE;
1095 int tts_stop(tts_h tts)
1097 bool tts_supported = false;
1098 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
1099 if (false == tts_supported) {
1100 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
1101 return TTS_ERROR_NOT_SUPPORTED;
1105 SLOG(LOG_DEBUG, TAG_TTSC, "===== Stop tts");
1108 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1109 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1110 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1111 return TTS_ERROR_INVALID_PARAMETER;
1114 tts_client_s* client = tts_client_get(tts);
1116 if (NULL == client) {
1117 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1118 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1119 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1120 return TTS_ERROR_INVALID_PARAMETER;
1123 if (TTS_STATE_CREATED == client->current_state) {
1124 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
1125 return TTS_ERROR_INVALID_STATE;
1128 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1129 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1130 return TTS_ERROR_INVALID_STATE;
1136 ret = tts_dbus_request_stop(client->uid);
1138 if (TTS_ERROR_TIMED_OUT != ret) {
1139 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1142 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry stop : %s", __tts_get_error_code(ret));
1146 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1153 client->before_state = client->current_state;
1154 client->current_state = TTS_STATE_READY;
1156 if (NULL != client->state_changed_cb) {
1157 tts_client_use_callback(client);
1158 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1159 tts_client_not_use_callback(client);
1160 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1163 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1164 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1166 return TTS_ERROR_NONE;
1170 int tts_pause(tts_h tts)
1172 bool tts_supported = false;
1173 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
1174 if (false == tts_supported) {
1175 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
1176 return TTS_ERROR_NOT_SUPPORTED;
1180 SLOG(LOG_DEBUG, TAG_TTSC, "===== Pause tts");
1183 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1184 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1185 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1186 return TTS_ERROR_INVALID_PARAMETER;
1189 tts_client_s* client = tts_client_get(tts);
1191 if (NULL == client) {
1192 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1193 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1194 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1195 return TTS_ERROR_INVALID_PARAMETER;
1198 if (TTS_STATE_PLAYING != client->current_state) {
1199 SLOG(LOG_ERROR, TAG_TTSC, "[Error] The Current state is NOT 'playing'. So this request should be not running.");
1200 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1201 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1202 return TTS_ERROR_INVALID_STATE;
1205 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1206 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1207 return TTS_ERROR_INVALID_STATE;
1213 ret = tts_dbus_request_pause(client->uid);
1215 if (TTS_ERROR_TIMED_OUT != ret) {
1216 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1219 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry pause : %s", __tts_get_error_code(ret));
1223 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1230 client->before_state = client->current_state;
1231 client->current_state = TTS_STATE_PAUSED;
1233 if (NULL != client->state_changed_cb) {
1234 tts_client_use_callback(client);
1235 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1236 tts_client_not_use_callback(client);
1237 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1240 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1241 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1243 return TTS_ERROR_NONE;
1246 static Eina_Bool __tts_notify_error(void *data)
1248 tts_h tts = (tts_h)data;
1250 tts_client_s* client = tts_client_get(tts);
1253 if (NULL == client) {
1254 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify error msg : A handle is not valid");
1258 SLOG(LOG_DEBUG, TAG_TTSC, "Error data : uttid(%d) reason(%s)", client->utt_id, __tts_get_error_code(client->reason));
1260 if (NULL != client->error_cb) {
1261 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of error");
1262 tts_client_use_callback(client);
1263 client->error_cb(client->tts, client->utt_id, client->reason, client->error_user_data );
1264 tts_client_not_use_callback(client);
1266 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
1272 int __tts_cb_error(int uid, tts_error_e reason, int utt_id)
1274 tts_client_s* client = tts_client_get_by_uid(uid);
1276 if (NULL == client) {
1277 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
1278 return TTS_ERROR_INVALID_PARAMETER;
1281 client->utt_id = utt_id;
1282 client->reason = reason;
1284 /* call callback function */
1285 if (NULL != client->error_cb) {
1286 ecore_timer_add(0, __tts_notify_error, client->tts);
1288 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
1294 static Eina_Bool __tts_notify_state_changed(void *data)
1296 tts_h tts = (tts_h)data;
1298 tts_client_s* client = tts_client_get(tts);
1301 if (NULL == client) {
1302 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify state changed : A handle is not valid");
1306 if (NULL != client->state_changed_cb) {
1307 tts_client_use_callback(client);
1308 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1309 tts_client_not_use_callback(client);
1310 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called : pre(%d) cur(%d)", client->before_state, client->current_state);
1312 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
1318 int __tts_cb_set_state(int uid, int state)
1320 tts_client_s* client = tts_client_get_by_uid(uid);
1321 if( NULL == client ) {
1322 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] The handle is not valid");
1326 tts_state_e state_from_daemon = (tts_state_e)state;
1328 if (client->current_state == state_from_daemon) {
1329 SLOG(LOG_DEBUG, TAG_TTSC, "Current state has already been %d", client->current_state);
1333 if (NULL != client->state_changed_cb) {
1334 ecore_timer_add(0, __tts_notify_state_changed, client->tts);
1336 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
1339 client->before_state = client->current_state;
1340 client->current_state = state_from_daemon;
1345 static Eina_Bool __tts_notify_utt_started(void *data)
1347 tts_h tts = (tts_h)data;
1349 tts_client_s* client = tts_client_get(tts);
1352 if (NULL == client) {
1353 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to notify utt started : A handle is not valid");
1357 if (NULL != client->utt_started_cb) {
1358 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance started ");
1359 tts_client_use_callback(client);
1360 client->utt_started_cb(client->tts, client->utt_id, client->utt_started_user_data);
1361 tts_client_not_use_callback(client);
1363 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance started ");
1369 int __tts_cb_utt_started(int uid, int utt_id)
1371 tts_client_s* client = tts_client_get_by_uid(uid);
1373 if (NULL == client) {
1374 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
1375 return TTS_ERROR_INVALID_PARAMETER;
1378 SECURE_SLOG(LOG_DEBUG, TAG_TTSC, "utterance started : utt id(%d) ", utt_id);
1380 client->utt_id = utt_id;
1382 /* call callback function */
1383 if (NULL != client->utt_started_cb) {
1384 ecore_timer_add(0, __tts_notify_utt_started, client->tts);
1386 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance started ");
1392 static Eina_Bool __tts_notify_utt_completed(void *data)
1394 tts_h tts = (tts_h)data;
1396 tts_client_s* client = tts_client_get(tts);
1399 if (NULL == client) {
1400 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to notify utt completed : A handle is not valid");
1404 if (NULL != client->utt_completeted_cb) {
1405 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance completed ");
1406 tts_client_use_callback(client);
1407 client->utt_completeted_cb(client->tts, client->utt_id, client->utt_completed_user_data);
1408 tts_client_not_use_callback(client);
1410 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance completed ");
1416 int __tts_cb_utt_completed(int uid, int utt_id)
1418 tts_client_s* client = tts_client_get_by_uid(uid);
1420 if (NULL == client) {
1421 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
1422 return TTS_ERROR_INVALID_PARAMETER;
1425 SECURE_SLOG(LOG_DEBUG, TAG_TTSC, "utterance completed : uttid(%d) ", utt_id);
1427 client->utt_id = utt_id;
1429 /* call callback function */
1430 if (NULL != client->utt_completeted_cb) {
1431 ecore_timer_add(0, __tts_notify_utt_completed, client->tts);
1433 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance completed ");
1439 int tts_set_state_changed_cb(tts_h tts, tts_state_changed_cb callback, void* user_data)
1441 bool tts_supported = false;
1442 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
1443 if (false == tts_supported) {
1444 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
1445 return TTS_ERROR_NOT_SUPPORTED;
1449 if (NULL == tts || NULL == callback) {
1450 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Input parameter is null");
1451 return TTS_ERROR_INVALID_PARAMETER;
1454 tts_client_s* client = tts_client_get(tts);
1456 if (NULL == client) {
1457 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : A handle is not valid");
1458 return TTS_ERROR_INVALID_PARAMETER;
1461 if (TTS_STATE_CREATED != client->current_state) {
1462 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Current state is not 'Created'.");
1463 return TTS_ERROR_INVALID_STATE;
1466 client->state_changed_cb = callback;
1467 client->state_changed_user_data = user_data;
1469 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set state changed cb");
1474 int tts_unset_state_changed_cb(tts_h tts)
1476 bool tts_supported = false;
1477 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
1478 if (false == tts_supported) {
1479 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
1480 return TTS_ERROR_NOT_SUPPORTED;
1485 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Input parameter is null");
1486 return TTS_ERROR_INVALID_PARAMETER;
1489 tts_client_s* client = tts_client_get(tts);
1491 if (NULL == client) {
1492 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : A handle is not valid");
1493 return TTS_ERROR_INVALID_PARAMETER;
1496 if (TTS_STATE_CREATED != client->current_state) {
1497 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Current state is not 'Created'.");
1498 return TTS_ERROR_INVALID_STATE;
1501 client->state_changed_cb = NULL;
1502 client->state_changed_user_data = NULL;
1504 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset state changed cb");
1509 int tts_set_utterance_started_cb(tts_h tts, tts_utterance_started_cb callback, void* user_data)
1511 bool tts_supported = false;
1512 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
1513 if (false == tts_supported) {
1514 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
1515 return TTS_ERROR_NOT_SUPPORTED;
1519 if (NULL == tts || NULL == callback) {
1520 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Input parameter is null");
1521 return TTS_ERROR_INVALID_PARAMETER;
1524 tts_client_s* client = tts_client_get(tts);
1526 if (NULL == client) {
1527 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : A handle is not valid");
1528 return TTS_ERROR_INVALID_PARAMETER;
1531 if (TTS_STATE_CREATED != client->current_state) {
1532 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Current state is not 'Created'.");
1533 return TTS_ERROR_INVALID_STATE;
1536 client->utt_started_cb = callback;
1537 client->utt_started_user_data = user_data;
1539 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt started cb");
1544 int tts_unset_utterance_started_cb(tts_h tts)
1546 bool tts_supported = false;
1547 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
1548 if (false == tts_supported) {
1549 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
1550 return TTS_ERROR_NOT_SUPPORTED;
1555 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Input parameter is null");
1556 return TTS_ERROR_INVALID_PARAMETER;
1559 tts_client_s* client = tts_client_get(tts);
1561 if (NULL == client) {
1562 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : A handle is not valid");
1563 return TTS_ERROR_INVALID_PARAMETER;
1566 if (TTS_STATE_CREATED != client->current_state) {
1567 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Current state is not 'Created'.");
1568 return TTS_ERROR_INVALID_STATE;
1571 client->utt_started_cb = NULL;
1572 client->utt_started_user_data = NULL;
1574 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt started cb");
1579 int tts_set_utterance_completed_cb(tts_h tts, tts_utterance_completed_cb callback, void* user_data)
1581 bool tts_supported = false;
1582 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
1583 if (false == tts_supported) {
1584 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
1585 return TTS_ERROR_NOT_SUPPORTED;
1589 if (NULL == tts || NULL == callback) {
1590 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Input parameter is null");
1591 return TTS_ERROR_INVALID_PARAMETER;
1594 tts_client_s* client = tts_client_get(tts);
1596 if (NULL == client) {
1597 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : A handle is not valid");
1598 return TTS_ERROR_INVALID_PARAMETER;
1601 if (TTS_STATE_CREATED != client->current_state) {
1602 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Current state is not 'Created'.");
1603 return TTS_ERROR_INVALID_STATE;
1606 client->utt_completeted_cb = callback;
1607 client->utt_completed_user_data = user_data;
1609 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt completed cb");
1614 int tts_unset_utterance_completed_cb(tts_h tts)
1616 bool tts_supported = false;
1617 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
1618 if (false == tts_supported) {
1619 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
1620 return TTS_ERROR_NOT_SUPPORTED;
1625 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Input parameter is null");
1626 return TTS_ERROR_INVALID_PARAMETER;
1629 tts_client_s* client = tts_client_get(tts);
1631 if (NULL == client) {
1632 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : A handle is not valid");
1633 return TTS_ERROR_INVALID_PARAMETER;
1636 if (TTS_STATE_CREATED != client->current_state) {
1637 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Current state is not 'Created'.");
1638 return TTS_ERROR_INVALID_STATE;
1641 client->utt_completeted_cb = NULL;
1642 client->utt_completed_user_data = NULL;
1644 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt completed cb");
1648 int tts_set_error_cb(tts_h tts, tts_error_cb callback, void* user_data)
1650 bool tts_supported = false;
1651 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
1652 if (false == tts_supported) {
1653 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
1654 return TTS_ERROR_NOT_SUPPORTED;
1658 if (NULL == tts || NULL == callback) {
1659 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Input parameter is null");
1660 return TTS_ERROR_INVALID_PARAMETER;
1663 tts_client_s* client = tts_client_get(tts);
1665 if (NULL == client) {
1666 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : A handle is not valid");
1667 return TTS_ERROR_INVALID_PARAMETER;
1670 if (TTS_STATE_CREATED != client->current_state) {
1671 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Current state is not 'Created'.");
1672 return TTS_ERROR_INVALID_STATE;
1675 client->error_cb = callback;
1676 client->error_user_data = user_data;
1678 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set error cb");
1683 int tts_unset_error_cb(tts_h tts)
1685 bool tts_supported = false;
1686 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
1687 if (false == tts_supported) {
1688 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
1689 return TTS_ERROR_NOT_SUPPORTED;
1694 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Input parameter is null");
1695 return TTS_ERROR_INVALID_PARAMETER;
1698 tts_client_s* client = tts_client_get(tts);
1700 if (NULL == client) {
1701 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : A handle is not valid");
1702 return TTS_ERROR_INVALID_PARAMETER;
1705 if (TTS_STATE_CREATED != client->current_state) {
1706 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Current state is not 'Created'.");
1707 return TTS_ERROR_INVALID_STATE;
1710 client->error_cb = NULL;
1711 client->error_user_data = NULL;
1713 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset error cb");
1718 int tts_set_default_voice_changed_cb(tts_h tts, tts_default_voice_changed_cb callback, void* user_data)
1720 bool tts_supported = false;
1721 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
1722 if (false == tts_supported) {
1723 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
1724 return TTS_ERROR_NOT_SUPPORTED;
1728 if (NULL == tts || NULL == callback) {
1729 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : Input parameter is null");
1730 return TTS_ERROR_INVALID_PARAMETER;
1733 tts_client_s* client = tts_client_get(tts);
1735 if (NULL == client) {
1736 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : A handle is not valid");
1737 return TTS_ERROR_INVALID_PARAMETER;
1740 if (TTS_STATE_CREATED != client->current_state) {
1741 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : Current state is not 'Created'.");
1742 return TTS_ERROR_INVALID_STATE;
1745 client->default_voice_changed_cb = callback;
1746 client->default_voice_changed_user_data = user_data;
1748 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set default voice changed cb");
1753 int tts_unset_default_voice_changed_cb(tts_h tts)
1755 bool tts_supported = false;
1756 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
1757 if (false == tts_supported) {
1758 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
1759 return TTS_ERROR_NOT_SUPPORTED;
1764 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : Input parameter is null");
1765 return TTS_ERROR_INVALID_PARAMETER;
1768 tts_client_s* client = tts_client_get(tts);
1770 if (NULL == client) {
1771 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : A handle is not valid");
1772 return TTS_ERROR_INVALID_PARAMETER;
1775 if (TTS_STATE_CREATED != client->current_state) {
1776 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : Current state is not 'Created'.");
1777 return TTS_ERROR_INVALID_STATE;
1780 client->default_voice_changed_cb = NULL;
1781 client->default_voice_changed_user_data = NULL;
1783 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset default voice changed cb");