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;
36 tts_config_bg_volume_ratio_changed_cb bg_volume_ratio_cb;
38 void* screen_user_data;
39 } tts_config_client_s;
41 static GSList* g_engine_list = NULL;
43 static GSList* g_config_client_list = NULL;
45 static tts_config_s* g_config_info = NULL;
46 extern char g_engine_id[128];
47 extern char g_setting[128];
48 extern char g_language[128];
50 static Ecore_Fd_Handler* g_config_fd_handler_noti = NULL;
51 static int g_config_fd_noti;
52 static int g_config_wd_noti;
54 /* For engine directory monitoring */
56 Ecore_Fd_Handler* dir_fd_handler;
59 } tts_engine_inotify_s;
61 static GList* g_ino_list = NULL;
63 int __tts_config_mgr_print_engine_info();
64 static int __tts_config_mgr_register_engine_config_updated_event(const char* path);
65 static int __tts_config_mgr_unregister_engine_config_updated_event();
67 static char* __get_default_engine_app_id()
69 char* engine_name = vconf_get_str(TTS_ENGINE_DB_DEFAULT);
70 if (NULL == engine_name) {
71 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to get engine name");
72 engine_name = strdup(TTS_SERVER_ENGINE_DEFAULT);
78 static tts_engine_info_s* __get_engine_info(const char* engine_id)
80 if (NULL == engine_id) {
81 SLOG(LOG_ERROR, TAG_TTSCONFIG, "engine_id is NULL");
85 for (GSList* iter = g_slist_nth(g_engine_list, 0); NULL != iter; iter = g_slist_next(iter)) {
86 tts_engine_info_s* engine_info = iter->data;
87 if (NULL == engine_info) {
88 SLOG(LOG_WARN, TAG_TTSCONFIG, "engine info is NULL");
92 if (NULL != engine_info->uuid && 0 == strcmp(engine_id, engine_info->uuid)) {
93 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Success to find engine info : %s", engine_id);
101 int __tts_config_mgr_check_engine_is_valid(const char* engine_id)
103 if (NULL == engine_id) {
104 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Input parameter is NULL");
108 if (0 >= g_slist_length(g_engine_list)) {
109 SLOG(LOG_ERROR, TAG_TTSCONFIG, "There is no engine!!");
113 if (NULL != __get_engine_info(engine_id)) {
114 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Default engine is valid : %s", engine_id);
115 return TTS_CONFIG_ERROR_NONE;
118 /* Change default engine */
119 char* default_engine = __get_default_engine_app_id();
120 tts_engine_info_s *engine_info = __get_engine_info(default_engine);
121 free(default_engine);
123 if (NULL == engine_info) {
124 GSList* iter = g_slist_nth(g_engine_list, 0);
126 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] No engine in list");
127 return TTS_CONFIG_ERROR_OPERATION_FAILED;
130 engine_info = iter->data;
131 if (NULL == engine_info) {
132 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Invalid engine info in list");
133 return TTS_CONFIG_ERROR_OPERATION_FAILED;
136 if (NULL != engine_info->uuid) {
137 vconf_set_str(TTS_ENGINE_DB_DEFAULT, engine_info->uuid);
141 if (NULL != engine_info->uuid) {
142 memset(g_engine_id, '\0', sizeof(g_engine_id));
143 g_config_info->engine_id = g_engine_id;
144 strncpy(g_config_info->engine_id, engine_info->uuid, sizeof(g_engine_id) - 1);
146 if (NULL != engine_info->setting) {
147 memset(g_setting, '\0', sizeof(g_setting));
148 g_config_info->setting = g_setting;
149 strncpy(g_config_info->setting, engine_info->setting, sizeof(g_setting) - 1);
152 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Default engine is changed : %s", g_config_info->engine_id);
154 /* Change is default voice */
155 GSList *iter_voice = NULL;
156 tts_config_voice_s* voice = NULL;
157 bool is_valid_voice = false;
159 /* Get a first item */
160 iter_voice = g_slist_nth(engine_info->voices, 0);
162 while (NULL != iter_voice) {
163 /*Get handle data from list*/
164 voice = iter_voice->data;
167 if (NULL != voice->language) {
168 if (0 == strcmp(voice->language, g_config_info->language)) {
169 if (voice->type == g_config_info->type) {
170 /* language is valid */
171 is_valid_voice = true;
173 memset(g_language, '\0', sizeof(g_language));
174 g_config_info->language = g_language;
175 strncpy(g_config_info->language, voice->language, sizeof(g_language) - 1);
177 g_config_info->type = voice->type;
179 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Default voice is changed : lang(%s) type(%d)", voice->language, voice->type);
186 iter_voice = g_slist_next(iter_voice);
189 if (false == is_valid_voice) {
190 /* Select first voice as default */
191 memset(g_language, '\0', sizeof(g_language));
192 g_config_info->language = g_language;
194 iter_voice = g_slist_nth(engine_info->voices, 0);
195 if (NULL == iter_voice) {
196 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Fail to get voice list");
197 return TTS_CONFIG_ERROR_OPERATION_FAILED;
199 voice = iter_voice->data;
201 if (NULL == voice || NULL == voice->language) {
202 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Fail to get voice info from list");
203 return TTS_CONFIG_ERROR_OPERATION_FAILED;
205 strncpy(g_config_info->language, voice->language, sizeof(g_language) - 1);
207 g_config_info->type = voice->type;
208 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Default voice is changed : lang(%s) type(%d)", voice->language, voice->type);
211 if (0 != tts_parser_set_engine(g_config_info->engine_id, g_config_info->setting, g_config_info->language, g_config_info->type)) {
212 SLOG(LOG_ERROR, TAG_TTSCONFIG, " Fail to save config");
213 return TTS_CONFIG_ERROR_OPERATION_FAILED;
219 bool __tts_config_mgr_check_lang_is_valid(const char* engine_id, const char* language, int type)
221 if (NULL == engine_id || NULL == language) {
222 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Input parameter is NULL");
227 tts_engine_info_s *engine_info = NULL;
229 if (0 >= g_slist_length(g_engine_list)) {
230 SLOG(LOG_ERROR, TAG_TTSCONFIG, "There is no engine!!");
234 /* Get a first item */
235 iter = g_slist_nth(g_engine_list, 0);
237 while (NULL != iter) {
238 engine_info = iter->data;
240 if (NULL == engine_info) {
241 SLOG(LOG_ERROR, TAG_TTSCONFIG, "engine info is NULL");
245 if (0 != strcmp(engine_id, engine_info->uuid)) {
246 iter = g_slist_next(iter);
250 GSList *iter_voice = NULL;
251 tts_config_voice_s* voice = NULL;
253 if (g_slist_length(engine_info->voices) <= 0) {
254 SLOG(LOG_ERROR, TAG_TTSCONFIG, "There is no voice : %s", engine_info->uuid);
255 iter = g_slist_next(iter);
259 /* Get a first item */
260 iter_voice = g_slist_nth(engine_info->voices, 0);
263 while (NULL != iter_voice) {
264 /*Get handle data from list*/
265 voice = iter_voice->data;
268 if (0 == strcmp(language, voice->language)) {
269 if (type == voice->type) {
276 iter_voice = g_slist_next(iter_voice);
286 int __tts_config_mgr_select_lang(const char* engine_id, char** language, int* type)
288 if (NULL == engine_id || NULL == language) {
289 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Input parameter is NULL");
294 tts_engine_info_s *engine_info = NULL;
296 if (0 >= g_slist_length(g_engine_list)) {
297 SLOG(LOG_ERROR, TAG_TTSCONFIG, "There is no engine!!");
301 /* Get a first item */
302 iter = g_slist_nth(g_engine_list, 0);
304 while (NULL != iter) {
305 engine_info = iter->data;
307 if (NULL == engine_info) {
308 SLOG(LOG_ERROR, TAG_TTSCONFIG, "engine info is NULL");
312 if (0 != strcmp(engine_id, engine_info->uuid)) {
313 iter = g_slist_next(iter);
317 GSList *iter_voice = NULL;
318 tts_config_voice_s* voice = NULL;
320 if (g_slist_length(engine_info->voices) <= 0) {
321 SLOG(LOG_ERROR, TAG_TTSCONFIG, "There is no voice : %s", engine_info->uuid);
325 /* Get a first item */
326 iter_voice = g_slist_nth(engine_info->voices, 0);
328 while (NULL != iter_voice) {
329 voice = iter_voice->data;
331 /* Default language */
332 if (0 == strcmp(TTS_BASE_LANGUAGE, voice->language)) {
333 *language = strdup(voice->language);
336 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Selected language(%s) type(%d)", *language, *type);
340 iter_voice = g_slist_next(iter_voice);
343 /* Not support base language */
345 *language = strdup(voice->language);
348 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Selected language(%s) type(%d)", *language, *type);
357 Eina_Bool tts_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handler)
359 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "@@@ Config changed callback event");
362 struct inotify_event event;
363 memset(&event, '\0', sizeof(struct inotify_event));
365 length = read(g_config_fd_noti, &event, sizeof(struct inotify_event));
367 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Empty Inotify event");
368 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "@@@");
369 return ECORE_CALLBACK_DONE;
372 if (IN_CLOSE_WRITE == event.mask) {
373 /* check config changed state */
375 char* setting = NULL;
377 bool auto_voice = g_config_info->auto_voice;
379 int speech_rate = -1;
381 double bg_volume_ratio = -1;
384 tts_config_client_s* temp_client = NULL;
386 if (0 != tts_parser_find_config_changed(&engine, &setting, &auto_voice, &lang, &voice_type, &speech_rate, &pitch, &bg_volume_ratio))
387 return ECORE_CALLBACK_PASS_ON;
390 if (NULL != engine || NULL != setting) {
391 if (NULL != engine) {
392 memset(g_engine_id, '\0', sizeof(g_engine_id));
393 g_config_info->engine_id = g_engine_id;
394 strncpy(g_config_info->engine_id, engine, sizeof(g_engine_id) - 1);
396 if (NULL != setting) {
397 memset(g_setting, '\0', sizeof(g_setting));
398 g_config_info->setting = g_setting;
399 strncpy(g_config_info->setting, setting, sizeof(g_setting) - 1);
402 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Engine change(%s)", g_config_info->engine_id);
404 /* Call all callbacks of client*/
405 iter = g_slist_nth(g_config_client_list, 0);
407 while (NULL != iter) {
408 temp_client = iter->data;
410 if (NULL != temp_client) {
411 if (NULL != temp_client->engine_cb) {
412 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Engine changed callback : uid(%d)", temp_client->uid);
413 temp_client->engine_cb(g_config_info->engine_id, g_config_info->setting,
414 g_config_info->language, g_config_info->type,
415 g_config_info->auto_voice, g_config_info->credential, temp_client->user_data);
419 iter = g_slist_next(iter);
423 if (auto_voice != g_config_info->auto_voice) {
424 g_config_info->auto_voice = auto_voice;
427 if (NULL != lang || -1 != voice_type) {
428 char* before_lang = NULL;
431 before_lang = strdup(g_config_info->language);
432 before_type = g_config_info->type;
435 memset(g_language, '\0', sizeof(g_language));
436 g_config_info->language = g_language;
437 strncpy(g_config_info->language, lang, sizeof(g_language) - 1);
439 if (-1 != voice_type) {
440 g_config_info->type = voice_type;
443 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Voice change(%s, %d)", g_config_info->language, g_config_info->type);
445 /* Call all callbacks of client*/
446 iter = g_slist_nth(g_config_client_list, 0);
448 while (NULL != iter) {
449 temp_client = iter->data;
451 if (NULL != temp_client) {
452 if (NULL != temp_client->voice_cb) {
453 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Voice changed callback : uid(%d)", temp_client->uid);
454 temp_client->voice_cb(before_lang, before_type,
455 g_config_info->language, g_config_info->type,
456 g_config_info->auto_voice, temp_client->user_data);
460 iter = g_slist_next(iter);
463 if (NULL != before_lang) {
469 if (-1 != speech_rate) {
470 g_config_info->speech_rate = speech_rate;
472 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Speech rate change(%d)", g_config_info->speech_rate);
474 /* Call all callbacks of client*/
475 iter = g_slist_nth(g_config_client_list, 0);
477 while (NULL != iter) {
478 temp_client = iter->data;
480 if (NULL != temp_client) {
481 if (NULL != temp_client->speech_cb) {
482 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Speech rate changed callback : uid(%d)", temp_client->uid);
483 temp_client->speech_cb(g_config_info->speech_rate, temp_client->user_data);
487 iter = g_slist_next(iter);
492 g_config_info->pitch = pitch;
494 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "pitch change(%d)", g_config_info->pitch);
496 /* Call all callbacks of client*/
497 iter = g_slist_nth(g_config_client_list, 0);
499 while (NULL != iter) {
500 temp_client = iter->data;
502 if (NULL != temp_client) {
503 if (NULL != temp_client->pitch_cb) {
504 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Pitch changed callback : uid(%d)", temp_client->uid);
505 temp_client->pitch_cb(g_config_info->pitch, temp_client->user_data);
509 iter = g_slist_next(iter);
513 if (-1 != bg_volume_ratio) {
514 g_config_info->bg_volume_ratio = bg_volume_ratio;
516 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "background volume ratio change(%lf)", g_config_info->bg_volume_ratio);
518 /* Call all callbacks of client*/
519 iter = g_slist_nth(g_config_client_list, 0);
521 while (NULL != iter) {
522 temp_client = iter->data;
524 if (NULL != temp_client) {
525 if (NULL != temp_client->bg_volume_ratio_cb) {
526 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "background volume ratio changed callback : uid(%d)", temp_client->uid);
527 temp_client->bg_volume_ratio_cb(g_config_info->bg_volume_ratio, temp_client->user_data);
531 iter = g_slist_next(iter);
535 if (NULL != engine) {
539 if (NULL != setting) {
547 } else if (IN_DELETE_SELF == event.mask) {
548 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] IN_DELETE_SELF event");
550 tts_parser_unload_config(g_config_info);
552 tts_parser_load_config(&g_config_info);
554 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Undefined event (0x%x)", event.mask);
557 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "@@@");
559 return ECORE_CALLBACK_PASS_ON;
562 int __tts_config_mgr_register_config_event()
564 /* get file notification handler */
570 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail get inotify fd");
573 g_config_fd_noti = fd;
575 wd = inotify_add_watch(fd, TTS_CONFIG, IN_CLOSE_WRITE|IN_DELETE_SELF);
576 g_config_wd_noti = wd;
578 g_config_fd_handler_noti = ecore_main_fd_handler_add(fd, ECORE_FD_READ,
579 (Ecore_Fd_Cb)tts_config_mgr_inotify_event_cb, NULL, NULL, NULL);
580 if (NULL == g_config_fd_handler_noti) {
581 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get handler_noti");
585 /* Set non-blocking mode of file */
587 value = fcntl(fd, F_GETFL, 0);
590 if (0 > fcntl(fd, F_SETFL, value)) {
591 SLOG(LOG_WARN, TAG_TTSCONFIG, "[WARNING] Fail to set non-block mode");
597 int __tts_config_mgr_unregister_config_event()
599 /* delete inotify variable */
600 ecore_main_fd_handler_del(g_config_fd_handler_noti);
601 inotify_rm_watch(g_config_fd_noti, g_config_wd_noti);
602 close(g_config_fd_noti);
607 int __tts_config_set_auto_language()
610 value = vconf_get_str(TTS_LANGSET_KEY);
612 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[Config ERROR] Fail to get display language");
616 char temp_lang[6] = {'\0', };
617 strncpy(temp_lang, value, 5);
621 if (true == __tts_config_mgr_check_lang_is_valid(g_config_info->engine_id, temp_lang, g_config_info->type)) {
622 /* tts default voice change */
623 if (NULL == g_config_info->language) {
624 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Current config language is NULL");
628 char* before_lang = NULL;
631 if (0 != tts_parser_set_voice(temp_lang, g_config_info->type)) {
632 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Fail to save default voice");
636 before_lang = strdup(g_config_info->language);
637 before_type = g_config_info->type;
639 memset(g_language, '\0', sizeof(g_language));
640 g_config_info->language = g_language;
641 strncpy(g_config_info->language, temp_lang, sizeof(g_language) - 1);
643 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[Config] Default voice : lang(%s) type(%d)",
644 g_config_info->language, g_config_info->type);
647 tts_config_client_s* temp_client = NULL;
649 /* Call all callbacks of client*/
650 iter = g_slist_nth(g_config_client_list, 0);
652 while (NULL != iter) {
653 temp_client = iter->data;
655 if (NULL != temp_client) {
656 if (NULL != temp_client->voice_cb) {
657 temp_client->voice_cb(before_lang, before_type,
658 g_config_info->language, g_config_info->type,
659 g_config_info->auto_voice, temp_client->user_data);
663 iter = g_slist_next(iter);
666 if (NULL != before_lang) {
671 /* Display language is not valid */
672 char* tmp_language = NULL;
674 if (0 != __tts_config_mgr_select_lang(g_config_info->engine_id, &tmp_language, &tmp_type)) {
675 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to select language");
679 if (NULL == tmp_language) {
680 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] language is NULL");
684 if (0 != tts_parser_set_voice(tmp_language, tmp_type)) {
685 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to save config");
689 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[Config] Default voice : lang(%s) type(%d)",
690 tmp_language, tmp_type);
693 tts_config_client_s* temp_client = NULL;
695 /* Call all callbacks of client*/
696 iter = g_slist_nth(g_config_client_list, 0);
698 while (NULL != iter) {
699 temp_client = iter->data;
701 if (NULL != temp_client) {
702 if (NULL != temp_client->voice_cb) {
703 temp_client->voice_cb(g_config_info->language, g_config_info->type,
704 tmp_language, tmp_type, g_config_info->auto_voice, temp_client->user_data);
708 iter = g_slist_next(iter);
712 memset(g_language, '\0', sizeof(g_language));
713 g_config_info->language = g_language;
714 strncpy(g_config_info->language, tmp_language, sizeof(g_language) - 1);
716 g_config_info->type = tmp_type;
725 void __tts_config_display_language_changed_cb(keynode_t *key, void *data)
727 if (NULL == g_config_info) {
728 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Current config info is invalid.");
732 if (true == g_config_info->auto_voice) {
733 __tts_config_set_auto_language();
739 void __tts_config_screen_reader_changed_cb(keynode_t *key, void *data)
743 ret = vconf_get_bool(TTS_ACCESSIBILITY_KEY, &screen_reader);
745 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[Config ERROR] Fail to get screen reader");
750 tts_config_client_s* temp_client = NULL;
752 /* Call all callbacks of client*/
753 iter = g_slist_nth(g_config_client_list, 0);
755 while (NULL != iter) {
756 temp_client = iter->data;
758 if (NULL != temp_client) {
759 if (NULL != temp_client->screen_cb) {
760 temp_client->screen_cb((bool)screen_reader, temp_client->screen_user_data);
764 iter = g_slist_next(iter);
768 int __tts_config_release_client(int uid)
771 tts_config_client_s* temp_client = NULL;
773 if (0 < g_slist_length(g_config_client_list)) {
775 iter = g_slist_nth(g_config_client_list, 0);
777 while (NULL != iter) {
778 temp_client = iter->data;
780 if (NULL != temp_client) {
781 if (uid == temp_client->uid) {
782 g_config_client_list = g_slist_remove(g_config_client_list, temp_client);
789 iter = g_slist_next(iter);
793 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Client count (%d)", g_slist_length(g_config_client_list));
795 return g_slist_length(g_config_client_list);
798 void __tts_config_release_engine()
801 tts_engine_info_s *engine_info = NULL;
803 if (0 < g_slist_length(g_engine_list)) {
805 /* Get a first item */
806 iter = g_slist_nth(g_engine_list, 0);
808 while (NULL != iter) {
809 engine_info = iter->data;
811 if (NULL != engine_info) {
812 g_engine_list = g_slist_remove(g_engine_list, engine_info);
814 tts_parser_free_engine_info(engine_info);
817 iter = g_slist_nth(g_engine_list, 0);
824 int __tts_config_mgr_get_engine_info()
827 struct dirent *dirp = NULL;
829 char filepath[512] = {'\0',};
831 tts_engine_info_s* info = NULL;
833 __tts_config_release_engine();
834 g_engine_list = NULL;
835 __tts_config_mgr_unregister_engine_config_updated_event();
837 /* Copy default info directory to download directory */
838 dp = opendir(TTS_DEFAULT_ENGINE_INFO);
840 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[CONFIG] No default directory : %s", TTS_DEFAULT_ENGINE_INFO);
846 if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name))
849 filesize = strlen(TTS_DEFAULT_ENGINE_INFO) + strlen(dirp->d_name) + 2;
850 if (filesize >= 512) {
851 SECURE_SLOG(LOG_ERROR, TAG_TTSCONFIG, "[CONFIG ERROR] File path is too long : %s", dirp->d_name);
856 memset(filepath, '\0', 512);
857 snprintf(filepath, 512, "%s/%s", TTS_DEFAULT_ENGINE_INFO, dirp->d_name);
859 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[CONFIG] Filepath(%s)", filepath);
861 char dest[512] = {'\0',};
862 snprintf(dest, 512, "%s/%s", TTS_DOWNLOAD_ENGINE_INFO, dirp->d_name);
864 if (0 != access(dest, F_OK)) {
865 if (0 != tts_parser_copy_xml(filepath, dest)) {
866 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[CONFIG ERROR] Fail to copy engine info");
870 } while (NULL != dirp);
875 /* Get engine info from default engine directory */
876 dp = opendir(TTS_DOWNLOAD_ENGINE_INFO);
878 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[CONFIG] No downloadable directory : %s", TTS_DOWNLOAD_ENGINE_INFO);
884 if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name))
887 filesize = strlen(TTS_DOWNLOAD_ENGINE_INFO) + strlen(dirp->d_name) + 2;
888 if (filesize >= 512) {
889 SECURE_SLOG(LOG_ERROR, TAG_TTSCONFIG, "[CONFIG ERROR] File path is too long : %s", dirp->d_name);
894 memset(filepath, '\0', 512);
895 snprintf(filepath, 512, "%s/%s", TTS_DOWNLOAD_ENGINE_INFO, dirp->d_name);
897 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[CONFIG] Filepath(%s)", filepath);
899 if (0 == tts_parser_get_engine_info(filepath, &info)) {
900 g_engine_list = g_slist_append(g_engine_list, info);
901 if (0 != __tts_config_mgr_register_engine_config_updated_event(filepath)) {
902 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to register engine config updated event");
906 } while (NULL != dirp);
911 if (0 >= g_slist_length(g_engine_list)) {
912 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] No engine");
919 static Eina_Bool __tts_config_mgr_engine_config_inotify_event_callback(void* data, Ecore_Fd_Handler *fd_handler)
921 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "@@@ Engine config updated callback event");
923 tts_engine_inotify_s *ino = (tts_engine_inotify_s *)data;
924 int dir_fd = ino->dir_fd;
927 struct inotify_event event;
928 memset(&event, '\0', sizeof(struct inotify_event));
930 length = read(dir_fd, &event, sizeof(struct inotify_event));
932 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Empty Inotify event");
933 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "@@@");
934 return ECORE_CALLBACK_DONE;
937 if (IN_CLOSE_WRITE == event.mask) {
938 int ret = __tts_config_mgr_get_engine_info();
940 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get engine info when config updated");
942 __tts_config_mgr_print_engine_info();
943 bool support = tts_config_check_default_voice_is_valid(g_config_info->language, g_config_info->type);
944 if (false == support) {
945 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[ERROR] Default voice is valid");
946 char* temp_lang = NULL;
948 ret = __tts_config_mgr_select_lang(g_config_info->engine_id, &temp_lang, &temp_type);
950 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get voice");
953 ret = tts_config_mgr_set_voice(temp_lang, temp_type);
955 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to set voice");
957 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[DEBUG] Saved default voice : lang(%s), type(%d)", g_config_info->language, g_config_info->type);
959 if (NULL != temp_lang) {
966 tts_config_client_s* temp_client = NULL;
967 /* Call all callbacks of client*/
968 iter = g_slist_nth(g_config_client_list, 0);
970 while (NULL != iter) {
971 temp_client = iter->data;
973 if (NULL != temp_client) {
974 if (NULL != temp_client->engine_cb) {
975 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Engine changed callback : uid(%d)", temp_client->uid);
976 temp_client->engine_cb(g_config_info->engine_id, g_config_info->setting,
977 g_config_info->language, g_config_info->type,
978 g_config_info->auto_voice, g_config_info->credential, temp_client->user_data);
982 iter = g_slist_next(iter);
985 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Undefined event");
988 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "@@@");
990 return ECORE_CALLBACK_PASS_ON;
993 static int __tts_config_mgr_register_engine_config_updated_event(const char* path)
996 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Path is NULL");
1000 /* For engine directory monitoring */
1001 tts_engine_inotify_s *ino = (tts_engine_inotify_s *)calloc(1, sizeof(tts_engine_inotify_s));
1003 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to allocate memory");
1007 ino->dir_fd = inotify_init();
1008 if (ino->dir_fd < 0) {
1009 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to init inotify");
1016 ino->dir_wd = inotify_add_watch(ino->dir_fd, path, IN_CLOSE_WRITE);
1017 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Add inotify watch(%s)", path);
1018 if (ino->dir_wd < 0) {
1019 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to add watch");
1025 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);
1026 if (NULL == ino->dir_fd_handler) {
1027 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to add fd handler");
1033 /* Set non-blocking mode of file */
1035 value = fcntl(ino->dir_fd, F_GETFL, 0);
1036 value |= O_NONBLOCK;
1038 if (0 > fcntl(ino->dir_fd, F_SETFL, value)) {
1039 SLOG(LOG_WARN, TAG_TTSCONFIG, "[WARNING] Fail to set non-block mode");
1042 g_ino_list = g_list_append(g_ino_list, ino);
1047 static int __tts_config_mgr_unregister_engine_config_updated_event()
1049 /* delete all inotify variable */
1050 if (0 < g_list_length(g_ino_list)) {
1052 iter = g_list_first(g_ino_list);
1054 while (NULL != iter) {
1055 tts_engine_inotify_s *tmp = iter->data;
1058 ecore_main_fd_handler_del(tmp->dir_fd_handler);
1059 inotify_rm_watch(tmp->dir_fd, tmp->dir_wd);
1066 g_ino_list = g_list_delete_link(g_ino_list, iter);
1067 iter = g_list_first(g_ino_list);
1074 int tts_config_mgr_initialize(int uid)
1076 GSList *iter = NULL;
1078 tts_config_client_s* temp_client = NULL;
1081 if (0 < g_slist_length(g_config_client_list)) {
1083 iter = g_slist_nth(g_config_client_list, 0);
1085 while (NULL != iter) {
1086 get_uid = iter->data;
1088 if (uid == *get_uid) {
1089 SECURE_SLOG(LOG_WARN, TAG_TTSCONFIG, "[CONFIG] uid(%d) has already registered", uid);
1093 iter = g_slist_next(iter);
1096 temp_client = (tts_config_client_s*)calloc(1, sizeof(tts_config_client_s));
1097 if (NULL == temp_client) {
1098 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to allocate memory");
1099 return TTS_CONFIG_ERROR_OUT_OF_MEMORY;
1101 temp_client->uid = uid;
1102 temp_client->engine_cb = NULL;
1103 temp_client->voice_cb = NULL;
1104 temp_client->speech_cb = NULL;
1105 temp_client->pitch_cb = NULL;
1106 temp_client->screen_cb = NULL;
1107 temp_client->bg_volume_ratio_cb = NULL;
1108 temp_client->user_data = NULL;
1109 temp_client->screen_user_data = NULL;
1111 g_config_client_list = g_slist_append(g_config_client_list, temp_client);
1113 SECURE_SLOG(LOG_WARN, TAG_TTSCONFIG, "[CONFIG] Add uid(%d) but config has already initialized", uid);
1116 temp_client = (tts_config_client_s*)calloc(1, sizeof(tts_config_client_s));
1117 if (NULL == temp_client) {
1118 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to allocate memory");
1119 return TTS_CONFIG_ERROR_OUT_OF_MEMORY;
1121 temp_client->uid = uid;
1122 temp_client->engine_cb = NULL;
1123 temp_client->voice_cb = NULL;
1124 temp_client->speech_cb = NULL;
1125 temp_client->pitch_cb = NULL;
1126 temp_client->screen_cb = NULL;
1127 temp_client->bg_volume_ratio_cb = NULL;
1128 temp_client->user_data = NULL;
1129 temp_client->screen_user_data = NULL;
1131 g_config_client_list = g_slist_append(g_config_client_list, temp_client);
1134 if (0 != access(TTS_CONFIG_BASE, F_OK)) {
1135 if (0 != mkdir(TTS_CONFIG_BASE, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
1136 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to make directory : %s", TTS_CONFIG_BASE);
1137 __tts_config_release_client(uid);
1138 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1140 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Success to make directory : %s", TTS_CONFIG_BASE);
1144 if (0 != access(TTS_HOME, F_OK)) {
1145 if (0 != mkdir(TTS_HOME, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
1146 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to make directory : %s", TTS_HOME);
1147 __tts_config_release_client(uid);
1148 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1150 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Success to make directory : %s", TTS_HOME);
1154 if (0 != access(TTS_DOWNLOAD_BASE, F_OK)) {
1155 if (0 != mkdir(TTS_DOWNLOAD_BASE, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
1156 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to make directory : %s", TTS_DOWNLOAD_BASE);
1157 __tts_config_release_client(uid);
1158 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1160 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Success to make directory : %s", TTS_DOWNLOAD_BASE);
1164 if (0 != access(TTS_DOWNLOAD_ENGINE_INFO, F_OK)) {
1165 if (0 != mkdir(TTS_DOWNLOAD_ENGINE_INFO, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
1166 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to make directory : %s", TTS_DOWNLOAD_ENGINE_INFO);
1167 __tts_config_release_client(uid);
1168 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1170 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Success to make directory : %s", TTS_DOWNLOAD_ENGINE_INFO);
1174 if (0 != __tts_config_mgr_get_engine_info()) {
1175 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get engine info");
1176 __tts_config_release_client(uid);
1177 __tts_config_release_engine();
1178 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1181 __tts_config_mgr_print_engine_info();
1183 if (0 != tts_parser_load_config(&g_config_info)) {
1184 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to parse configure information");
1185 __tts_config_release_client(uid);
1186 __tts_config_release_engine();
1187 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1190 /* Check whether engine id is valid */
1191 if (0 != __tts_config_mgr_check_engine_is_valid(g_config_info->engine_id)) {
1192 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get default engine");
1193 __tts_config_release_client(uid);
1194 __tts_config_release_engine();
1195 tts_parser_unload_config(g_config_info);
1196 g_config_info = NULL;
1197 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1200 if (true == g_config_info->auto_voice) {
1201 /* Check language with display language */
1202 __tts_config_set_auto_language();
1204 if (false == __tts_config_mgr_check_lang_is_valid(g_config_info->engine_id, g_config_info->language, g_config_info->type)) {
1205 /* Default language is not valid */
1206 char* tmp_language = NULL;
1208 if (0 != __tts_config_mgr_select_lang(g_config_info->engine_id, &tmp_language, &tmp_type)) {
1209 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to select language");
1210 __tts_config_release_client(uid);
1211 __tts_config_release_engine();
1212 tts_parser_unload_config(g_config_info);
1213 g_config_info = NULL;
1214 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1217 if (NULL != tmp_language) {
1218 memset(g_language, '\0', sizeof(g_language));
1219 g_config_info->language = g_language;
1220 strncpy(g_config_info->language, tmp_language, sizeof(g_language) - 1);
1222 g_config_info->type = tmp_type;
1225 tmp_language = NULL;
1227 if (0 != tts_parser_set_voice(g_config_info->language, g_config_info->type)) {
1228 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to save config");
1229 __tts_config_release_client(uid);
1230 __tts_config_release_engine();
1231 tts_parser_unload_config(g_config_info);
1232 g_config_info = NULL;
1233 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1239 /* print daemon config */
1240 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "@@@ TTS config @@@");
1241 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " engine : %s", g_config_info->engine_id);
1242 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " setting : %s", g_config_info->setting);
1243 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " auto voice : %s", g_config_info->auto_voice ? "on" : "off");
1244 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " language : %s", g_config_info->language);
1245 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " voice type : %d", g_config_info->type);
1246 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " speech rate : %d", g_config_info->speech_rate);
1247 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " pitch : %d", g_config_info->pitch);
1248 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " bg volume ratio : %lf", g_config_info->bg_volume_ratio);
1249 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "@@@@@");
1251 if (0 != __tts_config_mgr_register_config_event()) {
1252 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to register config event");
1253 __tts_config_release_client(uid);
1254 __tts_config_release_engine();
1255 tts_parser_unload_config(g_config_info);
1256 g_config_info = NULL;
1257 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1260 /* Register to detect display language change */
1261 vconf_notify_key_changed(TTS_LANGSET_KEY, __tts_config_display_language_changed_cb, NULL);
1262 vconf_notify_key_changed(TTS_ACCESSIBILITY_KEY, __tts_config_screen_reader_changed_cb, NULL);
1264 /* For engine directory monitoring */
1265 //if (0 != __tts_config_mgr_register_engine_config_updated_event()) {
1266 // SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to register engine config updated event");
1267 // __tts_config_release_client(uid);
1268 // __tts_config_release_engine();
1269 // tts_parser_unload_config(g_config_info);
1270 // __tts_config_mgr_unregister_config_event();
1271 // return TTS_CONFIG_ERROR_OPERATION_FAILED;
1277 int tts_config_mgr_finalize(int uid)
1279 if (0 < __tts_config_release_client(uid)) {
1283 tts_config_mgr_unset_callback(uid);
1285 __tts_config_release_engine();
1287 tts_parser_unload_config(g_config_info);
1288 g_config_info = NULL;
1290 __tts_config_mgr_unregister_engine_config_updated_event();
1292 __tts_config_mgr_unregister_config_event();
1294 vconf_ignore_key_changed(TTS_LANGSET_KEY, __tts_config_display_language_changed_cb);
1295 vconf_ignore_key_changed(TTS_ACCESSIBILITY_KEY, __tts_config_screen_reader_changed_cb);
1300 int tts_config_mgr_set_callback(int uid,
1301 tts_config_engine_changed_cb engine_cb,
1302 tts_config_voice_changed_cb voice_cb,
1303 tts_config_speech_rate_changed_cb speech_cb,
1304 tts_config_pitch_changed_cb pitch_cb,
1305 tts_config_bg_volume_ratio_changed_cb bg_volume_ratio_cb,
1308 GSList *iter = NULL;
1309 tts_config_client_s* temp_client = NULL;
1311 /* Call all callbacks of client*/
1312 iter = g_slist_nth(g_config_client_list, 0);
1314 while (NULL != iter) {
1315 temp_client = iter->data;
1317 if (NULL != temp_client) {
1318 if (uid == temp_client->uid) {
1319 temp_client->engine_cb = engine_cb;
1320 temp_client->voice_cb = voice_cb;
1321 temp_client->speech_cb = speech_cb;
1322 temp_client->pitch_cb = pitch_cb;
1323 temp_client->bg_volume_ratio_cb = bg_volume_ratio_cb;
1324 temp_client->user_data = user_data;
1328 iter = g_slist_next(iter);
1333 int tts_config_mgr_unset_callback(int uid)
1335 GSList *iter = NULL;
1336 tts_config_client_s* temp_client = NULL;
1338 /* Call all callbacks of client*/
1339 iter = g_slist_nth(g_config_client_list, 0);
1341 while (NULL != iter) {
1342 temp_client = iter->data;
1344 if (NULL != temp_client) {
1345 if (uid == temp_client->uid) {
1346 temp_client->engine_cb = NULL;
1347 temp_client->voice_cb = NULL;
1348 temp_client->speech_cb = NULL;
1349 temp_client->pitch_cb = NULL;
1350 temp_client->bg_volume_ratio_cb = NULL;
1351 temp_client->user_data = NULL;
1355 iter = g_slist_next(iter);
1361 int tts_config_mgr_set_screen_reader_callback(int uid, tts_config_screen_reader_changed_cb callback, void* user_data)
1363 if (NULL == callback) {
1364 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Input parameter is NULL");
1365 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1368 GSList *iter = NULL;
1369 tts_config_client_s* temp_client = NULL;
1371 /* Call all callbacks of client*/
1372 iter = g_slist_nth(g_config_client_list, 0);
1374 while (NULL != iter) {
1375 temp_client = iter->data;
1377 if (NULL != temp_client) {
1378 if (uid == temp_client->uid) {
1379 temp_client->screen_cb = callback;
1380 temp_client->screen_user_data = user_data;
1384 iter = g_slist_next(iter);
1389 int tts_config_mgr_unset_screen_reader_callback(int uid)
1391 GSList *iter = NULL;
1392 tts_config_client_s* temp_client = NULL;
1394 /* Call all callbacks of client*/
1395 iter = g_slist_nth(g_config_client_list, 0);
1397 while (NULL != iter) {
1398 temp_client = iter->data;
1400 if (NULL != temp_client) {
1401 if (uid == temp_client->uid) {
1402 temp_client->screen_cb = NULL;
1403 temp_client->screen_user_data = NULL;
1407 iter = g_slist_next(iter);
1413 int tts_config_mgr_get_engine_list(tts_config_supported_engine_cb callback, void* user_data)
1415 if (0 >= g_slist_length(g_config_client_list)) {
1416 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
1417 return TTS_CONFIG_ERROR_INVALID_STATE;
1420 GSList *iter = NULL;
1421 tts_engine_info_s *engine_info = NULL;
1423 if (0 >= g_slist_length(g_engine_list)) {
1424 SLOG(LOG_ERROR, TAG_TTSCONFIG, "There is no engine!!");
1425 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1428 /* Get a first item */
1429 iter = g_slist_nth(g_engine_list, 0);
1431 while (NULL != iter) {
1432 engine_info = iter->data;
1434 if (NULL != engine_info) {
1435 if (false == callback(engine_info->uuid, engine_info->name, engine_info->setting, user_data)) {
1440 iter = g_slist_next(iter);
1446 int tts_config_mgr_get_engine(char** engine)
1448 if (0 >= g_slist_length(g_config_client_list)) {
1449 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
1450 return TTS_CONFIG_ERROR_INVALID_STATE;
1453 if (NULL == engine) {
1454 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Input parameter is NULL");
1455 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1458 if (NULL != g_config_info->engine_id) {
1459 /* Check engine id is valid */
1460 GSList *iter = NULL;
1461 tts_engine_info_s *engine_info = NULL;
1463 if (0 >= g_slist_length(g_engine_list)) {
1464 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] There is no engine!!");
1465 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1468 /* Get a first item */
1469 iter = g_slist_nth(g_engine_list, 0);
1471 while (NULL != iter) {
1472 engine_info = iter->data;
1474 if (NULL != engine_info) {
1475 if (0 == strcmp(engine_info->uuid, g_config_info->engine_id)) {
1476 *engine = strdup(g_config_info->engine_id);
1480 iter = g_slist_next(iter);
1483 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Current engine id is not valid");
1485 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Engine id is NULL");
1488 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1491 int __tts_set_buxtonkey(const char* engine)
1494 struct buxton_client * bux_cli;
1495 struct buxton_layer * bux_layer;
1496 struct buxton_value * bux_val;
1498 int ret = buxton_open(&bux_cli, NULL, NULL);
1500 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[DBUS-BUXTON2] buxton_open failed!! (%d)", ret);
1501 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1503 bux_layer = buxton_create_layer("system");
1504 if (NULL == bux_layer) {
1505 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[DBUS-BUXTON2] buxton_create_layer FAIL");
1506 buxton_close(bux_cli);
1507 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1509 bux_val = buxton_value_create_string(engine);
1510 if (NULL == bux_val) {
1511 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[DBUS-BUXTON2] buxton_value_create_string FAIL");
1512 buxton_free_layer(bux_layer);
1513 buxton_close(bux_cli);
1514 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1516 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[DBUS-BUXTON2] layer: %s", buxton_layer_get_name(bux_layer));
1519 ret = buxton_set_value_sync(bux_cli, bux_layer, TTS_ENGINE_DB_DEFAULT, bux_val);
1521 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[DBUS-BUXTON2] buxton_set_value_sync failed!! (%d)", ret);
1522 buxton_value_free(bux_val);
1523 buxton_free_layer(bux_layer);
1524 buxton_close(bux_cli);
1530 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1532 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[DBUS-BUXTON2] buxton_set_value_sync: %d, %s", ret, TTS_ENGINE_DB_DEFAULT);
1535 buxton_value_free(bux_val);
1536 buxton_free_layer(bux_layer);
1537 buxton_close(bux_cli);
1543 return TTS_CONFIG_ERROR_NONE;
1546 int tts_config_mgr_set_engine(const char* engine)
1548 if (0 >= g_slist_length(g_config_client_list)) {
1549 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
1550 return TTS_CONFIG_ERROR_INVALID_STATE;
1554 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1556 /* Check current engine id with new engine id */
1557 if (0 == strcmp(g_config_info->engine_id, engine))
1560 if (0 >= g_slist_length(g_engine_list)) {
1561 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] There is no engine!!");
1562 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1565 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "New engine id : %s", engine);
1567 int ret = __tts_set_buxtonkey(engine);
1569 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[DEBUG] set_buxtonkey Fail!!");
1573 GSList *iter = NULL;
1574 tts_engine_info_s *engine_info = NULL;
1575 bool is_valid_engine = false;
1577 /* Get a first item */
1578 iter = g_slist_nth(g_engine_list, 0);
1580 while (NULL != iter) {
1581 engine_info = iter->data;
1583 if (NULL == engine_info) {
1584 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Engine info is NULL");
1585 iter = g_slist_next(iter);
1589 /* Check engine id is valid */
1590 if (0 != strcmp(engine, engine_info->uuid)) {
1591 iter = g_slist_next(iter);
1595 memset(g_engine_id, '\0', sizeof(g_engine_id));
1596 g_config_info->engine_id = g_engine_id;
1597 strncpy(g_config_info->engine_id, engine, sizeof(g_engine_id) - 1);
1599 if (NULL != engine_info->setting) {
1600 memset(g_setting, '\0', sizeof(g_setting));
1601 g_config_info->setting = g_setting;
1602 strncpy(g_config_info->setting, engine_info->setting, sizeof(g_setting) - 1);
1605 /* Engine is valid*/
1606 GSList *iter_voice = NULL;
1607 tts_config_voice_s* voice = NULL;
1608 bool is_valid_voice = false;
1610 /* Get a first item */
1611 iter_voice = g_slist_nth(engine_info->voices, 0);
1613 while (NULL != iter_voice) {
1614 /*Get handle data from list*/
1615 voice = iter_voice->data;
1617 if (NULL != voice) {
1618 if (NULL == voice->language)
1620 SLOG(LOG_DEBUG, TAG_TTSCONFIG, " lang(%s) type(%d)", voice->language, voice->type);
1622 if (0 == strcmp(voice->language, g_config_info->language)) {
1623 if (voice->type == g_config_info->type) {
1624 /* language is valid */
1625 is_valid_voice = true;
1626 g_config_info->type = voice->type;
1633 iter_voice = g_slist_next(iter_voice);
1636 if (false == is_valid_voice) {
1637 memset(g_language, '\0', sizeof(g_language));
1638 g_config_info->language = g_language;
1640 iter_voice = g_slist_nth(engine_info->voices, 0);
1641 if (NULL != iter_voice) {
1642 voice = iter_voice->data;
1643 if (NULL != voice) {
1644 if (NULL != voice->language)
1645 strncpy(g_config_info->language, voice->language, sizeof(g_language) - 1);
1647 g_config_info->type = voice->type;
1652 is_valid_engine = true;
1656 if (true == is_valid_engine) {
1657 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[Config] Engine changed");
1658 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " Engine : %s", g_config_info->engine_id);
1659 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " Setting : %s", g_config_info->setting);
1660 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " Language : %s", g_config_info->language);
1661 SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " Type : %d", g_config_info->type);
1663 if (0 != tts_parser_set_engine(g_config_info->engine_id, g_config_info->setting,
1664 g_config_info->language, g_config_info->type)) {
1665 SLOG(LOG_ERROR, TAG_TTSCONFIG, " Fail to save config");
1666 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1669 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Engine id is not valid");
1670 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1676 int tts_config_mgr_get_voice_list(const char* engine_id, tts_config_supported_voice_cb callback, void* user_data)
1678 if (0 >= g_slist_length(g_config_client_list)) {
1679 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
1680 return TTS_CONFIG_ERROR_INVALID_STATE;
1683 if (0 >= g_slist_length(g_engine_list)) {
1684 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] There is no engine");
1685 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1688 GSList *iter = NULL;
1689 tts_engine_info_s *engine_info = NULL;
1691 /* Get a first item */
1692 iter = g_slist_nth(g_engine_list, 0);
1694 while (NULL != iter) {
1695 engine_info = iter->data;
1697 if (NULL == engine_info) {
1698 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] engine info is NULL");
1699 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1702 if (0 != strcmp(engine_id, engine_info->uuid)) {
1703 iter = g_slist_next(iter);
1707 GSList *iter_voice = NULL;
1708 tts_config_voice_s* voice = NULL;
1710 /* Get a first item */
1711 iter_voice = g_slist_nth(engine_info->voices, 0);
1713 while (NULL != iter_voice) {
1714 /*Get handle data from list*/
1715 voice = iter_voice->data;
1717 SLOG(LOG_DEBUG, TAG_TTSCONFIG, " lang(%s) type(%d)", voice->language, voice->type);
1718 if (NULL != voice->language) {
1719 if (false == callback(engine_info->uuid, voice->language, voice->type, user_data))
1724 iter_voice = g_slist_next(iter_voice);
1732 int tts_config_mgr_get_voice(char** language, int* type)
1734 if (0 >= g_slist_length(g_config_client_list)) {
1735 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
1736 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1739 if (0 >= g_slist_length(g_engine_list)) {
1740 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] There is no engine");
1741 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1744 if (NULL == language || NULL == type)
1745 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1747 if (0 != strlen(g_config_info->language)) {
1748 *language = strdup(g_config_info->language);
1749 *type = g_config_info->type;
1751 SLOG(LOG_ERROR, TAG_TTSCONFIG, "language is NULL");
1752 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1758 int tts_config_mgr_set_voice(const char* language, int type)
1760 if (0 >= g_slist_length(g_config_client_list)) {
1761 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
1762 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1765 if (NULL == language) {
1766 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Input parameter is NULL");
1767 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1770 if (0 >= g_slist_length(g_engine_list)) {
1771 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] There is no engine");
1772 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1775 /* Check language is valid */
1776 if (0 != tts_parser_set_voice(language, type)) {
1777 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Fail to save default voice");
1778 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1780 memset(g_language, '\0', sizeof(g_language));
1781 g_config_info->language = g_language;
1782 strncpy(g_config_info->language, language, sizeof(g_language) - 1);
1784 g_config_info->type = type;
1789 int tts_config_mgr_get_auto_voice(bool* value)
1791 if (0 >= g_slist_length(g_config_client_list)) {
1792 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
1793 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1797 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1799 *value = g_config_info->auto_voice;
1804 int tts_config_mgr_set_auto_voice(bool value)
1806 if (0 >= g_slist_length(g_config_client_list)) {
1807 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
1808 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1811 if (g_config_info->auto_voice != value) {
1812 /* Check language is valid */
1813 if (0 != tts_parser_set_auto_voice(value)) {
1814 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Fail to save auto voice option");
1815 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1817 g_config_info->auto_voice = value;
1819 if (true == g_config_info->auto_voice) {
1820 __tts_config_set_auto_language();
1827 int tts_config_mgr_get_speech_rate(int* value)
1829 if (0 >= g_slist_length(g_config_client_list)) {
1830 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
1831 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1834 if (NULL == value) {
1835 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1838 *value = g_config_info->speech_rate;
1843 int tts_config_mgr_set_speech_rate(int value)
1845 if (0 >= g_slist_length(g_config_client_list)) {
1846 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
1847 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1850 if (TTS_CONFIG_SPEED_MIN <= value && value <= TTS_CONFIG_SPEED_MAX) {
1851 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[Config] Set speech rate : %d", value);
1852 if (0 != tts_parser_set_speech_rate(value)) {
1853 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Fail to save speech rate");
1854 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1857 g_config_info->speech_rate = value;
1859 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[Config ERROR] Speech rate is invalid : %d", value);
1865 int tts_config_mgr_get_pitch(int* value)
1867 if (0 >= g_slist_length(g_config_client_list)) {
1868 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
1869 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1872 if (NULL == value) {
1873 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1876 GSList *iter = NULL;
1877 tts_engine_info_s *engine_info = NULL;
1879 if (0 >= g_slist_length(g_engine_list)) {
1880 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] There is no engine!!");
1881 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1884 /* Get a first item */
1885 iter = g_slist_nth(g_engine_list, 0);
1887 while (NULL != iter) {
1888 engine_info = iter->data;
1890 if (NULL == engine_info) {
1891 SLOG(LOG_ERROR, TAG_TTSCONFIG, "engine info is NULL");
1892 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1895 if (0 != strcmp(g_config_info->engine_id, engine_info->uuid)) {
1896 iter = g_slist_next(iter);
1900 if (false == engine_info->pitch_support) {
1901 return TTS_CONFIG_ERROR_NOT_SUPPORTED_FEATURE;
1907 *value = g_config_info->pitch;
1912 int tts_config_mgr_set_pitch(int value)
1914 if (0 >= g_slist_length(g_config_client_list)) {
1915 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
1919 GSList *iter = NULL;
1920 tts_engine_info_s *engine_info = NULL;
1922 if (0 >= g_slist_length(g_engine_list)) {
1923 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] There is no engine!!");
1924 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
1927 /* Get a first item */
1928 iter = g_slist_nth(g_engine_list, 0);
1930 while (NULL != iter) {
1931 engine_info = iter->data;
1933 if (NULL == engine_info) {
1934 SLOG(LOG_ERROR, TAG_TTSCONFIG, "engine info is NULL");
1935 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1938 if (0 != strcmp(g_config_info->engine_id, engine_info->uuid)) {
1939 iter = g_slist_next(iter);
1943 if (false == engine_info->pitch_support) {
1944 return TTS_CONFIG_ERROR_NOT_SUPPORTED_FEATURE;
1950 if (0 != tts_parser_set_pitch(value)) {
1951 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Fail to save speech rate");
1952 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1955 g_config_info->pitch = value;
1960 int tts_config_mgr_get_bg_volume_ratio(double *value)
1962 if (0 >= g_slist_length(g_config_client_list)) {
1963 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
1964 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1968 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1970 *value = g_config_info->bg_volume_ratio;
1975 int tts_config_mgr_set_bg_volume_ratio(double value)
1977 if (0 >= g_slist_length(g_config_client_list)) {
1978 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
1979 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
1982 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[Config] Set bg volume ratio : %lf", value);
1983 if (0 != tts_parser_set_bg_volume_ratio(value))
1985 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Fail to save bg volume ratio");
1986 return TTS_CONFIG_ERROR_OPERATION_FAILED;
1989 g_config_info->bg_volume_ratio = value;
1994 bool tts_config_check_default_engine_is_valid(const char* engine)
1996 if (0 >= g_slist_length(g_config_client_list)) {
1997 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
2004 if (0 >= g_slist_length(g_engine_list))
2007 GSList *iter = NULL;
2008 tts_engine_info_s *engine_info = NULL;
2010 /* Get a first item */
2011 iter = g_slist_nth(g_engine_list, 0);
2013 while (NULL != iter) {
2014 engine_info = iter->data;
2016 if (NULL != engine_info) {
2017 if (0 == strcmp(engine, engine_info->uuid)) {
2021 iter = g_slist_next(iter);
2027 bool tts_config_check_default_voice_is_valid(const char* language, int type)
2029 if (0 >= g_slist_length(g_config_client_list)) {
2030 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
2034 if (NULL == language)
2037 if (0 == strlen(g_config_info->engine_id)) {
2038 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Default engine id is NULL");
2042 if (0 >= g_slist_length(g_engine_list))
2045 GSList *iter = NULL;
2046 tts_engine_info_s *engine_info = NULL;
2048 /* Get a first item */
2049 iter = g_slist_nth(g_engine_list, 0);
2051 while (NULL != iter) {
2052 engine_info = iter->data;
2054 if (NULL == engine_info) {
2055 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Engine info is NULL");
2056 iter = g_slist_next(iter);
2060 if (0 != strcmp(g_config_info->engine_id, engine_info->uuid)) {
2061 iter = g_slist_next(iter);
2065 GSList *iter_voice = NULL;
2066 tts_config_voice_s* voice = NULL;
2068 /* Get a first item */
2069 iter_voice = g_slist_nth(engine_info->voices, 0);
2071 while (NULL != iter_voice) {
2072 voice = iter_voice->data;
2074 if (0 == strcmp(language, voice->language) && voice->type == type)
2078 iter_voice = g_slist_next(iter_voice);
2088 int __tts_config_mgr_print_engine_info()
2090 GSList *iter = NULL;
2091 tts_engine_info_s *engine_info = NULL;
2093 if (0 >= g_slist_length(g_engine_list)) {
2094 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "-------------- engine list -----------------");
2095 SLOG(LOG_DEBUG, TAG_TTSCONFIG, " No Engine in engine directory");
2096 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "--------------------------------------------");
2100 /* Get a first item */
2101 iter = g_slist_nth(g_engine_list, 0);
2103 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "--------------- engine list -----------------");
2106 while (NULL != iter) {
2107 engine_info = iter->data;
2109 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[%dth]", i);
2110 SLOG(LOG_DEBUG, TAG_TTSCONFIG, " name : %s", engine_info->name);
2111 SLOG(LOG_DEBUG, TAG_TTSCONFIG, " id : %s", engine_info->uuid);
2112 SLOG(LOG_DEBUG, TAG_TTSCONFIG, " setting : %s", engine_info->setting);
2114 SLOG(LOG_DEBUG, TAG_TTSCONFIG, " Voices");
2115 GSList *iter_voice = NULL;
2116 tts_config_voice_s* voice = NULL;
2118 if (g_slist_length(engine_info->voices) > 0) {
2119 /* Get a first item */
2120 iter_voice = g_slist_nth(engine_info->voices, 0);
2123 while (NULL != iter_voice) {
2124 /*Get handle data from list*/
2125 voice = iter_voice->data;
2127 SLOG(LOG_DEBUG, TAG_TTSCONFIG, " [%dth] lang(%s) type(%d)", j, voice->language, voice->type);
2130 iter_voice = g_slist_next(iter_voice);
2134 SLOG(LOG_ERROR, TAG_TTSCONFIG, " Voice is NONE");
2136 iter = g_slist_next(iter);
2139 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "--------------------------------------------");
2144 int tts_config_mgr_get_max_text_size(unsigned int* size)
2146 if (0 >= g_slist_length(g_config_client_list)) {
2147 SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
2148 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
2152 return TTS_CONFIG_ERROR_INVALID_PARAMETER;
2155 GSList *iter = NULL;
2156 tts_engine_info_s *engine_info = NULL;
2158 if (0 >= g_slist_length(g_engine_list)) {
2159 SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] There is no engine!!");
2160 return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
2163 /* Get a first item */
2164 iter = g_slist_nth(g_engine_list, 0);
2166 while (NULL != iter) {
2167 engine_info = iter->data;
2169 if (NULL == engine_info) {
2170 SLOG(LOG_ERROR, TAG_TTSCONFIG, "engine info is NULL");
2171 return TTS_CONFIG_ERROR_OPERATION_FAILED;
2174 if (0 != strcmp(g_config_info->engine_id, engine_info->uuid)) {
2175 iter = g_slist_next(iter);
2182 if (NULL == engine_info) {
2183 SLOG(LOG_ERROR, TAG_TTSCONFIG, "engine info is NULL");
2184 return TTS_CONFIG_ERROR_OPERATION_FAILED;
2187 *size = engine_info->text_size;
2188 SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[DEBUG] Max text size is %d.", *size);