2 * Copyright (c) 2011-2016 Samsung Electronics Co., Ltd All Rights Reserved
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 * http://www.apache.org/licenses/LICENSE-2.0
7 * Unless required by applicable law or agreed to in writing, software
8 * distributed under the License is distributed on an "AS IS" BASIS,
9 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 * See the License for the specific language governing permissions and
11 * limitations under the License.
14 #include <app_manager.h>
17 #include <system_info.h>
19 #include <package-manager.h>
23 #include "tts_client.h"
24 #include "tts_config_mgr.h"
30 #include "tts_internal.h"
32 #define MAX_SILENT_DURATION 5000
34 static int g_feature_enabled = -1;
37 static int __tts_get_feature_enabled()
39 RETV_IF(1 == g_feature_enabled, TTS_ERROR_NONE);
40 RETVM_IF(0 == g_feature_enabled, TTS_ERROR_NOT_SUPPORTED, "[ERROR] TTS feature NOT supported");
42 bool tts_supported = false;
43 if (SYSTEM_INFO_ERROR_NONE != system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
44 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get feature value");
45 return TTS_ERROR_NOT_SUPPORTED;
48 if (false == tts_supported) {
49 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS feature NOT supported");
50 g_feature_enabled = 0;
51 return TTS_ERROR_NOT_SUPPORTED;
54 g_feature_enabled = 1;
55 return TTS_ERROR_NONE;
58 // TODO: move into tts_core to make common function
60 static int __tts_convert_config_error_code(tts_config_error_e code)
62 if (code == TTS_CONFIG_ERROR_NONE) return TTS_ERROR_NONE;
63 if (code == TTS_CONFIG_ERROR_OUT_OF_MEMORY) return TTS_ERROR_OUT_OF_MEMORY;
64 if (code == TTS_CONFIG_ERROR_IO_ERROR) return TTS_ERROR_IO_ERROR;
65 if (code == TTS_CONFIG_ERROR_INVALID_PARAMETER) return TTS_ERROR_INVALID_PARAMETER;
66 if (code == TTS_CONFIG_ERROR_INVALID_STATE) return TTS_ERROR_INVALID_STATE;
67 if (code == TTS_CONFIG_ERROR_INVALID_VOICE) return TTS_ERROR_INVALID_VOICE;
68 if (code == TTS_CONFIG_ERROR_ENGINE_NOT_FOUND) return TTS_ERROR_ENGINE_NOT_FOUND;
69 if (code == TTS_CONFIG_ERROR_OPERATION_FAILED) return TTS_ERROR_OPERATION_FAILED;
70 if (code == TTS_CONFIG_ERROR_NOT_SUPPORTED_FEATURE) return TTS_ERROR_NOT_SUPPORTED_FEATURE;
75 static 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)
77 SLOG(LOG_DEBUG, TAG_TTSC, "Voice changed : Before lang(%s) type(%d) , Current lang(%s), type(%d)",
78 before_lang, before_voice_type, language, voice_type);
80 GList* client_list = tts_client_get_client_list();
81 if (NULL == client_list) {
82 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get client list");
87 if (g_list_length(client_list) > 0) {
88 /* Get a first item */
89 iter = g_list_first(client_list);
91 while (NULL != iter) {
92 tts_client_s *client = iter->data;
93 if (tts_client_is_valid_client(client)) {
94 tts_core_notify_default_voice_changed(client, before_lang, before_voice_type, language, voice_type);
96 /* Check whether language is changed or not. If it is changed, make 'text_repeat' NULL */
97 if (0 != strncmp(before_lang, language, strlen(before_lang))) {
98 tts_client_set_repeat_text(client, NULL);
101 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Client is not valid (%p)", client);
105 iter = g_list_next(iter);
109 g_list_free(client_list);
114 static void __tts_config_engine_changed_cb(const char* engine_id, const char* setting, const char* language, int voice_type, bool auto_voice, bool need_credential, void* user_data)
116 tts_h tts = (tts_h)user_data;
118 tts_client_s* client = tts_client_get(tts);
119 RETM_IF(NULL == client, "[ERROR] A handle is not valid. tts(%p)", tts);
121 if (NULL != engine_id) SLOG(LOG_DEBUG, TAG_TTSC, "Engine id(%s)", engine_id);
122 if (NULL != setting) SLOG(LOG_DEBUG, TAG_TTSC, "Engine setting(%s)", setting);
123 if (NULL != language) SLOG(LOG_DEBUG, TAG_TTSC, "Language(%s)", language);
124 SLOG(LOG_DEBUG, TAG_TTSC, "Voice type(%d), Auto voice(%s), Credential(%s)", voice_type, auto_voice ? "on" : "off", need_credential ? "need" : "no need");
126 /* When the default engine is changed, please unload the old engine and load the new one. */
129 tts_state_e current_state = tts_client_get_current_state(client);
130 if (TTS_STATE_PLAYING == current_state || TTS_STATE_PAUSED == current_state) {
133 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] TTS client stopping...");
136 ecore_idler_add(__reconnect_by_engine_changed, (void*)tts);
137 } else if (TTS_STATE_READY == current_state) {
138 // TODO: change to tts_core function
139 ret = tts_unprepare(tts);
141 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to unprepare for setting a new engine... (%d)", ret);
143 ret = tts_prepare(tts);
145 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare for setting a new engine... (%d)", ret);
149 /* call callback function */
150 tts_core_notify_engine_changed(client, engine_id, language, voice_type, need_credential);
155 static void __tts_config_screen_reader_changed_cb(bool value, void* user_data)
157 tts_h tts = (tts_h)user_data;
159 tts_client_s* client = tts_client_get(tts);
160 RETM_IF(NULL == client, "[ERROR] A handle is not valid. tts(%p)", tts);
162 SLOG(LOG_DEBUG, TAG_TTSC, "Screen reader is changed. current status (%d)", value);
164 /* call callback function */
165 tts_core_notify_screen_reader_changed(client, value);
168 static int __initialize_tts_config(unsigned int uid, tts_h new_tts)
170 int ret = tts_config_mgr_initialize(uid, TTS_CONFIG_CLIENT_TYPE_DEFAULT);
171 if (TTS_CONFIG_ERROR_NONE != ret) {
172 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to init config manager : %d", ret);
173 return __tts_convert_config_error_code(ret);
176 ret = tts_config_mgr_set_callback(uid, __tts_config_engine_changed_cb, __tts_config_voice_changed_cb, NULL, NULL, NULL, new_tts);
177 if (TTS_CONFIG_ERROR_NONE != ret) {
178 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to set config changed : %d", ret);
179 tts_config_mgr_finalize(uid, TTS_CONFIG_CLIENT_TYPE_DEFAULT);
180 return __tts_convert_config_error_code(ret);
183 ret = tts_config_mgr_set_screen_reader_callback(uid, __tts_config_screen_reader_changed_cb, new_tts);
184 if (TTS_CONFIG_ERROR_NONE != ret) {
185 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to set config changed : %d", ret);
186 tts_config_mgr_finalize(uid, TTS_CONFIG_CLIENT_TYPE_DEFAULT);
187 return __tts_convert_config_error_code(ret);
190 return TTS_ERROR_NONE;
193 int tts_create(tts_h* tts)
195 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
197 SLOG(LOG_INFO, TAG_TTSC, "@@@ Create TTS");
199 RETVM_IF(NULL == tts, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input handle is null");
201 bool is_first_client = false;
202 if (0 == tts_client_get_size()) {
203 is_first_client = true;
206 tts_h new_tts = NULL;
207 if (0 != tts_client_new(&new_tts)) {
208 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to create client!!!!!");
209 return TTS_ERROR_OUT_OF_MEMORY;
212 tts_client_s* client = tts_client_get(new_tts);
213 if (NULL == client) {
214 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get client");
215 tts_client_destroy(new_tts);
216 return TTS_ERROR_OPERATION_FAILED;
219 unsigned int uid = tts_client_get_uid(client);
220 SLOG(LOG_ERROR, TAG_TTSC, "[INFO] tts_h(%p), tts_client(%p), uid(%u)", tts, client, uid);
222 if (false == tts_ipc_is_method_set()) {
225 int ret = app_manager_get_app_id(pid, &appid);
226 if (0 != ret || NULL == appid) {
227 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get appid, ret(%d), pid(%d)", ret, pid);
228 tts_ipc_set_method(TTS_IPC_METHOD_DBUS);
230 SLOG(LOG_INFO, TAG_TTSC, "[INFO] tts_create : client appid(%s), pid(%d)", appid, pid);
231 tts_ipc_set_method(TTS_IPC_METHOD_TIDL);
240 if (0 != tts_ipc_open_connection(uid)) {
241 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to open ipc connection");
242 tts_client_destroy(new_tts);
243 return TTS_ERROR_OPERATION_FAILED;
246 int ret = __initialize_tts_config(uid, new_tts);
247 if (TTS_ERROR_NONE != ret) {
248 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to init config manager : %d", ret);
249 tts_client_destroy(new_tts);
253 if (is_first_client) {
254 // These function would be called only when first client is created.
255 if (0 != tts_core_initialize()) {
256 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to initialize core");
257 tts_config_mgr_finalize(uid, TTS_CONFIG_CLIENT_TYPE_DEFAULT);
258 tts_client_destroy(new_tts);
259 return TTS_ERROR_OPERATION_FAILED;
264 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
265 return TTS_ERROR_NONE;
268 static int destroy_tts_handle(tts_h tts)
270 SLOG(LOG_INFO, TAG_TTSC, "Destroy TTS handle");
271 tts_client_s* client = tts_client_get(tts);
272 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
274 unsigned int uid = tts_client_get_uid(client);
275 SLOG(LOG_ERROR, TAG_TTSC, "[INFO] tts_h(%p), tts_client(%p), uid(%u)", tts, client, uid);
277 /* check used callback */
278 if (0 != tts_client_get_use_callback(client)) {
279 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Cannot destroy in Callback function");
280 return TTS_ERROR_OPERATION_FAILED;
283 tts_config_mgr_finalize(uid, TTS_CONFIG_CLIENT_TYPE_DEFAULT);
285 // TODO: move into tts_client
286 if (client->hello_timer) {
287 ecore_timer_del(client->hello_timer);
288 client->hello_timer = NULL;
291 switch (tts_client_get_current_state(client)) {
292 case TTS_STATE_PAUSED:
293 case TTS_STATE_PLAYING:
294 case TTS_STATE_READY: {
295 if (0 != tts_core_unprepare(client)) {
296 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to unprepare");
298 tts_client_set_current_state(client, TTS_STATE_CREATED);
300 case TTS_STATE_CREATED: {
301 /* Unset registered callbacks */
302 tts_client_unset_all_cb(client);
304 if (0 != tts_ipc_close_connection(uid)) {
305 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to close connection");
306 return TTS_ERROR_OPERATION_FAILED;
310 tts_client_destroy(tts);
315 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Client is not valid");
316 return TTS_ERROR_INVALID_PARAMETER;
320 unsigned int num_of_client = tts_client_get_size();
321 SLOG(LOG_ERROR, TAG_TTSC, "[INFO] num_of_client(%u)", num_of_client);
323 if (0 == num_of_client) {
324 if (0 != tts_core_deinitialize()) {
325 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to deinitialize core");
329 return TTS_ERROR_NONE;
332 static void *destroy_tts_handle_on_main_thread(void* data)
334 SLOG(LOG_INFO, TAG_TTSC, "Destroy on main thread synchronously");
335 tts_h tts = (tts_h)data;
337 int ret = destroy_tts_handle(tts);
338 intptr_t p_ret = (intptr_t)ret;
340 return (void *)p_ret;
343 int tts_destroy(tts_h tts)
345 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
346 SLOG(LOG_INFO, TAG_TTSC, "@@@ Destroy TTS");
348 intptr_t ret = (intptr_t)ecore_main_loop_thread_safe_call_sync(destroy_tts_handle_on_main_thread, (void *)tts);
349 SLOG(LOG_INFO, TAG_TTSC, "Return value: (%d/%s)", (int)ret, get_error_message((int)ret));
351 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
355 int tts_set_mode(tts_h tts, tts_mode_e mode)
357 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
359 SLOG(LOG_INFO, TAG_TTSC, "@@@ Set TTS mode(%d)", mode);
361 RETVM_IF(TTS_MODE_DEFAULT > mode || TTS_MODE_INTERRUPT < mode, TTS_ERROR_INVALID_PARAMETER, "[ERROR] mode is not valid : %d", mode);
363 tts_client_s* client = tts_client_get(tts);
364 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
366 tts_state_e current_state = tts_client_get_current_state(client);
367 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
369 tts_client_set_mode(client, mode);
371 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
372 return TTS_ERROR_NONE;
375 int tts_get_mode(tts_h tts, tts_mode_e* mode)
377 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
379 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Get TTS mode");
381 RETVM_IF(NULL == mode, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input parameter(mode) is NULL");
383 tts_client_s* client = tts_client_get(tts);
384 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
386 tts_state_e current_state = tts_client_get_current_state(client);
387 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
389 *mode = tts_client_get_mode(client);
391 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
392 return TTS_ERROR_NONE;
395 int tts_set_playing_mode(tts_h tts, tts_playing_mode_e mode)
397 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
399 SLOG(LOG_INFO, TAG_TTSC, "@@@ Set TTS playing mode(%d)", mode);
401 RETVM_IF(TTS_PLAYING_MODE_BY_SERVICE > mode || TTS_PLAYING_MODE_BY_CLIENT < mode, TTS_ERROR_INVALID_PARAMETER, "[ERROR] mode is not valid : %d", mode);
403 tts_client_s* client = tts_client_get(tts);
404 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
406 tts_state_e current_state = tts_client_get_current_state(client);
407 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
409 tts_client_set_playing_mode(client, mode);
411 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
412 return TTS_ERROR_NONE;
415 int tts_set_credential(tts_h tts, const char* credential)
417 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
419 RETVM_IF(NULL == credential, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input parameter is null");
421 tts_client_s* client = tts_client_get(tts);
422 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
424 tts_state_e current_state = tts_client_get_current_state(client);
425 RETVM_IF(TTS_STATE_CREATED != current_state && TTS_STATE_READY != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
427 tts_client_set_credential_key(client, credential);
429 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
430 return TTS_ERROR_NONE;
433 int tts_set_server_tts(tts_h tts, const char* credential)
435 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
437 tts_client_s* client = tts_client_get(tts);
438 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
440 // TODO: fix state check, because set_private_data runs only ready state
441 tts_state_e current_state = tts_client_get_current_state(client);
442 RETVM_IF(TTS_STATE_CREATED != current_state && TTS_STATE_READY != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
444 // TODO: fix name more clear and move into tts_client
445 client->internal = true;
448 if (NULL != credential) {
449 key = "EnableServerTTS";
450 tts_client_set_credential_key(client, credential);
451 if (NULL == tts_client_get_credential_key(client)) {
452 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to allocate memory");
453 return TTS_ERROR_OUT_OF_MEMORY;
456 key = "DisableServerTTS";
461 int ret = app_manager_get_app_id(pid, &appid);
462 if (0 != ret || NULL == appid) {
463 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get appid, ret(%d), pid(%d), appid(%s)", ret, pid, appid);;
466 return TTS_ERROR_OPERATION_FAILED;
469 ret = tts_core_set_private_data(client, key, appid);
471 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to set private data, ret(%d), pid(%d), appid(%s)", ret, pid, appid);
480 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
481 return TTS_ERROR_NONE;
484 int tts_prepare(tts_h tts)
486 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
488 tts_client_s* client = tts_client_get(tts);
489 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
491 tts_state_e current_state = tts_client_get_current_state(client);
492 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
494 SLOG(LOG_INFO, TAG_TTSC, "@@@ Prepare TTS");
495 int ret = tts_core_prepare(client);
497 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] tts_core_prepare failed. (%s)", tts_core_covert_error_code(ret));
501 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
502 return TTS_ERROR_NONE;
505 int tts_prepare_sync(tts_h tts)
507 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
509 tts_client_s* client = tts_client_get(tts);
510 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
512 tts_state_e current_state = tts_client_get_current_state(client);
513 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
515 SLOG(LOG_INFO, TAG_TTSC, "@@@ Prepare TTS synchronously");
516 int ret = tts_core_prepare_sync(client);
517 if (TTS_ERROR_NONE != ret) {
518 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] tts_core_prepare_sync failed. (%s)", tts_core_covert_error_code(ret));
522 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
523 return TTS_ERROR_NONE;
526 int tts_unprepare(tts_h tts)
528 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
530 tts_client_s* client = tts_client_get(tts);
531 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
533 tts_state_e current_state = tts_client_get_current_state(client);
534 RETVM_IF(TTS_STATE_READY != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
536 SLOG(LOG_INFO, TAG_TTSC, "@@@ Unprepare TTS");
537 int ret = tts_core_unprepare(client);
539 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] tts_core_unprepare is failed(%s)", tts_core_covert_error_code(ret));
543 tts_core_notify_state_changed(client, TTS_STATE_CREATED);
545 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
546 return TTS_ERROR_NONE;
549 int tts_foreach_supported_voices(tts_h tts, tts_supported_voice_cb callback, void* user_data)
551 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
553 SLOG(LOG_INFO, TAG_TTSC, "@@@ Foreach supported voices");
555 RETVM_IF(NULL == callback, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input parameter is null");
557 tts_client_s* client = tts_client_get(tts);
558 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
561 char* current_engine = NULL;
562 ret = tts_config_mgr_get_engine(¤t_engine);
563 if (0 != ret || NULL == current_engine) {
564 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get current engine : %d", ret);
565 return __tts_convert_config_error_code(ret);
568 ret = tts_core_foreach_supported_voices(client, current_engine, callback, user_data);
569 free(current_engine);
572 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
576 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
577 return TTS_ERROR_NONE;
580 int tts_get_default_voice(tts_h tts, char** lang, int* vctype)
582 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
584 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Get default voice");
586 RETVM_IF(NULL == lang || NULL == vctype, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid");
588 tts_client_s* client = tts_client_get(tts);
589 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
591 /* Request call remote method */
593 ret = tts_config_mgr_get_voice(lang, vctype);
595 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
596 return __tts_convert_config_error_code(ret);
599 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] Default language(%s), type(%d)", *lang, *vctype);
600 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
601 return TTS_ERROR_NONE;
604 int tts_get_max_text_size(tts_h tts, unsigned int* size)
606 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
608 RETVM_IF(NULL == size, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Get max text count : Input parameter is null");
610 tts_client_s* client = tts_client_get(tts);
611 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
613 tts_state_e current_state = tts_client_get_current_state(client);
614 RETVM_IF(TTS_STATE_READY != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
616 if (0 != tts_config_mgr_get_max_text_size(size)) {
617 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get max text size");
618 return TTS_ERROR_OPERATION_FAILED;
621 SLOG(LOG_INFO, TAG_TTSC, "Get max text size : %d byte", *size);
622 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
623 return TTS_ERROR_NONE;
626 int tts_get_state(tts_h tts, tts_state_e* state)
628 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
630 RETVM_IF(NULL == state, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Get state : Input parameter is null");
632 tts_client_s* client = tts_client_get(tts);
633 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
635 tts_state_e current_state = tts_client_get_current_state(client);
636 switch (current_state) {
637 case TTS_STATE_CREATED: SLOG(LOG_INFO, TAG_TTSC, "Current state is 'Created'"); break;
638 case TTS_STATE_READY: SLOG(LOG_INFO, TAG_TTSC, "Current state is 'Ready'"); break;
639 case TTS_STATE_PLAYING: SLOG(LOG_INFO, TAG_TTSC, "Current state is 'Playing'"); break;
640 case TTS_STATE_PAUSED: SLOG(LOG_INFO, TAG_TTSC, "Current state is 'Paused'"); break;
642 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Client is not valid");
643 return TTS_ERROR_INVALID_PARAMETER;
646 *state = current_state;
647 return TTS_ERROR_NONE;
650 int tts_get_speed_range(tts_h tts, int* min, int* normal, int* max)
652 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
654 RETVM_IF(NULL == min || NULL == normal || NULL == max, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input parameter is null");
656 tts_client_s* client = tts_client_get(tts);
657 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
659 *min = TTS_SPEED_MIN;
660 *normal = TTS_SPEED_NORMAL;
661 *max = TTS_SPEED_MAX;
663 return TTS_ERROR_NONE;
666 int tts_get_error_message(tts_h tts, char** err_msg)
668 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
670 RETVM_IF(NULL == err_msg, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input parameter is null");
672 tts_client_s* client = tts_client_get(tts);
673 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
675 const char* error_message = tts_client_get_error_message(client);
676 if (NULL != error_message) {
677 *err_msg = strdup(error_message);
678 SLOG(LOG_DEBUG, TAG_TTSC, "Error msg (%s)", error_message);
681 SLOG(LOG_DEBUG, TAG_TTSC, "Error msg (NULL)");
684 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
685 return TTS_ERROR_NONE;
688 int tts_check_screen_reader_on(tts_h tts, bool* is_on)
690 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
692 RETVM_IF(NULL == is_on, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input parameter is null");
694 tts_client_s* client = tts_client_get(tts);
695 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
697 if (false == tts_core_check_screen_reader(client)) {
698 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is not available");
701 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Screen reader option is available");
705 return TTS_ERROR_NONE;
708 int tts_get_service_state(tts_h tts, tts_service_state_e* service_state)
710 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
712 RETVM_IF(NULL == service_state, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Get service state : Input parameter is null");
714 tts_client_s* client = tts_client_get(tts);
715 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
717 tts_state_e current_state = tts_client_get_current_state(client);
718 RETVM_IF(TTS_STATE_CREATED == current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
720 int ret = tts_core_get_service_state(client, service_state);
721 if (TTS_ERROR_NONE != ret) {
722 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get service state. ret(%d/%s)", ret, get_error_message(ret));
726 return TTS_ERROR_NONE;
729 int tts_add_text(tts_h tts, const char* text, const char* language, int voice_type, int speed, int* utt_id)
731 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
733 SLOG(LOG_ERROR, TAG_TTSC, "[INFO] Add text: text(%s), language(%s), type(%d)", (NULL == text) ? "NULL" : text, (NULL == language) ? "NULL" : language, voice_type);
735 RETVM_IF(TTS_SPEED_AUTO > speed || TTS_SPEED_MAX < speed, TTS_ERROR_INVALID_PARAMETER, "[ERROR] speed value(%d) is invalid.", speed);
736 RETVM_IF(voice_type < 0, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Voice type should not be negative(%d)", voice_type);
737 RETVM_IF(NULL == utt_id, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input parameter is null");
738 RETVM_IF(false == tts_core_is_valid_text(text), TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input text is invalid");
740 tts_client_s* client = tts_client_get(tts);
741 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
743 tts_state_e current_state = tts_client_get_current_state(client);
744 RETVM_IF(TTS_STATE_CREATED == current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
746 RETVM_IF(false == tts_core_check_screen_reader(client), TTS_ERROR_SCREEN_READER_OFF, "[ERROR] Screen reader option is not available");
747 RETVM_IF(false == tts_core_check_credential(client), TTS_ERROR_PERMISSION_DENIED, "[ERROR] Do not have app credential for this engine");
749 int ret = tts_core_add_text(client, text, language, voice_type, speed, utt_id);
750 if (TTS_ERROR_NONE != ret) {
751 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request add text. ret(%s)", tts_core_covert_error_code(ret));
755 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
756 return TTS_ERROR_NONE;
760 static void __tts_play_async(void *data)
762 tts_h tts = (tts_h)data;
764 tts_client_s* client = tts_client_get(tts);
765 RETM_IF(NULL == client, "[ERROR] A handle is not valid. tts(%p)", tts);
767 int ret = tts_core_play(client);
769 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to play tts : %s", tts_core_covert_error_code(ret));
770 tts_core_notify_error_async(client, ret, -1, NULL);
774 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
778 int tts_play_async(tts_h tts)
780 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
782 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Play asynchronously tts");
784 tts_client_s* client = tts_client_get(tts);
785 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
787 tts_state_e current_state = tts_client_get_current_state(client);
788 RETVM_IF(TTS_STATE_PLAYING == current_state || TTS_STATE_CREATED == current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
790 RETVM_IF(false == tts_core_check_screen_reader(client), TTS_ERROR_SCREEN_READER_OFF, "[ERROR] Screen reader option is not available");
791 RETVM_IF(false == tts_core_check_credential(client), TTS_ERROR_PERMISSION_DENIED, "[ERROR] Do not have app credential for this engine");
793 ecore_main_loop_thread_safe_call_async(__tts_play_async, (void*)tts);
795 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
796 return TTS_ERROR_NONE;
800 int tts_play(tts_h tts)
802 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
804 SLOG(LOG_INFO, TAG_TTSC, "@@@ Play tts");
806 tts_client_s* client = tts_client_get(tts);
807 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
809 tts_state_e current_state = tts_client_get_current_state(client);
810 RETVM_IF(TTS_STATE_PLAYING == current_state || TTS_STATE_CREATED == current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
812 RETVM_IF(false == tts_core_check_screen_reader(client), TTS_ERROR_SCREEN_READER_OFF, "[ERROR] Screen reader option is not available");
813 RETVM_IF(false == tts_core_check_credential(client), TTS_ERROR_PERMISSION_DENIED, "[ERROR] Do not have app credential for this engine");
815 int ret = tts_core_play(client);
816 if (TTS_ERROR_NONE != ret) {
817 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request play. ret(%s)", tts_core_covert_error_code(ret));
821 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
822 return TTS_ERROR_NONE;
826 static void __tts_stop_async(void *data)
828 tts_h tts = (tts_h)data;
830 tts_client_s* client = tts_client_get(tts);
831 RETM_IF(NULL == client, "[ERROR] A handle is not valid. tts(%p)", tts);
833 int ret = tts_core_stop(client);
835 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to stop tts : %s", tts_core_covert_error_code(ret));
836 tts_core_notify_error_async(client, ret, -1, NULL);
840 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
844 int tts_stop_aync(tts_h tts)
846 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
848 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Stop asynchronously tts");
850 tts_client_s* client = tts_client_get(tts);
851 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
853 tts_state_e current_state = tts_client_get_current_state(client);
854 RETVM_IF(TTS_STATE_CREATED == current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
856 RETVM_IF(false == tts_core_check_screen_reader(client), TTS_ERROR_SCREEN_READER_OFF, "[ERROR] Screen reader option is not available");
858 ecore_main_loop_thread_safe_call_async(__tts_stop_async, (void*)tts);
860 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
861 return TTS_ERROR_NONE;
865 int tts_stop(tts_h tts)
867 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
869 SLOG(LOG_INFO, TAG_TTSC, "@@@ Stop tts");
871 tts_client_s* client = tts_client_get(tts);
872 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
874 tts_state_e current_state = tts_client_get_current_state(client);
875 RETVM_IF(TTS_STATE_CREATED == current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
877 int ret = tts_core_stop(client);
878 if (TTS_ERROR_NONE != ret) {
879 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request stop. ret(%s)", tts_core_covert_error_code(ret));
883 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
884 return TTS_ERROR_NONE;
888 static void __tts_pause_async(void *data)
890 tts_h tts = (tts_h)data;
892 tts_client_s* client = tts_client_get(tts);
893 RETM_IF(NULL == client, "[ERROR] A handle is not valid. tts(%p)", tts);
895 int ret = tts_core_pause(client);
897 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to pause tts : %s", tts_core_covert_error_code(ret));
898 tts_core_notify_error_async(client, ret, -1, NULL);
902 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
906 int tts_pause_async(tts_h tts)
908 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
910 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Pause asynchronously tts");
912 tts_client_s* client = tts_client_get(tts);
913 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
915 tts_state_e current_state = tts_client_get_current_state(client);
916 RETVM_IF(TTS_STATE_PLAYING != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
918 RETVM_IF(false == tts_core_check_screen_reader(client), TTS_ERROR_SCREEN_READER_OFF, "[ERROR] Screen reader option is not available");
920 ecore_main_loop_thread_safe_call_async(__tts_pause_async, (void*)tts);
922 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
923 return TTS_ERROR_NONE;
926 int tts_pause(tts_h tts)
928 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
930 SLOG(LOG_INFO, TAG_TTSC, "@@@ Pause tts");
932 tts_client_s* client = tts_client_get(tts);
933 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
935 tts_state_e current_state = tts_client_get_current_state(client);
936 RETVM_IF(TTS_STATE_PLAYING != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
938 RETVM_IF(false == tts_core_check_screen_reader(client), TTS_ERROR_SCREEN_READER_OFF, "[ERROR] Screen reader option is not available");
940 int ret = tts_core_pause(client);
941 if (TTS_ERROR_NONE != ret) {
942 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request pause. ret(%s)", tts_core_covert_error_code(ret));
946 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
947 return TTS_ERROR_NONE;
950 int tts_set_private_data(tts_h tts, const char* key, const char* data)
952 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
954 SLOG(LOG_INFO, TAG_TTSC, "@@@ Set private data, key(%s), data(%s)", key, data);
956 RETVM_IF(NULL == key || NULL == data, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Invalid parameter");
958 tts_client_s* client = tts_client_get(tts);
959 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
961 tts_state_e current_state = tts_client_get_current_state(client);
962 RETVM_IF(TTS_STATE_READY != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
964 if (true != client->internal && (0 == strcmp(key, "EnableServerTTS") || 0 == strcmp(key, "DisableServerTTS"))) {
965 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] This is not an internal app");
966 return TTS_ERROR_INVALID_PARAMETER;
969 int ret = tts_core_set_private_data(client, key, data);
970 if (TTS_ERROR_NONE != ret) {
971 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request set private data. ret(%s)", tts_core_covert_error_code(ret));
975 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
979 int tts_get_private_data(tts_h tts, const char* key, char** data)
981 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
983 SLOG(LOG_INFO, TAG_TTSC, "@@@ Get private data, key(%s)", key);
985 RETVM_IF(NULL == key || NULL == data, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Invalid parameter");
987 tts_client_s* client = tts_client_get(tts);
988 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
990 tts_state_e current_state = tts_client_get_current_state(client);
991 RETVM_IF(TTS_STATE_READY != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
993 int ret = tts_core_get_private_data(client, key, data);
994 if (TTS_ERROR_NONE != ret) {
995 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request get private data. ret(%s)", tts_core_covert_error_code(ret));
999 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1003 int tts_set_state_changed_cb(tts_h tts, tts_state_changed_cb callback, void* user_data)
1005 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1007 tts_client_s* client = tts_client_get(tts);
1008 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1010 RETVM_IF(NULL == callback, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Set state changed cb : Input parameter is null");
1012 tts_state_e current_state = tts_client_get_current_state(client);
1013 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1015 tts_client_set_state_changed_cb(client, callback, user_data);
1017 SLOG(LOG_INFO, TAG_TTSC, "[SUCCESS] Set state changed cb");
1021 int tts_unset_state_changed_cb(tts_h tts)
1023 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1025 tts_client_s* client = tts_client_get(tts);
1026 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1028 tts_state_e current_state = tts_client_get_current_state(client);
1029 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1031 tts_client_set_state_changed_cb(client, NULL, NULL);
1033 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset state changed cb");
1037 int tts_set_utterance_started_cb(tts_h tts, tts_utterance_started_cb callback, void* user_data)
1039 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1041 tts_client_s* client = tts_client_get(tts);
1042 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1044 RETVM_IF(NULL == callback, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Set utt started cb : Input parameter is null");
1046 tts_state_e current_state = tts_client_get_current_state(client);
1047 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1049 tts_client_set_utterance_started_cb(client, callback, user_data);
1051 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt started cb");
1056 int tts_unset_utterance_started_cb(tts_h tts)
1058 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1060 tts_client_s* client = tts_client_get(tts);
1061 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1063 tts_state_e current_state = tts_client_get_current_state(client);
1064 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1066 tts_client_set_utterance_started_cb(client, NULL, NULL);
1068 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt started cb");
1073 int tts_set_utterance_completed_cb(tts_h tts, tts_utterance_completed_cb callback, void* user_data)
1075 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1077 tts_client_s* client = tts_client_get(tts);
1078 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1080 RETVM_IF(NULL == callback, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Set utt completed cb : Input parameter is null");
1082 tts_state_e current_state = tts_client_get_current_state(client);
1083 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1085 tts_client_set_utterance_completed_cb(client, callback, user_data);
1087 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt completed cb");
1092 int tts_unset_utterance_completed_cb(tts_h tts)
1094 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1096 tts_client_s* client = tts_client_get(tts);
1097 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1099 tts_state_e current_state = tts_client_get_current_state(client);
1100 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1102 tts_client_set_utterance_completed_cb(client, NULL, NULL);
1104 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt completed cb");
1108 int tts_set_error_cb(tts_h tts, tts_error_cb callback, void* user_data)
1110 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1112 tts_client_s* client = tts_client_get(tts);
1113 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1115 RETVM_IF(NULL == callback, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Set error cb : Input parameter is null");
1117 tts_state_e current_state = tts_client_get_current_state(client);
1118 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1120 tts_client_set_error_cb(client, callback, user_data);
1122 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set error cb");
1127 int tts_unset_error_cb(tts_h tts)
1129 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1131 tts_client_s* client = tts_client_get(tts);
1132 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1134 tts_state_e current_state = tts_client_get_current_state(client);
1135 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1137 tts_client_set_error_cb(client, NULL, NULL);
1139 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset error cb");
1144 int tts_set_default_voice_changed_cb(tts_h tts, tts_default_voice_changed_cb callback, void* user_data)
1146 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1148 tts_client_s* client = tts_client_get(tts);
1149 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1151 RETVM_IF(NULL == callback, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Set default voice changed cb : Input parameter is null");
1153 tts_state_e current_state = tts_client_get_current_state(client);
1154 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1156 tts_client_set_default_voice_changed_cb(client, callback, user_data);
1158 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set default voice changed cb");
1163 int tts_unset_default_voice_changed_cb(tts_h tts)
1165 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1167 tts_client_s* client = tts_client_get(tts);
1168 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1170 tts_state_e current_state = tts_client_get_current_state(client);
1171 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1173 tts_client_set_default_voice_changed_cb(client, NULL, NULL);
1175 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset default voice changed cb");
1180 int tts_set_engine_changed_cb(tts_h tts, tts_engine_changed_cb callback, void* user_data)
1182 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1184 tts_client_s* client = tts_client_get(tts);
1185 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1187 RETVM_IF(NULL == callback, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Set engine changed cb : Input parameter is null");
1189 tts_state_e current_state = tts_client_get_current_state(client);
1190 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1192 tts_client_set_engine_changed_cb(client, callback, user_data);
1194 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set engine changed cb");
1199 int tts_unset_engine_changed_cb(tts_h tts)
1201 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1203 tts_client_s* client = tts_client_get(tts);
1204 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1206 tts_state_e current_state = tts_client_get_current_state(client);
1207 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1209 tts_client_set_engine_changed_cb(client, NULL, NULL);
1211 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset engine changed cb");
1216 int tts_set_screen_reader_changed_cb(tts_h tts, tts_screen_reader_changed_cb callback, void* user_data)
1218 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1220 tts_client_s* client = tts_client_get(tts);
1221 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1223 RETVM_IF(NULL == callback, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Set screen reader changed cb : Input parameter is null");
1225 tts_state_e current_state = tts_client_get_current_state(client);
1226 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1228 tts_client_set_screen_reader_changed_cb(client, callback, user_data);
1230 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set screen reader changed cb");
1235 int tts_unset_screen_reader_changed_cb(tts_h tts)
1237 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1239 tts_client_s* client = tts_client_get(tts);
1240 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1242 tts_state_e current_state = tts_client_get_current_state(client);
1243 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1245 tts_client_set_screen_reader_changed_cb(client, NULL, NULL);
1247 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset screen reader changed cb");
1252 int tts_add_pcm(tts_h tts, int event, const void* data, unsigned int data_size, int audio_type, int rate)
1254 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1256 SLOG(LOG_INFO, TAG_TTSC, "@@@ Add pcm tts");
1258 tts_client_s* client = tts_client_get(tts);
1259 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1261 tts_state_e current_state = tts_client_get_current_state(client);
1262 RETVM_IF(TTS_STATE_CREATED == current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1264 RETVM_IF(false == tts_core_check_screen_reader(client), TTS_ERROR_SCREEN_READER_OFF, "[ERROR] Screen reader option is not available");
1266 int ret = tts_core_add_pcm(client, event, data, data_size, audio_type, rate);
1267 if (TTS_ERROR_NONE != ret) {
1268 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request add_pcm. ret(%s)", tts_core_covert_error_code(ret));
1272 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1273 return TTS_ERROR_NONE;
1276 int tts_play_pcm(tts_h tts)
1278 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1280 SLOG(LOG_INFO, TAG_TTSC, "@@@ Play pcm tts");
1282 tts_client_s* client = tts_client_get(tts);
1283 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1285 tts_state_e current_state = tts_client_get_current_state(client);
1286 RETVM_IF(TTS_STATE_PLAYING == current_state || TTS_STATE_CREATED == current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1288 RETVM_IF(false == tts_core_check_screen_reader(client), TTS_ERROR_SCREEN_READER_OFF, "[ERROR] Screen reader option is not available");
1290 int ret = tts_core_play_pcm(client);
1291 if (TTS_ERROR_NONE != ret) {
1292 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request play_pcm. ret(%s)", tts_core_covert_error_code(ret));
1296 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1297 return TTS_ERROR_NONE;
1300 int tts_stop_pcm(tts_h tts)
1302 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1304 SLOG(LOG_INFO, TAG_TTSC, "@@@ Stop pcm tts");
1306 tts_client_s* client = tts_client_get(tts);
1307 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1309 tts_state_e current_state = tts_client_get_current_state(client);
1310 RETVM_IF(TTS_STATE_CREATED == current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1312 RETVM_IF(false == tts_core_check_screen_reader(client), TTS_ERROR_SCREEN_READER_OFF, "[ERROR] Screen reader option is not available");
1314 int ret = tts_core_stop_pcm(client);
1315 if (TTS_ERROR_NONE != ret) {
1316 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request stop_pcm. ret(%s)", tts_core_covert_error_code(ret));
1320 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1321 return TTS_ERROR_NONE;
1324 int tts_repeat(tts_h tts, char** text_repeat, int* utt_id)
1326 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1328 SLOG(LOG_INFO, TAG_TTSC, "@@@ Repeat TTS");
1330 RETVM_IF(NULL == text_repeat || NULL == utt_id, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input parameter is null.");
1332 tts_client_s* client = tts_client_get(tts);
1333 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1335 tts_state_e current_state = tts_client_get_current_state(client);
1336 RETVM_IF(TTS_STATE_READY != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1338 RETVM_IF(false == tts_core_check_screen_reader(client), TTS_ERROR_SCREEN_READER_OFF, "[ERROR] Screen reader option is not available");
1340 if (true == client->credential_needed && NULL == client->credential) {
1341 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Do not have app credential for this engine");
1342 return TTS_ERROR_PERMISSION_DENIED;
1345 *text_repeat = NULL;
1348 int ret = tts_core_repeat(client, text_repeat, utt_id);
1349 if (TTS_ERROR_NONE != ret) {
1350 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request stop. ret(%s)", tts_core_covert_error_code(ret));
1354 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1355 return TTS_ERROR_NONE;
1358 int tts_set_service_state_changed_cb(tts_h tts, tts_service_state_changed_cb callback, void* user_data)
1360 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1362 tts_client_s* client = tts_client_get(tts);
1363 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1364 RETVM_IF(NULL == callback, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Set service state changed cb : Input parameter is null");
1366 tts_state_e current_state = tts_client_get_current_state(client);
1367 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1369 tts_client_set_service_state_changed_cb(client, callback, user_data);
1371 SLOG(LOG_INFO, TAG_TTSC, "[SUCCESS] Set service state changed cb");
1372 return TTS_ERROR_NONE;
1375 int tts_unset_service_state_changed_cb(tts_h tts)
1377 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1379 tts_client_s* client = tts_client_get(tts);
1380 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1382 tts_state_e current_state = tts_client_get_current_state(client);
1383 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1385 tts_client_set_service_state_changed_cb(client, NULL, NULL);
1387 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset service state changed cb");
1388 return TTS_ERROR_NONE;
1391 int tts_set_synthesized_pcm_cb(tts_h tts, tts_synthesized_pcm_cb callback, void* user_data)
1393 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1395 tts_client_s* client = tts_client_get(tts);
1396 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1397 RETVM_IF(NULL == callback, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Set synthesized pcm cb : Input parameter is null");
1399 tts_state_e current_state = tts_client_get_current_state(client);
1400 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1402 tts_client_set_synthesized_pcm_cb(client, callback, user_data);
1404 SLOG(LOG_INFO, TAG_TTSC, "[SUCCESS] Set synthesized pcm cb");
1405 return TTS_ERROR_NONE;
1408 int tts_unset_synthesized_pcm_cb(tts_h tts)
1410 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1412 tts_client_s* client = tts_client_get(tts);
1413 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1415 tts_state_e current_state = tts_client_get_current_state(client);
1416 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1418 tts_client_set_synthesized_pcm_cb(client, NULL, NULL);
1420 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset synthesized pcm cb");
1421 return TTS_ERROR_NONE;
1424 int tts_add_silent_utterance(tts_h tts, unsigned int duration_in_msec, int* utt_id)
1426 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1428 tts_client_s* client = tts_client_get(tts);
1429 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1430 RETVM_IF(NULL == utt_id, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input parameter is null.");
1432 tts_state_e current_state = tts_client_get_current_state(client);
1433 RETVM_IF(TTS_STATE_CREATED == current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1435 RETVM_IF(false == tts_core_check_screen_reader(client), TTS_ERROR_SCREEN_READER_OFF, "[ERROR] Screen reader option is not available");
1436 RETVM_IF(false == tts_core_check_credential(client), TTS_ERROR_PERMISSION_DENIED, "[ERROR] Do not have app credential for this engine");
1438 if (duration_in_msec < 0) {
1439 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to add silent. The duration of silent should be above than zero.");
1440 return TTS_ERROR_INVALID_PARAMETER;
1443 if (duration_in_msec > MAX_SILENT_DURATION) {
1444 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to add silent. The max duration for silent is 5000 msec");
1445 return TTS_ERROR_INVALID_PARAMETER;
1448 int ret = tts_core_add_silent_utterance(client, duration_in_msec, utt_id);
1449 if (TTS_ERROR_NONE != ret) {
1450 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request add silent. ret(%s)", tts_core_covert_error_code(ret));
1454 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1455 return TTS_ERROR_NONE;
1458 int tts_synthesis_parameter_create(tts_synthesis_parameter_h *parameter)
1460 SLOG(LOG_INFO, TAG_TTSC, "@@@ Create TTS synthesis parameter handle");
1461 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1463 RETVM_IF(NULL == parameter, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input handle is null");
1465 tts_synthesis_parameter_h new_parameter = (tts_synthesis_parameter_h)calloc(1, sizeof(struct tts_synthesis_parameter_s));
1466 RETVM_IF(NULL == new_parameter, TTS_ERROR_OUT_OF_MEMORY, "[ERROR] Fail to allocate memory for a handle");
1468 *parameter = new_parameter;
1470 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Create a handle for a synthesis parameter");
1471 return TTS_ERROR_NONE;
1474 int tts_synthesis_parameter_destroy(tts_synthesis_parameter_h parameter)
1476 SLOG(LOG_INFO, TAG_TTSC, "@@@ Destroy TTS synthesis parameter handle");
1477 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1479 RETVM_IF(NULL == parameter, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input handle is null");
1481 free(parameter->language);
1482 parameter->language = NULL;
1483 free(parameter->ptts_id);
1484 parameter->ptts_id = NULL;
1488 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Destroy the handle for a synthesis parameter");
1489 return TTS_ERROR_NONE;
1492 int tts_synthesis_parameter_set_language(tts_synthesis_parameter_h parameter, const char *language)
1494 SLOG(LOG_INFO, TAG_TTSC, "@@@ Set language to a synthesis parameter");
1495 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1497 RETVM_IF(NULL == parameter || NULL == language, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input handle is null");
1499 char *new_language = strdup(language);
1500 RETVM_IF(NULL == new_language, TTS_ERROR_OUT_OF_MEMORY, "[ERROR] Fail to allocate memory for language");
1502 free(parameter->language);
1503 parameter->language = new_language;
1505 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set language(%s) to a synthesis parameter", language);
1506 return TTS_ERROR_NONE;
1509 int tts_synthesis_parameter_set_voice_type(tts_synthesis_parameter_h parameter, int voice_type)
1511 SLOG(LOG_INFO, TAG_TTSC, "@@@ Set voice type to a synthesis parameter");
1512 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1514 RETVM_IF(NULL == parameter, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input handle is null");
1515 RETVM_IF(voice_type < 0, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Voice type should not be negative(%d)", voice_type);
1517 parameter->voice_type = voice_type;
1519 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set voice type(%d) to a synthesis parameter", voice_type);
1520 return TTS_ERROR_NONE;
1523 int tts_synthesis_parameter_set_personal_voice(tts_synthesis_parameter_h parameter, const char *ptts_id)
1525 SLOG(LOG_INFO, TAG_TTSC, "@@@ Set personal voice id to a synthesis parameter");
1526 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1528 RETVM_IF(NULL == parameter || NULL == ptts_id, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input handle is null");
1530 char *new_ptts_id = strdup(ptts_id);
1531 RETVM_IF(NULL == new_ptts_id, TTS_ERROR_OUT_OF_MEMORY, "[ERROR] Fail to allocate memory for personal voice id");
1533 free(parameter->ptts_id);
1534 parameter->ptts_id = new_ptts_id;
1536 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set personal voice id(%s) to a synthesis parameter", ptts_id);
1537 return TTS_ERROR_NONE;
1540 int tts_synthesis_parameter_set_speed(tts_synthesis_parameter_h parameter, int speed)
1542 SLOG(LOG_INFO, TAG_TTSC, "@@@ Set speed to a synthesis parameter");
1543 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1545 RETVM_IF(NULL == parameter, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input handle is null");
1546 RETVM_IF(TTS_SPEED_AUTO > speed || TTS_SPEED_MAX < speed, TTS_ERROR_INVALID_PARAMETER, "[ERROR] speed value(%d) is invalid.", speed);
1548 parameter->speed = speed;
1550 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set speed(%d) to a synthesis parameter", speed);
1551 return TTS_ERROR_NONE;
1554 int tts_synthesis_parameter_set_pitch(tts_synthesis_parameter_h parameter, int pitch)
1556 SLOG(LOG_INFO, TAG_TTSC, "@@@ Set pitch to a synthesis parameter");
1557 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1559 RETVM_IF(NULL == parameter, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input handle is null");
1560 RETVM_IF(TTS_PITCH_AUTO > pitch || TTS_PITCH_MAX < pitch, TTS_ERROR_INVALID_PARAMETER, "[ERROR] pitch value(%d) is invalid.", pitch);
1562 parameter->pitch = pitch;
1564 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set pitch(%d) to a synthesis parameter", pitch);
1565 return TTS_ERROR_NONE;
1568 int tts_synthesis_parameter_set_volume(tts_synthesis_parameter_h parameter, double volume)
1570 SLOG(LOG_INFO, TAG_TTSC, "@@@ Set volume to a synthesis parameter");
1571 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1573 RETVM_IF(NULL == parameter, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input handle is null");
1574 RETVM_IF(0.0 > volume || 1.0 < volume, TTS_ERROR_INVALID_PARAMETER, "[ERROR] volume value(%f) is invalid.", volume);
1576 parameter->volume = volume;
1578 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set volume(%f) to a synthesis parameter", volume);
1579 return TTS_ERROR_NONE;
1582 int tts_synthesis_parameter_set_background_volume_ratio(tts_synthesis_parameter_h parameter, double background_volume_ratio)
1584 SLOG(LOG_INFO, TAG_TTSC, "@@@ Set background volume ratio to a synthesis parameter");
1585 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1587 RETVM_IF(NULL == parameter, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input handle is null");
1588 RETVM_IF(0.0 > background_volume_ratio || 1.0 < background_volume_ratio, TTS_ERROR_INVALID_PARAMETER, "[ERROR] background volume value ratio(%f) is invalid.", background_volume_ratio);
1590 parameter->background_volume_ratio = background_volume_ratio;
1592 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set background volume ratio(%f) to a synthesis parameter", background_volume_ratio);
1593 return TTS_ERROR_NONE;
1596 int tts_get_pitch_range(tts_h tts, int* min, int* normal, int* max)
1598 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1600 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Get pitch range");
1602 RETVM_IF(NULL == min || NULL == normal || NULL == max, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input parameter is null");
1604 tts_client_s* client = tts_client_get(tts);
1605 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1607 *min = TTS_PITCH_MIN;
1608 *normal = TTS_PITCH_NORMAL;
1609 *max = TTS_PITCH_MAX;
1611 return TTS_ERROR_NONE;
1614 int tts_get_volume_range(tts_h tts, int* min, int* max)
1616 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1618 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Get volume range");
1620 RETVM_IF(NULL == min || NULL == max, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input parameter is null");
1622 tts_client_s* client = tts_client_get(tts);
1623 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1628 return TTS_ERROR_NONE;
1631 int tts_add_text_with_synthesis_parameter(tts_h tts, const char* text, tts_synthesis_parameter_h parameter, int* utt_id)
1633 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1635 SLOG(LOG_ERROR, TAG_TTSC, "[INFO] Add text with synthesis parameter: text(%s), language(%s), ptts_id(%s), type(%d), speed(%d), pitch(%d), volume(%lf), background_volume(%lf)",
1636 (NULL == text) ? "NULL" : text, (NULL == parameter->language) ? "NULL" : parameter->language, (NULL == parameter->ptts_id) ? "NULL" : parameter->ptts_id, parameter->voice_type, parameter->speed, parameter->pitch, parameter->volume, parameter->background_volume_ratio);
1638 RETVM_IF(NULL == parameter, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input parameter is null");
1639 RETVM_IF(NULL == utt_id, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input parameter is null");
1640 RETVM_IF(false == tts_core_is_valid_text(text), TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input text is invalid");
1642 tts_client_s* client = tts_client_get(tts);
1643 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1645 tts_state_e current_state = tts_client_get_current_state(client);
1646 RETVM_IF(TTS_STATE_CREATED == current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1648 RETVM_IF(false == tts_core_check_screen_reader(client), TTS_ERROR_SCREEN_READER_OFF, "[ERROR] Screen reader option is not available");
1649 RETVM_IF(false == tts_core_check_credential(client), TTS_ERROR_PERMISSION_DENIED, "[ERROR] Do not have app credential for this engine");
1651 int ret = tts_core_add_text_with_synthesis_parameter(client, text, parameter, utt_id);
1652 if (TTS_ERROR_NONE != ret) {
1653 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request add text. ret(%s)", tts_core_covert_error_code(ret));
1657 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1658 return TTS_ERROR_NONE;