2 * Copyright (c) 2011-2014 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 Ecore_Timer* g_connect_timer = NULL;
32 static bool g_screen_reader;
34 static int g_feature_enabled = -1;
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";
86 return "Invalid error code";
91 static int __tts_convert_config_error_code(tts_config_error_e code)
93 if (code == TTS_CONFIG_ERROR_NONE) return TTS_ERROR_NONE;
94 if (code == TTS_CONFIG_ERROR_OUT_OF_MEMORY) return TTS_ERROR_OUT_OF_MEMORY;
95 if (code == TTS_CONFIG_ERROR_IO_ERROR) return TTS_ERROR_IO_ERROR;
96 if (code == TTS_CONFIG_ERROR_INVALID_PARAMETER) return TTS_ERROR_INVALID_PARAMETER;
97 if (code == TTS_CONFIG_ERROR_INVALID_STATE) return TTS_ERROR_INVALID_STATE;
98 if (code == TTS_CONFIG_ERROR_INVALID_VOICE) return TTS_ERROR_INVALID_VOICE;
99 if (code == TTS_CONFIG_ERROR_ENGINE_NOT_FOUND) return TTS_ERROR_ENGINE_NOT_FOUND;
100 if (code == TTS_CONFIG_ERROR_OPERATION_FAILED) return TTS_ERROR_OPERATION_FAILED;
101 if (code == TTS_CONFIG_ERROR_NOT_SUPPORTED_FEATURE) return TTS_ERROR_OPERATION_FAILED;
106 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)
108 SLOG(LOG_DEBUG, TAG_TTSC, "Voice changed : Before lang(%s) type(%d) , Current lang(%s), type(%d)",
109 before_lang, before_voice_type, language, voice_type);
111 GList* client_list = NULL;
112 client_list = tts_client_get_client_list();
115 tts_client_s *data = NULL;
117 if (g_list_length(client_list) > 0) {
118 /* Get a first item */
119 iter = g_list_first(client_list);
121 while (NULL != iter) {
123 if (NULL != data->default_voice_changed_cb) {
124 SLOG(LOG_DEBUG, TAG_TTSC, "Call default voice changed callback : uid(%d)", data->uid);
125 data->default_voice_changed_cb(data->tts, before_lang, before_voice_type,
126 language, voice_type, data->default_voice_changed_user_data);
130 iter = g_list_next(iter);
137 int tts_create(tts_h* tts)
139 if (0 != __tts_get_feature_enabled()) {
140 return TTS_ERROR_NOT_SUPPORTED;
143 SLOG(LOG_DEBUG, TAG_TTSC, "===== Create TTS");
147 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
148 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
149 SLOG(LOG_DEBUG, TAG_TTSC, " ");
150 return TTS_ERROR_INVALID_PARAMETER;
153 if (0 == tts_client_get_size()) {
154 if (0 != tts_dbus_open_connection()) {
155 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to open dbus connection");
156 return TTS_ERROR_OPERATION_FAILED;
160 if (0 != tts_client_new(tts)) {
161 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to create client!!!!!");
162 return TTS_ERROR_OUT_OF_MEMORY;
165 tts_client_s* client = tts_client_get(*tts);
166 if (NULL == client) {
167 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get client");
168 return TTS_ERROR_OPERATION_FAILED;
171 int ret = tts_config_mgr_initialize(client->uid);
173 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to init config manager : %d", ret);
174 tts_client_destroy(*tts);
175 return __tts_convert_config_error_code(ret);
178 ret = tts_config_mgr_set_callback(client->uid, NULL, __tts_config_voice_changed_cb, NULL, NULL, NULL);
180 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to set config changed : %d", ret);
181 tts_client_destroy(*tts);
182 return __tts_convert_config_error_code(ret);
185 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
186 SLOG(LOG_DEBUG, TAG_TTSC, " ");
188 return TTS_ERROR_NONE;
191 int tts_destroy(tts_h tts)
193 if (0 != __tts_get_feature_enabled()) {
194 return TTS_ERROR_NOT_SUPPORTED;
197 SLOG(LOG_DEBUG, TAG_TTSC, "===== Destroy TTS");
200 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
201 return TTS_ERROR_INVALID_PARAMETER;
204 tts_client_s* client = tts_client_get(tts);
207 if (NULL == client) {
208 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
209 return TTS_ERROR_INVALID_PARAMETER;
212 /* check used callback */
213 if (0 != tts_client_get_use_callback(client)) {
214 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Cannot destroy in Callback function");
215 return TTS_ERROR_OPERATION_FAILED;
218 tts_config_mgr_finalize(client->uid);
224 switch (client->current_state) {
225 case TTS_STATE_PAUSED:
226 case TTS_STATE_PLAYING:
227 case TTS_STATE_READY:
228 if (!(false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode)) {
230 ret = tts_dbus_request_finalize(client->uid);
232 if (TTS_ERROR_TIMED_OUT != ret) {
233 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
236 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry finalize");
239 if (TTS_RETRY_COUNT == count) {
240 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
247 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Do not request finalize : g_sr(%d) mode(%d)", g_screen_reader, client->mode);
250 client->before_state = client->current_state;
251 client->current_state = TTS_STATE_CREATED;
253 case TTS_STATE_CREATED:
254 if (NULL != g_connect_timer) {
255 SLOG(LOG_DEBUG, TAG_TTSC, "Connect Timer is deleted");
256 ecore_timer_del(g_connect_timer);
259 tts_client_destroy(tts);
266 if (0 == tts_client_get_size()) {
267 if (0 != tts_dbus_close_connection()) {
268 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to close connection");
274 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
275 SLOG(LOG_DEBUG, TAG_TTSC, " ");
277 return TTS_ERROR_NONE;
280 void __tts_screen_reader_changed_cb(bool value)
282 g_screen_reader = value;
285 int tts_set_mode(tts_h tts, tts_mode_e mode)
287 if (0 != __tts_get_feature_enabled()) {
288 return TTS_ERROR_NOT_SUPPORTED;
291 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set TTS mode");
293 tts_client_s* client = tts_client_get(tts);
296 if (NULL == client) {
297 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
298 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
299 SLOG(LOG_DEBUG, TAG_TTSC, " ");
300 return TTS_ERROR_INVALID_PARAMETER;
304 if (client->current_state != TTS_STATE_CREATED) {
305 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
306 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
307 SLOG(LOG_DEBUG, TAG_TTSC, " ");
308 return TTS_ERROR_INVALID_STATE;
311 if (TTS_MODE_DEFAULT <= mode && mode <= TTS_MODE_SCREEN_READER) {
314 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] mode is not valid : %d", mode);
315 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
316 SLOG(LOG_DEBUG, TAG_TTSC, " ");
317 return TTS_ERROR_INVALID_PARAMETER;
320 if (TTS_MODE_SCREEN_READER == mode) {
323 ret = vconf_get_bool(TTS_ACCESSIBILITY_KEY, &screen_reader);
325 SLOG(LOG_ERROR, tts_tag(), "[Config ERROR] Fail to get screen reader");
326 return TTS_ERROR_OPERATION_FAILED;
328 g_screen_reader = (bool)screen_reader;
329 tts_config_set_screen_reader_callback(client->uid, __tts_screen_reader_changed_cb);
331 tts_config_unset_screen_reader_callback(client->uid);
334 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
335 SLOG(LOG_DEBUG, TAG_TTSC, " ");
337 return TTS_ERROR_NONE;
340 int tts_get_mode(tts_h tts, tts_mode_e* mode)
342 if (0 != __tts_get_feature_enabled()) {
343 return TTS_ERROR_NOT_SUPPORTED;
346 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get TTS mode");
348 tts_client_s* client = tts_client_get(tts);
351 if (NULL == client) {
352 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
353 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
354 SLOG(LOG_DEBUG, TAG_TTSC, " ");
355 return TTS_ERROR_INVALID_PARAMETER;
359 if (client->current_state != TTS_STATE_CREATED) {
360 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
361 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
362 SLOG(LOG_DEBUG, TAG_TTSC, " ");
363 return TTS_ERROR_INVALID_STATE;
367 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter(mode) is NULL");
368 return TTS_ERROR_INVALID_PARAMETER;
371 *mode = client->mode;
373 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
374 SLOG(LOG_DEBUG, TAG_TTSC, " ");
376 return TTS_ERROR_NONE;
379 static Eina_Bool __tts_connect_daemon(void *data)
381 tts_h tts = (tts_h)data;
382 tts_client_s* client = tts_client_get(tts);
385 if (NULL == client) {
386 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
387 g_connect_timer = NULL;
392 if (0 != tts_dbus_request_hello(client->uid)) {
396 SLOG(LOG_DEBUG, TAG_TTSC, "===== Connect daemon");
398 /* do request initialize */
400 ret = tts_dbus_request_initialize(client->uid);
402 if (TTS_ERROR_ENGINE_NOT_FOUND == ret) {
403 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to initialize : %s", __tts_get_error_code(ret));
405 client->reason = TTS_ERROR_ENGINE_NOT_FOUND;
408 ecore_timer_add(0, __tts_notify_error, (void*)client->tts);
409 g_connect_timer = NULL;
412 } else if (TTS_ERROR_NONE != ret) {
413 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to connection. Retry to connect : %s", __tts_get_error_code(ret));
417 /* success to connect tts-daemon */
420 g_connect_timer = NULL;
422 client = tts_client_get(tts);
424 if (NULL == client) {
425 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
429 client->before_state = client->current_state;
430 client->current_state = TTS_STATE_READY;
432 if (NULL != client->state_changed_cb) {
433 tts_client_use_callback(client);
434 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
435 tts_client_not_use_callback(client);
437 SLOG(LOG_WARN, TAG_TTSC, "State changed callback is NULL");
440 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
441 SLOG(LOG_DEBUG, TAG_TTSC, " ");
446 int tts_prepare(tts_h tts)
448 if (0 != __tts_get_feature_enabled()) {
449 return TTS_ERROR_NOT_SUPPORTED;
452 SLOG(LOG_DEBUG, TAG_TTSC, "===== Prepare TTS");
454 tts_client_s* client = tts_client_get(tts);
457 if (NULL == client) {
458 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
459 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
460 SLOG(LOG_DEBUG, TAG_TTSC, " ");
461 return TTS_ERROR_INVALID_PARAMETER;
465 if (client->current_state != TTS_STATE_CREATED) {
466 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
467 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
468 SLOG(LOG_DEBUG, TAG_TTSC, " ");
469 return TTS_ERROR_INVALID_STATE;
472 g_connect_timer = ecore_timer_add(0, __tts_connect_daemon, (void*)tts);
474 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
475 SLOG(LOG_DEBUG, TAG_TTSC, " ");
477 return TTS_ERROR_NONE;
480 int tts_unprepare(tts_h tts)
482 if (0 != __tts_get_feature_enabled()) {
483 return TTS_ERROR_NOT_SUPPORTED;
486 SLOG(LOG_DEBUG, TAG_TTSC, "===== Unprepare TTS");
488 tts_client_s* client = tts_client_get(tts);
491 if (NULL == client) {
492 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
493 return TTS_ERROR_INVALID_PARAMETER;
497 if (client->current_state != TTS_STATE_READY) {
498 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'READY'");
499 return TTS_ERROR_INVALID_STATE;
504 if (!(false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode)) {
506 ret = tts_dbus_request_finalize(client->uid);
508 if (TTS_ERROR_TIMED_OUT != ret) {
509 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
512 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry finalize : %s", __tts_get_error_code(ret));
515 if (TTS_RETRY_COUNT == count) {
516 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
523 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Do not request finalize : g_sr(%d) mode(%d)", g_screen_reader, client->mode);
526 client->before_state = client->current_state;
527 client->current_state = TTS_STATE_CREATED;
529 if (NULL != client->state_changed_cb) {
530 tts_client_use_callback(client);
531 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
532 tts_client_not_use_callback(client);
533 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
536 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
537 SLOG(LOG_DEBUG, TAG_TTSC, " ");
539 return TTS_ERROR_NONE;
542 bool __tts_supported_voice_cb(const char* engine_id, const char* language, int type, void* user_data)
544 tts_h tts = (tts_h)user_data;
546 tts_client_s* client = tts_client_get(tts);
547 if (NULL == client) {
548 SLOG(LOG_ERROR, TAG_TTSC, "[WARNING] A handle is not valid");
552 /* call callback function */
553 if (NULL != client->supported_voice_cb) {
554 return client->supported_voice_cb(tts, language, type, client->supported_voice_user_data);
556 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of supported voice");
562 int tts_foreach_supported_voices(tts_h tts, tts_supported_voice_cb callback, void* user_data)
564 if (0 != __tts_get_feature_enabled()) {
565 return TTS_ERROR_NOT_SUPPORTED;
568 SLOG(LOG_DEBUG, TAG_TTSC, "===== Foreach supported voices");
570 if (NULL == tts || NULL == callback) {
571 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
572 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
573 SLOG(LOG_DEBUG, TAG_TTSC, " ");
574 return TTS_ERROR_INVALID_PARAMETER;
577 tts_client_s* client = tts_client_get(tts);
580 if (NULL == client) {
581 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
582 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
583 SLOG(LOG_DEBUG, TAG_TTSC, " ");
584 return TTS_ERROR_INVALID_PARAMETER;
588 char* current_engine = NULL;
589 ret = tts_config_mgr_get_engine(¤t_engine);
591 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get current engine : %d", ret);
592 return __tts_convert_config_error_code(ret);
595 client->supported_voice_cb = callback;
596 client->supported_voice_user_data = user_data;
598 ret = tts_config_mgr_get_voice_list(current_engine, __tts_supported_voice_cb, client->tts);
600 if (NULL != current_engine)
601 free(current_engine);
603 client->supported_voice_cb = NULL;
604 client->supported_voice_user_data = NULL;
607 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
608 ret = TTS_ERROR_OPERATION_FAILED;
611 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
612 SLOG(LOG_DEBUG, TAG_TTSC, " ");
617 int tts_get_default_voice(tts_h tts, char** lang, int* vctype)
619 if (0 != __tts_get_feature_enabled()) {
620 return TTS_ERROR_NOT_SUPPORTED;
623 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get default voice");
626 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
627 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
628 SLOG(LOG_DEBUG, TAG_TTSC, " ");
629 return TTS_ERROR_INVALID_PARAMETER;
632 tts_client_s* client = tts_client_get(tts);
634 if (NULL == client) {
635 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
636 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
637 SLOG(LOG_DEBUG, TAG_TTSC, " ");
638 return TTS_ERROR_INVALID_PARAMETER;
641 /* Request call remote method */
643 ret = tts_config_mgr_get_voice(lang, vctype);
645 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
646 return __tts_convert_config_error_code(ret);
648 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] Default language(%s), type(%d)", *lang, *vctype);
651 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
652 SLOG(LOG_DEBUG, TAG_TTSC, " ");
657 int tts_get_max_text_size(tts_h tts, unsigned int* size)
659 if (0 != __tts_get_feature_enabled()) {
660 return TTS_ERROR_NOT_SUPPORTED;
663 if (NULL == tts || NULL == size) {
664 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Input parameter is null");
665 return TTS_ERROR_INVALID_PARAMETER;
668 tts_client_s* client = tts_client_get(tts);
670 if (NULL == client) {
671 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : A handle is not valid");
672 return TTS_ERROR_INVALID_PARAMETER;
675 if (TTS_STATE_READY != client->current_state) {
676 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Current state is NOT 'READY'.");
677 return TTS_ERROR_INVALID_STATE;
680 *size = TTS_MAX_TEXT_SIZE;
682 SLOG(LOG_DEBUG, TAG_TTSC, "Get max text count : %d", *size);
683 return TTS_ERROR_NONE;
686 int tts_get_state(tts_h tts, tts_state_e* state)
688 if (0 != __tts_get_feature_enabled()) {
689 return TTS_ERROR_NOT_SUPPORTED;
692 if (NULL == tts || NULL == state) {
693 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : Input parameter is null");
694 return TTS_ERROR_INVALID_PARAMETER;
697 tts_client_s* client = tts_client_get(tts);
699 if (NULL == client) {
700 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
701 return TTS_ERROR_INVALID_PARAMETER;
704 *state = client->current_state;
707 case TTS_STATE_CREATED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Created'"); break;
708 case TTS_STATE_READY: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Ready'"); break;
709 case TTS_STATE_PLAYING: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Playing'"); break;
710 case TTS_STATE_PAUSED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Paused'"); break;
711 default: SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid value"); break;
714 return TTS_ERROR_NONE;
717 int tts_get_speed_range(tts_h tts, int* min, int* normal, int* max)
719 if (0 != __tts_get_feature_enabled()) {
720 return TTS_ERROR_NOT_SUPPORTED;
723 if (NULL == tts || NULL == min || NULL == normal || NULL == max) {
724 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
725 return TTS_ERROR_INVALID_PARAMETER;
728 tts_client_s* client = tts_client_get(tts);
730 if (NULL == client) {
731 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
732 return TTS_ERROR_INVALID_PARAMETER;
735 *min = TTS_SPEED_MIN;
736 *normal = TTS_SPEED_NORMAL;
737 *max = TTS_SPEED_MAX;
739 return TTS_ERROR_NONE;
742 int tts_add_text(tts_h tts, const char* text, const char* language, int voice_type, int speed, int* utt_id)
744 if (0 != __tts_get_feature_enabled()) {
745 return TTS_ERROR_NOT_SUPPORTED;
749 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Speed should not be negative(%d)", speed);
750 return TTS_ERROR_INVALID_PARAMETER;
753 if (voice_type < 0) {
754 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Voice type should not be negative(%d)", voice_type);
755 return TTS_ERROR_INVALID_PARAMETER;
758 SLOG(LOG_DEBUG, TAG_TTSC, "===== Add text");
760 if (NULL == tts || NULL == utt_id) {
761 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
762 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
763 SLOG(LOG_DEBUG, TAG_TTSC, " ");
764 return TTS_ERROR_INVALID_PARAMETER;
767 tts_client_s* client = tts_client_get(tts);
769 if (NULL == client) {
770 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
771 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
772 SLOG(LOG_DEBUG, TAG_TTSC, " ");
773 return TTS_ERROR_INVALID_PARAMETER;
776 if (TTS_STATE_CREATED == client->current_state) {
777 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
778 return TTS_ERROR_INVALID_STATE;
781 if (TTS_MAX_TEXT_SIZE < strlen(text) || strlen(text) <= 0) {
782 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input text size is invalid.");
783 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
784 SLOG(LOG_DEBUG, TAG_TTSC, " ");
785 return TTS_ERROR_INVALID_PARAMETER;
788 if (TTS_SPEED_AUTO > speed || TTS_SPEED_MAX < speed) {
789 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] speed value(%d) is invalid.", speed);
790 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
791 SLOG(LOG_DEBUG, TAG_TTSC, " ");
792 return TTS_ERROR_INVALID_PARAMETER;
795 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
796 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
797 return TTS_ERROR_INVALID_STATE;
800 /* check valid utf8 */
802 ict = iconv_open("utf-8", "");
803 if ((iconv_t)-1 == ict) {
804 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to init for text check");
805 return TTS_ERROR_OPERATION_FAILED;
808 size_t len = strlen(text);
810 char in_buf[TTS_MAX_TEXT_SIZE];
811 char *out_tmp = NULL;
812 char out_buf[TTS_MAX_TEXT_SIZE];
813 size_t len_tmp = sizeof(out_buf);
815 memset(in_buf, 0, TTS_MAX_TEXT_SIZE);
816 snprintf(in_buf, TTS_MAX_TEXT_SIZE, "%s", text);
819 memset(out_buf, 0, TTS_MAX_TEXT_SIZE);
823 st = iconv(ict, &in_tmp, &len, &out_tmp, &len_tmp);
824 if ((size_t)-1 == st) {
825 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Text is invalid - '%s'", in_buf);
827 return TTS_ERROR_INVALID_PARAMETER;
830 SLOG(LOG_DEBUG, TAG_TTSC, "Text is valid - Converted text is '%s'", out_buf);
832 /* change default language value */
835 if (NULL == language)
836 temp = strdup("default");
838 temp = strdup(language);
840 client->current_utt_id++;
841 if (client->current_utt_id == 10000) {
842 client->current_utt_id = 1;
849 ret = tts_dbus_request_add_text(client->uid, out_buf, temp, voice_type, speed, client->current_utt_id);
851 if (TTS_ERROR_TIMED_OUT != ret) {
852 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
855 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry add text : %s", __tts_get_error_code(ret));
858 if (TTS_RETRY_COUNT == count) {
859 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
864 *utt_id = client->current_utt_id;
868 if (NULL != temp) free(temp);
870 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
871 SLOG(LOG_DEBUG, TAG_TTSC, " ");
876 static void __tts_play_async(void *data)
878 tts_h tts = (tts_h)data;
879 tts_client_s* client = tts_client_get(tts);
882 if (NULL == client) {
883 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
890 ret = tts_dbus_request_play(client->uid);
892 if (TTS_ERROR_TIMED_OUT != ret) {
893 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
896 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry play : %s", __tts_get_error_code(ret));
899 if (TTS_RETRY_COUNT == count) {
900 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
908 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to play tts : %s", __tts_get_error_code(ret));
910 client->reason = ret;
913 ecore_timer_add(0, __tts_notify_error, client->tts);
917 client->before_state = client->current_state;
918 client->current_state = TTS_STATE_PLAYING;
920 if (NULL != client->state_changed_cb) {
921 tts_client_use_callback(client);
922 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
923 tts_client_not_use_callback(client);
924 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
927 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
928 SLOG(LOG_DEBUG, TAG_TTSC, " ");
933 int tts_play_async(tts_h tts)
935 if (0 != __tts_get_feature_enabled()) {
936 return TTS_ERROR_NOT_SUPPORTED;
939 SLOG(LOG_DEBUG, TAG_TTSC, "===== Play tts");
942 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
943 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
944 SLOG(LOG_DEBUG, TAG_TTSC, " ");
945 return TTS_ERROR_INVALID_PARAMETER;
948 tts_client_s* client = tts_client_get(tts);
950 if (NULL == client) {
951 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
952 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
953 SLOG(LOG_DEBUG, TAG_TTSC, " ");
954 return TTS_ERROR_INVALID_PARAMETER;
957 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
958 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
959 return TTS_ERROR_INVALID_STATE;
962 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
963 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
964 return TTS_ERROR_INVALID_STATE;
967 ecore_main_loop_thread_safe_call_async(__tts_play_async, (void*)tts);
969 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
970 SLOG(LOG_DEBUG, TAG_TTSC, " ");
972 return TTS_ERROR_NONE;
975 int tts_play(tts_h tts)
977 if (0 != __tts_get_feature_enabled()) {
978 return TTS_ERROR_NOT_SUPPORTED;
981 SLOG(LOG_DEBUG, TAG_TTSC, "===== Play tts");
984 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
985 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
986 SLOG(LOG_DEBUG, TAG_TTSC, " ");
987 return TTS_ERROR_INVALID_PARAMETER;
990 tts_client_s* client = tts_client_get(tts);
992 if (NULL == client) {
993 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
994 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
995 SLOG(LOG_DEBUG, TAG_TTSC, " ");
996 return TTS_ERROR_INVALID_PARAMETER;
999 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
1000 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
1001 return TTS_ERROR_INVALID_STATE;
1004 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1005 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1006 return TTS_ERROR_INVALID_STATE;
1012 ret = tts_dbus_request_play(client->uid);
1014 if (TTS_ERROR_TIMED_OUT != ret) {
1015 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1018 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry play : %s", __tts_get_error_code(ret));
1021 if (TTS_RETRY_COUNT == count) {
1022 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1029 client->before_state = client->current_state;
1030 client->current_state = TTS_STATE_PLAYING;
1032 if (NULL != client->state_changed_cb) {
1033 tts_client_use_callback(client);
1034 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1035 tts_client_not_use_callback(client);
1036 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1039 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1040 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1042 return TTS_ERROR_NONE;
1045 static void __tts_stop_async(void *data)
1047 tts_h tts = (tts_h)data;
1048 tts_client_s* client = tts_client_get(tts);
1051 if (NULL == client) {
1052 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1059 ret = tts_dbus_request_stop(client->uid);
1061 if (TTS_ERROR_TIMED_OUT != ret) {
1062 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1065 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry stop : %s", __tts_get_error_code(ret));
1068 if (TTS_RETRY_COUNT == count) {
1069 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1077 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to stop tts : %s", __tts_get_error_code(ret));
1079 client->reason = ret;
1080 client->utt_id = -1;
1082 ecore_timer_add(0, __tts_notify_error, client->tts);
1086 client->before_state = client->current_state;
1087 client->current_state = TTS_STATE_READY;
1089 if (NULL != client->state_changed_cb) {
1090 tts_client_use_callback(client);
1091 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1092 tts_client_not_use_callback(client);
1093 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1096 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1097 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1102 int tts_stop_aync(tts_h tts)
1104 if (0 != __tts_get_feature_enabled()) {
1105 return TTS_ERROR_NOT_SUPPORTED;
1108 SLOG(LOG_DEBUG, TAG_TTSC, "===== Stop tts");
1111 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1112 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1113 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1114 return TTS_ERROR_INVALID_PARAMETER;
1117 tts_client_s* client = tts_client_get(tts);
1119 if (NULL == client) {
1120 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1121 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1122 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1123 return TTS_ERROR_INVALID_PARAMETER;
1126 if (TTS_STATE_CREATED == client->current_state) {
1127 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
1128 return TTS_ERROR_INVALID_STATE;
1131 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1132 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1133 return TTS_ERROR_INVALID_STATE;
1136 ecore_main_loop_thread_safe_call_async(__tts_stop_async, (void*)tts);
1138 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1139 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1141 return TTS_ERROR_NONE;
1144 int tts_stop(tts_h tts)
1146 if (0 != __tts_get_feature_enabled()) {
1147 return TTS_ERROR_NOT_SUPPORTED;
1150 SLOG(LOG_DEBUG, TAG_TTSC, "===== Stop tts");
1153 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1154 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1155 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1156 return TTS_ERROR_INVALID_PARAMETER;
1159 tts_client_s* client = tts_client_get(tts);
1161 if (NULL == client) {
1162 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1163 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1164 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1165 return TTS_ERROR_INVALID_PARAMETER;
1168 if (TTS_STATE_CREATED == client->current_state) {
1169 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
1170 return TTS_ERROR_INVALID_STATE;
1173 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1174 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1175 return TTS_ERROR_INVALID_STATE;
1181 ret = tts_dbus_request_stop(client->uid);
1183 if (TTS_ERROR_TIMED_OUT != ret) {
1184 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1187 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry stop : %s", __tts_get_error_code(ret));
1190 if (TTS_RETRY_COUNT == count) {
1191 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1198 client->before_state = client->current_state;
1199 client->current_state = TTS_STATE_READY;
1201 if (NULL != client->state_changed_cb) {
1202 tts_client_use_callback(client);
1203 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1204 tts_client_not_use_callback(client);
1205 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1208 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1209 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1211 return TTS_ERROR_NONE;
1214 static void __tts_pause_async(void *data)
1216 tts_h tts = (tts_h)data;
1217 tts_client_s* client = tts_client_get(tts);
1220 if (NULL == client) {
1221 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1228 ret = tts_dbus_request_pause(client->uid);
1230 if (TTS_ERROR_TIMED_OUT != ret) {
1231 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1234 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry pause : %s", __tts_get_error_code(ret));
1237 if (TTS_RETRY_COUNT == count) {
1238 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1246 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to pause tts : %s", __tts_get_error_code(ret));
1248 client->reason = ret;
1249 client->utt_id = -1;
1251 ecore_timer_add(0, __tts_notify_error, client->tts);
1255 client->before_state = client->current_state;
1256 client->current_state = TTS_STATE_PAUSED;
1258 if (NULL != client->state_changed_cb) {
1259 tts_client_use_callback(client);
1260 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1261 tts_client_not_use_callback(client);
1262 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1265 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1266 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1271 int tts_pause_async(tts_h tts)
1273 if (0 != __tts_get_feature_enabled()) {
1274 return TTS_ERROR_NOT_SUPPORTED;
1277 SLOG(LOG_DEBUG, TAG_TTSC, "===== Pause tts");
1280 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1281 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1282 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1283 return TTS_ERROR_INVALID_PARAMETER;
1286 tts_client_s* client = tts_client_get(tts);
1288 if (NULL == client) {
1289 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1290 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1291 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1292 return TTS_ERROR_INVALID_PARAMETER;
1295 if (TTS_STATE_PLAYING != client->current_state) {
1296 SLOG(LOG_ERROR, TAG_TTSC, "[Error] The Current state is NOT 'playing'. So this request should be not running.");
1297 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1298 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1299 return TTS_ERROR_INVALID_STATE;
1302 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1303 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1304 return TTS_ERROR_INVALID_STATE;
1307 ecore_main_loop_thread_safe_call_async(__tts_pause_async, (void*)tts);
1309 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1310 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1312 return TTS_ERROR_NONE;
1315 int tts_pause(tts_h tts)
1317 if (0 != __tts_get_feature_enabled()) {
1318 return TTS_ERROR_NOT_SUPPORTED;
1321 SLOG(LOG_DEBUG, TAG_TTSC, "===== Pause tts");
1324 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1325 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1326 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1327 return TTS_ERROR_INVALID_PARAMETER;
1330 tts_client_s* client = tts_client_get(tts);
1332 if (NULL == client) {
1333 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1334 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1335 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1336 return TTS_ERROR_INVALID_PARAMETER;
1339 if (TTS_STATE_PLAYING != client->current_state) {
1340 SLOG(LOG_ERROR, TAG_TTSC, "[Error] The Current state is NOT 'playing'. So this request should be not running.");
1341 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1342 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1343 return TTS_ERROR_INVALID_STATE;
1346 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1347 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1348 return TTS_ERROR_INVALID_STATE;
1354 ret = tts_dbus_request_pause(client->uid);
1356 if (TTS_ERROR_TIMED_OUT != ret) {
1357 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1360 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry pause : %s", __tts_get_error_code(ret));
1363 if (TTS_RETRY_COUNT == count) {
1364 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1371 client->before_state = client->current_state;
1372 client->current_state = TTS_STATE_PAUSED;
1374 if (NULL != client->state_changed_cb) {
1375 tts_client_use_callback(client);
1376 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1377 tts_client_not_use_callback(client);
1378 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1381 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1382 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1384 return TTS_ERROR_NONE;
1387 static Eina_Bool __tts_notify_error(void *data)
1389 tts_h tts = (tts_h)data;
1391 tts_client_s* client = tts_client_get(tts);
1394 if (NULL == client) {
1395 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify error msg : A handle is not valid");
1399 SLOG(LOG_DEBUG, TAG_TTSC, "Error data : uttid(%d) reason(%s)", client->utt_id, __tts_get_error_code(client->reason));
1401 if (NULL != client->error_cb) {
1402 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of error");
1403 tts_client_use_callback(client);
1404 client->error_cb(client->tts, client->utt_id, client->reason, client->error_user_data);
1405 tts_client_not_use_callback(client);
1407 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
1413 int __tts_cb_error(int uid, tts_error_e reason, int utt_id)
1415 tts_client_s* client = tts_client_get_by_uid(uid);
1417 if (NULL == client) {
1418 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
1419 return TTS_ERROR_INVALID_PARAMETER;
1422 client->utt_id = utt_id;
1423 client->reason = reason;
1425 /* call callback function */
1426 if (NULL != client->error_cb) {
1427 ecore_timer_add(0, __tts_notify_error, client->tts);
1429 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
1435 static Eina_Bool __tts_notify_state_changed(void *data)
1437 tts_h tts = (tts_h)data;
1439 tts_client_s* client = tts_client_get(tts);
1442 if (NULL == client) {
1443 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify state changed : A handle is not valid");
1447 if (NULL != client->state_changed_cb) {
1448 tts_client_use_callback(client);
1449 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1450 tts_client_not_use_callback(client);
1451 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called : pre(%d) cur(%d)", client->before_state, client->current_state);
1453 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
1459 int __tts_cb_set_state(int uid, int state)
1461 tts_client_s* client = tts_client_get_by_uid(uid);
1462 if (NULL == client) {
1463 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] The handle is not valid");
1467 tts_state_e state_from_daemon = (tts_state_e)state;
1469 if (client->current_state == state_from_daemon) {
1470 SLOG(LOG_DEBUG, TAG_TTSC, "Current state has already been %d", client->current_state);
1474 if (NULL != client->state_changed_cb) {
1475 ecore_timer_add(0, __tts_notify_state_changed, client->tts);
1477 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
1480 client->before_state = client->current_state;
1481 client->current_state = state_from_daemon;
1486 int __tts_cb_utt_started(int uid, int utt_id)
1488 tts_client_s* client = tts_client_get_by_uid(uid);
1490 if (NULL == client) {
1491 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
1492 return TTS_ERROR_INVALID_PARAMETER;
1495 SLOG(LOG_DEBUG, TAG_TTSC, "utterance started : utt id(%d) ", utt_id);
1497 client->utt_id = utt_id;
1499 /* call callback function */
1500 if (NULL != client->utt_started_cb) {
1501 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance started ");
1502 tts_client_use_callback(client);
1503 client->utt_started_cb(client->tts, client->utt_id, client->utt_started_user_data);
1504 tts_client_not_use_callback(client);
1506 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance started ");
1512 int __tts_cb_utt_completed(int uid, int utt_id)
1514 tts_client_s* client = tts_client_get_by_uid(uid);
1516 if (NULL == client) {
1517 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
1518 return TTS_ERROR_INVALID_PARAMETER;
1521 SLOG(LOG_DEBUG, TAG_TTSC, "utterance completed : uttid(%d) ", utt_id);
1523 client->utt_id = utt_id;
1525 /* call callback function */
1526 if (NULL != client->utt_completeted_cb) {
1527 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance completed ");
1528 tts_client_use_callback(client);
1529 client->utt_completeted_cb(client->tts, client->utt_id, client->utt_completed_user_data);
1530 tts_client_not_use_callback(client);
1532 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance completed ");
1538 int tts_set_state_changed_cb(tts_h tts, tts_state_changed_cb callback, void* user_data)
1540 if (0 != __tts_get_feature_enabled()) {
1541 return TTS_ERROR_NOT_SUPPORTED;
1544 if (NULL == tts || NULL == callback) {
1545 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Input parameter is null");
1546 return TTS_ERROR_INVALID_PARAMETER;
1549 tts_client_s* client = tts_client_get(tts);
1551 if (NULL == client) {
1552 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : A handle is not valid");
1553 return TTS_ERROR_INVALID_PARAMETER;
1556 if (TTS_STATE_CREATED != client->current_state) {
1557 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Current state is not 'Created'.");
1558 return TTS_ERROR_INVALID_STATE;
1561 client->state_changed_cb = callback;
1562 client->state_changed_user_data = user_data;
1564 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set state changed cb");
1569 int tts_unset_state_changed_cb(tts_h tts)
1571 if (0 != __tts_get_feature_enabled()) {
1572 return TTS_ERROR_NOT_SUPPORTED;
1576 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Input parameter is null");
1577 return TTS_ERROR_INVALID_PARAMETER;
1580 tts_client_s* client = tts_client_get(tts);
1582 if (NULL == client) {
1583 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : A handle is not valid");
1584 return TTS_ERROR_INVALID_PARAMETER;
1587 if (TTS_STATE_CREATED != client->current_state) {
1588 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Current state is not 'Created'.");
1589 return TTS_ERROR_INVALID_STATE;
1592 client->state_changed_cb = NULL;
1593 client->state_changed_user_data = NULL;
1595 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset state changed cb");
1600 int tts_set_utterance_started_cb(tts_h tts, tts_utterance_started_cb callback, void* user_data)
1602 if (0 != __tts_get_feature_enabled()) {
1603 return TTS_ERROR_NOT_SUPPORTED;
1606 if (NULL == tts || NULL == callback) {
1607 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Input parameter is null");
1608 return TTS_ERROR_INVALID_PARAMETER;
1611 tts_client_s* client = tts_client_get(tts);
1613 if (NULL == client) {
1614 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : A handle is not valid");
1615 return TTS_ERROR_INVALID_PARAMETER;
1618 if (TTS_STATE_CREATED != client->current_state) {
1619 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Current state is not 'Created'.");
1620 return TTS_ERROR_INVALID_STATE;
1623 client->utt_started_cb = callback;
1624 client->utt_started_user_data = user_data;
1626 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt started cb");
1631 int tts_unset_utterance_started_cb(tts_h tts)
1633 if (0 != __tts_get_feature_enabled()) {
1634 return TTS_ERROR_NOT_SUPPORTED;
1638 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Input parameter is null");
1639 return TTS_ERROR_INVALID_PARAMETER;
1642 tts_client_s* client = tts_client_get(tts);
1644 if (NULL == client) {
1645 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : A handle is not valid");
1646 return TTS_ERROR_INVALID_PARAMETER;
1649 if (TTS_STATE_CREATED != client->current_state) {
1650 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Current state is not 'Created'.");
1651 return TTS_ERROR_INVALID_STATE;
1654 client->utt_started_cb = NULL;
1655 client->utt_started_user_data = NULL;
1657 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt started cb");
1662 int tts_set_utterance_completed_cb(tts_h tts, tts_utterance_completed_cb callback, void* user_data)
1664 if (0 != __tts_get_feature_enabled()) {
1665 return TTS_ERROR_NOT_SUPPORTED;
1668 if (NULL == tts || NULL == callback) {
1669 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Input parameter is null");
1670 return TTS_ERROR_INVALID_PARAMETER;
1673 tts_client_s* client = tts_client_get(tts);
1675 if (NULL == client) {
1676 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : A handle is not valid");
1677 return TTS_ERROR_INVALID_PARAMETER;
1680 if (TTS_STATE_CREATED != client->current_state) {
1681 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Current state is not 'Created'.");
1682 return TTS_ERROR_INVALID_STATE;
1685 client->utt_completeted_cb = callback;
1686 client->utt_completed_user_data = user_data;
1688 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt completed cb");
1693 int tts_unset_utterance_completed_cb(tts_h tts)
1695 if (0 != __tts_get_feature_enabled()) {
1696 return TTS_ERROR_NOT_SUPPORTED;
1700 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Input parameter is null");
1701 return TTS_ERROR_INVALID_PARAMETER;
1704 tts_client_s* client = tts_client_get(tts);
1706 if (NULL == client) {
1707 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : A handle is not valid");
1708 return TTS_ERROR_INVALID_PARAMETER;
1711 if (TTS_STATE_CREATED != client->current_state) {
1712 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Current state is not 'Created'.");
1713 return TTS_ERROR_INVALID_STATE;
1716 client->utt_completeted_cb = NULL;
1717 client->utt_completed_user_data = NULL;
1719 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt completed cb");
1723 int tts_set_error_cb(tts_h tts, tts_error_cb callback, void* user_data)
1725 if (0 != __tts_get_feature_enabled()) {
1726 return TTS_ERROR_NOT_SUPPORTED;
1729 if (NULL == tts || NULL == callback) {
1730 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Input parameter is null");
1731 return TTS_ERROR_INVALID_PARAMETER;
1734 tts_client_s* client = tts_client_get(tts);
1736 if (NULL == client) {
1737 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : A handle is not valid");
1738 return TTS_ERROR_INVALID_PARAMETER;
1741 if (TTS_STATE_CREATED != client->current_state) {
1742 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Current state is not 'Created'.");
1743 return TTS_ERROR_INVALID_STATE;
1746 client->error_cb = callback;
1747 client->error_user_data = user_data;
1749 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set error cb");
1754 int tts_unset_error_cb(tts_h tts)
1756 if (0 != __tts_get_feature_enabled()) {
1757 return TTS_ERROR_NOT_SUPPORTED;
1761 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Input parameter is null");
1762 return TTS_ERROR_INVALID_PARAMETER;
1765 tts_client_s* client = tts_client_get(tts);
1767 if (NULL == client) {
1768 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : A handle is not valid");
1769 return TTS_ERROR_INVALID_PARAMETER;
1772 if (TTS_STATE_CREATED != client->current_state) {
1773 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Current state is not 'Created'.");
1774 return TTS_ERROR_INVALID_STATE;
1777 client->error_cb = NULL;
1778 client->error_user_data = NULL;
1780 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset error cb");
1785 int tts_set_default_voice_changed_cb(tts_h tts, tts_default_voice_changed_cb callback, void* user_data)
1787 if (0 != __tts_get_feature_enabled()) {
1788 return TTS_ERROR_NOT_SUPPORTED;
1791 if (NULL == tts || NULL == callback) {
1792 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : Input parameter is null");
1793 return TTS_ERROR_INVALID_PARAMETER;
1796 tts_client_s* client = tts_client_get(tts);
1798 if (NULL == client) {
1799 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : A handle is not valid");
1800 return TTS_ERROR_INVALID_PARAMETER;
1803 if (TTS_STATE_CREATED != client->current_state) {
1804 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : Current state is not 'Created'.");
1805 return TTS_ERROR_INVALID_STATE;
1808 client->default_voice_changed_cb = callback;
1809 client->default_voice_changed_user_data = user_data;
1811 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set default voice changed cb");
1816 int tts_unset_default_voice_changed_cb(tts_h tts)
1818 if (0 != __tts_get_feature_enabled()) {
1819 return TTS_ERROR_NOT_SUPPORTED;
1823 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : Input parameter is null");
1824 return TTS_ERROR_INVALID_PARAMETER;
1827 tts_client_s* client = tts_client_get(tts);
1829 if (NULL == client) {
1830 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : A handle is not valid");
1831 return TTS_ERROR_INVALID_PARAMETER;
1834 if (TTS_STATE_CREATED != client->current_state) {
1835 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : Current state is not 'Created'.");
1836 return TTS_ERROR_INVALID_STATE;
1839 client->default_voice_changed_cb = NULL;
1840 client->default_voice_changed_user_data = NULL;
1842 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset default voice changed cb");