2 * Copyright (c) 2011-2016 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.
14 #include <app_manager.h>
19 #include <sys/types.h>
21 #include <system_info.h>
25 #include "tts_client.h"
26 #include "tts_config_mgr.h"
30 #include "tts_internal.h"
32 static bool g_screen_reader;
34 static int g_feature_enabled = -1;
36 static bool g_err_callback_status = false;
38 static int g_max_text_size = -1;
41 static char* g_language = NULL;
43 static int g_voice_type = -1;
45 static int g_speed = -1;
48 /* Function definition */
49 static Eina_Bool __tts_notify_state_changed(void *data);
50 static Eina_Bool __tts_notify_error(void *data);
57 static int __tts_get_feature_enabled()
59 if (0 == g_feature_enabled) {
60 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS feature NOT supported");
61 return TTS_ERROR_NOT_SUPPORTED;
62 } else if (-1 == g_feature_enabled) {
63 bool tts_supported = false;
64 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
65 if (false == tts_supported) {
66 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS feature NOT supported");
67 g_feature_enabled = 0;
68 return TTS_ERROR_NOT_SUPPORTED;
71 g_feature_enabled = 1;
73 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get feature value");
74 return TTS_ERROR_NOT_SUPPORTED;
81 static const char* __tts_get_error_code(tts_error_e err)
84 case TTS_ERROR_NONE: return "TTS_ERROR_NONE";
85 case TTS_ERROR_OUT_OF_MEMORY: return "TTS_ERROR_OUT_OF_MEMORY";
86 case TTS_ERROR_IO_ERROR: return "TTS_ERROR_IO_ERROR";
87 case TTS_ERROR_INVALID_PARAMETER: return "TTS_ERROR_INVALID_PARAMETER";
88 case TTS_ERROR_OUT_OF_NETWORK: return "TTS_ERROR_OUT_OF_NETWORK";
89 case TTS_ERROR_TIMED_OUT: return "TTS_ERROR_TIMED_OUT";
90 case TTS_ERROR_PERMISSION_DENIED: return "TTS_ERROR_PERMISSION_DENIED";
91 case TTS_ERROR_NOT_SUPPORTED: return "TTS_ERROR_NOT_SUPPORTED";
92 case TTS_ERROR_INVALID_STATE: return "TTS_ERROR_INVALID_STATE";
93 case TTS_ERROR_INVALID_VOICE: return "TTS_ERROR_INVALID_VOICE";
94 case TTS_ERROR_ENGINE_NOT_FOUND: return "TTS_ERROR_ENGINE_NOT_FOUND";
95 case TTS_ERROR_OPERATION_FAILED: return "TTS_ERROR_OPERATION_FAILED";
96 case TTS_ERROR_AUDIO_POLICY_BLOCKED: return "TTS_ERROR_AUDIO_POLICY_BLOCKED";
97 case TTS_ERROR_NOT_SUPPORTED_FEATURE: return "TTS_ERROR_NOT_SUPPORTED_FEATURE";
98 case TTS_ERROR_SERVICE_RESET: return "TTS_ERROR_SERVICE_RESET";
100 return "Invalid error code";
105 static int __tts_convert_config_error_code(tts_config_error_e code)
107 if (code == TTS_CONFIG_ERROR_NONE) return TTS_ERROR_NONE;
108 if (code == TTS_CONFIG_ERROR_OUT_OF_MEMORY) return TTS_ERROR_OUT_OF_MEMORY;
109 if (code == TTS_CONFIG_ERROR_IO_ERROR) return TTS_ERROR_IO_ERROR;
110 if (code == TTS_CONFIG_ERROR_INVALID_PARAMETER) return TTS_ERROR_INVALID_PARAMETER;
111 if (code == TTS_CONFIG_ERROR_INVALID_STATE) return TTS_ERROR_INVALID_STATE;
112 if (code == TTS_CONFIG_ERROR_INVALID_VOICE) return TTS_ERROR_INVALID_VOICE;
113 if (code == TTS_CONFIG_ERROR_ENGINE_NOT_FOUND) return TTS_ERROR_ENGINE_NOT_FOUND;
114 if (code == TTS_CONFIG_ERROR_OPERATION_FAILED) return TTS_ERROR_OPERATION_FAILED;
115 if (code == TTS_CONFIG_ERROR_NOT_SUPPORTED_FEATURE) return TTS_ERROR_NOT_SUPPORTED_FEATURE;
120 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)
122 SLOG(LOG_DEBUG, TAG_TTSC, "Voice changed : Before lang(%s) type(%d) , Current lang(%s), type(%d)",
123 before_lang, before_voice_type, language, voice_type);
125 GList* client_list = NULL;
126 client_list = tts_client_get_client_list();
129 tts_client_s *data = NULL;
131 if (g_list_length(client_list) > 0) {
132 /* Get a first item */
133 iter = g_list_first(client_list);
135 while (NULL != iter) {
137 if (NULL != data->default_voice_changed_cb) {
138 SLOG(LOG_DEBUG, TAG_TTSC, "Call default voice changed callback : uid(%d)", data->uid);
139 data->default_voice_changed_cb(data->tts, before_lang, before_voice_type,
140 language, voice_type, data->default_voice_changed_user_data);
143 /* Check whether language is changed or not. If it is changed, make 'text_repeat' NULL */
144 if (0 != strncmp(before_lang, language, strlen(before_lang))) {
145 if (NULL != data->text_repeat) {
146 free(data->text_repeat);
147 data->text_repeat = NULL;
152 iter = g_list_next(iter);
159 static Eina_Bool __reconnect_by_engine_changed(void* data)
161 tts_h tts = (tts_h)data;
163 tts_client_s* client = tts_client_get(tts);
164 if (NULL == client) {
165 SLOG(LOG_ERROR, TAG_TTSC, "[WARNING] A handle is not valid");
169 if (TTS_STATE_READY != client->current_state) {
174 int ret = tts_unprepare(tts);
176 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare for setting a new engine... (%d)", ret);
178 ret = tts_prepare(tts);
180 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare for setting a new engine... (%d)", ret);
186 void _tts_config_engine_changed_cb(const char* engine_id, const char* setting, const char* language, int voice_type, bool auto_voice, bool need_credential, void* user_data)
188 tts_h tts = (tts_h)user_data;
190 tts_client_s* client = tts_client_get(tts);
191 if (NULL == client) {
192 SLOG(LOG_ERROR, TAG_TTSC, "[WARNING] A handle is not valid");
196 if (NULL != engine_id) SLOG(LOG_DEBUG, TAG_TTSC, "Engine id(%s)", engine_id);
197 if (NULL != setting) SLOG(LOG_DEBUG, TAG_TTSC, "Engine setting(%s)", setting);
198 if (NULL != language) SLOG(LOG_DEBUG, TAG_TTSC, "Language(%s)", language);
199 SLOG(LOG_DEBUG, TAG_TTSC, "Voice type(%d), Auto voice(%s), Credential(%s)", voice_type, auto_voice ? "on" : "off", need_credential ? "need" : "no need");
201 /* When the default engine is changed, please unload the old engine and load the new one. */
204 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_PAUSED == client->current_state) {
207 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] TTS client stopping...");
210 ecore_idler_add(__reconnect_by_engine_changed, (void*)tts);
211 } else if (TTS_STATE_READY == client->current_state) {
212 ret = tts_unprepare(tts);
214 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to unprepare for setting a new engine... (%d)", ret);
216 ret = tts_prepare(tts);
218 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare for setting a new engine... (%d)", ret);
222 /* call callback function */
223 if (NULL != client->engine_changed_cb) {
224 client->engine_changed_cb(tts, engine_id, language, voice_type, need_credential, client->engine_changed_user_data);
226 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function for changed engine");
231 int tts_create(tts_h* tts)
233 if (0 != __tts_get_feature_enabled()) {
234 return TTS_ERROR_NOT_SUPPORTED;
237 SLOG(LOG_INFO, TAG_TTSC, "@@@ Create TTS");
241 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
242 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
243 return TTS_ERROR_INVALID_PARAMETER;
246 if (0 == tts_client_get_size()) {
247 if (0 != tts_dbus_open_connection()) {
248 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to open dbus connection");
249 return TTS_ERROR_OPERATION_FAILED;
253 if (0 != tts_client_new(tts)) {
254 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to create client!!!!!");
255 return TTS_ERROR_OUT_OF_MEMORY;
258 tts_client_s* client = tts_client_get(*tts);
259 if (NULL == client) {
260 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get client");
261 return TTS_ERROR_OPERATION_FAILED;
264 int ret = tts_config_mgr_initialize(client->uid);
266 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to init config manager : %d", ret);
267 tts_client_destroy(*tts);
268 return __tts_convert_config_error_code(ret);
271 ret = tts_config_mgr_set_callback(client->uid, _tts_config_engine_changed_cb, __tts_config_voice_changed_cb, NULL, NULL, client->tts);
273 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to set config changed : %d", ret);
274 tts_client_destroy(*tts);
275 return __tts_convert_config_error_code(ret);
278 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
279 SLOG(LOG_DEBUG, TAG_TTSC, " ");
281 return TTS_ERROR_NONE;
284 int tts_destroy(tts_h tts)
286 if (0 != __tts_get_feature_enabled()) {
287 return TTS_ERROR_NOT_SUPPORTED;
290 SLOG(LOG_INFO, TAG_TTSC, "@@@ Destroy TTS");
293 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
294 return TTS_ERROR_INVALID_PARAMETER;
297 tts_client_s* client = tts_client_get(tts);
300 if (NULL == client) {
301 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
302 return TTS_ERROR_INVALID_PARAMETER;
305 /* check used callback */
306 if (0 != tts_client_get_use_callback(client)) {
307 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Cannot destroy in Callback function");
308 return TTS_ERROR_OPERATION_FAILED;
311 tts_config_mgr_finalize(client->uid);
315 int screen_reader = -1;
318 switch (client->current_state) {
319 case TTS_STATE_PAUSED:
320 case TTS_STATE_PLAYING:
321 case TTS_STATE_READY:
322 ret = vconf_get_bool(TTS_ACCESSIBILITY_KEY, &screen_reader);
324 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get screen reader");
326 SLOG(LOG_INFO, tts_tag(), "[INFO] Success to get screen reader(%d), g_screen_reader(%s), client->mode(%d)", screen_reader, (true == g_screen_reader) ? "True" : "False", client->mode);
327 g_screen_reader = (bool)screen_reader;
329 if (!(false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode)) {
331 ret = tts_dbus_request_finalize(client->uid);
333 if (TTS_ERROR_TIMED_OUT != ret) {
334 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
337 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry finalize");
340 if (TTS_RETRY_COUNT == count) {
341 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
348 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Do not request finalize : g_sr(%d) mode(%d)", g_screen_reader, client->mode);
351 client->before_state = client->current_state;
352 client->current_state = TTS_STATE_CREATED;
354 case TTS_STATE_CREATED:
355 if (NULL != client->conn_timer) {
356 SLOG(LOG_DEBUG, TAG_TTSC, "Connect Timer is deleted");
357 ecore_timer_del(client->conn_timer);
358 client->conn_timer = NULL;
361 tts_client_destroy(tts);
368 if (0 == tts_client_get_size()) {
369 if (0 != tts_dbus_close_connection()) {
370 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to close connection");
374 if (NULL != g_language) {
381 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
383 return TTS_ERROR_NONE;
386 void __tts_screen_reader_changed_cb(bool value)
388 g_screen_reader = value;
391 int tts_set_mode(tts_h tts, tts_mode_e mode)
393 if (0 != __tts_get_feature_enabled()) {
394 return TTS_ERROR_NOT_SUPPORTED;
397 SLOG(LOG_INFO, TAG_TTSC, "@@@ Set TTS mode(%d)", mode);
399 tts_client_s* client = tts_client_get(tts);
402 if (NULL == client) {
403 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
404 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
405 return TTS_ERROR_INVALID_PARAMETER;
409 if (client->current_state != TTS_STATE_CREATED) {
410 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
411 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
412 SLOG(LOG_DEBUG, TAG_TTSC, " ");
413 return TTS_ERROR_INVALID_STATE;
416 if (TTS_MODE_DEFAULT <= mode && mode <= TTS_MODE_INTERRUPT) {
419 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] mode is not valid : %d", mode);
420 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
421 SLOG(LOG_DEBUG, TAG_TTSC, " ");
422 return TTS_ERROR_INVALID_PARAMETER;
425 if (TTS_MODE_SCREEN_READER == mode) {
428 ret = vconf_get_bool(TTS_ACCESSIBILITY_KEY, &screen_reader);
430 SLOG(LOG_ERROR, tts_tag(), "[Config ERROR] Fail to get screen reader");
431 return TTS_ERROR_OPERATION_FAILED;
433 g_screen_reader = (bool)screen_reader;
434 tts_config_set_screen_reader_callback(client->uid, __tts_screen_reader_changed_cb);
436 tts_config_unset_screen_reader_callback(client->uid);
439 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
441 return TTS_ERROR_NONE;
444 int tts_get_mode(tts_h tts, tts_mode_e* mode)
446 if (0 != __tts_get_feature_enabled()) {
447 return TTS_ERROR_NOT_SUPPORTED;
450 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Get TTS mode");
452 tts_client_s* client = tts_client_get(tts);
455 if (NULL == client) {
456 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
457 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
458 SLOG(LOG_DEBUG, TAG_TTSC, " ");
459 return TTS_ERROR_INVALID_PARAMETER;
463 if (client->current_state != TTS_STATE_CREATED) {
464 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
465 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
466 SLOG(LOG_DEBUG, TAG_TTSC, " ");
467 return TTS_ERROR_INVALID_STATE;
471 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter(mode) is NULL");
472 return TTS_ERROR_INVALID_PARAMETER;
475 *mode = client->mode;
477 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
478 SLOG(LOG_DEBUG, TAG_TTSC, " ");
480 return TTS_ERROR_NONE;
483 int tts_set_credential(tts_h tts, const char* credential)
485 if (0 != __tts_get_feature_enabled()) {
486 return TTS_ERROR_NOT_SUPPORTED;
489 if (NULL == tts || NULL == credential) {
490 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
491 return TTS_ERROR_INVALID_PARAMETER;
494 tts_client_s* client = tts_client_get(tts);
496 if (NULL == client) {
497 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
498 return TTS_ERROR_INVALID_PARAMETER;
501 if (TTS_STATE_CREATED != client->current_state && TTS_STATE_READY != client->current_state) {
502 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid (%d).", client->current_state);
503 return TTS_ERROR_INVALID_STATE;
506 if (NULL != client->credential) {
507 free(client->credential);
508 client->credential = NULL;
510 client->credential = strdup(credential);
512 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
514 return TTS_ERROR_NONE;
517 int tts_set_server_tts(tts_h tts, const char* credential)
519 if (0 != __tts_get_feature_enabled()) {
520 return TTS_ERROR_NOT_SUPPORTED;
524 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
525 return TTS_ERROR_INVALID_PARAMETER;
528 tts_client_s* client = tts_client_get(tts);
530 if (NULL == client) {
531 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
532 return TTS_ERROR_INVALID_PARAMETER;
535 if (TTS_STATE_CREATED != client->current_state && TTS_STATE_READY != client->current_state) {
536 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid (%d).", client->current_state);
537 return TTS_ERROR_INVALID_STATE;
540 if (NULL != client->credential) {
541 free(client->credential);
542 client->credential = NULL;
545 client->internal = true;
548 if (NULL != credential) {
549 key = strdup("EnableServerTTS");
550 client->credential = strdup(credential);
551 if (NULL == client->credential) {
552 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to allocate memory");
557 return TTS_ERROR_OUT_OF_MEMORY;
560 key = strdup("DisableServerTTS");
564 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to allocate memory");
565 return TTS_ERROR_OUT_OF_MEMORY;
570 int ret = app_manager_get_app_id(pid, &appid);
571 if (0 != ret || NULL == appid) {
572 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get appid, ret(%d), pid(%d), appid(%s)", ret, pid, appid);
579 return TTS_ERROR_OPERATION_FAILED;
582 ret = tts_set_private_data(tts, key, appid);
584 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to set private data, ret(%d), pid(%d), appid(%s)", ret, pid, appid);
597 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
599 return TTS_ERROR_NONE;
602 static Eina_Bool __tts_connect_daemon(void *data)
604 tts_h tts = (tts_h)data;
605 tts_client_s* client = tts_client_get(tts);
608 if (NULL == client) {
609 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
614 if (0 != tts_dbus_request_hello(client->uid)) {
618 SLOG(LOG_INFO, TAG_TTSC, "@@@ Connect daemon");
620 /* do request initialize */
622 bool credential_needed = false;
624 ret = tts_dbus_request_initialize(client->uid, &credential_needed);
626 if (TTS_ERROR_ENGINE_NOT_FOUND == ret) {
627 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to initialize : %s", __tts_get_error_code(ret));
629 client->reason = TTS_ERROR_ENGINE_NOT_FOUND;
632 ecore_timer_add(0, __tts_notify_error, (void*)client->tts);
633 client->conn_timer = NULL;
636 } else if (TTS_ERROR_PERMISSION_DENIED == ret) {
637 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to initialize : %s", __tts_get_error_code(ret));
639 client->reason = TTS_ERROR_PERMISSION_DENIED;
642 ecore_timer_add(0, __tts_notify_error, (void*)client->tts);
643 client->conn_timer = NULL;
646 } else if (TTS_ERROR_NONE != ret) {
647 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to connection. Retry to connect : %s", __tts_get_error_code(ret));
651 /* success to connect tts-daemon */
652 client->credential_needed = credential_needed;
653 SLOG(LOG_ERROR, TAG_TTSC, "Supported options : credential(%s)", credential_needed ? "need" : "no need");
656 client->conn_timer = NULL;
658 client = tts_client_get(tts);
660 if (NULL == client) {
661 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
665 client->before_state = client->current_state;
666 client->current_state = TTS_STATE_READY;
668 if (NULL != client->state_changed_cb) {
669 tts_client_use_callback(client);
670 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
671 tts_client_not_use_callback(client);
673 SLOG(LOG_WARN, TAG_TTSC, "State changed callback is NULL");
676 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
681 int tts_prepare(tts_h tts)
683 if (0 != __tts_get_feature_enabled()) {
684 return TTS_ERROR_NOT_SUPPORTED;
687 SLOG(LOG_INFO, TAG_TTSC, "@@@ Prepare TTS");
689 tts_client_s* client = tts_client_get(tts);
692 if (NULL == client) {
693 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
694 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
695 return TTS_ERROR_INVALID_PARAMETER;
699 if (client->current_state != TTS_STATE_CREATED) {
700 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
701 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
702 return TTS_ERROR_INVALID_STATE;
705 ecore_thread_main_loop_begin();
706 client->conn_timer = ecore_timer_add(0.02, __tts_connect_daemon, (void*)tts);
707 ecore_thread_main_loop_end();
709 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
711 return TTS_ERROR_NONE;
714 int tts_prepare_sync(tts_h tts)
716 if (0 != __tts_get_feature_enabled()) {
717 return TTS_ERROR_NOT_SUPPORTED;
720 SLOG(LOG_INFO, TAG_TTSC, "@@@ Prepare TTS");
722 tts_client_s* client = tts_client_get(tts);
725 if (NULL == client) {
726 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
727 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
728 return TTS_ERROR_INVALID_PARAMETER;
732 if (client->current_state != TTS_STATE_CREATED) {
733 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
734 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
735 return TTS_ERROR_INVALID_STATE;
739 while (EINA_TRUE == __tts_connect_daemon((void*)tts) && TTS_CONNECTION_RETRY_COUNT > cnt) {
743 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
745 if (TTS_CONNECTION_RETRY_COUNT == cnt) {
746 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to connect daemon");
747 return TTS_ERROR_OPERATION_FAILED;
750 return TTS_ERROR_NONE;
753 int tts_unprepare(tts_h tts)
755 if (0 != __tts_get_feature_enabled()) {
756 return TTS_ERROR_NOT_SUPPORTED;
759 SLOG(LOG_INFO, TAG_TTSC, "@@@ Unprepare TTS");
761 tts_client_s* client = tts_client_get(tts);
764 if (NULL == client) {
765 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
766 return TTS_ERROR_INVALID_PARAMETER;
770 if (client->current_state != TTS_STATE_READY) {
771 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'READY'");
772 return TTS_ERROR_INVALID_STATE;
777 int screen_reader = -1;
779 ret = vconf_get_bool(TTS_ACCESSIBILITY_KEY, &screen_reader);
781 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get screen reader");
783 SLOG(LOG_INFO, tts_tag(), "[INFO] Success to get screen reader(%d), g_screen_reader(%s), client->mode(%d)", screen_reader, (true == g_screen_reader) ? "True" : "False", client->mode);
784 g_screen_reader = (bool)screen_reader;
787 bool is_prepared = false;
788 if (!(false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode)) {
790 ret = tts_dbus_request_finalize(client->uid);
792 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
793 client->current_state = TTS_STATE_CREATED;
794 if (0 == tts_prepare_sync(tts)) {
796 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
798 } else if (TTS_ERROR_TIMED_OUT != ret) {
799 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
802 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry finalize : %s", __tts_get_error_code(ret));
805 if (TTS_RETRY_COUNT == count) {
806 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
813 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Do not request finalize : g_sr(%d) mode(%d)", g_screen_reader, client->mode);
816 client->before_state = client->current_state;
817 client->current_state = TTS_STATE_CREATED;
819 if (NULL != client->state_changed_cb) {
820 tts_client_use_callback(client);
821 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
822 tts_client_not_use_callback(client);
823 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
826 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
828 return TTS_ERROR_NONE;
831 bool __tts_supported_voice_cb(const char* engine_id, const char* language, int type, void* user_data)
833 tts_h tts = (tts_h)user_data;
835 tts_client_s* client = tts_client_get(tts);
836 if (NULL == client) {
837 SLOG(LOG_ERROR, TAG_TTSC, "[WARNING] A handle is not valid");
841 /* call callback function */
842 if (NULL != client->supported_voice_cb) {
843 return client->supported_voice_cb(tts, language, type, client->supported_voice_user_data);
845 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of supported voice");
851 int tts_foreach_supported_voices(tts_h tts, tts_supported_voice_cb callback, void* user_data)
853 if (0 != __tts_get_feature_enabled()) {
854 return TTS_ERROR_NOT_SUPPORTED;
857 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Foreach supported voices");
859 if (NULL == tts || NULL == callback) {
860 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
861 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
862 return TTS_ERROR_INVALID_PARAMETER;
865 tts_client_s* client = tts_client_get(tts);
868 if (NULL == client) {
869 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
870 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
871 return TTS_ERROR_INVALID_PARAMETER;
875 char* current_engine = NULL;
876 ret = tts_config_mgr_get_engine(¤t_engine);
878 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get current engine : %d", ret);
879 return __tts_convert_config_error_code(ret);
882 client->supported_voice_cb = callback;
883 client->supported_voice_user_data = user_data;
885 ret = tts_config_mgr_get_voice_list(current_engine, __tts_supported_voice_cb, client->tts);
887 if (NULL != current_engine) {
888 free(current_engine);
889 current_engine = NULL;
892 client->supported_voice_cb = NULL;
893 client->supported_voice_user_data = NULL;
896 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
897 ret = TTS_ERROR_OPERATION_FAILED;
900 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
905 int tts_get_default_voice(tts_h tts, char** lang, int* vctype)
907 if (0 != __tts_get_feature_enabled()) {
908 return TTS_ERROR_NOT_SUPPORTED;
911 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Get default voice");
914 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
915 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
916 return TTS_ERROR_INVALID_PARAMETER;
919 tts_client_s* client = tts_client_get(tts);
921 if (NULL == client) {
922 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
923 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
924 return TTS_ERROR_INVALID_PARAMETER;
927 /* Request call remote method */
929 ret = tts_config_mgr_get_voice(lang, vctype);
931 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
932 return __tts_convert_config_error_code(ret);
934 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] Default language(%s), type(%d)", *lang, *vctype);
937 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
942 int tts_get_max_text_size(tts_h tts, unsigned int* size)
944 if (0 != __tts_get_feature_enabled()) {
945 return TTS_ERROR_NOT_SUPPORTED;
948 if (NULL == tts || NULL == size) {
949 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Input parameter is null");
950 return TTS_ERROR_INVALID_PARAMETER;
953 tts_client_s* client = tts_client_get(tts);
955 if (NULL == client) {
956 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : A handle is not valid");
957 return TTS_ERROR_INVALID_PARAMETER;
960 if (TTS_STATE_READY != client->current_state) {
961 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Current state is NOT 'READY'.");
962 return TTS_ERROR_INVALID_STATE;
965 if (0 != tts_config_mgr_get_max_text_size(size)) {
966 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get max text size");
967 return TTS_ERROR_INVALID_PARAMETER;
970 g_max_text_size = (int)*size;
972 SLOG(LOG_DEBUG, TAG_TTSC, "Get max text count : %d", *size);
973 return TTS_ERROR_NONE;
976 int tts_get_state(tts_h tts, tts_state_e* state)
978 if (0 != __tts_get_feature_enabled()) {
979 return TTS_ERROR_NOT_SUPPORTED;
982 if (NULL == tts || NULL == state) {
983 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : Input parameter is null");
984 return TTS_ERROR_INVALID_PARAMETER;
987 tts_client_s* client = tts_client_get(tts);
989 if (NULL == client) {
990 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
991 return TTS_ERROR_INVALID_PARAMETER;
994 *state = client->current_state;
997 case TTS_STATE_CREATED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Created'"); break;
998 case TTS_STATE_READY: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Ready'"); break;
999 case TTS_STATE_PLAYING: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Playing'"); break;
1000 case TTS_STATE_PAUSED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Paused'"); break;
1001 default: SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid value"); break;
1004 return TTS_ERROR_NONE;
1007 int tts_get_speed_range(tts_h tts, int* min, int* normal, int* max)
1009 if (0 != __tts_get_feature_enabled()) {
1010 return TTS_ERROR_NOT_SUPPORTED;
1013 if (NULL == tts || NULL == min || NULL == normal || NULL == max) {
1014 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
1015 return TTS_ERROR_INVALID_PARAMETER;
1018 tts_client_s* client = tts_client_get(tts);
1020 if (NULL == client) {
1021 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
1022 return TTS_ERROR_INVALID_PARAMETER;
1025 *min = TTS_SPEED_MIN;
1026 *normal = TTS_SPEED_NORMAL;
1027 *max = TTS_SPEED_MAX;
1029 return TTS_ERROR_NONE;
1032 int tts_get_error_message(tts_h tts, char** err_msg)
1034 if (0 != __tts_get_feature_enabled()) {
1035 return TTS_ERROR_NOT_SUPPORTED;
1038 if (NULL == tts || NULL == err_msg) {
1039 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
1040 return TTS_ERROR_INVALID_PARAMETER;
1043 tts_client_s* client = tts_client_get(tts);
1045 if (NULL == client) {
1046 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
1047 return TTS_ERROR_INVALID_PARAMETER;
1050 if (NULL != client->err_msg) {
1051 *err_msg = strdup(client->err_msg);
1052 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Error msg (%s)", *err_msg);
1055 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Error msg (NULL)");
1058 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1060 return TTS_ERROR_NONE;
1063 int tts_add_text(tts_h tts, const char* text, const char* language, int voice_type, int speed, int* utt_id)
1065 SLOG(LOG_INFO, TAG_TTSC, "[DEBUG] Add text: text(%s), language(%s), type(%d)", (NULL == text) ? "NULL" : text, (NULL == language) ? "NULL" : language, voice_type);
1067 if (0 != __tts_get_feature_enabled()) {
1068 return TTS_ERROR_NOT_SUPPORTED;
1072 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Speed should not be negative(%d)", speed);
1073 return TTS_ERROR_INVALID_PARAMETER;
1076 if (voice_type < 0) {
1077 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Voice type should not be negative(%d)", voice_type);
1078 return TTS_ERROR_INVALID_PARAMETER;
1081 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Add text");
1083 if (NULL == tts || NULL == utt_id) {
1084 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
1085 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1086 return TTS_ERROR_INVALID_PARAMETER;
1089 tts_client_s* client = tts_client_get(tts);
1091 if (NULL == client) {
1092 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1093 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1094 return TTS_ERROR_INVALID_PARAMETER;
1097 if (TTS_STATE_CREATED == client->current_state) {
1098 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
1099 return TTS_ERROR_INVALID_STATE;
1102 if (-1 == g_max_text_size) {
1103 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] g_max_text_size is %d", g_max_text_size);
1104 if (0 != tts_config_mgr_get_max_text_size((unsigned int*)&g_max_text_size)) {
1105 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get max text size");
1106 return TTS_ERROR_INVALID_PARAMETER;
1110 if (0 == g_max_text_size) {
1111 if (strlen(text) <= 0) {
1112 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] Max Text Size is %d", g_max_text_size);
1113 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input text size is invalid. (max text size is unlimited.)");
1114 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1115 return TTS_ERROR_INVALID_PARAMETER;
1118 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] g_max_text_size is %d", g_max_text_size);
1119 if (g_max_text_size < strlen(text) || strlen(text) <= 0) {
1120 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input text size is invalid.");
1121 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1122 return TTS_ERROR_INVALID_PARAMETER;
1126 if (TTS_SPEED_AUTO > speed || TTS_SPEED_MAX < speed) {
1127 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] speed value(%d) is invalid.", speed);
1128 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1129 return TTS_ERROR_INVALID_PARAMETER;
1132 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1133 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1134 return TTS_ERROR_INVALID_STATE;
1137 if (true == client->credential_needed && NULL == client->credential) {
1138 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Do not have app credential for this engine");
1139 return TTS_ERROR_PERMISSION_DENIED;
1142 /* check valid utf8 */
1146 dbus_error_init(&err);
1148 valid = dbus_validate_utf8(text, &err);
1149 if (dbus_error_is_set(&err)) {
1150 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Dbus Error(%s), text(%s)", err.message, text);
1151 dbus_error_free(&err);
1152 return TTS_ERROR_INVALID_PARAMETER;
1155 if (valid != true) {
1156 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Text is invalid - '%s'", text);
1157 return TTS_ERROR_INVALID_PARAMETER;
1159 SLOG(LOG_DEBUG, TAG_TTSC, "Text is valid - text is '%s'", text);
1161 /* save texts for repetition */
1162 if (NULL != client->text_repeat) {
1163 free(client->text_repeat);
1164 client->text_repeat = NULL;
1167 client->text_repeat = strdup(text);
1169 if (NULL != g_language) {
1173 if (NULL == language)
1176 g_language = strdup(language);
1178 g_voice_type = voice_type;
1181 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] repeat: text(%s), language(%s), voice type(%d), speed(%d)", client->text_repeat, g_language, g_voice_type, g_speed);
1183 /* change default language value */
1186 if (NULL == language)
1187 temp = strdup("default");
1189 temp = strdup(language);
1191 client->current_utt_id++;
1192 if (client->current_utt_id == 10000) {
1193 client->current_utt_id = 1;
1199 bool is_prepared = false;
1201 ret = tts_dbus_request_add_text(client->uid, text, temp, voice_type, speed, client->current_utt_id, client->credential);
1203 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1204 client->current_state = TTS_STATE_CREATED;
1205 if (0 == tts_prepare_sync(tts)) {
1207 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
1209 } else if (TTS_ERROR_TIMED_OUT != ret) {
1210 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1213 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry add text : %s", __tts_get_error_code(ret));
1216 if (TTS_RETRY_MIN_COUNT == count) {
1217 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1222 *utt_id = client->current_utt_id;
1231 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1236 static void __tts_play_async(void *data)
1238 tts_h tts = (tts_h)data;
1239 tts_client_s* client = tts_client_get(tts);
1242 if (NULL == client) {
1243 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1249 bool is_prepared = false;
1251 ret = tts_dbus_request_play(client->uid, client->credential);
1253 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1254 client->current_state = TTS_STATE_CREATED;
1255 if (0 == tts_prepare_sync(tts)) {
1257 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
1259 } else if (TTS_ERROR_TIMED_OUT != ret) {
1260 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1263 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry play : %s", __tts_get_error_code(ret));
1266 if (TTS_RETRY_COUNT == count) {
1267 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1275 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to play tts : %s", __tts_get_error_code(ret));
1277 client->reason = ret;
1278 client->utt_id = -1;
1280 ecore_timer_add(0, __tts_notify_error, client->tts);
1284 client->before_state = client->current_state;
1285 client->current_state = TTS_STATE_PLAYING;
1287 if (NULL != client->state_changed_cb) {
1288 tts_client_use_callback(client);
1289 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1290 tts_client_not_use_callback(client);
1291 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1294 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1299 int tts_play_async(tts_h tts)
1301 if (0 != __tts_get_feature_enabled()) {
1302 return TTS_ERROR_NOT_SUPPORTED;
1305 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Play tts");
1308 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
1309 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1310 return TTS_ERROR_INVALID_PARAMETER;
1313 tts_client_s* client = tts_client_get(tts);
1315 if (NULL == client) {
1316 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
1317 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1318 return TTS_ERROR_INVALID_PARAMETER;
1321 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
1322 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
1323 return TTS_ERROR_INVALID_STATE;
1326 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1327 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1328 return TTS_ERROR_INVALID_STATE;
1331 if (true == client->credential_needed && NULL == client->credential) {
1332 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Do not have app credential for this engine");
1333 return TTS_ERROR_PERMISSION_DENIED;
1336 ecore_main_loop_thread_safe_call_async(__tts_play_async, (void*)tts);
1338 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1340 return TTS_ERROR_NONE;
1343 int tts_play(tts_h tts)
1345 if (0 != __tts_get_feature_enabled()) {
1346 return TTS_ERROR_NOT_SUPPORTED;
1349 SLOG(LOG_INFO, TAG_TTSC, "@@@ Play tts");
1352 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
1353 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1354 return TTS_ERROR_INVALID_PARAMETER;
1357 tts_client_s* client = tts_client_get(tts);
1359 if (NULL == client) {
1360 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
1361 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1362 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1363 return TTS_ERROR_INVALID_PARAMETER;
1366 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
1367 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
1368 return TTS_ERROR_INVALID_STATE;
1371 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1372 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1373 return TTS_ERROR_INVALID_STATE;
1376 if (true == client->credential_needed && NULL == client->credential) {
1377 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Do not have app credential for this engine");
1378 return TTS_ERROR_PERMISSION_DENIED;
1383 bool is_prepared = false;
1385 ret = tts_dbus_request_play(client->uid, client->credential);
1387 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1388 client->current_state = TTS_STATE_CREATED;
1389 if (0 == tts_prepare_sync(tts)) {
1391 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
1393 } else if (TTS_ERROR_TIMED_OUT != ret) {
1394 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1397 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry play : %s", __tts_get_error_code(ret));
1400 if (TTS_RETRY_COUNT == count) {
1401 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1408 client->before_state = client->current_state;
1409 client->current_state = TTS_STATE_PLAYING;
1411 if (NULL != client->state_changed_cb) {
1412 tts_client_use_callback(client);
1413 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1414 tts_client_not_use_callback(client);
1415 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1418 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1420 return TTS_ERROR_NONE;
1423 static void __tts_stop_async(void *data)
1425 tts_h tts = (tts_h)data;
1426 tts_client_s* client = tts_client_get(tts);
1429 if (NULL == client) {
1430 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1436 bool is_prepared = false;
1438 ret = tts_dbus_request_stop(client->uid);
1440 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1441 client->current_state = TTS_STATE_CREATED;
1442 if (0 == tts_prepare_sync(tts)) {
1444 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
1446 } else if (TTS_ERROR_TIMED_OUT != ret) {
1447 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1450 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry stop : %s", __tts_get_error_code(ret));
1453 if (TTS_RETRY_COUNT == count) {
1454 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1462 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to stop tts : %s", __tts_get_error_code(ret));
1464 client->reason = ret;
1465 client->utt_id = -1;
1467 ecore_timer_add(0, __tts_notify_error, client->tts);
1471 client->before_state = client->current_state;
1472 client->current_state = TTS_STATE_READY;
1474 if (NULL != client->state_changed_cb) {
1475 tts_client_use_callback(client);
1476 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1477 tts_client_not_use_callback(client);
1478 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1481 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1486 int tts_stop_aync(tts_h tts)
1488 if (0 != __tts_get_feature_enabled()) {
1489 return TTS_ERROR_NOT_SUPPORTED;
1492 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Stop tts");
1495 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1496 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1497 return TTS_ERROR_INVALID_PARAMETER;
1500 tts_client_s* client = tts_client_get(tts);
1502 if (NULL == client) {
1503 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1504 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1505 return TTS_ERROR_INVALID_PARAMETER;
1508 if (TTS_STATE_CREATED == client->current_state) {
1509 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
1510 return TTS_ERROR_INVALID_STATE;
1513 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1514 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1515 return TTS_ERROR_INVALID_STATE;
1518 ecore_main_loop_thread_safe_call_async(__tts_stop_async, (void*)tts);
1520 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1522 return TTS_ERROR_NONE;
1525 int tts_stop(tts_h tts)
1527 if (0 != __tts_get_feature_enabled()) {
1528 return TTS_ERROR_NOT_SUPPORTED;
1531 SLOG(LOG_INFO, TAG_TTSC, "@@@ Stop tts");
1534 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1535 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1536 return TTS_ERROR_INVALID_PARAMETER;
1539 tts_client_s* client = tts_client_get(tts);
1541 if (NULL == client) {
1542 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1543 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1544 return TTS_ERROR_INVALID_PARAMETER;
1547 if (TTS_STATE_CREATED == client->current_state) {
1548 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
1549 return TTS_ERROR_INVALID_STATE;
1552 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1553 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1554 return TTS_ERROR_INVALID_STATE;
1559 bool is_prepared = false;
1561 ret = tts_dbus_request_stop(client->uid);
1563 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1564 client->current_state = TTS_STATE_CREATED;
1565 if (0 == tts_prepare_sync(tts)) {
1567 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
1569 } else if (TTS_ERROR_TIMED_OUT != ret) {
1570 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1573 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry stop : %s", __tts_get_error_code(ret));
1576 if (TTS_RETRY_COUNT == count) {
1577 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1584 client->before_state = client->current_state;
1585 client->current_state = TTS_STATE_READY;
1587 if (NULL != client->state_changed_cb) {
1588 tts_client_use_callback(client);
1589 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1590 tts_client_not_use_callback(client);
1591 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1594 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1596 return TTS_ERROR_NONE;
1599 static void __tts_pause_async(void *data)
1601 tts_h tts = (tts_h)data;
1602 tts_client_s* client = tts_client_get(tts);
1605 if (NULL == client) {
1606 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1612 bool is_prepared = false;
1614 ret = tts_dbus_request_pause(client->uid);
1616 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1617 client->current_state = TTS_STATE_CREATED;
1618 if (0 == tts_prepare_sync(tts)) {
1620 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
1622 } else if (TTS_ERROR_TIMED_OUT != ret) {
1623 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1626 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry pause : %s", __tts_get_error_code(ret));
1629 if (TTS_RETRY_COUNT == count) {
1630 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1638 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to pause tts : %s", __tts_get_error_code(ret));
1640 client->reason = ret;
1641 client->utt_id = -1;
1643 ecore_timer_add(0, __tts_notify_error, client->tts);
1647 client->before_state = client->current_state;
1648 client->current_state = TTS_STATE_PAUSED;
1650 if (NULL != client->state_changed_cb) {
1651 tts_client_use_callback(client);
1652 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1653 tts_client_not_use_callback(client);
1654 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1657 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1662 int tts_pause_async(tts_h tts)
1664 if (0 != __tts_get_feature_enabled()) {
1665 return TTS_ERROR_NOT_SUPPORTED;
1668 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Pause tts");
1671 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1672 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1673 return TTS_ERROR_INVALID_PARAMETER;
1676 tts_client_s* client = tts_client_get(tts);
1678 if (NULL == client) {
1679 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1680 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1681 return TTS_ERROR_INVALID_PARAMETER;
1684 if (TTS_STATE_PLAYING != client->current_state) {
1685 SLOG(LOG_ERROR, TAG_TTSC, "[Error] The Current state is NOT 'playing'. So this request should be not running.");
1686 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1687 return TTS_ERROR_INVALID_STATE;
1690 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1691 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1692 return TTS_ERROR_INVALID_STATE;
1695 ecore_main_loop_thread_safe_call_async(__tts_pause_async, (void*)tts);
1697 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1699 return TTS_ERROR_NONE;
1702 int tts_pause(tts_h tts)
1704 if (0 != __tts_get_feature_enabled()) {
1705 return TTS_ERROR_NOT_SUPPORTED;
1708 SLOG(LOG_INFO, TAG_TTSC, "@@@ Pause tts");
1711 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1712 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1713 return TTS_ERROR_INVALID_PARAMETER;
1716 tts_client_s* client = tts_client_get(tts);
1718 if (NULL == client) {
1719 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1720 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1721 return TTS_ERROR_INVALID_PARAMETER;
1724 if (TTS_STATE_PLAYING != client->current_state) {
1725 SLOG(LOG_ERROR, TAG_TTSC, "[Error] The Current state is NOT 'playing'. So this request should be not running.");
1726 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1727 return TTS_ERROR_INVALID_STATE;
1730 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1731 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1732 return TTS_ERROR_INVALID_STATE;
1737 bool is_prepared = false;
1739 ret = tts_dbus_request_pause(client->uid);
1741 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1742 client->current_state = TTS_STATE_CREATED;
1743 if (0 == tts_prepare_sync(tts)) {
1745 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
1747 } else if (TTS_ERROR_TIMED_OUT != ret) {
1748 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1751 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry pause : %s", __tts_get_error_code(ret));
1754 if (TTS_RETRY_COUNT == count) {
1755 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1762 client->before_state = client->current_state;
1763 client->current_state = TTS_STATE_PAUSED;
1765 if (NULL != client->state_changed_cb) {
1766 tts_client_use_callback(client);
1767 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1768 tts_client_not_use_callback(client);
1769 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1772 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1774 return TTS_ERROR_NONE;
1777 int tts_set_private_data(tts_h tts, const char* key, const char* data)
1779 if (0 != __tts_get_feature_enabled()) {
1780 return TTS_ERROR_NOT_SUPPORTED;
1783 SLOG(LOG_INFO, TAG_TTSC, "@@@ Set private data, key(%s), data(%s)", key, data);
1786 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle isnull");
1787 return TTS_ERROR_INVALID_PARAMETER;
1790 if (NULL == key || NULL == data) {
1791 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid parameter");
1792 return TTS_ERROR_INVALID_PARAMETER;
1795 tts_client_s* client = tts_client_get(tts);
1797 if (NULL == client) {
1798 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1799 return TTS_ERROR_INVALID_PARAMETER;
1802 if (TTS_STATE_READY != client->current_state) {
1803 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid state : Current state is NOT 'READY'");
1804 return TTS_ERROR_INVALID_STATE;
1807 if (true != client->internal && (0 == strcmp(key, "EnableServerTTS") || 0 == strcmp(key, "DisableServerTTS"))) {
1808 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] This is not an internal app");
1809 return TTS_ERROR_INVALID_PARAMETER;
1814 bool is_prepared = false;
1816 ret = tts_dbus_request_set_private_data(client->uid, key, data);
1818 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1819 client->current_state = TTS_STATE_CREATED;
1820 if (0 == tts_prepare_sync(tts)) {
1822 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
1824 } else if (TTS_ERROR_TIMED_OUT != ret) {
1825 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1828 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry : %s", __tts_get_error_code(ret));
1831 if (TTS_RETRY_COUNT == count) {
1832 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1839 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1844 int tts_get_private_data(tts_h tts, const char* key, char** data)
1846 if (0 != __tts_get_feature_enabled()) {
1847 return TTS_ERROR_NOT_SUPPORTED;
1850 SLOG(LOG_INFO, TAG_TTSC, "@@@ Get private data, key(%s)", key);
1853 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1854 return TTS_ERROR_INVALID_PARAMETER;
1857 if (NULL == key || NULL == data) {
1858 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid parameter");
1859 return TTS_ERROR_INVALID_PARAMETER;
1862 tts_client_s* client = tts_client_get(tts);
1864 if (NULL == client) {
1865 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1866 return TTS_ERROR_INVALID_PARAMETER;
1869 if (TTS_STATE_READY != client->current_state) {
1870 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid state : Current state is NOT 'READY'");
1871 return TTS_ERROR_INVALID_STATE;
1876 bool is_prepared = false;
1878 ret = tts_dbus_request_get_private_data(client->uid, key, data);
1880 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1881 client->current_state = TTS_STATE_CREATED;
1882 if (0 == tts_prepare_sync(tts)) {
1884 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
1886 } else if (TTS_ERROR_TIMED_OUT != ret) {
1887 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1890 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry : %s", __tts_get_error_code(ret));
1893 if (TTS_RETRY_COUNT == count) {
1894 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1901 if (0 == strncmp(*data, "NULL", strlen(*data))) {
1906 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1911 static Eina_Bool __tts_notify_error(void *data)
1913 tts_h tts = (tts_h)data;
1915 tts_client_s* client = tts_client_get(tts);
1918 if (NULL == client) {
1919 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify error msg : A handle is not valid");
1923 SLOG(LOG_DEBUG, TAG_TTSC, "Error data : uttid(%d) reason(%s)", client->utt_id, __tts_get_error_code(client->reason));
1925 if (NULL != client->error_cb) {
1926 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of error");
1927 tts_client_use_callback(client);
1928 g_err_callback_status = true;
1929 client->error_cb(client->tts, client->utt_id, client->reason, client->error_user_data);
1930 g_err_callback_status = false;
1931 tts_client_not_use_callback(client);
1933 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
1939 int __tts_cb_error(int uid, tts_error_e reason, int utt_id, char* err_msg)
1942 GList* client_list = NULL;
1943 client_list = tts_client_get_client_list();
1946 tts_client_s *data = NULL;
1948 if (g_list_length(client_list) > 0) {
1949 /* Get a first item */
1950 iter = g_list_first(client_list);
1952 while (NULL != iter) {
1955 data->utt_id = utt_id;
1956 data->reason = reason;
1957 if (NULL != data->err_msg) {
1958 free(data->err_msg);
1959 data->err_msg = NULL;
1961 if (NULL != err_msg)
1962 data->err_msg = strdup(err_msg);
1964 /* call callback function */
1965 if (NULL != data->error_cb) {
1966 ecore_timer_add(0, __tts_notify_error, data->tts);
1968 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
1971 if (TTS_ERROR_SERVICE_RESET == reason) {
1972 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Service Reset");
1974 data->current_state = TTS_STATE_CREATED;
1975 if (0 != tts_prepare(data->tts)) {
1976 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare");
1981 iter = g_list_next(iter);
1985 tts_client_s* client = tts_client_get_by_uid(uid);
1987 if (NULL == client) {
1988 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
1989 return TTS_ERROR_INVALID_PARAMETER;
1992 client->utt_id = utt_id;
1993 client->reason = reason;
1994 if (NULL != client->err_msg) {
1995 free(client->err_msg);
1996 client->err_msg = NULL;
1998 if (NULL != err_msg)
1999 client->err_msg = strdup(err_msg);
2001 /* call callback function */
2002 if (NULL != client->error_cb) {
2003 ecore_timer_add(0, __tts_notify_error, client->tts);
2005 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
2008 if (TTS_ERROR_SERVICE_RESET == reason) {
2009 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Service Reset");
2011 client->current_state = TTS_STATE_CREATED;
2012 if (0 != tts_prepare(client->tts)) {
2013 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare");
2021 static Eina_Bool __tts_notify_state_changed(void *data)
2023 tts_h tts = (tts_h)data;
2025 tts_client_s* client = tts_client_get(tts);
2028 if (NULL == client) {
2029 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify state changed : A handle is not valid");
2033 if (NULL != client->state_changed_cb) {
2034 tts_client_use_callback(client);
2035 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
2036 tts_client_not_use_callback(client);
2037 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called : pre(%d) cur(%d)", client->before_state, client->current_state);
2039 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
2045 int __tts_cb_set_state(int uid, int state)
2047 tts_client_s* client = tts_client_get_by_uid(uid);
2048 if (NULL == client) {
2049 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] The handle is not valid");
2053 tts_state_e state_from_daemon = (tts_state_e)state;
2055 if (client->current_state == state_from_daemon) {
2056 SLOG(LOG_DEBUG, TAG_TTSC, "Current state has already been %d", client->current_state);
2060 if (NULL != client->state_changed_cb) {
2061 ecore_timer_add(0, __tts_notify_state_changed, client->tts);
2063 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
2066 client->before_state = client->current_state;
2067 client->current_state = state_from_daemon;
2072 int __tts_cb_utt_started(int uid, int utt_id)
2074 tts_client_s* client = tts_client_get_by_uid(uid);
2076 if (NULL == client) {
2077 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
2078 return TTS_ERROR_INVALID_PARAMETER;
2081 SLOG(LOG_INFO, TAG_TTSC, "utterance started : utt id(%d) ", utt_id);
2083 client->utt_id = utt_id;
2085 /* call callback function */
2086 if (NULL != client->utt_started_cb) {
2087 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance started ");
2088 tts_client_use_callback(client);
2089 client->utt_started_cb(client->tts, client->utt_id, client->utt_started_user_data);
2090 tts_client_not_use_callback(client);
2092 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance started ");
2098 int __tts_cb_utt_completed(int uid, int utt_id)
2100 tts_client_s* client = tts_client_get_by_uid(uid);
2102 if (NULL == client) {
2103 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
2104 return TTS_ERROR_INVALID_PARAMETER;
2107 SLOG(LOG_INFO, TAG_TTSC, "utterance completed : uttid(%d) ", utt_id);
2109 client->utt_id = utt_id;
2111 /* call callback function */
2112 if (NULL != client->utt_completeted_cb) {
2113 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance completed ");
2114 tts_client_use_callback(client);
2115 client->utt_completeted_cb(client->tts, client->utt_id, client->utt_completed_user_data);
2116 tts_client_not_use_callback(client);
2118 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance completed ");
2124 int tts_set_state_changed_cb(tts_h tts, tts_state_changed_cb callback, void* user_data)
2126 if (0 != __tts_get_feature_enabled()) {
2127 return TTS_ERROR_NOT_SUPPORTED;
2130 if (NULL == tts || NULL == callback) {
2131 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Input parameter is null");
2132 return TTS_ERROR_INVALID_PARAMETER;
2135 tts_client_s* client = tts_client_get(tts);
2137 if (NULL == client) {
2138 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : A handle is not valid");
2139 return TTS_ERROR_INVALID_PARAMETER;
2142 if (TTS_STATE_CREATED != client->current_state) {
2143 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Current state is not 'Created'.");
2144 return TTS_ERROR_INVALID_STATE;
2147 client->state_changed_cb = callback;
2148 client->state_changed_user_data = user_data;
2150 SLOG(LOG_INFO, TAG_TTSC, "[SUCCESS] Set state changed cb");
2155 int tts_unset_state_changed_cb(tts_h tts)
2157 if (0 != __tts_get_feature_enabled()) {
2158 return TTS_ERROR_NOT_SUPPORTED;
2162 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Input parameter is null");
2163 return TTS_ERROR_INVALID_PARAMETER;
2166 tts_client_s* client = tts_client_get(tts);
2168 if (NULL == client) {
2169 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : A handle is not valid");
2170 return TTS_ERROR_INVALID_PARAMETER;
2173 if (TTS_STATE_CREATED != client->current_state) {
2174 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Current state is not 'Created'.");
2175 return TTS_ERROR_INVALID_STATE;
2178 client->state_changed_cb = NULL;
2179 client->state_changed_user_data = NULL;
2181 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset state changed cb");
2186 int tts_set_utterance_started_cb(tts_h tts, tts_utterance_started_cb callback, void* user_data)
2188 if (0 != __tts_get_feature_enabled()) {
2189 return TTS_ERROR_NOT_SUPPORTED;
2192 if (NULL == tts || NULL == callback) {
2193 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Input parameter is null");
2194 return TTS_ERROR_INVALID_PARAMETER;
2197 tts_client_s* client = tts_client_get(tts);
2199 if (NULL == client) {
2200 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : A handle is not valid");
2201 return TTS_ERROR_INVALID_PARAMETER;
2204 if (TTS_STATE_CREATED != client->current_state) {
2205 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Current state is not 'Created'.");
2206 return TTS_ERROR_INVALID_STATE;
2209 client->utt_started_cb = callback;
2210 client->utt_started_user_data = user_data;
2212 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt started cb");
2217 int tts_unset_utterance_started_cb(tts_h tts)
2219 if (0 != __tts_get_feature_enabled()) {
2220 return TTS_ERROR_NOT_SUPPORTED;
2224 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Input parameter is null");
2225 return TTS_ERROR_INVALID_PARAMETER;
2228 tts_client_s* client = tts_client_get(tts);
2230 if (NULL == client) {
2231 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : A handle is not valid");
2232 return TTS_ERROR_INVALID_PARAMETER;
2235 if (TTS_STATE_CREATED != client->current_state) {
2236 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Current state is not 'Created'.");
2237 return TTS_ERROR_INVALID_STATE;
2240 client->utt_started_cb = NULL;
2241 client->utt_started_user_data = NULL;
2243 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt started cb");
2248 int tts_set_utterance_completed_cb(tts_h tts, tts_utterance_completed_cb callback, void* user_data)
2250 if (0 != __tts_get_feature_enabled()) {
2251 return TTS_ERROR_NOT_SUPPORTED;
2254 if (NULL == tts || NULL == callback) {
2255 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Input parameter is null");
2256 return TTS_ERROR_INVALID_PARAMETER;
2259 tts_client_s* client = tts_client_get(tts);
2261 if (NULL == client) {
2262 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : A handle is not valid");
2263 return TTS_ERROR_INVALID_PARAMETER;
2266 if (TTS_STATE_CREATED != client->current_state) {
2267 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Current state is not 'Created'.");
2268 return TTS_ERROR_INVALID_STATE;
2271 client->utt_completeted_cb = callback;
2272 client->utt_completed_user_data = user_data;
2274 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt completed cb");
2279 int tts_unset_utterance_completed_cb(tts_h tts)
2281 if (0 != __tts_get_feature_enabled()) {
2282 return TTS_ERROR_NOT_SUPPORTED;
2286 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Input parameter is null");
2287 return TTS_ERROR_INVALID_PARAMETER;
2290 tts_client_s* client = tts_client_get(tts);
2292 if (NULL == client) {
2293 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : A handle is not valid");
2294 return TTS_ERROR_INVALID_PARAMETER;
2297 if (TTS_STATE_CREATED != client->current_state) {
2298 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Current state is not 'Created'.");
2299 return TTS_ERROR_INVALID_STATE;
2302 client->utt_completeted_cb = NULL;
2303 client->utt_completed_user_data = NULL;
2305 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt completed cb");
2309 int tts_set_error_cb(tts_h tts, tts_error_cb callback, void* user_data)
2311 if (0 != __tts_get_feature_enabled()) {
2312 return TTS_ERROR_NOT_SUPPORTED;
2315 if (NULL == tts || NULL == callback) {
2316 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Input parameter is null");
2317 return TTS_ERROR_INVALID_PARAMETER;
2320 tts_client_s* client = tts_client_get(tts);
2322 if (NULL == client) {
2323 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : A handle is not valid");
2324 return TTS_ERROR_INVALID_PARAMETER;
2327 if (TTS_STATE_CREATED != client->current_state) {
2328 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Current state is not 'Created'.");
2329 return TTS_ERROR_INVALID_STATE;
2332 client->error_cb = callback;
2333 client->error_user_data = user_data;
2335 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set error cb");
2340 int tts_unset_error_cb(tts_h tts)
2342 if (0 != __tts_get_feature_enabled()) {
2343 return TTS_ERROR_NOT_SUPPORTED;
2347 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Input parameter is null");
2348 return TTS_ERROR_INVALID_PARAMETER;
2351 tts_client_s* client = tts_client_get(tts);
2353 if (NULL == client) {
2354 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : A handle is not valid");
2355 return TTS_ERROR_INVALID_PARAMETER;
2358 if (TTS_STATE_CREATED != client->current_state) {
2359 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Current state is not 'Created'.");
2360 return TTS_ERROR_INVALID_STATE;
2363 client->error_cb = NULL;
2364 client->error_user_data = NULL;
2366 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset error cb");
2371 int tts_set_default_voice_changed_cb(tts_h tts, tts_default_voice_changed_cb callback, void* user_data)
2373 if (0 != __tts_get_feature_enabled()) {
2374 return TTS_ERROR_NOT_SUPPORTED;
2377 if (NULL == tts || NULL == callback) {
2378 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : Input parameter is null");
2379 return TTS_ERROR_INVALID_PARAMETER;
2382 tts_client_s* client = tts_client_get(tts);
2384 if (NULL == client) {
2385 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : A handle is not valid");
2386 return TTS_ERROR_INVALID_PARAMETER;
2389 if (TTS_STATE_CREATED != client->current_state) {
2390 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : Current state is not 'Created'.");
2391 return TTS_ERROR_INVALID_STATE;
2394 client->default_voice_changed_cb = callback;
2395 client->default_voice_changed_user_data = user_data;
2397 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set default voice changed cb");
2402 int tts_unset_default_voice_changed_cb(tts_h tts)
2404 if (0 != __tts_get_feature_enabled()) {
2405 return TTS_ERROR_NOT_SUPPORTED;
2409 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : Input parameter is null");
2410 return TTS_ERROR_INVALID_PARAMETER;
2413 tts_client_s* client = tts_client_get(tts);
2415 if (NULL == client) {
2416 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : A handle is not valid");
2417 return TTS_ERROR_INVALID_PARAMETER;
2420 if (TTS_STATE_CREATED != client->current_state) {
2421 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : Current state is not 'Created'.");
2422 return TTS_ERROR_INVALID_STATE;
2425 client->default_voice_changed_cb = NULL;
2426 client->default_voice_changed_user_data = NULL;
2428 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset default voice changed cb");
2433 int tts_set_engine_changed_cb(tts_h tts, tts_engine_changed_cb callback, void* user_data)
2435 if (0 != __tts_get_feature_enabled()) {
2436 return TTS_ERROR_NOT_SUPPORTED;
2439 if (NULL == tts || NULL == callback) {
2440 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set engine changed cb : Input parameter is null");
2441 return TTS_ERROR_INVALID_PARAMETER;
2444 tts_client_s* client = tts_client_get(tts);
2446 if (NULL == client) {
2447 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set engine changed cb : A handle is not valid");
2448 return TTS_ERROR_INVALID_PARAMETER;
2451 if (TTS_STATE_CREATED != client->current_state) {
2452 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set engine changed cb : Current state is not 'Created'.");
2453 return TTS_ERROR_INVALID_STATE;
2456 client->engine_changed_cb = callback;
2457 client->engine_changed_user_data = user_data;
2459 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set engine changed cb");
2464 int tts_unset_engine_changed_cb(tts_h tts)
2466 if (0 != __tts_get_feature_enabled()) {
2467 return TTS_ERROR_NOT_SUPPORTED;
2471 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset engine changed cb : Input parameter is null");
2472 return TTS_ERROR_INVALID_PARAMETER;
2475 tts_client_s* client = tts_client_get(tts);
2477 if (NULL == client) {
2478 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset engine changed cb : A handle is not valid");
2479 return TTS_ERROR_INVALID_PARAMETER;
2482 if (TTS_STATE_CREATED != client->current_state) {
2483 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset engine changed cb : Current state is not 'Created'.");
2484 return TTS_ERROR_INVALID_STATE;
2487 client->engine_changed_cb = NULL;
2488 client->engine_changed_user_data = NULL;
2490 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset engine changed cb");
2495 int tts_add_pcm(tts_h tts, int event, const void* data, unsigned int data_size, int audio_type, int rate)
2497 if (0 != __tts_get_feature_enabled()) {
2498 return TTS_ERROR_NOT_SUPPORTED;
2501 SLOG(LOG_INFO, TAG_TTSC, "@@@ Add pcm tts");
2504 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
2505 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2506 return TTS_ERROR_INVALID_PARAMETER;
2509 tts_client_s* client = tts_client_get(tts);
2511 if (NULL == client) {
2512 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
2513 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2514 return TTS_ERROR_INVALID_PARAMETER;
2517 if (TTS_STATE_CREATED == client->current_state) {
2518 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
2519 return TTS_ERROR_INVALID_STATE;
2522 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
2523 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
2524 return TTS_ERROR_INVALID_STATE;
2529 bool is_prepared = false;
2531 ret = tts_dbus_request_add_pcm(client->uid, event, data, data_size, audio_type, rate);
2533 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2534 client->current_state = TTS_STATE_CREATED;
2535 if (0 == tts_prepare_sync(tts)) {
2537 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
2539 } else if (TTS_ERROR_TIMED_OUT != ret) {
2540 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
2543 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry add pcm : %s", __tts_get_error_code(ret));
2546 if (TTS_RETRY_COUNT == count) {
2547 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
2554 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2556 return TTS_ERROR_NONE;
2559 int tts_play_pcm(tts_h tts)
2561 if (0 != __tts_get_feature_enabled()) {
2562 return TTS_ERROR_NOT_SUPPORTED;
2565 SLOG(LOG_INFO, TAG_TTSC, "@@@ Play pcm tts");
2568 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
2569 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2570 return TTS_ERROR_INVALID_PARAMETER;
2573 tts_client_s* client = tts_client_get(tts);
2575 if (NULL == client) {
2576 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
2577 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2578 return TTS_ERROR_INVALID_PARAMETER;
2581 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
2582 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
2583 return TTS_ERROR_INVALID_STATE;
2586 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
2587 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
2588 return TTS_ERROR_INVALID_STATE;
2593 bool is_prepared = false;
2595 ret = tts_dbus_request_play_pcm(client->uid);
2597 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2598 client->current_state = TTS_STATE_CREATED;
2599 if (0 == tts_prepare_sync(tts)) {
2601 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
2603 } else if (TTS_ERROR_TIMED_OUT != ret) {
2604 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
2607 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry play pcm : %s", __tts_get_error_code(ret));
2610 if (TTS_RETRY_COUNT == count) {
2611 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
2618 client->before_state = client->current_state;
2619 client->current_state = TTS_STATE_PLAYING;
2621 if (NULL != client->state_changed_cb) {
2622 tts_client_use_callback(client);
2623 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
2624 tts_client_not_use_callback(client);
2625 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
2628 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2630 return TTS_ERROR_NONE;
2633 int tts_stop_pcm(tts_h tts)
2635 if (0 != __tts_get_feature_enabled()) {
2636 return TTS_ERROR_NOT_SUPPORTED;
2639 SLOG(LOG_INFO, TAG_TTSC, "@@@ Stop pcm tts");
2642 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
2643 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2644 return TTS_ERROR_INVALID_PARAMETER;
2647 tts_client_s* client = tts_client_get(tts);
2649 if (NULL == client) {
2650 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
2651 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2652 return TTS_ERROR_INVALID_PARAMETER;
2655 if (TTS_STATE_CREATED == client->current_state) {
2656 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
2657 return TTS_ERROR_INVALID_STATE;
2660 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
2661 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
2662 return TTS_ERROR_INVALID_STATE;
2667 bool is_prepared = false;
2669 ret = tts_dbus_request_stop_pcm(client->uid);
2671 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2672 client->current_state = TTS_STATE_CREATED;
2673 if (0 == tts_prepare_sync(tts)) {
2675 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
2677 } else if (TTS_ERROR_TIMED_OUT != ret) {
2678 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
2681 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry stop pcm : %s", __tts_get_error_code(ret));
2684 if (TTS_RETRY_COUNT == count) {
2685 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
2692 client->before_state = client->current_state;
2693 client->current_state = TTS_STATE_READY;
2695 if (NULL != client->state_changed_cb) {
2696 tts_client_use_callback(client);
2697 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
2698 tts_client_not_use_callback(client);
2699 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
2702 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2704 return TTS_ERROR_NONE;
2707 int tts_repeat(tts_h tts, char** text_repeat, int* utt_id)
2709 if (0 != __tts_get_feature_enabled()) {
2710 return TTS_ERROR_NOT_SUPPORTED;
2713 SLOG(LOG_INFO, TAG_TTSC, "@@@ Repeat TTS");
2716 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
2717 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2718 return TTS_ERROR_INVALID_PARAMETER;
2721 if (NULL == text_repeat || NULL == utt_id) {
2722 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null.");
2723 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2724 return TTS_ERROR_INVALID_PARAMETER;
2727 *text_repeat = NULL;
2730 tts_client_s* client = tts_client_get(tts);
2732 if (NULL == client) {
2733 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
2734 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2735 return TTS_ERROR_INVALID_PARAMETER;
2738 if (TTS_STATE_READY != client->current_state) {
2739 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid. (%d)", client->current_state);
2740 return TTS_ERROR_INVALID_STATE;
2743 /* Clear the legacy and Add texts to be played repeatedly */
2745 ret = tts_stop(tts);
2746 if (TTS_ERROR_NONE != ret) {
2747 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to clear the legacy");
2751 if (NULL != client->text_repeat) {
2752 char* tmp_text = strdup(client->text_repeat);
2753 char* tmp_lang = NULL;
2754 if (NULL != g_language) {
2755 tmp_lang = strdup(g_language);
2757 ret = tts_add_text(tts, tmp_text, tmp_lang, g_voice_type, g_speed, utt_id);
2758 if (TTS_ERROR_NONE != ret) {
2759 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to add texts for repetition.");
2760 if (NULL != tmp_text) {
2764 if (NULL != tmp_lang) {
2770 *text_repeat = strdup(client->text_repeat);
2771 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] text to repeat(%s), utt_id(%d)", *text_repeat, *utt_id);
2772 if (NULL != tmp_text) {
2776 if (NULL != tmp_lang) {
2781 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] There is no previous added texts. Please add texts");
2782 return TTS_ERROR_OPERATION_FAILED;
2785 /* Play added texts */
2786 ret = tts_play(tts);
2787 if (TTS_ERROR_NONE != ret) {
2788 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to play texts for repetition.");
2789 if (NULL != *text_repeat) {
2791 *text_repeat = NULL;
2797 return TTS_ERROR_NONE;