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 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)
141 tts_h tts = (tts_h)user_data;
143 tts_client_s* client = tts_client_get(tts);
144 if (NULL == client) {
145 SLOG(LOG_ERROR, TAG_TTSC, "[WARNING] A handle is not valid");
149 if (NULL != engine_id) SLOG(LOG_DEBUG, TAG_TTSC, "Engine id(%s)", engine_id);
150 if (NULL != setting) SLOG(LOG_DEBUG, TAG_TTSC, "Engine setting(%s)", setting);
151 if (NULL != language) SLOG(LOG_DEBUG, TAG_TTSC, "Language(%s)", language);
152 SLOG(LOG_DEBUG, TAG_TTSC, "Voice type(%d), Auto voice(%s), Credential(%s)", voice_type, auto_voice ? "on" : "off", need_credential ? "need" : "no need");
154 /* call callback function */
155 if (NULL != client->engine_changed_cb) {
156 client->engine_changed_cb(tts, engine_id, language, voice_type, need_credential, client->engine_changed_user_data);
158 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function for changed engine");
163 int tts_create(tts_h* tts)
165 if (0 != __tts_get_feature_enabled()) {
166 return TTS_ERROR_NOT_SUPPORTED;
169 SLOG(LOG_DEBUG, TAG_TTSC, "===== Create TTS");
173 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
174 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
175 SLOG(LOG_DEBUG, TAG_TTSC, " ");
176 return TTS_ERROR_INVALID_PARAMETER;
179 if (0 == tts_client_get_size()) {
180 if (0 != tts_dbus_open_connection()) {
181 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to open dbus connection");
182 return TTS_ERROR_OPERATION_FAILED;
186 if (0 != tts_client_new(tts)) {
187 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to create client!!!!!");
188 return TTS_ERROR_OUT_OF_MEMORY;
191 tts_client_s* client = tts_client_get(*tts);
192 if (NULL == client) {
193 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get client");
194 return TTS_ERROR_OPERATION_FAILED;
197 int ret = tts_config_mgr_initialize(client->uid);
199 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to init config manager : %d", ret);
200 tts_client_destroy(*tts);
201 return __tts_convert_config_error_code(ret);
204 ret = tts_config_mgr_set_callback(client->uid, _tts_config_engine_changed_cb, __tts_config_voice_changed_cb, NULL, NULL, NULL);
206 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to set config changed : %d", ret);
207 tts_client_destroy(*tts);
208 return __tts_convert_config_error_code(ret);
211 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
212 SLOG(LOG_DEBUG, TAG_TTSC, " ");
214 return TTS_ERROR_NONE;
217 int tts_destroy(tts_h tts)
219 if (0 != __tts_get_feature_enabled()) {
220 return TTS_ERROR_NOT_SUPPORTED;
223 SLOG(LOG_DEBUG, TAG_TTSC, "===== Destroy TTS");
226 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
227 return TTS_ERROR_INVALID_PARAMETER;
230 tts_client_s* client = tts_client_get(tts);
233 if (NULL == client) {
234 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
235 return TTS_ERROR_INVALID_PARAMETER;
238 /* check used callback */
239 if (0 != tts_client_get_use_callback(client)) {
240 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Cannot destroy in Callback function");
241 return TTS_ERROR_OPERATION_FAILED;
244 tts_config_mgr_finalize(client->uid);
250 switch (client->current_state) {
251 case TTS_STATE_PAUSED:
252 case TTS_STATE_PLAYING:
253 case TTS_STATE_READY:
254 if (!(false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode)) {
256 ret = tts_dbus_request_finalize(client->uid);
258 if (TTS_ERROR_TIMED_OUT != ret) {
259 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
262 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry finalize");
265 if (TTS_RETRY_COUNT == count) {
266 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
273 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Do not request finalize : g_sr(%d) mode(%d)", g_screen_reader, client->mode);
276 client->before_state = client->current_state;
277 client->current_state = TTS_STATE_CREATED;
279 case TTS_STATE_CREATED:
280 if (NULL != client->conn_timer) {
281 SLOG(LOG_DEBUG, TAG_TTSC, "Connect Timer is deleted");
282 ecore_timer_del(client->conn_timer);
283 client->conn_timer = NULL;
286 tts_client_destroy(tts);
293 if (0 == tts_client_get_size()) {
294 if (0 != tts_dbus_close_connection()) {
295 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to close connection");
301 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
302 SLOG(LOG_DEBUG, TAG_TTSC, " ");
304 return TTS_ERROR_NONE;
307 void __tts_screen_reader_changed_cb(bool value)
309 g_screen_reader = value;
312 int tts_set_mode(tts_h tts, tts_mode_e mode)
314 if (0 != __tts_get_feature_enabled()) {
315 return TTS_ERROR_NOT_SUPPORTED;
318 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set TTS mode");
320 tts_client_s* client = tts_client_get(tts);
323 if (NULL == client) {
324 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
325 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
326 SLOG(LOG_DEBUG, TAG_TTSC, " ");
327 return TTS_ERROR_INVALID_PARAMETER;
331 if (client->current_state != TTS_STATE_CREATED) {
332 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
333 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
334 SLOG(LOG_DEBUG, TAG_TTSC, " ");
335 return TTS_ERROR_INVALID_STATE;
338 if (TTS_MODE_DEFAULT <= mode && mode <= TTS_MODE_SCREEN_READER) {
341 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] mode is not valid : %d", mode);
342 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
343 SLOG(LOG_DEBUG, TAG_TTSC, " ");
344 return TTS_ERROR_INVALID_PARAMETER;
347 if (TTS_MODE_SCREEN_READER == mode) {
350 ret = vconf_get_bool(TTS_ACCESSIBILITY_KEY, &screen_reader);
352 SLOG(LOG_ERROR, tts_tag(), "[Config ERROR] Fail to get screen reader");
353 return TTS_ERROR_OPERATION_FAILED;
355 g_screen_reader = (bool)screen_reader;
356 tts_config_set_screen_reader_callback(client->uid, __tts_screen_reader_changed_cb);
358 tts_config_unset_screen_reader_callback(client->uid);
361 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
362 SLOG(LOG_DEBUG, TAG_TTSC, " ");
364 return TTS_ERROR_NONE;
367 int tts_get_mode(tts_h tts, tts_mode_e* mode)
369 if (0 != __tts_get_feature_enabled()) {
370 return TTS_ERROR_NOT_SUPPORTED;
373 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get TTS mode");
375 tts_client_s* client = tts_client_get(tts);
378 if (NULL == client) {
379 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
380 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
381 SLOG(LOG_DEBUG, TAG_TTSC, " ");
382 return TTS_ERROR_INVALID_PARAMETER;
386 if (client->current_state != TTS_STATE_CREATED) {
387 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
388 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
389 SLOG(LOG_DEBUG, TAG_TTSC, " ");
390 return TTS_ERROR_INVALID_STATE;
394 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter(mode) is NULL");
395 return TTS_ERROR_INVALID_PARAMETER;
398 *mode = client->mode;
400 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
401 SLOG(LOG_DEBUG, TAG_TTSC, " ");
403 return TTS_ERROR_NONE;
406 int tts_set_credential(tts_h tts, const char* credential)
408 if (0 != __tts_get_feature_enabled()) {
409 return TTS_ERROR_NOT_SUPPORTED;
412 if (NULL == tts || NULL == credential) {
413 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
414 return TTS_ERROR_INVALID_PARAMETER;
417 tts_client_s* client = tts_client_get(tts);
419 if (NULL == client) {
420 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
421 return TTS_ERROR_INVALID_PARAMETER;
424 if (TTS_STATE_CREATED != client->current_state && TTS_STATE_READY != client->current_state) {
425 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid (%d).", client->current_state);
426 return TTS_ERROR_INVALID_STATE;
429 client->credential = strdup(credential);
431 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
432 SLOG(LOG_DEBUG, TAG_TTSC, " ");
434 return TTS_ERROR_NONE;
437 static Eina_Bool __tts_connect_daemon(void *data)
439 tts_h tts = (tts_h)data;
440 tts_client_s* client = tts_client_get(tts);
443 if (NULL == client) {
444 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
449 if (0 != tts_dbus_request_hello(client->uid)) {
453 SLOG(LOG_DEBUG, TAG_TTSC, "===== Connect daemon");
455 /* do request initialize */
457 bool credential_needed = false;
459 ret = tts_dbus_request_initialize(client->uid, &credential_needed);
461 if (TTS_ERROR_ENGINE_NOT_FOUND == ret) {
462 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to initialize : %s", __tts_get_error_code(ret));
464 client->reason = TTS_ERROR_ENGINE_NOT_FOUND;
467 ecore_timer_add(0, __tts_notify_error, (void*)client->tts);
468 client->conn_timer = NULL;
471 } else if (TTS_ERROR_NONE != ret) {
472 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to connection. Retry to connect : %s", __tts_get_error_code(ret));
476 /* success to connect tts-daemon */
477 client->credential_needed = credential_needed;
478 SLOG(LOG_ERROR, TAG_TTSC, "Supported options : credential(%s)", credential_needed ? "need" : "no need");
481 client->conn_timer = NULL;
483 client = tts_client_get(tts);
485 if (NULL == client) {
486 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
490 client->before_state = client->current_state;
491 client->current_state = TTS_STATE_READY;
493 if (NULL != client->state_changed_cb) {
494 tts_client_use_callback(client);
495 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
496 tts_client_not_use_callback(client);
498 SLOG(LOG_WARN, TAG_TTSC, "State changed callback is NULL");
501 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
502 SLOG(LOG_DEBUG, TAG_TTSC, " ");
507 int tts_prepare(tts_h tts)
509 if (0 != __tts_get_feature_enabled()) {
510 return TTS_ERROR_NOT_SUPPORTED;
513 SLOG(LOG_DEBUG, TAG_TTSC, "===== Prepare TTS");
515 tts_client_s* client = tts_client_get(tts);
518 if (NULL == client) {
519 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
520 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
521 SLOG(LOG_DEBUG, TAG_TTSC, " ");
522 return TTS_ERROR_INVALID_PARAMETER;
526 if (client->current_state != TTS_STATE_CREATED) {
527 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
528 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
529 SLOG(LOG_DEBUG, TAG_TTSC, " ");
530 return TTS_ERROR_INVALID_STATE;
533 client->conn_timer = ecore_timer_add(0, __tts_connect_daemon, (void*)tts);
535 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
536 SLOG(LOG_DEBUG, TAG_TTSC, " ");
538 return TTS_ERROR_NONE;
541 int tts_unprepare(tts_h tts)
543 if (0 != __tts_get_feature_enabled()) {
544 return TTS_ERROR_NOT_SUPPORTED;
547 SLOG(LOG_DEBUG, TAG_TTSC, "===== Unprepare TTS");
549 tts_client_s* client = tts_client_get(tts);
552 if (NULL == client) {
553 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
554 return TTS_ERROR_INVALID_PARAMETER;
558 if (client->current_state != TTS_STATE_READY) {
559 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'READY'");
560 return TTS_ERROR_INVALID_STATE;
565 if (!(false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode)) {
567 ret = tts_dbus_request_finalize(client->uid);
569 if (TTS_ERROR_TIMED_OUT != ret) {
570 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
573 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry finalize : %s", __tts_get_error_code(ret));
576 if (TTS_RETRY_COUNT == count) {
577 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
584 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Do not request finalize : g_sr(%d) mode(%d)", g_screen_reader, client->mode);
587 client->before_state = client->current_state;
588 client->current_state = TTS_STATE_CREATED;
590 if (NULL != client->state_changed_cb) {
591 tts_client_use_callback(client);
592 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
593 tts_client_not_use_callback(client);
594 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
597 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
598 SLOG(LOG_DEBUG, TAG_TTSC, " ");
600 return TTS_ERROR_NONE;
603 bool __tts_supported_voice_cb(const char* engine_id, const char* language, int type, void* user_data)
605 tts_h tts = (tts_h)user_data;
607 tts_client_s* client = tts_client_get(tts);
608 if (NULL == client) {
609 SLOG(LOG_ERROR, TAG_TTSC, "[WARNING] A handle is not valid");
613 /* call callback function */
614 if (NULL != client->supported_voice_cb) {
615 return client->supported_voice_cb(tts, language, type, client->supported_voice_user_data);
617 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of supported voice");
623 int tts_foreach_supported_voices(tts_h tts, tts_supported_voice_cb callback, void* user_data)
625 if (0 != __tts_get_feature_enabled()) {
626 return TTS_ERROR_NOT_SUPPORTED;
629 SLOG(LOG_DEBUG, TAG_TTSC, "===== Foreach supported voices");
631 if (NULL == tts || NULL == callback) {
632 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
633 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
634 SLOG(LOG_DEBUG, TAG_TTSC, " ");
635 return TTS_ERROR_INVALID_PARAMETER;
638 tts_client_s* client = tts_client_get(tts);
641 if (NULL == client) {
642 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
643 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
644 SLOG(LOG_DEBUG, TAG_TTSC, " ");
645 return TTS_ERROR_INVALID_PARAMETER;
649 char* current_engine = NULL;
650 ret = tts_config_mgr_get_engine(¤t_engine);
652 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get current engine : %d", ret);
653 return __tts_convert_config_error_code(ret);
656 client->supported_voice_cb = callback;
657 client->supported_voice_user_data = user_data;
659 ret = tts_config_mgr_get_voice_list(current_engine, __tts_supported_voice_cb, client->tts);
661 if (NULL != current_engine)
662 free(current_engine);
664 client->supported_voice_cb = NULL;
665 client->supported_voice_user_data = NULL;
668 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
669 ret = TTS_ERROR_OPERATION_FAILED;
672 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
673 SLOG(LOG_DEBUG, TAG_TTSC, " ");
678 int tts_get_default_voice(tts_h tts, char** lang, int* vctype)
680 if (0 != __tts_get_feature_enabled()) {
681 return TTS_ERROR_NOT_SUPPORTED;
684 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get default voice");
687 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
688 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
689 SLOG(LOG_DEBUG, TAG_TTSC, " ");
690 return TTS_ERROR_INVALID_PARAMETER;
693 tts_client_s* client = tts_client_get(tts);
695 if (NULL == client) {
696 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
697 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
698 SLOG(LOG_DEBUG, TAG_TTSC, " ");
699 return TTS_ERROR_INVALID_PARAMETER;
702 /* Request call remote method */
704 ret = tts_config_mgr_get_voice(lang, vctype);
706 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
707 return __tts_convert_config_error_code(ret);
709 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] Default language(%s), type(%d)", *lang, *vctype);
712 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
713 SLOG(LOG_DEBUG, TAG_TTSC, " ");
718 int tts_get_max_text_size(tts_h tts, unsigned int* size)
720 if (0 != __tts_get_feature_enabled()) {
721 return TTS_ERROR_NOT_SUPPORTED;
724 if (NULL == tts || NULL == size) {
725 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Input parameter is null");
726 return TTS_ERROR_INVALID_PARAMETER;
729 tts_client_s* client = tts_client_get(tts);
731 if (NULL == client) {
732 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : A handle is not valid");
733 return TTS_ERROR_INVALID_PARAMETER;
736 if (TTS_STATE_READY != client->current_state) {
737 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Current state is NOT 'READY'.");
738 return TTS_ERROR_INVALID_STATE;
741 *size = TTS_MAX_TEXT_SIZE;
743 SLOG(LOG_DEBUG, TAG_TTSC, "Get max text count : %d", *size);
744 return TTS_ERROR_NONE;
747 int tts_get_state(tts_h tts, tts_state_e* state)
749 if (0 != __tts_get_feature_enabled()) {
750 return TTS_ERROR_NOT_SUPPORTED;
753 if (NULL == tts || NULL == state) {
754 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : Input parameter is null");
755 return TTS_ERROR_INVALID_PARAMETER;
758 tts_client_s* client = tts_client_get(tts);
760 if (NULL == client) {
761 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
762 return TTS_ERROR_INVALID_PARAMETER;
765 *state = client->current_state;
768 case TTS_STATE_CREATED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Created'"); break;
769 case TTS_STATE_READY: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Ready'"); break;
770 case TTS_STATE_PLAYING: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Playing'"); break;
771 case TTS_STATE_PAUSED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Paused'"); break;
772 default: SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid value"); break;
775 return TTS_ERROR_NONE;
778 int tts_get_speed_range(tts_h tts, int* min, int* normal, int* max)
780 if (0 != __tts_get_feature_enabled()) {
781 return TTS_ERROR_NOT_SUPPORTED;
784 if (NULL == tts || NULL == min || NULL == normal || NULL == max) {
785 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
786 return TTS_ERROR_INVALID_PARAMETER;
789 tts_client_s* client = tts_client_get(tts);
791 if (NULL == client) {
792 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
793 return TTS_ERROR_INVALID_PARAMETER;
796 *min = TTS_SPEED_MIN;
797 *normal = TTS_SPEED_NORMAL;
798 *max = TTS_SPEED_MAX;
800 return TTS_ERROR_NONE;
803 int tts_get_error_message(tts_h tts, char** err_msg)
805 if (0 != __tts_get_feature_enabled()) {
806 return TTS_ERROR_NOT_SUPPORTED;
809 if (NULL == tts || NULL == err_msg) {
810 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
811 return TTS_ERROR_INVALID_PARAMETER;
814 tts_client_s* client = tts_client_get(tts);
816 if (NULL == client) {
817 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
818 return TTS_ERROR_INVALID_PARAMETER;
821 if (NULL != client->err_msg) {
822 *err_msg = strdup(client->err_msg);
823 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Error msg (%s)", *err_msg);
825 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Error msg (NULL)");
828 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
829 SLOG(LOG_DEBUG, TAG_TTSC, " ");
831 return TTS_ERROR_NONE;
834 int tts_add_text(tts_h tts, const char* text, const char* language, int voice_type, int speed, int* utt_id)
836 if (0 != __tts_get_feature_enabled()) {
837 return TTS_ERROR_NOT_SUPPORTED;
841 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Speed should not be negative(%d)", speed);
842 return TTS_ERROR_INVALID_PARAMETER;
845 if (voice_type < 0) {
846 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Voice type should not be negative(%d)", voice_type);
847 return TTS_ERROR_INVALID_PARAMETER;
850 SLOG(LOG_DEBUG, TAG_TTSC, "===== Add text");
852 if (NULL == tts || NULL == utt_id) {
853 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
854 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
855 SLOG(LOG_DEBUG, TAG_TTSC, " ");
856 return TTS_ERROR_INVALID_PARAMETER;
859 tts_client_s* client = tts_client_get(tts);
861 if (NULL == client) {
862 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
863 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
864 SLOG(LOG_DEBUG, TAG_TTSC, " ");
865 return TTS_ERROR_INVALID_PARAMETER;
868 if (TTS_STATE_CREATED == client->current_state) {
869 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
870 return TTS_ERROR_INVALID_STATE;
873 if (TTS_MAX_TEXT_SIZE < strlen(text) || strlen(text) <= 0) {
874 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input text size is invalid.");
875 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
876 SLOG(LOG_DEBUG, TAG_TTSC, " ");
877 return TTS_ERROR_INVALID_PARAMETER;
880 if (TTS_SPEED_AUTO > speed || TTS_SPEED_MAX < speed) {
881 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] speed value(%d) is invalid.", speed);
882 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
883 SLOG(LOG_DEBUG, TAG_TTSC, " ");
884 return TTS_ERROR_INVALID_PARAMETER;
887 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
888 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
889 return TTS_ERROR_INVALID_STATE;
892 if (true == client->credential_needed && NULL == client->credential) {
893 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Do not have app credential for this engine");
894 return TTS_ERROR_PERMISSION_DENIED;
897 /* check valid utf8 */
899 ict = iconv_open("utf-8", "");
900 if ((iconv_t)-1 == ict) {
901 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to init for text check");
902 return TTS_ERROR_OPERATION_FAILED;
905 size_t len = strlen(text);
907 char in_buf[TTS_MAX_TEXT_SIZE];
908 char *out_tmp = NULL;
909 char out_buf[TTS_MAX_TEXT_SIZE];
910 size_t len_tmp = sizeof(out_buf);
912 memset(in_buf, 0, TTS_MAX_TEXT_SIZE);
913 snprintf(in_buf, TTS_MAX_TEXT_SIZE, "%s", text);
916 memset(out_buf, 0, TTS_MAX_TEXT_SIZE);
920 st = iconv(ict, &in_tmp, &len, &out_tmp, &len_tmp);
921 if ((size_t)-1 == st) {
922 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Text is invalid - '%s'", in_buf);
924 return TTS_ERROR_INVALID_PARAMETER;
927 SLOG(LOG_DEBUG, TAG_TTSC, "Text is valid - Converted text is '%s'", out_buf);
929 /* change default language value */
932 if (NULL == language)
933 temp = strdup("default");
935 temp = strdup(language);
937 client->current_utt_id++;
938 if (client->current_utt_id == 10000) {
939 client->current_utt_id = 1;
946 ret = tts_dbus_request_add_text(client->uid, out_buf, temp, voice_type, speed, client->current_utt_id, client->credential);
948 if (TTS_ERROR_TIMED_OUT != ret) {
949 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
952 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry add text : %s", __tts_get_error_code(ret));
955 if (TTS_RETRY_COUNT == count) {
956 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
961 *utt_id = client->current_utt_id;
965 if (NULL != temp) free(temp);
967 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
968 SLOG(LOG_DEBUG, TAG_TTSC, " ");
973 static void __tts_play_async(void *data)
975 tts_h tts = (tts_h)data;
976 tts_client_s* client = tts_client_get(tts);
979 if (NULL == client) {
980 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
987 ret = tts_dbus_request_play(client->uid, client->credential);
989 if (TTS_ERROR_TIMED_OUT != ret) {
990 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
993 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry play : %s", __tts_get_error_code(ret));
996 if (TTS_RETRY_COUNT == count) {
997 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1005 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to play tts : %s", __tts_get_error_code(ret));
1007 client->reason = ret;
1008 client->utt_id = -1;
1010 ecore_timer_add(0, __tts_notify_error, client->tts);
1014 client->before_state = client->current_state;
1015 client->current_state = TTS_STATE_PLAYING;
1017 if (NULL != client->state_changed_cb) {
1018 tts_client_use_callback(client);
1019 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1020 tts_client_not_use_callback(client);
1021 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1024 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1025 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1030 int tts_play_async(tts_h tts)
1032 if (0 != __tts_get_feature_enabled()) {
1033 return TTS_ERROR_NOT_SUPPORTED;
1036 SLOG(LOG_DEBUG, TAG_TTSC, "===== Play tts");
1039 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
1040 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1041 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1042 return TTS_ERROR_INVALID_PARAMETER;
1045 tts_client_s* client = tts_client_get(tts);
1047 if (NULL == client) {
1048 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
1049 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1050 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1051 return TTS_ERROR_INVALID_PARAMETER;
1054 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
1055 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
1056 return TTS_ERROR_INVALID_STATE;
1059 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1060 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1061 return TTS_ERROR_INVALID_STATE;
1064 if (true == client->credential_needed && NULL == client->credential) {
1065 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Do not have app credential for this engine");
1066 return TTS_ERROR_PERMISSION_DENIED;
1069 ecore_main_loop_thread_safe_call_async(__tts_play_async, (void*)tts);
1071 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1072 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1074 return TTS_ERROR_NONE;
1077 int tts_play(tts_h tts)
1079 if (0 != __tts_get_feature_enabled()) {
1080 return TTS_ERROR_NOT_SUPPORTED;
1083 SLOG(LOG_DEBUG, TAG_TTSC, "===== Play tts");
1086 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
1087 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1088 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1089 return TTS_ERROR_INVALID_PARAMETER;
1092 tts_client_s* client = tts_client_get(tts);
1094 if (NULL == client) {
1095 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
1096 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1097 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1098 return TTS_ERROR_INVALID_PARAMETER;
1101 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
1102 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
1103 return TTS_ERROR_INVALID_STATE;
1106 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1107 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1108 return TTS_ERROR_INVALID_STATE;
1111 if (true == client->credential_needed && NULL == client->credential) {
1112 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Do not have app credential for this engine");
1113 return TTS_ERROR_PERMISSION_DENIED;
1119 ret = tts_dbus_request_play(client->uid, client->credential);
1121 if (TTS_ERROR_TIMED_OUT != ret) {
1122 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1125 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry play : %s", __tts_get_error_code(ret));
1128 if (TTS_RETRY_COUNT == count) {
1129 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1136 client->before_state = client->current_state;
1137 client->current_state = TTS_STATE_PLAYING;
1139 if (NULL != client->state_changed_cb) {
1140 tts_client_use_callback(client);
1141 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1142 tts_client_not_use_callback(client);
1143 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1146 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1147 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1149 return TTS_ERROR_NONE;
1152 static void __tts_stop_async(void *data)
1154 tts_h tts = (tts_h)data;
1155 tts_client_s* client = tts_client_get(tts);
1158 if (NULL == client) {
1159 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1166 ret = tts_dbus_request_stop(client->uid);
1168 if (TTS_ERROR_TIMED_OUT != ret) {
1169 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1172 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry stop : %s", __tts_get_error_code(ret));
1175 if (TTS_RETRY_COUNT == count) {
1176 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1184 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to stop tts : %s", __tts_get_error_code(ret));
1186 client->reason = ret;
1187 client->utt_id = -1;
1189 ecore_timer_add(0, __tts_notify_error, client->tts);
1193 client->before_state = client->current_state;
1194 client->current_state = TTS_STATE_READY;
1196 if (NULL != client->state_changed_cb) {
1197 tts_client_use_callback(client);
1198 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1199 tts_client_not_use_callback(client);
1200 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1203 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1204 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1209 int tts_stop_aync(tts_h tts)
1211 if (0 != __tts_get_feature_enabled()) {
1212 return TTS_ERROR_NOT_SUPPORTED;
1215 SLOG(LOG_DEBUG, TAG_TTSC, "===== Stop tts");
1218 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1219 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1220 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1221 return TTS_ERROR_INVALID_PARAMETER;
1224 tts_client_s* client = tts_client_get(tts);
1226 if (NULL == client) {
1227 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1228 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1229 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1230 return TTS_ERROR_INVALID_PARAMETER;
1233 if (TTS_STATE_CREATED == client->current_state) {
1234 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
1235 return TTS_ERROR_INVALID_STATE;
1238 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1239 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1240 return TTS_ERROR_INVALID_STATE;
1243 ecore_main_loop_thread_safe_call_async(__tts_stop_async, (void*)tts);
1245 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1246 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1248 return TTS_ERROR_NONE;
1251 int tts_stop(tts_h tts)
1253 if (0 != __tts_get_feature_enabled()) {
1254 return TTS_ERROR_NOT_SUPPORTED;
1257 SLOG(LOG_DEBUG, TAG_TTSC, "===== Stop tts");
1260 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1261 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1262 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1263 return TTS_ERROR_INVALID_PARAMETER;
1266 tts_client_s* client = tts_client_get(tts);
1268 if (NULL == client) {
1269 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1270 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1271 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1272 return TTS_ERROR_INVALID_PARAMETER;
1275 if (TTS_STATE_CREATED == client->current_state) {
1276 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
1277 return TTS_ERROR_INVALID_STATE;
1280 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1281 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1282 return TTS_ERROR_INVALID_STATE;
1288 ret = tts_dbus_request_stop(client->uid);
1290 if (TTS_ERROR_TIMED_OUT != ret) {
1291 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1294 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry stop : %s", __tts_get_error_code(ret));
1297 if (TTS_RETRY_COUNT == count) {
1298 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1305 client->before_state = client->current_state;
1306 client->current_state = TTS_STATE_READY;
1308 if (NULL != client->state_changed_cb) {
1309 tts_client_use_callback(client);
1310 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1311 tts_client_not_use_callback(client);
1312 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1315 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1316 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1318 return TTS_ERROR_NONE;
1321 static void __tts_pause_async(void *data)
1323 tts_h tts = (tts_h)data;
1324 tts_client_s* client = tts_client_get(tts);
1327 if (NULL == client) {
1328 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1335 ret = tts_dbus_request_pause(client->uid);
1337 if (TTS_ERROR_TIMED_OUT != ret) {
1338 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1341 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry pause : %s", __tts_get_error_code(ret));
1344 if (TTS_RETRY_COUNT == count) {
1345 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1353 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to pause tts : %s", __tts_get_error_code(ret));
1355 client->reason = ret;
1356 client->utt_id = -1;
1358 ecore_timer_add(0, __tts_notify_error, client->tts);
1362 client->before_state = client->current_state;
1363 client->current_state = TTS_STATE_PAUSED;
1365 if (NULL != client->state_changed_cb) {
1366 tts_client_use_callback(client);
1367 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1368 tts_client_not_use_callback(client);
1369 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1372 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1373 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1378 int tts_pause_async(tts_h tts)
1380 if (0 != __tts_get_feature_enabled()) {
1381 return TTS_ERROR_NOT_SUPPORTED;
1384 SLOG(LOG_DEBUG, TAG_TTSC, "===== Pause tts");
1387 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1388 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1389 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1390 return TTS_ERROR_INVALID_PARAMETER;
1393 tts_client_s* client = tts_client_get(tts);
1395 if (NULL == client) {
1396 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1397 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1398 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1399 return TTS_ERROR_INVALID_PARAMETER;
1402 if (TTS_STATE_PLAYING != client->current_state) {
1403 SLOG(LOG_ERROR, TAG_TTSC, "[Error] The Current state is NOT 'playing'. So this request should be not running.");
1404 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1405 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1406 return TTS_ERROR_INVALID_STATE;
1409 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1410 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1411 return TTS_ERROR_INVALID_STATE;
1414 ecore_main_loop_thread_safe_call_async(__tts_pause_async, (void*)tts);
1416 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1417 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1419 return TTS_ERROR_NONE;
1422 int tts_pause(tts_h tts)
1424 if (0 != __tts_get_feature_enabled()) {
1425 return TTS_ERROR_NOT_SUPPORTED;
1428 SLOG(LOG_DEBUG, TAG_TTSC, "===== Pause tts");
1431 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1432 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1433 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1434 return TTS_ERROR_INVALID_PARAMETER;
1437 tts_client_s* client = tts_client_get(tts);
1439 if (NULL == client) {
1440 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1441 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1442 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1443 return TTS_ERROR_INVALID_PARAMETER;
1446 if (TTS_STATE_PLAYING != client->current_state) {
1447 SLOG(LOG_ERROR, TAG_TTSC, "[Error] The Current state is NOT 'playing'. So this request should be not running.");
1448 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1449 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1450 return TTS_ERROR_INVALID_STATE;
1453 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1454 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1455 return TTS_ERROR_INVALID_STATE;
1461 ret = tts_dbus_request_pause(client->uid);
1463 if (TTS_ERROR_TIMED_OUT != ret) {
1464 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1467 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry pause : %s", __tts_get_error_code(ret));
1470 if (TTS_RETRY_COUNT == count) {
1471 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1478 client->before_state = client->current_state;
1479 client->current_state = TTS_STATE_PAUSED;
1481 if (NULL != client->state_changed_cb) {
1482 tts_client_use_callback(client);
1483 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1484 tts_client_not_use_callback(client);
1485 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1488 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1489 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1491 return TTS_ERROR_NONE;
1494 int tts_set_private_data(tts_h tts, const char* key, const char* data)
1496 if (0 != __tts_get_feature_enabled()) {
1497 return TTS_ERROR_NOT_SUPPORTED;
1500 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set private data");
1503 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1504 return TTS_ERROR_INVALID_PARAMETER;
1507 if (NULL == key || NULL == data) {
1508 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid parameter");
1509 return TTS_ERROR_INVALID_PARAMETER;
1512 tts_client_s* client = tts_client_get(tts);
1514 if (NULL == client) {
1515 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1516 return TTS_ERROR_INVALID_PARAMETER;
1519 if (TTS_STATE_READY != client->current_state) {
1520 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid state : Current state is NOT 'READY'");
1521 return TTS_ERROR_INVALID_STATE;
1527 ret = tts_dbus_request_set_private_data(client->uid, key, data);
1529 if (TTS_ERROR_TIMED_OUT != ret) {
1530 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1533 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry : %s", __tts_get_error_code(ret));
1536 if (TTS_RETRY_COUNT == count) {
1537 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1544 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1545 SLOG(LOG_DEBUG, TAG_TTSC, "");
1550 int tts_get_private_data(tts_h tts, const char* key, char** data)
1552 if (0 != __tts_get_feature_enabled()) {
1553 return TTS_ERROR_NOT_SUPPORTED;
1556 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get private data");
1559 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1560 return TTS_ERROR_INVALID_PARAMETER;
1563 if (NULL == key || NULL == data) {
1564 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid parameter");
1565 return TTS_ERROR_INVALID_PARAMETER;
1568 tts_client_s* client = tts_client_get(tts);
1570 if (NULL == client) {
1571 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1572 return TTS_ERROR_INVALID_PARAMETER;
1575 if (TTS_STATE_READY != client->current_state) {
1576 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid state : Current state is NOT 'READY'");
1577 return TTS_ERROR_INVALID_STATE;
1583 ret = tts_dbus_request_get_private_data(client->uid, key, data);
1585 if (TTS_ERROR_TIMED_OUT != ret) {
1586 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1589 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry : %s", __tts_get_error_code(ret));
1592 if (TTS_RETRY_COUNT == count) {
1593 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1600 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1601 SLOG(LOG_DEBUG, TAG_TTSC, "");
1606 static Eina_Bool __tts_notify_error(void *data)
1608 tts_h tts = (tts_h)data;
1610 tts_client_s* client = tts_client_get(tts);
1613 if (NULL == client) {
1614 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify error msg : A handle is not valid");
1618 SLOG(LOG_DEBUG, TAG_TTSC, "Error data : uttid(%d) reason(%s)", client->utt_id, __tts_get_error_code(client->reason));
1620 if (NULL != client->error_cb) {
1621 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of error");
1622 tts_client_use_callback(client);
1623 g_err_callback_status = true;
1624 client->error_cb(client->tts, client->utt_id, client->reason, client->error_user_data);
1625 g_err_callback_status = false;
1626 tts_client_not_use_callback(client);
1628 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
1634 int __tts_cb_error(int uid, tts_error_e reason, int utt_id, char* err_msg)
1636 tts_client_s* client = tts_client_get_by_uid(uid);
1638 if (NULL == client) {
1639 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
1640 return TTS_ERROR_INVALID_PARAMETER;
1643 client->utt_id = utt_id;
1644 client->reason = reason;
1645 if (NULL != client->err_msg) {
1646 free(client->err_msg);
1647 client->err_msg = NULL;
1649 client->err_msg = strdup(err_msg);
1651 /* call callback function */
1652 if (NULL != client->error_cb) {
1653 ecore_timer_add(0, __tts_notify_error, client->tts);
1655 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
1658 if (TTS_ERROR_SERVICE_RESET == reason) {
1659 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Service Reset");
1661 client->current_state = TTS_STATE_CREATED;
1662 if (0 != tts_prepare(client->tts)) {
1663 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare");
1670 static Eina_Bool __tts_notify_state_changed(void *data)
1672 tts_h tts = (tts_h)data;
1674 tts_client_s* client = tts_client_get(tts);
1677 if (NULL == client) {
1678 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify state changed : A handle is not valid");
1682 if (NULL != client->state_changed_cb) {
1683 tts_client_use_callback(client);
1684 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1685 tts_client_not_use_callback(client);
1686 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called : pre(%d) cur(%d)", client->before_state, client->current_state);
1688 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
1694 int __tts_cb_set_state(int uid, int state)
1696 tts_client_s* client = tts_client_get_by_uid(uid);
1697 if (NULL == client) {
1698 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] The handle is not valid");
1702 tts_state_e state_from_daemon = (tts_state_e)state;
1704 if (client->current_state == state_from_daemon) {
1705 SLOG(LOG_DEBUG, TAG_TTSC, "Current state has already been %d", client->current_state);
1709 if (NULL != client->state_changed_cb) {
1710 ecore_timer_add(0, __tts_notify_state_changed, client->tts);
1712 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
1715 client->before_state = client->current_state;
1716 client->current_state = state_from_daemon;
1721 int __tts_cb_utt_started(int uid, int utt_id)
1723 tts_client_s* client = tts_client_get_by_uid(uid);
1725 if (NULL == client) {
1726 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
1727 return TTS_ERROR_INVALID_PARAMETER;
1730 SLOG(LOG_DEBUG, TAG_TTSC, "utterance started : utt id(%d) ", utt_id);
1732 client->utt_id = utt_id;
1734 /* call callback function */
1735 if (NULL != client->utt_started_cb) {
1736 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance started ");
1737 tts_client_use_callback(client);
1738 client->utt_started_cb(client->tts, client->utt_id, client->utt_started_user_data);
1739 tts_client_not_use_callback(client);
1741 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance started ");
1747 int __tts_cb_utt_completed(int uid, int utt_id)
1749 tts_client_s* client = tts_client_get_by_uid(uid);
1751 if (NULL == client) {
1752 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
1753 return TTS_ERROR_INVALID_PARAMETER;
1756 SLOG(LOG_DEBUG, TAG_TTSC, "utterance completed : uttid(%d) ", utt_id);
1758 client->utt_id = utt_id;
1760 /* call callback function */
1761 if (NULL != client->utt_completeted_cb) {
1762 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance completed ");
1763 tts_client_use_callback(client);
1764 client->utt_completeted_cb(client->tts, client->utt_id, client->utt_completed_user_data);
1765 tts_client_not_use_callback(client);
1767 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance completed ");
1773 int tts_set_state_changed_cb(tts_h tts, tts_state_changed_cb callback, void* user_data)
1775 if (0 != __tts_get_feature_enabled()) {
1776 return TTS_ERROR_NOT_SUPPORTED;
1779 if (NULL == tts || NULL == callback) {
1780 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Input parameter is null");
1781 return TTS_ERROR_INVALID_PARAMETER;
1784 tts_client_s* client = tts_client_get(tts);
1786 if (NULL == client) {
1787 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : A handle is not valid");
1788 return TTS_ERROR_INVALID_PARAMETER;
1791 if (TTS_STATE_CREATED != client->current_state) {
1792 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Current state is not 'Created'.");
1793 return TTS_ERROR_INVALID_STATE;
1796 client->state_changed_cb = callback;
1797 client->state_changed_user_data = user_data;
1799 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set state changed cb");
1804 int tts_unset_state_changed_cb(tts_h tts)
1806 if (0 != __tts_get_feature_enabled()) {
1807 return TTS_ERROR_NOT_SUPPORTED;
1811 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Input parameter is null");
1812 return TTS_ERROR_INVALID_PARAMETER;
1815 tts_client_s* client = tts_client_get(tts);
1817 if (NULL == client) {
1818 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : A handle is not valid");
1819 return TTS_ERROR_INVALID_PARAMETER;
1822 if (TTS_STATE_CREATED != client->current_state) {
1823 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Current state is not 'Created'.");
1824 return TTS_ERROR_INVALID_STATE;
1827 client->state_changed_cb = NULL;
1828 client->state_changed_user_data = NULL;
1830 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset state changed cb");
1835 int tts_set_utterance_started_cb(tts_h tts, tts_utterance_started_cb callback, void* user_data)
1837 if (0 != __tts_get_feature_enabled()) {
1838 return TTS_ERROR_NOT_SUPPORTED;
1841 if (NULL == tts || NULL == callback) {
1842 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Input parameter is null");
1843 return TTS_ERROR_INVALID_PARAMETER;
1846 tts_client_s* client = tts_client_get(tts);
1848 if (NULL == client) {
1849 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : A handle is not valid");
1850 return TTS_ERROR_INVALID_PARAMETER;
1853 if (TTS_STATE_CREATED != client->current_state) {
1854 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Current state is not 'Created'.");
1855 return TTS_ERROR_INVALID_STATE;
1858 client->utt_started_cb = callback;
1859 client->utt_started_user_data = user_data;
1861 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt started cb");
1866 int tts_unset_utterance_started_cb(tts_h tts)
1868 if (0 != __tts_get_feature_enabled()) {
1869 return TTS_ERROR_NOT_SUPPORTED;
1873 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Input parameter is null");
1874 return TTS_ERROR_INVALID_PARAMETER;
1877 tts_client_s* client = tts_client_get(tts);
1879 if (NULL == client) {
1880 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : A handle is not valid");
1881 return TTS_ERROR_INVALID_PARAMETER;
1884 if (TTS_STATE_CREATED != client->current_state) {
1885 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Current state is not 'Created'.");
1886 return TTS_ERROR_INVALID_STATE;
1889 client->utt_started_cb = NULL;
1890 client->utt_started_user_data = NULL;
1892 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt started cb");
1897 int tts_set_utterance_completed_cb(tts_h tts, tts_utterance_completed_cb callback, void* user_data)
1899 if (0 != __tts_get_feature_enabled()) {
1900 return TTS_ERROR_NOT_SUPPORTED;
1903 if (NULL == tts || NULL == callback) {
1904 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Input parameter is null");
1905 return TTS_ERROR_INVALID_PARAMETER;
1908 tts_client_s* client = tts_client_get(tts);
1910 if (NULL == client) {
1911 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : A handle is not valid");
1912 return TTS_ERROR_INVALID_PARAMETER;
1915 if (TTS_STATE_CREATED != client->current_state) {
1916 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Current state is not 'Created'.");
1917 return TTS_ERROR_INVALID_STATE;
1920 client->utt_completeted_cb = callback;
1921 client->utt_completed_user_data = user_data;
1923 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt completed cb");
1928 int tts_unset_utterance_completed_cb(tts_h tts)
1930 if (0 != __tts_get_feature_enabled()) {
1931 return TTS_ERROR_NOT_SUPPORTED;
1935 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Input parameter is null");
1936 return TTS_ERROR_INVALID_PARAMETER;
1939 tts_client_s* client = tts_client_get(tts);
1941 if (NULL == client) {
1942 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : A handle is not valid");
1943 return TTS_ERROR_INVALID_PARAMETER;
1946 if (TTS_STATE_CREATED != client->current_state) {
1947 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Current state is not 'Created'.");
1948 return TTS_ERROR_INVALID_STATE;
1951 client->utt_completeted_cb = NULL;
1952 client->utt_completed_user_data = NULL;
1954 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt completed cb");
1958 int tts_set_error_cb(tts_h tts, tts_error_cb callback, void* user_data)
1960 if (0 != __tts_get_feature_enabled()) {
1961 return TTS_ERROR_NOT_SUPPORTED;
1964 if (NULL == tts || NULL == callback) {
1965 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Input parameter is null");
1966 return TTS_ERROR_INVALID_PARAMETER;
1969 tts_client_s* client = tts_client_get(tts);
1971 if (NULL == client) {
1972 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : A handle is not valid");
1973 return TTS_ERROR_INVALID_PARAMETER;
1976 if (TTS_STATE_CREATED != client->current_state) {
1977 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Current state is not 'Created'.");
1978 return TTS_ERROR_INVALID_STATE;
1981 client->error_cb = callback;
1982 client->error_user_data = user_data;
1984 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set error cb");
1989 int tts_unset_error_cb(tts_h tts)
1991 if (0 != __tts_get_feature_enabled()) {
1992 return TTS_ERROR_NOT_SUPPORTED;
1996 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Input parameter is null");
1997 return TTS_ERROR_INVALID_PARAMETER;
2000 tts_client_s* client = tts_client_get(tts);
2002 if (NULL == client) {
2003 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : A handle is not valid");
2004 return TTS_ERROR_INVALID_PARAMETER;
2007 if (TTS_STATE_CREATED != client->current_state) {
2008 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Current state is not 'Created'.");
2009 return TTS_ERROR_INVALID_STATE;
2012 client->error_cb = NULL;
2013 client->error_user_data = NULL;
2015 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset error cb");
2020 int tts_set_default_voice_changed_cb(tts_h tts, tts_default_voice_changed_cb callback, void* user_data)
2022 if (0 != __tts_get_feature_enabled()) {
2023 return TTS_ERROR_NOT_SUPPORTED;
2026 if (NULL == tts || NULL == callback) {
2027 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : Input parameter is null");
2028 return TTS_ERROR_INVALID_PARAMETER;
2031 tts_client_s* client = tts_client_get(tts);
2033 if (NULL == client) {
2034 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : A handle is not valid");
2035 return TTS_ERROR_INVALID_PARAMETER;
2038 if (TTS_STATE_CREATED != client->current_state) {
2039 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : Current state is not 'Created'.");
2040 return TTS_ERROR_INVALID_STATE;
2043 client->default_voice_changed_cb = callback;
2044 client->default_voice_changed_user_data = user_data;
2046 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set default voice changed cb");
2051 int tts_unset_default_voice_changed_cb(tts_h tts)
2053 if (0 != __tts_get_feature_enabled()) {
2054 return TTS_ERROR_NOT_SUPPORTED;
2058 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : Input parameter is null");
2059 return TTS_ERROR_INVALID_PARAMETER;
2062 tts_client_s* client = tts_client_get(tts);
2064 if (NULL == client) {
2065 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : A handle is not valid");
2066 return TTS_ERROR_INVALID_PARAMETER;
2069 if (TTS_STATE_CREATED != client->current_state) {
2070 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : Current state is not 'Created'.");
2071 return TTS_ERROR_INVALID_STATE;
2074 client->default_voice_changed_cb = NULL;
2075 client->default_voice_changed_user_data = NULL;
2077 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset default voice changed cb");
2082 int tts_set_engine_changed_cb(tts_h tts, tts_engine_changed_cb callback, void* user_data)
2084 if (0 != __tts_get_feature_enabled()) {
2085 return TTS_ERROR_NOT_SUPPORTED;
2088 if (NULL == tts || NULL == callback) {
2089 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set engine changed cb : Input parameter is null");
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] Set engine changed cb : A handle is not valid");
2097 return TTS_ERROR_INVALID_PARAMETER;
2100 if (TTS_STATE_CREATED != client->current_state) {
2101 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set engine changed cb : Current state is not 'Created'.");
2102 return TTS_ERROR_INVALID_STATE;
2105 client->engine_changed_cb = callback;
2106 client->engine_changed_user_data = user_data;
2108 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set engine changed cb");
2113 int tts_unset_engine_changed_cb(tts_h tts)
2115 if (0 != __tts_get_feature_enabled()) {
2116 return TTS_ERROR_NOT_SUPPORTED;
2120 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset engine changed cb : Input parameter is null");
2121 return TTS_ERROR_INVALID_PARAMETER;
2124 tts_client_s* client = tts_client_get(tts);
2126 if (NULL == client) {
2127 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset engine changed cb : A handle is not valid");
2128 return TTS_ERROR_INVALID_PARAMETER;
2131 if (TTS_STATE_CREATED != client->current_state) {
2132 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset engine changed cb : Current state is not 'Created'.");
2133 return TTS_ERROR_INVALID_STATE;
2136 client->engine_changed_cb = NULL;
2137 client->engine_changed_user_data = NULL;
2139 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset engine changed cb");