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>
23 #include <package-manager.h>
26 #include "tts_client.h"
27 #include "tts_config_mgr.h"
31 #include "tts_internal.h"
33 static bool g_screen_reader;
35 static int g_feature_enabled = -1;
37 static bool g_err_callback_status = false;
39 static int g_max_text_size = -1;
41 static Ecore_Timer* g_check_state_timer = NULL;
45 static char* g_language = NULL;
47 static int g_voice_type = -1;
49 static int g_speed = -1;
51 /* for checking engine update */
52 static pkgmgr_client* g_pkgmgr = NULL;
53 static char* g_engine_name = NULL;
54 static int g_engine_update_status = 0;
56 /* Function definition */
57 static Eina_Bool __tts_notify_state_changed(void *data);
58 static Eina_Bool __tts_notify_error(void *data);
59 int __tts_cb_error(int uid, tts_error_e reason, int utt_id, char* err_msg);
67 static int __tts_get_feature_enabled()
69 if (0 == g_feature_enabled) {
70 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS feature NOT supported");
71 return TTS_ERROR_NOT_SUPPORTED;
72 } else if (-1 == g_feature_enabled) {
73 bool tts_supported = false;
74 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
75 if (false == tts_supported) {
76 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS feature NOT supported");
77 g_feature_enabled = 0;
78 return TTS_ERROR_NOT_SUPPORTED;
81 g_feature_enabled = 1;
83 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get feature value");
84 return TTS_ERROR_NOT_SUPPORTED;
91 static const char* __tts_get_error_code(tts_error_e err)
94 case TTS_ERROR_NONE: return "TTS_ERROR_NONE";
95 case TTS_ERROR_OUT_OF_MEMORY: return "TTS_ERROR_OUT_OF_MEMORY";
96 case TTS_ERROR_IO_ERROR: return "TTS_ERROR_IO_ERROR";
97 case TTS_ERROR_INVALID_PARAMETER: return "TTS_ERROR_INVALID_PARAMETER";
98 case TTS_ERROR_OUT_OF_NETWORK: return "TTS_ERROR_OUT_OF_NETWORK";
99 case TTS_ERROR_TIMED_OUT: return "TTS_ERROR_TIMED_OUT";
100 case TTS_ERROR_PERMISSION_DENIED: return "TTS_ERROR_PERMISSION_DENIED";
101 case TTS_ERROR_NOT_SUPPORTED: return "TTS_ERROR_NOT_SUPPORTED";
102 case TTS_ERROR_INVALID_STATE: return "TTS_ERROR_INVALID_STATE";
103 case TTS_ERROR_INVALID_VOICE: return "TTS_ERROR_INVALID_VOICE";
104 case TTS_ERROR_ENGINE_NOT_FOUND: return "TTS_ERROR_ENGINE_NOT_FOUND";
105 case TTS_ERROR_OPERATION_FAILED: return "TTS_ERROR_OPERATION_FAILED";
106 case TTS_ERROR_AUDIO_POLICY_BLOCKED: return "TTS_ERROR_AUDIO_POLICY_BLOCKED";
107 case TTS_ERROR_NOT_SUPPORTED_FEATURE: return "TTS_ERROR_NOT_SUPPORTED_FEATURE";
108 case TTS_ERROR_SERVICE_RESET: return "TTS_ERROR_SERVICE_RESET";
110 return "Invalid error code";
115 static int __tts_convert_config_error_code(tts_config_error_e code)
117 if (code == TTS_CONFIG_ERROR_NONE) return TTS_ERROR_NONE;
118 if (code == TTS_CONFIG_ERROR_OUT_OF_MEMORY) return TTS_ERROR_OUT_OF_MEMORY;
119 if (code == TTS_CONFIG_ERROR_IO_ERROR) return TTS_ERROR_IO_ERROR;
120 if (code == TTS_CONFIG_ERROR_INVALID_PARAMETER) return TTS_ERROR_INVALID_PARAMETER;
121 if (code == TTS_CONFIG_ERROR_INVALID_STATE) return TTS_ERROR_INVALID_STATE;
122 if (code == TTS_CONFIG_ERROR_INVALID_VOICE) return TTS_ERROR_INVALID_VOICE;
123 if (code == TTS_CONFIG_ERROR_ENGINE_NOT_FOUND) return TTS_ERROR_ENGINE_NOT_FOUND;
124 if (code == TTS_CONFIG_ERROR_OPERATION_FAILED) return TTS_ERROR_OPERATION_FAILED;
125 if (code == TTS_CONFIG_ERROR_NOT_SUPPORTED_FEATURE) return TTS_ERROR_NOT_SUPPORTED_FEATURE;
131 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)
133 SLOG(LOG_DEBUG, TAG_TTSC, "Voice changed : Before lang(%s) type(%d) , Current lang(%s), type(%d)",
134 before_lang, before_voice_type, language, voice_type);
136 GList* client_list = NULL;
137 client_list = tts_client_get_client_list();
140 tts_client_s *data = NULL;
142 if (g_list_length(client_list) > 0) {
143 /* Get a first item */
144 iter = g_list_first(client_list);
146 while (NULL != iter) {
148 if (NULL != data->default_voice_changed_cb) {
149 SLOG(LOG_DEBUG, TAG_TTSC, "Call default voice changed callback : uid(%d)", data->uid);
150 data->default_voice_changed_cb(data->tts, before_lang, before_voice_type,
151 language, voice_type, data->default_voice_changed_user_data);
154 /* Check whether language is changed or not. If it is changed, make 'text_repeat' NULL */
155 if (0 != strncmp(before_lang, language, strlen(before_lang))) {
156 if (NULL != data->text_repeat) {
157 free(data->text_repeat);
158 data->text_repeat = NULL;
163 iter = g_list_next(iter);
170 static Eina_Bool __reconnect_by_engine_changed(void* data)
172 tts_h tts = (tts_h)data;
174 tts_client_s* client = tts_client_get(tts);
175 if (NULL == client) {
176 SLOG(LOG_ERROR, TAG_TTSC, "[WARNING] A handle is not valid");
180 if (TTS_STATE_READY != client->current_state) {
185 int ret = tts_unprepare(tts);
187 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare for setting a new engine... (%d)", ret);
189 ret = tts_prepare(tts);
191 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare for setting a new engine... (%d)", ret);
197 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)
199 tts_h tts = (tts_h)user_data;
201 tts_client_s* client = tts_client_get(tts);
202 if (NULL == client) {
203 SLOG(LOG_ERROR, TAG_TTSC, "[WARNING] A handle is not valid");
207 if (NULL != engine_id) SLOG(LOG_DEBUG, TAG_TTSC, "Engine id(%s)", engine_id);
208 if (NULL != setting) SLOG(LOG_DEBUG, TAG_TTSC, "Engine setting(%s)", setting);
209 if (NULL != language) SLOG(LOG_DEBUG, TAG_TTSC, "Language(%s)", language);
210 SLOG(LOG_DEBUG, TAG_TTSC, "Voice type(%d), Auto voice(%s), Credential(%s)", voice_type, auto_voice ? "on" : "off", need_credential ? "need" : "no need");
212 /* When the default engine is changed, please unload the old engine and load the new one. */
215 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_PAUSED == client->current_state) {
218 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] TTS client stopping...");
221 ecore_idler_add(__reconnect_by_engine_changed, (void*)tts);
222 } else if (TTS_STATE_READY == client->current_state) {
223 ret = tts_unprepare(tts);
225 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to unprepare for setting a new engine... (%d)", ret);
227 ret = tts_prepare(tts);
229 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare for setting a new engine... (%d)", ret);
233 /* call callback function */
234 if (NULL != client->engine_changed_cb) {
235 client->engine_changed_cb(tts, engine_id, language, voice_type, need_credential, client->engine_changed_user_data);
237 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function for changed engine");
243 void __tts_unset_all_callbacks(tts_h tts)
245 SLOG(LOG_INFO, TAG_TTSC, "@@@ unset all callbacks");
247 tts_unset_state_changed_cb(tts);
248 tts_unset_utterance_started_cb(tts);
249 tts_unset_utterance_completed_cb(tts);
250 tts_unset_error_cb(tts);
251 tts_unset_default_voice_changed_cb(tts);
252 tts_unset_engine_changed_cb(tts);
254 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
257 static int __pkgmgr_status_cb(uid_t target_uid, int req_id, const char *type, const char *pkgname, const char *key, const char *val, const void *pmsg, void *data)
259 SLOG(LOG_INFO, TAG_TTSC, "[INFO] pkgmgr status cb is invoked. pkgname(%s), type(%s), key(%s), val(%s)", pkgname, type, key, val);
261 if (0 != strncmp(g_engine_name, pkgname, strlen(g_engine_name))) {
262 SLOG(LOG_DEBUG, TAG_TTSC, "[WARN] this is not tts engine");
265 if (key && 0 == strncmp(key, "start", strlen(key))) {
266 if (val && (0 == strncmp(val, "update", strlen(val) || 0 == strncmp(val, "uninstall", strlen(val))))) {
267 SLOG(LOG_INFO, TAG_TTSC, "[INFO] start to install.");
268 g_engine_update_status = 1;
270 } else if (key && 0 == strncmp(key, "end", strlen(key))) {
271 SLOG(LOG_INFO, TAG_TTSC, "[INFO] finish to install");
272 g_engine_update_status = 0;
279 static void __create_pkgmgr_thread(void* data, Ecore_Thread* thread)
282 g_pkgmgr = pkgmgr_client_new(PC_LISTENING);
283 if (NULL == g_pkgmgr) {
284 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to create pkgmgr handle");
286 if (pkgmgr_client_listen_status(g_pkgmgr, __pkgmgr_status_cb, NULL) < 0) {
287 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to listen pkgmgr status. remove and recreate client");
288 pkgmgr_client_free(g_pkgmgr);
292 SLOG(LOG_ERROR, TAG_TTSC, "[DEBUG] Succeed to register pkgmgr cb");
301 static void __finish_pkgmgr_thread(void* data, Ecore_Thread* thread)
303 SLOG(LOG_ERROR, TAG_TTSC, "[DEBUG] Finish pkgmgr thread");
306 int tts_create(tts_h* tts)
308 if (0 != __tts_get_feature_enabled()) {
309 return TTS_ERROR_NOT_SUPPORTED;
312 SLOG(LOG_INFO, TAG_TTSC, "@@@ Create TTS");
316 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
317 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
318 return TTS_ERROR_INVALID_PARAMETER;
321 if (0 == tts_client_get_size()) {
322 if (0 != tts_dbus_open_connection()) {
323 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to open dbus connection");
324 return TTS_ERROR_OPERATION_FAILED;
328 if (0 != tts_client_new(tts)) {
329 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to create client!!!!!");
330 return TTS_ERROR_OUT_OF_MEMORY;
333 tts_client_s* client = tts_client_get(*tts);
334 if (NULL == client) {
335 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get client");
336 return TTS_ERROR_OPERATION_FAILED;
339 int ret = tts_config_mgr_initialize(client->uid);
341 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to init config manager : %d", ret);
342 tts_client_destroy(*tts);
343 return __tts_convert_config_error_code(ret);
346 ret = tts_config_mgr_set_callback(client->uid, _tts_config_engine_changed_cb, __tts_config_voice_changed_cb, NULL, NULL, NULL, client->tts);
348 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to set config changed : %d", ret);
349 tts_client_destroy(*tts);
350 return __tts_convert_config_error_code(ret);
353 ecore_thread_main_loop_begin();
354 ecore_thread_run(__create_pkgmgr_thread, __finish_pkgmgr_thread, NULL, NULL);
355 ecore_thread_main_loop_end();
357 g_engine_name = vconf_get_str(TTS_ENGINE_DB_DEFAULT);
358 if (NULL == g_engine_name) {
359 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get engine name");
361 SLOG(LOG_ERROR, TAG_TTSC, "[INFO] Engine name(%s)", g_engine_name);
364 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
365 SLOG(LOG_DEBUG, TAG_TTSC, " ");
367 return TTS_ERROR_NONE;
370 int tts_destroy(tts_h tts)
372 if (0 != __tts_get_feature_enabled()) {
373 return TTS_ERROR_NOT_SUPPORTED;
376 SLOG(LOG_INFO, TAG_TTSC, "@@@ Destroy TTS");
379 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
380 return TTS_ERROR_INVALID_PARAMETER;
383 tts_client_s* client = tts_client_get(tts);
386 if (NULL == client) {
387 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
388 return TTS_ERROR_INVALID_PARAMETER;
391 /* check used callback */
392 if (0 != tts_client_get_use_callback(client)) {
393 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Cannot destroy in Callback function");
394 return TTS_ERROR_OPERATION_FAILED;
398 pkgmgr_client_remove_listen_status(g_pkgmgr);
399 pkgmgr_client_free(g_pkgmgr);
403 tts_config_mgr_finalize(client->uid);
407 int screen_reader = -1;
410 switch (client->current_state) {
411 case TTS_STATE_PAUSED:
412 case TTS_STATE_PLAYING:
413 case TTS_STATE_READY:
414 ret = vconf_get_bool(TTS_ACCESSIBILITY_KEY, &screen_reader);
416 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get screen reader");
418 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);
419 g_screen_reader = (bool)screen_reader;
421 if (!(false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode)) {
423 ret = tts_dbus_request_finalize(client->uid);
426 if (TTS_ERROR_TIMED_OUT != ret) {
427 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
430 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry finalize");
433 if (TTS_RETRY_COUNT == count) {
434 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
442 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Do not request finalize : g_sr(%d) mode(%d)", g_screen_reader, client->mode);
445 client->before_state = client->current_state;
446 client->current_state = TTS_STATE_CREATED;
448 case TTS_STATE_CREATED:
449 if (NULL != client->conn_timer) {
450 SLOG(LOG_DEBUG, TAG_TTSC, "Connect Timer is deleted");
451 ecore_timer_del(client->conn_timer);
452 client->conn_timer = NULL;
454 /* Unset registered callbacks */
455 __tts_unset_all_callbacks(tts);
458 tts_client_destroy(tts);
465 if (0 == tts_client_get_size()) {
466 if (0 != tts_dbus_close_connection()) {
467 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to close connection");
471 if (NULL != g_language) {
476 /* Delete state timer before destroying handle */
477 if (NULL != g_check_state_timer) {
478 ecore_timer_del(g_check_state_timer);
479 g_check_state_timer = NULL;
484 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
486 return TTS_ERROR_NONE;
490 void __tts_screen_reader_changed_cb(bool value)
492 g_screen_reader = value;
496 int tts_set_mode(tts_h tts, tts_mode_e mode)
498 if (0 != __tts_get_feature_enabled()) {
499 return TTS_ERROR_NOT_SUPPORTED;
502 SLOG(LOG_INFO, TAG_TTSC, "@@@ Set TTS mode(%d)", mode);
504 tts_client_s* client = tts_client_get(tts);
507 if (NULL == client) {
508 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
509 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
510 return TTS_ERROR_INVALID_PARAMETER;
514 if (client->current_state != TTS_STATE_CREATED) {
515 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
516 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
517 SLOG(LOG_DEBUG, TAG_TTSC, " ");
518 return TTS_ERROR_INVALID_STATE;
521 if (TTS_MODE_DEFAULT <= mode && mode <= TTS_MODE_INTERRUPT) {
524 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] mode is not valid : %d", mode);
525 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
526 SLOG(LOG_DEBUG, TAG_TTSC, " ");
527 return TTS_ERROR_INVALID_PARAMETER;
530 if (TTS_MODE_SCREEN_READER == mode) {
533 ret = vconf_get_bool(TTS_ACCESSIBILITY_KEY, &screen_reader);
535 SLOG(LOG_ERROR, tts_tag(), "[Config ERROR] Fail to get screen reader");
536 return TTS_ERROR_OPERATION_FAILED;
538 g_screen_reader = (bool)screen_reader;
539 tts_config_set_screen_reader_callback(client->uid, __tts_screen_reader_changed_cb);
541 tts_config_unset_screen_reader_callback(client->uid);
544 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
546 return TTS_ERROR_NONE;
549 int tts_get_mode(tts_h tts, tts_mode_e* mode)
551 if (0 != __tts_get_feature_enabled()) {
552 return TTS_ERROR_NOT_SUPPORTED;
555 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Get TTS mode");
557 tts_client_s* client = tts_client_get(tts);
560 if (NULL == client) {
561 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
562 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
563 SLOG(LOG_DEBUG, TAG_TTSC, " ");
564 return TTS_ERROR_INVALID_PARAMETER;
568 if (client->current_state != TTS_STATE_CREATED) {
569 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
570 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
571 SLOG(LOG_DEBUG, TAG_TTSC, " ");
572 return TTS_ERROR_INVALID_STATE;
576 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter(mode) is NULL");
577 return TTS_ERROR_INVALID_PARAMETER;
580 *mode = client->mode;
582 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
583 SLOG(LOG_DEBUG, TAG_TTSC, " ");
585 return TTS_ERROR_NONE;
588 int tts_set_credential(tts_h tts, const char* credential)
590 if (0 != __tts_get_feature_enabled()) {
591 return TTS_ERROR_NOT_SUPPORTED;
594 if (NULL == tts || NULL == credential) {
595 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
596 return TTS_ERROR_INVALID_PARAMETER;
599 tts_client_s* client = tts_client_get(tts);
601 if (NULL == client) {
602 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
603 return TTS_ERROR_INVALID_PARAMETER;
606 if (TTS_STATE_CREATED != client->current_state && TTS_STATE_READY != client->current_state) {
607 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid (%d).", client->current_state);
608 return TTS_ERROR_INVALID_STATE;
611 if (NULL != client->credential) {
612 free(client->credential);
613 client->credential = NULL;
615 client->credential = strdup(credential);
617 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
619 return TTS_ERROR_NONE;
623 int tts_set_server_tts(tts_h tts, const char* credential)
625 if (0 != __tts_get_feature_enabled()) {
626 return TTS_ERROR_NOT_SUPPORTED;
630 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
631 return TTS_ERROR_INVALID_PARAMETER;
634 tts_client_s* client = tts_client_get(tts);
636 if (NULL == client) {
637 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
638 return TTS_ERROR_INVALID_PARAMETER;
641 if (TTS_STATE_CREATED != client->current_state && TTS_STATE_READY != client->current_state) {
642 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid (%d).", client->current_state);
643 return TTS_ERROR_INVALID_STATE;
646 if (NULL != client->credential) {
647 free(client->credential);
648 client->credential = NULL;
651 client->internal = true;
654 if (NULL != credential) {
655 key = strdup("EnableServerTTS");
656 client->credential = strdup(credential);
657 if (NULL == client->credential) {
658 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to allocate memory");
663 return TTS_ERROR_OUT_OF_MEMORY;
666 key = strdup("DisableServerTTS");
670 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to allocate memory");
671 return TTS_ERROR_OUT_OF_MEMORY;
676 int ret = app_manager_get_app_id(pid, &appid);
677 if (0 != ret || NULL == appid) {
678 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get appid, ret(%d), pid(%d), appid(%s)", ret, pid, appid);
685 return TTS_ERROR_OPERATION_FAILED;
688 ret = tts_set_private_data(tts, key, appid);
690 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to set private data, ret(%d), pid(%d), appid(%s)", ret, pid, appid);
703 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
705 return TTS_ERROR_NONE;
709 static Eina_Bool __tts_connect_daemon(void *data)
711 tts_h tts = (tts_h)data;
712 tts_client_s* client = tts_client_get(tts);
715 if (NULL == client) {
716 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
720 /* check whether engine is updating or not */
721 if (g_engine_update_status) {
722 SLOG(LOG_ERROR, TAG_TTSC, "[DEBUG] cannot prepare due to engine update");
723 __tts_cb_error(-1, TTS_ERROR_SERVICE_RESET, -1, "Daemon Reset");
729 if (0 != tts_dbus_request_hello(client->uid)) {
733 SLOG(LOG_INFO, TAG_TTSC, "@@@ Connect daemon");
735 /* do request initialize */
737 bool credential_needed = false;
739 ret = tts_dbus_request_initialize(client->uid, &credential_needed);
741 if (TTS_ERROR_ENGINE_NOT_FOUND == ret) {
742 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to initialize : %s", __tts_get_error_code(ret));
744 client->reason = TTS_ERROR_ENGINE_NOT_FOUND;
747 ecore_timer_add(0, __tts_notify_error, (void*)client->tts);
748 if (client->conn_timer) {
749 ecore_timer_del(client->conn_timer);
750 client->conn_timer = NULL;
754 } else if (TTS_ERROR_PERMISSION_DENIED == ret) {
755 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to initialize : %s", __tts_get_error_code(ret));
757 client->reason = TTS_ERROR_PERMISSION_DENIED;
760 ecore_timer_add(0, __tts_notify_error, (void*)client->tts);
761 if (client->conn_timer) {
762 ecore_timer_del(client->conn_timer);
763 client->conn_timer = NULL;
767 } else if (TTS_ERROR_NONE != ret) {
768 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to connection. Retry to connect : %s", __tts_get_error_code(ret));
772 /* success to connect tts-daemon */
773 client->credential_needed = credential_needed;
774 SLOG(LOG_ERROR, TAG_TTSC, "Supported options : credential(%s)", credential_needed ? "need" : "no need");
777 if (client->conn_timer) {
778 ecore_timer_del(client->conn_timer);
779 client->conn_timer = NULL;
782 client = tts_client_get(tts);
784 if (NULL == client) {
785 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
789 client->before_state = client->current_state;
790 client->current_state = TTS_STATE_READY;
792 if (NULL != client->state_changed_cb) {
793 tts_client_use_callback(client);
794 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
795 tts_client_not_use_callback(client);
797 SLOG(LOG_WARN, TAG_TTSC, "State changed callback is NULL");
800 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
805 int tts_prepare(tts_h tts)
807 if (0 != __tts_get_feature_enabled()) {
808 return TTS_ERROR_NOT_SUPPORTED;
811 SLOG(LOG_INFO, TAG_TTSC, "@@@ Prepare TTS");
813 tts_client_s* client = tts_client_get(tts);
816 if (NULL == client) {
817 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
818 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
819 return TTS_ERROR_INVALID_PARAMETER;
823 if (client->current_state != TTS_STATE_CREATED) {
824 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
825 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
826 return TTS_ERROR_INVALID_STATE;
829 ecore_thread_main_loop_begin();
830 if (client->conn_timer) {
831 ecore_timer_del(client->conn_timer);
832 client->conn_timer = NULL;
834 client->conn_timer = ecore_timer_add(0.02, __tts_connect_daemon, (void*)tts);
835 ecore_thread_main_loop_end();
837 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
839 return TTS_ERROR_NONE;
843 int tts_prepare_sync(tts_h tts)
845 if (0 != __tts_get_feature_enabled()) {
846 return TTS_ERROR_NOT_SUPPORTED;
849 SLOG(LOG_INFO, TAG_TTSC, "@@@ Prepare TTS");
851 tts_client_s* client = tts_client_get(tts);
854 if (NULL == client) {
855 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
856 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
857 return TTS_ERROR_INVALID_PARAMETER;
861 if (client->current_state != TTS_STATE_CREATED) {
862 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
863 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
864 return TTS_ERROR_INVALID_STATE;
868 while (EINA_TRUE == __tts_connect_daemon((void*)tts) && TTS_CONNECTION_RETRY_COUNT > cnt) {
872 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
874 if (TTS_CONNECTION_RETRY_COUNT == cnt) {
875 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to connect daemon");
876 return TTS_ERROR_OPERATION_FAILED;
879 return TTS_ERROR_NONE;
883 int tts_unprepare(tts_h tts)
885 if (0 != __tts_get_feature_enabled()) {
886 return TTS_ERROR_NOT_SUPPORTED;
889 SLOG(LOG_INFO, TAG_TTSC, "@@@ Unprepare TTS");
891 tts_client_s* client = tts_client_get(tts);
894 if (NULL == client) {
895 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
896 return TTS_ERROR_INVALID_PARAMETER;
900 if (client->current_state != TTS_STATE_READY) {
901 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'READY'");
902 return TTS_ERROR_INVALID_STATE;
907 int screen_reader = -1;
909 ret = vconf_get_bool(TTS_ACCESSIBILITY_KEY, &screen_reader);
911 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get screen reader");
913 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);
914 g_screen_reader = (bool)screen_reader;
917 bool is_prepared = false;
918 if (!(false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode)) {
920 ret = tts_dbus_request_finalize(client->uid);
923 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
924 client->current_state = TTS_STATE_CREATED;
925 if (0 == tts_prepare_sync(tts)) {
927 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
929 } else if (TTS_ERROR_TIMED_OUT != ret) {
930 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
933 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry finalize : %s", __tts_get_error_code(ret));
936 if (TTS_RETRY_COUNT == count) {
937 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
945 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Do not request finalize : g_sr(%d) mode(%d)", g_screen_reader, client->mode);
948 client->before_state = client->current_state;
949 client->current_state = TTS_STATE_CREATED;
951 if (NULL != client->state_changed_cb) {
952 tts_client_use_callback(client);
953 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
954 tts_client_not_use_callback(client);
955 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
958 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
960 return TTS_ERROR_NONE;
963 bool __tts_supported_voice_cb(const char* engine_id, const char* language, int type, void* user_data)
965 tts_h tts = (tts_h)user_data;
967 tts_client_s* client = tts_client_get(tts);
968 if (NULL == client) {
969 SLOG(LOG_ERROR, TAG_TTSC, "[WARNING] A handle is not valid");
973 /* call callback function */
974 if (NULL != client->supported_voice_cb) {
975 return client->supported_voice_cb(tts, language, type, client->supported_voice_user_data);
977 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of supported voice");
983 int tts_foreach_supported_voices(tts_h tts, tts_supported_voice_cb callback, void* user_data)
985 if (0 != __tts_get_feature_enabled()) {
986 return TTS_ERROR_NOT_SUPPORTED;
989 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Foreach supported voices");
991 if (NULL == tts || NULL == callback) {
992 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
993 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
994 return TTS_ERROR_INVALID_PARAMETER;
997 tts_client_s* client = tts_client_get(tts);
1000 if (NULL == client) {
1001 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1002 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1003 return TTS_ERROR_INVALID_PARAMETER;
1007 char* current_engine = NULL;
1008 ret = tts_config_mgr_get_engine(¤t_engine);
1010 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get current engine : %d", ret);
1011 return __tts_convert_config_error_code(ret);
1014 client->supported_voice_cb = callback;
1015 client->supported_voice_user_data = user_data;
1017 ret = tts_config_mgr_get_voice_list(current_engine, __tts_supported_voice_cb, client->tts);
1019 if (NULL != current_engine) {
1020 free(current_engine);
1021 current_engine = NULL;
1024 client->supported_voice_cb = NULL;
1025 client->supported_voice_user_data = NULL;
1028 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
1029 ret = TTS_ERROR_OPERATION_FAILED;
1032 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1037 int tts_get_default_voice(tts_h tts, char** lang, int* vctype)
1039 if (0 != __tts_get_feature_enabled()) {
1040 return TTS_ERROR_NOT_SUPPORTED;
1043 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Get default voice");
1046 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1047 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1048 return TTS_ERROR_INVALID_PARAMETER;
1051 tts_client_s* client = tts_client_get(tts);
1053 if (NULL == client) {
1054 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1055 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1056 return TTS_ERROR_INVALID_PARAMETER;
1059 /* Request call remote method */
1061 ret = tts_config_mgr_get_voice(lang, vctype);
1063 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
1064 return __tts_convert_config_error_code(ret);
1066 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] Default language(%s), type(%d)", *lang, *vctype);
1069 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1074 int tts_get_max_text_size(tts_h tts, unsigned int* size)
1076 if (0 != __tts_get_feature_enabled()) {
1077 return TTS_ERROR_NOT_SUPPORTED;
1080 if (NULL == tts || NULL == size) {
1081 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Input parameter is null");
1082 return TTS_ERROR_INVALID_PARAMETER;
1085 tts_client_s* client = tts_client_get(tts);
1087 if (NULL == client) {
1088 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : A handle is not valid");
1089 return TTS_ERROR_INVALID_PARAMETER;
1092 if (TTS_STATE_READY != client->current_state) {
1093 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Current state is NOT 'READY'.");
1094 return TTS_ERROR_INVALID_STATE;
1097 if (0 != tts_config_mgr_get_max_text_size(size)) {
1098 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get max text size");
1099 return TTS_ERROR_INVALID_PARAMETER;
1102 g_max_text_size = (int)*size;
1104 SLOG(LOG_DEBUG, TAG_TTSC, "Get max text count : %d", *size);
1105 return TTS_ERROR_NONE;
1108 int tts_get_state(tts_h tts, tts_state_e* state)
1110 if (0 != __tts_get_feature_enabled()) {
1111 return TTS_ERROR_NOT_SUPPORTED;
1114 if (NULL == tts || NULL == state) {
1115 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : Input parameter is null");
1116 return TTS_ERROR_INVALID_PARAMETER;
1119 tts_client_s* client = tts_client_get(tts);
1121 if (NULL == client) {
1122 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
1123 return TTS_ERROR_INVALID_PARAMETER;
1126 *state = client->current_state;
1129 case TTS_STATE_CREATED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Created'"); break;
1130 case TTS_STATE_READY: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Ready'"); break;
1131 case TTS_STATE_PLAYING: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Playing'"); break;
1132 case TTS_STATE_PAUSED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Paused'"); break;
1133 default: SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid value"); break;
1136 return TTS_ERROR_NONE;
1139 int tts_get_speed_range(tts_h tts, int* min, int* normal, int* max)
1141 if (0 != __tts_get_feature_enabled()) {
1142 return TTS_ERROR_NOT_SUPPORTED;
1145 if (NULL == tts || NULL == min || NULL == normal || NULL == max) {
1146 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
1147 return TTS_ERROR_INVALID_PARAMETER;
1150 tts_client_s* client = tts_client_get(tts);
1152 if (NULL == client) {
1153 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
1154 return TTS_ERROR_INVALID_PARAMETER;
1157 *min = TTS_SPEED_MIN;
1158 *normal = TTS_SPEED_NORMAL;
1159 *max = TTS_SPEED_MAX;
1161 return TTS_ERROR_NONE;
1164 int tts_get_error_message(tts_h tts, char** err_msg)
1166 if (0 != __tts_get_feature_enabled()) {
1167 return TTS_ERROR_NOT_SUPPORTED;
1170 if (NULL == tts || NULL == err_msg) {
1171 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
1172 return TTS_ERROR_INVALID_PARAMETER;
1175 tts_client_s* client = tts_client_get(tts);
1177 if (NULL == client) {
1178 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
1179 return TTS_ERROR_INVALID_PARAMETER;
1182 if (NULL != client->err_msg) {
1183 *err_msg = strdup(client->err_msg);
1184 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Error msg (%s)", *err_msg);
1187 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Error msg (NULL)");
1190 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1192 return TTS_ERROR_NONE;
1195 int tts_add_text(tts_h tts, const char* text, const char* language, int voice_type, int speed, int* utt_id)
1197 SLOG(LOG_INFO, TAG_TTSC, "[DEBUG] Add text: text(%s), language(%s), type(%d)", (NULL == text) ? "NULL" : text, (NULL == language) ? "NULL" : language, voice_type);
1199 if (0 != __tts_get_feature_enabled()) {
1200 return TTS_ERROR_NOT_SUPPORTED;
1204 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Speed should not be negative(%d)", speed);
1205 return TTS_ERROR_INVALID_PARAMETER;
1208 if (voice_type < 0) {
1209 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Voice type should not be negative(%d)", voice_type);
1210 return TTS_ERROR_INVALID_PARAMETER;
1213 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Add text");
1215 if (NULL == tts || NULL == utt_id) {
1216 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
1217 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1218 return TTS_ERROR_INVALID_PARAMETER;
1221 tts_client_s* client = tts_client_get(tts);
1223 if (NULL == client) {
1224 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1225 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1226 return TTS_ERROR_INVALID_PARAMETER;
1229 if (TTS_STATE_CREATED == client->current_state) {
1230 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
1231 return TTS_ERROR_INVALID_STATE;
1234 if (-1 == g_max_text_size) {
1235 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] g_max_text_size is %d", g_max_text_size);
1236 if (0 != tts_config_mgr_get_max_text_size((unsigned int*)&g_max_text_size)) {
1237 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get max text size");
1238 return TTS_ERROR_INVALID_PARAMETER;
1242 if (0 == g_max_text_size) {
1243 if (strlen(text) <= 0) {
1244 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] Max Text Size is %d", g_max_text_size);
1245 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input text size is invalid. (max text size is unlimited.)");
1246 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1247 return TTS_ERROR_INVALID_PARAMETER;
1250 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] g_max_text_size is %d", g_max_text_size);
1251 if (g_max_text_size < strlen(text) || strlen(text) <= 0) {
1252 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input text size is invalid.");
1253 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1254 return TTS_ERROR_INVALID_PARAMETER;
1258 if (TTS_SPEED_AUTO > speed || TTS_SPEED_MAX < speed) {
1259 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] speed value(%d) is invalid.", speed);
1260 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1261 return TTS_ERROR_INVALID_PARAMETER;
1264 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1265 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1266 return TTS_ERROR_INVALID_STATE;
1269 if (true == client->credential_needed && NULL == client->credential) {
1270 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Do not have app credential for this engine");
1271 return TTS_ERROR_PERMISSION_DENIED;
1274 /* check valid utf8 */
1278 dbus_error_init(&err);
1280 valid = dbus_validate_utf8(text, &err);
1281 if (dbus_error_is_set(&err)) {
1282 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Dbus Error(%s), text(%s)", err.message, text);
1283 dbus_error_free(&err);
1284 return TTS_ERROR_INVALID_PARAMETER;
1287 if (valid != true) {
1288 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Text is invalid - '%s'", text);
1289 return TTS_ERROR_INVALID_PARAMETER;
1291 SLOG(LOG_DEBUG, TAG_TTSC, "Text is valid - text is '%s'", text);
1293 /* save texts for repetition */
1294 if (NULL != client->text_repeat) {
1295 free(client->text_repeat);
1296 client->text_repeat = NULL;
1299 client->text_repeat = strdup(text);
1301 if (NULL != g_language) {
1305 if (NULL == language)
1308 g_language = strdup(language);
1310 g_voice_type = voice_type;
1313 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] repeat: text(%s), language(%s), voice type(%d), speed(%d)", client->text_repeat, (g_language) ? g_language : "NULL", g_voice_type, g_speed);
1315 /* change default language value */
1318 if (NULL == language)
1319 temp = strdup("default");
1321 temp = strdup(language);
1323 client->current_utt_id++;
1324 if (client->current_utt_id == 10000) {
1325 client->current_utt_id = 1;
1331 bool is_prepared = false;
1333 ret = tts_dbus_request_add_text(client->uid, text, temp, voice_type, speed, client->current_utt_id, client->credential);
1336 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1337 client->current_state = TTS_STATE_CREATED;
1338 if (0 == tts_prepare_sync(tts)) {
1340 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
1342 } else if (TTS_ERROR_TIMED_OUT != ret) {
1343 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1346 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry add text : %s", __tts_get_error_code(ret));
1349 if (TTS_RETRY_MIN_COUNT == count) {
1350 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1356 *utt_id = client->current_utt_id;
1365 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1371 static void __tts_play_async(void *data)
1373 tts_h tts = (tts_h)data;
1374 tts_client_s* client = tts_client_get(tts);
1377 if (NULL == client) {
1378 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1384 bool is_prepared = false;
1386 ret = tts_dbus_request_play(client->uid, client->credential);
1388 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1389 client->current_state = TTS_STATE_CREATED;
1390 if (0 == tts_prepare_sync(tts)) {
1392 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
1394 } else if (TTS_ERROR_TIMED_OUT != ret) {
1395 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1398 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry play : %s", __tts_get_error_code(ret));
1401 if (TTS_RETRY_COUNT == count) {
1402 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1410 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to play tts : %s", __tts_get_error_code(ret));
1412 client->reason = ret;
1413 client->utt_id = -1;
1415 ecore_timer_add(0, __tts_notify_error, client->tts);
1419 client->before_state = client->current_state;
1420 client->current_state = TTS_STATE_PLAYING;
1422 if (NULL != client->state_changed_cb) {
1423 tts_client_use_callback(client);
1424 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1425 tts_client_not_use_callback(client);
1426 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1429 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1434 int tts_play_async(tts_h tts)
1436 if (0 != __tts_get_feature_enabled()) {
1437 return TTS_ERROR_NOT_SUPPORTED;
1440 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Play tts");
1443 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
1444 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1445 return TTS_ERROR_INVALID_PARAMETER;
1448 tts_client_s* client = tts_client_get(tts);
1450 if (NULL == client) {
1451 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
1452 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1453 return TTS_ERROR_INVALID_PARAMETER;
1456 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
1457 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
1458 return TTS_ERROR_INVALID_STATE;
1461 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1462 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1463 return TTS_ERROR_INVALID_STATE;
1466 if (true == client->credential_needed && NULL == client->credential) {
1467 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Do not have app credential for this engine");
1468 return TTS_ERROR_PERMISSION_DENIED;
1471 ecore_main_loop_thread_safe_call_async(__tts_play_async, (void*)tts);
1473 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1475 return TTS_ERROR_NONE;
1478 int tts_play(tts_h tts)
1480 if (0 != __tts_get_feature_enabled()) {
1481 return TTS_ERROR_NOT_SUPPORTED;
1484 SLOG(LOG_INFO, TAG_TTSC, "@@@ Play tts");
1487 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
1488 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1489 return TTS_ERROR_INVALID_PARAMETER;
1492 tts_client_s* client = tts_client_get(tts);
1494 if (NULL == client) {
1495 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
1496 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1497 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1498 return TTS_ERROR_INVALID_PARAMETER;
1501 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
1502 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
1503 return TTS_ERROR_INVALID_STATE;
1506 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1507 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1508 return TTS_ERROR_INVALID_STATE;
1511 if (true == client->credential_needed && NULL == client->credential) {
1512 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Do not have app credential for this engine");
1513 return TTS_ERROR_PERMISSION_DENIED;
1518 bool is_prepared = false;
1520 ret = tts_dbus_request_play(client->uid, client->credential);
1523 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1524 client->current_state = TTS_STATE_CREATED;
1525 if (0 == tts_prepare_sync(tts)) {
1527 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
1529 } else if (TTS_ERROR_TIMED_OUT != ret) {
1530 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1533 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry play : %s", __tts_get_error_code(ret));
1536 if (TTS_RETRY_COUNT == count) {
1537 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1545 client->before_state = client->current_state;
1546 client->current_state = TTS_STATE_PLAYING;
1548 if (NULL != client->state_changed_cb) {
1549 tts_client_use_callback(client);
1550 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1551 tts_client_not_use_callback(client);
1552 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1555 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1557 return TTS_ERROR_NONE;
1560 static void __tts_stop_async(void *data)
1562 tts_h tts = (tts_h)data;
1563 tts_client_s* client = tts_client_get(tts);
1566 if (NULL == client) {
1567 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1573 bool is_prepared = false;
1575 ret = tts_dbus_request_stop(client->uid);
1577 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1578 client->current_state = TTS_STATE_CREATED;
1579 if (0 == tts_prepare_sync(tts)) {
1581 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
1583 } else if (TTS_ERROR_TIMED_OUT != ret) {
1584 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1587 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry stop : %s", __tts_get_error_code(ret));
1590 if (TTS_RETRY_COUNT == count) {
1591 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1599 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to stop tts : %s", __tts_get_error_code(ret));
1601 client->reason = ret;
1602 client->utt_id = -1;
1604 ecore_timer_add(0, __tts_notify_error, client->tts);
1608 client->before_state = client->current_state;
1609 client->current_state = TTS_STATE_READY;
1611 if (NULL != client->state_changed_cb) {
1612 tts_client_use_callback(client);
1613 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1614 tts_client_not_use_callback(client);
1615 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1618 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1623 int tts_stop_aync(tts_h tts)
1625 if (0 != __tts_get_feature_enabled()) {
1626 return TTS_ERROR_NOT_SUPPORTED;
1629 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Stop tts");
1632 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1633 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1634 return TTS_ERROR_INVALID_PARAMETER;
1637 tts_client_s* client = tts_client_get(tts);
1639 if (NULL == client) {
1640 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1641 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1642 return TTS_ERROR_INVALID_PARAMETER;
1645 if (TTS_STATE_CREATED == client->current_state) {
1646 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
1647 return TTS_ERROR_INVALID_STATE;
1650 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1651 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1652 return TTS_ERROR_INVALID_STATE;
1655 ecore_main_loop_thread_safe_call_async(__tts_stop_async, (void*)tts);
1657 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1659 return TTS_ERROR_NONE;
1662 int tts_stop(tts_h tts)
1664 if (0 != __tts_get_feature_enabled()) {
1665 return TTS_ERROR_NOT_SUPPORTED;
1668 SLOG(LOG_INFO, TAG_TTSC, "@@@ Stop 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_CREATED == client->current_state) {
1685 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
1686 return TTS_ERROR_INVALID_STATE;
1689 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1690 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1691 return TTS_ERROR_INVALID_STATE;
1696 bool is_prepared = false;
1698 ret = tts_dbus_request_stop(client->uid);
1701 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1702 client->current_state = TTS_STATE_CREATED;
1703 if (0 == tts_prepare_sync(tts)) {
1705 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
1707 } else if (TTS_ERROR_TIMED_OUT != ret) {
1708 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1711 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry stop : %s", __tts_get_error_code(ret));
1714 if (TTS_RETRY_COUNT == count) {
1715 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1723 client->before_state = client->current_state;
1724 client->current_state = TTS_STATE_READY;
1726 if (NULL != client->state_changed_cb) {
1727 tts_client_use_callback(client);
1728 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1729 tts_client_not_use_callback(client);
1730 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1733 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1735 return TTS_ERROR_NONE;
1738 static void __tts_pause_async(void *data)
1740 tts_h tts = (tts_h)data;
1741 tts_client_s* client = tts_client_get(tts);
1744 if (NULL == client) {
1745 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1751 bool is_prepared = false;
1753 ret = tts_dbus_request_pause(client->uid);
1755 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1756 client->current_state = TTS_STATE_CREATED;
1757 if (0 == tts_prepare_sync(tts)) {
1759 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
1761 } else if (TTS_ERROR_TIMED_OUT != ret) {
1762 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1765 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry pause : %s", __tts_get_error_code(ret));
1768 if (TTS_RETRY_COUNT == count) {
1769 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1777 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to pause tts : %s", __tts_get_error_code(ret));
1779 client->reason = ret;
1780 client->utt_id = -1;
1782 ecore_timer_add(0, __tts_notify_error, client->tts);
1786 client->before_state = client->current_state;
1787 client->current_state = TTS_STATE_PAUSED;
1789 if (NULL != client->state_changed_cb) {
1790 tts_client_use_callback(client);
1791 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1792 tts_client_not_use_callback(client);
1793 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1796 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1801 int tts_pause_async(tts_h tts)
1803 if (0 != __tts_get_feature_enabled()) {
1804 return TTS_ERROR_NOT_SUPPORTED;
1807 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Pause tts");
1810 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1811 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1812 return TTS_ERROR_INVALID_PARAMETER;
1815 tts_client_s* client = tts_client_get(tts);
1817 if (NULL == client) {
1818 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1819 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1820 return TTS_ERROR_INVALID_PARAMETER;
1823 if (TTS_STATE_PLAYING != client->current_state) {
1824 SLOG(LOG_ERROR, TAG_TTSC, "[Error] The Current state is NOT 'playing'. So this request should be not running.");
1825 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1826 return TTS_ERROR_INVALID_STATE;
1829 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1830 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1831 return TTS_ERROR_INVALID_STATE;
1834 ecore_main_loop_thread_safe_call_async(__tts_pause_async, (void*)tts);
1836 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1838 return TTS_ERROR_NONE;
1841 int tts_pause(tts_h tts)
1843 if (0 != __tts_get_feature_enabled()) {
1844 return TTS_ERROR_NOT_SUPPORTED;
1847 SLOG(LOG_INFO, TAG_TTSC, "@@@ Pause tts");
1850 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1851 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1852 return TTS_ERROR_INVALID_PARAMETER;
1855 tts_client_s* client = tts_client_get(tts);
1857 if (NULL == client) {
1858 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1859 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1860 return TTS_ERROR_INVALID_PARAMETER;
1863 if (TTS_STATE_PLAYING != client->current_state) {
1864 SLOG(LOG_ERROR, TAG_TTSC, "[Error] The Current state is NOT 'playing'. So this request should be not running.");
1865 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1866 return TTS_ERROR_INVALID_STATE;
1869 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1870 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1871 return TTS_ERROR_INVALID_STATE;
1876 bool is_prepared = false;
1878 ret = tts_dbus_request_pause(client->uid);
1881 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1882 client->current_state = TTS_STATE_CREATED;
1883 if (0 == tts_prepare_sync(tts)) {
1885 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
1887 } else if (TTS_ERROR_TIMED_OUT != ret) {
1888 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1891 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry pause : %s", __tts_get_error_code(ret));
1894 if (TTS_RETRY_COUNT == count) {
1895 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1903 client->before_state = client->current_state;
1904 client->current_state = TTS_STATE_PAUSED;
1906 if (NULL != client->state_changed_cb) {
1907 tts_client_use_callback(client);
1908 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1909 tts_client_not_use_callback(client);
1910 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1913 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1915 return TTS_ERROR_NONE;
1918 int tts_set_private_data(tts_h tts, const char* key, const char* data)
1920 if (0 != __tts_get_feature_enabled()) {
1921 return TTS_ERROR_NOT_SUPPORTED;
1924 SLOG(LOG_INFO, TAG_TTSC, "@@@ Set private data, key(%s), data(%s)", key, data);
1927 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1928 return TTS_ERROR_INVALID_PARAMETER;
1931 if (NULL == key || NULL == data) {
1932 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid parameter");
1933 return TTS_ERROR_INVALID_PARAMETER;
1936 tts_client_s* client = tts_client_get(tts);
1938 if (NULL == client) {
1939 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1940 return TTS_ERROR_INVALID_PARAMETER;
1943 if (TTS_STATE_READY != client->current_state) {
1944 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid state : Current state is NOT 'READY'");
1945 return TTS_ERROR_INVALID_STATE;
1948 if (true != client->internal && (0 == strcmp(key, "EnableServerTTS") || 0 == strcmp(key, "DisableServerTTS"))) {
1949 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] This is not an internal app");
1950 return TTS_ERROR_INVALID_PARAMETER;
1955 bool is_prepared = false;
1957 ret = tts_dbus_request_set_private_data(client->uid, key, data);
1960 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1961 client->current_state = TTS_STATE_CREATED;
1962 if (0 == tts_prepare_sync(tts)) {
1964 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
1966 } else if (TTS_ERROR_TIMED_OUT != ret) {
1967 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1970 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry : %s", __tts_get_error_code(ret));
1973 if (TTS_RETRY_COUNT == count) {
1974 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1982 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1987 int tts_get_private_data(tts_h tts, const char* key, char** data)
1989 if (0 != __tts_get_feature_enabled()) {
1990 return TTS_ERROR_NOT_SUPPORTED;
1993 SLOG(LOG_INFO, TAG_TTSC, "@@@ Get private data, key(%s)", key);
1996 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1997 return TTS_ERROR_INVALID_PARAMETER;
2000 if (NULL == key || NULL == data) {
2001 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid parameter");
2002 return TTS_ERROR_INVALID_PARAMETER;
2005 tts_client_s* client = tts_client_get(tts);
2007 if (NULL == client) {
2008 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
2009 return TTS_ERROR_INVALID_PARAMETER;
2012 if (TTS_STATE_READY != client->current_state) {
2013 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid state : Current state is NOT 'READY'");
2014 return TTS_ERROR_INVALID_STATE;
2019 bool is_prepared = false;
2021 ret = tts_dbus_request_get_private_data(client->uid, key, data);
2024 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2025 client->current_state = TTS_STATE_CREATED;
2026 if (0 == tts_prepare_sync(tts)) {
2028 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
2030 } else if (TTS_ERROR_TIMED_OUT != ret) {
2031 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
2034 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry : %s", __tts_get_error_code(ret));
2037 if (TTS_RETRY_COUNT == count) {
2038 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
2046 if (0 == strncmp(*data, "NULL", strlen(*data))) {
2051 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2057 static Eina_Bool __tts_notify_error(void *data)
2059 tts_h tts = (tts_h)data;
2061 tts_client_s* client = tts_client_get(tts);
2064 if (NULL == client) {
2065 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify error msg : A handle is not valid");
2069 SLOG(LOG_DEBUG, TAG_TTSC, "Error data : uttid(%d) reason(%s)", client->utt_id, __tts_get_error_code(client->reason));
2071 if (NULL != client->error_cb) {
2072 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of error");
2073 tts_client_use_callback(client);
2074 g_err_callback_status = true;
2075 client->error_cb(client->tts, client->utt_id, client->reason, client->error_user_data);
2076 g_err_callback_status = false;
2077 tts_client_not_use_callback(client);
2079 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
2085 static void __start_reprepare_thread(void* data, Ecore_Thread* thread)
2087 SLOG(LOG_ERROR, TAG_TTSC, "[DEBUG] start reprepare thread. engine update status(%d)", g_engine_update_status);
2089 tts_client_s* temp = (tts_client_s*)data;
2091 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] data is null");
2096 while (!g_engine_update_status && (cnt < 10)) {
2097 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] wait for starting update");
2102 SLOG(LOG_ERROR, TAG_TTSC, "[DEBUG] update status(%d)", g_engine_update_status);
2104 while (g_engine_update_status && (NULL != g_pkgmgr)) {
2105 // SLOG(LOG_WARN, TAG_TTSC, "[WARNING] wait for finishing update");
2109 SLOG(LOG_INFO, TAG_TTSC, "[INFO] finish updating. request to prepare");
2111 if (0 != tts_prepare(temp->tts)) {
2112 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare");
2118 static void __end_reprepare_thread(void* data, Ecore_Thread* thread)
2120 SLOG(LOG_INFO, TAG_TTSC, "[INFO] end reprepare thread");
2123 int __tts_cb_error(int uid, tts_error_e reason, int utt_id, char* err_msg)
2126 GList* client_list = NULL;
2127 client_list = tts_client_get_client_list();
2130 tts_client_s *data = NULL;
2132 if (g_list_length(client_list) > 0) {
2133 /* Get a first item */
2134 iter = g_list_first(client_list);
2136 while (NULL != iter) {
2139 data->utt_id = utt_id;
2140 data->reason = reason;
2141 if (NULL != data->err_msg) {
2142 free(data->err_msg);
2143 data->err_msg = NULL;
2145 if (NULL != err_msg)
2146 data->err_msg = strdup(err_msg);
2148 /* call callback function */
2149 if (NULL != data->error_cb) {
2150 ecore_timer_add(0, __tts_notify_error, data->tts);
2152 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
2155 if (TTS_ERROR_SERVICE_RESET == reason) {
2156 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Service Reset");
2158 data->current_state = TTS_STATE_CREATED;
2159 ecore_thread_run(__start_reprepare_thread, __end_reprepare_thread, NULL, data);
2163 iter = g_list_next(iter);
2167 tts_client_s* client = tts_client_get_by_uid(uid);
2169 if (NULL == client) {
2170 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
2171 return TTS_ERROR_INVALID_PARAMETER;
2174 client->utt_id = utt_id;
2175 client->reason = reason;
2176 if (NULL != client->err_msg) {
2177 free(client->err_msg);
2178 client->err_msg = NULL;
2180 if (NULL != err_msg)
2181 client->err_msg = strdup(err_msg);
2183 /* call callback function */
2184 if (NULL != client->error_cb) {
2185 ecore_timer_add(0, __tts_notify_error, client->tts);
2187 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
2190 if (TTS_ERROR_SERVICE_RESET == reason) {
2191 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Service Reset");
2193 client->current_state = TTS_STATE_CREATED;
2195 ecore_thread_run(__start_reprepare_thread, __end_reprepare_thread, NULL, client);
2202 static Eina_Bool __tts_notify_state_changed(void *data)
2204 tts_h tts = (tts_h)data;
2206 tts_client_s* client = tts_client_get(tts);
2209 if (NULL == client) {
2210 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify state changed : A handle is not valid");
2214 if (NULL != client->state_changed_cb) {
2215 tts_client_use_callback(client);
2216 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
2217 tts_client_not_use_callback(client);
2218 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called : pre(%d) cur(%d)", client->before_state, client->current_state);
2220 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
2226 int __tts_cb_set_state(int uid, int state)
2228 tts_client_s* client = tts_client_get_by_uid(uid);
2229 if (NULL == client) {
2230 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] The handle is not valid");
2234 tts_state_e state_from_daemon = (tts_state_e)state;
2236 if (client->current_state == state_from_daemon) {
2237 SLOG(LOG_DEBUG, TAG_TTSC, "Current state has already been %d", client->current_state);
2241 if (NULL != client->state_changed_cb) {
2242 if (NULL != g_check_state_timer) {
2243 ecore_timer_del(g_check_state_timer);
2244 g_check_state_timer = NULL;
2246 g_check_state_timer = ecore_timer_add(0, __tts_notify_state_changed, client->tts);
2248 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
2251 client->before_state = client->current_state;
2252 client->current_state = state_from_daemon;
2258 int __tts_cb_utt_started(int uid, int utt_id)
2260 tts_client_s* client = tts_client_get_by_uid(uid);
2262 if (NULL == client) {
2263 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
2264 return TTS_ERROR_INVALID_PARAMETER;
2267 SLOG(LOG_INFO, TAG_TTSC, "utterance started : utt id(%d) ", utt_id);
2269 client->utt_id = utt_id;
2271 /* call callback function */
2272 if (NULL != client->utt_started_cb) {
2273 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance started ");
2274 tts_client_use_callback(client);
2275 client->utt_started_cb(client->tts, client->utt_id, client->utt_started_user_data);
2276 tts_client_not_use_callback(client);
2278 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance started ");
2284 int __tts_cb_utt_completed(int uid, int utt_id)
2286 tts_client_s* client = tts_client_get_by_uid(uid);
2288 if (NULL == client) {
2289 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
2290 return TTS_ERROR_INVALID_PARAMETER;
2293 SLOG(LOG_INFO, TAG_TTSC, "utterance completed : uttid(%d) ", utt_id);
2295 client->utt_id = utt_id;
2297 /* call callback function */
2298 if (NULL != client->utt_completeted_cb) {
2299 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance completed ");
2300 tts_client_use_callback(client);
2301 client->utt_completeted_cb(client->tts, client->utt_id, client->utt_completed_user_data);
2302 tts_client_not_use_callback(client);
2304 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance completed ");
2310 int tts_set_state_changed_cb(tts_h tts, tts_state_changed_cb callback, void* user_data)
2312 if (0 != __tts_get_feature_enabled()) {
2313 return TTS_ERROR_NOT_SUPPORTED;
2316 if (NULL == tts || NULL == callback) {
2317 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Input parameter is null");
2318 return TTS_ERROR_INVALID_PARAMETER;
2321 tts_client_s* client = tts_client_get(tts);
2323 if (NULL == client) {
2324 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : A handle is not valid");
2325 return TTS_ERROR_INVALID_PARAMETER;
2328 if (TTS_STATE_CREATED != client->current_state) {
2329 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Current state is not 'Created'.");
2330 return TTS_ERROR_INVALID_STATE;
2333 client->state_changed_cb = callback;
2334 client->state_changed_user_data = user_data;
2336 SLOG(LOG_INFO, TAG_TTSC, "[SUCCESS] Set state changed cb");
2341 int tts_unset_state_changed_cb(tts_h tts)
2343 if (0 != __tts_get_feature_enabled()) {
2344 return TTS_ERROR_NOT_SUPPORTED;
2348 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Input parameter is null");
2349 return TTS_ERROR_INVALID_PARAMETER;
2352 tts_client_s* client = tts_client_get(tts);
2354 if (NULL == client) {
2355 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : A handle is not valid");
2356 return TTS_ERROR_INVALID_PARAMETER;
2359 if (TTS_STATE_CREATED != client->current_state) {
2360 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Current state is not 'Created'.");
2361 return TTS_ERROR_INVALID_STATE;
2364 client->state_changed_cb = NULL;
2365 client->state_changed_user_data = NULL;
2367 if (NULL != g_check_state_timer) {
2368 ecore_timer_del(g_check_state_timer);
2369 g_check_state_timer = NULL;
2372 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset state changed cb");
2377 int tts_set_utterance_started_cb(tts_h tts, tts_utterance_started_cb callback, void* user_data)
2379 if (0 != __tts_get_feature_enabled()) {
2380 return TTS_ERROR_NOT_SUPPORTED;
2383 if (NULL == tts || NULL == callback) {
2384 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Input parameter is null");
2385 return TTS_ERROR_INVALID_PARAMETER;
2388 tts_client_s* client = tts_client_get(tts);
2390 if (NULL == client) {
2391 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : A handle is not valid");
2392 return TTS_ERROR_INVALID_PARAMETER;
2395 if (TTS_STATE_CREATED != client->current_state) {
2396 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Current state is not 'Created'.");
2397 return TTS_ERROR_INVALID_STATE;
2400 client->utt_started_cb = callback;
2401 client->utt_started_user_data = user_data;
2403 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt started cb");
2408 int tts_unset_utterance_started_cb(tts_h tts)
2410 if (0 != __tts_get_feature_enabled()) {
2411 return TTS_ERROR_NOT_SUPPORTED;
2415 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Input parameter is null");
2416 return TTS_ERROR_INVALID_PARAMETER;
2419 tts_client_s* client = tts_client_get(tts);
2421 if (NULL == client) {
2422 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : A handle is not valid");
2423 return TTS_ERROR_INVALID_PARAMETER;
2426 if (TTS_STATE_CREATED != client->current_state) {
2427 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Current state is not 'Created'.");
2428 return TTS_ERROR_INVALID_STATE;
2431 client->utt_started_cb = NULL;
2432 client->utt_started_user_data = NULL;
2434 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt started cb");
2439 int tts_set_utterance_completed_cb(tts_h tts, tts_utterance_completed_cb callback, void* user_data)
2441 if (0 != __tts_get_feature_enabled()) {
2442 return TTS_ERROR_NOT_SUPPORTED;
2445 if (NULL == tts || NULL == callback) {
2446 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Input parameter is null");
2447 return TTS_ERROR_INVALID_PARAMETER;
2450 tts_client_s* client = tts_client_get(tts);
2452 if (NULL == client) {
2453 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : A handle is not valid");
2454 return TTS_ERROR_INVALID_PARAMETER;
2457 if (TTS_STATE_CREATED != client->current_state) {
2458 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Current state is not 'Created'.");
2459 return TTS_ERROR_INVALID_STATE;
2462 client->utt_completeted_cb = callback;
2463 client->utt_completed_user_data = user_data;
2465 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt completed cb");
2470 int tts_unset_utterance_completed_cb(tts_h tts)
2472 if (0 != __tts_get_feature_enabled()) {
2473 return TTS_ERROR_NOT_SUPPORTED;
2477 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Input parameter is null");
2478 return TTS_ERROR_INVALID_PARAMETER;
2481 tts_client_s* client = tts_client_get(tts);
2483 if (NULL == client) {
2484 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : A handle is not valid");
2485 return TTS_ERROR_INVALID_PARAMETER;
2488 if (TTS_STATE_CREATED != client->current_state) {
2489 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Current state is not 'Created'.");
2490 return TTS_ERROR_INVALID_STATE;
2493 client->utt_completeted_cb = NULL;
2494 client->utt_completed_user_data = NULL;
2496 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt completed cb");
2500 int tts_set_error_cb(tts_h tts, tts_error_cb callback, void* user_data)
2502 if (0 != __tts_get_feature_enabled()) {
2503 return TTS_ERROR_NOT_SUPPORTED;
2506 if (NULL == tts || NULL == callback) {
2507 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Input parameter is null");
2508 return TTS_ERROR_INVALID_PARAMETER;
2511 tts_client_s* client = tts_client_get(tts);
2513 if (NULL == client) {
2514 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : A handle is not valid");
2515 return TTS_ERROR_INVALID_PARAMETER;
2518 if (TTS_STATE_CREATED != client->current_state) {
2519 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Current state is not 'Created'.");
2520 return TTS_ERROR_INVALID_STATE;
2523 client->error_cb = callback;
2524 client->error_user_data = user_data;
2526 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set error cb");
2531 int tts_unset_error_cb(tts_h tts)
2533 if (0 != __tts_get_feature_enabled()) {
2534 return TTS_ERROR_NOT_SUPPORTED;
2538 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Input parameter is null");
2539 return TTS_ERROR_INVALID_PARAMETER;
2542 tts_client_s* client = tts_client_get(tts);
2544 if (NULL == client) {
2545 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : A handle is not valid");
2546 return TTS_ERROR_INVALID_PARAMETER;
2549 if (TTS_STATE_CREATED != client->current_state) {
2550 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Current state is not 'Created'.");
2551 return TTS_ERROR_INVALID_STATE;
2554 client->error_cb = NULL;
2555 client->error_user_data = NULL;
2557 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset error cb");
2562 int tts_set_default_voice_changed_cb(tts_h tts, tts_default_voice_changed_cb callback, void* user_data)
2564 if (0 != __tts_get_feature_enabled()) {
2565 return TTS_ERROR_NOT_SUPPORTED;
2568 if (NULL == tts || NULL == callback) {
2569 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : Input parameter is null");
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] Set default voice changed cb : A handle is not valid");
2577 return TTS_ERROR_INVALID_PARAMETER;
2580 if (TTS_STATE_CREATED != client->current_state) {
2581 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : Current state is not 'Created'.");
2582 return TTS_ERROR_INVALID_STATE;
2585 client->default_voice_changed_cb = callback;
2586 client->default_voice_changed_user_data = user_data;
2588 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set default voice changed cb");
2593 int tts_unset_default_voice_changed_cb(tts_h tts)
2595 if (0 != __tts_get_feature_enabled()) {
2596 return TTS_ERROR_NOT_SUPPORTED;
2600 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : Input parameter is null");
2601 return TTS_ERROR_INVALID_PARAMETER;
2604 tts_client_s* client = tts_client_get(tts);
2606 if (NULL == client) {
2607 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : A handle is not valid");
2608 return TTS_ERROR_INVALID_PARAMETER;
2611 if (TTS_STATE_CREATED != client->current_state) {
2612 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : Current state is not 'Created'.");
2613 return TTS_ERROR_INVALID_STATE;
2616 client->default_voice_changed_cb = NULL;
2617 client->default_voice_changed_user_data = NULL;
2619 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset default voice changed cb");
2624 int tts_set_engine_changed_cb(tts_h tts, tts_engine_changed_cb callback, void* user_data)
2626 if (0 != __tts_get_feature_enabled()) {
2627 return TTS_ERROR_NOT_SUPPORTED;
2630 if (NULL == tts || NULL == callback) {
2631 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set engine changed cb : Input parameter is null");
2632 return TTS_ERROR_INVALID_PARAMETER;
2635 tts_client_s* client = tts_client_get(tts);
2637 if (NULL == client) {
2638 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set engine changed cb : A handle is not valid");
2639 return TTS_ERROR_INVALID_PARAMETER;
2642 if (TTS_STATE_CREATED != client->current_state) {
2643 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set engine changed cb : Current state is not 'Created'.");
2644 return TTS_ERROR_INVALID_STATE;
2647 client->engine_changed_cb = callback;
2648 client->engine_changed_user_data = user_data;
2650 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set engine changed cb");
2655 int tts_unset_engine_changed_cb(tts_h tts)
2657 if (0 != __tts_get_feature_enabled()) {
2658 return TTS_ERROR_NOT_SUPPORTED;
2662 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset engine changed cb : Input parameter is null");
2663 return TTS_ERROR_INVALID_PARAMETER;
2666 tts_client_s* client = tts_client_get(tts);
2668 if (NULL == client) {
2669 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset engine changed cb : A handle is not valid");
2670 return TTS_ERROR_INVALID_PARAMETER;
2673 if (TTS_STATE_CREATED != client->current_state) {
2674 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset engine changed cb : Current state is not 'Created'.");
2675 return TTS_ERROR_INVALID_STATE;
2678 client->engine_changed_cb = NULL;
2679 client->engine_changed_user_data = NULL;
2681 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset engine changed cb");
2687 int tts_add_pcm(tts_h tts, int event, const void* data, unsigned int data_size, int audio_type, int rate)
2689 if (0 != __tts_get_feature_enabled()) {
2690 return TTS_ERROR_NOT_SUPPORTED;
2693 SLOG(LOG_INFO, TAG_TTSC, "@@@ Add pcm tts");
2696 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
2697 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2698 return TTS_ERROR_INVALID_PARAMETER;
2701 tts_client_s* client = tts_client_get(tts);
2703 if (NULL == client) {
2704 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
2705 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2706 return TTS_ERROR_INVALID_PARAMETER;
2709 if (TTS_STATE_CREATED == client->current_state) {
2710 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
2711 return TTS_ERROR_INVALID_STATE;
2714 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
2715 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
2716 return TTS_ERROR_INVALID_STATE;
2721 bool is_prepared = false;
2723 ret = tts_dbus_request_add_pcm(client->uid, event, data, data_size, audio_type, rate);
2725 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2726 client->current_state = TTS_STATE_CREATED;
2727 if (0 == tts_prepare_sync(tts)) {
2729 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
2731 } else if (TTS_ERROR_TIMED_OUT != ret) {
2732 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
2735 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry add pcm : %s", __tts_get_error_code(ret));
2738 if (TTS_RETRY_COUNT == count) {
2739 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
2746 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2748 return TTS_ERROR_NONE;
2751 int tts_play_pcm(tts_h tts)
2753 if (0 != __tts_get_feature_enabled()) {
2754 return TTS_ERROR_NOT_SUPPORTED;
2757 SLOG(LOG_INFO, TAG_TTSC, "@@@ Play pcm tts");
2760 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
2761 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2762 return TTS_ERROR_INVALID_PARAMETER;
2765 tts_client_s* client = tts_client_get(tts);
2767 if (NULL == client) {
2768 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
2769 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2770 return TTS_ERROR_INVALID_PARAMETER;
2773 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
2774 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
2775 return TTS_ERROR_INVALID_STATE;
2778 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
2779 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
2780 return TTS_ERROR_INVALID_STATE;
2785 bool is_prepared = false;
2787 ret = tts_dbus_request_play_pcm(client->uid);
2789 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2790 client->current_state = TTS_STATE_CREATED;
2791 if (0 == tts_prepare_sync(tts)) {
2793 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
2795 } else if (TTS_ERROR_TIMED_OUT != ret) {
2796 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
2799 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry play pcm : %s", __tts_get_error_code(ret));
2802 if (TTS_RETRY_COUNT == count) {
2803 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
2810 client->before_state = client->current_state;
2811 client->current_state = TTS_STATE_PLAYING;
2813 if (NULL != client->state_changed_cb) {
2814 tts_client_use_callback(client);
2815 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
2816 tts_client_not_use_callback(client);
2817 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
2820 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2822 return TTS_ERROR_NONE;
2825 int tts_stop_pcm(tts_h tts)
2827 if (0 != __tts_get_feature_enabled()) {
2828 return TTS_ERROR_NOT_SUPPORTED;
2831 SLOG(LOG_INFO, TAG_TTSC, "@@@ Stop pcm tts");
2834 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
2835 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2836 return TTS_ERROR_INVALID_PARAMETER;
2839 tts_client_s* client = tts_client_get(tts);
2841 if (NULL == client) {
2842 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
2843 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2844 return TTS_ERROR_INVALID_PARAMETER;
2847 if (TTS_STATE_CREATED == client->current_state) {
2848 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
2849 return TTS_ERROR_INVALID_STATE;
2852 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
2853 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
2854 return TTS_ERROR_INVALID_STATE;
2859 bool is_prepared = false;
2861 ret = tts_dbus_request_stop_pcm(client->uid);
2863 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2864 client->current_state = TTS_STATE_CREATED;
2865 if (0 == tts_prepare_sync(tts)) {
2867 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
2869 } else if (TTS_ERROR_TIMED_OUT != ret) {
2870 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
2873 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry stop pcm : %s", __tts_get_error_code(ret));
2876 if (TTS_RETRY_COUNT == count) {
2877 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
2884 client->before_state = client->current_state;
2885 client->current_state = TTS_STATE_READY;
2887 if (NULL != client->state_changed_cb) {
2888 tts_client_use_callback(client);
2889 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
2890 tts_client_not_use_callback(client);
2891 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
2894 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2896 return TTS_ERROR_NONE;
2900 int tts_repeat(tts_h tts, char** text_repeat, int* utt_id)
2902 if (0 != __tts_get_feature_enabled()) {
2903 return TTS_ERROR_NOT_SUPPORTED;
2906 SLOG(LOG_INFO, TAG_TTSC, "@@@ Repeat TTS");
2909 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
2910 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2911 return TTS_ERROR_INVALID_PARAMETER;
2914 if (NULL == text_repeat || NULL == utt_id) {
2915 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null.");
2916 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2917 return TTS_ERROR_INVALID_PARAMETER;
2920 *text_repeat = NULL;
2923 tts_client_s* client = tts_client_get(tts);
2925 if (NULL == client) {
2926 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
2927 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2928 return TTS_ERROR_INVALID_PARAMETER;
2931 if (TTS_STATE_READY != client->current_state) {
2932 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid. (%d)", client->current_state);
2933 return TTS_ERROR_INVALID_STATE;
2936 /* Clear the legacy and Add texts to be played repeatedly */
2938 ret = tts_stop(tts);
2939 if (TTS_ERROR_NONE != ret) {
2940 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to clear the legacy");
2944 if (NULL != client->text_repeat) {
2945 char* tmp_text = strdup(client->text_repeat);
2946 char* tmp_lang = NULL;
2947 if (NULL != g_language) {
2948 tmp_lang = strdup(g_language);
2950 ret = tts_add_text(tts, tmp_text, tmp_lang, g_voice_type, g_speed, utt_id);
2951 if (TTS_ERROR_NONE != ret) {
2952 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to add texts for repetition.");
2953 if (NULL != tmp_text) {
2957 if (NULL != tmp_lang) {
2963 *text_repeat = strdup(client->text_repeat);
2964 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] text to repeat(%s), utt_id(%d)", (*text_repeat) ? *text_repeat : "NULL", *utt_id);
2965 if (NULL != tmp_text) {
2969 if (NULL != tmp_lang) {
2974 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] There is no previous added texts. Please add texts");
2975 return TTS_ERROR_OPERATION_FAILED;
2978 /* Play added texts */
2979 ret = tts_play(tts);
2980 if (TTS_ERROR_NONE != ret) {
2981 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to play texts for repetition.");
2982 if (NULL != *text_repeat) {
2984 *text_repeat = NULL;
2990 return TTS_ERROR_NONE;