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"
31 tts_config_engine_changed_cb engine_cb;
32 tts_config_voice_changed_cb voice_cb;
33 tts_config_speech_rate_changed_cb speech_cb;
34 tts_config_screen_reader_changed_cb screen_cb;
35 tts_config_pitch_changed_cb pitch_cb;
37 } tts_config_client_s;
39 extern char* tts_tag();
41 static GSList* g_engine_list = NULL;
43 static GSList* g_config_client_list = NULL;
45 static tts_config_s* g_config_info = NULL;
47 static Ecore_Fd_Handler* g_config_fd_handler_noti = NULL;
48 static int g_config_fd_noti;
49 static int g_config_wd_noti;
51 /* For engine directory monitoring */
53 Ecore_Fd_Handler* dir_fd_handler;
56 } tts_engine_inotify_s;
58 static GList* g_ino_list = NULL;
60 int __tts_config_mgr_print_engine_info();
61 static int __tts_config_mgr_register_engine_config_updated_event(const char* path);
62 static int __tts_config_mgr_unregister_engine_config_updated_event();
64 int __tts_config_mgr_check_engine_is_valid(const char* engine_id)
66 if (NULL == engine_id) {
67 SLOG(LOG_ERROR, tts_tag(), "Input parameter is NULL");
72 tts_engine_info_s *engine_info = NULL;
74 if (0 >= g_slist_length(g_engine_list)) {
75 SLOG(LOG_ERROR, tts_tag(), "There is no engine!!");
79 /* Get a first item */
80 iter = g_slist_nth(g_engine_list, 0);
82 while (NULL != iter) {
83 engine_info = iter->data;
85 if (NULL == engine_info) {
86 SLOG(LOG_ERROR, tts_tag(), "engine info is NULL");
90 if (NULL != engine_info->uuid && 0 == strcmp(engine_id, engine_info->uuid)) {
91 SLOG(LOG_DEBUG, tts_tag(), "Default engine is valid : %s", engine_id);
95 iter = g_slist_next(iter);
98 /* Change default engine */
99 iter = g_slist_nth(g_engine_list, 0);
101 SLOG(LOG_ERROR, tts_tag(), "[ERROR] No engine in list");
102 return TTS_CONFIG_ERROR_OPERATION_FAILED;
105 engine_info = iter->data;
106 if (NULL == g_config_info) {
107 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Invalid engine info in list");
108 return TTS_CONFIG_ERROR_OPERATION_FAILED;
111 if (NULL != engine_info->uuid) {
112 if (NULL != g_config_info->engine_id) {
113 free(g_config_info->engine_id);
114 g_config_info->engine_id = NULL;
116 g_config_info->engine_id = strdup(engine_info->uuid);
118 if (NULL != engine_info->setting) {
119 if (NULL != g_config_info->setting) {
120 free(g_config_info->setting);
121 g_config_info->setting = NULL;
123 g_config_info->setting = strdup(engine_info->setting);
126 if (NULL == g_config_info->engine_id || NULL == g_config_info->setting) {
127 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to strdup engine_info");
131 SLOG(LOG_DEBUG, tts_tag(), "Default engine is changed : %s", g_config_info->engine_id);
133 /* Change is default voice */
134 GSList *iter_voice = NULL;
135 tts_config_voice_s* voice = NULL;
136 bool is_valid_voice = false;
138 /* Get a first item */
139 iter_voice = g_slist_nth(engine_info->voices, 0);
141 while (NULL != iter_voice) {
142 /*Get handle data from list*/
143 voice = iter_voice->data;
146 if (NULL != voice->language && NULL != g_config_info->language) {
147 if (0 == strcmp(voice->language, g_config_info->language)) {
148 if (voice->type == g_config_info->type) {
149 /* language is valid */
150 is_valid_voice = true;
152 free(g_config_info->language);
153 g_config_info->language = NULL;
154 g_config_info->language = strdup(voice->language);
155 if (NULL == g_config_info->language) {
156 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to strdup language");
157 return TTS_CONFIG_ERROR_OPERATION_FAILED;
159 g_config_info->type = voice->type;
161 SLOG(LOG_DEBUG, tts_tag(), "Default voice is changed : lang(%s) type(%d)", voice->language, voice->type);
168 iter_voice = g_slist_next(iter_voice);
171 if (false == is_valid_voice) {
172 /* Select first voice as default */
173 if (NULL != g_config_info->language) {
174 free(g_config_info->language);
175 g_config_info->language = NULL;
177 iter_voice = g_slist_nth(engine_info->voices, 0);
178 if (NULL == iter_voice) {
179 SLOG(LOG_ERROR, tts_tag(), "Fail to get voice list");
180 return TTS_CONFIG_ERROR_OPERATION_FAILED;
182 voice = iter_voice->data;
184 if (NULL == voice || NULL == voice->language) {
185 SLOG(LOG_ERROR, tts_tag(), "Fail to get voice info from list");
186 return TTS_CONFIG_ERROR_OPERATION_FAILED;
189 g_config_info->language = strdup(voice->language);
190 if (NULL == g_config_info->language) {
191 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to strdup language");
192 return TTS_CONFIG_ERROR_OPERATION_FAILED;
194 g_config_info->type = voice->type;
195 SLOG(LOG_DEBUG, tts_tag(), "Default voice is changed : lang(%s) type(%d)", voice->language, voice->type);
199 if (0 != tts_parser_set_engine(g_config_info->engine_id, g_config_info->setting,
200 g_config_info->language, g_config_info->type)) {
201 SLOG(LOG_ERROR, tts_tag(), " Fail to save config");
202 return TTS_CONFIG_ERROR_OPERATION_FAILED;
208 bool __tts_config_mgr_check_lang_is_valid(const char* engine_id, const char* language, int type)
210 if (NULL == engine_id || NULL == language) {
211 SLOG(LOG_ERROR, tts_tag(), "Input parameter is NULL");
216 tts_engine_info_s *engine_info = NULL;
218 if (0 >= g_slist_length(g_engine_list)) {
219 SLOG(LOG_ERROR, tts_tag(), "There is no engine!!");
223 /* Get a first item */
224 iter = g_slist_nth(g_engine_list, 0);
226 while (NULL != iter) {
227 engine_info = iter->data;
229 if (NULL == engine_info) {
230 SLOG(LOG_ERROR, tts_tag(), "engine info is NULL");
234 if (0 != strcmp(engine_id, engine_info->uuid)) {
235 iter = g_slist_next(iter);
239 GSList *iter_voice = NULL;
240 tts_config_voice_s* voice = NULL;
242 if (g_slist_length(engine_info->voices) <= 0) {
243 SLOG(LOG_ERROR, tts_tag(), "There is no voice : %s", engine_info->uuid);
244 iter = g_slist_next(iter);
248 /* Get a first item */
249 iter_voice = g_slist_nth(engine_info->voices, 0);
252 while (NULL != iter_voice) {
253 /*Get handle data from list*/
254 voice = iter_voice->data;
257 if (0 == strcmp(language, voice->language)) {
258 if (type == voice->type) {
265 iter_voice = g_slist_next(iter_voice);
275 int __tts_config_mgr_select_lang(const char* engine_id, char** language, int* type)
277 if (NULL == engine_id || NULL == language) {
278 SLOG(LOG_ERROR, tts_tag(), "Input parameter is NULL");
283 tts_engine_info_s *engine_info = NULL;
285 if (0 >= g_slist_length(g_engine_list)) {
286 SLOG(LOG_ERROR, tts_tag(), "There is no engine!!");
290 /* Get a first item */
291 iter = g_slist_nth(g_engine_list, 0);
293 while (NULL != iter) {
294 engine_info = iter->data;
296 if (NULL == engine_info) {
297 SLOG(LOG_ERROR, tts_tag(), "engine info is NULL");
301 if (0 != strcmp(engine_id, engine_info->uuid)) {
302 iter = g_slist_next(iter);
306 GSList *iter_voice = NULL;
307 tts_config_voice_s* voice = NULL;
309 if (g_slist_length(engine_info->voices) <= 0) {
310 SLOG(LOG_ERROR, tts_tag(), "There is no voice : %s", engine_info->uuid);
314 /* Get a first item */
315 iter_voice = g_slist_nth(engine_info->voices, 0);
317 while (NULL != iter_voice) {
318 voice = iter_voice->data;
320 /* Default language */
321 if (0 == strcmp(TTS_BASE_LANGUAGE, voice->language)) {
322 *language = strdup(voice->language);
325 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Selected language(%s) type(%d)", *language, *type);
329 iter_voice = g_slist_next(iter_voice);
332 /* Not support base language */
334 *language = strdup(voice->language);
337 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Selected language(%s) type(%d)", *language, *type);
346 Eina_Bool tts_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handler)
348 SLOG(LOG_DEBUG, tts_tag(), "===== Config changed callback event");
351 struct inotify_event event;
352 memset(&event, '\0', sizeof(struct inotify_event));
354 length = read(g_config_fd_noti, &event, sizeof(struct inotify_event));
356 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Empty Inotify event");
357 SLOG(LOG_DEBUG, tts_tag(), "=====");
358 SLOG(LOG_DEBUG, tts_tag(), " ");
359 return ECORE_CALLBACK_DONE;
362 if (IN_CLOSE_WRITE == event.mask) {
363 /* check config changed state */
365 char* setting = NULL;
367 bool auto_voice = g_config_info->auto_voice;
369 int speech_rate = -1;
373 tts_config_client_s* temp_client = NULL;
375 if (0 != tts_parser_find_config_changed(&engine, &setting, &auto_voice, &lang, &voice_type, &speech_rate, &pitch))
376 return ECORE_CALLBACK_PASS_ON;
379 if (NULL != engine || NULL != setting) {
380 if (NULL != engine) {
381 if (NULL != g_config_info->engine_id) {
382 free(g_config_info->engine_id);
383 g_config_info->engine_id = NULL;
386 g_config_info->engine_id = strdup(engine);
387 if (NULL == g_config_info->engine_id) {
388 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to strdup engine_id");
389 return ECORE_CALLBACK_DONE;
392 if (NULL != setting) {
393 if (NULL != g_config_info->setting) {
394 free(g_config_info->setting);
395 g_config_info->setting = NULL;
398 g_config_info->setting = strdup(setting);
399 if (NULL == g_config_info->setting) {
400 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to strdup setting");
401 return ECORE_CALLBACK_DONE;
405 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Engine change(%s)", g_config_info->engine_id);
407 /* Call all callbacks of client*/
408 iter = g_slist_nth(g_config_client_list, 0);
410 while (NULL != iter) {
411 temp_client = iter->data;
413 if (NULL != temp_client) {
414 if (NULL != temp_client->engine_cb) {
415 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Engine changed callback : uid(%d)", temp_client->uid);
416 temp_client->engine_cb(g_config_info->engine_id, g_config_info->setting,
417 g_config_info->language, g_config_info->type,
418 g_config_info->auto_voice, g_config_info->credential, temp_client->user_data);
422 iter = g_slist_next(iter);
426 if (auto_voice != g_config_info->auto_voice) {
427 g_config_info->auto_voice = auto_voice;
430 if (NULL != lang || -1 != voice_type) {
431 char* before_lang = NULL;
434 before_lang = strdup(g_config_info->language);
435 before_type = g_config_info->type;
438 if (NULL != g_config_info->language) {
439 free(g_config_info->language);
440 g_config_info->language = NULL;
443 g_config_info->language = strdup(lang);
444 if (NULL == g_config_info->language) {
445 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to strdup lang");
448 if (-1 != voice_type) {
449 g_config_info->type = voice_type;
452 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Voice change(%s, %d)", g_config_info->language, g_config_info->type);
454 /* Call all callbacks of client*/
455 iter = g_slist_nth(g_config_client_list, 0);
457 while (NULL != iter) {
458 temp_client = iter->data;
460 if (NULL != temp_client) {
461 if (NULL != temp_client->voice_cb) {
462 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Voice changed callback : uid(%d)", temp_client->uid);
463 temp_client->voice_cb(before_lang, before_type,
464 g_config_info->language, g_config_info->type,
465 g_config_info->auto_voice, temp_client->user_data);
469 iter = g_slist_next(iter);
472 if (NULL != before_lang) {
477 if (-1 != speech_rate) {
478 g_config_info->speech_rate = speech_rate;
480 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Speech rate change(%d)", g_config_info->speech_rate);
482 /* Call all callbacks of client*/
483 iter = g_slist_nth(g_config_client_list, 0);
485 while (NULL != iter) {
486 temp_client = iter->data;
488 if (NULL != temp_client) {
489 if (NULL != temp_client->speech_cb) {
490 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Speech rate changed callback : uid(%d)", temp_client->uid);
491 temp_client->speech_cb(g_config_info->speech_rate, temp_client->user_data);
495 iter = g_slist_next(iter);
500 g_config_info->pitch = pitch;
502 SECURE_SLOG(LOG_DEBUG, tts_tag(), "pitch change(%d)", g_config_info->pitch);
504 /* Call all callbacks of client*/
505 iter = g_slist_nth(g_config_client_list, 0);
507 while (NULL != iter) {
508 temp_client = iter->data;
510 if (NULL != temp_client) {
511 if (NULL != temp_client->pitch_cb) {
512 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Pitch changed callback : uid(%d)", temp_client->uid);
513 temp_client->pitch_cb(g_config_info->pitch, temp_client->user_data);
517 iter = g_slist_next(iter);
521 if (NULL != engine) free(engine);
522 if (NULL != setting) free(setting);
523 if (NULL != lang) free(lang);
525 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Undefined event");
528 SLOG(LOG_DEBUG, tts_tag(), "=====");
529 SLOG(LOG_DEBUG, tts_tag(), " ");
531 return ECORE_CALLBACK_PASS_ON;
534 int __tts_config_mgr_register_config_event()
536 /* get file notification handler */
542 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail get inotify fd");
545 g_config_fd_noti = fd;
547 wd = inotify_add_watch(fd, TTS_CONFIG, IN_CLOSE_WRITE);
548 g_config_wd_noti = wd;
550 g_config_fd_handler_noti = ecore_main_fd_handler_add(fd, ECORE_FD_READ,
551 (Ecore_Fd_Cb)tts_config_mgr_inotify_event_cb, NULL, NULL, NULL);
552 if (NULL == g_config_fd_handler_noti) {
553 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get handler_noti");
557 /* Set non-blocking mode of file */
559 value = fcntl(fd, F_GETFL, 0);
562 if (0 > fcntl(fd, F_SETFL, value)) {
563 SLOG(LOG_WARN, tts_tag(), "[WARNING] Fail to set non-block mode");
569 int __tts_config_mgr_unregister_config_event()
571 /* delete inotify variable */
572 ecore_main_fd_handler_del(g_config_fd_handler_noti);
573 inotify_rm_watch(g_config_fd_noti, g_config_wd_noti);
574 close(g_config_fd_noti);
579 int __tts_config_set_auto_language()
582 value = vconf_get_str(TTS_LANGSET_KEY);
584 SLOG(LOG_ERROR, tts_tag(), "[Config ERROR] Fail to get display language");
588 char temp_lang[6] = {'\0', };
589 strncpy(temp_lang, value, 5);
592 if (true == __tts_config_mgr_check_lang_is_valid(g_config_info->engine_id, temp_lang, g_config_info->type)) {
593 /* tts default voice change */
594 if (NULL == g_config_info->language) {
595 SLOG(LOG_ERROR, tts_tag(), "Current config language is NULL");
599 char* before_lang = NULL;
602 if (0 != tts_parser_set_voice(temp_lang, g_config_info->type)) {
603 SLOG(LOG_ERROR, tts_tag(), "Fail to save default voice");
607 before_lang = strdup(g_config_info->language);
608 before_type = g_config_info->type;
610 free(g_config_info->language);
611 g_config_info->language = NULL;
612 g_config_info->language = strdup(temp_lang);
613 if (NULL == g_config_info->language) {
614 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to strdup temp_lang");
618 SECURE_SLOG(LOG_DEBUG, tts_tag(), "[Config] Default voice : lang(%s) type(%d)",
619 g_config_info->language, g_config_info->type);
622 tts_config_client_s* temp_client = NULL;
624 /* Call all callbacks of client*/
625 iter = g_slist_nth(g_config_client_list, 0);
627 while (NULL != iter) {
628 temp_client = iter->data;
630 if (NULL != temp_client) {
631 if (NULL != temp_client->voice_cb) {
632 temp_client->voice_cb(before_lang, before_type,
633 g_config_info->language, g_config_info->type,
634 g_config_info->auto_voice, temp_client->user_data);
638 iter = g_slist_next(iter);
641 if (NULL != before_lang) {
645 /* Display language is not valid */
646 char* tmp_language = NULL;
648 if (0 != __tts_config_mgr_select_lang(g_config_info->engine_id, &tmp_language, &tmp_type)) {
649 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to select language");
653 if (NULL == tmp_language) {
654 SLOG(LOG_ERROR, tts_tag(), "[ERROR] language is NULL");
658 if (0 != tts_parser_set_voice(tmp_language, tmp_type)) {
659 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to save config");
663 SECURE_SLOG(LOG_DEBUG, tts_tag(), "[Config] Default voice : lang(%s) type(%d)",
664 tmp_language, tmp_type);
667 tts_config_client_s* temp_client = NULL;
669 /* Call all callbacks of client*/
670 iter = g_slist_nth(g_config_client_list, 0);
672 while (NULL != iter) {
673 temp_client = iter->data;
675 if (NULL != temp_client) {
676 if (NULL != temp_client->voice_cb) {
677 temp_client->voice_cb(g_config_info->language, g_config_info->type,
678 tmp_language, tmp_type, g_config_info->auto_voice, temp_client->user_data);
682 iter = g_slist_next(iter);
685 if (NULL != g_config_info->language) {
686 free(g_config_info->language);
687 g_config_info->language = NULL;
688 g_config_info->language = strdup(tmp_language);
689 if (NULL == g_config_info->language) {
690 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to strdup tmp_language");
695 g_config_info->type = tmp_type;
704 void __tts_config_display_language_changed_cb(keynode_t *key, void *data)
706 if (true == g_config_info->auto_voice) {
707 __tts_config_set_auto_language();
713 void __tts_config_screen_reader_changed_cb(keynode_t *key, void *data)
717 ret = vconf_get_bool(TTS_ACCESSIBILITY_KEY, &screen_reader);
719 SLOG(LOG_ERROR, tts_tag(), "[Config ERROR] Fail to get screen reader");
724 tts_config_client_s* temp_client = NULL;
726 /* Call all callbacks of client*/
727 iter = g_slist_nth(g_config_client_list, 0);
729 while (NULL != iter) {
730 temp_client = iter->data;
732 if (NULL != temp_client) {
733 if (NULL != temp_client->screen_cb) {
734 temp_client->screen_cb((bool)screen_reader);
738 iter = g_slist_next(iter);
742 int __tts_config_release_client(int uid)
745 tts_config_client_s* temp_client = NULL;
747 if (0 < g_slist_length(g_config_client_list)) {
749 iter = g_slist_nth(g_config_client_list, 0);
751 while (NULL != iter) {
752 temp_client = iter->data;
754 if (NULL != temp_client) {
755 if (uid == temp_client->uid) {
756 g_config_client_list = g_slist_remove(g_config_client_list, temp_client);
763 iter = g_slist_next(iter);
767 SLOG(LOG_DEBUG, tts_tag(), "Client count (%d)", g_slist_length(g_config_client_list));
769 return g_slist_length(g_config_client_list);
772 void __tts_config_release_engine()
775 tts_engine_info_s *engine_info = NULL;
777 if (0 < g_slist_length(g_engine_list)) {
779 /* Get a first item */
780 iter = g_slist_nth(g_engine_list, 0);
782 while (NULL != iter) {
783 engine_info = iter->data;
785 if (NULL != engine_info) {
786 g_engine_list = g_slist_remove(g_engine_list, engine_info);
788 tts_parser_free_engine_info(engine_info);
791 iter = g_slist_nth(g_engine_list, 0);
798 int __tts_config_mgr_get_engine_info()
803 struct dirent *dirp = NULL;
805 char filepath[512] = {'\0',};
807 tts_engine_info_s* info = NULL;
809 __tts_config_release_engine();
810 g_engine_list = NULL;
811 __tts_config_mgr_unregister_engine_config_updated_event();
813 /* Copy default info directory to download directory */
814 dp = opendir(TTS_DEFAULT_ENGINE_INFO);
816 SLOG(LOG_DEBUG, tts_tag(), "[CONFIG] No default directory : %s", TTS_DEFAULT_ENGINE_INFO);
819 ret = readdir_r(dp, &entry, &dirp);
821 SLOG(LOG_ERROR, tts_tag(), "[CONFIG] Fail to read directory");
826 if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name))
829 filesize = strlen(TTS_DEFAULT_ENGINE_INFO) + strlen(dirp->d_name) + 2;
830 if (filesize >= 512) {
831 SECURE_SLOG(LOG_ERROR, tts_tag(), "[CONFIG ERROR] File path is too long : %s", dirp->d_name);
836 memset(filepath, '\0', 512);
837 snprintf(filepath, 512, "%s/%s", TTS_DEFAULT_ENGINE_INFO, dirp->d_name);
839 SECURE_SLOG(LOG_DEBUG, tts_tag(), "[CONFIG] Filepath(%s)", filepath);
841 char dest[512] = {'\0',};
842 snprintf(dest, 512, "%s/%s", TTS_DOWNLOAD_ENGINE_INFO, dirp->d_name);
844 if (0 != access(dest, F_OK)) {
845 if (0 != tts_parser_copy_xml(filepath, dest)) {
846 SLOG(LOG_ERROR, tts_tag(), "[CONFIG ERROR] Fail to copy engine info");
850 } while (NULL != dirp);
855 /* Get engine info from default engine directory */
856 dp = opendir(TTS_DOWNLOAD_ENGINE_INFO);
858 SLOG(LOG_DEBUG, tts_tag(), "[CONFIG] No downloadable directory : %s", TTS_DOWNLOAD_ENGINE_INFO);
861 ret = readdir_r(dp, &entry, &dirp);
863 SLOG(LOG_ERROR, tts_tag(), "[CONFIG] Fail to read directory");
868 if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name))
871 filesize = strlen(TTS_DOWNLOAD_ENGINE_INFO) + strlen(dirp->d_name) + 2;
872 if (filesize >= 512) {
873 SECURE_SLOG(LOG_ERROR, tts_tag(), "[CONFIG ERROR] File path is too long : %s", dirp->d_name);
878 memset(filepath, '\0', 512);
879 snprintf(filepath, 512, "%s/%s", TTS_DOWNLOAD_ENGINE_INFO, dirp->d_name);
881 SECURE_SLOG(LOG_DEBUG, tts_tag(), "[CONFIG] Filepath(%s)", filepath);
883 if (0 == tts_parser_get_engine_info(filepath, &info)) {
884 g_engine_list = g_slist_append(g_engine_list, info);
885 if (0 != __tts_config_mgr_register_engine_config_updated_event(filepath)) {
886 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to register engine config updated event");
890 } while (NULL != dirp);
895 if (0 >= g_slist_length(g_engine_list)) {
896 SLOG(LOG_ERROR, tts_tag(), "[ERROR] No engine");
903 static Eina_Bool __tts_config_mgr_engine_config_inotify_event_callback(void* data, Ecore_Fd_Handler *fd_handler)
905 SLOG(LOG_DEBUG, tts_tag(), "===== Engine config updated callback event");
907 tts_engine_inotify_s *ino = (tts_engine_inotify_s *)data;
908 int dir_fd = ino->dir_fd;
911 struct inotify_event event;
912 memset(&event, '\0', sizeof(struct inotify_event));
914 length = read(dir_fd, &event, sizeof(struct inotify_event));
916 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Empty Inotify event");
917 SLOG(LOG_DEBUG, tts_tag(), "=====");
918 SLOG(LOG_DEBUG, tts_tag(), " ");
919 return ECORE_CALLBACK_DONE;
922 if (IN_CLOSE_WRITE == event.mask) {
923 int ret = __tts_config_mgr_get_engine_info();
925 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get engine info when config updated");
927 __tts_config_mgr_print_engine_info();
928 bool support = tts_config_check_default_voice_is_valid(g_config_info->language, g_config_info->type);
929 if (false == support) {
930 SLOG(LOG_DEBUG, tts_tag(), "[ERROR] Default voice is valid");
931 char* temp_lang = NULL;
933 ret = __tts_config_mgr_select_lang(g_config_info->engine_id, &temp_lang, &temp_type);
935 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get voice");
938 ret = tts_config_mgr_set_voice(temp_lang, temp_type);
940 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to set voice");
942 SLOG(LOG_DEBUG, tts_tag(), "[DEBUG] Saved default voice : lang(%s), type(%d)", g_config_info->language, g_config_info->type);
944 if (NULL != temp_lang) free(temp_lang);
948 tts_config_client_s* temp_client = NULL;
949 /* Call all callbacks of client*/
950 iter = g_slist_nth(g_config_client_list, 0);
952 while (NULL != iter) {
953 temp_client = iter->data;
955 if (NULL != temp_client) {
956 if (NULL != temp_client->engine_cb) {
957 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Engine changed callback : uid(%d)", temp_client->uid);
958 temp_client->engine_cb(g_config_info->engine_id, g_config_info->setting,
959 g_config_info->language, g_config_info->type,
960 g_config_info->auto_voice, g_config_info->credential, temp_client->user_data);
964 iter = g_slist_next(iter);
967 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Undefined event");
970 SLOG(LOG_DEBUG, tts_tag(), "=====");
971 SLOG(LOG_DEBUG, tts_tag(), " ");
973 return ECORE_CALLBACK_PASS_ON;
976 static int __tts_config_mgr_register_engine_config_updated_event(const char* path)
979 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Path is NULL");
983 /* For engine directory monitoring */
984 tts_engine_inotify_s *ino = (tts_engine_inotify_s *)calloc(1, sizeof(tts_engine_inotify_s));
986 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to allocate memory");
990 ino->dir_fd = inotify_init();
991 if (ino->dir_fd < 0) {
992 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to init inotify");
999 ino->dir_wd = inotify_add_watch(ino->dir_fd, path, IN_CLOSE_WRITE);
1000 SLOG(LOG_DEBUG, tts_tag(), "Add inotify watch(%s)", path);
1001 if (ino->dir_wd < 0) {
1002 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to add watch");
1008 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);
1009 if (NULL == ino->dir_fd_handler) {
1010 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to add fd handler");
1016 /* Set non-blocking mode of file */
1018 value = fcntl(ino->dir_fd, F_GETFL, 0);
1019 value |= O_NONBLOCK;
1021 if (0 > fcntl(ino->dir_fd, F_SETFL, value)) {
1022 SLOG(LOG_WARN, tts_tag(), "[WARNING] Fail to set non-block mode");
1025 g_ino_list = g_list_append(g_ino_list, ino);
1030 static int __tts_config_mgr_unregister_engine_config_updated_event()
1032 /* delete all inotify variable */
1033 if (0 < g_list_length(g_ino_list)) {
1035 iter = g_list_first(g_ino_list);
1037 while (NULL != iter) {
1038 tts_engine_inotify_s *tmp = iter->data;
1041 ecore_main_fd_handler_del(tmp->dir_fd_handler);
1042 inotify_rm_watch(tmp->dir_fd, tmp->dir_wd);
1048 g_ino_list = g_list_remove_link(g_ino_list, iter);
1050 iter = g_list_first(g_ino_list);
1057 int tts_config_mgr_initialize(int uid)
1059 GSList *iter = NULL;
1061 tts_config_client_s* temp_client = NULL;
1064 if (0 < g_slist_length(g_config_client_list)) {
1066 iter = g_slist_nth(g_config_client_list, 0);
1068 while (NULL != iter) {
1069 get_uid = iter->data;
1071 if (uid == *get_uid) {
1072 SECURE_SLOG(LOG_WARN, tts_tag(), "[CONFIG] uid(%d) has already registered", uid);
1076 iter = g_slist_next(iter);
1079 temp_client = (tts_config_client_s*)calloc(1, sizeof(tts_config_client_s));
1080 if (NULL == temp_client) {
1081 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to allocate memory");
1082 return TTS_CONFIG_ERROR_OUT_OF_MEMORY;
1084 temp_client->uid = uid;
1086 g_config_client_list = g_slist_append(g_config_client_list, temp_client);
1088 SECURE_SLOG(LOG_WARN, tts_tag(), "[CONFIG] Add uid(%d) but config has already initialized", uid);
1091 temp_client = (tts_config_client_s*)calloc(1, sizeof(tts_config_client_s));
1092 if (NULL == temp_client) {
1093 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to allocate memory");
1094 return TTS_CONFIG_ERROR_OUT_OF_MEMORY;
1096 temp_client->uid = uid;
1098 g_config_client_list = g_slist_append(g_config_client_list, temp_client);
1101 if (0 != access(TTS_CONFIG_BASE, F_OK)) {
1102 if (0 != mkdir(TTS_CONFIG_BASE, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
1103 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to make directory : %s", TTS_CONFIG_BASE);
1104 __tts_config_release_client(uid);
1105 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1107 SLOG(LOG_DEBUG, tts_tag(), "Success to make directory : %s", TTS_CONFIG_BASE);
1111 if (0 != access(TTS_HOME, F_OK)) {
1112 if (0 != mkdir(TTS_HOME, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
1113 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to make directory : %s", TTS_HOME);
1114 __tts_config_release_client(uid);
1115 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1117 SLOG(LOG_DEBUG, tts_tag(), "Success to make directory : %s", TTS_HOME);
1121 if (0 != access(TTS_DOWNLOAD_BASE, F_OK)) {
1122 if (0 != mkdir(TTS_DOWNLOAD_BASE, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
1123 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to make directory : %s", TTS_DOWNLOAD_BASE);
1124 __tts_config_release_client(uid);
1125 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1127 SLOG(LOG_DEBUG, tts_tag(), "Success to make directory : %s", TTS_DOWNLOAD_BASE);
1131 if (0 != access(TTS_DOWNLOAD_ENGINE_INFO, F_OK)) {
1132 if (0 != mkdir(TTS_DOWNLOAD_ENGINE_INFO, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
1133 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to make directory : %s", TTS_DOWNLOAD_ENGINE_INFO);
1134 __tts_config_release_client(uid);
1135 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1137 SLOG(LOG_DEBUG, tts_tag(), "Success to make directory : %s", TTS_DOWNLOAD_ENGINE_INFO);
1141 if (0 != __tts_config_mgr_get_engine_info()) {
1142 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get engine info");
1143 __tts_config_release_client(uid);
1144 __tts_config_release_engine();
1145 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1148 __tts_config_mgr_print_engine_info();
1150 if (0 != tts_parser_load_config(&g_config_info)) {
1151 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to parse configure information");
1152 __tts_config_release_client(uid);
1153 __tts_config_release_engine();
1154 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1157 /* Check whether engine id is valid */
1158 if (0 != __tts_config_mgr_check_engine_is_valid(g_config_info->engine_id)) {
1159 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get default engine");
1160 __tts_config_release_client(uid);
1161 __tts_config_release_engine();
1162 tts_parser_unload_config(g_config_info);
1163 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1166 if (true == g_config_info->auto_voice) {
1167 /* Check language with display language */
1168 __tts_config_set_auto_language();
1170 if (false == __tts_config_mgr_check_lang_is_valid(g_config_info->engine_id, g_config_info->language, g_config_info->type)) {
1171 /* Default language is not valid */
1172 char* tmp_language = NULL;
1174 if (0 != __tts_config_mgr_select_lang(g_config_info->engine_id, &tmp_language, &tmp_type)) {
1175 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to select language");
1176 __tts_config_release_client(uid);
1177 __tts_config_release_engine();
1178 tts_parser_unload_config(g_config_info);
1179 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1182 if (NULL != tmp_language) {
1183 if (NULL != g_config_info->language) {
1184 free(g_config_info->language);
1185 g_config_info->language = NULL;
1186 g_config_info->language = strdup(tmp_language);
1187 if (NULL == g_config_info->language) {
1188 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to strdup tmp_language");
1189 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1193 g_config_info->type = tmp_type;
1197 if (0 != tts_parser_set_voice(g_config_info->language, g_config_info->type)) {
1198 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to save config");
1199 __tts_config_release_client(uid);
1200 __tts_config_release_engine();
1201 tts_parser_unload_config(g_config_info);
1202 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1208 /* print daemon config */
1209 SLOG(LOG_DEBUG, tts_tag(), "== TTS config ==");
1210 SECURE_SLOG(LOG_DEBUG, tts_tag(), " engine : %s", g_config_info->engine_id);
1211 SECURE_SLOG(LOG_DEBUG, tts_tag(), " setting : %s", g_config_info->setting);
1212 SECURE_SLOG(LOG_DEBUG, tts_tag(), " auto voice : %s", g_config_info->auto_voice ? "on" : "off");
1213 SECURE_SLOG(LOG_DEBUG, tts_tag(), " language : %s", g_config_info->language);
1214 SECURE_SLOG(LOG_DEBUG, tts_tag(), " voice type : %d", g_config_info->type);
1215 SECURE_SLOG(LOG_DEBUG, tts_tag(), " speech rate : %d", g_config_info->speech_rate);
1216 SECURE_SLOG(LOG_DEBUG, tts_tag(), " pitch : %d", g_config_info->pitch);
1217 SLOG(LOG_DEBUG, tts_tag(), "=================");
1219 if (0 != __tts_config_mgr_register_config_event()) {
1220 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to register config event");
1221 __tts_config_release_client(uid);
1222 __tts_config_release_engine();
1223 tts_parser_unload_config(g_config_info);
1224 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1227 /* Register to detect display language change */
1228 vconf_notify_key_changed(TTS_LANGSET_KEY, __tts_config_display_language_changed_cb, NULL);
1229 vconf_notify_key_changed(TTS_ACCESSIBILITY_KEY, __tts_config_screen_reader_changed_cb, NULL);
1231 /* For engine directory monitoring */
1232 //if (0 != __tts_config_mgr_register_engine_config_updated_event()) {
1233 // SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to register engine config updated event");
1234 // __tts_config_release_client(uid);
1235 // __tts_config_release_engine();
1236 // tts_parser_unload_config(g_config_info);
1237 // __tts_config_mgr_unregister_config_event();
1238 // return TTS_CONFIG_ERROR_OPERATION_FAILED;
1244 int tts_config_mgr_finalize(int uid)
1246 if (0 < __tts_config_release_client(uid)) {
1250 tts_config_mgr_unset_callback(uid);
1252 __tts_config_release_engine();
1254 tts_parser_unload_config(g_config_info);
1256 __tts_config_mgr_unregister_engine_config_updated_event();
1258 __tts_config_mgr_unregister_config_event();
1260 vconf_ignore_key_changed(TTS_LANGSET_KEY, __tts_config_display_language_changed_cb);
1261 vconf_ignore_key_changed(TTS_ACCESSIBILITY_KEY, __tts_config_screen_reader_changed_cb);
1266 int tts_config_mgr_set_callback(int uid,
1267 tts_config_engine_changed_cb engine_cb,
1268 tts_config_voice_changed_cb voice_cb,
1269 tts_config_speech_rate_changed_cb speech_cb,
1270 tts_config_pitch_changed_cb pitch_cb,
1273 GSList *iter = NULL;
1274 tts_config_client_s* temp_client = NULL;
1276 /* Call all callbacks of client*/
1277 iter = g_slist_nth(g_config_client_list, 0);
1279 while (NULL != iter) {
1280 temp_client = iter->data;
1282 if (NULL != temp_client) {
1283 if (uid == temp_client->uid) {
1284 temp_client->engine_cb = engine_cb;
1285 temp_client->voice_cb = voice_cb;
1286 temp_client->speech_cb = speech_cb;
1287 temp_client->pitch_cb = pitch_cb;
1288 temp_client->user_data = user_data;
1292 iter = g_slist_next(iter);
1297 int tts_config_mgr_unset_callback(int uid)
1299 GSList *iter = NULL;
1300 tts_config_client_s* temp_client = NULL;
1302 /* Call all callbacks of client*/
1303 iter = g_slist_nth(g_config_client_list, 0);
1305 while (NULL != iter) {
1306 temp_client = iter->data;
1308 if (NULL != temp_client) {
1309 if (uid == temp_client->uid) {
1310 temp_client->engine_cb = NULL;
1311 temp_client->voice_cb = NULL;
1312 temp_client->speech_cb = NULL;
1313 temp_client->pitch_cb = NULL;
1314 temp_client->user_data = NULL;
1318 iter = g_slist_next(iter);
1324 int tts_config_set_screen_reader_callback(int uid, tts_config_screen_reader_changed_cb callback)
1326 if (NULL == callback) {
1327 SLOG(LOG_ERROR, tts_tag(), "Input parameter is NULL");
1328 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1331 GSList *iter = NULL;
1332 tts_config_client_s* temp_client = NULL;
1334 /* Call all callbacks of client*/
1335 iter = g_slist_nth(g_config_client_list, 0);
1337 while (NULL != iter) {
1338 temp_client = iter->data;
1340 if (NULL != temp_client) {
1341 if (uid == temp_client->uid) {
1342 temp_client->screen_cb = callback;
1346 iter = g_slist_next(iter);
1351 int tts_config_unset_screen_reader_callback(int uid)
1353 GSList *iter = NULL;
1354 tts_config_client_s* temp_client = NULL;
1356 /* Call all callbacks of client*/
1357 iter = g_slist_nth(g_config_client_list, 0);
1359 while (NULL != iter) {
1360 temp_client = iter->data;
1362 if (NULL != temp_client) {
1363 if (uid == temp_client->uid) {
1364 temp_client->screen_cb = NULL;
1368 iter = g_slist_next(iter);
1374 int tts_config_mgr_get_engine_list(tts_config_supported_engine_cb callback, void* user_data)
1376 if (0 >= g_slist_length(g_config_client_list)) {
1377 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1378 return TTS_CONFIG_ERROR_INVALID_STATE;
1381 GSList *iter = NULL;
1382 tts_engine_info_s *engine_info = NULL;
1384 if (0 >= g_slist_length(g_engine_list)) {
1385 SLOG(LOG_ERROR, tts_tag(), "There is no engine!!");
1386 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1389 /* Get a first item */
1390 iter = g_slist_nth(g_engine_list, 0);
1392 while (NULL != iter) {
1393 engine_info = iter->data;
1395 if (NULL != engine_info) {
1396 if (false == callback(engine_info->uuid, engine_info->name, engine_info->setting, user_data)) {
1401 iter = g_slist_next(iter);
1407 int tts_config_mgr_get_engine(char** engine)
1409 if (0 >= g_slist_length(g_config_client_list)) {
1410 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1411 return TTS_CONFIG_ERROR_INVALID_STATE;
1414 if (NULL == engine) {
1415 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Input parameter is NULL");
1416 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1419 if (NULL != g_config_info->engine_id) {
1420 /* Check engine id is valid */
1421 GSList *iter = NULL;
1422 tts_engine_info_s *engine_info = NULL;
1424 if (0 >= g_slist_length(g_engine_list)) {
1425 SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine!!");
1426 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1429 /* Get a first item */
1430 iter = g_slist_nth(g_engine_list, 0);
1432 while (NULL != iter) {
1433 engine_info = iter->data;
1435 if (NULL != engine_info) {
1436 if (0 == strcmp(engine_info->uuid, g_config_info->engine_id)) {
1437 *engine = strdup(g_config_info->engine_id);
1441 iter = g_slist_next(iter);
1444 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Current engine id is not valid");
1446 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Engine id is NULL");
1449 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1452 int __tts_set_buxtonkey(const char* engine)
1455 struct buxton_client * bux_cli;
1456 struct buxton_layer * bux_layer;
1457 struct buxton_value * bux_val;
1459 int ret = buxton_open(&bux_cli, NULL, NULL);
1461 SLOG(LOG_ERROR, tts_tag(), "[DBUS-BUXTON2] buxton_open failed!! (%d)", ret);
1462 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1464 bux_layer = buxton_create_layer("system");
1465 if (NULL == bux_layer) {
1466 SLOG(LOG_ERROR, tts_tag(), "[DBUS-BUXTON2] buxton_create_layer FAIL");
1467 buxton_close(bux_cli);
1468 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1470 bux_val = buxton_value_create_string(engine);
1471 if (NULL == bux_val) {
1472 SLOG(LOG_ERROR, tts_tag(), "[DBUS-BUXTON2] buxton_value_create_string FAIL");
1473 buxton_free_layer(bux_layer);
1474 buxton_close(bux_cli);
1475 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1477 SLOG(LOG_DEBUG, tts_tag(), "[DBUS-BUXTON2] layer: %s", buxton_layer_get_name(bux_layer));
1480 ret = buxton_set_value_sync(bux_cli, bux_layer, TTS_ENGINE_DB_DEFAULT, bux_val);
1482 SLOG(LOG_ERROR, tts_tag(), "[DBUS-BUXTON2] buxton_set_value_sync failed!! (%d)", ret);
1483 buxton_value_free(bux_val);
1484 buxton_free_layer(bux_layer);
1485 buxton_close(bux_cli);
1491 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1493 SLOG(LOG_DEBUG, tts_tag(), "[DBUS-BUXTON2] buxton_set_value_sync: %d, %s", ret, TTS_ENGINE_DB_DEFAULT);
1496 buxton_value_free(bux_val);
1497 buxton_free_layer(bux_layer);
1498 buxton_close(bux_cli);
1504 return TTS_CONFIG_ERROR_NONE;
1507 int tts_config_mgr_set_engine(const char* engine)
1509 if (0 >= g_slist_length(g_config_client_list)) {
1510 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1511 return TTS_CONFIG_ERROR_INVALID_STATE;
1515 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1517 /* Check current engine id with new engine id */
1518 if (NULL != g_config_info->engine_id) {
1519 if (0 == strcmp(g_config_info->engine_id, engine))
1523 if (0 >= g_slist_length(g_engine_list)) {
1524 SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine!!");
1525 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1528 SLOG(LOG_DEBUG, tts_tag(), "New engine id : %s", engine);
1530 int ret = __tts_set_buxtonkey(engine);
1532 SLOG(LOG_DEBUG, tts_tag(), "[DEBUG] set_buxtonkey Fail!!");
1536 GSList *iter = NULL;
1537 tts_engine_info_s *engine_info = NULL;
1538 bool is_valid_engine = false;
1540 /* Get a first item */
1541 iter = g_slist_nth(g_engine_list, 0);
1543 while (NULL != iter) {
1544 engine_info = iter->data;
1546 if (NULL == engine_info) {
1547 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Engine info is NULL");
1548 iter = g_slist_next(iter);
1552 /* Check engine id is valid */
1553 if (0 != strcmp(engine, engine_info->uuid)) {
1554 iter = g_slist_next(iter);
1558 if (NULL != g_config_info->engine_id) {
1559 free(g_config_info->engine_id);
1560 g_config_info->engine_id = NULL;
1563 g_config_info->engine_id = strdup(engine);
1565 if (NULL != engine_info->setting) {
1566 if (NULL != g_config_info->setting) {
1567 free(g_config_info->setting);
1568 g_config_info->setting = NULL;
1570 g_config_info->setting = strdup(engine_info->setting);
1573 /* Engine is valid*/
1574 GSList *iter_voice = NULL;
1575 tts_config_voice_s* voice = NULL;
1576 bool is_valid_voice = false;
1578 /* Get a first item */
1579 iter_voice = g_slist_nth(engine_info->voices, 0);
1581 while (NULL != iter_voice) {
1582 /*Get handle data from list*/
1583 voice = iter_voice->data;
1585 if (NULL != voice) {
1586 if (NULL == voice->language)
1588 SLOG(LOG_DEBUG, tts_tag(), " lang(%s) type(%d)", voice->language, voice->type);
1590 if (0 == strcmp(voice->language, g_config_info->language)) {
1591 if (voice->type == g_config_info->type) {
1592 /* language is valid */
1593 is_valid_voice = true;
1594 g_config_info->type = voice->type;
1601 iter_voice = g_slist_next(iter_voice);
1604 if (false == is_valid_voice) {
1605 if (NULL != g_config_info->language) {
1606 free(g_config_info->language);
1607 g_config_info->language = NULL;
1609 iter_voice = g_slist_nth(engine_info->voices, 0);
1610 if (NULL != iter_voice) {
1611 voice = iter_voice->data;
1612 if (NULL != voice) {
1613 if (NULL != voice->language)
1614 g_config_info->language = strdup(voice->language);
1615 g_config_info->type = voice->type;
1621 is_valid_engine = true;
1625 if (true == is_valid_engine) {
1626 SLOG(LOG_DEBUG, tts_tag(), "[Config] Engine changed");
1627 SECURE_SLOG(LOG_DEBUG, tts_tag(), " Engine : %s", g_config_info->engine_id);
1628 SECURE_SLOG(LOG_DEBUG, tts_tag(), " Setting : %s", g_config_info->setting);
1629 SECURE_SLOG(LOG_DEBUG, tts_tag(), " Language : %s", g_config_info->language);
1630 SECURE_SLOG(LOG_DEBUG, tts_tag(), " Type : %d", g_config_info->type);
1632 if (0 != tts_parser_set_engine(g_config_info->engine_id, g_config_info->setting,
1633 g_config_info->language, g_config_info->type)) {
1634 SLOG(LOG_ERROR, tts_tag(), " Fail to save config");
1635 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1638 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Engine id is not valid");
1639 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1645 int tts_config_mgr_get_voice_list(const char* engine_id, tts_config_supported_voice_cb callback, void* user_data)
1647 if (0 >= g_slist_length(g_config_client_list)) {
1648 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1649 return TTS_CONFIG_ERROR_INVALID_STATE;
1652 if (0 >= g_slist_length(g_engine_list)) {
1653 SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine");
1654 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1657 GSList *iter = NULL;
1658 tts_engine_info_s *engine_info = NULL;
1660 /* Get a first item */
1661 iter = g_slist_nth(g_engine_list, 0);
1663 while (NULL != iter) {
1664 engine_info = iter->data;
1666 if (NULL == engine_info) {
1667 SLOG(LOG_ERROR, tts_tag(), "[ERROR] engine info is NULL");
1668 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1671 if (0 != strcmp(engine_id, engine_info->uuid)) {
1672 iter = g_slist_next(iter);
1676 GSList *iter_voice = NULL;
1677 tts_config_voice_s* voice = NULL;
1679 /* Get a first item */
1680 iter_voice = g_slist_nth(engine_info->voices, 0);
1682 while (NULL != iter_voice) {
1683 /*Get handle data from list*/
1684 voice = iter_voice->data;
1686 SLOG(LOG_DEBUG, tts_tag(), " lang(%s) type(%d)", voice->language, voice->type);
1687 if (NULL != voice->language) {
1688 if (false == callback(engine_info->uuid, voice->language, voice->type, user_data))
1693 iter_voice = g_slist_next(iter_voice);
1701 int tts_config_mgr_get_voice(char** language, int* type)
1703 if (0 >= g_slist_length(g_config_client_list)) {
1704 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1705 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1708 if (0 >= g_slist_length(g_engine_list)) {
1709 SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine");
1710 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1713 if (NULL == language || NULL == type)
1714 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1716 if (NULL != g_config_info->language) {
1717 *language = strdup(g_config_info->language);
1718 *type = g_config_info->type;
1720 SLOG(LOG_ERROR, tts_tag(), "language is NULL");
1721 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1727 int tts_config_mgr_set_voice(const char* language, int type)
1729 if (0 >= g_slist_length(g_config_client_list)) {
1730 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1731 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1734 if (NULL == language) {
1735 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Input parameter is NULL");
1736 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1739 if (0 >= g_slist_length(g_engine_list)) {
1740 SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine");
1741 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1744 /* Check language is valid */
1745 if (NULL != g_config_info->language) {
1746 if (0 != tts_parser_set_voice(language, type)) {
1747 SLOG(LOG_ERROR, tts_tag(), "Fail to save default voice");
1748 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1750 free(g_config_info->language);
1751 g_config_info->language = NULL;
1752 g_config_info->language = strdup(language);
1753 if (NULL == g_config_info->language) {
1754 SLOG(LOG_ERROR, tts_tag(), "Fail to strdup language");
1755 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1757 g_config_info->type = type;
1760 SLOG(LOG_ERROR, tts_tag(), "language is NULL");
1761 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1767 int tts_config_mgr_get_auto_voice(bool* value)
1769 if (0 >= g_slist_length(g_config_client_list)) {
1770 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1771 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1775 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1777 *value = g_config_info->auto_voice;
1782 int tts_config_mgr_set_auto_voice(bool value)
1784 if (0 >= g_slist_length(g_config_client_list)) {
1785 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1786 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1789 if (g_config_info->auto_voice != value) {
1790 /* Check language is valid */
1791 if (0 != tts_parser_set_auto_voice(value)) {
1792 SLOG(LOG_ERROR, tts_tag(), "Fail to save auto voice option");
1793 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1795 g_config_info->auto_voice = value;
1797 if (true == g_config_info->auto_voice) {
1798 __tts_config_set_auto_language();
1805 int tts_config_mgr_get_speech_rate(int* value)
1807 if (0 >= g_slist_length(g_config_client_list)) {
1808 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1809 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1812 if (NULL == value) {
1813 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1816 *value = g_config_info->speech_rate;
1821 int tts_config_mgr_set_speech_rate(int value)
1823 if (0 >= g_slist_length(g_config_client_list)) {
1824 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1825 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1828 if (TTS_CONFIG_SPEED_MIN <= value && value <= TTS_CONFIG_SPEED_MAX) {
1829 SLOG(LOG_DEBUG, tts_tag(), "[Config] Set speech rate : %d", value);
1830 if (0 != tts_parser_set_speech_rate(value)) {
1831 SLOG(LOG_ERROR, tts_tag(), "Fail to save speech rate");
1832 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1835 g_config_info->speech_rate = value;
1837 SLOG(LOG_ERROR, tts_tag(), "[Config ERROR] Speech rate is invalid : %d", value);
1843 int tts_config_mgr_get_pitch(int* value)
1845 if (0 >= g_slist_length(g_config_client_list)) {
1846 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1847 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1850 if (NULL == value) {
1851 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1854 GSList *iter = NULL;
1855 tts_engine_info_s *engine_info = NULL;
1857 if (0 >= g_slist_length(g_engine_list)) {
1858 SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine!!");
1859 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1862 /* Get a first item */
1863 iter = g_slist_nth(g_engine_list, 0);
1865 while (NULL != iter) {
1866 engine_info = iter->data;
1868 if (NULL == engine_info) {
1869 SLOG(LOG_ERROR, tts_tag(), "engine info is NULL");
1870 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1873 if (0 != strcmp(g_config_info->engine_id, engine_info->uuid)) {
1874 iter = g_slist_next(iter);
1878 if (false == engine_info->pitch_support) {
1879 return TTS_CONFIG_ERROR_NOT_SUPPORTED_FEATURE;
1885 *value = g_config_info->pitch;
1890 int tts_config_mgr_set_pitch(int value)
1892 if (0 >= g_slist_length(g_config_client_list)) {
1893 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1897 GSList *iter = NULL;
1898 tts_engine_info_s *engine_info = NULL;
1900 if (0 >= g_slist_length(g_engine_list)) {
1901 SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine!!");
1902 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1905 /* Get a first item */
1906 iter = g_slist_nth(g_engine_list, 0);
1908 while (NULL != iter) {
1909 engine_info = iter->data;
1911 if (NULL == engine_info) {
1912 SLOG(LOG_ERROR, tts_tag(), "engine info is NULL");
1913 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1916 if (0 != strcmp(g_config_info->engine_id, engine_info->uuid)) {
1917 iter = g_slist_next(iter);
1921 if (false == engine_info->pitch_support) {
1922 return TTS_CONFIG_ERROR_NOT_SUPPORTED_FEATURE;
1928 if (0 != tts_parser_set_pitch(value)) {
1929 SLOG(LOG_ERROR, tts_tag(), "Fail to save speech rate");
1930 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1933 g_config_info->pitch = value;
1938 bool tts_config_check_default_engine_is_valid(const char* engine)
1940 if (0 >= g_slist_length(g_config_client_list)) {
1941 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1948 if (0 >= g_slist_length(g_engine_list))
1951 GSList *iter = NULL;
1952 tts_engine_info_s *engine_info = NULL;
1954 /* Get a first item */
1955 iter = g_slist_nth(g_engine_list, 0);
1957 while (NULL != iter) {
1958 engine_info = iter->data;
1960 if (NULL != engine_info) {
1961 if (0 == strcmp(engine, engine_info->uuid)) {
1965 iter = g_slist_next(iter);
1971 bool tts_config_check_default_voice_is_valid(const char* language, int type)
1973 if (0 >= g_slist_length(g_config_client_list)) {
1974 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1978 if (NULL == language)
1981 if (NULL == g_config_info->engine_id) {
1982 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Default engine id is NULL");
1986 if (0 >= g_slist_length(g_engine_list))
1989 GSList *iter = NULL;
1990 tts_engine_info_s *engine_info = NULL;
1992 /* Get a first item */
1993 iter = g_slist_nth(g_engine_list, 0);
1995 while (NULL != iter) {
1996 engine_info = iter->data;
1998 if (NULL == engine_info) {
1999 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Engine info is NULL");
2000 iter = g_slist_next(iter);
2004 if (0 != strcmp(g_config_info->engine_id, engine_info->uuid)) {
2005 iter = g_slist_next(iter);
2009 GSList *iter_voice = NULL;
2010 tts_config_voice_s* voice = NULL;
2012 /* Get a first item */
2013 iter_voice = g_slist_nth(engine_info->voices, 0);
2015 while (NULL != iter_voice) {
2016 voice = iter_voice->data;
2018 if (0 == strcmp(language, voice->language) && voice->type == type)
2022 iter_voice = g_slist_next(iter_voice);
2032 int __tts_config_mgr_print_engine_info()
2034 GSList *iter = NULL;
2035 tts_engine_info_s *engine_info = NULL;
2037 if (0 >= g_slist_length(g_engine_list)) {
2038 SLOG(LOG_DEBUG, tts_tag(), "-------------- engine list -----------------");
2039 SLOG(LOG_DEBUG, tts_tag(), " No Engine in engine directory");
2040 SLOG(LOG_DEBUG, tts_tag(), "--------------------------------------------");
2044 /* Get a first item */
2045 iter = g_slist_nth(g_engine_list, 0);
2047 SLOG(LOG_DEBUG, tts_tag(), "--------------- engine list -----------------");
2050 while (NULL != iter) {
2051 engine_info = iter->data;
2053 SLOG(LOG_DEBUG, tts_tag(), "[%dth]", i);
2054 SLOG(LOG_DEBUG, tts_tag(), " name : %s", engine_info->name);
2055 SLOG(LOG_DEBUG, tts_tag(), " id : %s", engine_info->uuid);
2056 SLOG(LOG_DEBUG, tts_tag(), " setting : %s", engine_info->setting);
2058 SLOG(LOG_DEBUG, tts_tag(), " Voices");
2059 GSList *iter_voice = NULL;
2060 tts_config_voice_s* voice = NULL;
2062 if (g_slist_length(engine_info->voices) > 0) {
2063 /* Get a first item */
2064 iter_voice = g_slist_nth(engine_info->voices, 0);
2067 while (NULL != iter_voice) {
2068 /*Get handle data from list*/
2069 voice = iter_voice->data;
2071 SLOG(LOG_DEBUG, tts_tag(), " [%dth] lang(%s) type(%d)", j, voice->language, voice->type);
2074 iter_voice = g_slist_next(iter_voice);
2078 SLOG(LOG_ERROR, tts_tag(), " Voice is NONE");
2080 iter = g_slist_next(iter);
2083 SLOG(LOG_DEBUG, tts_tag(), "--------------------------------------------");