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>
27 #include "tts_client.h"
28 #include "tts_config_mgr.h"
32 #include "tts_internal.h"
34 static bool g_screen_reader;
36 static int g_feature_enabled = -1;
38 static bool g_err_callback_status = false;
40 static int g_max_text_size = -1;
42 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;
50 static int g_retry_cnt = 0;
52 /* for checking engine update */
53 static pkgmgr_client* g_pkgmgr = NULL;
54 static char* g_engine_name = NULL;
55 static int g_engine_update_status = 0;
56 static pthread_mutex_t g_pkgmgr_mutex = PTHREAD_MUTEX_INITIALIZER;
59 /* Function definition */
60 static Eina_Bool __tts_notify_state_changed(void *data);
61 static Eina_Bool __tts_notify_error(void *data);
62 int __tts_cb_error(int uid, tts_error_e reason, int utt_id, char* err_msg);
63 int __tts_recheck_screen_reader();
70 static int __tts_get_feature_enabled()
72 if (0 == g_feature_enabled) {
73 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS feature NOT supported");
74 return TTS_ERROR_NOT_SUPPORTED;
75 } else if (-1 == g_feature_enabled) {
76 bool tts_supported = false;
77 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
78 if (false == tts_supported) {
79 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS feature NOT supported");
80 g_feature_enabled = 0;
81 return TTS_ERROR_NOT_SUPPORTED;
84 g_feature_enabled = 1;
86 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get feature value");
87 return TTS_ERROR_NOT_SUPPORTED;
94 static const char* __tts_get_error_code(tts_error_e err)
97 case TTS_ERROR_NONE: return "TTS_ERROR_NONE";
98 case TTS_ERROR_OUT_OF_MEMORY: return "TTS_ERROR_OUT_OF_MEMORY";
99 case TTS_ERROR_IO_ERROR: return "TTS_ERROR_IO_ERROR";
100 case TTS_ERROR_INVALID_PARAMETER: return "TTS_ERROR_INVALID_PARAMETER";
101 case TTS_ERROR_OUT_OF_NETWORK: return "TTS_ERROR_OUT_OF_NETWORK";
102 case TTS_ERROR_TIMED_OUT: return "TTS_ERROR_TIMED_OUT";
103 case TTS_ERROR_PERMISSION_DENIED: return "TTS_ERROR_PERMISSION_DENIED";
104 case TTS_ERROR_NOT_SUPPORTED: return "TTS_ERROR_NOT_SUPPORTED";
105 case TTS_ERROR_INVALID_STATE: return "TTS_ERROR_INVALID_STATE";
106 case TTS_ERROR_INVALID_VOICE: return "TTS_ERROR_INVALID_VOICE";
107 case TTS_ERROR_ENGINE_NOT_FOUND: return "TTS_ERROR_ENGINE_NOT_FOUND";
108 case TTS_ERROR_OPERATION_FAILED: return "TTS_ERROR_OPERATION_FAILED";
109 case TTS_ERROR_AUDIO_POLICY_BLOCKED: return "TTS_ERROR_AUDIO_POLICY_BLOCKED";
110 case TTS_ERROR_NOT_SUPPORTED_FEATURE: return "TTS_ERROR_NOT_SUPPORTED_FEATURE";
111 case TTS_ERROR_SERVICE_RESET: return "TTS_ERROR_SERVICE_RESET";
113 return "Invalid error code";
118 static int __tts_convert_config_error_code(tts_config_error_e code)
120 if (code == TTS_CONFIG_ERROR_NONE) return TTS_ERROR_NONE;
121 if (code == TTS_CONFIG_ERROR_OUT_OF_MEMORY) return TTS_ERROR_OUT_OF_MEMORY;
122 if (code == TTS_CONFIG_ERROR_IO_ERROR) return TTS_ERROR_IO_ERROR;
123 if (code == TTS_CONFIG_ERROR_INVALID_PARAMETER) return TTS_ERROR_INVALID_PARAMETER;
124 if (code == TTS_CONFIG_ERROR_INVALID_STATE) return TTS_ERROR_INVALID_STATE;
125 if (code == TTS_CONFIG_ERROR_INVALID_VOICE) return TTS_ERROR_INVALID_VOICE;
126 if (code == TTS_CONFIG_ERROR_ENGINE_NOT_FOUND) return TTS_ERROR_ENGINE_NOT_FOUND;
127 if (code == TTS_CONFIG_ERROR_OPERATION_FAILED) return TTS_ERROR_OPERATION_FAILED;
128 if (code == TTS_CONFIG_ERROR_NOT_SUPPORTED_FEATURE) return TTS_ERROR_NOT_SUPPORTED_FEATURE;
134 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)
136 SLOG(LOG_DEBUG, TAG_TTSC, "Voice changed : Before lang(%s) type(%d) , Current lang(%s), type(%d)",
137 before_lang, before_voice_type, language, voice_type);
139 GList* client_list = NULL;
140 client_list = tts_client_get_client_list();
143 tts_client_s *data = NULL;
145 if (g_list_length(client_list) > 0) {
146 /* Get a first item */
147 iter = g_list_first(client_list);
149 while (NULL != iter) {
151 if (NULL != data->default_voice_changed_cb) {
152 SLOG(LOG_DEBUG, TAG_TTSC, "Call default voice changed callback : uid(%d)", data->uid);
153 data->default_voice_changed_cb(data->tts, before_lang, before_voice_type,
154 language, voice_type, data->default_voice_changed_user_data);
157 /* Check whether language is changed or not. If it is changed, make 'text_repeat' NULL */
158 if (0 != strncmp(before_lang, language, strlen(before_lang))) {
159 if (NULL != data->text_repeat) {
160 free(data->text_repeat);
161 data->text_repeat = NULL;
166 iter = g_list_next(iter);
173 static Eina_Bool __reconnect_by_engine_changed(void* data)
175 tts_h tts = (tts_h)data;
177 tts_client_s* client = tts_client_get(tts);
178 if (NULL == client) {
179 SLOG(LOG_ERROR, TAG_TTSC, "[WARNING] A handle is not valid");
183 if (TTS_STATE_READY != client->current_state) {
188 int ret = tts_unprepare(tts);
190 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare for setting a new engine... (%d)", ret);
192 ret = tts_prepare(tts);
194 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare for setting a new engine... (%d)", ret);
200 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)
202 tts_h tts = (tts_h)user_data;
204 tts_client_s* client = tts_client_get(tts);
205 if (NULL == client) {
206 SLOG(LOG_ERROR, TAG_TTSC, "[WARNING] A handle is not valid");
210 if (NULL != engine_id) SLOG(LOG_DEBUG, TAG_TTSC, "Engine id(%s)", engine_id);
211 if (NULL != setting) SLOG(LOG_DEBUG, TAG_TTSC, "Engine setting(%s)", setting);
212 if (NULL != language) SLOG(LOG_DEBUG, TAG_TTSC, "Language(%s)", language);
213 SLOG(LOG_DEBUG, TAG_TTSC, "Voice type(%d), Auto voice(%s), Credential(%s)", voice_type, auto_voice ? "on" : "off", need_credential ? "need" : "no need");
215 /* When the default engine is changed, please unload the old engine and load the new one. */
218 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_PAUSED == client->current_state) {
221 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] TTS client stopping...");
224 ecore_idler_add(__reconnect_by_engine_changed, (void*)tts);
225 } else if (TTS_STATE_READY == client->current_state) {
226 ret = tts_unprepare(tts);
228 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to unprepare for setting a new engine... (%d)", ret);
230 ret = tts_prepare(tts);
232 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare for setting a new engine... (%d)", ret);
236 /* call callback function */
237 if (NULL != client->engine_changed_cb) {
238 client->engine_changed_cb(tts, engine_id, language, voice_type, need_credential, client->engine_changed_user_data);
240 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function for changed engine");
246 void __tts_unset_all_callbacks(tts_h tts)
248 SLOG(LOG_INFO, TAG_TTSC, "@@@ unset all callbacks");
250 tts_unset_state_changed_cb(tts);
251 tts_unset_utterance_started_cb(tts);
252 tts_unset_utterance_completed_cb(tts);
253 tts_unset_error_cb(tts);
254 tts_unset_default_voice_changed_cb(tts);
255 tts_unset_engine_changed_cb(tts);
257 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
260 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)
262 SLOG(LOG_INFO, TAG_TTSC, "[INFO] pkgmgr status cb is invoked. pkgname(%s), type(%s), key(%s), val(%s)", pkgname, type, key, val);
264 if (0 != strncmp(g_engine_name, pkgname, strlen(g_engine_name))) {
265 SLOG(LOG_DEBUG, TAG_TTSC, "[WARN] this is not tts engine");
268 if (key && 0 == strncmp(key, "start", strlen(key))) {
269 if (val && (0 == strncmp(val, "update", strlen(val) || 0 == strncmp(val, "uninstall", strlen(val))))) {
270 SLOG(LOG_ERROR, TAG_TTSC, "[INFO] start to install.");
271 g_engine_update_status = 1;
273 } else if (key && 0 == strncmp(key, "end", strlen(key))) {
274 SLOG(LOG_ERROR, TAG_TTSC, "[INFO] finish to install");
275 g_engine_update_status = 0;
282 static void __create_pkgmgr_thread(void* data, Ecore_Thread* thread)
284 SLOG(LOG_ERROR, TAG_TTSC, "[DEBUG] create pkgmgr thread");
286 pthread_mutex_lock(&g_pkgmgr_mutex);
289 g_pkgmgr = pkgmgr_client_new(PC_LISTENING);
290 if (NULL == g_pkgmgr) {
291 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to create pkgmgr handle");
293 int ret = pkgmgr_client_set_status_type(g_pkgmgr, PKGMGR_CLIENT_STATUS_UNINSTALL | PKGMGR_CLIENT_STATUS_UPGRADE);
295 if (pkgmgr_client_listen_status(g_pkgmgr, __pkgmgr_status_cb, NULL) < 0) {
296 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to listen pkgmgr status. remove and recreate client");
297 pkgmgr_client_free(g_pkgmgr);
302 SLOG(LOG_ERROR, TAG_TTSC, "[INFO] Succeed to register pkgmgr cb");
305 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to set status type on pkgmgr, ret(%d)", ret);
306 pkgmgr_client_free(g_pkgmgr);
315 pthread_mutex_unlock(&g_pkgmgr_mutex);
320 static void __finish_pkgmgr_thread(void* data, Ecore_Thread* thread)
322 SLOG(LOG_ERROR, TAG_TTSC, "[DEBUG] Finish pkgmgr thread");
325 static void __pkgmgr_thread(void* data)
327 SLOG(LOG_ERROR, TAG_TTSC, "[DEBUG] call pkgmgr_thread");
329 ecore_thread_run(__create_pkgmgr_thread, __finish_pkgmgr_thread, NULL, NULL);
334 int tts_create(tts_h* tts)
336 if (0 != __tts_get_feature_enabled()) {
337 return TTS_ERROR_NOT_SUPPORTED;
340 SLOG(LOG_INFO, TAG_TTSC, "@@@ Create TTS");
344 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
345 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
346 return TTS_ERROR_INVALID_PARAMETER;
349 if (0 == tts_client_get_size()) {
350 if (0 != tts_dbus_open_connection()) {
351 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to open dbus connection");
352 return TTS_ERROR_OPERATION_FAILED;
356 if (0 != tts_client_new(tts)) {
357 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to create client!!!!!");
358 return TTS_ERROR_OUT_OF_MEMORY;
361 tts_client_s* client = tts_client_get(*tts);
362 if (NULL == client) {
363 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get client");
364 return TTS_ERROR_OPERATION_FAILED;
367 SLOG(LOG_ERROR, TAG_TTSC, "[INFO] tts_h(%p), tts_client(%p), uid(%d)", tts, client, client->uid);
369 int ret = tts_config_mgr_initialize(client->uid);
371 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to init config manager : %d", ret);
372 tts_client_destroy(*tts);
373 return __tts_convert_config_error_code(ret);
376 ret = tts_config_mgr_set_callback(client->uid, _tts_config_engine_changed_cb, __tts_config_voice_changed_cb, NULL, NULL, NULL, client->tts);
378 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to set config changed : %d", ret);
379 tts_client_destroy(*tts);
380 return __tts_convert_config_error_code(ret);
383 ecore_main_loop_thread_safe_call_async(__pkgmgr_thread, NULL);
385 SLOG(LOG_INFO, TAG_TTSC, "[INFO] call ecore thread for creating pkgmgr thread");
387 g_engine_name = vconf_get_str(TTS_ENGINE_DB_DEFAULT);
388 if (NULL == g_engine_name) {
389 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get engine name");
391 SLOG(LOG_ERROR, TAG_TTSC, "[INFO] Engine name(%s)", g_engine_name);
394 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
395 SLOG(LOG_DEBUG, TAG_TTSC, " ");
397 return TTS_ERROR_NONE;
400 int tts_destroy(tts_h tts)
402 if (0 != __tts_get_feature_enabled()) {
403 return TTS_ERROR_NOT_SUPPORTED;
406 SLOG(LOG_INFO, TAG_TTSC, "@@@ Destroy TTS");
409 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
410 return TTS_ERROR_INVALID_PARAMETER;
413 tts_client_s* client = tts_client_get(tts);
416 if (NULL == client) {
417 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
418 return TTS_ERROR_INVALID_PARAMETER;
421 SLOG(LOG_ERROR, TAG_TTSC, "[INFO] tts_h(%p), tts_client(%p), uid(%d)", tts, client, client->uid);
423 /* check used callback */
424 if (0 != tts_client_get_use_callback(client)) {
425 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Cannot destroy in Callback function");
426 return TTS_ERROR_OPERATION_FAILED;
429 tts_config_mgr_finalize(client->uid);
431 if (client->hello_timer) {
432 ecore_timer_del(client->hello_timer);
433 client->hello_timer = NULL;
440 switch (client->current_state) {
441 case TTS_STATE_PAUSED:
442 case TTS_STATE_PLAYING:
443 case TTS_STATE_READY:
444 ret = __tts_recheck_screen_reader();
446 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get screen reader(%d)", ret);
449 SLOG(LOG_INFO, tts_tag(), "[INFO] g_screen_reader(%s), client->mode(%d)", (true == g_screen_reader) ? "True" : "False", client->mode);
451 if (!(false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode)) {
453 ret = tts_dbus_request_finalize(client->uid);
456 if (TTS_ERROR_TIMED_OUT != ret) {
457 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
460 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry finalize");
463 if (TTS_RETRY_COUNT == count) {
464 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
472 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Do not request finalize : g_sr(%d) mode(%d)", g_screen_reader, client->mode);
475 client->before_state = client->current_state;
476 client->current_state = TTS_STATE_CREATED;
478 case TTS_STATE_CREATED:
479 if (NULL != client->conn_timer) {
480 SLOG(LOG_DEBUG, TAG_TTSC, "Connect Timer is deleted");
481 ecore_timer_del(client->conn_timer);
482 client->conn_timer = NULL;
484 /* Unset registered callbacks */
485 __tts_unset_all_callbacks(tts);
488 tts_client_destroy(tts);
495 int num_of_client = tts_client_get_size();
496 if (0 == num_of_client) {
497 SLOG(LOG_ERROR, TAG_TTSC, "[INFO] all clients are destroied");
498 if (0 != tts_dbus_close_connection()) {
499 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to close connection");
501 pthread_mutex_lock(&g_pkgmgr_mutex);
503 pkgmgr_client_remove_listen_status(g_pkgmgr);
504 pkgmgr_client_free(g_pkgmgr);
507 pthread_mutex_unlock(&g_pkgmgr_mutex);
509 SLOG(LOG_ERROR, TAG_TTSC, "[INFO] num_of_client(%d)", num_of_client);
512 if (NULL != g_language) {
517 /* Delete state timer before destroying handle */
518 if (NULL != g_check_state_timer) {
519 ecore_timer_del(g_check_state_timer);
520 g_check_state_timer = NULL;
525 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
527 return TTS_ERROR_NONE;
531 void __tts_screen_reader_changed_cb(bool value)
533 g_screen_reader = value;
537 int tts_set_mode(tts_h tts, tts_mode_e mode)
539 if (0 != __tts_get_feature_enabled()) {
540 return TTS_ERROR_NOT_SUPPORTED;
543 SLOG(LOG_INFO, TAG_TTSC, "@@@ Set TTS mode(%d)", mode);
545 tts_client_s* client = tts_client_get(tts);
548 if (NULL == client) {
549 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
550 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
551 return TTS_ERROR_INVALID_PARAMETER;
555 if (client->current_state != TTS_STATE_CREATED) {
556 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
557 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
558 SLOG(LOG_DEBUG, TAG_TTSC, " ");
559 return TTS_ERROR_INVALID_STATE;
562 if (TTS_MODE_DEFAULT <= mode && mode <= TTS_MODE_INTERRUPT) {
565 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] mode is not valid : %d", mode);
566 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
567 SLOG(LOG_DEBUG, TAG_TTSC, " ");
568 return TTS_ERROR_INVALID_PARAMETER;
571 if (TTS_MODE_SCREEN_READER == mode) {
573 ret = __tts_recheck_screen_reader();
575 SLOG(LOG_ERROR, tts_tag(), "[Config ERROR] Fail to get screen reader(%d)", ret);
576 return TTS_ERROR_OPERATION_FAILED;
578 tts_config_set_screen_reader_callback(client->uid, __tts_screen_reader_changed_cb);
580 tts_config_unset_screen_reader_callback(client->uid);
583 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
585 return TTS_ERROR_NONE;
588 int tts_get_mode(tts_h tts, tts_mode_e* mode)
590 if (0 != __tts_get_feature_enabled()) {
591 return TTS_ERROR_NOT_SUPPORTED;
594 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Get TTS mode");
596 tts_client_s* client = tts_client_get(tts);
599 if (NULL == client) {
600 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
601 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
602 SLOG(LOG_DEBUG, TAG_TTSC, " ");
603 return TTS_ERROR_INVALID_PARAMETER;
607 if (client->current_state != TTS_STATE_CREATED) {
608 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
609 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
610 SLOG(LOG_DEBUG, TAG_TTSC, " ");
611 return TTS_ERROR_INVALID_STATE;
615 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter(mode) is NULL");
616 return TTS_ERROR_INVALID_PARAMETER;
619 *mode = client->mode;
621 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
622 SLOG(LOG_DEBUG, TAG_TTSC, " ");
624 return TTS_ERROR_NONE;
627 int tts_set_credential(tts_h tts, const char* credential)
629 if (0 != __tts_get_feature_enabled()) {
630 return TTS_ERROR_NOT_SUPPORTED;
633 if (NULL == tts || NULL == credential) {
634 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
635 return TTS_ERROR_INVALID_PARAMETER;
638 tts_client_s* client = tts_client_get(tts);
640 if (NULL == client) {
641 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
642 return TTS_ERROR_INVALID_PARAMETER;
645 if (TTS_STATE_CREATED != client->current_state && TTS_STATE_READY != client->current_state) {
646 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid (%d).", client->current_state);
647 return TTS_ERROR_INVALID_STATE;
650 if (NULL != client->credential) {
651 free(client->credential);
652 client->credential = NULL;
654 client->credential = strdup(credential);
656 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
658 return TTS_ERROR_NONE;
662 int tts_set_server_tts(tts_h tts, const char* credential)
664 if (0 != __tts_get_feature_enabled()) {
665 return TTS_ERROR_NOT_SUPPORTED;
669 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
670 return TTS_ERROR_INVALID_PARAMETER;
673 tts_client_s* client = tts_client_get(tts);
675 if (NULL == client) {
676 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
677 return TTS_ERROR_INVALID_PARAMETER;
680 if (TTS_STATE_CREATED != client->current_state && TTS_STATE_READY != client->current_state) {
681 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid (%d).", client->current_state);
682 return TTS_ERROR_INVALID_STATE;
685 if (NULL != client->credential) {
686 free(client->credential);
687 client->credential = NULL;
690 client->internal = true;
693 if (NULL != credential) {
694 key = strdup("EnableServerTTS");
695 client->credential = strdup(credential);
696 if (NULL == client->credential) {
697 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to allocate memory");
702 return TTS_ERROR_OUT_OF_MEMORY;
705 key = strdup("DisableServerTTS");
709 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to allocate memory");
710 return TTS_ERROR_OUT_OF_MEMORY;
715 int ret = app_manager_get_app_id(pid, &appid);
716 if (0 != ret || NULL == appid) {
717 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get appid, ret(%d), pid(%d), appid(%s)", ret, pid, appid);
724 return TTS_ERROR_OPERATION_FAILED;
727 ret = tts_set_private_data(tts, key, appid);
729 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to set private data, ret(%d), pid(%d), appid(%s)", ret, pid, appid);
742 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
744 return TTS_ERROR_NONE;
748 static Eina_Bool __tts_connect_daemon(void *data)
750 tts_h tts = (tts_h)data;
751 tts_client_s* client = tts_client_get(tts);
754 if (NULL == client) {
755 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
759 /* check whether engine is updating or not */
760 if (g_engine_update_status) {
761 SLOG(LOG_ERROR, TAG_TTSC, "[DEBUG] cannot prepare due to engine update");
762 __tts_cb_error(-1, TTS_ERROR_SERVICE_RESET, -1, "Daemon Reset");
768 if (0 != tts_dbus_request_hello_sync(client->uid)) {
772 SLOG(LOG_INFO, TAG_TTSC, "@@@ Connect daemon");
774 /* do request initialize */
776 bool credential_needed = false;
778 ret = tts_dbus_request_initialize(client->uid, &credential_needed);
780 if (TTS_ERROR_ENGINE_NOT_FOUND == ret) {
781 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to initialize : %s", __tts_get_error_code(ret));
783 client->reason = TTS_ERROR_ENGINE_NOT_FOUND;
786 ecore_timer_add(0, __tts_notify_error, (void*)client->tts);
787 if (client->conn_timer) {
788 ecore_timer_del(client->conn_timer);
789 client->conn_timer = NULL;
793 } else if (TTS_ERROR_PERMISSION_DENIED == ret) {
794 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to initialize : %s", __tts_get_error_code(ret));
796 client->reason = TTS_ERROR_PERMISSION_DENIED;
799 ecore_timer_add(0, __tts_notify_error, (void*)client->tts);
800 if (client->conn_timer) {
801 ecore_timer_del(client->conn_timer);
802 client->conn_timer = NULL;
806 } else if (TTS_ERROR_NONE != ret) {
807 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to connection. Retry to connect : %s", __tts_get_error_code(ret));
811 /* success to connect tts-daemon */
812 client->credential_needed = credential_needed;
813 SLOG(LOG_ERROR, TAG_TTSC, "Supported options : credential(%s)", credential_needed ? "need" : "no need");
816 if (client->conn_timer) {
817 ecore_timer_del(client->conn_timer);
818 client->conn_timer = NULL;
821 client = tts_client_get(tts);
823 if (NULL == client) {
824 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
828 client->before_state = client->current_state;
829 client->current_state = TTS_STATE_READY;
831 if (NULL != client->state_changed_cb) {
832 tts_client_use_callback(client);
833 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
834 tts_client_not_use_callback(client);
836 SLOG(LOG_WARN, TAG_TTSC, "State changed callback is NULL");
839 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
844 int __tts_cb_hello(int uid, int ret, int credential_needed)
846 tts_client_s* client = tts_client_get_by_uid(uid);
847 if (NULL == client) {
848 SLOG(LOG_ERROR, TAG_TTSC, "Fail to get TTS client or ignore this uid(%d)", uid);
849 return TTS_ERROR_OPERATION_FAILED;
852 if (client->hello_timer) {
853 ecore_timer_del(client->hello_timer);
854 client->hello_timer = NULL;
857 if (TTS_STATE_READY == client->current_state) {
858 SLOG(LOG_INFO, TAG_TTSC, "[INFO] tts client is already READY");
859 return TTS_ERROR_NONE;
862 if (TTS_ERROR_ENGINE_NOT_FOUND == ret) {
863 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to initialize : %s", __tts_get_error_code(ret));
865 client->reason = TTS_ERROR_ENGINE_NOT_FOUND;
868 ecore_timer_add(0, __tts_notify_error, (void*)client->tts);
869 return TTS_ERROR_OPERATION_FAILED;
871 } else if (TTS_ERROR_PERMISSION_DENIED == ret) {
872 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to initialize : %s", __tts_get_error_code(ret));
874 client->reason = TTS_ERROR_PERMISSION_DENIED;
877 ecore_timer_add(0, __tts_notify_error, (void*)client->tts);
878 return TTS_ERROR_PERMISSION_DENIED;
880 } else if (TTS_ERROR_NONE != ret) {
881 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to connection. Retry to connect : %s", __tts_get_error_code(ret));
882 return TTS_ERROR_OPERATION_FAILED;
885 /* success to connect tts-daemon */
886 client->credential_needed = credential_needed;
887 SLOG(LOG_ERROR, TAG_TTSC, "Supported options : credential(%s)", credential_needed ? "need" : "no need");
890 client->before_state = client->current_state;
891 client->current_state = TTS_STATE_READY;
893 ecore_timer_add(0.0, __tts_notify_state_changed, client->tts);
895 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
896 return TTS_ERROR_NONE;
899 static Eina_Bool __send_hello(void *data)
901 tts_h tts = (tts_h)data;
902 tts_client_s* client = tts_client_get(tts);
905 if (NULL == client) {
906 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
911 if (client->current_state == TTS_STATE_READY) {
912 SLOG(LOG_ERROR, TAG_TTSC, "[INFO] TTS client has been already connected to tts service"); //LCOV_EXCL_LINE
913 SLOG(LOG_ERROR, TAG_TTSC, "@@@");
914 client->hello_timer = NULL;
918 SLOG(LOG_ERROR, TAG_TTSC, "[INFO] tts_h(%p), tts_client(%p), uid(%d)", tts, client, client->uid);
920 /* check whether engine is updating or not */
921 if (g_engine_update_status) {
922 SLOG(LOG_ERROR, TAG_TTSC, "[DEBUG] cannot prepare due to engine update");
923 __tts_cb_error(-1, TTS_ERROR_SERVICE_RESET, -1, "Daemon Reset");
924 client->hello_timer = NULL;
929 int ret = tts_dbus_request_hello(client->uid);
931 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request hello !!"); //LCOV_EXCL_LINE
933 SLOG(LOG_ERROR, TAG_TTSC, "@@@ Send Hello");
937 if (TTS_HELLO_RETRY_COUNT == g_retry_cnt) {
938 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Stop to send hello, retry count reaches the limit");
940 client->hello_timer = NULL;
944 if (!client->hello_timer) {
945 SLOG(LOG_ERROR, TAG_TTSC, "@@@ Call checking Hello timer callback");
946 client->hello_timer = ecore_timer_add(0.5, __send_hello, tts);
952 int tts_prepare(tts_h tts)
954 if (0 != __tts_get_feature_enabled()) {
955 return TTS_ERROR_NOT_SUPPORTED;
958 SLOG(LOG_INFO, TAG_TTSC, "@@@ Prepare TTS");
960 tts_client_s* client = tts_client_get(tts);
963 if (NULL == client) {
964 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
965 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
966 return TTS_ERROR_INVALID_PARAMETER;
970 if (client->current_state != TTS_STATE_CREATED) {
971 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
972 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
973 return TTS_ERROR_INVALID_STATE;
976 SLOG(LOG_ERROR, TAG_TTSC, "[INFO] tts_h(%p), tts_client(%p), uid(%d)", tts, client, client->uid);
978 if (NULL == client->hello_timer) {
979 SLOG(LOG_ERROR, TAG_TTSC, "@@@ Call checking Hello timer callback");
981 ecore_thread_main_loop_begin();
982 ecore_timer_add(0.0, __send_hello, (void*)tts);
983 ecore_thread_main_loop_end();
986 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
988 return TTS_ERROR_NONE;
992 int tts_prepare_sync(tts_h tts)
994 if (0 != __tts_get_feature_enabled()) {
995 return TTS_ERROR_NOT_SUPPORTED;
998 SLOG(LOG_INFO, TAG_TTSC, "@@@ Prepare TTS");
1000 tts_client_s* client = tts_client_get(tts);
1003 if (NULL == client) {
1004 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
1005 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1006 return TTS_ERROR_INVALID_PARAMETER;
1010 if (client->current_state != TTS_STATE_CREATED) {
1011 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
1012 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1013 return TTS_ERROR_INVALID_STATE;
1017 while (EINA_TRUE == __tts_connect_daemon((void*)tts) && TTS_CONNECTION_RETRY_COUNT > cnt) {
1021 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1023 if (TTS_CONNECTION_RETRY_COUNT == cnt) {
1024 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to connect daemon");
1025 return TTS_ERROR_OPERATION_FAILED;
1028 return TTS_ERROR_NONE;
1032 int tts_unprepare(tts_h tts)
1034 if (0 != __tts_get_feature_enabled()) {
1035 return TTS_ERROR_NOT_SUPPORTED;
1038 SLOG(LOG_INFO, TAG_TTSC, "@@@ Unprepare TTS");
1040 tts_client_s* client = tts_client_get(tts);
1043 if (NULL == client) {
1044 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
1045 return TTS_ERROR_INVALID_PARAMETER;
1049 if (client->current_state != TTS_STATE_READY) {
1050 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'READY'");
1051 return TTS_ERROR_INVALID_STATE;
1054 SLOG(LOG_ERROR, TAG_TTSC, "[INFO] tts_h(%p), tts_client(%p), uid(%d)", tts, client, client->uid);
1056 if (client->hello_timer) {
1057 ecore_timer_del(client->hello_timer);
1058 client->hello_timer = NULL;
1064 ret = __tts_recheck_screen_reader();
1066 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get screen reader(%d)", ret);
1069 SLOG(LOG_INFO, tts_tag(), "[INFO] g_screen_reader(%s), client->mode(%d)", (true == g_screen_reader) ? "True" : "False", client->mode);
1071 bool is_prepared = false;
1072 if (!(false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode)) {
1074 ret = tts_dbus_request_finalize(client->uid);
1077 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1078 client->current_state = TTS_STATE_CREATED;
1079 if (0 == tts_prepare_sync(tts)) {
1081 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
1083 } else if (TTS_ERROR_TIMED_OUT != ret) {
1084 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1087 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry finalize : %s", __tts_get_error_code(ret));
1090 if (TTS_RETRY_COUNT == count) {
1091 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1099 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Do not request finalize : g_sr(%d) mode(%d)", g_screen_reader, client->mode);
1102 client->before_state = client->current_state;
1103 client->current_state = TTS_STATE_CREATED;
1105 if (NULL != client->state_changed_cb) {
1106 tts_client_use_callback(client);
1107 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1108 tts_client_not_use_callback(client);
1109 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1112 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1114 return TTS_ERROR_NONE;
1117 bool __tts_supported_voice_cb(const char* engine_id, const char* language, int type, void* user_data)
1119 tts_h tts = (tts_h)user_data;
1121 tts_client_s* client = tts_client_get(tts);
1122 if (NULL == client) {
1123 SLOG(LOG_ERROR, TAG_TTSC, "[WARNING] A handle is not valid");
1127 /* call callback function */
1128 if (NULL != client->supported_voice_cb) {
1129 return client->supported_voice_cb(tts, language, type, client->supported_voice_user_data);
1131 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of supported voice");
1137 int tts_foreach_supported_voices(tts_h tts, tts_supported_voice_cb callback, void* user_data)
1139 if (0 != __tts_get_feature_enabled()) {
1140 return TTS_ERROR_NOT_SUPPORTED;
1143 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Foreach supported voices");
1145 if (NULL == tts || NULL == callback) {
1146 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
1147 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1148 return TTS_ERROR_INVALID_PARAMETER;
1151 tts_client_s* client = tts_client_get(tts);
1154 if (NULL == client) {
1155 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1156 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1157 return TTS_ERROR_INVALID_PARAMETER;
1161 char* current_engine = NULL;
1162 ret = tts_config_mgr_get_engine(¤t_engine);
1164 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get current engine : %d", ret);
1165 return __tts_convert_config_error_code(ret);
1168 client->supported_voice_cb = callback;
1169 client->supported_voice_user_data = user_data;
1171 ret = tts_config_mgr_get_voice_list(current_engine, __tts_supported_voice_cb, client->tts);
1173 if (NULL != current_engine) {
1174 free(current_engine);
1175 current_engine = NULL;
1178 client->supported_voice_cb = NULL;
1179 client->supported_voice_user_data = NULL;
1182 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
1183 ret = TTS_ERROR_OPERATION_FAILED;
1186 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1191 int tts_get_default_voice(tts_h tts, char** lang, int* vctype)
1193 if (0 != __tts_get_feature_enabled()) {
1194 return TTS_ERROR_NOT_SUPPORTED;
1197 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Get default voice");
1200 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1201 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1202 return TTS_ERROR_INVALID_PARAMETER;
1205 tts_client_s* client = tts_client_get(tts);
1207 if (NULL == client) {
1208 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1209 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1210 return TTS_ERROR_INVALID_PARAMETER;
1213 /* Request call remote method */
1215 ret = tts_config_mgr_get_voice(lang, vctype);
1217 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
1218 return __tts_convert_config_error_code(ret);
1220 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] Default language(%s), type(%d)", *lang, *vctype);
1223 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1228 int tts_get_max_text_size(tts_h tts, unsigned int* size)
1230 if (0 != __tts_get_feature_enabled()) {
1231 return TTS_ERROR_NOT_SUPPORTED;
1234 if (NULL == tts || NULL == size) {
1235 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Input parameter is null");
1236 return TTS_ERROR_INVALID_PARAMETER;
1239 tts_client_s* client = tts_client_get(tts);
1241 if (NULL == client) {
1242 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : A handle is not valid");
1243 return TTS_ERROR_INVALID_PARAMETER;
1246 if (TTS_STATE_READY != client->current_state) {
1247 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Current state is NOT 'READY'.");
1248 return TTS_ERROR_INVALID_STATE;
1251 if (0 != tts_config_mgr_get_max_text_size(size)) {
1252 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get max text size");
1253 return TTS_ERROR_INVALID_PARAMETER;
1256 g_max_text_size = (int)*size;
1258 SLOG(LOG_INFO, TAG_TTSC, "Get max text size : %d byte", *size);
1259 return TTS_ERROR_NONE;
1262 int tts_get_state(tts_h tts, tts_state_e* state)
1264 if (0 != __tts_get_feature_enabled()) {
1265 return TTS_ERROR_NOT_SUPPORTED;
1268 if (NULL == tts || NULL == state) {
1269 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : Input parameter is null");
1270 return TTS_ERROR_INVALID_PARAMETER;
1273 tts_client_s* client = tts_client_get(tts);
1275 if (NULL == client) {
1276 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
1277 return TTS_ERROR_INVALID_PARAMETER;
1280 *state = client->current_state;
1283 case TTS_STATE_CREATED: SLOG(LOG_INFO, TAG_TTSC, "Current state is 'Created'"); break;
1284 case TTS_STATE_READY: SLOG(LOG_INFO, TAG_TTSC, "Current state is 'Ready'"); break;
1285 case TTS_STATE_PLAYING: SLOG(LOG_INFO, TAG_TTSC, "Current state is 'Playing'"); break;
1286 case TTS_STATE_PAUSED: SLOG(LOG_INFO, TAG_TTSC, "Current state is 'Paused'"); break;
1287 default: SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid value"); break;
1290 return TTS_ERROR_NONE;
1293 int tts_get_speed_range(tts_h tts, int* min, int* normal, int* max)
1295 if (0 != __tts_get_feature_enabled()) {
1296 return TTS_ERROR_NOT_SUPPORTED;
1299 if (NULL == tts || NULL == min || NULL == normal || NULL == max) {
1300 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
1301 return TTS_ERROR_INVALID_PARAMETER;
1304 tts_client_s* client = tts_client_get(tts);
1306 if (NULL == client) {
1307 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
1308 return TTS_ERROR_INVALID_PARAMETER;
1311 *min = TTS_SPEED_MIN;
1312 *normal = TTS_SPEED_NORMAL;
1313 *max = TTS_SPEED_MAX;
1315 return TTS_ERROR_NONE;
1318 int tts_get_error_message(tts_h tts, char** err_msg)
1320 if (0 != __tts_get_feature_enabled()) {
1321 return TTS_ERROR_NOT_SUPPORTED;
1324 if (NULL == tts || NULL == err_msg) {
1325 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
1326 return TTS_ERROR_INVALID_PARAMETER;
1329 tts_client_s* client = tts_client_get(tts);
1331 if (NULL == client) {
1332 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
1333 return TTS_ERROR_INVALID_PARAMETER;
1336 if (NULL != client->err_msg) {
1337 *err_msg = strdup(client->err_msg);
1338 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Error msg (%s)", *err_msg);
1341 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Error msg (NULL)");
1344 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1346 return TTS_ERROR_NONE;
1349 int __tts_recheck_screen_reader()
1351 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] Check screen reader again");
1354 int screen_reader = 0;
1356 ret = vconf_get_bool(TTS_ACCESSIBILITY_KEY, &screen_reader);
1358 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get screen reader vconf(%d)", ret);
1359 return TTS_ERROR_INVALID_STATE;
1361 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Current screen reader status(%d)", screen_reader);
1362 g_screen_reader = (bool)screen_reader;
1365 return TTS_ERROR_NONE;
1368 int tts_add_text(tts_h tts, const char* text, const char* language, int voice_type, int speed, int* utt_id)
1370 SLOG(LOG_ERROR, TAG_TTSC, "[INFO] Add text: text(%s), language(%s), type(%d)", (NULL == text) ? "NULL" : text, (NULL == language) ? "NULL" : language, voice_type);
1372 if (0 != __tts_get_feature_enabled()) {
1373 return TTS_ERROR_NOT_SUPPORTED;
1377 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Speed should not be negative(%d)", speed);
1378 return TTS_ERROR_INVALID_PARAMETER;
1381 if (voice_type < 0) {
1382 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Voice type should not be negative(%d)", voice_type);
1383 return TTS_ERROR_INVALID_PARAMETER;
1386 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Add text");
1390 if (NULL == tts || NULL == utt_id) {
1391 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
1392 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1393 return TTS_ERROR_INVALID_PARAMETER;
1396 tts_client_s* client = tts_client_get(tts);
1398 if (NULL == client) {
1399 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1400 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1401 return TTS_ERROR_INVALID_PARAMETER;
1404 if (TTS_STATE_CREATED == client->current_state) {
1405 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
1406 return TTS_ERROR_INVALID_STATE;
1409 if (TTS_SPEED_AUTO > speed || TTS_SPEED_MAX < speed) {
1410 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] speed value(%d) is invalid.", speed);
1411 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1412 return TTS_ERROR_INVALID_PARAMETER;
1415 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1416 /* check screen reader option one more time */
1417 ret = __tts_recheck_screen_reader();
1419 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get screen reader vconf(%d)", ret);
1420 return TTS_ERROR_INVALID_STATE;
1422 if (false == g_screen_reader) {
1423 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Screen reader option is NOT available.");
1424 return TTS_ERROR_INVALID_STATE;
1429 if (true == client->credential_needed && NULL == client->credential) {
1430 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Do not have app credential for this engine");
1431 return TTS_ERROR_PERMISSION_DENIED;
1434 /* check valid utf8 */
1438 dbus_error_init(&err);
1440 valid = dbus_validate_utf8(text, &err);
1441 if (dbus_error_is_set(&err)) {
1442 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Dbus Error(%s), text(%s)", err.message, text);
1443 dbus_error_free(&err);
1444 return TTS_ERROR_INVALID_PARAMETER;
1447 if (valid != true) {
1448 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Text is invalid - '%s'", text);
1449 return TTS_ERROR_INVALID_PARAMETER;
1452 /* check text size */
1453 if (-1 == g_max_text_size) {
1454 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] g_max_text_size is %d byte", g_max_text_size);
1455 if (0 != tts_config_mgr_get_max_text_size((unsigned int*)&g_max_text_size)) {
1456 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get max text size");
1457 return TTS_ERROR_INVALID_PARAMETER;
1461 if (0 == g_max_text_size) {
1462 if (strlen(text) <= 0) {
1463 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] Max Text Size is %d byte", g_max_text_size);
1464 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input text size is invalid. (max text size is unlimited.)");
1465 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1466 return TTS_ERROR_INVALID_PARAMETER;
1469 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] g_max_text_size is %d byte", g_max_text_size);
1470 if (g_max_text_size < strlen(text) || strlen(text) <= 0) {
1471 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input text size is invalid. current text_size(%d byte)", strlen(text));
1472 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1473 return TTS_ERROR_INVALID_PARAMETER;
1477 SLOG(LOG_DEBUG, TAG_TTSC, "Text is valid - text(%d byte) is '%s'", strlen(text), text);
1479 /* save texts for repetition */
1480 if (NULL != client->text_repeat) {
1481 free(client->text_repeat);
1482 client->text_repeat = NULL;
1485 client->text_repeat = strdup(text);
1487 if (NULL != g_language) {
1491 if (NULL == language)
1494 g_language = strdup(language);
1496 g_voice_type = voice_type;
1499 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);
1501 /* change default language value */
1504 if (NULL == language)
1505 temp = strdup("default");
1507 temp = strdup(language);
1509 client->current_utt_id++;
1510 if (client->current_utt_id == 10000) {
1511 client->current_utt_id = 1;
1517 bool is_prepared = false;
1519 ret = tts_dbus_request_add_text(client->uid, text, temp, voice_type, speed, client->current_utt_id, client->credential);
1522 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1523 client->current_state = TTS_STATE_CREATED;
1524 if (0 == tts_prepare_sync(tts)) {
1526 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
1528 } else if (TTS_ERROR_TIMED_OUT != ret) {
1529 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1532 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry add text : %s", __tts_get_error_code(ret));
1535 if (TTS_RETRY_MIN_COUNT == count) {
1536 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1542 *utt_id = client->current_utt_id;
1551 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1557 static void __tts_play_async(void *data)
1559 tts_h tts = (tts_h)data;
1560 tts_client_s* client = tts_client_get(tts);
1563 if (NULL == client) {
1564 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1570 bool is_prepared = false;
1572 ret = tts_dbus_request_play(client->uid, client->credential);
1574 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1575 client->current_state = TTS_STATE_CREATED;
1576 if (0 == tts_prepare_sync(tts)) {
1578 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
1580 } else if (TTS_ERROR_TIMED_OUT != ret) {
1581 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1584 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry play : %s", __tts_get_error_code(ret));
1587 if (TTS_RETRY_COUNT == count) {
1588 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1596 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to play tts : %s", __tts_get_error_code(ret));
1598 client->reason = ret;
1599 client->utt_id = -1;
1601 ecore_timer_add(0, __tts_notify_error, client->tts);
1605 client->before_state = client->current_state;
1606 client->current_state = TTS_STATE_PLAYING;
1608 if (NULL != client->state_changed_cb) {
1609 tts_client_use_callback(client);
1610 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1611 tts_client_not_use_callback(client);
1612 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1615 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1620 int tts_play_async(tts_h tts)
1622 if (0 != __tts_get_feature_enabled()) {
1623 return TTS_ERROR_NOT_SUPPORTED;
1626 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Play tts");
1629 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
1630 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1631 return TTS_ERROR_INVALID_PARAMETER;
1634 tts_client_s* client = tts_client_get(tts);
1636 if (NULL == client) {
1637 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
1638 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1639 return TTS_ERROR_INVALID_PARAMETER;
1642 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
1643 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
1644 return TTS_ERROR_INVALID_STATE;
1647 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1648 /* check screen reader vconf one more time */
1650 ret = __tts_recheck_screen_reader();
1652 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get screen reader vconf(%d)", ret);
1653 return TTS_ERROR_INVALID_STATE;
1655 if (false == g_screen_reader) {
1656 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Screen reader option is NOT available.");
1657 return TTS_ERROR_INVALID_STATE;
1662 if (true == client->credential_needed && NULL == client->credential) {
1663 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Do not have app credential for this engine");
1664 return TTS_ERROR_PERMISSION_DENIED;
1667 ecore_main_loop_thread_safe_call_async(__tts_play_async, (void*)tts);
1669 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1671 return TTS_ERROR_NONE;
1674 int tts_play(tts_h tts)
1676 if (0 != __tts_get_feature_enabled()) {
1677 return TTS_ERROR_NOT_SUPPORTED;
1680 SLOG(LOG_INFO, TAG_TTSC, "@@@ Play tts");
1685 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
1686 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1687 return TTS_ERROR_INVALID_PARAMETER;
1690 tts_client_s* client = tts_client_get(tts);
1692 if (NULL == client) {
1693 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
1694 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1695 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1696 return TTS_ERROR_INVALID_PARAMETER;
1699 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
1700 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
1701 return TTS_ERROR_INVALID_STATE;
1704 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1705 /* check screen reader option one more time */
1706 ret = __tts_recheck_screen_reader();
1708 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get screen reader vconf(%d)", ret);
1709 return TTS_ERROR_INVALID_STATE;
1711 if (false == g_screen_reader) {
1712 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Screen reader option is NOT available.");
1713 return TTS_ERROR_INVALID_STATE;
1718 if (true == client->credential_needed && NULL == client->credential) {
1719 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Do not have app credential for this engine");
1720 return TTS_ERROR_PERMISSION_DENIED;
1725 bool is_prepared = false;
1727 ret = tts_dbus_request_play(client->uid, client->credential);
1730 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1731 client->current_state = TTS_STATE_CREATED;
1732 if (0 == tts_prepare_sync(tts)) {
1734 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
1736 } else if (TTS_ERROR_TIMED_OUT != ret) {
1737 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1740 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry play : %s", __tts_get_error_code(ret));
1743 if (TTS_RETRY_COUNT == count) {
1744 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1752 client->before_state = client->current_state;
1753 client->current_state = TTS_STATE_PLAYING;
1755 if (NULL != client->state_changed_cb) {
1756 tts_client_use_callback(client);
1757 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1758 tts_client_not_use_callback(client);
1759 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1762 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1764 return TTS_ERROR_NONE;
1767 static void __tts_stop_async(void *data)
1769 tts_h tts = (tts_h)data;
1770 tts_client_s* client = tts_client_get(tts);
1773 if (NULL == client) {
1774 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1780 bool is_prepared = false;
1782 ret = tts_dbus_request_stop(client->uid);
1784 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1785 client->current_state = TTS_STATE_CREATED;
1786 if (0 == tts_prepare_sync(tts)) {
1788 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
1790 } else if (TTS_ERROR_TIMED_OUT != ret) {
1791 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1794 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry stop : %s", __tts_get_error_code(ret));
1797 if (TTS_RETRY_COUNT == count) {
1798 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1806 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to stop tts : %s", __tts_get_error_code(ret));
1808 client->reason = ret;
1809 client->utt_id = -1;
1811 ecore_timer_add(0, __tts_notify_error, client->tts);
1815 client->before_state = client->current_state;
1816 client->current_state = TTS_STATE_READY;
1818 if (NULL != client->state_changed_cb) {
1819 tts_client_use_callback(client);
1820 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1821 tts_client_not_use_callback(client);
1822 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1825 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1830 int tts_stop_aync(tts_h tts)
1832 if (0 != __tts_get_feature_enabled()) {
1833 return TTS_ERROR_NOT_SUPPORTED;
1836 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Stop tts");
1839 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1840 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1841 return TTS_ERROR_INVALID_PARAMETER;
1844 tts_client_s* client = tts_client_get(tts);
1846 if (NULL == client) {
1847 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1848 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1849 return TTS_ERROR_INVALID_PARAMETER;
1852 if (TTS_STATE_CREATED == client->current_state) {
1853 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
1854 return TTS_ERROR_INVALID_STATE;
1857 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1858 /* check screen reader option one more time */
1859 int ret = __tts_recheck_screen_reader();
1861 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get screen reader vconf(%d)", ret);
1862 return TTS_ERROR_INVALID_STATE;
1864 if (false == g_screen_reader) {
1865 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Screen reader option is NOT available.");
1866 return TTS_ERROR_INVALID_STATE;
1871 ecore_main_loop_thread_safe_call_async(__tts_stop_async, (void*)tts);
1873 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1875 return TTS_ERROR_NONE;
1878 int tts_stop(tts_h tts)
1880 if (0 != __tts_get_feature_enabled()) {
1881 return TTS_ERROR_NOT_SUPPORTED;
1884 SLOG(LOG_INFO, TAG_TTSC, "@@@ Stop tts");
1889 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1890 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1891 return TTS_ERROR_INVALID_PARAMETER;
1894 tts_client_s* client = tts_client_get(tts);
1896 if (NULL == client) {
1897 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1898 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1899 return TTS_ERROR_INVALID_PARAMETER;
1902 if (TTS_STATE_CREATED == client->current_state) {
1903 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
1904 return TTS_ERROR_INVALID_STATE;
1907 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1908 /* check screen reader option one more time */
1909 ret = __tts_recheck_screen_reader();
1911 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get screen reader vconf(%d)", ret);
1912 return TTS_ERROR_INVALID_STATE;
1914 if (false == g_screen_reader) {
1915 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Screen reader option is NOT available.");
1916 return TTS_ERROR_INVALID_STATE;
1923 bool is_prepared = false;
1925 ret = tts_dbus_request_stop(client->uid);
1928 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1929 client->current_state = TTS_STATE_CREATED;
1930 if (0 == tts_prepare_sync(tts)) {
1932 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
1934 } else if (TTS_ERROR_TIMED_OUT != ret) {
1935 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1938 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry stop : %s", __tts_get_error_code(ret));
1941 if (TTS_RETRY_COUNT == count) {
1942 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1950 client->before_state = client->current_state;
1951 client->current_state = TTS_STATE_READY;
1953 if (NULL != client->state_changed_cb) {
1954 tts_client_use_callback(client);
1955 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1956 tts_client_not_use_callback(client);
1957 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1960 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1962 return TTS_ERROR_NONE;
1965 static void __tts_pause_async(void *data)
1967 tts_h tts = (tts_h)data;
1968 tts_client_s* client = tts_client_get(tts);
1971 if (NULL == client) {
1972 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1978 bool is_prepared = false;
1980 ret = tts_dbus_request_pause(client->uid);
1982 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
1983 client->current_state = TTS_STATE_CREATED;
1984 if (0 == tts_prepare_sync(tts)) {
1986 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
1988 } else if (TTS_ERROR_TIMED_OUT != ret) {
1989 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1992 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry pause : %s", __tts_get_error_code(ret));
1995 if (TTS_RETRY_COUNT == count) {
1996 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
2004 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to pause tts : %s", __tts_get_error_code(ret));
2006 client->reason = ret;
2007 client->utt_id = -1;
2009 ecore_timer_add(0, __tts_notify_error, client->tts);
2013 client->before_state = client->current_state;
2014 client->current_state = TTS_STATE_PAUSED;
2016 if (NULL != client->state_changed_cb) {
2017 tts_client_use_callback(client);
2018 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
2019 tts_client_not_use_callback(client);
2020 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
2023 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2028 int tts_pause_async(tts_h tts)
2030 if (0 != __tts_get_feature_enabled()) {
2031 return TTS_ERROR_NOT_SUPPORTED;
2034 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Pause tts");
2037 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
2038 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2039 return TTS_ERROR_INVALID_PARAMETER;
2042 tts_client_s* client = tts_client_get(tts);
2044 if (NULL == client) {
2045 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
2046 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2047 return TTS_ERROR_INVALID_PARAMETER;
2050 if (TTS_STATE_PLAYING != client->current_state) {
2051 SLOG(LOG_ERROR, TAG_TTSC, "[Error] The Current state is NOT 'playing'. So this request should be not running.");
2052 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2053 return TTS_ERROR_INVALID_STATE;
2056 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
2057 /* check screen reader option one more time */
2058 int ret = __tts_recheck_screen_reader();
2060 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get screen reader vconf(%d)", ret);
2061 return TTS_ERROR_INVALID_STATE;
2063 if (false == g_screen_reader) {
2064 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Screen reader option is NOT available.");
2065 return TTS_ERROR_INVALID_STATE;
2070 ecore_main_loop_thread_safe_call_async(__tts_pause_async, (void*)tts);
2072 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2074 return TTS_ERROR_NONE;
2077 int tts_pause(tts_h tts)
2079 if (0 != __tts_get_feature_enabled()) {
2080 return TTS_ERROR_NOT_SUPPORTED;
2083 SLOG(LOG_INFO, TAG_TTSC, "@@@ Pause tts");
2088 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
2089 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2090 return TTS_ERROR_INVALID_PARAMETER;
2093 tts_client_s* client = tts_client_get(tts);
2095 if (NULL == client) {
2096 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
2097 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2098 return TTS_ERROR_INVALID_PARAMETER;
2101 if (TTS_STATE_PLAYING != client->current_state) {
2102 SLOG(LOG_ERROR, TAG_TTSC, "[Error] The Current state is NOT 'playing'. So this request should be not running.");
2103 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2104 return TTS_ERROR_INVALID_STATE;
2107 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
2108 ret = __tts_recheck_screen_reader();
2110 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get screen reader vconf(%d)", ret);
2111 return TTS_ERROR_INVALID_STATE;
2113 if (false == g_screen_reader) {
2114 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Screen reader option is NOT available.");
2115 return TTS_ERROR_INVALID_STATE;
2122 bool is_prepared = false;
2124 ret = tts_dbus_request_pause(client->uid);
2127 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2128 client->current_state = TTS_STATE_CREATED;
2129 if (0 == tts_prepare_sync(tts)) {
2131 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
2133 } else if (TTS_ERROR_TIMED_OUT != ret) {
2134 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
2137 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry pause : %s", __tts_get_error_code(ret));
2140 if (TTS_RETRY_COUNT == count) {
2141 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
2149 client->before_state = client->current_state;
2150 client->current_state = TTS_STATE_PAUSED;
2152 if (NULL != client->state_changed_cb) {
2153 tts_client_use_callback(client);
2154 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
2155 tts_client_not_use_callback(client);
2156 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
2159 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2161 return TTS_ERROR_NONE;
2164 int tts_set_private_data(tts_h tts, const char* key, const char* data)
2166 if (0 != __tts_get_feature_enabled()) {
2167 return TTS_ERROR_NOT_SUPPORTED;
2170 SLOG(LOG_INFO, TAG_TTSC, "@@@ Set private data, key(%s), data(%s)", key, data);
2173 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
2174 return TTS_ERROR_INVALID_PARAMETER;
2177 if (NULL == key || NULL == data) {
2178 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid parameter");
2179 return TTS_ERROR_INVALID_PARAMETER;
2182 tts_client_s* client = tts_client_get(tts);
2184 if (NULL == client) {
2185 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
2186 return TTS_ERROR_INVALID_PARAMETER;
2189 if (TTS_STATE_READY != client->current_state) {
2190 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid state : Current state is NOT 'READY'");
2191 return TTS_ERROR_INVALID_STATE;
2194 if (true != client->internal && (0 == strcmp(key, "EnableServerTTS") || 0 == strcmp(key, "DisableServerTTS"))) {
2195 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] This is not an internal app");
2196 return TTS_ERROR_INVALID_PARAMETER;
2201 bool is_prepared = false;
2203 ret = tts_dbus_request_set_private_data(client->uid, key, data);
2206 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2207 client->current_state = TTS_STATE_CREATED;
2208 if (0 == tts_prepare_sync(tts)) {
2210 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
2212 } else if (TTS_ERROR_TIMED_OUT != ret) {
2213 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
2216 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry : %s", __tts_get_error_code(ret));
2219 if (TTS_RETRY_COUNT == count) {
2220 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
2228 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2233 int tts_get_private_data(tts_h tts, const char* key, char** data)
2235 if (0 != __tts_get_feature_enabled()) {
2236 return TTS_ERROR_NOT_SUPPORTED;
2239 SLOG(LOG_INFO, TAG_TTSC, "@@@ Get private data, key(%s)", key);
2242 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
2243 return TTS_ERROR_INVALID_PARAMETER;
2246 if (NULL == key || NULL == data) {
2247 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid parameter");
2248 return TTS_ERROR_INVALID_PARAMETER;
2251 tts_client_s* client = tts_client_get(tts);
2253 if (NULL == client) {
2254 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
2255 return TTS_ERROR_INVALID_PARAMETER;
2258 if (TTS_STATE_READY != client->current_state) {
2259 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid state : Current state is NOT 'READY'");
2260 return TTS_ERROR_INVALID_STATE;
2265 bool is_prepared = false;
2267 ret = tts_dbus_request_get_private_data(client->uid, key, data);
2270 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2271 client->current_state = TTS_STATE_CREATED;
2272 if (0 == tts_prepare_sync(tts)) {
2274 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
2276 } else if (TTS_ERROR_TIMED_OUT != ret) {
2277 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
2280 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry : %s", __tts_get_error_code(ret));
2283 if (TTS_RETRY_COUNT == count) {
2284 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
2292 if (0 == strncmp(*data, "NULL", strlen(*data))) {
2297 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2303 static Eina_Bool __tts_notify_error(void *data)
2305 tts_h tts = (tts_h)data;
2307 tts_client_s* client = tts_client_get(tts);
2310 if (NULL == client) {
2311 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify error msg : A handle is not valid");
2315 SLOG(LOG_DEBUG, TAG_TTSC, "Error data : uttid(%d) reason(%s)", client->utt_id, __tts_get_error_code(client->reason));
2317 if (NULL != client->error_cb) {
2318 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of error");
2319 tts_client_use_callback(client);
2320 g_err_callback_status = true;
2321 client->error_cb(client->tts, client->utt_id, client->reason, client->error_user_data);
2322 g_err_callback_status = false;
2323 tts_client_not_use_callback(client);
2325 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
2331 static void __start_reprepare_thread(void* data, Ecore_Thread* thread)
2333 SLOG(LOG_ERROR, TAG_TTSC, "[DEBUG] start reprepare thread. engine update status(%d)", g_engine_update_status);
2335 tts_client_s* temp = (tts_client_s*)data;
2337 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] data is null");
2342 while (!g_engine_update_status && (cnt < 10)) {
2343 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] wait for starting update");
2348 SLOG(LOG_ERROR, TAG_TTSC, "[DEBUG] update status(%d)", g_engine_update_status);
2350 while (g_engine_update_status && (NULL != g_pkgmgr)) {
2351 // SLOG(LOG_WARN, TAG_TTSC, "[WARNING] wait for finishing update");
2355 SLOG(LOG_INFO, TAG_TTSC, "[INFO] finish updating. request to prepare");
2357 if (0 != tts_prepare(temp->tts)) {
2358 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare");
2364 static void __end_reprepare_thread(void* data, Ecore_Thread* thread)
2366 SLOG(LOG_INFO, TAG_TTSC, "[INFO] end reprepare thread");
2369 int __tts_cb_error(int uid, tts_error_e reason, int utt_id, char* err_msg)
2372 GList* client_list = NULL;
2373 client_list = tts_client_get_client_list();
2376 tts_client_s *data = NULL;
2378 if (g_list_length(client_list) > 0) {
2379 /* Get a first item */
2380 iter = g_list_first(client_list);
2382 while (NULL != iter) {
2385 data->utt_id = utt_id;
2386 data->reason = reason;
2387 if (NULL != data->err_msg) {
2388 free(data->err_msg);
2389 data->err_msg = NULL;
2391 if (NULL != err_msg)
2392 data->err_msg = strdup(err_msg);
2394 /* call callback function */
2395 if (NULL != data->error_cb) {
2396 ecore_timer_add(0, __tts_notify_error, data->tts);
2398 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
2401 if (TTS_ERROR_SERVICE_RESET == reason) {
2402 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Service Reset");
2404 data->current_state = TTS_STATE_CREATED;
2406 ecore_thread_run(__start_reprepare_thread, __end_reprepare_thread, NULL, data);
2410 iter = g_list_next(iter);
2414 tts_client_s* client = tts_client_get_by_uid(uid);
2416 if (NULL == client) {
2417 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
2418 return TTS_ERROR_INVALID_PARAMETER;
2421 client->utt_id = utt_id;
2422 client->reason = reason;
2423 if (NULL != client->err_msg) {
2424 free(client->err_msg);
2425 client->err_msg = NULL;
2427 if (NULL != err_msg)
2428 client->err_msg = strdup(err_msg);
2430 /* call callback function */
2431 if (NULL != client->error_cb) {
2432 ecore_timer_add(0, __tts_notify_error, client->tts);
2434 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
2437 if (TTS_ERROR_SERVICE_RESET == reason) {
2438 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Service Reset");
2440 client->current_state = TTS_STATE_CREATED;
2442 ecore_thread_run(__start_reprepare_thread, __end_reprepare_thread, NULL, client);
2449 static Eina_Bool __tts_notify_state_changed(void *data)
2451 tts_h tts = (tts_h)data;
2453 tts_client_s* client = tts_client_get(tts);
2456 if (NULL == client) {
2457 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify state changed : A handle is not valid");
2458 g_check_state_timer = NULL;
2462 if (NULL != client->state_changed_cb) {
2463 tts_client_use_callback(client);
2464 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
2465 tts_client_not_use_callback(client);
2466 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called : pre(%d) cur(%d)", client->before_state, client->current_state);
2468 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
2471 g_check_state_timer = NULL;
2476 int __tts_cb_set_state(int uid, int state)
2478 tts_client_s* client = tts_client_get_by_uid(uid);
2479 if (NULL == client) {
2480 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] The handle is not valid");
2484 tts_state_e state_from_daemon = (tts_state_e)state;
2486 if (client->current_state == state_from_daemon) {
2487 SLOG(LOG_DEBUG, TAG_TTSC, "Current state has already been %d", client->current_state);
2491 if (NULL != client->state_changed_cb) {
2492 if (NULL != g_check_state_timer) {
2493 ecore_timer_del(g_check_state_timer);
2494 g_check_state_timer = NULL;
2496 g_check_state_timer = ecore_timer_add(0, __tts_notify_state_changed, client->tts);
2498 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
2501 client->before_state = client->current_state;
2502 client->current_state = state_from_daemon;
2508 int __tts_cb_utt_started(int uid, int utt_id)
2510 tts_client_s* client = tts_client_get_by_uid(uid);
2512 if (NULL == client) {
2513 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
2514 return TTS_ERROR_INVALID_PARAMETER;
2517 SLOG(LOG_INFO, TAG_TTSC, "utterance started : utt id(%d) ", utt_id);
2519 client->utt_id = utt_id;
2521 /* call callback function */
2522 if (NULL != client->utt_started_cb) {
2523 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance started ");
2524 tts_client_use_callback(client);
2525 client->utt_started_cb(client->tts, client->utt_id, client->utt_started_user_data);
2526 tts_client_not_use_callback(client);
2528 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance started ");
2534 int __tts_cb_utt_completed(int uid, int utt_id)
2536 tts_client_s* client = tts_client_get_by_uid(uid);
2538 if (NULL == client) {
2539 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
2540 return TTS_ERROR_INVALID_PARAMETER;
2543 SLOG(LOG_INFO, TAG_TTSC, "utterance completed : uttid(%d) ", utt_id);
2545 client->utt_id = utt_id;
2547 /* call callback function */
2548 if (NULL != client->utt_completeted_cb) {
2549 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance completed ");
2550 tts_client_use_callback(client);
2551 client->utt_completeted_cb(client->tts, client->utt_id, client->utt_completed_user_data);
2552 tts_client_not_use_callback(client);
2554 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance completed ");
2560 int tts_set_state_changed_cb(tts_h tts, tts_state_changed_cb callback, void* user_data)
2562 if (0 != __tts_get_feature_enabled()) {
2563 return TTS_ERROR_NOT_SUPPORTED;
2566 if (NULL == tts || NULL == callback) {
2567 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Input parameter is null");
2568 return TTS_ERROR_INVALID_PARAMETER;
2571 tts_client_s* client = tts_client_get(tts);
2573 if (NULL == client) {
2574 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : A handle is not valid");
2575 return TTS_ERROR_INVALID_PARAMETER;
2578 if (TTS_STATE_CREATED != client->current_state) {
2579 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Current state is not 'Created'.");
2580 return TTS_ERROR_INVALID_STATE;
2583 client->state_changed_cb = callback;
2584 client->state_changed_user_data = user_data;
2586 SLOG(LOG_INFO, TAG_TTSC, "[SUCCESS] Set state changed cb");
2591 int tts_unset_state_changed_cb(tts_h tts)
2593 if (0 != __tts_get_feature_enabled()) {
2594 return TTS_ERROR_NOT_SUPPORTED;
2598 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Input parameter is null");
2599 return TTS_ERROR_INVALID_PARAMETER;
2602 tts_client_s* client = tts_client_get(tts);
2604 if (NULL == client) {
2605 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : A handle is not valid");
2606 return TTS_ERROR_INVALID_PARAMETER;
2609 if (TTS_STATE_CREATED != client->current_state) {
2610 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Current state is not 'Created'.");
2611 return TTS_ERROR_INVALID_STATE;
2614 client->state_changed_cb = NULL;
2615 client->state_changed_user_data = NULL;
2617 if (NULL != g_check_state_timer) {
2618 ecore_timer_del(g_check_state_timer);
2619 g_check_state_timer = NULL;
2622 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset state changed cb");
2627 int tts_set_utterance_started_cb(tts_h tts, tts_utterance_started_cb callback, void* user_data)
2629 if (0 != __tts_get_feature_enabled()) {
2630 return TTS_ERROR_NOT_SUPPORTED;
2633 if (NULL == tts || NULL == callback) {
2634 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Input parameter is null");
2635 return TTS_ERROR_INVALID_PARAMETER;
2638 tts_client_s* client = tts_client_get(tts);
2640 if (NULL == client) {
2641 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : A handle is not valid");
2642 return TTS_ERROR_INVALID_PARAMETER;
2645 if (TTS_STATE_CREATED != client->current_state) {
2646 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Current state is not 'Created'.");
2647 return TTS_ERROR_INVALID_STATE;
2650 client->utt_started_cb = callback;
2651 client->utt_started_user_data = user_data;
2653 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt started cb");
2658 int tts_unset_utterance_started_cb(tts_h tts)
2660 if (0 != __tts_get_feature_enabled()) {
2661 return TTS_ERROR_NOT_SUPPORTED;
2665 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Input parameter is null");
2666 return TTS_ERROR_INVALID_PARAMETER;
2669 tts_client_s* client = tts_client_get(tts);
2671 if (NULL == client) {
2672 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : A handle is not valid");
2673 return TTS_ERROR_INVALID_PARAMETER;
2676 if (TTS_STATE_CREATED != client->current_state) {
2677 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Current state is not 'Created'.");
2678 return TTS_ERROR_INVALID_STATE;
2681 client->utt_started_cb = NULL;
2682 client->utt_started_user_data = NULL;
2684 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt started cb");
2689 int tts_set_utterance_completed_cb(tts_h tts, tts_utterance_completed_cb callback, void* user_data)
2691 if (0 != __tts_get_feature_enabled()) {
2692 return TTS_ERROR_NOT_SUPPORTED;
2695 if (NULL == tts || NULL == callback) {
2696 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Input parameter is null");
2697 return TTS_ERROR_INVALID_PARAMETER;
2700 tts_client_s* client = tts_client_get(tts);
2702 if (NULL == client) {
2703 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : A handle is not valid");
2704 return TTS_ERROR_INVALID_PARAMETER;
2707 if (TTS_STATE_CREATED != client->current_state) {
2708 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Current state is not 'Created'.");
2709 return TTS_ERROR_INVALID_STATE;
2712 client->utt_completeted_cb = callback;
2713 client->utt_completed_user_data = user_data;
2715 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt completed cb");
2720 int tts_unset_utterance_completed_cb(tts_h tts)
2722 if (0 != __tts_get_feature_enabled()) {
2723 return TTS_ERROR_NOT_SUPPORTED;
2727 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Input parameter is null");
2728 return TTS_ERROR_INVALID_PARAMETER;
2731 tts_client_s* client = tts_client_get(tts);
2733 if (NULL == client) {
2734 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : A handle is not valid");
2735 return TTS_ERROR_INVALID_PARAMETER;
2738 if (TTS_STATE_CREATED != client->current_state) {
2739 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Current state is not 'Created'.");
2740 return TTS_ERROR_INVALID_STATE;
2743 client->utt_completeted_cb = NULL;
2744 client->utt_completed_user_data = NULL;
2746 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt completed cb");
2750 int tts_set_error_cb(tts_h tts, tts_error_cb callback, void* user_data)
2752 if (0 != __tts_get_feature_enabled()) {
2753 return TTS_ERROR_NOT_SUPPORTED;
2756 if (NULL == tts || NULL == callback) {
2757 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Input parameter is null");
2758 return TTS_ERROR_INVALID_PARAMETER;
2761 tts_client_s* client = tts_client_get(tts);
2763 if (NULL == client) {
2764 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : A handle is not valid");
2765 return TTS_ERROR_INVALID_PARAMETER;
2768 if (TTS_STATE_CREATED != client->current_state) {
2769 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Current state is not 'Created'.");
2770 return TTS_ERROR_INVALID_STATE;
2773 client->error_cb = callback;
2774 client->error_user_data = user_data;
2776 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set error cb");
2781 int tts_unset_error_cb(tts_h tts)
2783 if (0 != __tts_get_feature_enabled()) {
2784 return TTS_ERROR_NOT_SUPPORTED;
2788 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Input parameter is null");
2789 return TTS_ERROR_INVALID_PARAMETER;
2792 tts_client_s* client = tts_client_get(tts);
2794 if (NULL == client) {
2795 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : A handle is not valid");
2796 return TTS_ERROR_INVALID_PARAMETER;
2799 if (TTS_STATE_CREATED != client->current_state) {
2800 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Current state is not 'Created'.");
2801 return TTS_ERROR_INVALID_STATE;
2804 client->error_cb = NULL;
2805 client->error_user_data = NULL;
2807 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset error cb");
2812 int tts_set_default_voice_changed_cb(tts_h tts, tts_default_voice_changed_cb callback, void* user_data)
2814 if (0 != __tts_get_feature_enabled()) {
2815 return TTS_ERROR_NOT_SUPPORTED;
2818 if (NULL == tts || NULL == callback) {
2819 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : Input parameter is null");
2820 return TTS_ERROR_INVALID_PARAMETER;
2823 tts_client_s* client = tts_client_get(tts);
2825 if (NULL == client) {
2826 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : A handle is not valid");
2827 return TTS_ERROR_INVALID_PARAMETER;
2830 if (TTS_STATE_CREATED != client->current_state) {
2831 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : Current state is not 'Created'.");
2832 return TTS_ERROR_INVALID_STATE;
2835 client->default_voice_changed_cb = callback;
2836 client->default_voice_changed_user_data = user_data;
2838 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set default voice changed cb");
2843 int tts_unset_default_voice_changed_cb(tts_h tts)
2845 if (0 != __tts_get_feature_enabled()) {
2846 return TTS_ERROR_NOT_SUPPORTED;
2850 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : Input parameter is null");
2851 return TTS_ERROR_INVALID_PARAMETER;
2854 tts_client_s* client = tts_client_get(tts);
2856 if (NULL == client) {
2857 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : A handle is not valid");
2858 return TTS_ERROR_INVALID_PARAMETER;
2861 if (TTS_STATE_CREATED != client->current_state) {
2862 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : Current state is not 'Created'.");
2863 return TTS_ERROR_INVALID_STATE;
2866 client->default_voice_changed_cb = NULL;
2867 client->default_voice_changed_user_data = NULL;
2869 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset default voice changed cb");
2874 int tts_set_engine_changed_cb(tts_h tts, tts_engine_changed_cb callback, void* user_data)
2876 if (0 != __tts_get_feature_enabled()) {
2877 return TTS_ERROR_NOT_SUPPORTED;
2880 if (NULL == tts || NULL == callback) {
2881 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set engine changed cb : Input parameter is null");
2882 return TTS_ERROR_INVALID_PARAMETER;
2885 tts_client_s* client = tts_client_get(tts);
2887 if (NULL == client) {
2888 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set engine changed cb : A handle is not valid");
2889 return TTS_ERROR_INVALID_PARAMETER;
2892 if (TTS_STATE_CREATED != client->current_state) {
2893 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set engine changed cb : Current state is not 'Created'.");
2894 return TTS_ERROR_INVALID_STATE;
2897 client->engine_changed_cb = callback;
2898 client->engine_changed_user_data = user_data;
2900 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set engine changed cb");
2905 int tts_unset_engine_changed_cb(tts_h tts)
2907 if (0 != __tts_get_feature_enabled()) {
2908 return TTS_ERROR_NOT_SUPPORTED;
2912 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset engine changed cb : Input parameter is null");
2913 return TTS_ERROR_INVALID_PARAMETER;
2916 tts_client_s* client = tts_client_get(tts);
2918 if (NULL == client) {
2919 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset engine changed cb : A handle is not valid");
2920 return TTS_ERROR_INVALID_PARAMETER;
2923 if (TTS_STATE_CREATED != client->current_state) {
2924 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset engine changed cb : Current state is not 'Created'.");
2925 return TTS_ERROR_INVALID_STATE;
2928 client->engine_changed_cb = NULL;
2929 client->engine_changed_user_data = NULL;
2931 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset engine changed cb");
2937 int tts_add_pcm(tts_h tts, int event, const void* data, unsigned int data_size, int audio_type, int rate)
2939 if (0 != __tts_get_feature_enabled()) {
2940 return TTS_ERROR_NOT_SUPPORTED;
2943 SLOG(LOG_INFO, TAG_TTSC, "@@@ Add pcm tts");
2948 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
2949 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2950 return TTS_ERROR_INVALID_PARAMETER;
2953 tts_client_s* client = tts_client_get(tts);
2955 if (NULL == client) {
2956 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
2957 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
2958 return TTS_ERROR_INVALID_PARAMETER;
2961 if (TTS_STATE_CREATED == client->current_state) {
2962 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
2963 return TTS_ERROR_INVALID_STATE;
2966 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
2967 ret = __tts_recheck_screen_reader();
2969 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get screen reader vconf(%d)", ret);
2970 return TTS_ERROR_INVALID_STATE;
2972 if (false == g_screen_reader) {
2973 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Screen reader option is NOT available.");
2974 return TTS_ERROR_INVALID_STATE;
2981 bool is_prepared = false;
2983 ret = tts_dbus_request_add_pcm(client->uid, event, data, data_size, audio_type, rate);
2985 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
2986 client->current_state = TTS_STATE_CREATED;
2987 if (0 == tts_prepare_sync(tts)) {
2989 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
2991 } else if (TTS_ERROR_TIMED_OUT != ret) {
2992 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
2995 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry add pcm : %s", __tts_get_error_code(ret));
2998 if (TTS_RETRY_COUNT == count) {
2999 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
3006 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
3008 return TTS_ERROR_NONE;
3011 int tts_play_pcm(tts_h tts)
3013 if (0 != __tts_get_feature_enabled()) {
3014 return TTS_ERROR_NOT_SUPPORTED;
3017 SLOG(LOG_INFO, TAG_TTSC, "@@@ Play pcm tts");
3022 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
3023 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
3024 return TTS_ERROR_INVALID_PARAMETER;
3027 tts_client_s* client = tts_client_get(tts);
3029 if (NULL == client) {
3030 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
3031 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
3032 return TTS_ERROR_INVALID_PARAMETER;
3035 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
3036 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
3037 return TTS_ERROR_INVALID_STATE;
3040 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
3041 ret = __tts_recheck_screen_reader();
3043 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get screen reader vconf(%d)", ret);
3044 return TTS_ERROR_INVALID_STATE;
3046 if (false == g_screen_reader) {
3047 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Screen reader option is NOT available.");
3048 return TTS_ERROR_INVALID_STATE;
3055 bool is_prepared = false;
3057 ret = tts_dbus_request_play_pcm(client->uid);
3059 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
3060 client->current_state = TTS_STATE_CREATED;
3061 if (0 == tts_prepare_sync(tts)) {
3063 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
3065 } else if (TTS_ERROR_TIMED_OUT != ret) {
3066 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
3069 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry play pcm : %s", __tts_get_error_code(ret));
3072 if (TTS_RETRY_COUNT == count) {
3073 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
3080 client->before_state = client->current_state;
3081 client->current_state = TTS_STATE_PLAYING;
3083 if (NULL != client->state_changed_cb) {
3084 tts_client_use_callback(client);
3085 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
3086 tts_client_not_use_callback(client);
3087 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
3090 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
3092 return TTS_ERROR_NONE;
3095 int tts_stop_pcm(tts_h tts)
3097 if (0 != __tts_get_feature_enabled()) {
3098 return TTS_ERROR_NOT_SUPPORTED;
3101 SLOG(LOG_INFO, TAG_TTSC, "@@@ Stop pcm tts");
3106 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
3107 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
3108 return TTS_ERROR_INVALID_PARAMETER;
3111 tts_client_s* client = tts_client_get(tts);
3113 if (NULL == client) {
3114 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
3115 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
3116 return TTS_ERROR_INVALID_PARAMETER;
3119 if (TTS_STATE_CREATED == client->current_state) {
3120 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
3121 return TTS_ERROR_INVALID_STATE;
3124 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
3125 ret = __tts_recheck_screen_reader();
3127 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get screen reader vconf(%d)", ret);
3128 return TTS_ERROR_INVALID_STATE;
3130 if (false == g_screen_reader) {
3131 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Screen reader option is NOT available.");
3132 return TTS_ERROR_INVALID_STATE;
3139 bool is_prepared = false;
3141 ret = tts_dbus_request_stop_pcm(client->uid);
3143 if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) {
3144 client->current_state = TTS_STATE_CREATED;
3145 if (0 == tts_prepare_sync(tts)) {
3147 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Success tts_prepare_sync");
3149 } else if (TTS_ERROR_TIMED_OUT != ret) {
3150 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
3153 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry stop pcm : %s", __tts_get_error_code(ret));
3156 if (TTS_RETRY_COUNT == count) {
3157 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
3164 client->before_state = client->current_state;
3165 client->current_state = TTS_STATE_READY;
3167 if (NULL != client->state_changed_cb) {
3168 tts_client_use_callback(client);
3169 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
3170 tts_client_not_use_callback(client);
3171 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
3174 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
3176 return TTS_ERROR_NONE;
3180 int tts_repeat(tts_h tts, char** text_repeat, int* utt_id)
3182 if (0 != __tts_get_feature_enabled()) {
3183 return TTS_ERROR_NOT_SUPPORTED;
3186 SLOG(LOG_INFO, TAG_TTSC, "@@@ Repeat TTS");
3189 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
3190 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
3191 return TTS_ERROR_INVALID_PARAMETER;
3194 if (NULL == text_repeat || NULL == utt_id) {
3195 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null.");
3196 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
3197 return TTS_ERROR_INVALID_PARAMETER;
3200 *text_repeat = NULL;
3203 tts_client_s* client = tts_client_get(tts);
3205 if (NULL == client) {
3206 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
3207 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
3208 return TTS_ERROR_INVALID_PARAMETER;
3211 if (TTS_STATE_READY != client->current_state) {
3212 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid. (%d)", client->current_state);
3213 return TTS_ERROR_INVALID_STATE;
3216 /* Clear the legacy and Add texts to be played repeatedly */
3218 ret = tts_stop(tts);
3219 if (TTS_ERROR_NONE != ret) {
3220 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to clear the legacy");
3224 if (NULL != client->text_repeat) {
3225 char* tmp_text = strdup(client->text_repeat);
3226 char* tmp_lang = NULL;
3227 if (NULL != g_language) {
3228 tmp_lang = strdup(g_language);
3230 ret = tts_add_text(tts, tmp_text, tmp_lang, g_voice_type, g_speed, utt_id);
3231 if (TTS_ERROR_NONE != ret) {
3232 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to add texts for repetition.");
3233 if (NULL != tmp_text) {
3237 if (NULL != tmp_lang) {
3243 *text_repeat = strdup(client->text_repeat);
3244 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] text to repeat(%s), utt_id(%d)", (*text_repeat) ? *text_repeat : "NULL", *utt_id);
3245 if (NULL != tmp_text) {
3249 if (NULL != tmp_lang) {
3254 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] There is no previous added texts. Please add texts");
3255 return TTS_ERROR_OPERATION_FAILED;
3258 /* Play added texts */
3259 ret = tts_play(tts);
3260 if (TTS_ERROR_NONE != ret) {
3261 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to play texts for repetition.");
3262 if (NULL != *text_repeat) {
3264 *text_repeat = NULL;
3270 return TTS_ERROR_NONE;