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>
19 #include <sys/types.h>
21 #include <system_info.h>
23 #include <package-manager.h>
27 #include "tts_client.h"
28 #include "tts_config_mgr.h"
34 #include "tts_internal.h"
36 static int g_feature_enabled = -1;
39 static int __tts_get_feature_enabled()
41 RETV_IF(1 == g_feature_enabled, TTS_ERROR_NONE);
42 RETVM_IF(0 == g_feature_enabled, TTS_ERROR_NOT_SUPPORTED, "[ERROR] TTS feature NOT supported");
44 bool tts_supported = false;
45 if (SYSTEM_INFO_ERROR_NONE != system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
46 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get feature value");
47 return TTS_ERROR_NOT_SUPPORTED;
50 if (false == tts_supported) {
51 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS feature NOT supported");
52 g_feature_enabled = 0;
53 return TTS_ERROR_NOT_SUPPORTED;
56 g_feature_enabled = 1;
57 return TTS_ERROR_NONE;
60 // TODO: move into tts_core to make common function
62 static int __tts_convert_config_error_code(tts_config_error_e code)
64 if (code == TTS_CONFIG_ERROR_NONE) return TTS_ERROR_NONE;
65 if (code == TTS_CONFIG_ERROR_OUT_OF_MEMORY) return TTS_ERROR_OUT_OF_MEMORY;
66 if (code == TTS_CONFIG_ERROR_IO_ERROR) return TTS_ERROR_IO_ERROR;
67 if (code == TTS_CONFIG_ERROR_INVALID_PARAMETER) return TTS_ERROR_INVALID_PARAMETER;
68 if (code == TTS_CONFIG_ERROR_INVALID_STATE) return TTS_ERROR_INVALID_STATE;
69 if (code == TTS_CONFIG_ERROR_INVALID_VOICE) return TTS_ERROR_INVALID_VOICE;
70 if (code == TTS_CONFIG_ERROR_ENGINE_NOT_FOUND) return TTS_ERROR_ENGINE_NOT_FOUND;
71 if (code == TTS_CONFIG_ERROR_OPERATION_FAILED) return TTS_ERROR_OPERATION_FAILED;
72 if (code == TTS_CONFIG_ERROR_NOT_SUPPORTED_FEATURE) return TTS_ERROR_NOT_SUPPORTED_FEATURE;
77 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)
79 SLOG(LOG_DEBUG, TAG_TTSC, "Voice changed : Before lang(%s) type(%d) , Current lang(%s), type(%d)",
80 before_lang, before_voice_type, language, voice_type);
82 GList* client_list = tts_client_get_client_list();
83 if (NULL == client_list) {
84 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get client list");
89 if (g_list_length(client_list) > 0) {
90 /* Get a first item */
91 iter = g_list_first(client_list);
93 while (NULL != iter) {
94 tts_client_s *client = iter->data;
95 if (tts_client_is_valid_client(client)) {
96 tts_core_notify_default_voice_changed(client, before_lang, before_voice_type, language, voice_type);
98 /* Check whether language is changed or not. If it is changed, make 'text_repeat' NULL */
99 if (0 != strncmp(before_lang, language, strlen(before_lang))) {
100 tts_client_set_repeat_text(client, NULL);
103 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Client is not valid (%p)", client);
107 iter = g_list_next(iter);
111 g_list_free(client_list);
116 static Eina_Bool __reconnect_by_engine_changed(void* data)
118 tts_h tts = (tts_h)data;
120 tts_client_s* client = tts_client_get(tts);
121 if (NULL == client) {
122 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid. tts(%p)", tts);
126 tts_state_e current_state = tts_client_get_current_state(client);
127 if (TTS_STATE_READY != current_state) {
132 // TODO: change to tts_core function
133 int ret = tts_unprepare(tts);
135 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare for setting a new engine... (%d)", ret);
137 ret = tts_prepare(tts);
139 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare for setting a new engine... (%d)", ret);
145 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)
147 tts_h tts = (tts_h)user_data;
149 tts_client_s* client = tts_client_get(tts);
150 RETM_IF(NULL == client, "[ERROR] A handle is not valid. tts(%p)", tts);
152 if (NULL != engine_id) SLOG(LOG_DEBUG, TAG_TTSC, "Engine id(%s)", engine_id);
153 if (NULL != setting) SLOG(LOG_DEBUG, TAG_TTSC, "Engine setting(%s)", setting);
154 if (NULL != language) SLOG(LOG_DEBUG, TAG_TTSC, "Language(%s)", language);
155 SLOG(LOG_DEBUG, TAG_TTSC, "Voice type(%d), Auto voice(%s), Credential(%s)", voice_type, auto_voice ? "on" : "off", need_credential ? "need" : "no need");
157 /* When the default engine is changed, please unload the old engine and load the new one. */
160 tts_state_e current_state = tts_client_get_current_state(client);
161 if (TTS_STATE_PLAYING == current_state || TTS_STATE_PAUSED == current_state) {
164 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] TTS client stopping...");
167 ecore_idler_add(__reconnect_by_engine_changed, (void*)tts);
168 } else if (TTS_STATE_READY == current_state) {
169 // TODO: change to tts_core function
170 ret = tts_unprepare(tts);
172 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to unprepare for setting a new engine... (%d)", ret);
174 ret = tts_prepare(tts);
176 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare for setting a new engine... (%d)", ret);
180 /* call callback function */
181 tts_core_notify_engine_changed(client, engine_id, language, voice_type, need_credential);
186 static void __tts_config_screen_reader_changed_cb(bool value, void* user_data)
188 tts_h tts = (tts_h)user_data;
190 tts_client_s* client = tts_client_get(tts);
191 RETM_IF(NULL == client, "[ERROR] A handle is not valid. tts(%p)", tts);
193 SLOG(LOG_DEBUG, TAG_TTSC, "Screen reader is changed. current status (%d)", value);
195 /* call callback function */
196 tts_core_notify_screen_reader_changed(client, value);
199 static int __initialize_tts_config(unsigned int uid, tts_h new_tts)
201 int ret = tts_config_mgr_initialize(uid, TTS_CONFIG_CLIENT_TYPE_DEFAULT);
202 if (TTS_CONFIG_ERROR_NONE != ret) {
203 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to init config manager : %d", ret);
204 return __tts_convert_config_error_code(ret);
207 ret = tts_config_mgr_set_callback(uid, __tts_config_engine_changed_cb, __tts_config_voice_changed_cb, NULL, NULL, NULL, new_tts);
208 if (TTS_CONFIG_ERROR_NONE != ret) {
209 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to set config changed : %d", ret);
210 tts_config_mgr_finalize(uid, TTS_CONFIG_CLIENT_TYPE_DEFAULT);
211 return __tts_convert_config_error_code(ret);
214 ret = tts_config_mgr_set_screen_reader_callback(uid, __tts_config_screen_reader_changed_cb, new_tts);
215 if (TTS_CONFIG_ERROR_NONE != ret) {
216 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to set config changed : %d", ret);
217 tts_config_mgr_finalize(uid, TTS_CONFIG_CLIENT_TYPE_DEFAULT);
218 return __tts_convert_config_error_code(ret);
221 return TTS_ERROR_NONE;
224 int tts_create(tts_h* tts)
226 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
228 SLOG(LOG_INFO, TAG_TTSC, "@@@ Create TTS");
230 RETVM_IF(NULL == tts, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input handle is null");
232 bool is_first_client = false;
233 if (0 == tts_client_get_size()) {
234 is_first_client = true;
237 tts_h new_tts = NULL;
238 if (0 != tts_client_new(&new_tts)) {
239 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to create client!!!!!");
240 return TTS_ERROR_OUT_OF_MEMORY;
243 tts_client_s* client = tts_client_get(new_tts);
244 if (NULL == client) {
245 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get client");
246 tts_client_destroy(new_tts);
247 return TTS_ERROR_OPERATION_FAILED;
250 unsigned int uid = tts_client_get_uid(client);
251 SLOG(LOG_ERROR, TAG_TTSC, "[INFO] tts_h(%p), tts_client(%p), uid(%u)", tts, client, uid);
253 if (false == tts_ipc_is_method_set()) {
256 int ret = app_manager_get_app_id(pid, &appid);
257 if (0 != ret || NULL == appid) {
258 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get appid, ret(%d), pid(%d)", ret, pid);
259 tts_ipc_set_method(TTS_IPC_METHOD_DBUS);
261 SLOG(LOG_INFO, TAG_TTSC, "[INFO] tts_create : client appid(%s), pid(%d)", appid, pid);
262 tts_ipc_set_method(TTS_IPC_METHOD_TIDL);
271 if (0 != tts_ipc_open_connection(uid)) {
272 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to open ipc connection");
273 tts_client_destroy(new_tts);
274 return TTS_ERROR_OPERATION_FAILED;
277 int ret = __initialize_tts_config(uid, new_tts);
278 if (TTS_ERROR_NONE != ret) {
279 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to init config manager : %d", ret);
280 tts_client_destroy(new_tts);
284 if (is_first_client) {
285 // These function would be called only when first client is created.
286 if (0 != tts_core_initialize()) {
287 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to initialize core");
288 tts_config_mgr_finalize(uid, TTS_CONFIG_CLIENT_TYPE_DEFAULT);
289 tts_client_destroy(new_tts);
290 return TTS_ERROR_OPERATION_FAILED;
295 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
296 return TTS_ERROR_NONE;
299 int tts_destroy(tts_h tts)
301 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
303 SLOG(LOG_INFO, TAG_TTSC, "@@@ Destroy TTS");
305 tts_client_s* client = tts_client_get(tts);
306 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
308 unsigned int uid = tts_client_get_uid(client);
309 SLOG(LOG_ERROR, TAG_TTSC, "[INFO] tts_h(%p), tts_client(%p), uid(%u)", tts, client, uid);
311 /* check used callback */
312 if (0 != tts_client_get_use_callback(client)) {
313 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Cannot destroy in Callback function");
314 return TTS_ERROR_OPERATION_FAILED;
317 tts_config_mgr_finalize(uid, TTS_CONFIG_CLIENT_TYPE_DEFAULT);
319 // TODO: move into tts_client
320 if (client->hello_timer) {
321 ecore_timer_del(client->hello_timer);
322 client->hello_timer = NULL;
325 switch (tts_client_get_current_state(client)) {
326 case TTS_STATE_PAUSED:
327 case TTS_STATE_PLAYING:
328 case TTS_STATE_READY:
329 if (0 != tts_core_unprepare(client)) {
330 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to unprepare");
332 tts_client_set_current_state(client, TTS_STATE_CREATED);
333 case TTS_STATE_CREATED:
334 /* Unset registered callbacks */
335 tts_client_unset_all_cb(client);
337 int thread_count = ecore_thread_active_get();
338 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Active thread count: %d", thread_count);
340 while (0 < thread_count) {
344 SLOG(LOG_WARN, TAG_TTSC, "[WARNNING] Thread is blocked, %d", thread_count);
347 thread_count = ecore_thread_active_get();
350 if (0 != tts_ipc_close_connection(uid)) {
351 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to close connection");
352 return TTS_ERROR_OPERATION_FAILED;
356 tts_client_destroy(tts);
360 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Client is not valid");
361 return TTS_ERROR_INVALID_PARAMETER;
364 unsigned int num_of_client = tts_client_get_size();
365 SLOG(LOG_ERROR, TAG_TTSC, "[INFO] num_of_client(%u)", num_of_client);
367 if (0 == num_of_client) {
368 if (0 != tts_core_deinitialize()) {
369 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to deinitialize core");
373 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
374 return TTS_ERROR_NONE;
377 int tts_set_mode(tts_h tts, tts_mode_e mode)
379 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
381 SLOG(LOG_INFO, TAG_TTSC, "@@@ Set TTS mode(%d)", mode);
383 RETVM_IF(TTS_MODE_DEFAULT > mode || TTS_MODE_INTERRUPT < mode, TTS_ERROR_INVALID_PARAMETER, "[ERROR] mode is not valid : %d", mode);
385 tts_client_s* client = tts_client_get(tts);
386 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
388 tts_state_e current_state = tts_client_get_current_state(client);
389 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
391 tts_client_set_mode(client, mode);
393 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
394 return TTS_ERROR_NONE;
397 int tts_get_mode(tts_h tts, tts_mode_e* mode)
399 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
401 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Get TTS mode");
403 RETVM_IF(NULL == mode, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input parameter(mode) is NULL");
405 tts_client_s* client = tts_client_get(tts);
406 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
408 tts_state_e current_state = tts_client_get_current_state(client);
409 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
411 *mode = tts_client_get_mode(client);
413 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
414 return TTS_ERROR_NONE;
417 int tts_set_credential(tts_h tts, const char* credential)
419 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
421 RETVM_IF(NULL == credential, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input parameter is null");
423 tts_client_s* client = tts_client_get(tts);
424 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
426 tts_state_e current_state = tts_client_get_current_state(client);
427 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);
429 tts_client_set_credential_key(client, credential);
431 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
432 return TTS_ERROR_NONE;
435 int tts_set_server_tts(tts_h tts, const char* credential)
437 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
439 tts_client_s* client = tts_client_get(tts);
440 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
442 // TODO: fix state check, because set_private_data runs only ready state
443 tts_state_e current_state = tts_client_get_current_state(client);
444 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);
446 // TODO: fix name more clear and move into tts_client
447 client->internal = true;
450 if (NULL != credential) {
451 key = "EnableServerTTS";
452 tts_client_set_credential_key(client, credential);
453 if (NULL == tts_client_get_credential_key(client)) {
454 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to allocate memory");
455 return TTS_ERROR_OUT_OF_MEMORY;
458 key = "DisableServerTTS";
463 int ret = app_manager_get_app_id(pid, &appid);
464 if (0 != ret || NULL == appid) {
465 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get appid, ret(%d), pid(%d), appid(%s)", ret, pid, appid);;
470 return TTS_ERROR_OPERATION_FAILED;
473 ret = tts_core_set_private_data(client, key, appid);
475 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to set private data, ret(%d), pid(%d), appid(%s)", ret, pid, appid);
484 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
485 return TTS_ERROR_NONE;
488 int tts_prepare(tts_h tts)
490 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
492 tts_client_s* client = tts_client_get(tts);
493 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
495 tts_state_e current_state = tts_client_get_current_state(client);
496 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
498 SLOG(LOG_INFO, TAG_TTSC, "@@@ Prepare TTS");
499 int ret = tts_core_prepare(client);
501 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] tts_core_prepare failed. (%s)", tts_core_covert_error_code(ret));
505 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
506 return TTS_ERROR_NONE;
509 int tts_prepare_sync(tts_h tts)
511 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
513 tts_client_s* client = tts_client_get(tts);
514 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
516 tts_state_e current_state = tts_client_get_current_state(client);
517 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
519 SLOG(LOG_INFO, TAG_TTSC, "@@@ Prepare TTS synchronously");
520 int ret = tts_core_prepare_sync(client);
521 if (TTS_ERROR_NONE != ret) {
522 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] tts_core_prepare_sync failed. (%s)", tts_core_covert_error_code(ret));
526 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
527 return TTS_ERROR_NONE;
530 int tts_unprepare(tts_h tts)
532 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
534 tts_client_s* client = tts_client_get(tts);
535 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
537 tts_state_e current_state = tts_client_get_current_state(client);
538 RETVM_IF(TTS_STATE_READY != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
540 SLOG(LOG_INFO, TAG_TTSC, "@@@ Unprepare TTS");
541 int ret = tts_core_unprepare(client);
543 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] tts_core_unprepare is failed(%s)", tts_core_covert_error_code(ret));
547 tts_core_notify_state_changed(client, TTS_STATE_CREATED);
549 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
550 return TTS_ERROR_NONE;
553 int tts_foreach_supported_voices(tts_h tts, tts_supported_voice_cb callback, void* user_data)
555 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
557 SLOG(LOG_INFO, TAG_TTSC, "@@@ Foreach supported voices");
559 RETVM_IF(NULL == callback, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input parameter is null");
561 tts_client_s* client = tts_client_get(tts);
562 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
565 char* current_engine = NULL;
566 ret = tts_config_mgr_get_engine(¤t_engine);
567 if (0 != ret || NULL == current_engine) {
568 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get current engine : %d", ret);
569 return __tts_convert_config_error_code(ret);
572 ret = tts_core_foreach_supported_voices(client, current_engine, callback, user_data);
573 free(current_engine);
576 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
580 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
581 return TTS_ERROR_NONE;
584 int tts_get_default_voice(tts_h tts, char** lang, int* vctype)
586 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
588 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Get default voice");
590 RETVM_IF(NULL == lang || NULL == vctype, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid");
592 tts_client_s* client = tts_client_get(tts);
593 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
595 /* Request call remote method */
597 ret = tts_config_mgr_get_voice(lang, vctype);
599 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
600 return __tts_convert_config_error_code(ret);
603 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] Default language(%s), type(%d)", *lang, *vctype);
604 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
605 return TTS_ERROR_NONE;
608 int tts_get_max_text_size(tts_h tts, unsigned int* size)
610 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
612 RETVM_IF(NULL == size, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Get max text count : Input parameter is null");
614 tts_client_s* client = tts_client_get(tts);
615 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
617 tts_state_e current_state = tts_client_get_current_state(client);
618 RETVM_IF(TTS_STATE_READY != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
620 if (0 != tts_config_mgr_get_max_text_size(size)) {
621 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get max text size");
622 return TTS_ERROR_OPERATION_FAILED;
625 SLOG(LOG_INFO, TAG_TTSC, "Get max text size : %d byte", *size);
626 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
627 return TTS_ERROR_NONE;
630 int tts_get_state(tts_h tts, tts_state_e* state)
632 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
634 RETVM_IF(NULL == state, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Get state : Input parameter is null");
636 tts_client_s* client = tts_client_get(tts);
637 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
639 tts_state_e current_state = tts_client_get_current_state(client);
640 switch (current_state) {
641 case TTS_STATE_CREATED: SLOG(LOG_INFO, TAG_TTSC, "Current state is 'Created'"); break;
642 case TTS_STATE_READY: SLOG(LOG_INFO, TAG_TTSC, "Current state is 'Ready'"); break;
643 case TTS_STATE_PLAYING: SLOG(LOG_INFO, TAG_TTSC, "Current state is 'Playing'"); break;
644 case TTS_STATE_PAUSED: SLOG(LOG_INFO, TAG_TTSC, "Current state is 'Paused'"); break;
646 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Client is not valid");
647 return TTS_ERROR_INVALID_PARAMETER;
650 *state = current_state;
651 return TTS_ERROR_NONE;
654 int tts_get_speed_range(tts_h tts, int* min, int* normal, int* max)
656 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
658 RETVM_IF(NULL == min || NULL == normal || NULL == max, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input parameter is null");
660 tts_client_s* client = tts_client_get(tts);
661 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
663 *min = TTS_SPEED_MIN;
664 *normal = TTS_SPEED_NORMAL;
665 *max = TTS_SPEED_MAX;
667 return TTS_ERROR_NONE;
670 int tts_get_error_message(tts_h tts, char** err_msg)
672 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
674 RETVM_IF(NULL == err_msg, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input parameter is null");
676 tts_client_s* client = tts_client_get(tts);
677 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
679 const char* error_message = tts_client_get_error_message(client);
680 if (NULL != error_message) {
681 *err_msg = strdup(error_message);
682 SLOG(LOG_DEBUG, TAG_TTSC, "Error msg (%s)", error_message);
685 SLOG(LOG_DEBUG, TAG_TTSC, "Error msg (NULL)");
688 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
689 return TTS_ERROR_NONE;
692 int tts_check_screen_reader_on(tts_h tts, bool* is_on)
694 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
696 RETVM_IF(NULL == is_on, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input parameter is null");
698 tts_client_s* client = tts_client_get(tts);
699 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
701 if (false == tts_core_check_screen_reader(client)) {
702 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is not available");
705 SLOG(LOG_INFO, TAG_TTSC, "[INFO] Screen reader option is available");
709 return TTS_ERROR_NONE;
712 int tts_get_service_state(tts_h tts, tts_service_state_e* service_state)
714 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
716 RETVM_IF(NULL == service_state, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Get service state : Input parameter is null");
718 tts_client_s* client = tts_client_get(tts);
719 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
721 tts_state_e current_state = tts_client_get_current_state(client);
722 RETVM_IF(TTS_STATE_CREATED == current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
724 // TODO: Implement business logic
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 RETVM_IF(false == tts_core_check_screen_reader(client), TTS_ERROR_SCREEN_READER_OFF, "[ERROR] Screen reader option is not available");
879 int ret = tts_core_stop(client);
880 if (TTS_ERROR_NONE != ret) {
881 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request stop. ret(%s)", tts_core_covert_error_code(ret));
885 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
886 return TTS_ERROR_NONE;
890 static void __tts_pause_async(void *data)
892 tts_h tts = (tts_h)data;
894 tts_client_s* client = tts_client_get(tts);
895 RETM_IF(NULL == client, "[ERROR] A handle is not valid. tts(%p)", tts);
897 int ret = tts_core_pause(client);
899 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to pause tts : %s", tts_core_covert_error_code(ret));
900 tts_core_notify_error_async(client, ret, -1, NULL);
904 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
908 int tts_pause_async(tts_h tts)
910 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
912 SLOG(LOG_DEBUG, TAG_TTSC, "@@@ Pause asynchronously tts");
914 tts_client_s* client = tts_client_get(tts);
915 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
917 tts_state_e current_state = tts_client_get_current_state(client);
918 RETVM_IF(TTS_STATE_PLAYING != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
920 RETVM_IF(false == tts_core_check_screen_reader(client), TTS_ERROR_SCREEN_READER_OFF, "[ERROR] Screen reader option is not available");
922 ecore_main_loop_thread_safe_call_async(__tts_pause_async, (void*)tts);
924 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
925 return TTS_ERROR_NONE;
928 int tts_pause(tts_h tts)
930 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
932 SLOG(LOG_INFO, TAG_TTSC, "@@@ Pause tts");
934 tts_client_s* client = tts_client_get(tts);
935 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
937 tts_state_e current_state = tts_client_get_current_state(client);
938 RETVM_IF(TTS_STATE_PLAYING != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
940 RETVM_IF(false == tts_core_check_screen_reader(client), TTS_ERROR_SCREEN_READER_OFF, "[ERROR] Screen reader option is not available");
942 int ret = tts_core_pause(client);
943 if (TTS_ERROR_NONE != ret) {
944 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request pause. ret(%s)", tts_core_covert_error_code(ret));
948 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
949 return TTS_ERROR_NONE;
952 int tts_set_private_data(tts_h tts, const char* key, const char* data)
954 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
956 SLOG(LOG_INFO, TAG_TTSC, "@@@ Set private data, key(%s), data(%s)", key, data);
958 RETVM_IF(NULL == key || NULL == data, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Invalid parameter");
960 tts_client_s* client = tts_client_get(tts);
961 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
963 tts_state_e current_state = tts_client_get_current_state(client);
964 RETVM_IF(TTS_STATE_READY != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
966 if (true != client->internal && (0 == strcmp(key, "EnableServerTTS") || 0 == strcmp(key, "DisableServerTTS"))) {
967 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] This is not an internal app");
968 return TTS_ERROR_INVALID_PARAMETER;
971 int ret = tts_core_set_private_data(client, key, data);
972 if (TTS_ERROR_NONE != ret) {
973 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request set private data. ret(%s)", tts_core_covert_error_code(ret));
977 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
981 int tts_get_private_data(tts_h tts, const char* key, char** data)
983 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
985 SLOG(LOG_INFO, TAG_TTSC, "@@@ Get private data, key(%s)", key);
987 RETVM_IF(NULL == key || NULL == data, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Invalid parameter");
989 tts_client_s* client = tts_client_get(tts);
990 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
992 tts_state_e current_state = tts_client_get_current_state(client);
993 RETVM_IF(TTS_STATE_READY != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
995 int ret = tts_core_get_private_data(client, key, data);
996 if (TTS_ERROR_NONE != ret) {
997 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request get private data. ret(%s)", tts_core_covert_error_code(ret));
1001 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1005 int tts_set_state_changed_cb(tts_h tts, tts_state_changed_cb callback, void* user_data)
1007 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1009 tts_client_s* client = tts_client_get(tts);
1010 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1012 RETVM_IF(NULL == callback, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Set state changed cb : Input parameter is null");
1014 tts_state_e current_state = tts_client_get_current_state(client);
1015 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1017 tts_client_set_state_changed_cb(client, callback, user_data);
1019 SLOG(LOG_INFO, TAG_TTSC, "[SUCCESS] Set state changed cb");
1023 int tts_unset_state_changed_cb(tts_h tts)
1025 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1027 tts_client_s* client = tts_client_get(tts);
1028 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1030 tts_state_e current_state = tts_client_get_current_state(client);
1031 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1033 tts_client_set_state_changed_cb(client, NULL, NULL);
1035 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset state changed cb");
1039 int tts_set_utterance_started_cb(tts_h tts, tts_utterance_started_cb callback, void* user_data)
1041 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1043 tts_client_s* client = tts_client_get(tts);
1044 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1046 RETVM_IF(NULL == callback, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Set utt started cb : Input parameter is null");
1048 tts_state_e current_state = tts_client_get_current_state(client);
1049 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1051 tts_client_set_utterance_started_cb(client, callback, user_data);
1053 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt started cb");
1058 int tts_unset_utterance_started_cb(tts_h tts)
1060 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1062 tts_client_s* client = tts_client_get(tts);
1063 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1065 tts_state_e current_state = tts_client_get_current_state(client);
1066 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1068 tts_client_set_utterance_started_cb(client, NULL, NULL);
1070 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt started cb");
1075 int tts_set_utterance_completed_cb(tts_h tts, tts_utterance_completed_cb callback, void* user_data)
1077 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1079 tts_client_s* client = tts_client_get(tts);
1080 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1082 RETVM_IF(NULL == callback, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Set utt completed cb : Input parameter is null");
1084 tts_state_e current_state = tts_client_get_current_state(client);
1085 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1087 tts_client_set_utterance_completed_cb(client, callback, user_data);
1089 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt completed cb");
1094 int tts_unset_utterance_completed_cb(tts_h tts)
1096 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1098 tts_client_s* client = tts_client_get(tts);
1099 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1101 tts_state_e current_state = tts_client_get_current_state(client);
1102 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1104 tts_client_set_utterance_completed_cb(client, NULL, NULL);
1106 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt completed cb");
1110 int tts_set_error_cb(tts_h tts, tts_error_cb callback, void* user_data)
1112 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1114 tts_client_s* client = tts_client_get(tts);
1115 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1117 RETVM_IF(NULL == callback, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Set error cb : Input parameter is null");
1119 tts_state_e current_state = tts_client_get_current_state(client);
1120 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1122 tts_client_set_error_cb(client, callback, user_data);
1124 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set error cb");
1129 int tts_unset_error_cb(tts_h tts)
1131 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1133 tts_client_s* client = tts_client_get(tts);
1134 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1136 tts_state_e current_state = tts_client_get_current_state(client);
1137 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1139 tts_client_set_error_cb(client, NULL, NULL);
1141 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset error cb");
1146 int tts_set_default_voice_changed_cb(tts_h tts, tts_default_voice_changed_cb callback, void* user_data)
1148 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1150 tts_client_s* client = tts_client_get(tts);
1151 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1153 RETVM_IF(NULL == callback, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Set default voice changed cb : Input parameter is null");
1155 tts_state_e current_state = tts_client_get_current_state(client);
1156 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1158 tts_client_set_default_voice_changed_cb(client, callback, user_data);
1160 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set default voice changed cb");
1165 int tts_unset_default_voice_changed_cb(tts_h tts)
1167 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1169 tts_client_s* client = tts_client_get(tts);
1170 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1172 tts_state_e current_state = tts_client_get_current_state(client);
1173 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1175 tts_client_set_default_voice_changed_cb(client, NULL, NULL);
1177 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset default voice changed cb");
1182 int tts_set_engine_changed_cb(tts_h tts, tts_engine_changed_cb callback, void* user_data)
1184 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1186 tts_client_s* client = tts_client_get(tts);
1187 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1189 RETVM_IF(NULL == callback, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Set engine changed cb : Input parameter is null");
1191 tts_state_e current_state = tts_client_get_current_state(client);
1192 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1194 tts_client_set_engine_changed_cb(client, callback, user_data);
1196 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set engine changed cb");
1201 int tts_unset_engine_changed_cb(tts_h tts)
1203 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1205 tts_client_s* client = tts_client_get(tts);
1206 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1208 tts_state_e current_state = tts_client_get_current_state(client);
1209 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1211 tts_client_set_engine_changed_cb(client, NULL, NULL);
1213 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset engine changed cb");
1218 int tts_set_screen_reader_changed_cb(tts_h tts, tts_screen_reader_changed_cb callback, void* user_data)
1220 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1222 tts_client_s* client = tts_client_get(tts);
1223 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1225 RETVM_IF(NULL == callback, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Set screen reader changed cb : Input parameter is null");
1227 tts_state_e current_state = tts_client_get_current_state(client);
1228 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1230 tts_client_set_screen_reader_changed_cb(client, callback, user_data);
1232 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set screen reader changed cb");
1237 int tts_unset_screen_reader_changed_cb(tts_h tts)
1239 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1241 tts_client_s* client = tts_client_get(tts);
1242 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1244 tts_state_e current_state = tts_client_get_current_state(client);
1245 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1247 tts_client_set_screen_reader_changed_cb(client, NULL, NULL);
1249 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset screen reader changed cb");
1254 int tts_add_pcm(tts_h tts, int event, const void* data, unsigned int data_size, int audio_type, int rate)
1256 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1258 SLOG(LOG_INFO, TAG_TTSC, "@@@ Add pcm tts");
1260 tts_client_s* client = tts_client_get(tts);
1261 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1263 tts_state_e current_state = tts_client_get_current_state(client);
1264 RETVM_IF(TTS_STATE_CREATED == current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1266 RETVM_IF(false == tts_core_check_screen_reader(client), TTS_ERROR_SCREEN_READER_OFF, "[ERROR] Screen reader option is not available");
1268 int ret = tts_core_add_pcm(client, event, data, data_size, audio_type, rate);
1269 if (TTS_ERROR_NONE != ret) {
1270 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request add_pcm. ret(%s)", tts_core_covert_error_code(ret));
1274 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1275 return TTS_ERROR_NONE;
1278 int tts_play_pcm(tts_h tts)
1280 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1282 SLOG(LOG_INFO, TAG_TTSC, "@@@ Play pcm tts");
1284 tts_client_s* client = tts_client_get(tts);
1285 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1287 tts_state_e current_state = tts_client_get_current_state(client);
1288 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);
1290 RETVM_IF(false == tts_core_check_screen_reader(client), TTS_ERROR_SCREEN_READER_OFF, "[ERROR] Screen reader option is not available");
1292 int ret = tts_core_play_pcm(client);
1293 if (TTS_ERROR_NONE != ret) {
1294 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request play_pcm. ret(%s)", tts_core_covert_error_code(ret));
1298 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1299 return TTS_ERROR_NONE;
1302 int tts_stop_pcm(tts_h tts)
1304 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1306 SLOG(LOG_INFO, TAG_TTSC, "@@@ Stop pcm tts");
1308 tts_client_s* client = tts_client_get(tts);
1309 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1311 tts_state_e current_state = tts_client_get_current_state(client);
1312 RETVM_IF(TTS_STATE_CREATED == current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1314 RETVM_IF(false == tts_core_check_screen_reader(client), TTS_ERROR_SCREEN_READER_OFF, "[ERROR] Screen reader option is not available");
1316 int ret = tts_core_stop_pcm(client);
1317 if (TTS_ERROR_NONE != ret) {
1318 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request stop_pcm. ret(%s)", tts_core_covert_error_code(ret));
1322 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1323 return TTS_ERROR_NONE;
1326 int tts_repeat(tts_h tts, char** text_repeat, int* utt_id)
1328 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1330 SLOG(LOG_INFO, TAG_TTSC, "@@@ Repeat TTS");
1332 RETVM_IF(NULL == text_repeat || NULL == utt_id, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Input parameter is null.");
1334 tts_client_s* client = tts_client_get(tts);
1335 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1337 tts_state_e current_state = tts_client_get_current_state(client);
1338 RETVM_IF(TTS_STATE_READY != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1340 RETVM_IF(false == tts_core_check_screen_reader(client), TTS_ERROR_SCREEN_READER_OFF, "[ERROR] Screen reader option is not available");
1342 if (true == client->credential_needed && NULL == client->credential) {
1343 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Do not have app credential for this engine");
1344 return TTS_ERROR_PERMISSION_DENIED;
1347 *text_repeat = NULL;
1350 int ret = tts_core_repeat(client, text_repeat, utt_id);
1351 if (TTS_ERROR_NONE != ret) {
1352 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request stop. ret(%s)", tts_core_covert_error_code(ret));
1356 SLOG(LOG_DEBUG, TAG_TTSC, "@@@");
1357 return TTS_ERROR_NONE;
1360 int tts_set_service_state_changed_cb(tts_h tts, tts_service_state_changed_cb callback, void* user_data)
1362 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1364 tts_client_s* client = tts_client_get(tts);
1365 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1366 RETVM_IF(NULL == callback, TTS_ERROR_INVALID_PARAMETER, "[ERROR] Set service state changed cb : Input parameter is null");
1368 tts_state_e current_state = tts_client_get_current_state(client);
1369 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1371 // TODO: Implement business logic
1373 SLOG(LOG_INFO, TAG_TTSC, "[SUCCESS] Set service state changed cb");
1374 return TTS_ERROR_NONE;
1377 int tts_unset_service_state_changed_cb(tts_h tts)
1379 RETV_IF(TTS_ERROR_NONE != __tts_get_feature_enabled(), TTS_ERROR_NOT_SUPPORTED);
1381 tts_client_s* client = tts_client_get(tts);
1382 RETVM_IF(NULL == client, TTS_ERROR_INVALID_PARAMETER, "[ERROR] A handle is not valid. tts(%p)", tts);
1384 tts_state_e current_state = tts_client_get_current_state(client);
1385 RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
1387 // TODO: Implement business logic
1389 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset service state changed cb");
1390 return TTS_ERROR_NONE;