2 * Copyright (c) 2011-2014 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>
24 #include "tts_config_mgr.h"
25 #include "tts_config_parser.h"
30 tts_config_engine_changed_cb engine_cb;
31 tts_config_voice_changed_cb voice_cb;
32 tts_config_speech_rate_changed_cb speech_cb;
33 tts_config_screen_reader_changed_cb screen_cb;
34 tts_config_pitch_changed_cb pitch_cb;
38 extern char* tts_tag();
40 static GSList* g_engine_list = NULL;
42 static GSList* g_config_client_list = NULL;
44 static tts_config_s* g_config_info;
46 static Ecore_Fd_Handler* g_config_fd_handler_noti = NULL;
47 static int g_config_fd_noti;
48 static int g_config_wd_noti;
50 /* For engine directory monitoring */
51 static Ecore_Fd_Handler* g_dir_fd_handler = NULL;
55 int __tts_config_mgr_print_engine_info();
57 int __tts_config_mgr_check_engine_is_valid(const char* engine_id)
59 if (NULL == engine_id) {
60 SLOG(LOG_ERROR, tts_tag(), "Input parameter is NULL");
65 tts_engine_info_s *engine_info = NULL;
67 if (0 >= g_slist_length(g_engine_list)) {
68 SLOG(LOG_ERROR, tts_tag(), "There is no engine!!");
72 /* Get a first item */
73 iter = g_slist_nth(g_engine_list, 0);
75 while (NULL != iter) {
76 engine_info = iter->data;
78 if (NULL == engine_info) {
79 SLOG(LOG_ERROR, tts_tag(), "engine info is NULL");
83 if (0 == strcmp(engine_id, engine_info->uuid)) {
84 SLOG(LOG_DEBUG, tts_tag(), "Default engine is valid : %s", engine_id);
88 iter = g_slist_next(iter);
91 /* Change default engine */
92 iter = g_slist_nth(g_engine_list, 0);
93 engine_info = iter->data;
95 if (NULL != g_config_info->engine_id) free(g_config_info->engine_id);
96 if (NULL != g_config_info->setting) free(g_config_info->setting);
98 g_config_info->engine_id = strdup(engine_info->uuid);
99 g_config_info->setting = strdup(engine_info->setting);
101 SLOG(LOG_DEBUG, tts_tag(), "Default engine is changed : %s", g_config_info->engine_id);
103 /* Change is default voice */
104 GSList *iter_voice = NULL;
105 tts_config_voice_s* voice = NULL;
106 bool is_valid_voice = false;
108 /* Get a first item */
109 iter_voice = g_slist_nth(engine_info->voices, 0);
111 while (NULL != iter_voice) {
112 /*Get handle data from list*/
113 voice = iter_voice->data;
115 if (NULL != voice && NULL != g_config_info) {
116 if (NULL != voice->language && NULL != g_config_info->language) {
117 if (0 == strcmp(voice->language, g_config_info->language)) {
118 if (voice->type == g_config_info->type) {
119 /* language is valid */
120 is_valid_voice = true;
122 free(g_config_info->language);
123 g_config_info->language = strdup(voice->language);
124 g_config_info->type = voice->type;
126 SLOG(LOG_DEBUG, tts_tag(), "Default voice is changed : lang(%s) type(%d)", voice->language, voice->type);
133 iter_voice = g_slist_next(iter_voice);
136 if (false == is_valid_voice) {
137 /* Select first voice as default */
138 if (NULL != g_config_info->language) {
139 free(g_config_info->language);
141 iter_voice = g_slist_nth(engine_info->voices, 0);
142 voice = iter_voice->data;
144 g_config_info->language = strdup(voice->language);
145 g_config_info->type = voice->type;
146 SLOG(LOG_DEBUG, tts_tag(), "Default voice is changed : lang(%s) type(%d)", voice->language, voice->type);
150 if ( 0 != tts_parser_set_engine(g_config_info->engine_id, g_config_info->setting,
151 g_config_info->language, g_config_info->type)) {
152 SLOG(LOG_ERROR, tts_tag(), " Fail to save config");
153 return TTS_CONFIG_ERROR_OPERATION_FAILED;
159 bool __tts_config_mgr_check_lang_is_valid(const char* engine_id, const char* language, int type)
161 if (NULL == engine_id || NULL == language) {
162 SLOG(LOG_ERROR, tts_tag(), "Input parameter is NULL");
167 tts_engine_info_s *engine_info = NULL;
169 if (0 >= g_slist_length(g_engine_list)) {
170 SLOG(LOG_ERROR, tts_tag(), "There is no engine!!");
174 /* Get a first item */
175 iter = g_slist_nth(g_engine_list, 0);
177 while (NULL != iter) {
178 engine_info = iter->data;
180 if (NULL == engine_info) {
181 SLOG(LOG_ERROR, tts_tag(), "engine info is NULL");
185 if (0 != strcmp(engine_id, engine_info->uuid)) {
186 iter = g_slist_next(iter);
190 GSList *iter_voice = NULL;
191 tts_config_voice_s* voice = NULL;
193 if (g_slist_length(engine_info->voices) <= 0) {
194 SLOG(LOG_ERROR, tts_tag(), "There is no voice : %s", engine_info->uuid);
195 iter = g_slist_next(iter);
199 /* Get a first item */
200 iter_voice = g_slist_nth(engine_info->voices, 0);
203 while (NULL != iter_voice) {
204 /*Get handle data from list*/
205 voice = iter_voice->data;
208 if (0 == strcmp(language, voice->language)) {
209 if (type == voice->type) {
216 iter_voice = g_slist_next(iter_voice);
226 int __tts_config_mgr_select_lang(const char* engine_id, char** language, int* type)
228 if (NULL == engine_id || NULL == language) {
229 SLOG(LOG_ERROR, tts_tag(), "Input parameter is NULL");
234 tts_engine_info_s *engine_info = NULL;
236 if (0 >= g_slist_length(g_engine_list)) {
237 SLOG(LOG_ERROR, tts_tag(), "There is no engine!!");
241 /* Get a first item */
242 iter = g_slist_nth(g_engine_list, 0);
244 while (NULL != iter) {
245 engine_info = iter->data;
247 if (NULL == engine_info) {
248 SLOG(LOG_ERROR, tts_tag(), "engine info is NULL");
252 if (0 != strcmp(engine_id, engine_info->uuid)) {
253 iter = g_slist_next(iter);
257 GSList *iter_voice = NULL;
258 tts_config_voice_s* voice = NULL;
260 if (g_slist_length(engine_info->voices) <= 0) {
261 SLOG(LOG_ERROR, tts_tag(), "There is no voice : %s", engine_info->uuid);
265 /* Get a first item */
266 iter_voice = g_slist_nth(engine_info->voices, 0);
268 while (NULL != iter_voice) {
269 voice = iter_voice->data;
271 /* Default language */
272 if (0 == strcmp(TTS_BASE_LANGUAGE, voice->language)) {
273 *language = strdup(voice->language);
276 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Selected language(%s) type(%d)", *language, *type);
280 iter_voice = g_slist_next(iter_voice);
283 /* Not support base language */
285 *language = strdup(voice->language);
288 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Selected language(%s) type(%d)", *language, *type);
297 Eina_Bool tts_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handler)
299 SLOG(LOG_DEBUG, tts_tag(), "===== Config changed callback event");
302 struct inotify_event event;
303 memset(&event, '\0', sizeof(struct inotify_event));
305 length = read(g_config_fd_noti, &event, sizeof(struct inotify_event));
307 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Empty Inotify event");
308 SLOG(LOG_DEBUG, tts_tag(), "=====");
309 SLOG(LOG_DEBUG, tts_tag(), " ");
310 return ECORE_CALLBACK_DONE;
313 if (IN_CLOSE_WRITE == event.mask) {
314 /* check config changed state */
316 char* setting = NULL;
318 bool auto_voice = g_config_info->auto_voice;
320 int speech_rate = -1;
324 tts_config_client_s* temp_client = NULL;
326 if (0 != tts_parser_find_config_changed(&engine, &setting, &auto_voice, &lang, &voice_type, &speech_rate, &pitch))
327 return ECORE_CALLBACK_PASS_ON;
330 if (NULL != engine || NULL != setting) {
331 if (NULL != engine) {
332 if (NULL != g_config_info->engine_id)
333 free(g_config_info->engine_id);
335 g_config_info->engine_id = strdup(engine);
337 if (NULL != setting) {
338 if (NULL != g_config_info->setting)
339 free(g_config_info->setting);
341 g_config_info->setting = strdup(setting);
344 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Engine change(%s)", g_config_info->engine_id);
346 /* Call all callbacks of client*/
347 iter = g_slist_nth(g_config_client_list, 0);
349 while (NULL != iter) {
350 temp_client = iter->data;
352 if (NULL != temp_client) {
353 if (NULL != temp_client->engine_cb) {
354 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Engine changed callback : uid(%d)", temp_client->uid);
355 temp_client->engine_cb(g_config_info->engine_id, g_config_info->setting,
356 g_config_info->language, g_config_info->type,
357 g_config_info->auto_voice, temp_client->user_data);
361 iter = g_slist_next(iter);
365 if (auto_voice != g_config_info->auto_voice) {
366 g_config_info->auto_voice = auto_voice;
369 if (NULL != lang || -1 != voice_type) {
370 char* before_lang = NULL;
373 before_lang = strdup(g_config_info->language);
374 before_type = g_config_info->type;
377 if (NULL != g_config_info->language)
378 free(g_config_info->language);
380 g_config_info->language = strdup(lang);
382 if (-1 != voice_type) {
383 g_config_info->type = voice_type;
386 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Voice change(%s, %d)", g_config_info->language, g_config_info->type);
388 /* Call all callbacks of client*/
389 iter = g_slist_nth(g_config_client_list, 0);
391 while (NULL != iter) {
392 temp_client = iter->data;
394 if (NULL != temp_client) {
395 if (NULL != temp_client->voice_cb) {
396 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Voice changed callback : uid(%d)", temp_client->uid);
397 temp_client->voice_cb(before_lang, before_type,
398 g_config_info->language, g_config_info->type,
399 g_config_info->auto_voice, temp_client->user_data);
403 iter = g_slist_next(iter);
406 if (NULL != before_lang) {
411 if (-1 != speech_rate) {
412 g_config_info->speech_rate = speech_rate;
414 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Speech rate change(%d)", g_config_info->speech_rate);
416 /* Call all callbacks of client*/
417 iter = g_slist_nth(g_config_client_list, 0);
419 while (NULL != iter) {
420 temp_client = iter->data;
422 if (NULL != temp_client) {
423 if (NULL != temp_client->speech_cb) {
424 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Speech rate changed callback : uid(%d)", temp_client->uid);
425 temp_client->speech_cb(g_config_info->speech_rate, temp_client->user_data);
429 iter = g_slist_next(iter);
434 g_config_info->pitch = pitch;
436 SECURE_SLOG(LOG_DEBUG, tts_tag(), "pitch change(%d)", g_config_info->pitch);
438 /* Call all callbacks of client*/
439 iter = g_slist_nth(g_config_client_list, 0);
441 while (NULL != iter) {
442 temp_client = iter->data;
444 if (NULL != temp_client) {
445 if (NULL != temp_client->pitch_cb) {
446 SECURE_SLOG(LOG_DEBUG, tts_tag(), "Pitch changed callback : uid(%d)", temp_client->uid);
447 temp_client->pitch_cb(g_config_info->pitch, temp_client->user_data);
451 iter = g_slist_next(iter);
455 if (NULL != engine) free(engine);
456 if (NULL != setting) free(setting);
457 if (NULL != lang) free(lang);
459 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Undefined event");
462 SLOG(LOG_DEBUG, tts_tag(), "=====");
463 SLOG(LOG_DEBUG, tts_tag(), " ");
465 return ECORE_CALLBACK_PASS_ON;
468 int __tts_config_mgr_register_config_event()
470 /* get file notification handler */
476 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail get inotify fd");
479 g_config_fd_noti = fd;
481 wd = inotify_add_watch(fd, TTS_CONFIG, IN_CLOSE_WRITE);
482 g_config_wd_noti = wd;
484 g_config_fd_handler_noti = ecore_main_fd_handler_add(fd, ECORE_FD_READ,
485 (Ecore_Fd_Cb)tts_config_mgr_inotify_event_cb, NULL, NULL, NULL);
486 if (NULL == g_config_fd_handler_noti) {
487 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get handler_noti");
491 /* Set non-blocking mode of file */
493 value = fcntl(fd, F_GETFL, 0);
496 if (0 > fcntl(fd, F_SETFL, value)) {
497 SLOG(LOG_WARN, tts_tag(), "[WARNING] Fail to set non-block mode");
503 int __tts_config_mgr_unregister_config_event()
505 /* delete inotify variable */
506 ecore_main_fd_handler_del(g_config_fd_handler_noti);
507 inotify_rm_watch(g_config_fd_noti, g_config_wd_noti);
508 close(g_config_fd_noti);
513 void __tts_config_speech_rate_key_changed_cb(keynode_t *key, void *data)
517 ret = vconf_get_int(TTS_ACCESSIBILITY_SPEED_KEY, &speech_rate);
520 SLOG(LOG_ERROR, tts_tag(), "[Config ERROR] Fail to get speech rate");
524 /* Check speech rate is valid */
525 if (TTS_CONFIG_SPEED_MIN <= speech_rate && speech_rate <= TTS_CONFIG_SPEED_MAX) {
526 SLOG(LOG_DEBUG, tts_tag(), "[Config] Speech rate : %d", speech_rate);
528 if (g_config_info->speech_rate != speech_rate) {
529 g_config_info->speech_rate = speech_rate;
531 tts_parser_set_speech_rate(g_config_info->speech_rate);
534 tts_config_client_s* temp_client = NULL;
536 /* Call all callbacks of client*/
537 iter = g_slist_nth(g_config_client_list, 0);
539 while (NULL != iter) {
540 temp_client = iter->data;
542 if (NULL != temp_client) {
543 if (NULL != temp_client->speech_cb) {
544 temp_client->speech_cb(g_config_info->speech_rate, temp_client->user_data);
548 iter = g_slist_next(iter);
552 SLOG(LOG_ERROR, tts_tag(), "[Config ERROR] Speech rate is not valid : %d", speech_rate);
558 int __tts_config_set_auto_language()
561 value = vconf_get_str(TTS_LANGSET_KEY);
563 SLOG(LOG_ERROR, tts_tag(), "[Config ERROR] Fail to get display language");
567 char temp_lang[6] = {'\0', };
568 strncpy(temp_lang, value, 5);
571 if (true == __tts_config_mgr_check_lang_is_valid(g_config_info->engine_id, temp_lang, g_config_info->type)) {
572 /* tts default voice change */
573 if (NULL == g_config_info->language) {
574 SLOG(LOG_ERROR, tts_tag(), "Current config language is NULL");
578 char* before_lang = NULL;
581 if (0 != tts_parser_set_voice(temp_lang, g_config_info->type)) {
582 SLOG(LOG_ERROR, tts_tag(), "Fail to save default voice");
586 before_lang = strdup(g_config_info->language);
587 before_type = g_config_info->type;
589 free(g_config_info->language);
590 g_config_info->language = strdup(temp_lang);
592 SECURE_SLOG(LOG_DEBUG, tts_tag(), "[Config] Default voice : lang(%s) type(%d)",
593 g_config_info->language, g_config_info->type);
596 tts_config_client_s* temp_client = NULL;
598 /* Call all callbacks of client*/
599 iter = g_slist_nth(g_config_client_list, 0);
601 while (NULL != iter) {
602 temp_client = iter->data;
604 if (NULL != temp_client) {
605 if (NULL != temp_client->voice_cb) {
606 temp_client->voice_cb(before_lang, before_type,
607 g_config_info->language, g_config_info->type,
608 g_config_info->auto_voice, temp_client->user_data);
612 iter = g_slist_next(iter);
615 if (NULL != before_lang) {
619 /* Display language is not valid */
620 char* tmp_language = NULL;
622 if (0 != __tts_config_mgr_select_lang(g_config_info->engine_id, &tmp_language, &tmp_type)) {
623 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to select language");
627 if (NULL == tmp_language) {
628 SLOG(LOG_ERROR, tts_tag(), "[ERROR] language is NULL");
632 if (0 != tts_parser_set_voice(tmp_language, tmp_type)) {
633 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to save config");
637 SECURE_SLOG(LOG_DEBUG, tts_tag(), "[Config] Default voice : lang(%s) type(%d)",
638 tmp_language, tmp_type);
641 tts_config_client_s* temp_client = NULL;
643 /* Call all callbacks of client*/
644 iter = g_slist_nth(g_config_client_list, 0);
646 while (NULL != iter) {
647 temp_client = iter->data;
649 if (NULL != temp_client) {
650 if (NULL != temp_client->voice_cb) {
651 temp_client->voice_cb(g_config_info->language, g_config_info->type,
652 tmp_language, tmp_type, g_config_info->auto_voice, temp_client->user_data);
656 iter = g_slist_next(iter);
659 if (NULL != g_config_info->language) {
660 free(g_config_info->language);
661 g_config_info->language = strdup(tmp_language);
664 g_config_info->type = tmp_type;
672 void __tts_config_display_language_changed_cb(keynode_t *key, void *data)
674 if (true == g_config_info->auto_voice) {
675 __tts_config_set_auto_language();
681 void __tts_config_screen_reader_changed_cb(keynode_t *key, void *data)
685 ret = vconf_get_int(TTS_ACCESSIBILITY_KEY, &screen_reader);
687 SLOG(LOG_ERROR, tts_tag(), "[Config ERROR] Fail to get screen reader");
692 tts_config_client_s* temp_client = NULL;
694 /* Call all callbacks of client*/
695 iter = g_slist_nth(g_config_client_list, 0);
697 while (NULL != iter) {
698 temp_client = iter->data;
700 if (NULL != temp_client) {
701 if (NULL != temp_client->screen_cb) {
702 temp_client->screen_cb((bool)screen_reader);
706 iter = g_slist_next(iter);
710 int __tts_config_release_client(int uid)
713 tts_config_client_s* temp_client = NULL;
715 if (0 < g_slist_length(g_config_client_list)) {
717 iter = g_slist_nth(g_config_client_list, 0);
719 while (NULL != iter) {
720 temp_client = iter->data;
722 if (NULL != temp_client) {
723 if (uid == temp_client->uid) {
724 g_config_client_list = g_slist_remove(g_config_client_list, temp_client);
730 iter = g_slist_next(iter);
734 SLOG(LOG_DEBUG, tts_tag(), "Client count (%d)", g_slist_length(g_config_client_list));
736 return g_slist_length(g_config_client_list);
739 void __tts_config_release_engine()
742 tts_engine_info_s *engine_info = NULL;
744 if (0 < g_slist_length(g_engine_list)) {
746 /* Get a first item */
747 iter = g_slist_nth(g_engine_list, 0);
749 while (NULL != iter) {
750 engine_info = iter->data;
752 if (NULL != engine_info) {
753 g_engine_list = g_slist_remove(g_engine_list, engine_info);
755 tts_parser_free_engine_info(engine_info);
758 iter = g_slist_nth(g_engine_list, 0);
765 int __tts_config_mgr_get_engine_info()
770 struct dirent *dirp = NULL;
772 char filepath[512] = {'\0',};
774 tts_engine_info_s* info = NULL;
776 g_engine_list = NULL;
778 /* Get engine info from default engine directory */
779 dp = opendir(TTS_DEFAULT_ENGINE_INFO);
781 SLOG(LOG_DEBUG, tts_tag(), "[CONFIG] No downloadable directory : %s", TTS_DEFAULT_ENGINE_INFO);
784 ret = readdir_r(dp, &entry, &dirp);
786 SLOG(LOG_ERROR, tts_tag(), "[CONFIG] Fail to read directory");
791 filesize = strlen(TTS_DEFAULT_ENGINE_INFO) + strlen(dirp->d_name) + 2;
792 if (filesize >= 512) {
793 SECURE_SLOG(LOG_ERROR, tts_tag(), "[CONFIG ERROR] File path is too long : %s", dirp->d_name);
798 memset(filepath, '\0', 512);
799 snprintf(filepath, 512, "%s/%s", TTS_DEFAULT_ENGINE_INFO, dirp->d_name);
801 SECURE_SLOG(LOG_DEBUG, tts_tag(), "[CONFIG] Filepath(%s)", filepath);
803 if (0 == tts_parser_get_engine_info(filepath, &info)) {
804 g_engine_list = g_slist_append(g_engine_list, info);
807 } while (NULL != dirp);
812 /* Get engine info from downloadable engine directory */
813 dp = opendir(TTS_DOWNLOAD_ENGINE_INFO);
815 SLOG(LOG_DEBUG, tts_tag(), "[CONFIG] No downloadable directory : %s", TTS_DOWNLOAD_ENGINE_INFO);
818 ret = readdir_r(dp, &entry, &dirp);
820 SLOG(LOG_ERROR, tts_tag(), "[CONFIG] Fail to read directory");
825 filesize = strlen(TTS_DOWNLOAD_ENGINE_INFO) + strlen(dirp->d_name) + 2;
826 if (filesize >= 512) {
827 SECURE_SLOG(LOG_ERROR, tts_tag(), "[CONFIG ERROR] File path is too long : %s", dirp->d_name);
832 memset(filepath, '\0', 512);
833 snprintf(filepath, 512, "%s/%s", TTS_DOWNLOAD_ENGINE_INFO, dirp->d_name);
835 SECURE_SLOG(LOG_DEBUG, tts_tag(), "[CONFIG] Filepath(%s)", filepath);
837 if (0 == tts_parser_get_engine_info(filepath, &info)) {
840 tts_engine_info_s *engine_info = NULL;
842 /* Get a first item */
843 iter = g_slist_nth(g_engine_list, 0);
845 while (NULL != iter) {
846 engine_info = iter->data;
848 if (NULL != engine_info) {
849 /* Remove old engine info */
850 if (0 == strncmp(engine_info->uuid, info->uuid, strlen(engine_info->uuid))) {
851 SLOG(LOG_DEBUG, tts_tag(), "[CONFIG] Remove old engine : %s", engine_info->name);
852 g_engine_list = g_slist_remove(g_engine_list, engine_info);
853 tts_parser_free_engine_info(engine_info);
860 g_engine_list = g_slist_append(g_engine_list, info);
863 } while (NULL != dirp);
868 if (0 >= g_slist_length(g_engine_list)) {
869 SLOG(LOG_ERROR, tts_tag(), "[ERROR] No engine");
876 static Eina_Bool __tts_config_mgr_engine_config_inotify_event_callback(void* data, Ecore_Fd_Handler *fd_handler)
878 SLOG(LOG_DEBUG, tts_tag(), "===== Engine config updated callback event");
881 struct inotify_event event;
882 memset(&event, '\0', sizeof(struct inotify_event));
884 length = read(g_dir_fd, &event, sizeof(struct inotify_event));
886 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Empty Inotify event");
887 SLOG(LOG_DEBUG, tts_tag(), "=====");
888 SLOG(LOG_DEBUG, tts_tag(), " ");
889 return ECORE_CALLBACK_DONE;
892 if (IN_CLOSE_WRITE == event.mask) {
893 int ret = __tts_config_mgr_get_engine_info();
895 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get engine info when config updated");
897 __tts_config_mgr_print_engine_info();
898 bool support = tts_config_check_default_voice_is_valid(g_config_info->language, g_config_info->type);
899 if (false == support) {
900 SLOG(LOG_DEBUG, tts_tag(), "[ERROR] Default voice is valid");
901 char* temp_lang = NULL;
903 ret = __tts_config_mgr_select_lang(g_config_info->engine_id, &temp_lang, &temp_type);
905 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get voice");
908 ret = tts_config_mgr_set_voice(temp_lang, temp_type);
910 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to set voice");
912 SLOG(LOG_DEBUG, tts_tag(), "[DEBUG] Saved default voice : lang(%s), type(%d)", g_config_info->language, g_config_info->type);
914 if (NULL != temp_lang) free(temp_lang);
917 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Undefined event");
920 SLOG(LOG_DEBUG, tts_tag(), "=====");
921 SLOG(LOG_DEBUG, tts_tag(), " ");
923 return ECORE_CALLBACK_PASS_ON;
926 static int __tts_config_mgr_register_engine_config_updated_event()
928 /* For engine directory monitoring */
929 g_dir_fd = inotify_init();
931 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to init inotify");
935 g_dir_wd = inotify_add_watch(g_dir_fd, TTS_OPT_BASE"/engine-info/", IN_CLOSE_WRITE);
937 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to add watch");
941 g_dir_fd_handler = ecore_main_fd_handler_add(g_dir_fd, ECORE_FD_READ, (Ecore_Fd_Cb)__tts_config_mgr_engine_config_inotify_event_callback, NULL, NULL, NULL);
942 if (NULL == g_dir_fd_handler) {
943 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to add fd handler");
947 /* Set non-blocking mode of file */
949 value = fcntl(g_dir_fd, F_GETFL, 0);
952 if (0 > fcntl(g_dir_fd, F_SETFL, value)) {
953 SLOG(LOG_WARN, tts_tag(), "[WARNING] Fail to set non-block mode");
959 static int __tts_config_mgr_unregister_engine_config_updated_event()
961 /* delete inotify variable */
962 ecore_main_fd_handler_del(g_dir_fd_handler);
963 inotify_rm_watch(g_dir_fd, g_dir_wd);
969 int tts_config_mgr_initialize(int uid)
973 tts_config_client_s* temp_client = NULL;
976 if (0 < g_slist_length(g_config_client_list)) {
978 iter = g_slist_nth(g_config_client_list, 0);
980 while (NULL != iter) {
981 get_uid = iter->data;
983 if (uid == *get_uid) {
984 SECURE_SLOG(LOG_WARN, tts_tag(), "[CONFIG] uid(%d) has already registered", uid);
988 iter = g_slist_next(iter);
991 temp_client = (tts_config_client_s*)calloc(1, sizeof(tts_config_client_s));
992 temp_client->uid = uid;
994 g_config_client_list = g_slist_append(g_config_client_list, temp_client);
996 SECURE_SLOG(LOG_WARN, tts_tag(), "[CONFIG] Add uid(%d) but config has already initialized", uid);
999 temp_client = (tts_config_client_s*)calloc(1, sizeof(tts_config_client_s));
1000 temp_client->uid = uid;
1002 g_config_client_list = g_slist_append(g_config_client_list, temp_client);
1005 if (0 != __tts_config_mgr_get_engine_info()) {
1006 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get engine info");
1007 __tts_config_release_client(uid);
1008 __tts_config_release_engine();
1009 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1012 __tts_config_mgr_print_engine_info();
1014 if (0 != tts_parser_load_config(&g_config_info)) {
1015 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to parse configure information");
1016 __tts_config_release_client(uid);
1017 __tts_config_release_engine();
1018 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1021 /* Check whether engine id is valid */
1022 if (0 != __tts_config_mgr_check_engine_is_valid(g_config_info->engine_id)) {
1023 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get default engine");
1024 __tts_config_release_client(uid);
1025 __tts_config_release_engine();
1026 tts_parser_unload_config(g_config_info);
1027 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1030 if (true == g_config_info->auto_voice) {
1031 /* Check language with display language */
1032 __tts_config_set_auto_language();
1034 if (false == __tts_config_mgr_check_lang_is_valid(g_config_info->engine_id, g_config_info->language, g_config_info->type)) {
1035 /* Default language is not valid */
1036 char* tmp_language = NULL;
1038 if (0 != __tts_config_mgr_select_lang(g_config_info->engine_id, &tmp_language, &tmp_type)) {
1039 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to select language");
1040 __tts_config_release_client(uid);
1041 __tts_config_release_engine();
1042 tts_parser_unload_config(g_config_info);
1043 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1046 if (NULL != tmp_language) {
1047 if (NULL != g_config_info->language) {
1048 free(g_config_info->language);
1049 g_config_info->language = strdup(tmp_language);
1052 g_config_info->type = tmp_type;
1056 if (0 != tts_parser_set_voice(g_config_info->language, g_config_info->type)) {
1057 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to save config");
1058 __tts_config_release_client(uid);
1059 __tts_config_release_engine();
1060 tts_parser_unload_config(g_config_info);
1061 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1067 /* print daemon config */
1068 SLOG(LOG_DEBUG, tts_tag(), "== TTS config ==");
1069 SECURE_SLOG(LOG_DEBUG, tts_tag(), " engine : %s", g_config_info->engine_id);
1070 SECURE_SLOG(LOG_DEBUG, tts_tag(), " setting : %s", g_config_info->setting);
1071 SECURE_SLOG(LOG_DEBUG, tts_tag(), " auto voice : %s", g_config_info->auto_voice ? "on" : "off");
1072 SECURE_SLOG(LOG_DEBUG, tts_tag(), " language : %s", g_config_info->language);
1073 SECURE_SLOG(LOG_DEBUG, tts_tag(), " voice type : %d", g_config_info->type);
1074 SECURE_SLOG(LOG_DEBUG, tts_tag(), " speech rate : %d", g_config_info->speech_rate);
1075 SECURE_SLOG(LOG_DEBUG, tts_tag(), " pitch : %d", g_config_info->pitch);
1076 SLOG(LOG_DEBUG, tts_tag(), "=================");
1078 if (0 != __tts_config_mgr_register_config_event()) {
1079 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to register config event");
1080 __tts_config_release_client(uid);
1081 __tts_config_release_engine();
1082 tts_parser_unload_config(g_config_info);
1083 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1086 /* Register to detect display language change */
1087 vconf_notify_key_changed(TTS_LANGSET_KEY, __tts_config_display_language_changed_cb, NULL);
1088 vconf_notify_key_changed(TTS_ACCESSIBILITY_SPEED_KEY, __tts_config_speech_rate_key_changed_cb, NULL);
1089 vconf_notify_key_changed(TTS_ACCESSIBILITY_KEY, __tts_config_screen_reader_changed_cb, NULL);
1091 /* For engine directory monitoring */
1092 if (0 != __tts_config_mgr_register_engine_config_updated_event()) {
1093 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to register engine config updated event");
1094 __tts_config_release_client(uid);
1095 __tts_config_release_engine();
1096 tts_parser_unload_config(g_config_info);
1097 __tts_config_mgr_unregister_config_event();
1098 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1104 int tts_config_mgr_finalize(int uid)
1106 if (0 < __tts_config_release_client(uid)) {
1110 __tts_config_release_engine();
1112 tts_parser_unload_config(g_config_info);
1114 __tts_config_mgr_unregister_engine_config_updated_event();
1116 __tts_config_mgr_unregister_config_event();
1118 vconf_ignore_key_changed(TTS_LANGSET_KEY, __tts_config_display_language_changed_cb);
1119 vconf_ignore_key_changed(TTS_ACCESSIBILITY_SPEED_KEY, __tts_config_speech_rate_key_changed_cb);
1120 vconf_ignore_key_changed(TTS_ACCESSIBILITY_KEY, __tts_config_screen_reader_changed_cb);
1125 int tts_config_mgr_set_callback(int uid,
1126 tts_config_engine_changed_cb engine_cb,
1127 tts_config_voice_changed_cb voice_cb,
1128 tts_config_speech_rate_changed_cb speech_cb,
1129 tts_config_pitch_changed_cb pitch_cb,
1132 GSList *iter = NULL;
1133 tts_config_client_s* temp_client = NULL;
1135 /* Call all callbacks of client*/
1136 iter = g_slist_nth(g_config_client_list, 0);
1138 while (NULL != iter) {
1139 temp_client = iter->data;
1141 if (NULL != temp_client) {
1142 if (uid == temp_client->uid) {
1143 temp_client->engine_cb = engine_cb;
1144 temp_client->voice_cb = voice_cb;
1145 temp_client->speech_cb = speech_cb;
1146 temp_client->pitch_cb = pitch_cb;
1147 temp_client->user_data = user_data;
1151 iter = g_slist_next(iter);
1156 int tts_config_mgr_unset_callback(int uid)
1158 GSList *iter = NULL;
1159 tts_config_client_s* temp_client = NULL;
1161 /* Call all callbacks of client*/
1162 iter = g_slist_nth(g_config_client_list, 0);
1164 while (NULL != iter) {
1165 temp_client = iter->data;
1167 if (NULL != temp_client) {
1168 if (uid == temp_client->uid) {
1169 temp_client->engine_cb = NULL;
1170 temp_client->voice_cb = NULL;
1171 temp_client->speech_cb = NULL;
1172 temp_client->pitch_cb = NULL;
1173 temp_client->user_data = NULL;
1177 iter = g_slist_next(iter);
1183 int tts_config_set_screen_reader_callback(int uid, tts_config_screen_reader_changed_cb callback)
1185 if (NULL == callback) {
1186 SLOG(LOG_ERROR, tts_tag(), "Input parameter is NULL");
1187 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1190 GSList *iter = NULL;
1191 tts_config_client_s* temp_client = NULL;
1193 /* Call all callbacks of client*/
1194 iter = g_slist_nth(g_config_client_list, 0);
1196 while (NULL != iter) {
1197 temp_client = iter->data;
1199 if (NULL != temp_client) {
1200 if (uid == temp_client->uid) {
1201 temp_client->screen_cb = callback;
1205 iter = g_slist_next(iter);
1210 int tts_config_unset_screen_reader_callback(int uid)
1212 GSList *iter = NULL;
1213 tts_config_client_s* temp_client = NULL;
1215 /* Call all callbacks of client*/
1216 iter = g_slist_nth(g_config_client_list, 0);
1218 while (NULL != iter) {
1219 temp_client = iter->data;
1221 if (NULL != temp_client) {
1222 if (uid == temp_client->uid) {
1223 temp_client->screen_cb = NULL;
1227 iter = g_slist_next(iter);
1233 int tts_config_mgr_get_engine_list(tts_config_supported_engine_cb callback, void* user_data)
1235 if (0 >= g_slist_length(g_config_client_list)) {
1236 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1237 return TTS_CONFIG_ERROR_INVALID_STATE;
1240 GSList *iter = NULL;
1241 tts_engine_info_s *engine_info = NULL;
1243 if (0 >= g_slist_length(g_engine_list)) {
1244 SLOG(LOG_ERROR, tts_tag(), "There is no engine!!");
1245 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1248 /* Get a first item */
1249 iter = g_slist_nth(g_engine_list, 0);
1251 while (NULL != iter) {
1252 engine_info = iter->data;
1254 if (NULL != engine_info) {
1255 if (false == callback(engine_info->uuid, engine_info->name, engine_info->setting, user_data)) {
1260 iter = g_slist_next(iter);
1266 int tts_config_mgr_get_engine(char** engine)
1268 if (0 >= g_slist_length(g_config_client_list)) {
1269 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1270 return TTS_CONFIG_ERROR_INVALID_STATE;
1273 if (NULL == engine) {
1274 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Input parameter is NULL");
1275 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1278 if (NULL != g_config_info->engine_id) {
1279 /* Check engine id is valid */
1280 GSList *iter = NULL;
1281 tts_engine_info_s *engine_info = NULL;
1283 if (0 >= g_slist_length(g_engine_list)) {
1284 SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine!!");
1285 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1288 /* Get a first item */
1289 iter = g_slist_nth(g_engine_list, 0);
1291 while (NULL != iter) {
1292 engine_info = iter->data;
1294 if (NULL != engine_info) {
1295 if (0 == strcmp(engine_info->uuid, g_config_info->engine_id)) {
1296 *engine = strdup(g_config_info->engine_id);
1300 iter = g_slist_next(iter);
1303 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Current engine id is not valid");
1305 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Engine id is NULL");
1308 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1311 int tts_config_mgr_set_engine(const char* engine)
1313 if (0 >= g_slist_length(g_config_client_list)) {
1314 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1315 return TTS_CONFIG_ERROR_INVALID_STATE;
1319 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1321 /* Check current engine id with new engine id */
1322 if (0 == strcmp(g_config_info->engine_id, engine))
1325 if (0 >= g_slist_length(g_engine_list)) {
1326 SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine!!");
1327 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1330 SLOG(LOG_DEBUG, tts_tag(), "New engine id : %s", engine);
1332 GSList *iter = NULL;
1333 tts_engine_info_s *engine_info = NULL;
1334 bool is_valid_engine = false;
1336 /* Get a first item */
1337 iter = g_slist_nth(g_engine_list, 0);
1339 while (NULL != iter) {
1340 engine_info = iter->data;
1342 if (NULL == engine_info) {
1343 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Engine info is NULL");
1344 iter = g_slist_next(iter);
1348 /* Check engine id is valid */
1349 if (0 != strcmp(engine, engine_info->uuid)) {
1350 iter = g_slist_next(iter);
1354 if (NULL != g_config_info->engine_id)
1355 free(g_config_info->engine_id);
1357 g_config_info->engine_id = strdup(engine);
1359 if (NULL != g_config_info->setting)
1360 free(g_config_info->setting);
1362 if (NULL != engine_info->setting)
1363 g_config_info->setting = strdup(engine_info->setting);
1365 /* Engine is valid*/
1366 GSList *iter_voice = NULL;
1367 tts_config_voice_s* voice = NULL;
1368 bool is_valid_voice = false;
1370 /* Get a first item */
1371 iter_voice = g_slist_nth(engine_info->voices, 0);
1373 while (NULL != iter_voice) {
1374 /*Get handle data from list*/
1375 voice = iter_voice->data;
1377 if (NULL != voice) {
1378 if (NULL == voice->language)
1380 SLOG(LOG_DEBUG, tts_tag(), " lang(%s) type(%d)", voice->language, voice->type);
1382 if (0 == strcmp(voice->language, g_config_info->language)) {
1383 if (voice->type == g_config_info->type) {
1384 /* language is valid */
1385 is_valid_voice = true;
1387 if (NULL != g_config_info->language) {
1388 free(g_config_info->language);
1390 g_config_info->language = strdup(voice->language);
1391 g_config_info->type = voice->type;
1399 iter_voice = g_slist_next(iter_voice);
1402 if (false == is_valid_voice) {
1403 if (NULL != g_config_info->language) {
1404 free(g_config_info->language);
1406 iter_voice = g_slist_nth(engine_info->voices, 0);
1407 if (NULL != iter_voice) {
1408 voice = iter_voice->data;
1409 if (NULL != voice) {
1410 if (NULL != voice->language)
1411 g_config_info->language = strdup(voice->language);
1412 g_config_info->type = voice->type;
1418 is_valid_engine = true;
1422 if (true == is_valid_engine) {
1423 SLOG(LOG_DEBUG, tts_tag(), "[Config] Engine changed");
1424 SECURE_SLOG(LOG_DEBUG, tts_tag(), " Engine : %s", g_config_info->engine_id);
1425 SECURE_SLOG(LOG_DEBUG, tts_tag(), " Setting : %s", g_config_info->setting);
1426 SECURE_SLOG(LOG_DEBUG, tts_tag(), " Language : %s", g_config_info->language);
1427 SECURE_SLOG(LOG_DEBUG, tts_tag(), " Type : %d", g_config_info->type);
1429 if ( 0 != tts_parser_set_engine(g_config_info->engine_id, g_config_info->setting,
1430 g_config_info->language, g_config_info->type)) {
1431 SLOG(LOG_ERROR, tts_tag(), " Fail to save config");
1432 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1435 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Engine id is not valid");
1436 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1442 int tts_config_mgr_get_voice_list(const char* engine_id, tts_config_supported_voice_cb callback, void* user_data)
1444 if (0 >= g_slist_length(g_config_client_list)) {
1445 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1446 return TTS_CONFIG_ERROR_INVALID_STATE;
1449 if (0 >= g_slist_length(g_engine_list)) {
1450 SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine");
1451 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1454 GSList *iter = NULL;
1455 tts_engine_info_s *engine_info = NULL;
1457 /* Get a first item */
1458 iter = g_slist_nth(g_engine_list, 0);
1460 while (NULL != iter) {
1461 engine_info = iter->data;
1463 if (NULL == engine_info) {
1464 SLOG(LOG_ERROR, tts_tag(), "[ERROR] engine info is NULL");
1465 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1468 if (0 != strcmp(engine_id, engine_info->uuid)) {
1469 iter = g_slist_next(iter);
1473 GSList *iter_voice = NULL;
1474 tts_config_voice_s* voice = NULL;
1476 /* Get a first item */
1477 iter_voice = g_slist_nth(engine_info->voices, 0);
1479 while (NULL != iter_voice) {
1480 /*Get handle data from list*/
1481 voice = iter_voice->data;
1483 SLOG(LOG_DEBUG, tts_tag(), " lang(%s) type(%d)", voice->language, voice->type);
1484 if (NULL != voice->language) {
1485 if (false == callback(engine_info->uuid, voice->language, voice->type, user_data))
1490 iter_voice = g_slist_next(iter_voice);
1498 int tts_config_mgr_get_voice(char** language, int* type)
1500 if (0 >= g_slist_length(g_config_client_list)) {
1501 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1502 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1505 if (0 >= g_slist_length(g_engine_list)) {
1506 SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine");
1507 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1510 if (NULL == language || NULL == type)
1511 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1513 if (NULL != g_config_info->language) {
1514 *language = strdup(g_config_info->language);
1515 *type = g_config_info->type;
1517 SLOG(LOG_ERROR, tts_tag(), "language is NULL");
1518 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1524 int tts_config_mgr_set_voice(const char* language, int type)
1526 if (0 >= g_slist_length(g_config_client_list)) {
1527 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1528 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1531 if (NULL == language) {
1532 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Input parameter is NULL");
1533 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1536 if (0 >= g_slist_length(g_engine_list)) {
1537 SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine");
1538 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1541 /* Check language is valid */
1542 if (NULL != g_config_info->language) {
1543 if (0 != tts_parser_set_voice(language, type)) {
1544 SLOG(LOG_ERROR, tts_tag(), "Fail to save default voice");
1545 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1547 free(g_config_info->language);
1548 g_config_info->language = strdup(language);
1549 g_config_info->type = type;
1552 SLOG(LOG_ERROR, tts_tag(), "language is NULL");
1553 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1559 int tts_config_mgr_get_auto_voice(bool* value)
1561 if (0 >= g_slist_length(g_config_client_list)) {
1562 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1563 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1567 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1569 *value = g_config_info->auto_voice;
1574 int tts_config_mgr_set_auto_voice(bool value)
1576 if (0 >= g_slist_length(g_config_client_list)) {
1577 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1578 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1581 if (g_config_info->auto_voice != value) {
1582 /* Check language is valid */
1583 if (0 != tts_parser_set_auto_voice(value)) {
1584 SLOG(LOG_ERROR, tts_tag(), "Fail to save auto voice option");
1585 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1587 g_config_info->auto_voice = value;
1589 if (true == g_config_info->auto_voice) {
1590 __tts_config_set_auto_language();
1597 int tts_config_mgr_get_speech_rate(int* value)
1599 if (0 >= g_slist_length(g_config_client_list)) {
1600 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1601 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1604 if (NULL == value) {
1605 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1608 *value = g_config_info->speech_rate;
1613 int tts_config_mgr_set_speech_rate(int value)
1615 if (0 >= g_slist_length(g_config_client_list)) {
1616 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1617 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1620 if (TTS_CONFIG_SPEED_MIN <= value && value <= TTS_CONFIG_SPEED_MAX) {
1621 SLOG(LOG_DEBUG, tts_tag(), "[Config] Set speech rate : %d", value);
1622 if (0 != tts_parser_set_speech_rate(value)) {
1623 SLOG(LOG_ERROR, tts_tag(), "Fail to save speech rate");
1624 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1627 g_config_info->speech_rate = value;
1629 vconf_set_int(TTS_ACCESSIBILITY_SPEED_KEY, value);
1631 SLOG(LOG_ERROR, tts_tag(), "[Config ERROR] Speech rate is invalid : %d", value);
1637 int tts_config_mgr_get_pitch(int* value)
1639 if (0 >= g_slist_length(g_config_client_list)) {
1640 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1641 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1644 if (NULL == value) {
1645 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1648 GSList *iter = NULL;
1649 tts_engine_info_s *engine_info = NULL;
1651 if (0 >= g_slist_length(g_engine_list)) {
1652 SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine!!");
1653 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1656 /* Get a first item */
1657 iter = g_slist_nth(g_engine_list, 0);
1659 while (NULL != iter) {
1660 engine_info = iter->data;
1662 if (NULL == engine_info) {
1663 SLOG(LOG_ERROR, tts_tag(), "engine info is NULL");
1664 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1667 if (0 != strcmp(g_config_info->engine_id, engine_info->uuid)) {
1668 iter = g_slist_next(iter);
1672 if (false == engine_info->pitch_support) {
1673 return TTS_CONFIG_ERROR_NOT_SUPPORTED_FEATURE;
1679 *value = g_config_info->pitch;
1684 int tts_config_mgr_set_pitch(int value)
1686 if (0 >= g_slist_length(g_config_client_list)) {
1687 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1691 GSList *iter = NULL;
1692 tts_engine_info_s *engine_info = NULL;
1694 if (0 >= g_slist_length(g_engine_list)) {
1695 SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine!!");
1696 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1699 /* Get a first item */
1700 iter = g_slist_nth(g_engine_list, 0);
1702 while (NULL != iter) {
1703 engine_info = iter->data;
1705 if (NULL == engine_info) {
1706 SLOG(LOG_ERROR, tts_tag(), "engine info is NULL");
1707 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1710 if (0 != strcmp(g_config_info->engine_id, engine_info->uuid)) {
1711 iter = g_slist_next(iter);
1715 if (false == engine_info->pitch_support) {
1716 return TTS_CONFIG_ERROR_NOT_SUPPORTED_FEATURE;
1722 if (0 != tts_parser_set_pitch(value)) {
1723 SLOG(LOG_ERROR, tts_tag(), "Fail to save speech rate");
1724 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1727 g_config_info->pitch = value;
1732 bool tts_config_check_default_engine_is_valid(const char* engine)
1734 if (0 >= g_slist_length(g_config_client_list)) {
1735 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1742 if (0 >= g_slist_length(g_engine_list))
1745 GSList *iter = NULL;
1746 tts_engine_info_s *engine_info = NULL;
1748 /* Get a first item */
1749 iter = g_slist_nth(g_engine_list, 0);
1751 while (NULL != iter) {
1752 engine_info = iter->data;
1754 if (NULL != engine_info) {
1755 if (0 == strcmp(engine, engine_info->uuid)) {
1759 iter = g_slist_next(iter);
1765 bool tts_config_check_default_voice_is_valid(const char* language, int type)
1767 if (0 >= g_slist_length(g_config_client_list)) {
1768 SLOG(LOG_ERROR, tts_tag(), "Not initialized");
1772 if (NULL == language)
1775 if (NULL == g_config_info->engine_id) {
1776 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Default engine id is NULL");
1780 if (0 >= g_slist_length(g_engine_list))
1783 GSList *iter = NULL;
1784 tts_engine_info_s *engine_info = NULL;
1786 /* Get a first item */
1787 iter = g_slist_nth(g_engine_list, 0);
1789 while (NULL != iter) {
1790 engine_info = iter->data;
1792 if (NULL == engine_info) {
1793 SLOG(LOG_ERROR, tts_tag(), "[ERROR] Engine info is NULL");
1794 iter = g_slist_next(iter);
1798 if (0 != strcmp(g_config_info->engine_id, engine_info->uuid)) {
1799 iter = g_slist_next(iter);
1803 GSList *iter_voice = NULL;
1804 tts_config_voice_s* voice = NULL;
1806 /* Get a first item */
1807 iter_voice = g_slist_nth(engine_info->voices, 0);
1809 while (NULL != iter_voice) {
1810 voice = iter_voice->data;
1812 if (0 == strcmp(language, voice->language) && voice->type == type)
1816 iter_voice = g_slist_next(iter_voice);
1826 int __tts_config_mgr_print_engine_info()
1828 GSList *iter = NULL;
1829 tts_engine_info_s *engine_info = NULL;
1831 if (0 >= g_slist_length(g_engine_list)) {
1832 SLOG(LOG_DEBUG, tts_tag(), "-------------- engine list -----------------");
1833 SLOG(LOG_DEBUG, tts_tag(), " No Engine in engine directory");
1834 SLOG(LOG_DEBUG, tts_tag(), "--------------------------------------------");
1838 /* Get a first item */
1839 iter = g_slist_nth(g_engine_list, 0);
1841 SLOG(LOG_DEBUG, tts_tag(), "--------------- engine list -----------------");
1844 while (NULL != iter) {
1845 engine_info = iter->data;
1847 SLOG(LOG_DEBUG, tts_tag(), "[%dth]", i);
1848 SLOG(LOG_DEBUG, tts_tag(), " name : %s", engine_info->name);
1849 SLOG(LOG_DEBUG, tts_tag(), " id : %s", engine_info->uuid);
1850 SLOG(LOG_DEBUG, tts_tag(), " setting : %s", engine_info->setting);
1852 SLOG(LOG_DEBUG, tts_tag(), " Voices");
1853 GSList *iter_voice = NULL;
1854 tts_config_voice_s* voice = NULL;
1856 if (g_slist_length(engine_info->voices) > 0) {
1857 /* Get a first item */
1858 iter_voice = g_slist_nth(engine_info->voices, 0);
1861 while (NULL != iter_voice) {
1862 /*Get handle data from list*/
1863 voice = iter_voice->data;
1865 SLOG(LOG_DEBUG, tts_tag(), " [%dth] lang(%s) type(%d)", j, voice->language, voice->type);
1868 iter_voice = g_slist_next(iter_voice);
1872 SLOG(LOG_ERROR, tts_tag(), " Voice is NONE");
1874 iter = g_slist_next(iter);
1877 SLOG(LOG_DEBUG, tts_tag(), "--------------------------------------------");
1882 char* tts_config_get_message_path(int mode, int pid)
1885 path = calloc(128, sizeof(char));
1888 case 0: snprintf(path, 128, "%s%s_%d", MESSAGE_FILE_PATH_ROOT, MESSAGE_FILE_PREFIX_DEFAULT, pid); break;
1889 case 1: snprintf(path, 128, "%s%s_%d", MESSAGE_FILE_PATH_ROOT, MESSAGE_FILE_PREFIX_NOTIFICATION, pid); break;
1890 case 2: snprintf(path, 128, "%s%s_%d", MESSAGE_FILE_PATH_ROOT, MESSAGE_FILE_PREFIX_SCREEN_READER, pid); break;
1892 if (NULL != path) free(path);
1893 SLOG(LOG_ERROR, tts_tag(), "[Config] Invalid mode (%d)", mode);