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.
18 #include <sys/types.h>
20 #include <system_info.h>
24 #include "tts_client.h"
25 #include "tts_config_mgr.h"
30 static bool g_screen_reader;
32 static int g_feature_enabled = -1;
34 static bool g_err_callback_status = false;
36 /* Function definition */
37 static Eina_Bool __tts_notify_state_changed(void *data);
38 static Eina_Bool __tts_notify_error(void *data);
45 static int __tts_get_feature_enabled()
47 if (0 == g_feature_enabled) {
48 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS feature NOT supported");
49 return TTS_ERROR_NOT_SUPPORTED;
50 } else if (-1 == g_feature_enabled) {
51 bool tts_supported = false;
52 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
53 if (false == tts_supported) {
54 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS feature NOT supported");
55 g_feature_enabled = 0;
56 return TTS_ERROR_NOT_SUPPORTED;
59 g_feature_enabled = 1;
61 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get feature value");
62 return TTS_ERROR_NOT_SUPPORTED;
69 static const char* __tts_get_error_code(tts_error_e err)
72 case TTS_ERROR_NONE: return "TTS_ERROR_NONE";
73 case TTS_ERROR_OUT_OF_MEMORY: return "TTS_ERROR_OUT_OF_MEMORY";
74 case TTS_ERROR_IO_ERROR: return "TTS_ERROR_IO_ERROR";
75 case TTS_ERROR_INVALID_PARAMETER: return "TTS_ERROR_INVALID_PARAMETER";
76 case TTS_ERROR_OUT_OF_NETWORK: return "TTS_ERROR_OUT_OF_NETWORK";
77 case TTS_ERROR_TIMED_OUT: return "TTS_ERROR_TIMED_OUT";
78 case TTS_ERROR_PERMISSION_DENIED: return "TTS_ERROR_PERMISSION_DENIED";
79 case TTS_ERROR_NOT_SUPPORTED: return "TTS_ERROR_NOT_SUPPORTED";
80 case TTS_ERROR_INVALID_STATE: return "TTS_ERROR_INVALID_STATE";
81 case TTS_ERROR_INVALID_VOICE: return "TTS_ERROR_INVALID_VOICE";
82 case TTS_ERROR_ENGINE_NOT_FOUND: return "TTS_ERROR_ENGINE_NOT_FOUND";
83 case TTS_ERROR_OPERATION_FAILED: return "TTS_ERROR_OPERATION_FAILED";
84 case TTS_ERROR_AUDIO_POLICY_BLOCKED: return "TTS_ERROR_AUDIO_POLICY_BLOCKED";
85 case TTS_ERROR_NOT_SUPPORTED_FEATURE: return "TTS_ERROR_NOT_SUPPORTED_FEATURE";
86 case TTS_ERROR_SERVICE_RESET: return "TTS_ERROR_SERVICE_RESET";
88 return "Invalid error code";
93 static int __tts_convert_config_error_code(tts_config_error_e code)
95 if (code == TTS_CONFIG_ERROR_NONE) return TTS_ERROR_NONE;
96 if (code == TTS_CONFIG_ERROR_OUT_OF_MEMORY) return TTS_ERROR_OUT_OF_MEMORY;
97 if (code == TTS_CONFIG_ERROR_IO_ERROR) return TTS_ERROR_IO_ERROR;
98 if (code == TTS_CONFIG_ERROR_INVALID_PARAMETER) return TTS_ERROR_INVALID_PARAMETER;
99 if (code == TTS_CONFIG_ERROR_INVALID_STATE) return TTS_ERROR_INVALID_STATE;
100 if (code == TTS_CONFIG_ERROR_INVALID_VOICE) return TTS_ERROR_INVALID_VOICE;
101 if (code == TTS_CONFIG_ERROR_ENGINE_NOT_FOUND) return TTS_ERROR_ENGINE_NOT_FOUND;
102 if (code == TTS_CONFIG_ERROR_OPERATION_FAILED) return TTS_ERROR_OPERATION_FAILED;
103 if (code == TTS_CONFIG_ERROR_NOT_SUPPORTED_FEATURE) return TTS_ERROR_NOT_SUPPORTED_FEATURE;
108 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)
110 SLOG(LOG_DEBUG, TAG_TTSC, "Voice changed : Before lang(%s) type(%d) , Current lang(%s), type(%d)",
111 before_lang, before_voice_type, language, voice_type);
113 GList* client_list = NULL;
114 client_list = tts_client_get_client_list();
117 tts_client_s *data = NULL;
119 if (g_list_length(client_list) > 0) {
120 /* Get a first item */
121 iter = g_list_first(client_list);
123 while (NULL != iter) {
125 if (NULL != data->default_voice_changed_cb) {
126 SLOG(LOG_DEBUG, TAG_TTSC, "Call default voice changed callback : uid(%d)", data->uid);
127 data->default_voice_changed_cb(data->tts, before_lang, before_voice_type,
128 language, voice_type, data->default_voice_changed_user_data);
132 iter = g_list_next(iter);
139 int tts_create(tts_h* tts)
141 if (0 != __tts_get_feature_enabled()) {
142 return TTS_ERROR_NOT_SUPPORTED;
145 SLOG(LOG_DEBUG, TAG_TTSC, "===== Create TTS");
149 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
150 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
151 SLOG(LOG_DEBUG, TAG_TTSC, " ");
152 return TTS_ERROR_INVALID_PARAMETER;
155 if (0 == tts_client_get_size()) {
156 if (0 != tts_dbus_open_connection()) {
157 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to open dbus connection");
158 return TTS_ERROR_OPERATION_FAILED;
162 if (0 != tts_client_new(tts)) {
163 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to create client!!!!!");
164 return TTS_ERROR_OUT_OF_MEMORY;
167 tts_client_s* client = tts_client_get(*tts);
168 if (NULL == client) {
169 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get client");
170 return TTS_ERROR_OPERATION_FAILED;
173 int ret = tts_config_mgr_initialize(client->uid);
175 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to init config manager : %d", ret);
176 tts_client_destroy(*tts);
177 return __tts_convert_config_error_code(ret);
180 ret = tts_config_mgr_set_callback(client->uid, NULL, __tts_config_voice_changed_cb, NULL, NULL, NULL);
182 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to set config changed : %d", ret);
183 tts_client_destroy(*tts);
184 return __tts_convert_config_error_code(ret);
187 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
188 SLOG(LOG_DEBUG, TAG_TTSC, " ");
190 return TTS_ERROR_NONE;
193 int tts_destroy(tts_h tts)
195 if (0 != __tts_get_feature_enabled()) {
196 return TTS_ERROR_NOT_SUPPORTED;
199 SLOG(LOG_DEBUG, TAG_TTSC, "===== Destroy TTS");
202 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
203 return TTS_ERROR_INVALID_PARAMETER;
206 tts_client_s* client = tts_client_get(tts);
209 if (NULL == client) {
210 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
211 return TTS_ERROR_INVALID_PARAMETER;
214 /* check used callback */
215 if (0 != tts_client_get_use_callback(client)) {
216 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Cannot destroy in Callback function");
217 return TTS_ERROR_OPERATION_FAILED;
220 tts_config_mgr_finalize(client->uid);
226 switch (client->current_state) {
227 case TTS_STATE_PAUSED:
228 case TTS_STATE_PLAYING:
229 case TTS_STATE_READY:
230 if (!(false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode)) {
232 ret = tts_dbus_request_finalize(client->uid);
234 if (TTS_ERROR_TIMED_OUT != ret) {
235 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
238 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry finalize");
241 if (TTS_RETRY_COUNT == count) {
242 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
249 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Do not request finalize : g_sr(%d) mode(%d)", g_screen_reader, client->mode);
252 client->before_state = client->current_state;
253 client->current_state = TTS_STATE_CREATED;
255 case TTS_STATE_CREATED:
256 if (NULL != client->conn_timer) {
257 SLOG(LOG_DEBUG, TAG_TTSC, "Connect Timer is deleted");
258 ecore_timer_del(client->conn_timer);
259 client->conn_timer = NULL;
262 tts_client_destroy(tts);
269 if (0 == tts_client_get_size()) {
270 if (0 != tts_dbus_close_connection()) {
271 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to close connection");
277 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
278 SLOG(LOG_DEBUG, TAG_TTSC, " ");
280 return TTS_ERROR_NONE;
283 void __tts_screen_reader_changed_cb(bool value)
285 g_screen_reader = value;
288 int tts_set_mode(tts_h tts, tts_mode_e mode)
290 if (0 != __tts_get_feature_enabled()) {
291 return TTS_ERROR_NOT_SUPPORTED;
294 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set TTS mode");
296 tts_client_s* client = tts_client_get(tts);
299 if (NULL == client) {
300 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
301 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
302 SLOG(LOG_DEBUG, TAG_TTSC, " ");
303 return TTS_ERROR_INVALID_PARAMETER;
307 if (client->current_state != TTS_STATE_CREATED) {
308 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
309 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
310 SLOG(LOG_DEBUG, TAG_TTSC, " ");
311 return TTS_ERROR_INVALID_STATE;
314 if (TTS_MODE_DEFAULT <= mode && mode <= TTS_MODE_SCREEN_READER) {
317 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] mode is not valid : %d", mode);
318 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
319 SLOG(LOG_DEBUG, TAG_TTSC, " ");
320 return TTS_ERROR_INVALID_PARAMETER;
323 if (TTS_MODE_SCREEN_READER == mode) {
326 ret = vconf_get_bool(TTS_ACCESSIBILITY_KEY, &screen_reader);
328 SLOG(LOG_ERROR, tts_tag(), "[Config ERROR] Fail to get screen reader");
329 return TTS_ERROR_OPERATION_FAILED;
331 g_screen_reader = (bool)screen_reader;
332 tts_config_set_screen_reader_callback(client->uid, __tts_screen_reader_changed_cb);
334 tts_config_unset_screen_reader_callback(client->uid);
337 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
338 SLOG(LOG_DEBUG, TAG_TTSC, " ");
340 return TTS_ERROR_NONE;
343 int tts_get_mode(tts_h tts, tts_mode_e* mode)
345 if (0 != __tts_get_feature_enabled()) {
346 return TTS_ERROR_NOT_SUPPORTED;
349 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get TTS mode");
351 tts_client_s* client = tts_client_get(tts);
354 if (NULL == client) {
355 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
356 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
357 SLOG(LOG_DEBUG, TAG_TTSC, " ");
358 return TTS_ERROR_INVALID_PARAMETER;
362 if (client->current_state != TTS_STATE_CREATED) {
363 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
364 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
365 SLOG(LOG_DEBUG, TAG_TTSC, " ");
366 return TTS_ERROR_INVALID_STATE;
370 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter(mode) is NULL");
371 return TTS_ERROR_INVALID_PARAMETER;
374 *mode = client->mode;
376 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
377 SLOG(LOG_DEBUG, TAG_TTSC, " ");
379 return TTS_ERROR_NONE;
382 int tts_set_credential(tts_h tts, const char* credential)
384 if(0 != __tts_get_feature_enabled()) {
385 return TTS_ERROR_NOT_SUPPORTED;
388 if (NULL == tts || NULL == credential) {
389 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
390 return TTS_ERROR_INVALID_PARAMETER;
393 tts_client_s* client = tts_client_get(tts);
395 if (NULL == client) {
396 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
397 return TTS_ERROR_INVALID_PARAMETER;
400 if (TTS_STATE_CREATED != client->current_state && TTS_STATE_READY != client->current_state) {
401 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid (%d).", client->current_state);
402 return TTS_ERROR_INVALID_STATE;
405 client->credential = strdup(credential);
407 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
408 SLOG(LOG_DEBUG, TAG_TTSC, " ");
410 return TTS_ERROR_NONE;
413 static Eina_Bool __tts_connect_daemon(void *data)
415 tts_h tts = (tts_h)data;
416 tts_client_s* client = tts_client_get(tts);
419 if (NULL == client) {
420 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
425 if (0 != tts_dbus_request_hello(client->uid)) {
429 SLOG(LOG_DEBUG, TAG_TTSC, "===== Connect daemon");
431 /* do request initialize */
433 bool credential_needed = false;
435 ret = tts_dbus_request_initialize(client->uid, &credential_needed);
437 if (TTS_ERROR_ENGINE_NOT_FOUND == ret) {
438 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to initialize : %s", __tts_get_error_code(ret));
440 client->reason = TTS_ERROR_ENGINE_NOT_FOUND;
443 ecore_timer_add(0, __tts_notify_error, (void*)client->tts);
444 client->conn_timer = NULL;
447 } else if (TTS_ERROR_NONE != ret) {
448 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to connection. Retry to connect : %s", __tts_get_error_code(ret));
452 /* success to connect tts-daemon */
453 client->credential_needed = credential_needed;
454 SLOG(LOG_ERROR, TAG_TTSC, "Supported options : credential(%s)", credential_needed ? "need" : "no need");
457 client->conn_timer = NULL;
459 client = tts_client_get(tts);
461 if (NULL == client) {
462 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
466 client->before_state = client->current_state;
467 client->current_state = TTS_STATE_READY;
469 if (NULL != client->state_changed_cb) {
470 tts_client_use_callback(client);
471 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
472 tts_client_not_use_callback(client);
474 SLOG(LOG_WARN, TAG_TTSC, "State changed callback is NULL");
477 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
478 SLOG(LOG_DEBUG, TAG_TTSC, " ");
483 int tts_prepare(tts_h tts)
485 if (0 != __tts_get_feature_enabled()) {
486 return TTS_ERROR_NOT_SUPPORTED;
489 SLOG(LOG_DEBUG, TAG_TTSC, "===== Prepare TTS");
491 tts_client_s* client = tts_client_get(tts);
494 if (NULL == client) {
495 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
496 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
497 SLOG(LOG_DEBUG, TAG_TTSC, " ");
498 return TTS_ERROR_INVALID_PARAMETER;
502 if (client->current_state != TTS_STATE_CREATED) {
503 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
504 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
505 SLOG(LOG_DEBUG, TAG_TTSC, " ");
506 return TTS_ERROR_INVALID_STATE;
509 client->conn_timer = ecore_timer_add(0, __tts_connect_daemon, (void*)tts);
511 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
512 SLOG(LOG_DEBUG, TAG_TTSC, " ");
514 return TTS_ERROR_NONE;
517 int tts_unprepare(tts_h tts)
519 if (0 != __tts_get_feature_enabled()) {
520 return TTS_ERROR_NOT_SUPPORTED;
523 SLOG(LOG_DEBUG, TAG_TTSC, "===== Unprepare TTS");
525 tts_client_s* client = tts_client_get(tts);
528 if (NULL == client) {
529 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
530 return TTS_ERROR_INVALID_PARAMETER;
534 if (client->current_state != TTS_STATE_READY) {
535 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'READY'");
536 return TTS_ERROR_INVALID_STATE;
541 if (!(false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode)) {
543 ret = tts_dbus_request_finalize(client->uid);
545 if (TTS_ERROR_TIMED_OUT != ret) {
546 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
549 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry finalize : %s", __tts_get_error_code(ret));
552 if (TTS_RETRY_COUNT == count) {
553 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
560 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Do not request finalize : g_sr(%d) mode(%d)", g_screen_reader, client->mode);
563 client->before_state = client->current_state;
564 client->current_state = TTS_STATE_CREATED;
566 if (NULL != client->state_changed_cb) {
567 tts_client_use_callback(client);
568 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
569 tts_client_not_use_callback(client);
570 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
573 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
574 SLOG(LOG_DEBUG, TAG_TTSC, " ");
576 return TTS_ERROR_NONE;
579 bool __tts_supported_voice_cb(const char* engine_id, const char* language, int type, void* user_data)
581 tts_h tts = (tts_h)user_data;
583 tts_client_s* client = tts_client_get(tts);
584 if (NULL == client) {
585 SLOG(LOG_ERROR, TAG_TTSC, "[WARNING] A handle is not valid");
589 /* call callback function */
590 if (NULL != client->supported_voice_cb) {
591 return client->supported_voice_cb(tts, language, type, client->supported_voice_user_data);
593 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of supported voice");
599 int tts_foreach_supported_voices(tts_h tts, tts_supported_voice_cb callback, void* user_data)
601 if (0 != __tts_get_feature_enabled()) {
602 return TTS_ERROR_NOT_SUPPORTED;
605 SLOG(LOG_DEBUG, TAG_TTSC, "===== Foreach supported voices");
607 if (NULL == tts || NULL == callback) {
608 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
609 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
610 SLOG(LOG_DEBUG, TAG_TTSC, " ");
611 return TTS_ERROR_INVALID_PARAMETER;
614 tts_client_s* client = tts_client_get(tts);
617 if (NULL == client) {
618 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
619 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
620 SLOG(LOG_DEBUG, TAG_TTSC, " ");
621 return TTS_ERROR_INVALID_PARAMETER;
625 char* current_engine = NULL;
626 ret = tts_config_mgr_get_engine(¤t_engine);
628 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get current engine : %d", ret);
629 return __tts_convert_config_error_code(ret);
632 client->supported_voice_cb = callback;
633 client->supported_voice_user_data = user_data;
635 ret = tts_config_mgr_get_voice_list(current_engine, __tts_supported_voice_cb, client->tts);
637 if (NULL != current_engine)
638 free(current_engine);
640 client->supported_voice_cb = NULL;
641 client->supported_voice_user_data = NULL;
644 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
645 ret = TTS_ERROR_OPERATION_FAILED;
648 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
649 SLOG(LOG_DEBUG, TAG_TTSC, " ");
654 int tts_get_default_voice(tts_h tts, char** lang, int* vctype)
656 if (0 != __tts_get_feature_enabled()) {
657 return TTS_ERROR_NOT_SUPPORTED;
660 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get default voice");
663 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
664 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
665 SLOG(LOG_DEBUG, TAG_TTSC, " ");
666 return TTS_ERROR_INVALID_PARAMETER;
669 tts_client_s* client = tts_client_get(tts);
671 if (NULL == client) {
672 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
673 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
674 SLOG(LOG_DEBUG, TAG_TTSC, " ");
675 return TTS_ERROR_INVALID_PARAMETER;
678 /* Request call remote method */
680 ret = tts_config_mgr_get_voice(lang, vctype);
682 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
683 return __tts_convert_config_error_code(ret);
685 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] Default language(%s), type(%d)", *lang, *vctype);
688 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
689 SLOG(LOG_DEBUG, TAG_TTSC, " ");
694 int tts_get_max_text_size(tts_h tts, unsigned int* size)
696 if (0 != __tts_get_feature_enabled()) {
697 return TTS_ERROR_NOT_SUPPORTED;
700 if (NULL == tts || NULL == size) {
701 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Input parameter is null");
702 return TTS_ERROR_INVALID_PARAMETER;
705 tts_client_s* client = tts_client_get(tts);
707 if (NULL == client) {
708 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : A handle is not valid");
709 return TTS_ERROR_INVALID_PARAMETER;
712 if (TTS_STATE_READY != client->current_state) {
713 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Current state is NOT 'READY'.");
714 return TTS_ERROR_INVALID_STATE;
717 *size = TTS_MAX_TEXT_SIZE;
719 SLOG(LOG_DEBUG, TAG_TTSC, "Get max text count : %d", *size);
720 return TTS_ERROR_NONE;
723 int tts_get_state(tts_h tts, tts_state_e* state)
725 if (0 != __tts_get_feature_enabled()) {
726 return TTS_ERROR_NOT_SUPPORTED;
729 if (NULL == tts || NULL == state) {
730 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : Input parameter is null");
731 return TTS_ERROR_INVALID_PARAMETER;
734 tts_client_s* client = tts_client_get(tts);
736 if (NULL == client) {
737 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
738 return TTS_ERROR_INVALID_PARAMETER;
741 *state = client->current_state;
744 case TTS_STATE_CREATED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Created'"); break;
745 case TTS_STATE_READY: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Ready'"); break;
746 case TTS_STATE_PLAYING: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Playing'"); break;
747 case TTS_STATE_PAUSED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Paused'"); break;
748 default: SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid value"); break;
751 return TTS_ERROR_NONE;
754 int tts_get_speed_range(tts_h tts, int* min, int* normal, int* max)
756 if (0 != __tts_get_feature_enabled()) {
757 return TTS_ERROR_NOT_SUPPORTED;
760 if (NULL == tts || NULL == min || NULL == normal || NULL == max) {
761 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
762 return TTS_ERROR_INVALID_PARAMETER;
765 tts_client_s* client = tts_client_get(tts);
767 if (NULL == client) {
768 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
769 return TTS_ERROR_INVALID_PARAMETER;
772 *min = TTS_SPEED_MIN;
773 *normal = TTS_SPEED_NORMAL;
774 *max = TTS_SPEED_MAX;
776 return TTS_ERROR_NONE;
779 int tts_get_error_message(tts_h tts, char** err_msg)
781 if(0 != __tts_get_feature_enabled()) {
782 return TTS_ERROR_NOT_SUPPORTED;
785 if (NULL == tts || NULL == err_msg) {
786 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
787 return TTS_ERROR_INVALID_PARAMETER;
790 tts_client_s* client = tts_client_get(tts);
792 if (NULL == client) {
793 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
794 return TTS_ERROR_INVALID_PARAMETER;
797 if (NULL != client->err_msg) {
798 *err_msg = strdup(client->err_msg);
799 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Error msg (%s)", *err_msg);
801 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Error msg (NULL)");
804 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
805 SLOG(LOG_DEBUG, TAG_TTSC, " ");
807 return TTS_ERROR_NONE;
810 int tts_add_text(tts_h tts, const char* text, const char* language, int voice_type, int speed, int* utt_id)
812 if (0 != __tts_get_feature_enabled()) {
813 return TTS_ERROR_NOT_SUPPORTED;
817 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Speed should not be negative(%d)", speed);
818 return TTS_ERROR_INVALID_PARAMETER;
821 if (voice_type < 0) {
822 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Voice type should not be negative(%d)", voice_type);
823 return TTS_ERROR_INVALID_PARAMETER;
826 SLOG(LOG_DEBUG, TAG_TTSC, "===== Add text");
828 if (NULL == tts || NULL == utt_id) {
829 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
830 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
831 SLOG(LOG_DEBUG, TAG_TTSC, " ");
832 return TTS_ERROR_INVALID_PARAMETER;
835 tts_client_s* client = tts_client_get(tts);
837 if (NULL == client) {
838 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
839 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
840 SLOG(LOG_DEBUG, TAG_TTSC, " ");
841 return TTS_ERROR_INVALID_PARAMETER;
844 if (TTS_STATE_CREATED == client->current_state) {
845 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
846 return TTS_ERROR_INVALID_STATE;
849 if (TTS_MAX_TEXT_SIZE < strlen(text) || strlen(text) <= 0) {
850 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input text size is invalid.");
851 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
852 SLOG(LOG_DEBUG, TAG_TTSC, " ");
853 return TTS_ERROR_INVALID_PARAMETER;
856 if (TTS_SPEED_AUTO > speed || TTS_SPEED_MAX < speed) {
857 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] speed value(%d) is invalid.", speed);
858 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
859 SLOG(LOG_DEBUG, TAG_TTSC, " ");
860 return TTS_ERROR_INVALID_PARAMETER;
863 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
864 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
865 return TTS_ERROR_INVALID_STATE;
868 if (true == client->credential_needed && NULL == client->credential) {
869 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Do not have app credential for this engine");
870 return TTS_ERROR_PERMISSION_DENIED;
873 /* check valid utf8 */
875 ict = iconv_open("utf-8", "");
876 if ((iconv_t)-1 == ict) {
877 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to init for text check");
878 return TTS_ERROR_OPERATION_FAILED;
881 size_t len = strlen(text);
883 char in_buf[TTS_MAX_TEXT_SIZE];
884 char *out_tmp = NULL;
885 char out_buf[TTS_MAX_TEXT_SIZE];
886 size_t len_tmp = sizeof(out_buf);
888 memset(in_buf, 0, TTS_MAX_TEXT_SIZE);
889 snprintf(in_buf, TTS_MAX_TEXT_SIZE, "%s", text);
892 memset(out_buf, 0, TTS_MAX_TEXT_SIZE);
896 st = iconv(ict, &in_tmp, &len, &out_tmp, &len_tmp);
897 if ((size_t)-1 == st) {
898 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Text is invalid - '%s'", in_buf);
900 return TTS_ERROR_INVALID_PARAMETER;
903 SLOG(LOG_DEBUG, TAG_TTSC, "Text is valid - Converted text is '%s'", out_buf);
905 /* change default language value */
908 if (NULL == language)
909 temp = strdup("default");
911 temp = strdup(language);
913 client->current_utt_id++;
914 if (client->current_utt_id == 10000) {
915 client->current_utt_id = 1;
922 ret = tts_dbus_request_add_text(client->uid, out_buf, temp, voice_type, speed, client->current_utt_id, client->credential);
924 if (TTS_ERROR_TIMED_OUT != ret) {
925 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
928 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry add text : %s", __tts_get_error_code(ret));
931 if (TTS_RETRY_COUNT == count) {
932 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
937 *utt_id = client->current_utt_id;
941 if (NULL != temp) free(temp);
943 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
944 SLOG(LOG_DEBUG, TAG_TTSC, " ");
949 static void __tts_play_async(void *data)
951 tts_h tts = (tts_h)data;
952 tts_client_s* client = tts_client_get(tts);
955 if (NULL == client) {
956 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
963 ret = tts_dbus_request_play(client->uid, client->credential);
965 if (TTS_ERROR_TIMED_OUT != ret) {
966 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
969 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry play : %s", __tts_get_error_code(ret));
972 if (TTS_RETRY_COUNT == count) {
973 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
981 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to play tts : %s", __tts_get_error_code(ret));
983 client->reason = ret;
986 ecore_timer_add(0, __tts_notify_error, client->tts);
990 client->before_state = client->current_state;
991 client->current_state = TTS_STATE_PLAYING;
993 if (NULL != client->state_changed_cb) {
994 tts_client_use_callback(client);
995 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
996 tts_client_not_use_callback(client);
997 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1000 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1001 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1006 int tts_play_async(tts_h tts)
1008 if (0 != __tts_get_feature_enabled()) {
1009 return TTS_ERROR_NOT_SUPPORTED;
1012 SLOG(LOG_DEBUG, TAG_TTSC, "===== Play tts");
1015 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
1016 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1017 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1018 return TTS_ERROR_INVALID_PARAMETER;
1021 tts_client_s* client = tts_client_get(tts);
1023 if (NULL == client) {
1024 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
1025 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1026 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1027 return TTS_ERROR_INVALID_PARAMETER;
1030 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
1031 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
1032 return TTS_ERROR_INVALID_STATE;
1035 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1036 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1037 return TTS_ERROR_INVALID_STATE;
1040 if (true == client->credential_needed && NULL == client->credential) {
1041 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Do not have app credential for this engine");
1042 return TTS_ERROR_PERMISSION_DENIED;
1045 ecore_main_loop_thread_safe_call_async(__tts_play_async, (void*)tts);
1047 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1048 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1050 return TTS_ERROR_NONE;
1053 int tts_play(tts_h tts)
1055 if (0 != __tts_get_feature_enabled()) {
1056 return TTS_ERROR_NOT_SUPPORTED;
1059 SLOG(LOG_DEBUG, TAG_TTSC, "===== Play tts");
1062 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
1063 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1064 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1065 return TTS_ERROR_INVALID_PARAMETER;
1068 tts_client_s* client = tts_client_get(tts);
1070 if (NULL == client) {
1071 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
1072 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1073 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1074 return TTS_ERROR_INVALID_PARAMETER;
1077 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
1078 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
1079 return TTS_ERROR_INVALID_STATE;
1082 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1083 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1084 return TTS_ERROR_INVALID_STATE;
1087 if (true == client->credential_needed && NULL == client->credential) {
1088 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Do not have app credential for this engine");
1089 return TTS_ERROR_PERMISSION_DENIED;
1095 ret = tts_dbus_request_play(client->uid, client->credential);
1097 if (TTS_ERROR_TIMED_OUT != ret) {
1098 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1101 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry play : %s", __tts_get_error_code(ret));
1104 if (TTS_RETRY_COUNT == count) {
1105 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1112 client->before_state = client->current_state;
1113 client->current_state = TTS_STATE_PLAYING;
1115 if (NULL != client->state_changed_cb) {
1116 tts_client_use_callback(client);
1117 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1118 tts_client_not_use_callback(client);
1119 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1122 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1123 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1125 return TTS_ERROR_NONE;
1128 static void __tts_stop_async(void *data)
1130 tts_h tts = (tts_h)data;
1131 tts_client_s* client = tts_client_get(tts);
1134 if (NULL == client) {
1135 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1142 ret = tts_dbus_request_stop(client->uid);
1144 if (TTS_ERROR_TIMED_OUT != ret) {
1145 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1148 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry stop : %s", __tts_get_error_code(ret));
1151 if (TTS_RETRY_COUNT == count) {
1152 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1160 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to stop tts : %s", __tts_get_error_code(ret));
1162 client->reason = ret;
1163 client->utt_id = -1;
1165 ecore_timer_add(0, __tts_notify_error, client->tts);
1169 client->before_state = client->current_state;
1170 client->current_state = TTS_STATE_READY;
1172 if (NULL != client->state_changed_cb) {
1173 tts_client_use_callback(client);
1174 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1175 tts_client_not_use_callback(client);
1176 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1179 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1180 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1185 int tts_stop_aync(tts_h tts)
1187 if (0 != __tts_get_feature_enabled()) {
1188 return TTS_ERROR_NOT_SUPPORTED;
1191 SLOG(LOG_DEBUG, TAG_TTSC, "===== Stop tts");
1194 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1195 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1196 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1197 return TTS_ERROR_INVALID_PARAMETER;
1200 tts_client_s* client = tts_client_get(tts);
1202 if (NULL == client) {
1203 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1204 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1205 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1206 return TTS_ERROR_INVALID_PARAMETER;
1209 if (TTS_STATE_CREATED == client->current_state) {
1210 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
1211 return TTS_ERROR_INVALID_STATE;
1214 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1215 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1216 return TTS_ERROR_INVALID_STATE;
1219 ecore_main_loop_thread_safe_call_async(__tts_stop_async, (void*)tts);
1221 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1222 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1224 return TTS_ERROR_NONE;
1227 int tts_stop(tts_h tts)
1229 if (0 != __tts_get_feature_enabled()) {
1230 return TTS_ERROR_NOT_SUPPORTED;
1233 SLOG(LOG_DEBUG, TAG_TTSC, "===== Stop tts");
1236 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1237 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1238 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1239 return TTS_ERROR_INVALID_PARAMETER;
1242 tts_client_s* client = tts_client_get(tts);
1244 if (NULL == client) {
1245 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1246 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1247 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1248 return TTS_ERROR_INVALID_PARAMETER;
1251 if (TTS_STATE_CREATED == client->current_state) {
1252 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
1253 return TTS_ERROR_INVALID_STATE;
1256 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1257 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1258 return TTS_ERROR_INVALID_STATE;
1264 ret = tts_dbus_request_stop(client->uid);
1266 if (TTS_ERROR_TIMED_OUT != ret) {
1267 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1270 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry stop : %s", __tts_get_error_code(ret));
1273 if (TTS_RETRY_COUNT == count) {
1274 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1281 client->before_state = client->current_state;
1282 client->current_state = TTS_STATE_READY;
1284 if (NULL != client->state_changed_cb) {
1285 tts_client_use_callback(client);
1286 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1287 tts_client_not_use_callback(client);
1288 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1291 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1292 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1294 return TTS_ERROR_NONE;
1297 static void __tts_pause_async(void *data)
1299 tts_h tts = (tts_h)data;
1300 tts_client_s* client = tts_client_get(tts);
1303 if (NULL == client) {
1304 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1311 ret = tts_dbus_request_pause(client->uid);
1313 if (TTS_ERROR_TIMED_OUT != ret) {
1314 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1317 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry pause : %s", __tts_get_error_code(ret));
1320 if (TTS_RETRY_COUNT == count) {
1321 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1329 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to pause tts : %s", __tts_get_error_code(ret));
1331 client->reason = ret;
1332 client->utt_id = -1;
1334 ecore_timer_add(0, __tts_notify_error, client->tts);
1338 client->before_state = client->current_state;
1339 client->current_state = TTS_STATE_PAUSED;
1341 if (NULL != client->state_changed_cb) {
1342 tts_client_use_callback(client);
1343 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1344 tts_client_not_use_callback(client);
1345 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1348 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1349 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1354 int tts_pause_async(tts_h tts)
1356 if (0 != __tts_get_feature_enabled()) {
1357 return TTS_ERROR_NOT_SUPPORTED;
1360 SLOG(LOG_DEBUG, TAG_TTSC, "===== Pause tts");
1363 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1364 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1365 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1366 return TTS_ERROR_INVALID_PARAMETER;
1369 tts_client_s* client = tts_client_get(tts);
1371 if (NULL == client) {
1372 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1373 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1374 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1375 return TTS_ERROR_INVALID_PARAMETER;
1378 if (TTS_STATE_PLAYING != client->current_state) {
1379 SLOG(LOG_ERROR, TAG_TTSC, "[Error] The Current state is NOT 'playing'. So this request should be not running.");
1380 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1381 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1382 return TTS_ERROR_INVALID_STATE;
1385 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1386 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1387 return TTS_ERROR_INVALID_STATE;
1390 ecore_main_loop_thread_safe_call_async(__tts_pause_async, (void*)tts);
1392 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1393 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1395 return TTS_ERROR_NONE;
1398 int tts_pause(tts_h tts)
1400 if (0 != __tts_get_feature_enabled()) {
1401 return TTS_ERROR_NOT_SUPPORTED;
1404 SLOG(LOG_DEBUG, TAG_TTSC, "===== Pause tts");
1407 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1408 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1409 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1410 return TTS_ERROR_INVALID_PARAMETER;
1413 tts_client_s* client = tts_client_get(tts);
1415 if (NULL == client) {
1416 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1417 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1418 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1419 return TTS_ERROR_INVALID_PARAMETER;
1422 if (TTS_STATE_PLAYING != client->current_state) {
1423 SLOG(LOG_ERROR, TAG_TTSC, "[Error] The Current state is NOT 'playing'. So this request should be not running.");
1424 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1425 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1426 return TTS_ERROR_INVALID_STATE;
1429 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1430 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1431 return TTS_ERROR_INVALID_STATE;
1437 ret = tts_dbus_request_pause(client->uid);
1439 if (TTS_ERROR_TIMED_OUT != ret) {
1440 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1443 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry pause : %s", __tts_get_error_code(ret));
1446 if (TTS_RETRY_COUNT == count) {
1447 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1454 client->before_state = client->current_state;
1455 client->current_state = TTS_STATE_PAUSED;
1457 if (NULL != client->state_changed_cb) {
1458 tts_client_use_callback(client);
1459 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1460 tts_client_not_use_callback(client);
1461 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1464 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1465 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1467 return TTS_ERROR_NONE;
1470 int tts_set_private_data(tts_h tts, const char* key, const char* data)
1472 if (0 != __tts_get_feature_enabled()) {
1473 return TTS_ERROR_NOT_SUPPORTED;
1476 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set private data");
1479 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1480 return TTS_ERROR_INVALID_PARAMETER;
1483 if (NULL == key || NULL == data) {
1484 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid parameter");
1485 return TTS_ERROR_INVALID_PARAMETER;
1488 tts_client_s* client = tts_client_get(tts);
1490 if (NULL == client) {
1491 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1492 return TTS_ERROR_INVALID_PARAMETER;
1495 if (TTS_STATE_READY != client->current_state) {
1496 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid state : Current state is NOT 'READY'");
1497 return TTS_ERROR_INVALID_STATE;
1503 ret = tts_dbus_request_set_private_data(client->uid, key, data);
1505 if (TTS_ERROR_TIMED_OUT != ret) {
1506 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1509 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry : %s", __tts_get_error_code(ret));
1512 if (TTS_RETRY_COUNT == count) {
1513 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1520 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1521 SLOG(LOG_DEBUG, TAG_TTSC, "");
1526 int tts_get_private_data(tts_h tts, const char* key, char** data)
1528 if (0 != __tts_get_feature_enabled()) {
1529 return TTS_ERROR_NOT_SUPPORTED;
1532 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get private data");
1535 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1536 return TTS_ERROR_INVALID_PARAMETER;
1539 if (NULL == key || NULL == data) {
1540 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid parameter");
1541 return TTS_ERROR_INVALID_PARAMETER;
1544 tts_client_s* client = tts_client_get(tts);
1546 if (NULL == client) {
1547 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1548 return TTS_ERROR_INVALID_PARAMETER;
1551 if (TTS_STATE_READY != client->current_state) {
1552 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid state : Current state is NOT 'READY'");
1553 return TTS_ERROR_INVALID_STATE;
1559 ret = tts_dbus_request_get_private_data(client->uid, key, data);
1561 if (TTS_ERROR_TIMED_OUT != ret) {
1562 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1565 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry : %s", __tts_get_error_code(ret));
1568 if (TTS_RETRY_COUNT == count) {
1569 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1576 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1577 SLOG(LOG_DEBUG, TAG_TTSC, "");
1582 static Eina_Bool __tts_notify_error(void *data)
1584 tts_h tts = (tts_h)data;
1586 tts_client_s* client = tts_client_get(tts);
1589 if (NULL == client) {
1590 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify error msg : A handle is not valid");
1594 SLOG(LOG_DEBUG, TAG_TTSC, "Error data : uttid(%d) reason(%s)", client->utt_id, __tts_get_error_code(client->reason));
1596 if (NULL != client->error_cb) {
1597 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of error");
1598 tts_client_use_callback(client);
1599 g_err_callback_status = true;
1600 client->error_cb(client->tts, client->utt_id, client->reason, client->error_user_data);
1601 g_err_callback_status = false;
1602 tts_client_not_use_callback(client);
1604 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
1610 int __tts_cb_error(int uid, tts_error_e reason, int utt_id, char* err_msg)
1612 tts_client_s* client = tts_client_get_by_uid(uid);
1614 if (NULL == client) {
1615 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
1616 return TTS_ERROR_INVALID_PARAMETER;
1619 client->utt_id = utt_id;
1620 client->reason = reason;
1621 if (NULL != client->err_msg) {
1622 free(client->err_msg);
1623 client->err_msg = NULL;
1625 client->err_msg = strdup(err_msg);
1627 /* call callback function */
1628 if (NULL != client->error_cb) {
1629 ecore_timer_add(0, __tts_notify_error, client->tts);
1631 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
1634 if (TTS_ERROR_SERVICE_RESET == reason) {
1635 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Service Reset");
1637 client->current_state = TTS_STATE_CREATED;
1638 if (0 != tts_prepare(client->tts)) {
1639 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare");
1646 static Eina_Bool __tts_notify_state_changed(void *data)
1648 tts_h tts = (tts_h)data;
1650 tts_client_s* client = tts_client_get(tts);
1653 if (NULL == client) {
1654 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify state changed : A handle is not valid");
1658 if (NULL != client->state_changed_cb) {
1659 tts_client_use_callback(client);
1660 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1661 tts_client_not_use_callback(client);
1662 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called : pre(%d) cur(%d)", client->before_state, client->current_state);
1664 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
1670 int __tts_cb_set_state(int uid, int state)
1672 tts_client_s* client = tts_client_get_by_uid(uid);
1673 if (NULL == client) {
1674 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] The handle is not valid");
1678 tts_state_e state_from_daemon = (tts_state_e)state;
1680 if (client->current_state == state_from_daemon) {
1681 SLOG(LOG_DEBUG, TAG_TTSC, "Current state has already been %d", client->current_state);
1685 if (NULL != client->state_changed_cb) {
1686 ecore_timer_add(0, __tts_notify_state_changed, client->tts);
1688 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
1691 client->before_state = client->current_state;
1692 client->current_state = state_from_daemon;
1697 int __tts_cb_utt_started(int uid, int utt_id)
1699 tts_client_s* client = tts_client_get_by_uid(uid);
1701 if (NULL == client) {
1702 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
1703 return TTS_ERROR_INVALID_PARAMETER;
1706 SLOG(LOG_DEBUG, TAG_TTSC, "utterance started : utt id(%d) ", utt_id);
1708 client->utt_id = utt_id;
1710 /* call callback function */
1711 if (NULL != client->utt_started_cb) {
1712 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance started ");
1713 tts_client_use_callback(client);
1714 client->utt_started_cb(client->tts, client->utt_id, client->utt_started_user_data);
1715 tts_client_not_use_callback(client);
1717 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance started ");
1723 int __tts_cb_utt_completed(int uid, int utt_id)
1725 tts_client_s* client = tts_client_get_by_uid(uid);
1727 if (NULL == client) {
1728 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
1729 return TTS_ERROR_INVALID_PARAMETER;
1732 SLOG(LOG_DEBUG, TAG_TTSC, "utterance completed : uttid(%d) ", utt_id);
1734 client->utt_id = utt_id;
1736 /* call callback function */
1737 if (NULL != client->utt_completeted_cb) {
1738 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance completed ");
1739 tts_client_use_callback(client);
1740 client->utt_completeted_cb(client->tts, client->utt_id, client->utt_completed_user_data);
1741 tts_client_not_use_callback(client);
1743 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance completed ");
1749 int tts_set_state_changed_cb(tts_h tts, tts_state_changed_cb callback, void* user_data)
1751 if (0 != __tts_get_feature_enabled()) {
1752 return TTS_ERROR_NOT_SUPPORTED;
1755 if (NULL == tts || NULL == callback) {
1756 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Input parameter is null");
1757 return TTS_ERROR_INVALID_PARAMETER;
1760 tts_client_s* client = tts_client_get(tts);
1762 if (NULL == client) {
1763 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : A handle is not valid");
1764 return TTS_ERROR_INVALID_PARAMETER;
1767 if (TTS_STATE_CREATED != client->current_state) {
1768 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Current state is not 'Created'.");
1769 return TTS_ERROR_INVALID_STATE;
1772 client->state_changed_cb = callback;
1773 client->state_changed_user_data = user_data;
1775 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set state changed cb");
1780 int tts_unset_state_changed_cb(tts_h tts)
1782 if (0 != __tts_get_feature_enabled()) {
1783 return TTS_ERROR_NOT_SUPPORTED;
1787 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Input parameter is null");
1788 return TTS_ERROR_INVALID_PARAMETER;
1791 tts_client_s* client = tts_client_get(tts);
1793 if (NULL == client) {
1794 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : A handle is not valid");
1795 return TTS_ERROR_INVALID_PARAMETER;
1798 if (TTS_STATE_CREATED != client->current_state) {
1799 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Current state is not 'Created'.");
1800 return TTS_ERROR_INVALID_STATE;
1803 client->state_changed_cb = NULL;
1804 client->state_changed_user_data = NULL;
1806 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset state changed cb");
1811 int tts_set_utterance_started_cb(tts_h tts, tts_utterance_started_cb callback, void* user_data)
1813 if (0 != __tts_get_feature_enabled()) {
1814 return TTS_ERROR_NOT_SUPPORTED;
1817 if (NULL == tts || NULL == callback) {
1818 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Input parameter is null");
1819 return TTS_ERROR_INVALID_PARAMETER;
1822 tts_client_s* client = tts_client_get(tts);
1824 if (NULL == client) {
1825 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : A handle is not valid");
1826 return TTS_ERROR_INVALID_PARAMETER;
1829 if (TTS_STATE_CREATED != client->current_state) {
1830 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Current state is not 'Created'.");
1831 return TTS_ERROR_INVALID_STATE;
1834 client->utt_started_cb = callback;
1835 client->utt_started_user_data = user_data;
1837 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt started cb");
1842 int tts_unset_utterance_started_cb(tts_h tts)
1844 if (0 != __tts_get_feature_enabled()) {
1845 return TTS_ERROR_NOT_SUPPORTED;
1849 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Input parameter is null");
1850 return TTS_ERROR_INVALID_PARAMETER;
1853 tts_client_s* client = tts_client_get(tts);
1855 if (NULL == client) {
1856 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : A handle is not valid");
1857 return TTS_ERROR_INVALID_PARAMETER;
1860 if (TTS_STATE_CREATED != client->current_state) {
1861 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Current state is not 'Created'.");
1862 return TTS_ERROR_INVALID_STATE;
1865 client->utt_started_cb = NULL;
1866 client->utt_started_user_data = NULL;
1868 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt started cb");
1873 int tts_set_utterance_completed_cb(tts_h tts, tts_utterance_completed_cb callback, void* user_data)
1875 if (0 != __tts_get_feature_enabled()) {
1876 return TTS_ERROR_NOT_SUPPORTED;
1879 if (NULL == tts || NULL == callback) {
1880 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Input parameter is null");
1881 return TTS_ERROR_INVALID_PARAMETER;
1884 tts_client_s* client = tts_client_get(tts);
1886 if (NULL == client) {
1887 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : A handle is not valid");
1888 return TTS_ERROR_INVALID_PARAMETER;
1891 if (TTS_STATE_CREATED != client->current_state) {
1892 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Current state is not 'Created'.");
1893 return TTS_ERROR_INVALID_STATE;
1896 client->utt_completeted_cb = callback;
1897 client->utt_completed_user_data = user_data;
1899 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt completed cb");
1904 int tts_unset_utterance_completed_cb(tts_h tts)
1906 if (0 != __tts_get_feature_enabled()) {
1907 return TTS_ERROR_NOT_SUPPORTED;
1911 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Input parameter is null");
1912 return TTS_ERROR_INVALID_PARAMETER;
1915 tts_client_s* client = tts_client_get(tts);
1917 if (NULL == client) {
1918 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : A handle is not valid");
1919 return TTS_ERROR_INVALID_PARAMETER;
1922 if (TTS_STATE_CREATED != client->current_state) {
1923 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Current state is not 'Created'.");
1924 return TTS_ERROR_INVALID_STATE;
1927 client->utt_completeted_cb = NULL;
1928 client->utt_completed_user_data = NULL;
1930 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt completed cb");
1934 int tts_set_error_cb(tts_h tts, tts_error_cb callback, void* user_data)
1936 if (0 != __tts_get_feature_enabled()) {
1937 return TTS_ERROR_NOT_SUPPORTED;
1940 if (NULL == tts || NULL == callback) {
1941 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Input parameter is null");
1942 return TTS_ERROR_INVALID_PARAMETER;
1945 tts_client_s* client = tts_client_get(tts);
1947 if (NULL == client) {
1948 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : A handle is not valid");
1949 return TTS_ERROR_INVALID_PARAMETER;
1952 if (TTS_STATE_CREATED != client->current_state) {
1953 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Current state is not 'Created'.");
1954 return TTS_ERROR_INVALID_STATE;
1957 client->error_cb = callback;
1958 client->error_user_data = user_data;
1960 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set error cb");
1965 int tts_unset_error_cb(tts_h tts)
1967 if (0 != __tts_get_feature_enabled()) {
1968 return TTS_ERROR_NOT_SUPPORTED;
1972 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Input parameter is null");
1973 return TTS_ERROR_INVALID_PARAMETER;
1976 tts_client_s* client = tts_client_get(tts);
1978 if (NULL == client) {
1979 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : A handle is not valid");
1980 return TTS_ERROR_INVALID_PARAMETER;
1983 if (TTS_STATE_CREATED != client->current_state) {
1984 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Current state is not 'Created'.");
1985 return TTS_ERROR_INVALID_STATE;
1988 client->error_cb = NULL;
1989 client->error_user_data = NULL;
1991 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset error cb");
1996 int tts_set_default_voice_changed_cb(tts_h tts, tts_default_voice_changed_cb callback, void* user_data)
1998 if (0 != __tts_get_feature_enabled()) {
1999 return TTS_ERROR_NOT_SUPPORTED;
2002 if (NULL == tts || NULL == callback) {
2003 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : Input parameter is null");
2004 return TTS_ERROR_INVALID_PARAMETER;
2007 tts_client_s* client = tts_client_get(tts);
2009 if (NULL == client) {
2010 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : A handle is not valid");
2011 return TTS_ERROR_INVALID_PARAMETER;
2014 if (TTS_STATE_CREATED != client->current_state) {
2015 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : Current state is not 'Created'.");
2016 return TTS_ERROR_INVALID_STATE;
2019 client->default_voice_changed_cb = callback;
2020 client->default_voice_changed_user_data = user_data;
2022 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set default voice changed cb");
2027 int tts_unset_default_voice_changed_cb(tts_h tts)
2029 if (0 != __tts_get_feature_enabled()) {
2030 return TTS_ERROR_NOT_SUPPORTED;
2034 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : Input parameter is null");
2035 return TTS_ERROR_INVALID_PARAMETER;
2038 tts_client_s* client = tts_client_get(tts);
2040 if (NULL == client) {
2041 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : A handle is not valid");
2042 return TTS_ERROR_INVALID_PARAMETER;
2045 if (TTS_STATE_CREATED != client->current_state) {
2046 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : Current state is not 'Created'.");
2047 return TTS_ERROR_INVALID_STATE;
2050 client->default_voice_changed_cb = NULL;
2051 client->default_voice_changed_user_data = NULL;
2053 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset default voice changed cb");