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 /* Function definition */
35 static Eina_Bool __tts_notify_state_changed(void *data);
36 static Eina_Bool __tts_notify_error(void *data);
43 static const char* __tts_get_error_code(tts_error_e err)
46 case TTS_ERROR_NONE: return "TTS_ERROR_NONE";
47 case TTS_ERROR_OUT_OF_MEMORY: return "TTS_ERROR_OUT_OF_MEMORY";
48 case TTS_ERROR_IO_ERROR: return "TTS_ERROR_IO_ERROR";
49 case TTS_ERROR_INVALID_PARAMETER: return "TTS_ERROR_INVALID_PARAMETER";
50 case TTS_ERROR_OUT_OF_NETWORK: return "TTS_ERROR_OUT_OF_NETWORK";
51 case TTS_ERROR_TIMED_OUT: return "TTS_ERROR_TIMED_OUT";
52 case TTS_ERROR_PERMISSION_DENIED: return "TTS_ERROR_PERMISSION_DENIED";
53 case TTS_ERROR_NOT_SUPPORTED: return "TTS_ERROR_NOT_SUPPORTED";
54 case TTS_ERROR_INVALID_STATE: return "TTS_ERROR_INVALID_STATE";
55 case TTS_ERROR_INVALID_VOICE: return "TTS_ERROR_INVALID_VOICE";
56 case TTS_ERROR_ENGINE_NOT_FOUND: return "TTS_ERROR_ENGINE_NOT_FOUND";
57 case TTS_ERROR_OPERATION_FAILED: return "TTS_ERROR_OPERATION_FAILED";
58 case TTS_ERROR_AUDIO_POLICY_BLOCKED: return "TTS_ERROR_AUDIO_POLICY_BLOCKED";
60 return "Invalid error code";
65 static int __tts_convert_config_error_code(tts_config_error_e code)
67 if (code == TTS_CONFIG_ERROR_NONE) return TTS_ERROR_NONE;
68 if (code == TTS_CONFIG_ERROR_OUT_OF_MEMORY) return TTS_ERROR_OUT_OF_MEMORY;
69 if (code == TTS_CONFIG_ERROR_IO_ERROR) return TTS_ERROR_IO_ERROR;
70 if (code == TTS_CONFIG_ERROR_INVALID_PARAMETER) return TTS_ERROR_INVALID_PARAMETER;
71 if (code == TTS_CONFIG_ERROR_INVALID_STATE) return TTS_ERROR_INVALID_STATE;
72 if (code == TTS_CONFIG_ERROR_INVALID_VOICE) return TTS_ERROR_INVALID_VOICE;
73 if (code == TTS_CONFIG_ERROR_ENGINE_NOT_FOUND) return TTS_ERROR_ENGINE_NOT_FOUND;
74 if (code == TTS_CONFIG_ERROR_OPERATION_FAILED) return TTS_ERROR_OPERATION_FAILED;
75 if (code == TTS_CONFIG_ERROR_NOT_SUPPORTED_FEATURE) return TTS_ERROR_OPERATION_FAILED;
80 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)
82 SLOG(LOG_DEBUG, TAG_TTSC, "Voice changed : Before lang(%s) type(%d) , Current lang(%s), type(%d)",
83 before_lang, before_voice_type, language, voice_type);
85 GList* client_list = NULL;
86 client_list = tts_client_get_client_list();
89 tts_client_s *data = NULL;
91 if (g_list_length(client_list) > 0) {
92 /* Get a first item */
93 iter = g_list_first(client_list);
95 while (NULL != iter) {
97 if (NULL != data->default_voice_changed_cb) {
98 SLOG(LOG_DEBUG, TAG_TTSC, "Call default voice changed callback : uid(%d)", data->uid);
99 data->default_voice_changed_cb(data->tts, before_lang, before_voice_type,
100 language, voice_type, data->default_voice_changed_user_data);
104 iter = g_list_next(iter);
111 int tts_create(tts_h* tts)
113 bool tts_supported = false;
114 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
115 if (false == tts_supported) {
116 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
117 return TTS_ERROR_NOT_SUPPORTED;
121 SLOG(LOG_DEBUG, TAG_TTSC, "===== Create TTS");
125 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
126 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
127 SLOG(LOG_DEBUG, TAG_TTSC, " ");
128 return TTS_ERROR_INVALID_PARAMETER;
131 if (0 == tts_client_get_size()) {
132 if (0 != tts_dbus_open_connection()) {
133 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to open dbus connection");
134 return TTS_ERROR_OPERATION_FAILED;
138 if (0 != tts_client_new(tts)) {
139 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to create client!!!!!");
140 return TTS_ERROR_OUT_OF_MEMORY;
143 tts_client_s* client = tts_client_get(*tts);
144 if (NULL == client) {
145 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get client");
146 return TTS_ERROR_OPERATION_FAILED;
149 int ret = tts_config_mgr_initialize(client->uid);
151 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to init config manager : %d", ret);
152 tts_client_destroy(*tts);
153 return __tts_convert_config_error_code(ret);
156 ret = tts_config_mgr_set_callback(client->uid, NULL, __tts_config_voice_changed_cb, NULL, NULL, NULL);
158 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to set config changed : %d", ret);
159 tts_client_destroy(*tts);
160 return __tts_convert_config_error_code(ret);
163 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
164 SLOG(LOG_DEBUG, TAG_TTSC, " ");
166 return TTS_ERROR_NONE;
169 int tts_destroy(tts_h tts)
171 bool tts_supported = false;
172 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
173 if (false == tts_supported) {
174 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
175 return TTS_ERROR_NOT_SUPPORTED;
179 SLOG(LOG_DEBUG, TAG_TTSC, "===== Destroy TTS");
182 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
183 return TTS_ERROR_INVALID_PARAMETER;
186 tts_client_s* client = tts_client_get(tts);
189 if (NULL == client) {
190 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
191 return TTS_ERROR_INVALID_PARAMETER;
194 /* check used callback */
195 if (0 != tts_client_get_use_callback(client)) {
196 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Cannot destroy in Callback function");
197 return TTS_ERROR_OPERATION_FAILED;
200 tts_config_mgr_finalize(client->uid);
206 switch (client->current_state) {
207 case TTS_STATE_PAUSED:
208 case TTS_STATE_PLAYING:
209 case TTS_STATE_READY:
210 if (!(false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode)) {
212 ret = tts_dbus_request_finalize(client->uid);
214 if (TTS_ERROR_TIMED_OUT != ret) {
215 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
218 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry finalize");
221 if (TTS_RETRY_COUNT == count) {
222 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
229 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Do not request finalize : g_sr(%d) mode(%d)", g_screen_reader, client->mode);
232 client->before_state = client->current_state;
233 client->current_state = TTS_STATE_CREATED;
235 case TTS_STATE_CREATED:
236 if (NULL != g_connect_timer) {
237 SLOG(LOG_DEBUG, TAG_TTSC, "Connect Timer is deleted");
238 ecore_timer_del(g_connect_timer);
241 tts_client_destroy(tts);
248 if (0 == tts_client_get_size()) {
249 if (0 != tts_dbus_close_connection()) {
250 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to close connection");
256 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
257 SLOG(LOG_DEBUG, TAG_TTSC, " ");
259 return TTS_ERROR_NONE;
262 void __tts_screen_reader_changed_cb(bool value)
264 g_screen_reader = value;
267 int tts_set_mode(tts_h tts, tts_mode_e mode)
269 bool tts_supported = false;
270 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
271 if (false == tts_supported) {
272 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
273 return TTS_ERROR_NOT_SUPPORTED;
277 SLOG(LOG_DEBUG, TAG_TTSC, "===== Set TTS mode");
279 tts_client_s* client = tts_client_get(tts);
282 if (NULL == client) {
283 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
284 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
285 SLOG(LOG_DEBUG, TAG_TTSC, " ");
286 return TTS_ERROR_INVALID_PARAMETER;
290 if (client->current_state != TTS_STATE_CREATED) {
291 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
292 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
293 SLOG(LOG_DEBUG, TAG_TTSC, " ");
294 return TTS_ERROR_INVALID_STATE;
297 if (TTS_MODE_DEFAULT <= mode && mode <= TTS_MODE_SCREEN_READER) {
300 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] mode is not valid : %d", mode);
301 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
302 SLOG(LOG_DEBUG, TAG_TTSC, " ");
303 return TTS_ERROR_INVALID_PARAMETER;
306 if (TTS_MODE_SCREEN_READER == mode) {
309 ret = vconf_get_bool(TTS_ACCESSIBILITY_KEY, &screen_reader);
311 SLOG(LOG_ERROR, tts_tag(), "[Config ERROR] Fail to get screen reader");
312 return TTS_ERROR_OPERATION_FAILED;
314 g_screen_reader = (bool)screen_reader;
315 tts_config_set_screen_reader_callback(client->uid, __tts_screen_reader_changed_cb);
317 tts_config_unset_screen_reader_callback(client->uid);
320 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
321 SLOG(LOG_DEBUG, TAG_TTSC, " ");
323 return TTS_ERROR_NONE;
326 int tts_get_mode(tts_h tts, tts_mode_e* mode)
328 bool tts_supported = false;
329 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
330 if (false == tts_supported) {
331 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
332 return TTS_ERROR_NOT_SUPPORTED;
336 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get TTS mode");
338 tts_client_s* client = tts_client_get(tts);
341 if (NULL == client) {
342 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
343 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
344 SLOG(LOG_DEBUG, TAG_TTSC, " ");
345 return TTS_ERROR_INVALID_PARAMETER;
349 if (client->current_state != TTS_STATE_CREATED) {
350 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
351 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
352 SLOG(LOG_DEBUG, TAG_TTSC, " ");
353 return TTS_ERROR_INVALID_STATE;
357 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter(mode) is NULL");
358 return TTS_ERROR_INVALID_PARAMETER;
361 *mode = client->mode;
363 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
364 SLOG(LOG_DEBUG, TAG_TTSC, " ");
366 return TTS_ERROR_NONE;
369 static Eina_Bool __tts_connect_daemon(void *data)
371 tts_h tts = (tts_h)data;
372 tts_client_s* client = tts_client_get(tts);
375 if (NULL == client) {
376 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
377 g_connect_timer = NULL;
382 if (0 != tts_dbus_request_hello(client->uid)) {
386 SLOG(LOG_DEBUG, TAG_TTSC, "===== Connect daemon");
388 /* do request initialize */
390 ret = tts_dbus_request_initialize(client->uid);
392 if (TTS_ERROR_ENGINE_NOT_FOUND == ret) {
393 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to initialize : %s", __tts_get_error_code(ret));
395 client->reason = TTS_ERROR_ENGINE_NOT_FOUND;
398 ecore_timer_add(0, __tts_notify_error, (void*)client->tts);
399 g_connect_timer = NULL;
402 } else if (TTS_ERROR_NONE != ret) {
403 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to connection. Retry to connect : %s", __tts_get_error_code(ret));
407 /* success to connect tts-daemon */
410 g_connect_timer = NULL;
412 client = tts_client_get(tts);
414 if (NULL == client) {
415 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
419 client->before_state = client->current_state;
420 client->current_state = TTS_STATE_READY;
422 if (NULL != client->state_changed_cb) {
423 tts_client_use_callback(client);
424 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
425 tts_client_not_use_callback(client);
427 SLOG(LOG_WARN, TAG_TTSC, "State changed callback is NULL");
430 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
431 SLOG(LOG_DEBUG, TAG_TTSC, " ");
436 int tts_prepare(tts_h tts)
438 bool tts_supported = false;
439 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
440 if (false == tts_supported) {
441 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
442 return TTS_ERROR_NOT_SUPPORTED;
446 SLOG(LOG_DEBUG, TAG_TTSC, "===== Prepare TTS");
448 tts_client_s* client = tts_client_get(tts);
451 if (NULL == client) {
452 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
453 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
454 SLOG(LOG_DEBUG, TAG_TTSC, " ");
455 return TTS_ERROR_INVALID_PARAMETER;
459 if (client->current_state != TTS_STATE_CREATED) {
460 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
461 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
462 SLOG(LOG_DEBUG, TAG_TTSC, " ");
463 return TTS_ERROR_INVALID_STATE;
466 g_connect_timer = ecore_timer_add(0, __tts_connect_daemon, (void*)tts);
468 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
469 SLOG(LOG_DEBUG, TAG_TTSC, " ");
471 return TTS_ERROR_NONE;
474 int tts_unprepare(tts_h tts)
476 bool tts_supported = false;
477 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
478 if (false == tts_supported) {
479 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
480 return TTS_ERROR_NOT_SUPPORTED;
484 SLOG(LOG_DEBUG, TAG_TTSC, "===== Unprepare TTS");
486 tts_client_s* client = tts_client_get(tts);
489 if (NULL == client) {
490 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
491 return TTS_ERROR_INVALID_PARAMETER;
495 if (client->current_state != TTS_STATE_READY) {
496 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'READY'");
497 return TTS_ERROR_INVALID_STATE;
502 if (!(false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode)) {
504 ret = tts_dbus_request_finalize(client->uid);
506 if (TTS_ERROR_TIMED_OUT != ret) {
507 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
510 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry finalize : %s", __tts_get_error_code(ret));
513 if (TTS_RETRY_COUNT == count) {
514 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
521 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Do not request finalize : g_sr(%d) mode(%d)", g_screen_reader, client->mode);
524 client->before_state = client->current_state;
525 client->current_state = TTS_STATE_CREATED;
527 if (NULL != client->state_changed_cb) {
528 tts_client_use_callback(client);
529 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
530 tts_client_not_use_callback(client);
531 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
534 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
535 SLOG(LOG_DEBUG, TAG_TTSC, " ");
537 return TTS_ERROR_NONE;
540 bool __tts_supported_voice_cb(const char* engine_id, const char* language, int type, void* user_data)
542 tts_h tts = (tts_h)user_data;
544 tts_client_s* client = tts_client_get(tts);
545 if (NULL == client) {
546 SLOG(LOG_ERROR, TAG_TTSC, "[WARNING] A handle is not valid");
550 /* call callback function */
551 if (NULL != client->supported_voice_cb) {
552 return client->supported_voice_cb(tts, language, type, client->supported_voice_user_data);
554 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of supported voice");
560 int tts_foreach_supported_voices(tts_h tts, tts_supported_voice_cb callback, void* user_data)
562 bool tts_supported = false;
563 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
564 if (false == tts_supported) {
565 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
566 return TTS_ERROR_NOT_SUPPORTED;
570 SLOG(LOG_DEBUG, TAG_TTSC, "===== Foreach supported voices");
572 if (NULL == tts || NULL == callback) {
573 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
574 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
575 SLOG(LOG_DEBUG, TAG_TTSC, " ");
576 return TTS_ERROR_INVALID_PARAMETER;
579 tts_client_s* client = tts_client_get(tts);
582 if (NULL == client) {
583 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
584 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
585 SLOG(LOG_DEBUG, TAG_TTSC, " ");
586 return TTS_ERROR_INVALID_PARAMETER;
590 char* current_engine = NULL;
591 ret = tts_config_mgr_get_engine(¤t_engine);
593 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get current engine : %d", ret);
594 return __tts_convert_config_error_code(ret);
597 client->supported_voice_cb = callback;
598 client->supported_voice_user_data = user_data;
600 ret = tts_config_mgr_get_voice_list(current_engine, __tts_supported_voice_cb, client->tts);
602 if (NULL != current_engine)
603 free(current_engine);
605 client->supported_voice_cb = NULL;
606 client->supported_voice_user_data = NULL;
609 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
610 ret = TTS_ERROR_OPERATION_FAILED;
613 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
614 SLOG(LOG_DEBUG, TAG_TTSC, " ");
619 int tts_get_default_voice(tts_h tts, char** lang, int* vctype)
621 bool tts_supported = false;
622 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
623 if (false == tts_supported) {
624 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
625 return TTS_ERROR_NOT_SUPPORTED;
629 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get default voice");
632 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle 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);
640 if (NULL == client) {
641 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
642 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
643 SLOG(LOG_DEBUG, TAG_TTSC, " ");
644 return TTS_ERROR_INVALID_PARAMETER;
647 /* Request call remote method */
649 ret = tts_config_mgr_get_voice(lang, vctype);
651 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
652 return __tts_convert_config_error_code(ret);
654 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] Default language(%s), type(%d)", *lang, *vctype);
657 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
658 SLOG(LOG_DEBUG, TAG_TTSC, " ");
663 int tts_get_max_text_size(tts_h tts, unsigned int* size)
665 bool tts_supported = false;
666 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
667 if (false == tts_supported) {
668 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
669 return TTS_ERROR_NOT_SUPPORTED;
673 if (NULL == tts || NULL == size) {
674 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Input parameter is null");
675 return TTS_ERROR_INVALID_PARAMETER;
678 tts_client_s* client = tts_client_get(tts);
680 if (NULL == client) {
681 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : A handle is not valid");
682 return TTS_ERROR_INVALID_PARAMETER;
685 if (TTS_STATE_READY != client->current_state) {
686 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Current state is NOT 'READY'.");
687 return TTS_ERROR_INVALID_STATE;
690 *size = TTS_MAX_TEXT_SIZE;
692 SLOG(LOG_DEBUG, TAG_TTSC, "Get max text count : %d", *size);
693 return TTS_ERROR_NONE;
696 int tts_get_state(tts_h tts, tts_state_e* state)
698 bool tts_supported = false;
699 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
700 if (false == tts_supported) {
701 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
702 return TTS_ERROR_NOT_SUPPORTED;
706 if (NULL == tts || NULL == state) {
707 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : Input parameter is null");
708 return TTS_ERROR_INVALID_PARAMETER;
711 tts_client_s* client = tts_client_get(tts);
713 if (NULL == client) {
714 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
715 return TTS_ERROR_INVALID_PARAMETER;
718 *state = client->current_state;
721 case TTS_STATE_CREATED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Created'"); break;
722 case TTS_STATE_READY: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Ready'"); break;
723 case TTS_STATE_PLAYING: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Playing'"); break;
724 case TTS_STATE_PAUSED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Paused'"); break;
725 default: SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid value"); break;
728 return TTS_ERROR_NONE;
731 int tts_get_speed_range(tts_h tts, int* min, int* normal, int* max)
733 bool tts_supported = false;
734 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
735 if (false == tts_supported) {
736 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
737 return TTS_ERROR_NOT_SUPPORTED;
741 if (NULL == tts || NULL == min || NULL == normal || NULL == max) {
742 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
743 return TTS_ERROR_INVALID_PARAMETER;
746 tts_client_s* client = tts_client_get(tts);
748 if (NULL == client) {
749 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
750 return TTS_ERROR_INVALID_PARAMETER;
753 *min = TTS_SPEED_MIN;
754 *normal = TTS_SPEED_NORMAL;
755 *max = TTS_SPEED_MAX;
757 return TTS_ERROR_NONE;
760 int tts_add_text(tts_h tts, const char* text, const char* language, int voice_type, int speed, int* utt_id)
762 bool tts_supported = false;
763 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
764 if (false == tts_supported) {
765 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
766 return TTS_ERROR_NOT_SUPPORTED;
770 SLOG(LOG_DEBUG, TAG_TTSC, "===== Add text");
772 if (NULL == tts || NULL == utt_id) {
773 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
774 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
775 SLOG(LOG_DEBUG, TAG_TTSC, " ");
776 return TTS_ERROR_INVALID_PARAMETER;
779 tts_client_s* client = tts_client_get(tts);
781 if (NULL == client) {
782 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
783 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
784 SLOG(LOG_DEBUG, TAG_TTSC, " ");
785 return TTS_ERROR_INVALID_PARAMETER;
788 if (TTS_STATE_CREATED == client->current_state) {
789 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
790 return TTS_ERROR_INVALID_STATE;
793 if (TTS_MAX_TEXT_SIZE < strlen(text) || strlen(text) <= 0) {
794 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input text size is invalid.");
795 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
796 SLOG(LOG_DEBUG, TAG_TTSC, " ");
797 return TTS_ERROR_INVALID_PARAMETER;
800 if (TTS_SPEED_AUTO > speed || TTS_SPEED_MAX < speed) {
801 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] speed value(%d) is invalid.", speed);
802 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
803 SLOG(LOG_DEBUG, TAG_TTSC, " ");
804 return TTS_ERROR_INVALID_PARAMETER;
807 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
808 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
809 return TTS_ERROR_INVALID_STATE;
812 /* check valid utf8 */
814 ict = iconv_open("utf-8", "");
815 if ((iconv_t)-1 == ict) {
816 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to init for text check");
817 return TTS_ERROR_OPERATION_FAILED;
820 size_t len = strlen(text);
822 char in_buf[TTS_MAX_TEXT_SIZE];
823 char *out_tmp = NULL;
824 char out_buf[TTS_MAX_TEXT_SIZE];
825 size_t len_tmp = sizeof(out_buf);
827 memset(in_buf, 0, TTS_MAX_TEXT_SIZE);
828 snprintf(in_buf, TTS_MAX_TEXT_SIZE, "%s", text);
831 memset(out_buf, 0, TTS_MAX_TEXT_SIZE);
835 st = iconv(ict, &in_tmp, &len, &out_tmp, &len_tmp);
836 if ((size_t)-1 == st) {
837 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Text is invalid - '%s'", in_buf);
839 return TTS_ERROR_INVALID_PARAMETER;
842 SLOG(LOG_DEBUG, TAG_TTSC, "Text is valid - Converted text is '%s'", out_buf);
844 /* change default language value */
847 if (NULL == language)
848 temp = strdup("default");
850 temp = strdup(language);
852 client->current_utt_id++;
853 if (client->current_utt_id == 10000) {
854 client->current_utt_id = 1;
861 ret = tts_dbus_request_add_text(client->uid, out_buf, temp, voice_type, speed, client->current_utt_id);
863 if (TTS_ERROR_TIMED_OUT != ret) {
864 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
867 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry add text : %s", __tts_get_error_code(ret));
870 if (TTS_RETRY_COUNT == count) {
871 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
876 *utt_id = client->current_utt_id;
880 if (NULL != temp) free(temp);
882 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
883 SLOG(LOG_DEBUG, TAG_TTSC, " ");
888 int tts_play(tts_h tts)
890 bool tts_supported = false;
891 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
892 if (false == tts_supported) {
893 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
894 return TTS_ERROR_NOT_SUPPORTED;
898 SLOG(LOG_DEBUG, TAG_TTSC, "===== Play tts");
901 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
902 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
903 SLOG(LOG_DEBUG, TAG_TTSC, " ");
904 return TTS_ERROR_INVALID_PARAMETER;
907 tts_client_s* client = tts_client_get(tts);
909 if (NULL == client) {
910 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
911 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
912 SLOG(LOG_DEBUG, TAG_TTSC, " ");
913 return TTS_ERROR_INVALID_PARAMETER;
916 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
917 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
918 return TTS_ERROR_INVALID_STATE;
921 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
922 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
923 return TTS_ERROR_INVALID_STATE;
929 ret = tts_dbus_request_play(client->uid);
931 if (TTS_ERROR_TIMED_OUT != ret) {
932 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
935 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry play : %s", __tts_get_error_code(ret));
938 if (TTS_RETRY_COUNT == count) {
939 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
946 client->before_state = client->current_state;
947 client->current_state = TTS_STATE_PLAYING;
949 if (NULL != client->state_changed_cb) {
950 tts_client_use_callback(client);
951 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
952 tts_client_not_use_callback(client);
953 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
956 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
957 SLOG(LOG_DEBUG, TAG_TTSC, " ");
959 return TTS_ERROR_NONE;
963 int tts_stop(tts_h tts)
965 bool tts_supported = false;
966 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
967 if (false == tts_supported) {
968 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
969 return TTS_ERROR_NOT_SUPPORTED;
973 SLOG(LOG_DEBUG, TAG_TTSC, "===== Stop tts");
976 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
977 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
978 SLOG(LOG_DEBUG, TAG_TTSC, " ");
979 return TTS_ERROR_INVALID_PARAMETER;
982 tts_client_s* client = tts_client_get(tts);
984 if (NULL == client) {
985 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
986 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
987 SLOG(LOG_DEBUG, TAG_TTSC, " ");
988 return TTS_ERROR_INVALID_PARAMETER;
991 if (TTS_STATE_CREATED == client->current_state) {
992 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
993 return TTS_ERROR_INVALID_STATE;
996 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
997 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
998 return TTS_ERROR_INVALID_STATE;
1004 ret = tts_dbus_request_stop(client->uid);
1006 if (TTS_ERROR_TIMED_OUT != ret) {
1007 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1010 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry stop : %s", __tts_get_error_code(ret));
1013 if (TTS_RETRY_COUNT == count) {
1014 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1021 client->before_state = client->current_state;
1022 client->current_state = TTS_STATE_READY;
1024 if (NULL != client->state_changed_cb) {
1025 tts_client_use_callback(client);
1026 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1027 tts_client_not_use_callback(client);
1028 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1031 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1032 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1034 return TTS_ERROR_NONE;
1038 int tts_pause(tts_h tts)
1040 bool tts_supported = false;
1041 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
1042 if (false == tts_supported) {
1043 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
1044 return TTS_ERROR_NOT_SUPPORTED;
1048 SLOG(LOG_DEBUG, TAG_TTSC, "===== Pause tts");
1051 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1052 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1053 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1054 return TTS_ERROR_INVALID_PARAMETER;
1057 tts_client_s* client = tts_client_get(tts);
1059 if (NULL == client) {
1060 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1061 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1062 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1063 return TTS_ERROR_INVALID_PARAMETER;
1066 if (TTS_STATE_PLAYING != client->current_state) {
1067 SLOG(LOG_ERROR, TAG_TTSC, "[Error] The Current state is NOT 'playing'. So this request should be not running.");
1068 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1069 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1070 return TTS_ERROR_INVALID_STATE;
1073 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1074 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1075 return TTS_ERROR_INVALID_STATE;
1081 ret = tts_dbus_request_pause(client->uid);
1083 if (TTS_ERROR_TIMED_OUT != ret) {
1084 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1087 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry pause : %s", __tts_get_error_code(ret));
1090 if (TTS_RETRY_COUNT == count) {
1091 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1098 client->before_state = client->current_state;
1099 client->current_state = TTS_STATE_PAUSED;
1101 if (NULL != client->state_changed_cb) {
1102 tts_client_use_callback(client);
1103 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1104 tts_client_not_use_callback(client);
1105 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1108 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1109 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1111 return TTS_ERROR_NONE;
1114 static Eina_Bool __tts_notify_error(void *data)
1116 tts_h tts = (tts_h)data;
1118 tts_client_s* client = tts_client_get(tts);
1121 if (NULL == client) {
1122 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify error msg : A handle is not valid");
1126 SLOG(LOG_DEBUG, TAG_TTSC, "Error data : uttid(%d) reason(%s)", client->utt_id, __tts_get_error_code(client->reason));
1128 if (NULL != client->error_cb) {
1129 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of error");
1130 tts_client_use_callback(client);
1131 client->error_cb(client->tts, client->utt_id, client->reason, client->error_user_data);
1132 tts_client_not_use_callback(client);
1134 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
1140 int __tts_cb_error(int uid, tts_error_e reason, int utt_id)
1142 tts_client_s* client = tts_client_get_by_uid(uid);
1144 if (NULL == client) {
1145 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
1146 return TTS_ERROR_INVALID_PARAMETER;
1149 client->utt_id = utt_id;
1150 client->reason = reason;
1152 /* call callback function */
1153 if (NULL != client->error_cb) {
1154 ecore_timer_add(0, __tts_notify_error, client->tts);
1156 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
1162 static Eina_Bool __tts_notify_state_changed(void *data)
1164 tts_h tts = (tts_h)data;
1166 tts_client_s* client = tts_client_get(tts);
1169 if (NULL == client) {
1170 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify state changed : A handle is not valid");
1174 if (NULL != client->state_changed_cb) {
1175 tts_client_use_callback(client);
1176 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1177 tts_client_not_use_callback(client);
1178 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called : pre(%d) cur(%d)", client->before_state, client->current_state);
1180 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
1186 int __tts_cb_set_state(int uid, int state)
1188 tts_client_s* client = tts_client_get_by_uid(uid);
1189 if (NULL == client) {
1190 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] The handle is not valid");
1194 tts_state_e state_from_daemon = (tts_state_e)state;
1196 if (client->current_state == state_from_daemon) {
1197 SLOG(LOG_DEBUG, TAG_TTSC, "Current state has already been %d", client->current_state);
1201 if (NULL != client->state_changed_cb) {
1202 ecore_timer_add(0, __tts_notify_state_changed, client->tts);
1204 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
1207 client->before_state = client->current_state;
1208 client->current_state = state_from_daemon;
1213 static Eina_Bool __tts_notify_utt_started(void *data)
1215 tts_h tts = (tts_h)data;
1217 tts_client_s* client = tts_client_get(tts);
1220 if (NULL == client) {
1221 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to notify utt started : A handle is not valid");
1225 if (NULL != client->utt_started_cb) {
1226 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance started ");
1227 tts_client_use_callback(client);
1228 client->utt_started_cb(client->tts, client->utt_id, client->utt_started_user_data);
1229 tts_client_not_use_callback(client);
1231 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance started ");
1237 int __tts_cb_utt_started(int uid, int utt_id)
1239 tts_client_s* client = tts_client_get_by_uid(uid);
1241 if (NULL == client) {
1242 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
1243 return TTS_ERROR_INVALID_PARAMETER;
1246 SLOG(LOG_DEBUG, TAG_TTSC, "utterance started : utt id(%d) ", utt_id);
1248 client->utt_id = utt_id;
1250 /* call callback function */
1251 if (NULL != client->utt_started_cb) {
1252 ecore_timer_add(0, __tts_notify_utt_started, client->tts);
1254 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance started ");
1260 static Eina_Bool __tts_notify_utt_completed(void *data)
1262 tts_h tts = (tts_h)data;
1264 tts_client_s* client = tts_client_get(tts);
1267 if (NULL == client) {
1268 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to notify utt completed : A handle is not valid");
1272 if (NULL != client->utt_completeted_cb) {
1273 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance completed ");
1274 tts_client_use_callback(client);
1275 client->utt_completeted_cb(client->tts, client->utt_id, client->utt_completed_user_data);
1276 tts_client_not_use_callback(client);
1278 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance completed ");
1284 int __tts_cb_utt_completed(int uid, int utt_id)
1286 tts_client_s* client = tts_client_get_by_uid(uid);
1288 if (NULL == client) {
1289 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
1290 return TTS_ERROR_INVALID_PARAMETER;
1293 SLOG(LOG_DEBUG, TAG_TTSC, "utterance completed : uttid(%d) ", utt_id);
1295 client->utt_id = utt_id;
1297 /* call callback function */
1298 if (NULL != client->utt_completeted_cb) {
1299 ecore_timer_add(0, __tts_notify_utt_completed, client->tts);
1301 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance completed ");
1307 int tts_set_state_changed_cb(tts_h tts, tts_state_changed_cb callback, void* user_data)
1309 bool tts_supported = false;
1310 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
1311 if (false == tts_supported) {
1312 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
1313 return TTS_ERROR_NOT_SUPPORTED;
1317 if (NULL == tts || NULL == callback) {
1318 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Input parameter is null");
1319 return TTS_ERROR_INVALID_PARAMETER;
1322 tts_client_s* client = tts_client_get(tts);
1324 if (NULL == client) {
1325 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : A handle is not valid");
1326 return TTS_ERROR_INVALID_PARAMETER;
1329 if (TTS_STATE_CREATED != client->current_state) {
1330 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Current state is not 'Created'.");
1331 return TTS_ERROR_INVALID_STATE;
1334 client->state_changed_cb = callback;
1335 client->state_changed_user_data = user_data;
1337 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set state changed cb");
1342 int tts_unset_state_changed_cb(tts_h tts)
1344 bool tts_supported = false;
1345 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
1346 if (false == tts_supported) {
1347 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
1348 return TTS_ERROR_NOT_SUPPORTED;
1353 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Input parameter is null");
1354 return TTS_ERROR_INVALID_PARAMETER;
1357 tts_client_s* client = tts_client_get(tts);
1359 if (NULL == client) {
1360 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : A handle is not valid");
1361 return TTS_ERROR_INVALID_PARAMETER;
1364 if (TTS_STATE_CREATED != client->current_state) {
1365 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Current state is not 'Created'.");
1366 return TTS_ERROR_INVALID_STATE;
1369 client->state_changed_cb = NULL;
1370 client->state_changed_user_data = NULL;
1372 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset state changed cb");
1377 int tts_set_utterance_started_cb(tts_h tts, tts_utterance_started_cb callback, void* user_data)
1379 bool tts_supported = false;
1380 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
1381 if (false == tts_supported) {
1382 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
1383 return TTS_ERROR_NOT_SUPPORTED;
1387 if (NULL == tts || NULL == callback) {
1388 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Input parameter is null");
1389 return TTS_ERROR_INVALID_PARAMETER;
1392 tts_client_s* client = tts_client_get(tts);
1394 if (NULL == client) {
1395 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : A handle is not valid");
1396 return TTS_ERROR_INVALID_PARAMETER;
1399 if (TTS_STATE_CREATED != client->current_state) {
1400 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Current state is not 'Created'.");
1401 return TTS_ERROR_INVALID_STATE;
1404 client->utt_started_cb = callback;
1405 client->utt_started_user_data = user_data;
1407 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt started cb");
1412 int tts_unset_utterance_started_cb(tts_h tts)
1414 bool tts_supported = false;
1415 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
1416 if (false == tts_supported) {
1417 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
1418 return TTS_ERROR_NOT_SUPPORTED;
1423 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Input parameter is null");
1424 return TTS_ERROR_INVALID_PARAMETER;
1427 tts_client_s* client = tts_client_get(tts);
1429 if (NULL == client) {
1430 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : A handle is not valid");
1431 return TTS_ERROR_INVALID_PARAMETER;
1434 if (TTS_STATE_CREATED != client->current_state) {
1435 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Current state is not 'Created'.");
1436 return TTS_ERROR_INVALID_STATE;
1439 client->utt_started_cb = NULL;
1440 client->utt_started_user_data = NULL;
1442 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt started cb");
1447 int tts_set_utterance_completed_cb(tts_h tts, tts_utterance_completed_cb callback, void* user_data)
1449 bool tts_supported = false;
1450 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
1451 if (false == tts_supported) {
1452 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
1453 return TTS_ERROR_NOT_SUPPORTED;
1457 if (NULL == tts || NULL == callback) {
1458 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Input parameter is null");
1459 return TTS_ERROR_INVALID_PARAMETER;
1462 tts_client_s* client = tts_client_get(tts);
1464 if (NULL == client) {
1465 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : A handle is not valid");
1466 return TTS_ERROR_INVALID_PARAMETER;
1469 if (TTS_STATE_CREATED != client->current_state) {
1470 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Current state is not 'Created'.");
1471 return TTS_ERROR_INVALID_STATE;
1474 client->utt_completeted_cb = callback;
1475 client->utt_completed_user_data = user_data;
1477 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt completed cb");
1482 int tts_unset_utterance_completed_cb(tts_h tts)
1484 bool tts_supported = false;
1485 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
1486 if (false == tts_supported) {
1487 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
1488 return TTS_ERROR_NOT_SUPPORTED;
1493 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Input parameter is null");
1494 return TTS_ERROR_INVALID_PARAMETER;
1497 tts_client_s* client = tts_client_get(tts);
1499 if (NULL == client) {
1500 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : A handle is not valid");
1501 return TTS_ERROR_INVALID_PARAMETER;
1504 if (TTS_STATE_CREATED != client->current_state) {
1505 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Current state is not 'Created'.");
1506 return TTS_ERROR_INVALID_STATE;
1509 client->utt_completeted_cb = NULL;
1510 client->utt_completed_user_data = NULL;
1512 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt completed cb");
1516 int tts_set_error_cb(tts_h tts, tts_error_cb callback, void* user_data)
1518 bool tts_supported = false;
1519 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
1520 if (false == tts_supported) {
1521 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
1522 return TTS_ERROR_NOT_SUPPORTED;
1526 if (NULL == tts || NULL == callback) {
1527 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Input parameter is null");
1528 return TTS_ERROR_INVALID_PARAMETER;
1531 tts_client_s* client = tts_client_get(tts);
1533 if (NULL == client) {
1534 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : A handle is not valid");
1535 return TTS_ERROR_INVALID_PARAMETER;
1538 if (TTS_STATE_CREATED != client->current_state) {
1539 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Current state is not 'Created'.");
1540 return TTS_ERROR_INVALID_STATE;
1543 client->error_cb = callback;
1544 client->error_user_data = user_data;
1546 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set error cb");
1551 int tts_unset_error_cb(tts_h tts)
1553 bool tts_supported = false;
1554 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
1555 if (false == tts_supported) {
1556 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
1557 return TTS_ERROR_NOT_SUPPORTED;
1562 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Input parameter is null");
1563 return TTS_ERROR_INVALID_PARAMETER;
1566 tts_client_s* client = tts_client_get(tts);
1568 if (NULL == client) {
1569 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : A handle is not valid");
1570 return TTS_ERROR_INVALID_PARAMETER;
1573 if (TTS_STATE_CREATED != client->current_state) {
1574 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Current state is not 'Created'.");
1575 return TTS_ERROR_INVALID_STATE;
1578 client->error_cb = NULL;
1579 client->error_user_data = NULL;
1581 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset error cb");
1586 int tts_set_default_voice_changed_cb(tts_h tts, tts_default_voice_changed_cb callback, void* user_data)
1588 bool tts_supported = false;
1589 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
1590 if (false == tts_supported) {
1591 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
1592 return TTS_ERROR_NOT_SUPPORTED;
1596 if (NULL == tts || NULL == callback) {
1597 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : Input parameter is null");
1598 return TTS_ERROR_INVALID_PARAMETER;
1601 tts_client_s* client = tts_client_get(tts);
1603 if (NULL == client) {
1604 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : A handle is not valid");
1605 return TTS_ERROR_INVALID_PARAMETER;
1608 if (TTS_STATE_CREATED != client->current_state) {
1609 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : Current state is not 'Created'.");
1610 return TTS_ERROR_INVALID_STATE;
1613 client->default_voice_changed_cb = callback;
1614 client->default_voice_changed_user_data = user_data;
1616 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set default voice changed cb");
1621 int tts_unset_default_voice_changed_cb(tts_h tts)
1623 bool tts_supported = false;
1624 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
1625 if (false == tts_supported) {
1626 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS NOT supported");
1627 return TTS_ERROR_NOT_SUPPORTED;
1632 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : Input parameter is null");
1633 return TTS_ERROR_INVALID_PARAMETER;
1636 tts_client_s* client = tts_client_get(tts);
1638 if (NULL == client) {
1639 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : A handle is not valid");
1640 return TTS_ERROR_INVALID_PARAMETER;
1643 if (TTS_STATE_CREATED != client->current_state) {
1644 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : Current state is not 'Created'.");
1645 return TTS_ERROR_INVALID_STATE;
1648 client->default_voice_changed_cb = NULL;
1649 client->default_voice_changed_user_data = NULL;
1651 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset default voice changed cb");