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>
25 #include "tts_client.h"
26 #include "tts_config_mgr.h"
31 static bool g_screen_reader;
33 static int g_feature_enabled = -1;
35 static bool g_err_callback_status = false;
37 /* Function definition */
38 static Eina_Bool __tts_notify_state_changed(void *data);
39 static Eina_Bool __tts_notify_error(void *data);
46 static int __tts_get_feature_enabled()
48 if (0 == g_feature_enabled) {
49 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS feature NOT supported");
50 return TTS_ERROR_NOT_SUPPORTED;
51 } else if (-1 == g_feature_enabled) {
52 bool tts_supported = false;
53 if (0 == system_info_get_platform_bool(TTS_FEATURE_PATH, &tts_supported)) {
54 if (false == tts_supported) {
55 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] TTS feature NOT supported");
56 g_feature_enabled = 0;
57 return TTS_ERROR_NOT_SUPPORTED;
60 g_feature_enabled = 1;
62 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get feature value");
63 return TTS_ERROR_NOT_SUPPORTED;
70 static const char* __tts_get_error_code(tts_error_e err)
73 case TTS_ERROR_NONE: return "TTS_ERROR_NONE";
74 case TTS_ERROR_OUT_OF_MEMORY: return "TTS_ERROR_OUT_OF_MEMORY";
75 case TTS_ERROR_IO_ERROR: return "TTS_ERROR_IO_ERROR";
76 case TTS_ERROR_INVALID_PARAMETER: return "TTS_ERROR_INVALID_PARAMETER";
77 case TTS_ERROR_OUT_OF_NETWORK: return "TTS_ERROR_OUT_OF_NETWORK";
78 case TTS_ERROR_TIMED_OUT: return "TTS_ERROR_TIMED_OUT";
79 case TTS_ERROR_PERMISSION_DENIED: return "TTS_ERROR_PERMISSION_DENIED";
80 case TTS_ERROR_NOT_SUPPORTED: return "TTS_ERROR_NOT_SUPPORTED";
81 case TTS_ERROR_INVALID_STATE: return "TTS_ERROR_INVALID_STATE";
82 case TTS_ERROR_INVALID_VOICE: return "TTS_ERROR_INVALID_VOICE";
83 case TTS_ERROR_ENGINE_NOT_FOUND: return "TTS_ERROR_ENGINE_NOT_FOUND";
84 case TTS_ERROR_OPERATION_FAILED: return "TTS_ERROR_OPERATION_FAILED";
85 case TTS_ERROR_AUDIO_POLICY_BLOCKED: return "TTS_ERROR_AUDIO_POLICY_BLOCKED";
86 case TTS_ERROR_NOT_SUPPORTED_FEATURE: return "TTS_ERROR_NOT_SUPPORTED_FEATURE";
87 case TTS_ERROR_SERVICE_RESET: return "TTS_ERROR_SERVICE_RESET";
89 return "Invalid error code";
94 static int __tts_convert_config_error_code(tts_config_error_e code)
96 if (code == TTS_CONFIG_ERROR_NONE) return TTS_ERROR_NONE;
97 if (code == TTS_CONFIG_ERROR_OUT_OF_MEMORY) return TTS_ERROR_OUT_OF_MEMORY;
98 if (code == TTS_CONFIG_ERROR_IO_ERROR) return TTS_ERROR_IO_ERROR;
99 if (code == TTS_CONFIG_ERROR_INVALID_PARAMETER) return TTS_ERROR_INVALID_PARAMETER;
100 if (code == TTS_CONFIG_ERROR_INVALID_STATE) return TTS_ERROR_INVALID_STATE;
101 if (code == TTS_CONFIG_ERROR_INVALID_VOICE) return TTS_ERROR_INVALID_VOICE;
102 if (code == TTS_CONFIG_ERROR_ENGINE_NOT_FOUND) return TTS_ERROR_ENGINE_NOT_FOUND;
103 if (code == TTS_CONFIG_ERROR_OPERATION_FAILED) return TTS_ERROR_OPERATION_FAILED;
104 if (code == TTS_CONFIG_ERROR_NOT_SUPPORTED_FEATURE) return TTS_ERROR_NOT_SUPPORTED_FEATURE;
109 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)
111 SLOG(LOG_DEBUG, TAG_TTSC, "Voice changed : Before lang(%s) type(%d) , Current lang(%s), type(%d)",
112 before_lang, before_voice_type, language, voice_type);
114 GList* client_list = NULL;
115 client_list = tts_client_get_client_list();
118 tts_client_s *data = NULL;
120 if (g_list_length(client_list) > 0) {
121 /* Get a first item */
122 iter = g_list_first(client_list);
124 while (NULL != iter) {
126 if (NULL != data->default_voice_changed_cb) {
127 SLOG(LOG_DEBUG, TAG_TTSC, "Call default voice changed callback : uid(%d)", data->uid);
128 data->default_voice_changed_cb(data->tts, before_lang, before_voice_type,
129 language, voice_type, data->default_voice_changed_user_data);
133 iter = g_list_next(iter);
140 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)
142 tts_h tts = (tts_h)user_data;
144 tts_client_s* client = tts_client_get(tts);
145 if (NULL == client) {
146 SLOG(LOG_ERROR, TAG_TTSC, "[WARNING] A handle is not valid");
150 if (NULL != engine_id) SLOG(LOG_DEBUG, TAG_TTSC, "Engine id(%s)", engine_id);
151 if (NULL != setting) SLOG(LOG_DEBUG, TAG_TTSC, "Engine setting(%s)", setting);
152 if (NULL != language) SLOG(LOG_DEBUG, TAG_TTSC, "Language(%s)", language);
153 SLOG(LOG_DEBUG, TAG_TTSC, "Voice type(%d), Auto voice(%s), Credential(%s)", voice_type, auto_voice ? "on" : "off", need_credential ? "need" : "no need");
155 /* When the default engine is changed, please unload the old engine and load the new one. */
158 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_PAUSED == client->current_state) {
161 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] TTS client stopping...");
163 ret = tts_unprepare(tts);
165 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to unprepare for setting a new engine... (%d)", ret);
167 ret = tts_prepare(tts);
169 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare for setting a new engine... (%d)", ret);
171 } else if (TTS_STATE_READY == client->current_state) {
172 ret = tts_unprepare(tts);
174 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to unprepare for setting a new engine... (%d)", ret);
176 ret = tts_prepare(tts);
178 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare for setting a new engine... (%d)", ret);
182 /* call callback function */
183 if (NULL != client->engine_changed_cb) {
184 client->engine_changed_cb(tts, engine_id, language, voice_type, need_credential, client->engine_changed_user_data);
186 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function for changed engine");
191 int tts_create(tts_h* tts)
193 if (0 != __tts_get_feature_enabled()) {
194 return TTS_ERROR_NOT_SUPPORTED;
197 SLOG(LOG_INFO, TAG_TTSC, "===== Create TTS");
201 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
202 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
203 SLOG(LOG_DEBUG, TAG_TTSC, " ");
204 return TTS_ERROR_INVALID_PARAMETER;
207 if (0 == tts_client_get_size()) {
208 if (0 != tts_dbus_open_connection()) {
209 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to open dbus connection");
210 return TTS_ERROR_OPERATION_FAILED;
214 if (0 != tts_client_new(tts)) {
215 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to create client!!!!!");
216 return TTS_ERROR_OUT_OF_MEMORY;
219 tts_client_s* client = tts_client_get(*tts);
220 if (NULL == client) {
221 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get client");
222 return TTS_ERROR_OPERATION_FAILED;
225 int ret = tts_config_mgr_initialize(client->uid);
227 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to init config manager : %d", ret);
228 tts_client_destroy(*tts);
229 return __tts_convert_config_error_code(ret);
232 ret = tts_config_mgr_set_callback(client->uid, _tts_config_engine_changed_cb, __tts_config_voice_changed_cb, NULL, NULL, NULL);
234 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to set config changed : %d", ret);
235 tts_client_destroy(*tts);
236 return __tts_convert_config_error_code(ret);
239 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
240 SLOG(LOG_DEBUG, TAG_TTSC, " ");
242 return TTS_ERROR_NONE;
245 int tts_destroy(tts_h tts)
247 if (0 != __tts_get_feature_enabled()) {
248 return TTS_ERROR_NOT_SUPPORTED;
251 SLOG(LOG_INFO, TAG_TTSC, "===== Destroy TTS");
254 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
255 return TTS_ERROR_INVALID_PARAMETER;
258 tts_client_s* client = tts_client_get(tts);
261 if (NULL == client) {
262 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
263 return TTS_ERROR_INVALID_PARAMETER;
266 /* check used callback */
267 if (0 != tts_client_get_use_callback(client)) {
268 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Cannot destroy in Callback function");
269 return TTS_ERROR_OPERATION_FAILED;
272 tts_config_mgr_finalize(client->uid);
278 switch (client->current_state) {
279 case TTS_STATE_PAUSED:
280 case TTS_STATE_PLAYING:
281 case TTS_STATE_READY:
282 if (!(false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode)) {
284 ret = tts_dbus_request_finalize(client->uid);
286 if (TTS_ERROR_TIMED_OUT != ret) {
287 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
290 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry finalize");
293 if (TTS_RETRY_COUNT == count) {
294 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
301 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Do not request finalize : g_sr(%d) mode(%d)", g_screen_reader, client->mode);
304 client->before_state = client->current_state;
305 client->current_state = TTS_STATE_CREATED;
307 case TTS_STATE_CREATED:
308 if (NULL != client->conn_timer) {
309 SLOG(LOG_DEBUG, TAG_TTSC, "Connect Timer is deleted");
310 ecore_timer_del(client->conn_timer);
311 client->conn_timer = NULL;
314 tts_client_destroy(tts);
321 if (0 == tts_client_get_size()) {
322 if (0 != tts_dbus_close_connection()) {
323 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to close connection");
329 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
330 SLOG(LOG_DEBUG, TAG_TTSC, " ");
332 return TTS_ERROR_NONE;
335 void __tts_screen_reader_changed_cb(bool value)
337 g_screen_reader = value;
340 int tts_set_mode(tts_h tts, tts_mode_e mode)
342 if (0 != __tts_get_feature_enabled()) {
343 return TTS_ERROR_NOT_SUPPORTED;
346 SLOG(LOG_INFO, TAG_TTSC, "===== Set TTS mode(%d)", mode);
348 tts_client_s* client = tts_client_get(tts);
351 if (NULL == client) {
352 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
353 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
354 SLOG(LOG_DEBUG, TAG_TTSC, " ");
355 return TTS_ERROR_INVALID_PARAMETER;
359 if (client->current_state != TTS_STATE_CREATED) {
360 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
361 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
362 SLOG(LOG_DEBUG, TAG_TTSC, " ");
363 return TTS_ERROR_INVALID_STATE;
366 if (TTS_MODE_DEFAULT <= mode && mode <= TTS_MODE_SCREEN_READER) {
369 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] mode is not valid : %d", mode);
370 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
371 SLOG(LOG_DEBUG, TAG_TTSC, " ");
372 return TTS_ERROR_INVALID_PARAMETER;
375 if (TTS_MODE_SCREEN_READER == mode) {
378 ret = vconf_get_bool(TTS_ACCESSIBILITY_KEY, &screen_reader);
380 SLOG(LOG_ERROR, tts_tag(), "[Config ERROR] Fail to get screen reader");
381 return TTS_ERROR_OPERATION_FAILED;
383 g_screen_reader = (bool)screen_reader;
384 tts_config_set_screen_reader_callback(client->uid, __tts_screen_reader_changed_cb);
386 tts_config_unset_screen_reader_callback(client->uid);
389 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
390 SLOG(LOG_DEBUG, TAG_TTSC, " ");
392 return TTS_ERROR_NONE;
395 int tts_get_mode(tts_h tts, tts_mode_e* mode)
397 if (0 != __tts_get_feature_enabled()) {
398 return TTS_ERROR_NOT_SUPPORTED;
401 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get TTS mode");
403 tts_client_s* client = tts_client_get(tts);
406 if (NULL == client) {
407 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
408 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
409 SLOG(LOG_DEBUG, TAG_TTSC, " ");
410 return TTS_ERROR_INVALID_PARAMETER;
414 if (client->current_state != TTS_STATE_CREATED) {
415 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
416 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
417 SLOG(LOG_DEBUG, TAG_TTSC, " ");
418 return TTS_ERROR_INVALID_STATE;
422 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter(mode) is NULL");
423 return TTS_ERROR_INVALID_PARAMETER;
426 *mode = client->mode;
428 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
429 SLOG(LOG_DEBUG, TAG_TTSC, " ");
431 return TTS_ERROR_NONE;
434 int tts_set_credential(tts_h tts, const char* credential)
436 if (0 != __tts_get_feature_enabled()) {
437 return TTS_ERROR_NOT_SUPPORTED;
440 if (NULL == tts || NULL == credential) {
441 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
442 return TTS_ERROR_INVALID_PARAMETER;
445 tts_client_s* client = tts_client_get(tts);
447 if (NULL == client) {
448 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
449 return TTS_ERROR_INVALID_PARAMETER;
452 if (TTS_STATE_CREATED != client->current_state && TTS_STATE_READY != client->current_state) {
453 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid (%d).", client->current_state);
454 return TTS_ERROR_INVALID_STATE;
457 if (NULL != client->credential) {
458 free(client->credential);
459 client->credential = NULL;
461 client->credential = strdup(credential);
463 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
464 SLOG(LOG_DEBUG, TAG_TTSC, " ");
466 return TTS_ERROR_NONE;
469 int tts_set_server_tts(tts_h tts, const char* credential)
471 if (0 != __tts_get_feature_enabled()) {
472 return TTS_ERROR_NOT_SUPPORTED;
476 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
477 return TTS_ERROR_INVALID_PARAMETER;
480 tts_client_s* client = tts_client_get(tts);
482 if (NULL == client) {
483 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
484 return TTS_ERROR_INVALID_PARAMETER;
487 if (TTS_STATE_CREATED != client->current_state && TTS_STATE_READY != client->current_state) {
488 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid (%d).", client->current_state);
489 return TTS_ERROR_INVALID_STATE;
492 if (NULL != client->credential) {
493 free(client->credential);
494 client->credential = NULL;
497 client->internal = true;
500 if (NULL != credential) {
501 key = strdup("EnableServerTTS");
502 client->credential = strdup(credential);
503 if (NULL == client->credential) {
504 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to allocate memory");
505 return TTS_ERROR_OUT_OF_MEMORY;
508 key = strdup("DisableServerTTS");
512 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to allocate memory");
513 return TTS_ERROR_OUT_OF_MEMORY;
518 int ret = app_manager_get_app_id(pid, &appid);
520 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get appid, ret(%d), pid(%d), appid(%s)", ret, pid, appid);
523 return TTS_ERROR_OPERATION_FAILED;
526 ret = tts_set_private_data(tts, key, appid);
528 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to set private data, ret(%d), pid(%d), appid(%s)", ret, pid, appid);
539 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
540 SLOG(LOG_DEBUG, TAG_TTSC, " ");
542 return TTS_ERROR_NONE;
545 static Eina_Bool __tts_connect_daemon(void *data)
547 tts_h tts = (tts_h)data;
548 tts_client_s* client = tts_client_get(tts);
551 if (NULL == client) {
552 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
557 if (0 != tts_dbus_request_hello(client->uid)) {
561 SLOG(LOG_INFO, TAG_TTSC, "===== Connect daemon");
563 /* do request initialize */
565 bool credential_needed = false;
567 ret = tts_dbus_request_initialize(client->uid, &credential_needed);
569 if (TTS_ERROR_ENGINE_NOT_FOUND == ret) {
570 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to initialize : %s", __tts_get_error_code(ret));
572 client->reason = TTS_ERROR_ENGINE_NOT_FOUND;
575 ecore_timer_add(0, __tts_notify_error, (void*)client->tts);
576 client->conn_timer = NULL;
579 } else if (TTS_ERROR_NONE != ret) {
580 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Fail to connection. Retry to connect : %s", __tts_get_error_code(ret));
584 /* success to connect tts-daemon */
585 client->credential_needed = credential_needed;
586 SLOG(LOG_ERROR, TAG_TTSC, "Supported options : credential(%s)", credential_needed ? "need" : "no need");
589 client->conn_timer = NULL;
591 client = tts_client_get(tts);
593 if (NULL == client) {
594 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
598 client->before_state = client->current_state;
599 client->current_state = TTS_STATE_READY;
601 if (NULL != client->state_changed_cb) {
602 tts_client_use_callback(client);
603 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
604 tts_client_not_use_callback(client);
606 SLOG(LOG_WARN, TAG_TTSC, "State changed callback is NULL");
609 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
610 SLOG(LOG_DEBUG, TAG_TTSC, " ");
615 int tts_prepare(tts_h tts)
617 if (0 != __tts_get_feature_enabled()) {
618 return TTS_ERROR_NOT_SUPPORTED;
621 SLOG(LOG_INFO, TAG_TTSC, "===== Prepare TTS");
623 tts_client_s* client = tts_client_get(tts);
626 if (NULL == client) {
627 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
628 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
629 SLOG(LOG_DEBUG, TAG_TTSC, " ");
630 return TTS_ERROR_INVALID_PARAMETER;
634 if (client->current_state != TTS_STATE_CREATED) {
635 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'CREATED'");
636 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
637 SLOG(LOG_DEBUG, TAG_TTSC, " ");
638 return TTS_ERROR_INVALID_STATE;
641 client->conn_timer = ecore_timer_add(0, __tts_connect_daemon, (void*)tts);
643 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
644 SLOG(LOG_DEBUG, TAG_TTSC, " ");
646 return TTS_ERROR_NONE;
649 int tts_unprepare(tts_h tts)
651 if (0 != __tts_get_feature_enabled()) {
652 return TTS_ERROR_NOT_SUPPORTED;
655 SLOG(LOG_INFO, TAG_TTSC, "===== Unprepare TTS");
657 tts_client_s* client = tts_client_get(tts);
660 if (NULL == client) {
661 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not available");
662 return TTS_ERROR_INVALID_PARAMETER;
666 if (client->current_state != TTS_STATE_READY) {
667 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid State: Current state is not 'READY'");
668 return TTS_ERROR_INVALID_STATE;
673 if (!(false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode)) {
675 ret = tts_dbus_request_finalize(client->uid);
677 if (TTS_ERROR_TIMED_OUT != ret) {
678 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
681 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry finalize : %s", __tts_get_error_code(ret));
684 if (TTS_RETRY_COUNT == count) {
685 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
692 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Do not request finalize : g_sr(%d) mode(%d)", g_screen_reader, client->mode);
695 client->before_state = client->current_state;
696 client->current_state = TTS_STATE_CREATED;
698 if (NULL != client->state_changed_cb) {
699 tts_client_use_callback(client);
700 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
701 tts_client_not_use_callback(client);
702 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
705 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
706 SLOG(LOG_DEBUG, TAG_TTSC, " ");
708 return TTS_ERROR_NONE;
711 bool __tts_supported_voice_cb(const char* engine_id, const char* language, int type, void* user_data)
713 tts_h tts = (tts_h)user_data;
715 tts_client_s* client = tts_client_get(tts);
716 if (NULL == client) {
717 SLOG(LOG_ERROR, TAG_TTSC, "[WARNING] A handle is not valid");
721 /* call callback function */
722 if (NULL != client->supported_voice_cb) {
723 return client->supported_voice_cb(tts, language, type, client->supported_voice_user_data);
725 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of supported voice");
731 int tts_foreach_supported_voices(tts_h tts, tts_supported_voice_cb callback, void* user_data)
733 if (0 != __tts_get_feature_enabled()) {
734 return TTS_ERROR_NOT_SUPPORTED;
737 SLOG(LOG_DEBUG, TAG_TTSC, "===== Foreach supported voices");
739 if (NULL == tts || NULL == callback) {
740 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
741 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
742 SLOG(LOG_DEBUG, TAG_TTSC, " ");
743 return TTS_ERROR_INVALID_PARAMETER;
746 tts_client_s* client = tts_client_get(tts);
749 if (NULL == client) {
750 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
751 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
752 SLOG(LOG_DEBUG, TAG_TTSC, " ");
753 return TTS_ERROR_INVALID_PARAMETER;
757 char* current_engine = NULL;
758 ret = tts_config_mgr_get_engine(¤t_engine);
760 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get current engine : %d", ret);
761 return __tts_convert_config_error_code(ret);
764 client->supported_voice_cb = callback;
765 client->supported_voice_user_data = user_data;
767 ret = tts_config_mgr_get_voice_list(current_engine, __tts_supported_voice_cb, client->tts);
769 if (NULL != current_engine) {
770 free(current_engine);
771 current_engine = NULL;
774 client->supported_voice_cb = NULL;
775 client->supported_voice_user_data = NULL;
778 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Result : %d", ret);
779 ret = TTS_ERROR_OPERATION_FAILED;
782 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
783 SLOG(LOG_DEBUG, TAG_TTSC, " ");
788 int tts_get_default_voice(tts_h tts, char** lang, int* vctype)
790 if (0 != __tts_get_feature_enabled()) {
791 return TTS_ERROR_NOT_SUPPORTED;
794 SLOG(LOG_DEBUG, TAG_TTSC, "===== Get default voice");
797 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
798 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
799 SLOG(LOG_DEBUG, TAG_TTSC, " ");
800 return TTS_ERROR_INVALID_PARAMETER;
803 tts_client_s* client = tts_client_get(tts);
805 if (NULL == client) {
806 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
807 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
808 SLOG(LOG_DEBUG, TAG_TTSC, " ");
809 return TTS_ERROR_INVALID_PARAMETER;
812 /* Request call remote method */
814 ret = tts_config_mgr_get_voice(lang, vctype);
816 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %d", ret);
817 return __tts_convert_config_error_code(ret);
819 SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] Default language(%s), type(%d)", *lang, *vctype);
822 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
823 SLOG(LOG_DEBUG, TAG_TTSC, " ");
828 int tts_get_max_text_size(tts_h tts, unsigned int* size)
830 if (0 != __tts_get_feature_enabled()) {
831 return TTS_ERROR_NOT_SUPPORTED;
834 if (NULL == tts || NULL == size) {
835 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Input parameter is null");
836 return TTS_ERROR_INVALID_PARAMETER;
839 tts_client_s* client = tts_client_get(tts);
841 if (NULL == client) {
842 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : A handle is not valid");
843 return TTS_ERROR_INVALID_PARAMETER;
846 if (TTS_STATE_READY != client->current_state) {
847 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get max text count : Current state is NOT 'READY'.");
848 return TTS_ERROR_INVALID_STATE;
851 *size = TTS_MAX_TEXT_SIZE;
853 SLOG(LOG_DEBUG, TAG_TTSC, "Get max text count : %d", *size);
854 return TTS_ERROR_NONE;
857 int tts_get_state(tts_h tts, tts_state_e* state)
859 if (0 != __tts_get_feature_enabled()) {
860 return TTS_ERROR_NOT_SUPPORTED;
863 if (NULL == tts || NULL == state) {
864 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : Input parameter is null");
865 return TTS_ERROR_INVALID_PARAMETER;
868 tts_client_s* client = tts_client_get(tts);
870 if (NULL == client) {
871 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
872 return TTS_ERROR_INVALID_PARAMETER;
875 *state = client->current_state;
878 case TTS_STATE_CREATED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Created'"); break;
879 case TTS_STATE_READY: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Ready'"); break;
880 case TTS_STATE_PLAYING: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Playing'"); break;
881 case TTS_STATE_PAUSED: SLOG(LOG_DEBUG, TAG_TTSC, "Current state is 'Paused'"); break;
882 default: SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid value"); break;
885 return TTS_ERROR_NONE;
888 int tts_get_speed_range(tts_h tts, int* min, int* normal, int* max)
890 if (0 != __tts_get_feature_enabled()) {
891 return TTS_ERROR_NOT_SUPPORTED;
894 if (NULL == tts || NULL == min || NULL == normal || NULL == max) {
895 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
896 return TTS_ERROR_INVALID_PARAMETER;
899 tts_client_s* client = tts_client_get(tts);
901 if (NULL == client) {
902 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
903 return TTS_ERROR_INVALID_PARAMETER;
906 *min = TTS_SPEED_MIN;
907 *normal = TTS_SPEED_NORMAL;
908 *max = TTS_SPEED_MAX;
910 return TTS_ERROR_NONE;
913 int tts_get_error_message(tts_h tts, char** err_msg)
915 if (0 != __tts_get_feature_enabled()) {
916 return TTS_ERROR_NOT_SUPPORTED;
919 if (NULL == tts || NULL == err_msg) {
920 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
921 return TTS_ERROR_INVALID_PARAMETER;
924 tts_client_s* client = tts_client_get(tts);
926 if (NULL == client) {
927 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Get state : A handle is not valid");
928 return TTS_ERROR_INVALID_PARAMETER;
931 if (NULL != client->err_msg) {
932 *err_msg = strdup(client->err_msg);
933 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Error msg (%s)", *err_msg);
936 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Error msg (NULL)");
939 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
940 SLOG(LOG_DEBUG, TAG_TTSC, " ");
942 return TTS_ERROR_NONE;
945 int tts_add_text(tts_h tts, const char* text, const char* language, int voice_type, int speed, int* utt_id)
947 SLOG(LOG_INFO, TAG_TTSC, "[DEBUG] Add text: text(%s), language(%s), type(%d)", (NULL == text) ? "NULL" : text, (NULL == language) ? "NULL" : language, voice_type);
949 if (0 != __tts_get_feature_enabled()) {
950 return TTS_ERROR_NOT_SUPPORTED;
954 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Speed should not be negative(%d)", speed);
955 return TTS_ERROR_INVALID_PARAMETER;
958 if (voice_type < 0) {
959 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Voice type should not be negative(%d)", voice_type);
960 return TTS_ERROR_INVALID_PARAMETER;
963 SLOG(LOG_DEBUG, TAG_TTSC, "===== Add text");
965 if (NULL == tts || NULL == utt_id) {
966 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null");
967 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
968 SLOG(LOG_DEBUG, TAG_TTSC, " ");
969 return TTS_ERROR_INVALID_PARAMETER;
972 tts_client_s* client = tts_client_get(tts);
974 if (NULL == client) {
975 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
976 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
977 SLOG(LOG_DEBUG, TAG_TTSC, " ");
978 return TTS_ERROR_INVALID_PARAMETER;
981 if (TTS_STATE_CREATED == client->current_state) {
982 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
983 return TTS_ERROR_INVALID_STATE;
986 if (TTS_MAX_TEXT_SIZE < strlen(text) || strlen(text) <= 0) {
987 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input text size is invalid.");
988 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
989 SLOG(LOG_DEBUG, TAG_TTSC, " ");
990 return TTS_ERROR_INVALID_PARAMETER;
993 if (TTS_SPEED_AUTO > speed || TTS_SPEED_MAX < speed) {
994 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] speed value(%d) is invalid.", speed);
995 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
996 SLOG(LOG_DEBUG, TAG_TTSC, " ");
997 return TTS_ERROR_INVALID_PARAMETER;
1000 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1001 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1002 return TTS_ERROR_INVALID_STATE;
1005 if (true == client->credential_needed && NULL == client->credential) {
1006 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Do not have app credential for this engine");
1007 return TTS_ERROR_PERMISSION_DENIED;
1010 /* check valid utf8 */
1012 ict = iconv_open("utf-8", "");
1013 if ((iconv_t)-1 == ict) {
1014 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to init for text check");
1015 return TTS_ERROR_OPERATION_FAILED;
1018 size_t len = strlen(text);
1019 char *in_tmp = NULL;
1020 char in_buf[TTS_MAX_TEXT_SIZE];
1021 char *out_tmp = NULL;
1022 char out_buf[TTS_MAX_TEXT_SIZE];
1023 size_t len_tmp = sizeof(out_buf);
1025 memset(in_buf, 0, TTS_MAX_TEXT_SIZE);
1026 snprintf(in_buf, TTS_MAX_TEXT_SIZE, "%s", text);
1029 memset(out_buf, 0, TTS_MAX_TEXT_SIZE);
1033 st = iconv(ict, &in_tmp, &len, &out_tmp, &len_tmp);
1034 if ((size_t)-1 == st) {
1035 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Text is invalid - '%s'", in_buf);
1037 return TTS_ERROR_INVALID_PARAMETER;
1040 SLOG(LOG_DEBUG, TAG_TTSC, "Text is valid - Converted text is '%s'", out_buf);
1042 /* change default language value */
1045 if (NULL == language)
1046 temp = strdup("default");
1048 temp = strdup(language);
1050 client->current_utt_id++;
1051 if (client->current_utt_id == 10000) {
1052 client->current_utt_id = 1;
1059 ret = tts_dbus_request_add_text(client->uid, out_buf, temp, voice_type, speed, client->current_utt_id, client->credential);
1061 if (TTS_ERROR_TIMED_OUT != ret) {
1062 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1065 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry add text : %s", __tts_get_error_code(ret));
1068 if (TTS_RETRY_MIN_COUNT == count) {
1069 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1074 *utt_id = client->current_utt_id;
1083 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1084 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1089 static void __tts_play_async(void *data)
1091 tts_h tts = (tts_h)data;
1092 tts_client_s* client = tts_client_get(tts);
1095 if (NULL == client) {
1096 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1103 ret = tts_dbus_request_play(client->uid, client->credential);
1105 if (TTS_ERROR_TIMED_OUT != ret) {
1106 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1109 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry play : %s", __tts_get_error_code(ret));
1112 if (TTS_RETRY_COUNT == count) {
1113 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1121 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to play tts : %s", __tts_get_error_code(ret));
1123 client->reason = ret;
1124 client->utt_id = -1;
1126 ecore_timer_add(0, __tts_notify_error, client->tts);
1130 client->before_state = client->current_state;
1131 client->current_state = TTS_STATE_PLAYING;
1133 if (NULL != client->state_changed_cb) {
1134 tts_client_use_callback(client);
1135 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1136 tts_client_not_use_callback(client);
1137 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1140 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1141 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1146 int tts_play_async(tts_h tts)
1148 if (0 != __tts_get_feature_enabled()) {
1149 return TTS_ERROR_NOT_SUPPORTED;
1152 SLOG(LOG_DEBUG, TAG_TTSC, "===== Play tts");
1155 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
1156 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1157 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1158 return TTS_ERROR_INVALID_PARAMETER;
1161 tts_client_s* client = tts_client_get(tts);
1163 if (NULL == client) {
1164 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
1165 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1166 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1167 return TTS_ERROR_INVALID_PARAMETER;
1170 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
1171 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
1172 return TTS_ERROR_INVALID_STATE;
1175 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1176 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1177 return TTS_ERROR_INVALID_STATE;
1180 if (true == client->credential_needed && NULL == client->credential) {
1181 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Do not have app credential for this engine");
1182 return TTS_ERROR_PERMISSION_DENIED;
1185 ecore_main_loop_thread_safe_call_async(__tts_play_async, (void*)tts);
1187 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1188 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1190 return TTS_ERROR_NONE;
1193 int tts_play(tts_h tts)
1195 if (0 != __tts_get_feature_enabled()) {
1196 return TTS_ERROR_NOT_SUPPORTED;
1199 SLOG(LOG_INFO, TAG_TTSC, "===== Play tts");
1202 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null.");
1203 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1204 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1205 return TTS_ERROR_INVALID_PARAMETER;
1208 tts_client_s* client = tts_client_get(tts);
1210 if (NULL == client) {
1211 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid.");
1212 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1213 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1214 return TTS_ERROR_INVALID_PARAMETER;
1217 if (TTS_STATE_PLAYING == client->current_state || TTS_STATE_CREATED == client->current_state) {
1218 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid.");
1219 return TTS_ERROR_INVALID_STATE;
1222 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1223 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1224 return TTS_ERROR_INVALID_STATE;
1227 if (true == client->credential_needed && NULL == client->credential) {
1228 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Do not have app credential for this engine");
1229 return TTS_ERROR_PERMISSION_DENIED;
1235 ret = tts_dbus_request_play(client->uid, client->credential);
1237 if (TTS_ERROR_TIMED_OUT != ret) {
1238 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1241 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry play : %s", __tts_get_error_code(ret));
1244 if (TTS_RETRY_COUNT == count) {
1245 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1252 client->before_state = client->current_state;
1253 client->current_state = TTS_STATE_PLAYING;
1255 if (NULL != client->state_changed_cb) {
1256 tts_client_use_callback(client);
1257 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1258 tts_client_not_use_callback(client);
1259 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1262 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1263 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1265 return TTS_ERROR_NONE;
1268 static void __tts_stop_async(void *data)
1270 tts_h tts = (tts_h)data;
1271 tts_client_s* client = tts_client_get(tts);
1274 if (NULL == client) {
1275 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1282 ret = tts_dbus_request_stop(client->uid);
1284 if (TTS_ERROR_TIMED_OUT != ret) {
1285 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1288 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry stop : %s", __tts_get_error_code(ret));
1291 if (TTS_RETRY_COUNT == count) {
1292 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1300 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to stop tts : %s", __tts_get_error_code(ret));
1302 client->reason = ret;
1303 client->utt_id = -1;
1305 ecore_timer_add(0, __tts_notify_error, client->tts);
1309 client->before_state = client->current_state;
1310 client->current_state = TTS_STATE_READY;
1312 if (NULL != client->state_changed_cb) {
1313 tts_client_use_callback(client);
1314 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1315 tts_client_not_use_callback(client);
1316 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1319 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1320 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1325 int tts_stop_aync(tts_h tts)
1327 if (0 != __tts_get_feature_enabled()) {
1328 return TTS_ERROR_NOT_SUPPORTED;
1331 SLOG(LOG_DEBUG, TAG_TTSC, "===== Stop tts");
1334 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1335 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1336 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1337 return TTS_ERROR_INVALID_PARAMETER;
1340 tts_client_s* client = tts_client_get(tts);
1342 if (NULL == client) {
1343 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1344 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1345 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1346 return TTS_ERROR_INVALID_PARAMETER;
1349 if (TTS_STATE_CREATED == client->current_state) {
1350 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
1351 return TTS_ERROR_INVALID_STATE;
1354 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1355 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1356 return TTS_ERROR_INVALID_STATE;
1359 ecore_main_loop_thread_safe_call_async(__tts_stop_async, (void*)tts);
1361 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1362 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1364 return TTS_ERROR_NONE;
1367 int tts_stop(tts_h tts)
1369 if (0 != __tts_get_feature_enabled()) {
1370 return TTS_ERROR_NOT_SUPPORTED;
1373 SLOG(LOG_INFO, TAG_TTSC, "===== Stop tts");
1376 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1377 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1378 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1379 return TTS_ERROR_INVALID_PARAMETER;
1382 tts_client_s* client = tts_client_get(tts);
1384 if (NULL == client) {
1385 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1386 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1387 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1388 return TTS_ERROR_INVALID_PARAMETER;
1391 if (TTS_STATE_CREATED == client->current_state) {
1392 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Current state is 'CREATED'.");
1393 return TTS_ERROR_INVALID_STATE;
1396 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1397 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1398 return TTS_ERROR_INVALID_STATE;
1404 ret = tts_dbus_request_stop(client->uid);
1406 if (TTS_ERROR_TIMED_OUT != ret) {
1407 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1410 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry stop : %s", __tts_get_error_code(ret));
1413 if (TTS_RETRY_COUNT == count) {
1414 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1421 client->before_state = client->current_state;
1422 client->current_state = TTS_STATE_READY;
1424 if (NULL != client->state_changed_cb) {
1425 tts_client_use_callback(client);
1426 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1427 tts_client_not_use_callback(client);
1428 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1431 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1432 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1434 return TTS_ERROR_NONE;
1437 static void __tts_pause_async(void *data)
1439 tts_h tts = (tts_h)data;
1440 tts_client_s* client = tts_client_get(tts);
1443 if (NULL == client) {
1444 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1451 ret = tts_dbus_request_pause(client->uid);
1453 if (TTS_ERROR_TIMED_OUT != ret) {
1454 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1457 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry pause : %s", __tts_get_error_code(ret));
1460 if (TTS_RETRY_COUNT == count) {
1461 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1469 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to pause tts : %s", __tts_get_error_code(ret));
1471 client->reason = ret;
1472 client->utt_id = -1;
1474 ecore_timer_add(0, __tts_notify_error, client->tts);
1478 client->before_state = client->current_state;
1479 client->current_state = TTS_STATE_PAUSED;
1481 if (NULL != client->state_changed_cb) {
1482 tts_client_use_callback(client);
1483 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1484 tts_client_not_use_callback(client);
1485 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1488 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1489 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1494 int tts_pause_async(tts_h tts)
1496 if (0 != __tts_get_feature_enabled()) {
1497 return TTS_ERROR_NOT_SUPPORTED;
1500 SLOG(LOG_DEBUG, TAG_TTSC, "===== Pause tts");
1503 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1504 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1505 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1506 return TTS_ERROR_INVALID_PARAMETER;
1509 tts_client_s* client = tts_client_get(tts);
1511 if (NULL == client) {
1512 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1513 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1514 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1515 return TTS_ERROR_INVALID_PARAMETER;
1518 if (TTS_STATE_PLAYING != client->current_state) {
1519 SLOG(LOG_ERROR, TAG_TTSC, "[Error] The Current state is NOT 'playing'. So this request should be not running.");
1520 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1521 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1522 return TTS_ERROR_INVALID_STATE;
1525 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1526 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1527 return TTS_ERROR_INVALID_STATE;
1530 ecore_main_loop_thread_safe_call_async(__tts_pause_async, (void*)tts);
1532 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1533 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1535 return TTS_ERROR_NONE;
1538 int tts_pause(tts_h tts)
1540 if (0 != __tts_get_feature_enabled()) {
1541 return TTS_ERROR_NOT_SUPPORTED;
1544 SLOG(LOG_INFO, TAG_TTSC, "===== Pause tts");
1547 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1548 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1549 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1550 return TTS_ERROR_INVALID_PARAMETER;
1553 tts_client_s* client = tts_client_get(tts);
1555 if (NULL == client) {
1556 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1557 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1558 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1559 return TTS_ERROR_INVALID_PARAMETER;
1562 if (TTS_STATE_PLAYING != client->current_state) {
1563 SLOG(LOG_ERROR, TAG_TTSC, "[Error] The Current state is NOT 'playing'. So this request should be not running.");
1564 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1565 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1566 return TTS_ERROR_INVALID_STATE;
1569 if (false == g_screen_reader && TTS_MODE_SCREEN_READER == client->mode) {
1570 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Screen reader option is NOT available. Ignore this request");
1571 return TTS_ERROR_INVALID_STATE;
1577 ret = tts_dbus_request_pause(client->uid);
1579 if (TTS_ERROR_TIMED_OUT != ret) {
1580 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1583 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry pause : %s", __tts_get_error_code(ret));
1586 if (TTS_RETRY_COUNT == count) {
1587 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1594 client->before_state = client->current_state;
1595 client->current_state = TTS_STATE_PAUSED;
1597 if (NULL != client->state_changed_cb) {
1598 tts_client_use_callback(client);
1599 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1600 tts_client_not_use_callback(client);
1601 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called");
1604 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1605 SLOG(LOG_DEBUG, TAG_TTSC, " ");
1607 return TTS_ERROR_NONE;
1610 int tts_set_private_data(tts_h tts, const char* key, const char* data)
1612 if (0 != __tts_get_feature_enabled()) {
1613 return TTS_ERROR_NOT_SUPPORTED;
1616 SLOG(LOG_INFO, TAG_TTSC, "===== Set private data, key(%s), data(%s)", key, data);
1619 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle isnull");
1620 return TTS_ERROR_INVALID_PARAMETER;
1623 if (NULL == key || NULL == data) {
1624 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid parameter");
1625 return TTS_ERROR_INVALID_PARAMETER;
1628 tts_client_s* client = tts_client_get(tts);
1630 if (NULL == client) {
1631 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1632 return TTS_ERROR_INVALID_PARAMETER;
1635 if (TTS_STATE_READY != client->current_state) {
1636 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid state : Current state is NOT 'READY'");
1637 return TTS_ERROR_INVALID_STATE;
1640 if (true != client->internal && (0 == strcmp(key, "EnableServerTTS") || 0 == strcmp(key, "DisableServerTTS"))) {
1641 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] This is not an internal app");
1642 return TTS_ERROR_INVALID_PARAMETER;
1648 ret = tts_dbus_request_set_private_data(client->uid, key, data);
1650 if (TTS_ERROR_TIMED_OUT != ret) {
1651 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1654 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry : %s", __tts_get_error_code(ret));
1657 if (TTS_RETRY_COUNT == count) {
1658 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1665 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1666 SLOG(LOG_DEBUG, TAG_TTSC, "");
1671 int tts_get_private_data(tts_h tts, const char* key, char** data)
1673 if (0 != __tts_get_feature_enabled()) {
1674 return TTS_ERROR_NOT_SUPPORTED;
1677 SLOG(LOG_INFO, TAG_TTSC, "===== Get private data, key(%s)", key);
1680 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null");
1681 return TTS_ERROR_INVALID_PARAMETER;
1684 if (NULL == key || NULL == data) {
1685 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid parameter");
1686 return TTS_ERROR_INVALID_PARAMETER;
1689 tts_client_s* client = tts_client_get(tts);
1691 if (NULL == client) {
1692 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid");
1693 return TTS_ERROR_INVALID_PARAMETER;
1696 if (TTS_STATE_READY != client->current_state) {
1697 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Invalid state : Current state is NOT 'READY'");
1698 return TTS_ERROR_INVALID_STATE;
1704 ret = tts_dbus_request_get_private_data(client->uid, key, data);
1706 if (TTS_ERROR_TIMED_OUT != ret) {
1707 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret));
1710 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] retry : %s", __tts_get_error_code(ret));
1713 if (TTS_RETRY_COUNT == count) {
1714 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to request");
1721 if (0 == strncmp(*data, "NULL", strlen(*data))) {
1726 SLOG(LOG_DEBUG, TAG_TTSC, "=====");
1727 SLOG(LOG_DEBUG, TAG_TTSC, "");
1732 static Eina_Bool __tts_notify_error(void *data)
1734 tts_h tts = (tts_h)data;
1736 tts_client_s* client = tts_client_get(tts);
1739 if (NULL == client) {
1740 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify error msg : A handle is not valid");
1744 SLOG(LOG_DEBUG, TAG_TTSC, "Error data : uttid(%d) reason(%s)", client->utt_id, __tts_get_error_code(client->reason));
1746 if (NULL != client->error_cb) {
1747 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of error");
1748 tts_client_use_callback(client);
1749 g_err_callback_status = true;
1750 client->error_cb(client->tts, client->utt_id, client->reason, client->error_user_data);
1751 g_err_callback_status = false;
1752 tts_client_not_use_callback(client);
1754 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
1760 int __tts_cb_error(int uid, tts_error_e reason, int utt_id, char* err_msg)
1763 GList* client_list = NULL;
1764 client_list = tts_client_get_client_list();
1767 tts_client_s *data = NULL;
1769 if (g_list_length(client_list) > 0) {
1770 /* Get a first item */
1771 iter = g_list_first(client_list);
1773 while (NULL != iter) {
1776 data->utt_id = utt_id;
1777 data->reason = reason;
1778 if (NULL != data->err_msg) {
1779 free(data->err_msg);
1780 data->err_msg = NULL;
1782 if (NULL != err_msg)
1783 data->err_msg = strdup(err_msg);
1785 /* call callback function */
1786 if (NULL != data->error_cb) {
1787 ecore_timer_add(0, __tts_notify_error, data->tts);
1789 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
1792 if (TTS_ERROR_SERVICE_RESET == reason) {
1793 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Service Reset");
1795 data->current_state = TTS_STATE_CREATED;
1796 if (0 != tts_prepare(data->tts)) {
1797 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare");
1802 iter = g_list_next(iter);
1806 tts_client_s* client = tts_client_get_by_uid(uid);
1808 if (NULL == client) {
1809 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
1810 return TTS_ERROR_INVALID_PARAMETER;
1813 client->utt_id = utt_id;
1814 client->reason = reason;
1815 if (NULL != client->err_msg) {
1816 free(client->err_msg);
1817 client->err_msg = NULL;
1819 if (NULL != err_msg)
1820 client->err_msg = strdup(err_msg);
1822 /* call callback function */
1823 if (NULL != client->error_cb) {
1824 ecore_timer_add(0, __tts_notify_error, client->tts);
1826 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of error ");
1829 if (TTS_ERROR_SERVICE_RESET == reason) {
1830 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] Service Reset");
1832 client->current_state = TTS_STATE_CREATED;
1833 if (0 != tts_prepare(client->tts)) {
1834 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to prepare");
1842 static Eina_Bool __tts_notify_state_changed(void *data)
1844 tts_h tts = (tts_h)data;
1846 tts_client_s* client = tts_client_get(tts);
1849 if (NULL == client) {
1850 SLOG(LOG_WARN, TAG_TTSC, "Fail to notify state changed : A handle is not valid");
1854 if (NULL != client->state_changed_cb) {
1855 tts_client_use_callback(client);
1856 client->state_changed_cb(client->tts, client->before_state, client->current_state, client->state_changed_user_data);
1857 tts_client_not_use_callback(client);
1858 SLOG(LOG_DEBUG, TAG_TTSC, "State changed callback is called : pre(%d) cur(%d)", client->before_state, client->current_state);
1860 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
1866 int __tts_cb_set_state(int uid, int state)
1868 tts_client_s* client = tts_client_get_by_uid(uid);
1869 if (NULL == client) {
1870 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] The handle is not valid");
1874 tts_state_e state_from_daemon = (tts_state_e)state;
1876 if (client->current_state == state_from_daemon) {
1877 SLOG(LOG_DEBUG, TAG_TTSC, "Current state has already been %d", client->current_state);
1881 if (NULL != client->state_changed_cb) {
1882 ecore_timer_add(0, __tts_notify_state_changed, client->tts);
1884 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null");
1887 client->before_state = client->current_state;
1888 client->current_state = state_from_daemon;
1893 int __tts_cb_utt_started(int uid, int utt_id)
1895 tts_client_s* client = tts_client_get_by_uid(uid);
1897 if (NULL == client) {
1898 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
1899 return TTS_ERROR_INVALID_PARAMETER;
1902 SLOG(LOG_INFO, TAG_TTSC, "utterance started : utt id(%d) ", utt_id);
1904 client->utt_id = utt_id;
1906 /* call callback function */
1907 if (NULL != client->utt_started_cb) {
1908 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance started ");
1909 tts_client_use_callback(client);
1910 client->utt_started_cb(client->tts, client->utt_id, client->utt_started_user_data);
1911 tts_client_not_use_callback(client);
1913 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance started ");
1919 int __tts_cb_utt_completed(int uid, int utt_id)
1921 tts_client_s* client = tts_client_get_by_uid(uid);
1923 if (NULL == client) {
1924 SLOG(LOG_WARN, TAG_TTSC, "[WARNING] A handle is not valid");
1925 return TTS_ERROR_INVALID_PARAMETER;
1928 SLOG(LOG_INFO, TAG_TTSC, "utterance completed : uttid(%d) ", utt_id);
1930 client->utt_id = utt_id;
1932 /* call callback function */
1933 if (NULL != client->utt_completeted_cb) {
1934 SLOG(LOG_DEBUG, TAG_TTSC, "Call callback function of utterance completed ");
1935 tts_client_use_callback(client);
1936 client->utt_completeted_cb(client->tts, client->utt_id, client->utt_completed_user_data);
1937 tts_client_not_use_callback(client);
1939 SLOG(LOG_WARN, TAG_TTSC, "No registered callback function of utterance completed ");
1945 int tts_set_state_changed_cb(tts_h tts, tts_state_changed_cb callback, void* user_data)
1947 if (0 != __tts_get_feature_enabled()) {
1948 return TTS_ERROR_NOT_SUPPORTED;
1951 if (NULL == tts || NULL == callback) {
1952 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Input parameter is null");
1953 return TTS_ERROR_INVALID_PARAMETER;
1956 tts_client_s* client = tts_client_get(tts);
1958 if (NULL == client) {
1959 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : A handle is not valid");
1960 return TTS_ERROR_INVALID_PARAMETER;
1963 if (TTS_STATE_CREATED != client->current_state) {
1964 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set state changed cb : Current state is not 'Created'.");
1965 return TTS_ERROR_INVALID_STATE;
1968 client->state_changed_cb = callback;
1969 client->state_changed_user_data = user_data;
1971 SLOG(LOG_INFO, TAG_TTSC, "[SUCCESS] Set state changed cb");
1976 int tts_unset_state_changed_cb(tts_h tts)
1978 if (0 != __tts_get_feature_enabled()) {
1979 return TTS_ERROR_NOT_SUPPORTED;
1983 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Input parameter is null");
1984 return TTS_ERROR_INVALID_PARAMETER;
1987 tts_client_s* client = tts_client_get(tts);
1989 if (NULL == client) {
1990 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : A handle is not valid");
1991 return TTS_ERROR_INVALID_PARAMETER;
1994 if (TTS_STATE_CREATED != client->current_state) {
1995 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset state changed cb : Current state is not 'Created'.");
1996 return TTS_ERROR_INVALID_STATE;
1999 client->state_changed_cb = NULL;
2000 client->state_changed_user_data = NULL;
2002 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset state changed cb");
2007 int tts_set_utterance_started_cb(tts_h tts, tts_utterance_started_cb callback, void* user_data)
2009 if (0 != __tts_get_feature_enabled()) {
2010 return TTS_ERROR_NOT_SUPPORTED;
2013 if (NULL == tts || NULL == callback) {
2014 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Input parameter is null");
2015 return TTS_ERROR_INVALID_PARAMETER;
2018 tts_client_s* client = tts_client_get(tts);
2020 if (NULL == client) {
2021 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : A handle is not valid");
2022 return TTS_ERROR_INVALID_PARAMETER;
2025 if (TTS_STATE_CREATED != client->current_state) {
2026 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt started cb : Current state is not 'Created'.");
2027 return TTS_ERROR_INVALID_STATE;
2030 client->utt_started_cb = callback;
2031 client->utt_started_user_data = user_data;
2033 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt started cb");
2038 int tts_unset_utterance_started_cb(tts_h tts)
2040 if (0 != __tts_get_feature_enabled()) {
2041 return TTS_ERROR_NOT_SUPPORTED;
2045 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Input parameter is null");
2046 return TTS_ERROR_INVALID_PARAMETER;
2049 tts_client_s* client = tts_client_get(tts);
2051 if (NULL == client) {
2052 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : A handle is not valid");
2053 return TTS_ERROR_INVALID_PARAMETER;
2056 if (TTS_STATE_CREATED != client->current_state) {
2057 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt started cb : Current state is not 'Created'.");
2058 return TTS_ERROR_INVALID_STATE;
2061 client->utt_started_cb = NULL;
2062 client->utt_started_user_data = NULL;
2064 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt started cb");
2069 int tts_set_utterance_completed_cb(tts_h tts, tts_utterance_completed_cb callback, void* user_data)
2071 if (0 != __tts_get_feature_enabled()) {
2072 return TTS_ERROR_NOT_SUPPORTED;
2075 if (NULL == tts || NULL == callback) {
2076 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Input parameter is null");
2077 return TTS_ERROR_INVALID_PARAMETER;
2080 tts_client_s* client = tts_client_get(tts);
2082 if (NULL == client) {
2083 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : A handle is not valid");
2084 return TTS_ERROR_INVALID_PARAMETER;
2087 if (TTS_STATE_CREATED != client->current_state) {
2088 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set utt completed cb : Current state is not 'Created'.");
2089 return TTS_ERROR_INVALID_STATE;
2092 client->utt_completeted_cb = callback;
2093 client->utt_completed_user_data = user_data;
2095 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set utt completed cb");
2100 int tts_unset_utterance_completed_cb(tts_h tts)
2102 if (0 != __tts_get_feature_enabled()) {
2103 return TTS_ERROR_NOT_SUPPORTED;
2107 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Input parameter is null");
2108 return TTS_ERROR_INVALID_PARAMETER;
2111 tts_client_s* client = tts_client_get(tts);
2113 if (NULL == client) {
2114 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : A handle is not valid");
2115 return TTS_ERROR_INVALID_PARAMETER;
2118 if (TTS_STATE_CREATED != client->current_state) {
2119 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset utt completed cb : Current state is not 'Created'.");
2120 return TTS_ERROR_INVALID_STATE;
2123 client->utt_completeted_cb = NULL;
2124 client->utt_completed_user_data = NULL;
2126 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset utt completed cb");
2130 int tts_set_error_cb(tts_h tts, tts_error_cb callback, void* user_data)
2132 if (0 != __tts_get_feature_enabled()) {
2133 return TTS_ERROR_NOT_SUPPORTED;
2136 if (NULL == tts || NULL == callback) {
2137 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Input parameter is null");
2138 return TTS_ERROR_INVALID_PARAMETER;
2141 tts_client_s* client = tts_client_get(tts);
2143 if (NULL == client) {
2144 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : A handle is not valid");
2145 return TTS_ERROR_INVALID_PARAMETER;
2148 if (TTS_STATE_CREATED != client->current_state) {
2149 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set error cb : Current state is not 'Created'.");
2150 return TTS_ERROR_INVALID_STATE;
2153 client->error_cb = callback;
2154 client->error_user_data = user_data;
2156 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set error cb");
2161 int tts_unset_error_cb(tts_h tts)
2163 if (0 != __tts_get_feature_enabled()) {
2164 return TTS_ERROR_NOT_SUPPORTED;
2168 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Input parameter is null");
2169 return TTS_ERROR_INVALID_PARAMETER;
2172 tts_client_s* client = tts_client_get(tts);
2174 if (NULL == client) {
2175 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : A handle is not valid");
2176 return TTS_ERROR_INVALID_PARAMETER;
2179 if (TTS_STATE_CREATED != client->current_state) {
2180 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset error cb : Current state is not 'Created'.");
2181 return TTS_ERROR_INVALID_STATE;
2184 client->error_cb = NULL;
2185 client->error_user_data = NULL;
2187 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset error cb");
2192 int tts_set_default_voice_changed_cb(tts_h tts, tts_default_voice_changed_cb callback, void* user_data)
2194 if (0 != __tts_get_feature_enabled()) {
2195 return TTS_ERROR_NOT_SUPPORTED;
2198 if (NULL == tts || NULL == callback) {
2199 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : Input parameter is null");
2200 return TTS_ERROR_INVALID_PARAMETER;
2203 tts_client_s* client = tts_client_get(tts);
2205 if (NULL == client) {
2206 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : A handle is not valid");
2207 return TTS_ERROR_INVALID_PARAMETER;
2210 if (TTS_STATE_CREATED != client->current_state) {
2211 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set default voice changed cb : Current state is not 'Created'.");
2212 return TTS_ERROR_INVALID_STATE;
2215 client->default_voice_changed_cb = callback;
2216 client->default_voice_changed_user_data = user_data;
2218 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set default voice changed cb");
2223 int tts_unset_default_voice_changed_cb(tts_h tts)
2225 if (0 != __tts_get_feature_enabled()) {
2226 return TTS_ERROR_NOT_SUPPORTED;
2230 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : Input parameter is null");
2231 return TTS_ERROR_INVALID_PARAMETER;
2234 tts_client_s* client = tts_client_get(tts);
2236 if (NULL == client) {
2237 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : A handle is not valid");
2238 return TTS_ERROR_INVALID_PARAMETER;
2241 if (TTS_STATE_CREATED != client->current_state) {
2242 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset default voice changed cb : Current state is not 'Created'.");
2243 return TTS_ERROR_INVALID_STATE;
2246 client->default_voice_changed_cb = NULL;
2247 client->default_voice_changed_user_data = NULL;
2249 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset default voice changed cb");
2254 int tts_set_engine_changed_cb(tts_h tts, tts_engine_changed_cb callback, void* user_data)
2256 if (0 != __tts_get_feature_enabled()) {
2257 return TTS_ERROR_NOT_SUPPORTED;
2260 if (NULL == tts || NULL == callback) {
2261 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set engine changed cb : Input parameter is null");
2262 return TTS_ERROR_INVALID_PARAMETER;
2265 tts_client_s* client = tts_client_get(tts);
2267 if (NULL == client) {
2268 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set engine changed cb : A handle is not valid");
2269 return TTS_ERROR_INVALID_PARAMETER;
2272 if (TTS_STATE_CREATED != client->current_state) {
2273 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Set engine changed cb : Current state is not 'Created'.");
2274 return TTS_ERROR_INVALID_STATE;
2277 client->engine_changed_cb = callback;
2278 client->engine_changed_user_data = user_data;
2280 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Set engine changed cb");
2285 int tts_unset_engine_changed_cb(tts_h tts)
2287 if (0 != __tts_get_feature_enabled()) {
2288 return TTS_ERROR_NOT_SUPPORTED;
2292 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset engine changed cb : Input parameter is null");
2293 return TTS_ERROR_INVALID_PARAMETER;
2296 tts_client_s* client = tts_client_get(tts);
2298 if (NULL == client) {
2299 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset engine changed cb : A handle is not valid");
2300 return TTS_ERROR_INVALID_PARAMETER;
2303 if (TTS_STATE_CREATED != client->current_state) {
2304 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Unset engine changed cb : Current state is not 'Created'.");
2305 return TTS_ERROR_INVALID_STATE;
2308 client->engine_changed_cb = NULL;
2309 client->engine_changed_user_data = NULL;
2311 SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset engine changed cb");