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.
21 #include <sys/inotify.h>
25 #include "tts_config_mgr.h"
26 #include "tts_config_parser.h"
30 const static int TTS_CONFIG_VOICE_TYPE_NONE = 0;
35 tts_config_engine_changed_cb engine_cb;
36 tts_config_voice_changed_cb voice_cb;
37 tts_config_speech_rate_changed_cb speech_cb;
38 tts_config_screen_reader_changed_cb screen_cb;
39 tts_config_pitch_changed_cb pitch_cb;
40 tts_config_bg_volume_ratio_changed_cb bg_volume_ratio_cb;
42 void* screen_user_data;
43 } tts_config_client_s;
46 const char* engine_id;
52 } engine_changed_cb_parameter_s;
55 const char* before_language;
56 int before_voice_type;
57 const char* current_language;
58 int current_voice_type;
60 } voice_changed_cb_parameter_s;
63 static GSList* g_engine_list = NULL;
65 static GSList* g_config_client_list = NULL;
67 extern char g_engine_id[128];
68 extern char g_setting[128];
69 extern char g_language[128];
71 static Ecore_Fd_Handler* g_config_fd_handler_noti = NULL;
72 static int g_config_fd_noti;
73 static int g_config_wd_noti;
75 static int g_client_type = 0x0;
77 /* For engine directory monitoring */
79 Ecore_Fd_Handler* dir_fd_handler;
82 } tts_engine_inotify_s;
84 static GList* g_ino_list = NULL;
86 int __tts_config_mgr_print_engine_info();
87 static int __tts_config_mgr_register_engine_config_updated_event(const char* path);
88 static int __tts_config_mgr_unregister_engine_config_updated_event();
90 static char* __get_default_engine_app_id()
92 char* engine_name = vconf_get_str(TTS_ENGINE_DB_DEFAULT);
93 if (NULL == engine_name) {
94 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get engine name");
95 engine_name = strdup(TTS_SERVER_ENGINE_DEFAULT);
101 static tts_engine_info_s* __get_engine_info(const char* engine_id)
103 if (NULL == engine_id) {
104 SLOG(LOG_ERROR, TAG_TTSCONFIG, "engine_id is NULL");
108 for (GSList* iter = g_slist_nth(g_engine_list, 0); NULL != iter; iter = g_slist_next(iter)) {
109 tts_engine_info_s* engine_info = iter->data;
110 if (NULL == engine_info) {
111 SLOG(LOG_WARN, TAG_TTSCONFIG, "engine info is NULL");
115 if (NULL != engine_info->uuid && 0 == strcmp(engine_id, engine_info->uuid)) {
116 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Success to find engine info : %s", engine_id);
124 static tts_config_voice_s* __get_voice_info(tts_engine_info_s* engine_info, const char* language, int voice_type)
126 if (NULL == engine_info) {
127 SLOG(LOG_ERROR, TAG_TTSCONFIG, "engine_info is NULL");
131 if (NULL == language) {
132 SLOG(LOG_ERROR, TAG_TTSCONFIG, "language is NULL");
136 for (GSList* iter = g_slist_nth(engine_info->voices, 0); NULL != iter; iter = g_slist_next(iter)) {
137 tts_config_voice_s* voice = iter->data;
139 SLOG(LOG_WARN, TAG_TTSCONFIG, "voice is NULL");
143 if (0 != strcmp(language, voice->language)) {
147 if (TTS_CONFIG_VOICE_TYPE_NONE == voice_type || voice_type == voice->type) {
148 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Success to find voice : %s, %d", language, voice_type);
156 static bool __is_client_type(int type_flag)
158 if (type_flag & g_client_type) {
165 static void __set_language_into_config(tts_config_s* config_info, const char* language)
167 if (NULL == config_info) {
171 memset(g_language, '\0', sizeof(g_language));
172 config_info->language = g_language;
174 if (NULL != language) {
175 strncpy(config_info->language, language, sizeof(g_language) - 1);
179 int __tts_config_mgr_check_engine_is_valid(const char* engine_id)
181 if (NULL == engine_id) {
182 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Input parameter is NULL");
183 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
186 if (0 >= g_slist_length(g_engine_list)) {
187 SLOG(LOG_ERROR, TAG_TTSCONFIG, "There is no engine!!");
188 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
191 if (NULL != __get_engine_info(engine_id)) {
192 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Default engine is valid : %s", engine_id);
193 return TTS_CONFIG_ERROR_NONE;
196 /* Change default engine */
197 char* default_engine = __get_default_engine_app_id();
198 tts_engine_info_s *engine_info = __get_engine_info(default_engine);
199 free(default_engine);
201 if (NULL == engine_info) {
202 GSList* iter = g_slist_nth(g_engine_list, 0);
204 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] No engine in list");
205 return TTS_CONFIG_ERROR_OPERATION_FAILED;
208 engine_info = iter->data;
209 if (NULL == engine_info) {
210 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Invalid engine info in list");
211 return TTS_CONFIG_ERROR_OPERATION_FAILED;
214 if (NULL != engine_info->uuid) {
215 vconf_set_str(TTS_ENGINE_DB_DEFAULT, engine_info->uuid);
219 tts_config_s config_info;
220 if (0 != tts_parser_get_config_info(&config_info)){
221 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get configure information");
222 return TTS_CONFIG_ERROR_OPERATION_FAILED;
225 if (NULL != engine_info->uuid) {
226 memset(g_engine_id, '\0', sizeof(g_engine_id));
227 config_info.engine_id = g_engine_id;
228 strncpy(config_info.engine_id, engine_info->uuid, sizeof(g_engine_id) - 1);
230 if (NULL != engine_info->setting) {
231 memset(g_setting, '\0', sizeof(g_setting));
232 config_info.setting = g_setting;
233 strncpy(config_info.setting, engine_info->setting, sizeof(g_setting) - 1);
236 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Default engine is changed : %s", config_info.engine_id);
238 /* Change is default voice */
239 bool is_valid_voice = false;
240 tts_config_voice_s* voice = __get_voice_info(engine_info, config_info.language, config_info.type);
242 is_valid_voice = true;
244 __set_language_into_config(&config_info, voice->language);
245 config_info.type = voice->type;
247 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Default voice is changed : lang(%s) type(%d)", voice->language, voice->type);
250 if (false == is_valid_voice) {
251 GSList *iter_voice = g_slist_nth(engine_info->voices, 0);
252 if (NULL == iter_voice) {
253 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Fail to get voice list");
254 return TTS_CONFIG_ERROR_OPERATION_FAILED;
256 voice = iter_voice->data;
258 if (NULL == voice || NULL == voice->language) {
259 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Fail to get voice info from list");
260 return TTS_CONFIG_ERROR_OPERATION_FAILED;
262 /* Select first voice as default */
263 __set_language_into_config(&config_info, voice->language);
265 config_info.type = voice->type;
266 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Default voice is changed : lang(%s) type(%d)", voice->language, voice->type);
269 if (0 != tts_parser_set_config_info(&config_info)){
270 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to set configure information");
271 return TTS_CONFIG_ERROR_OPERATION_FAILED;
274 if (__is_client_type(TTS_CONFIG_CLIENT_TYPE_SETTING | TTS_CONFIG_CLIENT_TYPE_SERVER | TTS_CONFIG_CLIENT_TYPE_INTERRUPT)) {
275 if (0 != tts_parser_set_engine(config_info.engine_id, config_info.setting, config_info.language, config_info.type)) {
276 SLOG(LOG_ERROR, TAG_TTSCONFIG, " Fail to save config");
277 return TTS_CONFIG_ERROR_OPERATION_FAILED;
280 SLOG(LOG_INFO, TAG_TTSCONFIG, "Client type is default. Skip saving configuration file.");
284 return TTS_CONFIG_ERROR_NONE;
287 bool __tts_config_mgr_check_lang_is_valid(const char* engine_id, const char* language, int type)
289 if (NULL == engine_id || NULL == language) {
290 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Input parameter is NULL");
294 if (0 >= g_slist_length(g_engine_list)) {
295 SLOG(LOG_ERROR, TAG_TTSCONFIG, "There is no engine!!");
299 tts_engine_info_s *engine_info = __get_engine_info(engine_id);
300 if (NULL == engine_info) {
301 SLOG(LOG_ERROR, TAG_TTSCONFIG, "engine info is NULL");
305 tts_config_voice_s* voice = __get_voice_info(engine_info, language, type);
313 int __tts_config_mgr_select_lang(const char* engine_id, char** language, int* type)
315 if (NULL == engine_id || NULL == language) {
316 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Input parameter is NULL");
317 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
320 if (0 >= g_slist_length(g_engine_list)) {
321 SLOG(LOG_ERROR, TAG_TTSCONFIG, "There is no engine!!");
322 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
325 tts_engine_info_s *engine_info = __get_engine_info(engine_id);
326 if (NULL == engine_info) {
327 SLOG(LOG_ERROR, TAG_TTSCONFIG, "engine info is NULL");
328 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
331 if (g_slist_length(engine_info->voices) <= 0) {
332 SLOG(LOG_ERROR, TAG_TTSCONFIG, "There is no voice : %s", engine_info->uuid);
333 return TTS_CONFIG_ERROR_OPERATION_FAILED;
336 tts_config_voice_s* voice = __get_voice_info(engine_info, TTS_BASE_LANGUAGE, TTS_CONFIG_VOICE_TYPE_NONE);
338 /* Not support base language */
339 GSList *iter_voice = g_slist_nth(engine_info->voices, 0);
340 if (NULL != iter_voice) {
341 voice = iter_voice->data;
346 *language = strdup(voice->language);
349 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Selected language(%s) type(%d)", *language, *type);
350 return TTS_CONFIG_ERROR_NONE;
353 return TTS_CONFIG_ERROR_OPERATION_FAILED;
356 static void __invoke_engine_changed_cb(gpointer data, gpointer user_data)
358 tts_config_client_s* client = (tts_config_client_s*)data;
359 engine_changed_cb_parameter_s* params = (engine_changed_cb_parameter_s*)user_data;
361 if (NULL == client || NULL == params) {
362 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] parmeter is NULL. client(%p), params(%p)", client, params);
366 if (NULL != client->engine_cb) {
367 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Engine changed callback : uid(%u)", client->uid);
368 client->engine_cb(params->engine_id, params->setting, params->language, params->voice_type,
369 params->auto_voice, params->need_credential, client->user_data);
373 static void __invoke_voice_changed_cb(gpointer data, gpointer user_data)
375 tts_config_client_s* client = (tts_config_client_s*)data;
376 voice_changed_cb_parameter_s* params = (voice_changed_cb_parameter_s*)user_data;
378 if (NULL == client || NULL == params) {
379 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] parmeter is NULL. client(%p), params(%p)", client, params);
383 if (NULL != client->voice_cb) {
384 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Voice changed callback : uid(%u)", client->uid);
385 client->voice_cb(params->before_language, params->before_voice_type, params->current_language,
386 params->current_voice_type, params->auto_voice, client->user_data);
390 Eina_Bool tts_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handler)
392 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "@@@ Config changed callback event");
395 struct inotify_event event;
396 memset(&event, '\0', sizeof(struct inotify_event));
398 length = read(g_config_fd_noti, &event, sizeof(struct inotify_event));
400 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Empty Inotify event");
401 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "@@@");
402 return ECORE_CALLBACK_DONE;
405 tts_config_s config_info;
406 if (0 != tts_parser_get_config_info(&config_info)){
407 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get configure information");
408 return ECORE_CALLBACK_PASS_ON;
411 if (IN_CLOSE_WRITE == event.mask) {
412 /* check config changed state */
414 char* setting = NULL;
416 bool auto_voice = config_info.auto_voice;
418 int speech_rate = -1;
420 double bg_volume_ratio = -1;
423 tts_config_client_s* temp_client = NULL;
425 if (0 != tts_parser_find_config_changed(&engine, &setting, &auto_voice, &lang, &voice_type, &speech_rate, &pitch, &bg_volume_ratio))
426 return ECORE_CALLBACK_PASS_ON;
429 if (NULL != engine || NULL != setting) {
430 if (NULL != engine) {
431 memset(g_engine_id, '\0', sizeof(g_engine_id));
432 config_info.engine_id = g_engine_id;
433 strncpy(config_info.engine_id, engine, sizeof(g_engine_id) - 1);
435 if (NULL != setting) {
436 memset(g_setting, '\0', sizeof(g_setting));
437 config_info.setting = g_setting;
438 strncpy(config_info.setting, setting, sizeof(g_setting) - 1);
441 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Engine change(%s)", config_info.engine_id);
443 /* Call all callbacks of client*/
444 engine_changed_cb_parameter_s params = {config_info.engine_id, config_info.setting,config_info.language,
445 config_info.type, config_info.auto_voice, config_info.credential};
446 g_slist_foreach(g_config_client_list, __invoke_engine_changed_cb, ¶ms);
449 if (auto_voice != config_info.auto_voice) {
450 config_info.auto_voice = auto_voice;
453 if (NULL != lang || -1 != voice_type) {
454 char* before_lang = NULL;
457 before_lang = strdup(config_info.language);
458 before_type = config_info.type;
461 __set_language_into_config(&config_info, lang);
463 if (-1 != voice_type) {
464 config_info.type = voice_type;
467 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Voice change(%s, %d)", config_info.language, config_info.type);
469 /* Call all callbacks of client*/
470 voice_changed_cb_parameter_s params = {before_lang, before_type, config_info.language,
471 config_info.type, config_info.auto_voice};
472 g_slist_foreach(g_config_client_list, __invoke_voice_changed_cb, ¶ms);
474 if (NULL != before_lang) {
480 if (-1 != speech_rate) {
481 config_info.speech_rate = speech_rate;
483 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Speech rate change(%d)", config_info.speech_rate);
485 /* Call all callbacks of client*/
486 iter = g_slist_nth(g_config_client_list, 0);
488 while (NULL != iter) {
489 temp_client = iter->data;
491 if (NULL != temp_client) {
492 if (NULL != temp_client->speech_cb) {
493 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Speech rate changed callback : uid(%u)", temp_client->uid);
494 temp_client->speech_cb(config_info.speech_rate, temp_client->user_data);
498 iter = g_slist_next(iter);
503 config_info.pitch = pitch;
505 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "pitch change(%d)", config_info.pitch);
507 /* Call all callbacks of client*/
508 iter = g_slist_nth(g_config_client_list, 0);
510 while (NULL != iter) {
511 temp_client = iter->data;
513 if (NULL != temp_client) {
514 if (NULL != temp_client->pitch_cb) {
515 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Pitch changed callback : uid(%u)", temp_client->uid);
516 temp_client->pitch_cb(config_info.pitch, temp_client->user_data);
520 iter = g_slist_next(iter);
524 if (-1 != bg_volume_ratio) {
525 config_info.bg_volume_ratio = bg_volume_ratio;
527 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "background volume ratio change(%lf)", config_info.bg_volume_ratio);
529 /* Call all callbacks of client*/
530 iter = g_slist_nth(g_config_client_list, 0);
532 while (NULL != iter) {
533 temp_client = iter->data;
535 if (NULL != temp_client) {
536 if (NULL != temp_client->bg_volume_ratio_cb) {
537 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "background volume ratio changed callback : uid(%u)", temp_client->uid);
538 temp_client->bg_volume_ratio_cb(config_info.bg_volume_ratio, temp_client->user_data);
542 iter = g_slist_next(iter);
546 if (NULL != engine) {
550 if (NULL != setting) {
559 if (0 != tts_parser_set_config_info(&config_info)){
560 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to set configure information");
561 return ECORE_CALLBACK_PASS_ON;
563 } else if (IN_DELETE_SELF == event.mask) {
564 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] IN_DELETE_SELF event");
566 tts_parser_unload_config();
568 tts_parser_load_config();
570 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Undefined event (0x%x)", event.mask);
573 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "@@@");
575 return ECORE_CALLBACK_PASS_ON;
578 int __tts_config_mgr_register_config_event()
580 /* get file notification handler */
586 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail get inotify fd");
587 return TTS_CONFIG_ERROR_OPERATION_FAILED;
589 g_config_fd_noti = fd;
591 wd = inotify_add_watch(fd, TTS_CONFIG, IN_CLOSE_WRITE|IN_DELETE_SELF);
592 g_config_wd_noti = wd;
594 g_config_fd_handler_noti = ecore_main_fd_handler_add(fd, ECORE_FD_READ,
595 (Ecore_Fd_Cb)tts_config_mgr_inotify_event_cb, NULL, NULL, NULL);
596 if (NULL == g_config_fd_handler_noti) {
597 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get handler_noti");
598 return TTS_CONFIG_ERROR_OPERATION_FAILED;
601 /* Set non-blocking mode of file */
603 value = fcntl(fd, F_GETFL, 0);
606 if (0 > fcntl(fd, F_SETFL, value)) {
607 SLOG(LOG_WARN, TAG_TTSCONFIG, "[WARNING] Fail to set non-block mode");
610 return TTS_CONFIG_ERROR_NONE;
613 int __tts_config_mgr_unregister_config_event()
615 /* delete inotify variable */
616 ecore_main_fd_handler_del(g_config_fd_handler_noti);
617 inotify_rm_watch(g_config_fd_noti, g_config_wd_noti);
618 close(g_config_fd_noti);
620 return TTS_CONFIG_ERROR_NONE;
623 int __tts_config_set_auto_language()
626 value = vconf_get_str(TTS_LANGSET_KEY);
628 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[Config ERROR] Fail to get display language");
629 return TTS_CONFIG_ERROR_OPERATION_FAILED;
632 char temp_lang[6] = {'\0', };
633 strncpy(temp_lang, value, 5);
637 tts_config_s config_info;
638 if (0 != tts_parser_get_config_info(&config_info)){
639 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get configure information");
640 return TTS_CONFIG_ERROR_OPERATION_FAILED;
643 if (true == __tts_config_mgr_check_lang_is_valid(config_info.engine_id, temp_lang, config_info.type)) {
644 /* tts default voice change */
645 if (NULL == config_info.language) {
646 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Current config language is NULL");
647 return TTS_CONFIG_ERROR_OPERATION_FAILED;
650 char* before_lang = NULL;
653 before_lang = strdup(config_info.language);
654 before_type = config_info.type;
656 __set_language_into_config(&config_info, temp_lang);
658 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[Config] Default voice : lang(%s) type(%d)",
659 config_info.language, config_info.type);
661 /* Call all callbacks of client*/
662 voice_changed_cb_parameter_s params = {before_lang, before_type, config_info.language,
663 config_info.type, config_info.auto_voice};
664 g_slist_foreach(g_config_client_list, __invoke_voice_changed_cb, ¶ms);
666 if (NULL != before_lang) {
671 /* Display language is not valid */
672 char* tmp_language = NULL;
674 if (0 != __tts_config_mgr_select_lang(config_info.engine_id, &tmp_language, &tmp_type)) {
675 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to select language");
676 return TTS_CONFIG_ERROR_OPERATION_FAILED;
679 if (NULL == tmp_language) {
680 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] language is NULL");
681 return TTS_CONFIG_ERROR_OPERATION_FAILED;
684 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[Config] Default voice : lang(%s) type(%d)", tmp_language, tmp_type);
686 /* Call all callbacks of client*/
687 voice_changed_cb_parameter_s params = {config_info.language, config_info.type, tmp_language, tmp_type,
688 config_info.auto_voice};
689 g_slist_foreach(g_config_client_list, __invoke_voice_changed_cb, ¶ms);
691 __set_language_into_config(&config_info, tmp_language);
692 config_info.type = tmp_type;
698 if (0 != tts_parser_set_config_info(&config_info)){
699 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to set configure information");
700 return TTS_CONFIG_ERROR_OPERATION_FAILED;
703 return TTS_CONFIG_ERROR_NONE;
706 void __tts_config_display_language_changed_cb(keynode_t *key, void *data)
708 tts_config_s config_info;
709 if (0 != tts_parser_get_config_info(&config_info)){
710 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get configure information");
713 if (true == config_info.auto_voice) {
714 __tts_config_set_auto_language();
716 if (__is_client_type(TTS_CONFIG_CLIENT_TYPE_SERVER)) {
717 if (0 != tts_parser_get_config_info(&config_info)){
718 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get configure information");
722 if (0 != tts_parser_set_voice(config_info.language, config_info.type)) {
723 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to save config");
732 void __tts_config_screen_reader_changed_cb(keynode_t *key, void *data)
736 ret = vconf_get_bool(TTS_ACCESSIBILITY_KEY, &screen_reader);
738 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[Config ERROR] Fail to get screen reader");
743 tts_config_client_s* temp_client = NULL;
745 /* Call all callbacks of client*/
746 iter = g_slist_nth(g_config_client_list, 0);
748 while (NULL != iter) {
749 temp_client = iter->data;
751 if (NULL != temp_client) {
752 if (NULL != temp_client->screen_cb) {
753 temp_client->screen_cb((bool)screen_reader, temp_client->screen_user_data);
757 iter = g_slist_next(iter);
761 int __tts_config_release_client(unsigned int uid)
764 tts_config_client_s* temp_client = NULL;
766 if (0 < g_slist_length(g_config_client_list)) {
768 iter = g_slist_nth(g_config_client_list, 0);
770 while (NULL != iter) {
771 temp_client = iter->data;
773 if (NULL != temp_client) {
774 if (uid == temp_client->uid) {
775 g_config_client_list = g_slist_remove(g_config_client_list, temp_client);
782 iter = g_slist_next(iter);
786 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Client count (%d)", g_slist_length(g_config_client_list));
788 return g_slist_length(g_config_client_list);
791 void __tts_config_release_engine()
794 tts_engine_info_s *engine_info = NULL;
796 if (0 < g_slist_length(g_engine_list)) {
798 /* Get a first item */
799 iter = g_slist_nth(g_engine_list, 0);
801 while (NULL != iter) {
802 engine_info = iter->data;
804 if (NULL != engine_info) {
805 g_engine_list = g_slist_remove(g_engine_list, engine_info);
807 tts_parser_free_engine_info(engine_info);
810 iter = g_slist_nth(g_engine_list, 0);
817 int __tts_config_mgr_get_engine_info()
820 struct dirent *dirp = NULL;
822 char filepath[512] = {'\0',};
824 tts_engine_info_s* info = NULL;
826 __tts_config_release_engine();
827 g_engine_list = NULL;
828 __tts_config_mgr_unregister_engine_config_updated_event();
830 /* Copy default info directory to download directory */
831 dp = opendir(TTS_DEFAULT_ENGINE_INFO);
833 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[CONFIG] No default directory : %s", TTS_DEFAULT_ENGINE_INFO);
839 if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name))
842 filesize = strlen(TTS_DEFAULT_ENGINE_INFO) + strlen(dirp->d_name) + 2;
843 if (filesize >= 512) {
844 SECURE_SLOG(LOG_ERROR, TAG_TTSCONFIG, "[CONFIG ERROR] File path is too long : %s", dirp->d_name);
846 return TTS_CONFIG_ERROR_OPERATION_FAILED;
849 memset(filepath, '\0', 512);
850 snprintf(filepath, 512, "%s/%s", TTS_DEFAULT_ENGINE_INFO, dirp->d_name);
852 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[CONFIG] Filepath(%s)", filepath);
854 char dest[512] = {'\0',};
855 snprintf(dest, 512, "%s/%s", TTS_DOWNLOAD_ENGINE_INFO, dirp->d_name);
857 if (0 != access(dest, F_OK)) {
858 if (0 != tts_parser_copy_xml(filepath, dest)) {
859 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[CONFIG ERROR] Fail to copy engine info");
863 } while (NULL != dirp);
868 /* Get engine info from default engine directory */
869 dp = opendir(TTS_DOWNLOAD_ENGINE_INFO);
871 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[CONFIG] No downloadable directory : %s", TTS_DOWNLOAD_ENGINE_INFO);
877 if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name))
880 filesize = strlen(TTS_DOWNLOAD_ENGINE_INFO) + strlen(dirp->d_name) + 2;
881 if (filesize >= 512) {
882 SECURE_SLOG(LOG_ERROR, TAG_TTSCONFIG, "[CONFIG ERROR] File path is too long : %s", dirp->d_name);
884 return TTS_CONFIG_ERROR_OPERATION_FAILED;
887 memset(filepath, '\0', 512);
888 snprintf(filepath, 512, "%s/%s", TTS_DOWNLOAD_ENGINE_INFO, dirp->d_name);
890 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[CONFIG] Filepath(%s)", filepath);
892 if (0 == tts_parser_get_engine_info(filepath, &info)) {
893 g_engine_list = g_slist_append(g_engine_list, info);
894 if (0 != __tts_config_mgr_register_engine_config_updated_event(filepath)) {
895 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to register engine config updated event");
899 } while (NULL != dirp);
904 if (0 >= g_slist_length(g_engine_list)) {
905 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] No engine");
906 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
909 return TTS_CONFIG_ERROR_NONE;
912 static Eina_Bool __tts_config_mgr_engine_config_inotify_event_callback(void* data, Ecore_Fd_Handler *fd_handler)
914 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "@@@ Engine config updated callback event");
916 tts_engine_inotify_s *ino = (tts_engine_inotify_s *)data;
917 int dir_fd = ino->dir_fd;
920 struct inotify_event event;
921 memset(&event, '\0', sizeof(struct inotify_event));
923 length = read(dir_fd, &event, sizeof(struct inotify_event));
925 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Empty Inotify event");
926 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "@@@");
927 return ECORE_CALLBACK_DONE;
930 if (IN_CLOSE_WRITE == event.mask) {
931 int ret = __tts_config_mgr_get_engine_info();
933 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get engine info when config updated");
935 __tts_config_mgr_print_engine_info();
936 tts_config_s config_info;
937 if (0 != tts_parser_get_config_info(&config_info)){
938 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get configure information");
939 return ECORE_CALLBACK_PASS_ON;
941 bool support = tts_config_check_default_voice_is_valid(config_info.language, config_info.type);
942 if (false == support) {
943 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[ERROR] Default voice is valid");
944 char* temp_lang = NULL;
946 ret = __tts_config_mgr_select_lang(config_info.engine_id, &temp_lang, &temp_type);
948 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get voice");
951 ret = tts_config_mgr_set_voice(temp_lang, temp_type);
953 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to set voice");
955 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[DEBUG] Saved default voice : lang(%s), type(%d)", temp_lang, temp_type);
957 if (NULL != temp_lang) {
963 if (0 != tts_parser_get_config_info(&config_info)){
964 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get configure information");
965 return ECORE_CALLBACK_PASS_ON;
968 /* Call all callbacks of client*/
969 engine_changed_cb_parameter_s params = {config_info.engine_id, config_info.setting,config_info.language,
970 config_info.type, config_info.auto_voice, config_info.credential};
971 g_slist_foreach(g_config_client_list, __invoke_engine_changed_cb, ¶ms);
973 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Undefined event");
976 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "@@@");
978 return ECORE_CALLBACK_PASS_ON;
981 static int __tts_config_mgr_register_engine_config_updated_event(const char* path)
984 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Path is NULL");
985 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
988 /* For engine directory monitoring */
989 tts_engine_inotify_s *ino = (tts_engine_inotify_s *)calloc(1, sizeof(tts_engine_inotify_s));
991 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to allocate memory");
992 return TTS_CONFIG_ERROR_OUT_OF_MEMORY;
995 ino->dir_fd = inotify_init();
996 if (ino->dir_fd < 0) {
997 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to init inotify");
1001 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1004 ino->dir_wd = inotify_add_watch(ino->dir_fd, path, IN_CLOSE_WRITE);
1005 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Add inotify watch(%s)", path);
1006 if (ino->dir_wd < 0) {
1007 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to add watch");
1010 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1013 ino->dir_fd_handler = ecore_main_fd_handler_add(ino->dir_fd, ECORE_FD_READ, (Ecore_Fd_Cb)__tts_config_mgr_engine_config_inotify_event_callback, (void *)ino, NULL, NULL);
1014 if (NULL == ino->dir_fd_handler) {
1015 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to add fd handler");
1018 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1021 /* Set non-blocking mode of file */
1023 value = fcntl(ino->dir_fd, F_GETFL, 0);
1024 value |= O_NONBLOCK;
1026 if (0 > fcntl(ino->dir_fd, F_SETFL, value)) {
1027 SLOG(LOG_WARN, TAG_TTSCONFIG, "[WARNING] Fail to set non-block mode");
1030 g_ino_list = g_list_append(g_ino_list, ino);
1032 return TTS_CONFIG_ERROR_NONE;
1035 static int __tts_config_mgr_unregister_engine_config_updated_event()
1037 /* delete all inotify variable */
1038 if (0 < g_list_length(g_ino_list)) {
1040 iter = g_list_first(g_ino_list);
1042 while (NULL != iter) {
1043 tts_engine_inotify_s *tmp = iter->data;
1046 ecore_main_fd_handler_del(tmp->dir_fd_handler);
1047 inotify_rm_watch(tmp->dir_fd, tmp->dir_wd);
1054 g_ino_list = g_list_delete_link(g_ino_list, iter);
1055 iter = g_list_first(g_ino_list);
1059 return TTS_CONFIG_ERROR_NONE;
1062 static int __add_new_config_client(unsigned int uid)
1064 tts_config_client_s* new_client = NULL;
1065 new_client = (tts_config_client_s*)calloc(1, sizeof(tts_config_client_s));
1066 if (NULL == new_client) {
1067 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to allocate memory");
1068 return TTS_CONFIG_ERROR_OUT_OF_MEMORY;
1070 new_client->uid = uid;
1071 new_client->engine_cb = NULL;
1072 new_client->voice_cb = NULL;
1073 new_client->speech_cb = NULL;
1074 new_client->pitch_cb = NULL;
1075 new_client->screen_cb = NULL;
1076 new_client->bg_volume_ratio_cb = NULL;
1077 new_client->user_data = NULL;
1078 new_client->screen_user_data = NULL;
1080 g_config_client_list = g_slist_append(g_config_client_list, new_client);
1082 return TTS_CONFIG_ERROR_NONE;
1085 int tts_config_mgr_initialize(unsigned int uid, tts_config_client_type_e client_type)
1088 if (0 < g_slist_length(g_config_client_list)) {
1090 GSList *iter = g_slist_nth(g_config_client_list, 0);
1092 while (NULL != iter) {
1093 tts_config_client_s* client = (tts_config_client_s*)iter->data;
1095 if (NULL != client && uid == client->uid) {
1096 SECURE_SLOG(LOG_WARN, TAG_TTSCONFIG, "[CONFIG] uid(%u) has already registered", uid);
1097 return TTS_CONFIG_ERROR_NONE;
1100 iter = g_slist_next(iter);
1103 int ret = __add_new_config_client(uid);
1104 if (TTS_CONFIG_ERROR_NONE != ret) {
1108 SECURE_SLOG(LOG_WARN, TAG_TTSCONFIG, "[CONFIG] Add uid(%u) but config has already initialized", uid);
1109 SLOG(LOG_INFO, TAG_TTSCONFIG, "Client type : %d", client_type);
1110 g_client_type |= client_type;
1112 return TTS_CONFIG_ERROR_NONE;
1114 int ret = __add_new_config_client(uid);
1115 if (TTS_CONFIG_ERROR_NONE != ret) {
1120 if (0 != access(TTS_CONFIG_BASE, F_OK)) {
1121 if (0 != mkdir(TTS_CONFIG_BASE, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
1122 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to make directory : %s", TTS_CONFIG_BASE);
1123 __tts_config_release_client(uid);
1124 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1126 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Success to make directory : %s", TTS_CONFIG_BASE);
1130 if (0 != access(TTS_HOME, F_OK)) {
1131 if (0 != mkdir(TTS_HOME, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
1132 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to make directory : %s", TTS_HOME);
1133 __tts_config_release_client(uid);
1134 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1136 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Success to make directory : %s", TTS_HOME);
1140 if (0 != access(TTS_DOWNLOAD_BASE, F_OK)) {
1141 if (0 != mkdir(TTS_DOWNLOAD_BASE, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
1142 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to make directory : %s", TTS_DOWNLOAD_BASE);
1143 __tts_config_release_client(uid);
1144 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1146 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Success to make directory : %s", TTS_DOWNLOAD_BASE);
1150 if (0 != access(TTS_DOWNLOAD_ENGINE_INFO, F_OK)) {
1151 if (0 != mkdir(TTS_DOWNLOAD_ENGINE_INFO, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
1152 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to make directory : %s", TTS_DOWNLOAD_ENGINE_INFO);
1153 __tts_config_release_client(uid);
1154 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1156 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Success to make directory : %s", TTS_DOWNLOAD_ENGINE_INFO);
1160 SLOG(LOG_INFO, TAG_TTSCONFIG, "Client type : %d", client_type);
1161 g_client_type |= client_type;
1163 if (0 != __tts_config_mgr_get_engine_info()) {
1164 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get engine info");
1165 __tts_config_release_client(uid);
1166 __tts_config_release_engine();
1167 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1170 __tts_config_mgr_print_engine_info();
1172 if (0 != tts_parser_load_config()) {
1173 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to parse configure information");
1174 __tts_config_release_client(uid);
1175 __tts_config_release_engine();
1176 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1178 tts_config_s config_info;
1179 if (0 != tts_parser_get_config_info(&config_info)) {
1180 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get configure information");
1181 __tts_config_release_client(uid);
1182 __tts_config_release_engine();
1183 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1186 /* Check whether engine id is valid */
1187 if (0 != __tts_config_mgr_check_engine_is_valid(config_info.engine_id)) {
1188 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get default engine");
1189 __tts_config_release_client(uid);
1190 __tts_config_release_engine();
1191 tts_parser_unload_config();
1192 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1195 if (true == config_info.auto_voice) {
1196 /* Check language with display language */
1197 __tts_config_set_auto_language();
1199 if (__is_client_type(TTS_CONFIG_CLIENT_TYPE_SETTING | TTS_CONFIG_CLIENT_TYPE_SERVER | TTS_CONFIG_CLIENT_TYPE_INTERRUPT)) {
1200 if (0 != tts_parser_get_config_info(&config_info)){
1201 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get configure information");
1204 if (0 != tts_parser_set_voice(config_info.language, config_info.type)) {
1205 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to save config");
1209 if (false == __tts_config_mgr_check_lang_is_valid(config_info.engine_id, config_info.language, config_info.type)) {
1210 /* Default language is not valid */
1211 char* tmp_language = NULL;
1213 if (0 != __tts_config_mgr_select_lang(config_info.engine_id, &tmp_language, &tmp_type)) {
1214 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to select language");
1215 __tts_config_release_client(uid);
1216 __tts_config_release_engine();
1217 tts_parser_unload_config();
1218 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1221 if (NULL != tmp_language) {
1222 __set_language_into_config(&config_info, tmp_language);
1223 config_info.type = tmp_type;
1226 tmp_language = NULL;
1228 if (0 != tts_parser_set_config_info(&config_info)) {
1229 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to set configure information");
1230 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1233 if (__is_client_type(TTS_CONFIG_CLIENT_TYPE_SETTING | TTS_CONFIG_CLIENT_TYPE_SERVER | TTS_CONFIG_CLIENT_TYPE_INTERRUPT)) {
1234 if (0 != tts_parser_set_voice(config_info.language, config_info.type)) {
1235 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to save config");
1236 __tts_config_release_client(uid);
1237 __tts_config_release_engine();
1238 tts_parser_unload_config();
1239 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1242 SLOG(LOG_INFO, TAG_TTSCONFIG, "Client type is default. Skip saving configuration file.");
1248 /* print daemon config */
1249 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "@@@ TTS config @@@");
1250 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " engine : %s", config_info.engine_id);
1251 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " setting : %s", config_info.setting);
1252 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " auto voice : %s", config_info.auto_voice ? "on" : "off");
1253 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " language : %s", config_info.language);
1254 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " voice type : %d", config_info.type);
1255 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " speech rate : %d", config_info.speech_rate);
1256 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " pitch : %d", config_info.pitch);
1257 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " bg volume ratio : %lf", config_info.bg_volume_ratio);
1258 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "@@@@@");
1260 if (0 != __tts_config_mgr_register_config_event()) {
1261 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to register config event");
1262 __tts_config_release_client(uid);
1263 __tts_config_release_engine();
1264 tts_parser_unload_config();
1265 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1268 /* Register to detect display language change */
1269 vconf_notify_key_changed(TTS_LANGSET_KEY, __tts_config_display_language_changed_cb, NULL);
1270 vconf_notify_key_changed(TTS_ACCESSIBILITY_KEY, __tts_config_screen_reader_changed_cb, NULL);
1272 /* For engine directory monitoring */
1273 //if (0 != __tts_config_mgr_register_engine_config_updated_event()) {
1274 // SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to register engine config updated event");
1275 // __tts_config_release_client(uid);
1276 // __tts_config_release_engine();
1277 // tts_parser_unload_config();
1278 // __tts_config_mgr_unregister_config_event();
1279 // return TTS_CONFIG_ERROR_OPERATION_FAILED;
1282 return TTS_CONFIG_ERROR_NONE;
1285 int tts_config_mgr_finalize(unsigned int uid, tts_config_client_type_e client_type)
1287 if (0 < __tts_config_release_client(uid)) {
1288 g_client_type &= ~client_type;
1289 return TTS_CONFIG_ERROR_NONE;
1292 SLOG(LOG_INFO, TAG_TTSCONFIG, "Client type : %d", client_type);
1293 g_client_type &= ~client_type;
1295 tts_config_mgr_unset_callback(uid);
1297 __tts_config_release_engine();
1299 tts_parser_unload_config();
1301 __tts_config_mgr_unregister_engine_config_updated_event();
1303 __tts_config_mgr_unregister_config_event();
1305 vconf_ignore_key_changed(TTS_LANGSET_KEY, __tts_config_display_language_changed_cb);
1306 vconf_ignore_key_changed(TTS_ACCESSIBILITY_KEY, __tts_config_screen_reader_changed_cb);
1308 return TTS_CONFIG_ERROR_NONE;
1311 int tts_config_mgr_set_callback(unsigned int uid,
1312 tts_config_engine_changed_cb engine_cb,
1313 tts_config_voice_changed_cb voice_cb,
1314 tts_config_speech_rate_changed_cb speech_cb,
1315 tts_config_pitch_changed_cb pitch_cb,
1316 tts_config_bg_volume_ratio_changed_cb bg_volume_ratio_cb,
1319 GSList *iter = NULL;
1320 tts_config_client_s* temp_client = NULL;
1322 /* Call all callbacks of client*/
1323 iter = g_slist_nth(g_config_client_list, 0);
1325 while (NULL != iter) {
1326 temp_client = iter->data;
1328 if (NULL != temp_client) {
1329 if (uid == temp_client->uid) {
1330 temp_client->engine_cb = engine_cb;
1331 temp_client->voice_cb = voice_cb;
1332 temp_client->speech_cb = speech_cb;
1333 temp_client->pitch_cb = pitch_cb;
1334 temp_client->bg_volume_ratio_cb = bg_volume_ratio_cb;
1335 temp_client->user_data = user_data;
1339 iter = g_slist_next(iter);
1341 return TTS_CONFIG_ERROR_NONE;
1344 int tts_config_mgr_unset_callback(unsigned int uid)
1346 GSList *iter = NULL;
1347 tts_config_client_s* temp_client = NULL;
1349 /* Call all callbacks of client*/
1350 iter = g_slist_nth(g_config_client_list, 0);
1352 while (NULL != iter) {
1353 temp_client = iter->data;
1355 if (NULL != temp_client) {
1356 if (uid == temp_client->uid) {
1357 temp_client->engine_cb = NULL;
1358 temp_client->voice_cb = NULL;
1359 temp_client->speech_cb = NULL;
1360 temp_client->pitch_cb = NULL;
1361 temp_client->bg_volume_ratio_cb = NULL;
1362 temp_client->user_data = NULL;
1366 iter = g_slist_next(iter);
1369 return TTS_CONFIG_ERROR_NONE;
1372 int tts_config_mgr_set_screen_reader_callback(unsigned int uid, tts_config_screen_reader_changed_cb callback, void* user_data)
1374 if (NULL == callback) {
1375 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Input parameter is NULL");
1376 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1379 GSList *iter = NULL;
1380 tts_config_client_s* temp_client = NULL;
1382 /* Call all callbacks of client*/
1383 iter = g_slist_nth(g_config_client_list, 0);
1385 while (NULL != iter) {
1386 temp_client = iter->data;
1388 if (NULL != temp_client) {
1389 if (uid == temp_client->uid) {
1390 temp_client->screen_cb = callback;
1391 temp_client->screen_user_data = user_data;
1395 iter = g_slist_next(iter);
1397 return TTS_CONFIG_ERROR_NONE;
1400 int tts_config_mgr_unset_screen_reader_callback(unsigned int uid)
1402 GSList *iter = NULL;
1403 tts_config_client_s* temp_client = NULL;
1405 /* Call all callbacks of client*/
1406 iter = g_slist_nth(g_config_client_list, 0);
1408 while (NULL != iter) {
1409 temp_client = iter->data;
1411 if (NULL != temp_client) {
1412 if (uid == temp_client->uid) {
1413 temp_client->screen_cb = NULL;
1414 temp_client->screen_user_data = NULL;
1418 iter = g_slist_next(iter);
1420 return TTS_CONFIG_ERROR_NONE;
1423 static int __check_precondition()
1425 if (0 >= g_slist_length(g_config_client_list)) {
1426 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Not initialized");
1427 return TTS_CONFIG_ERROR_INVALID_STATE;
1430 if (0 >= g_slist_length(g_engine_list)) {
1431 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] There is no engine!!");
1432 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1435 return TTS_CONFIG_ERROR_NONE;
1439 int tts_config_mgr_get_engine_list(tts_config_supported_engine_cb callback, void* user_data)
1441 int ret = __check_precondition();
1442 if (TTS_CONFIG_ERROR_NONE != ret) {
1443 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Precondition is not met (%s)", get_error_message(ret));
1447 GSList *iter = NULL;
1448 tts_engine_info_s *engine_info = NULL;
1450 /* Get a first item */
1451 iter = g_slist_nth(g_engine_list, 0);
1453 while (NULL != iter) {
1454 engine_info = iter->data;
1456 if (NULL != engine_info) {
1457 if (false == callback(engine_info->uuid, engine_info->name, engine_info->setting, user_data)) {
1462 iter = g_slist_next(iter);
1465 return TTS_CONFIG_ERROR_NONE;
1468 int tts_config_mgr_get_engine(char** engine)
1470 int ret = __check_precondition();
1471 if (TTS_CONFIG_ERROR_NONE != ret) {
1472 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Precondition is not met (%s)", get_error_message(ret));
1476 if (NULL == engine) {
1477 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Input parameter is NULL");
1478 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1481 tts_config_s config_info;
1482 if (0 != tts_parser_get_config_info(&config_info)){
1483 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get configure information");
1484 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1487 tts_engine_info_s *engine_info = __get_engine_info(config_info.engine_id);
1488 if (NULL == engine_info) {
1489 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] engine info is NULL");
1490 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1493 *engine = strdup(config_info.engine_id);
1494 return TTS_CONFIG_ERROR_NONE;
1497 int __tts_set_buxtonkey(const char* engine)
1500 struct buxton_client * bux_cli;
1501 struct buxton_layer * bux_layer;
1502 struct buxton_value * bux_val;
1504 int ret = buxton_open(&bux_cli, NULL, NULL);
1506 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[DBUS-BUXTON2] buxton_open failed!! (%d)", ret);
1507 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1509 bux_layer = buxton_create_layer("system");
1510 if (NULL == bux_layer) {
1511 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[DBUS-BUXTON2] buxton_create_layer FAIL");
1512 buxton_close(bux_cli);
1513 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1515 bux_val = buxton_value_create_string(engine);
1516 if (NULL == bux_val) {
1517 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[DBUS-BUXTON2] buxton_value_create_string FAIL");
1518 buxton_free_layer(bux_layer);
1519 buxton_close(bux_cli);
1520 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1522 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[DBUS-BUXTON2] layer: %s", buxton_layer_get_name(bux_layer));
1525 ret = buxton_set_value_sync(bux_cli, bux_layer, TTS_ENGINE_DB_DEFAULT, bux_val);
1527 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[DBUS-BUXTON2] buxton_set_value_sync failed!! (%d)", ret);
1528 buxton_value_free(bux_val);
1529 buxton_free_layer(bux_layer);
1530 buxton_close(bux_cli);
1536 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1538 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[DBUS-BUXTON2] buxton_set_value_sync: %d, %s", ret, TTS_ENGINE_DB_DEFAULT);
1541 buxton_value_free(bux_val);
1542 buxton_free_layer(bux_layer);
1543 buxton_close(bux_cli);
1549 return TTS_CONFIG_ERROR_NONE;
1552 int tts_config_mgr_set_engine(const char* engine)
1554 int ret = __check_precondition();
1555 if (TTS_CONFIG_ERROR_NONE != ret) {
1556 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Precondition is not met (%s)", get_error_message(ret));
1561 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1563 tts_config_s config_info;
1564 if (0 != tts_parser_get_config_info(&config_info)){
1565 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get configure information");
1566 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1569 /* Check current engine id with new engine id */
1570 if (0 == strcmp(config_info.engine_id, engine))
1571 return TTS_CONFIG_ERROR_NONE;
1573 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "New engine id : %s", engine);
1575 ret = __tts_set_buxtonkey(engine);
1577 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[DEBUG] set_buxtonkey Fail!!");
1581 bool is_valid_engine = false;
1582 tts_engine_info_s *engine_info = __get_engine_info(engine);
1583 if (NULL != engine_info) {
1584 memset(g_engine_id, '\0', sizeof(g_engine_id));
1585 config_info.engine_id = g_engine_id;
1586 strncpy(config_info.engine_id, engine, sizeof(g_engine_id) - 1);
1588 if (NULL != engine_info->setting) {
1589 memset(g_setting, '\0', sizeof(g_setting));
1590 config_info.setting = g_setting;
1591 strncpy(config_info.setting, engine_info->setting, sizeof(g_setting) - 1);
1594 /* Engine is valid*/
1595 bool is_valid_voice = false;
1596 tts_config_voice_s* voice = __get_voice_info(engine_info, config_info.language, config_info.type);
1597 if (NULL != voice) {
1598 /* language is valid */
1599 is_valid_voice = true;
1600 config_info.type = voice->type;
1603 if (false == is_valid_voice) {
1604 __set_language_into_config(&config_info, NULL);
1606 GSList *iter_voice = g_slist_nth(engine_info->voices, 0);
1607 if (NULL != iter_voice) {
1608 voice = iter_voice->data;
1609 if (NULL != voice) {
1610 if (NULL != voice->language)
1611 strncpy(config_info.language, voice->language, sizeof(g_language) - 1);
1613 config_info.type = voice->type;
1618 is_valid_engine = true;
1621 if (0 != tts_parser_set_config_info(&config_info)) {
1622 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to set configure information");
1623 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1626 if (true == is_valid_engine) {
1627 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[Config] Engine changed");
1628 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " Engine : %s", config_info.engine_id);
1629 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " Setting : %s", config_info.setting);
1630 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " Language : %s", config_info.language);
1631 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " Type : %d", config_info.type);
1633 if (__is_client_type(TTS_CONFIG_CLIENT_TYPE_SETTING | TTS_CONFIG_CLIENT_TYPE_SERVER | TTS_CONFIG_CLIENT_TYPE_INTERRUPT)) {
1634 if (0 != tts_parser_set_engine(config_info.engine_id, config_info.setting,
1635 config_info.language, config_info.type)) {
1636 SLOG(LOG_ERROR, TAG_TTSCONFIG, " Fail to save config");
1637 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1640 SLOG(LOG_INFO, TAG_TTSCONFIG, "Client type is default. Skip saving configuration file.");
1643 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Engine id is not valid");
1644 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1647 return TTS_CONFIG_ERROR_NONE;
1650 int tts_config_mgr_get_voice_list(const char* engine_id, tts_config_supported_voice_cb callback, void* user_data)
1652 int ret = __check_precondition();
1653 if (TTS_CONFIG_ERROR_NONE != ret) {
1654 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Precondition is not met (%s)", get_error_message(ret));
1658 tts_engine_info_s *engine_info = __get_engine_info(engine_id);
1659 if (NULL == engine_info) {
1660 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] engine info is NULL");
1661 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1664 GSList *iter_voice = NULL;
1665 tts_config_voice_s* voice = NULL;
1667 /* Get a first item */
1668 iter_voice = g_slist_nth(engine_info->voices, 0);
1670 while (NULL != iter_voice) {
1671 /*Get handle data from list*/
1672 voice = iter_voice->data;
1674 SLOG(LOG_DEBUG, TAG_TTSCONFIG, " lang(%s) type(%d)", voice->language, voice->type);
1675 if (NULL != voice->language) {
1676 if (false == callback(engine_info->uuid, voice->language, voice->type, user_data))
1681 iter_voice = g_slist_next(iter_voice);
1684 return TTS_CONFIG_ERROR_NONE;
1687 int tts_config_mgr_get_voice(char** language, int* type)
1689 int ret = __check_precondition();
1690 if (TTS_CONFIG_ERROR_NONE != ret) {
1691 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Precondition is not met (%s)", get_error_message(ret));
1695 if (NULL == language || NULL == type)
1696 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1698 tts_config_s config_info;
1699 if (0 != tts_parser_get_config_info(&config_info)){
1700 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get configure information");
1701 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1704 if (0 != strlen(config_info.language)) {
1705 *language = strdup(config_info.language);
1706 *type = config_info.type;
1708 SLOG(LOG_ERROR, TAG_TTSCONFIG, "language is NULL");
1709 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1712 return TTS_CONFIG_ERROR_NONE;
1715 int tts_config_mgr_set_voice(const char* language, int type)
1717 int ret = __check_precondition();
1718 if (TTS_CONFIG_ERROR_NONE != ret) {
1719 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Precondition is not met (%s)", get_error_message(ret));
1723 if (NULL == language) {
1724 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Input parameter is NULL");
1725 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1728 tts_config_s config_info;
1729 if (0 != tts_parser_get_config_info(&config_info)){
1730 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get configure information");
1731 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1734 /* Check language is valid */
1735 if (__is_client_type(TTS_CONFIG_CLIENT_TYPE_SETTING | TTS_CONFIG_CLIENT_TYPE_SERVER | TTS_CONFIG_CLIENT_TYPE_INTERRUPT)) {
1736 if (0 != tts_parser_set_voice(language, type)) {
1737 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Fail to save default voice");
1738 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1741 SLOG(LOG_INFO, TAG_TTSCONFIG, "Client type is default. Skip saving configuration file.");
1744 __set_language_into_config(&config_info, language);
1745 config_info.type = type;
1747 if (0 != tts_parser_set_config_info(&config_info)){
1748 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to set configure information");
1749 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1752 return TTS_CONFIG_ERROR_NONE;
1755 int tts_config_mgr_get_auto_voice(bool* value)
1757 if (0 >= g_slist_length(g_config_client_list)) {
1758 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
1759 return TTS_CONFIG_ERROR_INVALID_STATE;
1763 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1765 tts_config_s config_info;
1766 if (0 != tts_parser_get_config_info(&config_info)){
1767 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get configure information");
1768 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1771 *value = config_info.auto_voice;
1773 return TTS_CONFIG_ERROR_NONE;
1776 int tts_config_mgr_set_auto_voice(bool value)
1778 if (0 >= g_slist_length(g_config_client_list)) {
1779 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
1780 return TTS_CONFIG_ERROR_INVALID_STATE;
1783 tts_config_s config_info;
1784 if (0 != tts_parser_get_config_info(&config_info)){
1785 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get configure information");
1786 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1789 if (config_info.auto_voice != value) {
1790 /* Check language is valid */
1791 if (__is_client_type(TTS_CONFIG_CLIENT_TYPE_SETTING | TTS_CONFIG_CLIENT_TYPE_SERVER | TTS_CONFIG_CLIENT_TYPE_INTERRUPT)) {
1792 if (0 != tts_parser_set_auto_voice(value)) {
1793 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Fail to save auto voice option");
1794 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1797 SLOG(LOG_INFO, TAG_TTSCONFIG, "Client type is default. Skip saving configuration file.");
1800 config_info.auto_voice = value;
1801 if (0 != tts_parser_set_config_info(&config_info)) {
1802 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to set configure information");
1803 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1806 if (true == config_info.auto_voice) {
1807 __tts_config_set_auto_language();
1809 if (__is_client_type(TTS_CONFIG_CLIENT_TYPE_SETTING | TTS_CONFIG_CLIENT_TYPE_SERVER | TTS_CONFIG_CLIENT_TYPE_INTERRUPT)) {
1810 if (0 != tts_parser_get_config_info(&config_info)){
1811 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get configure information");
1814 if (0 != tts_parser_set_voice(config_info.language, config_info.type)) {
1815 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to save config");
1821 return TTS_CONFIG_ERROR_NONE;
1824 int tts_config_mgr_get_speech_rate(int* value)
1826 if (0 >= g_slist_length(g_config_client_list)) {
1827 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
1828 return TTS_CONFIG_ERROR_INVALID_STATE;
1831 if (NULL == value) {
1832 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1835 tts_config_s config_info;
1836 if (0 != tts_parser_get_config_info(&config_info)){
1837 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get configure information");
1838 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1841 *value = config_info.speech_rate;
1843 return TTS_CONFIG_ERROR_NONE;
1846 int tts_config_mgr_set_speech_rate(int value)
1848 if (0 >= g_slist_length(g_config_client_list)) {
1849 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
1850 return TTS_CONFIG_ERROR_INVALID_STATE;
1853 if (TTS_CONFIG_SPEED_MIN <= value && value <= TTS_CONFIG_SPEED_MAX) {
1854 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[Config] Set speech rate : %d", value);
1855 if (__is_client_type(TTS_CONFIG_CLIENT_TYPE_SETTING | TTS_CONFIG_CLIENT_TYPE_SERVER | TTS_CONFIG_CLIENT_TYPE_INTERRUPT)) {
1856 if (0 != tts_parser_set_speech_rate(value)) {
1857 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Fail to save speech rate");
1858 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1861 SLOG(LOG_INFO, TAG_TTSCONFIG, "Client type is default. Skip saving configuration file.");
1864 tts_config_s config_info;
1865 if (0 != tts_parser_get_config_info(&config_info)){
1866 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get configure information");
1867 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1869 config_info.speech_rate = value;
1870 if (0 != tts_parser_set_config_info(&config_info)){
1871 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to set configure information");
1872 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1875 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[Config ERROR] Speech rate is invalid : %d", value);
1878 return TTS_CONFIG_ERROR_NONE;
1881 static int __check_engine_support_pitch(const char* engine_id)
1883 tts_engine_info_s *engine_info = __get_engine_info(engine_id);
1884 if (NULL == engine_info) {
1885 SLOG(LOG_ERROR, TAG_TTSCONFIG, "engine info is NULL");
1886 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1889 if (false == engine_info->pitch_support) {
1890 return TTS_CONFIG_ERROR_NOT_SUPPORTED_FEATURE;
1893 return TTS_CONFIG_ERROR_NONE;
1896 int tts_config_mgr_get_pitch(int* value)
1898 int ret = __check_precondition();
1899 if (TTS_CONFIG_ERROR_NONE != ret) {
1900 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Precondition is not met (%s)", get_error_message(ret));
1904 if (NULL == value) {
1905 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1908 tts_config_s config_info;
1909 if (0 != tts_parser_get_config_info(&config_info)){
1910 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get configure information");
1911 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1914 ret = __check_engine_support_pitch(config_info.engine_id);
1915 if (TTS_CONFIG_ERROR_NONE != ret) {
1919 *value = config_info.pitch;
1921 return TTS_CONFIG_ERROR_NONE;
1924 int tts_config_mgr_set_pitch(int value)
1926 int ret = __check_precondition();
1927 if (TTS_CONFIG_ERROR_NONE != ret) {
1928 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Precondition is not met (%s)", get_error_message(ret));
1932 tts_config_s config_info;
1933 if (0 != tts_parser_get_config_info(&config_info)){
1934 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get configure information");
1935 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1938 ret = __check_engine_support_pitch(config_info.engine_id);
1939 if (TTS_CONFIG_ERROR_NONE != ret) {
1943 if (__is_client_type(TTS_CONFIG_CLIENT_TYPE_SETTING | TTS_CONFIG_CLIENT_TYPE_SERVER | TTS_CONFIG_CLIENT_TYPE_INTERRUPT)) {
1944 if (0 != tts_parser_set_pitch(value)) {
1945 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Fail to save speech rate");
1946 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1949 SLOG(LOG_INFO, TAG_TTSCONFIG, "Client type is default. Skip saving configuration file.");
1952 config_info.pitch = value;
1954 if (0 != tts_parser_set_config_info(&config_info)){
1955 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to set configure information");
1956 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1958 return TTS_CONFIG_ERROR_NONE;
1961 int tts_config_mgr_get_bg_volume_ratio(double *value)
1963 if (0 >= g_slist_length(g_config_client_list)) {
1964 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
1965 return TTS_CONFIG_ERROR_INVALID_STATE;
1969 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1971 tts_config_s config_info;
1972 if (0 != tts_parser_get_config_info(&config_info)){
1973 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get configure information");
1974 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1977 *value = config_info.bg_volume_ratio;
1979 return TTS_CONFIG_ERROR_NONE;
1982 int tts_config_mgr_set_bg_volume_ratio(double value)
1984 if (0 >= g_slist_length(g_config_client_list)) {
1985 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
1986 return TTS_CONFIG_ERROR_INVALID_STATE;
1989 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[Config] Set bg volume ratio : %lf", value);
1990 if (__is_client_type(TTS_CONFIG_CLIENT_TYPE_SETTING | TTS_CONFIG_CLIENT_TYPE_SERVER | TTS_CONFIG_CLIENT_TYPE_INTERRUPT)) {
1991 if (0 != tts_parser_set_bg_volume_ratio(value)) {
1992 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Fail to save bg volume ratio");
1993 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1996 SLOG(LOG_INFO, TAG_TTSCONFIG, "Client type is default. Skip saving configuration file.");
1999 tts_config_s config_info;
2000 if (0 != tts_parser_get_config_info(&config_info)){
2001 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get configure information");
2002 return TTS_CONFIG_ERROR_OPERATION_FAILED;
2005 config_info.bg_volume_ratio = value;
2007 if (0 != tts_parser_set_config_info(&config_info)){
2008 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to set configure information");
2009 return TTS_CONFIG_ERROR_OPERATION_FAILED;
2012 return TTS_CONFIG_ERROR_NONE;
2015 bool tts_config_check_default_engine_is_valid(const char* engine)
2017 int ret = __check_precondition();
2018 if (TTS_CONFIG_ERROR_NONE != ret) {
2019 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Precondition is not met (%s)", get_error_message(ret));
2026 tts_engine_info_s *engine_info = __get_engine_info(engine);
2027 if (NULL == engine_info) {
2028 SLOG(LOG_ERROR, TAG_TTSCONFIG, "engine info is NULL");
2035 bool tts_config_check_default_voice_is_valid(const char* language, int type)
2037 if (0 >= g_slist_length(g_config_client_list)) {
2038 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
2042 tts_config_s config_info;
2043 if (0 != tts_parser_get_config_info(&config_info)){
2044 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get configure information");
2048 if (0 == strlen(config_info.engine_id)) {
2049 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Default engine id is NULL");
2053 return __tts_config_mgr_check_lang_is_valid(config_info.engine_id, language, type);
2057 int __tts_config_mgr_print_engine_info()
2059 GSList *iter = NULL;
2060 tts_engine_info_s *engine_info = NULL;
2062 if (0 >= g_slist_length(g_engine_list)) {
2063 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "-------------- engine list -----------------");
2064 SLOG(LOG_DEBUG, TAG_TTSCONFIG, " No Engine in engine directory");
2065 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "--------------------------------------------");
2066 return TTS_CONFIG_ERROR_NONE;
2069 /* Get a first item */
2070 iter = g_slist_nth(g_engine_list, 0);
2072 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "--------------- engine list -----------------");
2075 while (NULL != iter) {
2076 engine_info = iter->data;
2078 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[%dth]", i);
2079 SLOG(LOG_DEBUG, TAG_TTSCONFIG, " name : %s", engine_info->name);
2080 SLOG(LOG_DEBUG, TAG_TTSCONFIG, " id : %s", engine_info->uuid);
2081 SLOG(LOG_DEBUG, TAG_TTSCONFIG, " setting : %s", engine_info->setting);
2083 SLOG(LOG_DEBUG, TAG_TTSCONFIG, " Voices");
2084 GSList *iter_voice = NULL;
2085 tts_config_voice_s* voice = NULL;
2087 if (g_slist_length(engine_info->voices) > 0) {
2088 /* Get a first item */
2089 iter_voice = g_slist_nth(engine_info->voices, 0);
2092 while (NULL != iter_voice) {
2093 /*Get handle data from list*/
2094 voice = iter_voice->data;
2096 SLOG(LOG_DEBUG, TAG_TTSCONFIG, " [%dth] lang(%s) type(%d)", j, voice->language, voice->type);
2099 iter_voice = g_slist_next(iter_voice);
2103 SLOG(LOG_ERROR, TAG_TTSCONFIG, " Voice is NONE");
2105 iter = g_slist_next(iter);
2108 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "--------------------------------------------");
2110 return TTS_CONFIG_ERROR_NONE;
2113 int tts_config_mgr_get_max_text_size(unsigned int* size)
2115 int ret = __check_precondition();
2116 if (TTS_CONFIG_ERROR_NONE != ret) {
2117 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Precondition is not met (%s)", get_error_message(ret));
2122 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
2125 tts_config_s config_info;
2126 if (0 != tts_parser_get_config_info(&config_info)){
2127 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get configure information");
2128 return TTS_CONFIG_ERROR_OPERATION_FAILED;
2131 tts_engine_info_s *engine_info = __get_engine_info(config_info.engine_id);
2132 if (NULL == engine_info) {
2133 SLOG(LOG_ERROR, TAG_TTSCONFIG, "engine info is NULL");
2134 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
2137 *size = engine_info->text_size;
2138 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[DEBUG] Max text size is %d.", *size);
2140 return TTS_CONFIG_ERROR_NONE;