Add a checker into __send_interrupt_client
[platform/core/uifw/tts.git] / common / tts_config_mgr.c
index e05446d..375bc70 100644 (file)
@@ -33,11 +33,10 @@ typedef struct {
        tts_config_speech_rate_changed_cb       speech_cb;
        tts_config_screen_reader_changed_cb     screen_cb;
        tts_config_pitch_changed_cb             pitch_cb;
+       tts_config_bg_volume_ratio_changed_cb bg_volume_ratio_cb;
        void*   user_data;
 } tts_config_client_s;
 
-extern char* tts_tag();
-
 static GSList* g_engine_list = NULL;
 
 static GSList* g_config_client_list = NULL;
@@ -67,7 +66,7 @@ static int __tts_config_mgr_unregister_engine_config_updated_event();
 int __tts_config_mgr_check_engine_is_valid(const char* engine_id)
 {
        if (NULL == engine_id) {
-               SLOG(LOG_ERROR, tts_tag(), "Input parameter is NULL");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "Input parameter is NULL");
                return -1;
        }
 
@@ -75,7 +74,7 @@ int __tts_config_mgr_check_engine_is_valid(const char* engine_id)
        tts_engine_info_s *engine_info = NULL;
 
        if (0 >= g_slist_length(g_engine_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "There is no engine!!");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "There is no engine!!");
                return -1;
        }
 
@@ -86,12 +85,12 @@ int __tts_config_mgr_check_engine_is_valid(const char* engine_id)
                engine_info = iter->data;
 
                if (NULL == engine_info) {
-                       SLOG(LOG_ERROR, tts_tag(), "engine info is NULL");
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "engine info is NULL");
                        return -1;
                }
 
                if (NULL != engine_info->uuid && 0 == strcmp(engine_id, engine_info->uuid)) {
-                       SLOG(LOG_DEBUG, tts_tag(), "Default engine is valid : %s", engine_id);
+                       SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Default engine is valid : %s", engine_id);
                        return 0;
                }
 
@@ -101,13 +100,13 @@ int __tts_config_mgr_check_engine_is_valid(const char* engine_id)
        /* Change default engine */
        iter = g_slist_nth(g_engine_list, 0);
        if (NULL == iter) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] No engine in list");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] No engine in list");
                return TTS_CONFIG_ERROR_OPERATION_FAILED;
        }
 
        engine_info = iter->data;
        if (NULL == g_config_info) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Invalid engine info in list");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Invalid engine info in list");
                return TTS_CONFIG_ERROR_OPERATION_FAILED;
        }
 
@@ -122,7 +121,7 @@ int __tts_config_mgr_check_engine_is_valid(const char* engine_id)
                strncpy(g_config_info->setting, engine_info->setting, sizeof(g_setting) - 1);
        }
 
-       SLOG(LOG_DEBUG, tts_tag(), "Default engine is changed : %s", g_config_info->engine_id);
+       SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Default engine is changed : %s", g_config_info->engine_id);
 
        /* Change is default voice */
        GSList *iter_voice = NULL;
@@ -149,7 +148,7 @@ int __tts_config_mgr_check_engine_is_valid(const char* engine_id)
 
                                                g_config_info->type = voice->type;
 
-                                               SLOG(LOG_DEBUG, tts_tag(), "Default voice is changed : lang(%s) type(%d)", voice->language, voice->type);
+                                               SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Default voice is changed : lang(%s) type(%d)", voice->language, voice->type);
                                                break;
                                        }
                                }
@@ -166,24 +165,23 @@ int __tts_config_mgr_check_engine_is_valid(const char* engine_id)
 
                iter_voice = g_slist_nth(engine_info->voices, 0);
                if (NULL == iter_voice) {
-                       SLOG(LOG_ERROR, tts_tag(), "Fail to get voice list");
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "Fail to get voice list");
                        return TTS_CONFIG_ERROR_OPERATION_FAILED;
                }
                voice = iter_voice->data;
 
                if (NULL == voice || NULL == voice->language) {
-                       SLOG(LOG_ERROR, tts_tag(), "Fail to get voice info from list");
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "Fail to get voice info from list");
                        return TTS_CONFIG_ERROR_OPERATION_FAILED;
                }
                strncpy(g_config_info->language, voice->language, sizeof(g_language) - 1);
 
                g_config_info->type = voice->type;
-               SLOG(LOG_DEBUG, tts_tag(), "Default voice is changed : lang(%s) type(%d)", voice->language, voice->type);
+               SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Default voice is changed : lang(%s) type(%d)", voice->language, voice->type);
        }
 
-       if (0 != tts_parser_set_engine(g_config_info->engine_id, g_config_info->setting, 
-               g_config_info->language, g_config_info->type)) {
-               SLOG(LOG_ERROR, tts_tag(), " Fail to save config");
+       if (0 != tts_parser_set_engine(g_config_info->engine_id, g_config_info->setting, g_config_info->language, g_config_info->type)) {
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, " Fail to save config");
                return TTS_CONFIG_ERROR_OPERATION_FAILED;
        }
 
@@ -193,7 +191,7 @@ int __tts_config_mgr_check_engine_is_valid(const char* engine_id)
 bool __tts_config_mgr_check_lang_is_valid(const char* engine_id, const char* language, int type)
 {
        if (NULL == engine_id || NULL == language) {
-               SLOG(LOG_ERROR, tts_tag(), "Input parameter is NULL");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "Input parameter is NULL");
                return false;
        }
 
@@ -201,7 +199,7 @@ bool __tts_config_mgr_check_lang_is_valid(const char* engine_id, const char* lan
        tts_engine_info_s *engine_info = NULL;
 
        if (0 >= g_slist_length(g_engine_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "There is no engine!!");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "There is no engine!!");
                return false;
        }
 
@@ -212,7 +210,7 @@ bool __tts_config_mgr_check_lang_is_valid(const char* engine_id, const char* lan
                engine_info = iter->data;
 
                if (NULL == engine_info) {
-                       SLOG(LOG_ERROR, tts_tag(), "engine info is NULL");
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "engine info is NULL");
                        return false;
                }
 
@@ -225,7 +223,7 @@ bool __tts_config_mgr_check_lang_is_valid(const char* engine_id, const char* lan
                tts_config_voice_s* voice = NULL;
 
                if (g_slist_length(engine_info->voices) <= 0) {
-                       SLOG(LOG_ERROR, tts_tag(), "There is no voice : %s", engine_info->uuid);
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "There is no voice : %s", engine_info->uuid);
                        iter = g_slist_next(iter);
                        return false;
                }
@@ -260,7 +258,7 @@ bool __tts_config_mgr_check_lang_is_valid(const char* engine_id, const char* lan
 int __tts_config_mgr_select_lang(const char* engine_id, char** language, int* type)
 {
        if (NULL == engine_id || NULL == language) {
-               SLOG(LOG_ERROR, tts_tag(), "Input parameter is NULL");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "Input parameter is NULL");
                return false;
        }
 
@@ -268,7 +266,7 @@ int __tts_config_mgr_select_lang(const char* engine_id, char** language, int* ty
        tts_engine_info_s *engine_info = NULL;
 
        if (0 >= g_slist_length(g_engine_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "There is no engine!!");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "There is no engine!!");
                return false;
        }
 
@@ -279,7 +277,7 @@ int __tts_config_mgr_select_lang(const char* engine_id, char** language, int* ty
                engine_info = iter->data;
 
                if (NULL == engine_info) {
-                       SLOG(LOG_ERROR, tts_tag(), "engine info is NULL");
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "engine info is NULL");
                        return false;
                }
 
@@ -292,7 +290,7 @@ int __tts_config_mgr_select_lang(const char* engine_id, char** language, int* ty
                tts_config_voice_s* voice = NULL;
 
                if (g_slist_length(engine_info->voices) <= 0) {
-                       SLOG(LOG_ERROR, tts_tag(), "There is no voice : %s", engine_info->uuid);
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "There is no voice : %s", engine_info->uuid);
                        return -1;
                }
 
@@ -307,7 +305,7 @@ int __tts_config_mgr_select_lang(const char* engine_id, char** language, int* ty
                                        *language = strdup(voice->language);
                                        *type = voice->type;
 
-                                       SECURE_SLOG(LOG_DEBUG, tts_tag(), "Selected language(%s) type(%d)", *language, *type);
+                                       SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Selected language(%s) type(%d)", *language, *type);
                                        return 0;
                                }
                        }
@@ -319,7 +317,7 @@ int __tts_config_mgr_select_lang(const char* engine_id, char** language, int* ty
                        *language = strdup(voice->language);
                        *type = voice->type;
 
-                       SECURE_SLOG(LOG_DEBUG, tts_tag(), "Selected language(%s) type(%d)", *language, *type);
+                       SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Selected language(%s) type(%d)", *language, *type);
                        return 0;
                }
                break;
@@ -330,7 +328,7 @@ int __tts_config_mgr_select_lang(const char* engine_id, char** language, int* ty
 
 Eina_Bool tts_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handler)
 {
-       SLOG(LOG_DEBUG, tts_tag(), "===== Config changed callback event");
+       SLOG(LOG_DEBUG, TAG_TTSCONFIG, "@@@ Config changed callback event");
 
        int length;
        struct inotify_event event;
@@ -338,9 +336,8 @@ Eina_Bool tts_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handl
 
        length = read(g_config_fd_noti, &event, sizeof(struct inotify_event));
        if (0 > length) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Empty Inotify event");
-               SLOG(LOG_DEBUG, tts_tag(), "=====");
-               SLOG(LOG_DEBUG, tts_tag(), " ");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Empty Inotify event");
+               SLOG(LOG_DEBUG, TAG_TTSCONFIG, "@@@");
                return ECORE_CALLBACK_DONE;
        }
 
@@ -353,11 +350,12 @@ Eina_Bool tts_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handl
                int voice_type = -1;
                int speech_rate = -1;
                int pitch = -1;
+               double bg_volume_ratio = -1;
 
                GSList *iter = NULL;
                tts_config_client_s* temp_client = NULL;
 
-               if (0 != tts_parser_find_config_changed(&engine, &setting, &auto_voice, &lang, &voice_type, &speech_rate, &pitch))
+               if (0 != tts_parser_find_config_changed(&engine, &setting, &auto_voice, &lang, &voice_type, &speech_rate, &pitch, &bg_volume_ratio))
                        return ECORE_CALLBACK_PASS_ON;
 
                /* engine changed */
@@ -373,7 +371,7 @@ Eina_Bool tts_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handl
                                strncpy(g_config_info->setting, setting, sizeof(g_setting) - 1);
                        }
 
-                       SECURE_SLOG(LOG_DEBUG, tts_tag(), "Engine change(%s)", g_config_info->engine_id);
+                       SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Engine change(%s)", g_config_info->engine_id);
 
                        /* Call all callbacks of client*/
                        iter = g_slist_nth(g_config_client_list, 0);
@@ -383,7 +381,7 @@ Eina_Bool tts_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handl
 
                                if (NULL != temp_client) {
                                        if (NULL != temp_client->engine_cb) {
-                                               SECURE_SLOG(LOG_DEBUG, tts_tag(), "Engine changed callback : uid(%d)", temp_client->uid);
+                                               SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Engine changed callback : uid(%d)", temp_client->uid);
                                                temp_client->engine_cb(g_config_info->engine_id, g_config_info->setting, 
                                                        g_config_info->language, g_config_info->type, 
                                                        g_config_info->auto_voice, g_config_info->credential, temp_client->user_data);
@@ -414,7 +412,7 @@ Eina_Bool tts_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handl
                                g_config_info->type = voice_type;
                        }
 
-                       SECURE_SLOG(LOG_DEBUG, tts_tag(), "Voice change(%s, %d)", g_config_info->language, g_config_info->type);
+                       SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Voice change(%s, %d)", g_config_info->language, g_config_info->type);
 
                        /* Call all callbacks of client*/
                        iter = g_slist_nth(g_config_client_list, 0);
@@ -424,7 +422,7 @@ Eina_Bool tts_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handl
 
                                if (NULL != temp_client) {
                                        if (NULL != temp_client->voice_cb) {
-                                               SECURE_SLOG(LOG_DEBUG, tts_tag(), "Voice changed callback : uid(%d)", temp_client->uid);
+                                               SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Voice changed callback : uid(%d)", temp_client->uid);
                                                temp_client->voice_cb(before_lang, before_type, 
                                                        g_config_info->language, g_config_info->type, 
                                                        g_config_info->auto_voice, temp_client->user_data);
@@ -443,7 +441,7 @@ Eina_Bool tts_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handl
                if (-1 != speech_rate) {
                        g_config_info->speech_rate = speech_rate;
 
-                       SECURE_SLOG(LOG_DEBUG, tts_tag(), "Speech rate change(%d)", g_config_info->speech_rate);
+                       SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Speech rate change(%d)", g_config_info->speech_rate);
 
                        /* Call all callbacks of client*/
                        iter = g_slist_nth(g_config_client_list, 0);
@@ -453,7 +451,7 @@ Eina_Bool tts_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handl
 
                                if (NULL != temp_client) {
                                        if (NULL != temp_client->speech_cb) {
-                                               SECURE_SLOG(LOG_DEBUG, tts_tag(), "Speech rate changed callback : uid(%d)", temp_client->uid);
+                                               SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Speech rate changed callback : uid(%d)", temp_client->uid);
                                                temp_client->speech_cb(g_config_info->speech_rate, temp_client->user_data);
                                        }
                                }
@@ -465,7 +463,7 @@ Eina_Bool tts_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handl
                if (-1 != pitch) {
                        g_config_info->pitch = pitch;
 
-                       SECURE_SLOG(LOG_DEBUG, tts_tag(), "pitch change(%d)", g_config_info->pitch);
+                       SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "pitch change(%d)", g_config_info->pitch);
 
                        /* Call all callbacks of client*/
                        iter = g_slist_nth(g_config_client_list, 0);
@@ -475,7 +473,7 @@ Eina_Bool tts_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handl
 
                                if (NULL != temp_client) {
                                        if (NULL != temp_client->pitch_cb) {
-                                               SECURE_SLOG(LOG_DEBUG, tts_tag(), "Pitch changed callback : uid(%d)", temp_client->uid);
+                                               SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Pitch changed callback : uid(%d)", temp_client->uid);
                                                temp_client->pitch_cb(g_config_info->pitch, temp_client->user_data);
                                        }
                                }
@@ -484,6 +482,28 @@ Eina_Bool tts_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handl
                        }
                }
 
+               if (-1 != bg_volume_ratio) {
+                       g_config_info->bg_volume_ratio = bg_volume_ratio;
+
+                       SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "background volume ratio change(%lf)", g_config_info->bg_volume_ratio);
+
+                       /* Call all callbacks of client*/
+                       iter = g_slist_nth(g_config_client_list, 0);
+
+                       while (NULL != iter) {
+                               temp_client = iter->data;
+
+                               if (NULL != temp_client) {
+                                       if (NULL != temp_client->bg_volume_ratio_cb) {
+                                               SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "background volume ratio changed callback : uid(%d)", temp_client->uid);
+                                               temp_client->bg_volume_ratio_cb(g_config_info->bg_volume_ratio, temp_client->user_data);
+                                       }
+                               }
+
+                               iter = g_slist_next(iter);
+                       }
+               }
+
                if (NULL != engine) {
                        free(engine);
                        engine = NULL;
@@ -496,12 +516,17 @@ Eina_Bool tts_config_mgr_inotify_event_cb(void* data, Ecore_Fd_Handler *fd_handl
                        free(lang);
                        lang = NULL;
                }
+       } else if (IN_DELETE_SELF == event.mask) {
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] IN_DELETE_SELF event");
+
+               tts_parser_unload_config(g_config_info);
+               tts_parser_reset();
+               tts_parser_load_config(&g_config_info);
        } else {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Undefined event");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Undefined event (0x%x)", event.mask);
        }
 
-       SLOG(LOG_DEBUG, tts_tag(), "=====");
-       SLOG(LOG_DEBUG, tts_tag(), " ");
+       SLOG(LOG_DEBUG, TAG_TTSCONFIG, "@@@");
 
        return ECORE_CALLBACK_PASS_ON;
 }
@@ -514,18 +539,18 @@ int __tts_config_mgr_register_config_event()
 
        fd = inotify_init();
        if (fd < 0) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail get inotify fd");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail get inotify fd");
                return -1;
        }
        g_config_fd_noti = fd;
 
-       wd = inotify_add_watch(fd, TTS_CONFIG, IN_CLOSE_WRITE);
+       wd = inotify_add_watch(fd, TTS_CONFIG, IN_CLOSE_WRITE|IN_DELETE_SELF);
        g_config_wd_noti = wd;
 
        g_config_fd_handler_noti = ecore_main_fd_handler_add(fd, ECORE_FD_READ,
                (Ecore_Fd_Cb)tts_config_mgr_inotify_event_cb, NULL, NULL, NULL);
        if (NULL == g_config_fd_handler_noti) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get handler_noti");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get handler_noti");
                return -1;
        }
 
@@ -535,7 +560,7 @@ int __tts_config_mgr_register_config_event()
        value |= O_NONBLOCK;
 
        if (0 > fcntl(fd, F_SETFL, value)) {
-               SLOG(LOG_WARN, tts_tag(), "[WARNING] Fail to set non-block mode");
+               SLOG(LOG_WARN, TAG_TTSCONFIG, "[WARNING] Fail to set non-block mode");
        }
 
        return 0;
@@ -556,7 +581,7 @@ int __tts_config_set_auto_language()
        char* value = NULL;
        value = vconf_get_str(TTS_LANGSET_KEY);
        if (NULL == value) {
-               SLOG(LOG_ERROR, tts_tag(), "[Config ERROR] Fail to get display language");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[Config ERROR] Fail to get display language");
                return -1;
        }
 
@@ -568,7 +593,7 @@ int __tts_config_set_auto_language()
        if (true == __tts_config_mgr_check_lang_is_valid(g_config_info->engine_id, temp_lang, g_config_info->type)) {
                /* tts default voice change */
                if (NULL == g_config_info->language) {
-                       SLOG(LOG_ERROR, tts_tag(), "Current config language is NULL");
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "Current config language is NULL");
                        return -1;
                }
 
@@ -576,7 +601,7 @@ int __tts_config_set_auto_language()
                int before_type;
 
                if (0 != tts_parser_set_voice(temp_lang, g_config_info->type)) {
-                       SLOG(LOG_ERROR, tts_tag(), "Fail to save default voice");
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "Fail to save default voice");
                        return -1;
                }
 
@@ -587,7 +612,7 @@ int __tts_config_set_auto_language()
                g_config_info->language = g_language;
                strncpy(g_config_info->language, temp_lang, sizeof(g_language) - 1);
 
-               SECURE_SLOG(LOG_DEBUG, tts_tag(), "[Config] Default voice : lang(%s) type(%d)", 
+               SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[Config] Default voice : lang(%s) type(%d)", 
                        g_config_info->language, g_config_info->type);
 
                GSList *iter = NULL;
@@ -619,21 +644,21 @@ int __tts_config_set_auto_language()
                char* tmp_language = NULL;
                int tmp_type = -1;
                if (0 != __tts_config_mgr_select_lang(g_config_info->engine_id, &tmp_language, &tmp_type)) {
-                       SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to select language");
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to select language");
                        return -1;
                }
 
                if (NULL == tmp_language) {
-                       SLOG(LOG_ERROR, tts_tag(), "[ERROR] language is NULL");
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] language is NULL");
                        return -1;
                }
 
                if (0 != tts_parser_set_voice(tmp_language, tmp_type)) {
-                       SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to save config");
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to save config");
                        return -1;
                }
 
-               SECURE_SLOG(LOG_DEBUG, tts_tag(), "[Config] Default voice : lang(%s) type(%d)", 
+               SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[Config] Default voice : lang(%s) type(%d)", 
                        tmp_language, tmp_type);
 
                GSList *iter = NULL;
@@ -671,6 +696,11 @@ int __tts_config_set_auto_language()
 
 void __tts_config_display_language_changed_cb(keynode_t *key, void *data)
 {
+       if (NULL == g_config_info) {
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Current config info is invalid.");
+               return;
+       }
+
        if (true == g_config_info->auto_voice) {
                __tts_config_set_auto_language();
        }
@@ -684,7 +714,7 @@ void __tts_config_screen_reader_changed_cb(keynode_t *key, void *data)
        int screen_reader;
        ret = vconf_get_bool(TTS_ACCESSIBILITY_KEY, &screen_reader);
        if (0 != ret) {
-               SLOG(LOG_ERROR, tts_tag(), "[Config ERROR] Fail to get screen reader");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[Config ERROR] Fail to get screen reader");
                return;
        }
 
@@ -732,7 +762,7 @@ int __tts_config_release_client(int uid)
                }
        }
 
-       SLOG(LOG_DEBUG, tts_tag(), "Client count (%d)", g_slist_length(g_config_client_list));
+       SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Client count (%d)", g_slist_length(g_config_client_list));
 
        return g_slist_length(g_config_client_list);
 }
@@ -766,8 +796,6 @@ void __tts_config_release_engine()
 int __tts_config_mgr_get_engine_info()
 {
        DIR *dp = NULL;
-       int ret = -1;
-       struct dirent entry;
        struct dirent *dirp = NULL;
 
        char filepath[512] = {'\0',};
@@ -781,14 +809,10 @@ int __tts_config_mgr_get_engine_info()
        /* Copy default info directory to download directory */
        dp  = opendir(TTS_DEFAULT_ENGINE_INFO);
        if (NULL == dp) {
-               SLOG(LOG_DEBUG, tts_tag(), "[CONFIG] No default directory : %s", TTS_DEFAULT_ENGINE_INFO);
+               SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[CONFIG] No default directory : %s", TTS_DEFAULT_ENGINE_INFO);
        } else {
                do {
-                       ret = readdir_r(dp, &entry, &dirp);
-                       if (0 != ret) {
-                               SLOG(LOG_ERROR, tts_tag(), "[CONFIG] Fail to read directory");
-                               break;
-                       }
+                       dirp = readdir(dp);
 
                        if (NULL != dirp) {
                                if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name))
@@ -796,7 +820,7 @@ int __tts_config_mgr_get_engine_info()
 
                                filesize = strlen(TTS_DEFAULT_ENGINE_INFO) + strlen(dirp->d_name) + 2;
                                if (filesize >= 512) {
-                                       SECURE_SLOG(LOG_ERROR, tts_tag(), "[CONFIG ERROR] File path is too long : %s", dirp->d_name);
+                                       SECURE_SLOG(LOG_ERROR, TAG_TTSCONFIG, "[CONFIG ERROR] File path is too long : %s", dirp->d_name);
                                        closedir(dp);
                                        return -1;
                                }
@@ -804,14 +828,14 @@ int __tts_config_mgr_get_engine_info()
                                memset(filepath, '\0', 512);
                                snprintf(filepath, 512, "%s/%s", TTS_DEFAULT_ENGINE_INFO, dirp->d_name);
 
-                               SECURE_SLOG(LOG_DEBUG, tts_tag(), "[CONFIG] Filepath(%s)", filepath);
+                               SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[CONFIG] Filepath(%s)", filepath);
 
                                char dest[512] = {'\0',};
                                snprintf(dest, 512, "%s/%s", TTS_DOWNLOAD_ENGINE_INFO, dirp->d_name);
 
                                if (0 != access(dest, F_OK)) {
                                        if (0 != tts_parser_copy_xml(filepath, dest)) {
-                                               SLOG(LOG_ERROR, tts_tag(), "[CONFIG ERROR] Fail to copy engine info");
+                                               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[CONFIG ERROR] Fail to copy engine info");
                                        }
                                }
                        }
@@ -823,14 +847,10 @@ int __tts_config_mgr_get_engine_info()
        /* Get engine info from default engine directory */
        dp  = opendir(TTS_DOWNLOAD_ENGINE_INFO);
        if (NULL == dp) {
-               SLOG(LOG_DEBUG, tts_tag(), "[CONFIG] No downloadable directory : %s", TTS_DOWNLOAD_ENGINE_INFO);
+               SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[CONFIG] No downloadable directory : %s", TTS_DOWNLOAD_ENGINE_INFO);
        } else {
                do {
-                       ret = readdir_r(dp, &entry, &dirp);
-                       if (0 != ret) {
-                               SLOG(LOG_ERROR, tts_tag(), "[CONFIG] Fail to read directory");
-                               break;
-                       }
+                       dirp = readdir(dp);
 
                        if (NULL != dirp) {
                                if (!strcmp(".", dirp->d_name) || !strcmp("..", dirp->d_name))
@@ -838,7 +858,7 @@ int __tts_config_mgr_get_engine_info()
 
                                filesize = strlen(TTS_DOWNLOAD_ENGINE_INFO) + strlen(dirp->d_name) + 2;
                                if (filesize >= 512) {
-                                       SECURE_SLOG(LOG_ERROR, tts_tag(), "[CONFIG ERROR] File path is too long : %s", dirp->d_name);
+                                       SECURE_SLOG(LOG_ERROR, TAG_TTSCONFIG, "[CONFIG ERROR] File path is too long : %s", dirp->d_name);
                                        closedir(dp);
                                        return -1;
                                }
@@ -846,12 +866,12 @@ int __tts_config_mgr_get_engine_info()
                                memset(filepath, '\0', 512);
                                snprintf(filepath, 512, "%s/%s", TTS_DOWNLOAD_ENGINE_INFO, dirp->d_name);
 
-                               SECURE_SLOG(LOG_DEBUG, tts_tag(), "[CONFIG] Filepath(%s)", filepath);
+                               SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[CONFIG] Filepath(%s)", filepath);
 
                                if (0 == tts_parser_get_engine_info(filepath, &info)) {
                                        g_engine_list = g_slist_append(g_engine_list, info);
                                        if (0 != __tts_config_mgr_register_engine_config_updated_event(filepath)) {
-                                               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to register engine config updated event");
+                                               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to register engine config updated event");
                                        }
                                }
                        }
@@ -861,7 +881,7 @@ int __tts_config_mgr_get_engine_info()
        }
 
        if (0 >= g_slist_length(g_engine_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] No engine");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] No engine");
                return -1;
        }
 
@@ -870,7 +890,7 @@ int __tts_config_mgr_get_engine_info()
 
 static Eina_Bool __tts_config_mgr_engine_config_inotify_event_callback(void* data, Ecore_Fd_Handler *fd_handler)
 {
-       SLOG(LOG_DEBUG, tts_tag(), "===== Engine config updated callback event");
+       SLOG(LOG_DEBUG, TAG_TTSCONFIG, "@@@ Engine config updated callback event");
 
        tts_engine_inotify_s *ino = (tts_engine_inotify_s *)data;
        int dir_fd = ino->dir_fd;
@@ -881,33 +901,32 @@ static Eina_Bool __tts_config_mgr_engine_config_inotify_event_callback(void* dat
 
        length = read(dir_fd, &event, sizeof(struct inotify_event));
        if (0 > length) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Empty Inotify event");
-               SLOG(LOG_DEBUG, tts_tag(), "=====");
-               SLOG(LOG_DEBUG, tts_tag(), " ");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Empty Inotify event");
+               SLOG(LOG_DEBUG, TAG_TTSCONFIG, "@@@");
                return ECORE_CALLBACK_DONE;
        }
 
        if (IN_CLOSE_WRITE == event.mask) {
                int ret = __tts_config_mgr_get_engine_info();
                if (0 != ret) {
-                       SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get engine info when config updated");
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get engine info when config updated");
                }
                __tts_config_mgr_print_engine_info();
                bool support = tts_config_check_default_voice_is_valid(g_config_info->language, g_config_info->type);
                if (false == support) {
-                       SLOG(LOG_DEBUG, tts_tag(), "[ERROR] Default voice is valid");
+                       SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[ERROR] Default voice is valid");
                        char* temp_lang = NULL;
                        int temp_type;
                        ret = __tts_config_mgr_select_lang(g_config_info->engine_id, &temp_lang, &temp_type);
                        if (0 != ret) {
-                               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get voice");
+                               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get voice");
                        }
 
                        ret = tts_config_mgr_set_voice(temp_lang, temp_type);
                        if (0 != ret) {
-                               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to set voice");
+                               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to set voice");
                        } else {
-                               SLOG(LOG_DEBUG, tts_tag(), "[DEBUG] Saved default voice : lang(%s), type(%d)", g_config_info->language, g_config_info->type);
+                               SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[DEBUG] Saved default voice : lang(%s), type(%d)", g_config_info->language, g_config_info->type);
                        }
                        if (NULL != temp_lang) {
                                free(temp_lang);
@@ -925,7 +944,7 @@ static Eina_Bool __tts_config_mgr_engine_config_inotify_event_callback(void* dat
 
                        if (NULL != temp_client) {
                                if (NULL != temp_client->engine_cb) {
-                                       SECURE_SLOG(LOG_DEBUG, tts_tag(), "Engine changed callback : uid(%d)", temp_client->uid);
+                                       SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Engine changed callback : uid(%d)", temp_client->uid);
                                        temp_client->engine_cb(g_config_info->engine_id, g_config_info->setting,
                                                g_config_info->language, g_config_info->type, 
                                                g_config_info->auto_voice, g_config_info->credential, temp_client->user_data);
@@ -935,11 +954,10 @@ static Eina_Bool __tts_config_mgr_engine_config_inotify_event_callback(void* dat
                        iter = g_slist_next(iter);
                }
        } else {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Undefined event");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Undefined event");
        }
 
-       SLOG(LOG_DEBUG, tts_tag(), "=====");
-       SLOG(LOG_DEBUG, tts_tag(), " ");
+       SLOG(LOG_DEBUG, TAG_TTSCONFIG, "@@@");
 
        return ECORE_CALLBACK_PASS_ON;
 }
@@ -947,20 +965,20 @@ static Eina_Bool __tts_config_mgr_engine_config_inotify_event_callback(void* dat
 static int __tts_config_mgr_register_engine_config_updated_event(const char* path)
 {
        if (NULL == path) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Path is NULL");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Path is NULL");
                return -1;
        }
 
        /* For engine directory monitoring */
        tts_engine_inotify_s *ino = (tts_engine_inotify_s *)calloc(1, sizeof(tts_engine_inotify_s));
        if (NULL == ino) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to allocate memory");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to allocate memory");
                return -1;
        }
 
        ino->dir_fd = inotify_init();
        if (ino->dir_fd < 0) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to init inotify");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to init inotify");
                free(ino);
                ino = NULL;
 
@@ -968,9 +986,9 @@ static int __tts_config_mgr_register_engine_config_updated_event(const char* pat
        }
 
        ino->dir_wd = inotify_add_watch(ino->dir_fd, path, IN_CLOSE_WRITE);
-       SLOG(LOG_DEBUG, tts_tag(), "Add inotify watch(%s)", path);
+       SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Add inotify watch(%s)", path);
        if (ino->dir_wd < 0) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to add watch");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to add watch");
                free(ino);
                ino = NULL;
                return -1;
@@ -978,7 +996,7 @@ static int __tts_config_mgr_register_engine_config_updated_event(const char* pat
 
        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);
        if (NULL == ino->dir_fd_handler) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to add fd handler");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to add fd handler");
                free(ino);
                ino = NULL;
                return -1;
@@ -990,7 +1008,7 @@ static int __tts_config_mgr_register_engine_config_updated_event(const char* pat
        value |= O_NONBLOCK;
 
        if (0 > fcntl(ino->dir_fd, F_SETFL, value)) {
-               SLOG(LOG_WARN, tts_tag(), "[WARNING] Fail to set non-block mode");
+               SLOG(LOG_WARN, TAG_TTSCONFIG, "[WARNING] Fail to set non-block mode");
        }
 
        g_ino_list = g_list_append(g_ino_list, ino);
@@ -1041,7 +1059,7 @@ int tts_config_mgr_initialize(int uid)
                        get_uid = iter->data;
 
                        if (uid == *get_uid) {
-                               SECURE_SLOG(LOG_WARN, tts_tag(), "[CONFIG] uid(%d) has already registered", uid);
+                               SECURE_SLOG(LOG_WARN, TAG_TTSCONFIG, "[CONFIG] uid(%d) has already registered", uid);
                                return 0;
                        }
 
@@ -1050,68 +1068,82 @@ int tts_config_mgr_initialize(int uid)
 
                temp_client = (tts_config_client_s*)calloc(1, sizeof(tts_config_client_s));
                if (NULL == temp_client) {
-                       SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to allocate memory");
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to allocate memory");
                        return TTS_CONFIG_ERROR_OUT_OF_MEMORY;
                }
                temp_client->uid = uid;
+               temp_client->engine_cb = NULL;
+               temp_client->voice_cb = NULL;
+               temp_client->speech_cb = NULL;
+               temp_client->pitch_cb = NULL;
+               temp_client->screen_cb = NULL;
+               temp_client->bg_volume_ratio_cb = NULL;
+               temp_client->user_data = NULL;
 
                g_config_client_list = g_slist_append(g_config_client_list, temp_client);
 
-               SECURE_SLOG(LOG_WARN, tts_tag(), "[CONFIG] Add uid(%d) but config has already initialized", uid);
+               SECURE_SLOG(LOG_WARN, TAG_TTSCONFIG, "[CONFIG] Add uid(%d) but config has already initialized", uid);
                return 0;
        } else {
                temp_client = (tts_config_client_s*)calloc(1, sizeof(tts_config_client_s));
                if (NULL == temp_client) {
-                       SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to allocate memory");
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to allocate memory");
                        return TTS_CONFIG_ERROR_OUT_OF_MEMORY;
                }
                temp_client->uid = uid;
+               temp_client->engine_cb = NULL;
+               temp_client->voice_cb = NULL;
+               temp_client->speech_cb = NULL;
+               temp_client->pitch_cb = NULL;
+               temp_client->screen_cb = NULL;
+               temp_client->bg_volume_ratio_cb = NULL;
+               temp_client->user_data = NULL;
 
                g_config_client_list = g_slist_append(g_config_client_list, temp_client);
        }
 
        if (0 != access(TTS_CONFIG_BASE, F_OK)) {
                if (0 != mkdir(TTS_CONFIG_BASE, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
-                       SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to make directory : %s", TTS_CONFIG_BASE);
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to make directory : %s", TTS_CONFIG_BASE);
                        __tts_config_release_client(uid);
                        return TTS_CONFIG_ERROR_OPERATION_FAILED;
                } else {
-                       SLOG(LOG_DEBUG, tts_tag(), "Success to make directory : %s", TTS_CONFIG_BASE);
+                       SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Success to make directory : %s", TTS_CONFIG_BASE);
                }
        }
 
        if (0 != access(TTS_HOME, F_OK)) {
                if (0 != mkdir(TTS_HOME, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
-                       SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to make directory : %s", TTS_HOME);
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to make directory : %s", TTS_HOME);
                        __tts_config_release_client(uid);
                        return TTS_CONFIG_ERROR_OPERATION_FAILED;
                } else {
-                       SLOG(LOG_DEBUG, tts_tag(), "Success to make directory : %s", TTS_HOME);
+                       SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Success to make directory : %s", TTS_HOME);
                }
        }
 
        if (0 != access(TTS_DOWNLOAD_BASE, F_OK)) {
                if (0 != mkdir(TTS_DOWNLOAD_BASE, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
-                       SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to make directory : %s", TTS_DOWNLOAD_BASE);
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to make directory : %s", TTS_DOWNLOAD_BASE);
                        __tts_config_release_client(uid);
                        return TTS_CONFIG_ERROR_OPERATION_FAILED;
                } else {
-                       SLOG(LOG_DEBUG, tts_tag(), "Success to make directory : %s", TTS_DOWNLOAD_BASE);
+                       SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Success to make directory : %s", TTS_DOWNLOAD_BASE);
                }
        }
 
        if (0 != access(TTS_DOWNLOAD_ENGINE_INFO, F_OK)) {
                if (0 != mkdir(TTS_DOWNLOAD_ENGINE_INFO, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)) {
-                       SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to make directory : %s", TTS_DOWNLOAD_ENGINE_INFO);
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to make directory : %s", TTS_DOWNLOAD_ENGINE_INFO);
                        __tts_config_release_client(uid);
                        return TTS_CONFIG_ERROR_OPERATION_FAILED;
                } else {
-                       SLOG(LOG_DEBUG, tts_tag(), "Success to make directory : %s", TTS_DOWNLOAD_ENGINE_INFO);
+                       SLOG(LOG_DEBUG, TAG_TTSCONFIG, "Success to make directory : %s", TTS_DOWNLOAD_ENGINE_INFO);
                }
        }
 
        if (0 != __tts_config_mgr_get_engine_info()) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get engine info");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get engine info");
                __tts_config_release_client(uid);
                __tts_config_release_engine();
                return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
@@ -1120,7 +1152,7 @@ int tts_config_mgr_initialize(int uid)
        __tts_config_mgr_print_engine_info();
 
        if (0 != tts_parser_load_config(&g_config_info)) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to parse configure information");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to parse configure information");
                __tts_config_release_client(uid);
                __tts_config_release_engine();
                return TTS_CONFIG_ERROR_OPERATION_FAILED;
@@ -1128,10 +1160,11 @@ int tts_config_mgr_initialize(int uid)
 
        /* Check whether engine id is valid */
        if (0 != __tts_config_mgr_check_engine_is_valid(g_config_info->engine_id)) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get default engine");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to get default engine");
                __tts_config_release_client(uid);
                __tts_config_release_engine();
                tts_parser_unload_config(g_config_info);
+               g_config_info = NULL;
                return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
        }
 
@@ -1144,10 +1177,11 @@ int tts_config_mgr_initialize(int uid)
                        char* tmp_language = NULL;
                        int tmp_type = -1;
                        if (0 != __tts_config_mgr_select_lang(g_config_info->engine_id, &tmp_language, &tmp_type)) {
-                               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to select language");
+                               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to select language");
                                __tts_config_release_client(uid);
                                __tts_config_release_engine();
                                tts_parser_unload_config(g_config_info);
+                               g_config_info = NULL;
                                return TTS_CONFIG_ERROR_OPERATION_FAILED;
                        }
 
@@ -1162,10 +1196,11 @@ int tts_config_mgr_initialize(int uid)
                                tmp_language = NULL;
 
                                if (0 != tts_parser_set_voice(g_config_info->language, g_config_info->type)) {
-                                       SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to save config");
+                                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to save config");
                                        __tts_config_release_client(uid);
                                        __tts_config_release_engine();
                                        tts_parser_unload_config(g_config_info);
+                                       g_config_info = NULL;
                                        return TTS_CONFIG_ERROR_OPERATION_FAILED;
                                }
                        }
@@ -1173,21 +1208,23 @@ int tts_config_mgr_initialize(int uid)
        }
 
        /* print daemon config */
-       SLOG(LOG_DEBUG, tts_tag(), "== TTS config ==");
-       SECURE_SLOG(LOG_DEBUG, tts_tag(), " engine : %s", g_config_info->engine_id);
-       SECURE_SLOG(LOG_DEBUG, tts_tag(), " setting : %s", g_config_info->setting);
-       SECURE_SLOG(LOG_DEBUG, tts_tag(), " auto voice : %s", g_config_info->auto_voice ? "on" : "off");
-       SECURE_SLOG(LOG_DEBUG, tts_tag(), " language : %s", g_config_info->language);
-       SECURE_SLOG(LOG_DEBUG, tts_tag(), " voice type : %d", g_config_info->type);
-       SECURE_SLOG(LOG_DEBUG, tts_tag(), " speech rate : %d", g_config_info->speech_rate);
-       SECURE_SLOG(LOG_DEBUG, tts_tag(), " pitch : %d", g_config_info->pitch);
-       SLOG(LOG_DEBUG, tts_tag(), "=================");
+       SLOG(LOG_DEBUG, TAG_TTSCONFIG, "@@@ TTS config @@@");
+       SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " engine : %s", g_config_info->engine_id);
+       SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " setting : %s", g_config_info->setting);
+       SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " auto voice : %s", g_config_info->auto_voice ? "on" : "off");
+       SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " language : %s", g_config_info->language);
+       SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " voice type : %d", g_config_info->type);
+       SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " speech rate : %d", g_config_info->speech_rate);
+       SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " pitch : %d", g_config_info->pitch);
+       SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, " bg volume ratio : %lf", g_config_info->bg_volume_ratio);
+       SLOG(LOG_DEBUG, TAG_TTSCONFIG, "@@@@@");
 
        if (0 != __tts_config_mgr_register_config_event()) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to register config event");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to register config event");
                __tts_config_release_client(uid);
                __tts_config_release_engine();
                tts_parser_unload_config(g_config_info);
+               g_config_info = NULL;
                return TTS_CONFIG_ERROR_OPERATION_FAILED;
        }
 
@@ -1197,7 +1234,7 @@ int tts_config_mgr_initialize(int uid)
 
        /* For engine directory monitoring */
        //if (0 != __tts_config_mgr_register_engine_config_updated_event()) {
-       //      SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to register engine config updated event");
+       //      SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Fail to register engine config updated event");
        //      __tts_config_release_client(uid);
        //      __tts_config_release_engine();
        //      tts_parser_unload_config(g_config_info);
@@ -1219,6 +1256,7 @@ int tts_config_mgr_finalize(int uid)
        __tts_config_release_engine();
 
        tts_parser_unload_config(g_config_info);
+       g_config_info = NULL;
 
        __tts_config_mgr_unregister_engine_config_updated_event();
 
@@ -1235,6 +1273,7 @@ int tts_config_mgr_set_callback(int uid,
                                tts_config_voice_changed_cb voice_cb, 
                                tts_config_speech_rate_changed_cb speech_cb, 
                                tts_config_pitch_changed_cb pitch_cb,
+                               tts_config_bg_volume_ratio_changed_cb bg_volume_ratio_cb,
                                void* user_data)
 {
        GSList *iter = NULL;
@@ -1252,6 +1291,7 @@ int tts_config_mgr_set_callback(int uid,
                                temp_client->voice_cb = voice_cb;
                                temp_client->speech_cb = speech_cb;
                                temp_client->pitch_cb = pitch_cb;
+                               temp_client->bg_volume_ratio_cb = bg_volume_ratio_cb;
                                temp_client->user_data = user_data;
                        }
                }
@@ -1278,6 +1318,7 @@ int tts_config_mgr_unset_callback(int uid)
                                temp_client->voice_cb = NULL;
                                temp_client->speech_cb = NULL;
                                temp_client->pitch_cb = NULL;
+                               temp_client->bg_volume_ratio_cb = NULL;
                                temp_client->user_data = NULL;
                        }
                }
@@ -1291,7 +1332,7 @@ int tts_config_mgr_unset_callback(int uid)
 int tts_config_set_screen_reader_callback(int uid, tts_config_screen_reader_changed_cb callback)
 {
        if (NULL == callback) {
-               SLOG(LOG_ERROR, tts_tag(), "Input parameter is NULL");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "Input parameter is NULL");
                return TTS_CONFIG_ERROR_INVALID_PARAMETER;
        }
 
@@ -1341,7 +1382,7 @@ int tts_config_unset_screen_reader_callback(int uid)
 int tts_config_mgr_get_engine_list(tts_config_supported_engine_cb callback, void* user_data)
 {
        if (0 >= g_slist_length(g_config_client_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "Not initialized");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
                return TTS_CONFIG_ERROR_INVALID_STATE;
        }
 
@@ -1349,7 +1390,7 @@ int tts_config_mgr_get_engine_list(tts_config_supported_engine_cb callback, void
        tts_engine_info_s *engine_info = NULL;
 
        if (0 >= g_slist_length(g_engine_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "There is no engine!!");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "There is no engine!!");
                return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
        }
 
@@ -1374,12 +1415,12 @@ int tts_config_mgr_get_engine_list(tts_config_supported_engine_cb callback, void
 int tts_config_mgr_get_engine(char** engine)
 {
        if (0 >= g_slist_length(g_config_client_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "Not initialized");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
                return TTS_CONFIG_ERROR_INVALID_STATE;
        }
 
        if (NULL == engine) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Input parameter is NULL");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Input parameter is NULL");
                return TTS_CONFIG_ERROR_INVALID_PARAMETER;
        }
 
@@ -1389,7 +1430,7 @@ int tts_config_mgr_get_engine(char** engine)
                tts_engine_info_s *engine_info = NULL;
 
                if (0 >= g_slist_length(g_engine_list)) {
-                       SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine!!");
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] There is no engine!!");
                        return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
                }
 
@@ -1408,9 +1449,9 @@ int tts_config_mgr_get_engine(char** engine)
                        iter = g_slist_next(iter);
                }
 
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Current engine id is not valid");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Current engine id is not valid");
        } else {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Engine id is NULL");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Engine id is NULL");
        }
 
        return TTS_CONFIG_ERROR_OPERATION_FAILED;
@@ -1425,28 +1466,28 @@ int __tts_set_buxtonkey(const char* engine)
 
        int ret = buxton_open(&bux_cli, NULL, NULL);
        if (0 != ret) {
-               SLOG(LOG_ERROR, tts_tag(), "[DBUS-BUXTON2] buxton_open failed!! (%d)", ret);
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[DBUS-BUXTON2] buxton_open failed!! (%d)", ret);
                return TTS_CONFIG_ERROR_OPERATION_FAILED;
        }
        bux_layer = buxton_create_layer("system");
        if (NULL == bux_layer) {
-               SLOG(LOG_ERROR, tts_tag(), "[DBUS-BUXTON2] buxton_create_layer FAIL");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[DBUS-BUXTON2] buxton_create_layer FAIL");
                buxton_close(bux_cli);
                return TTS_CONFIG_ERROR_OPERATION_FAILED;
        }
        bux_val = buxton_value_create_string(engine);
        if (NULL == bux_val) {
-               SLOG(LOG_ERROR, tts_tag(), "[DBUS-BUXTON2] buxton_value_create_string FAIL");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[DBUS-BUXTON2] buxton_value_create_string FAIL");
                buxton_free_layer(bux_layer);
                buxton_close(bux_cli);
                return TTS_CONFIG_ERROR_OPERATION_FAILED;
        } else {
-               SLOG(LOG_DEBUG, tts_tag(), "[DBUS-BUXTON2] layer: %s", buxton_layer_get_name(bux_layer));
+               SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[DBUS-BUXTON2] layer: %s", buxton_layer_get_name(bux_layer));
        }
 
        ret = buxton_set_value_sync(bux_cli, bux_layer, TTS_ENGINE_DB_DEFAULT, bux_val);
        if (0 != ret) {
-               SLOG(LOG_ERROR, tts_tag(), "[DBUS-BUXTON2] buxton_set_value_sync failed!! (%d)", ret);
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[DBUS-BUXTON2] buxton_set_value_sync failed!! (%d)", ret);
                buxton_value_free(bux_val);
                buxton_free_layer(bux_layer);
                buxton_close(bux_cli);
@@ -1457,7 +1498,7 @@ int __tts_set_buxtonkey(const char* engine)
 
                return TTS_CONFIG_ERROR_OPERATION_FAILED;
        } else {
-               SLOG(LOG_DEBUG, tts_tag(), "[DBUS-BUXTON2] buxton_set_value_sync: %d, %s", ret, TTS_ENGINE_DB_DEFAULT);
+               SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[DBUS-BUXTON2] buxton_set_value_sync: %d, %s", ret, TTS_ENGINE_DB_DEFAULT);
        }
 
        buxton_value_free(bux_val);
@@ -1474,7 +1515,7 @@ int __tts_set_buxtonkey(const char* engine)
 int tts_config_mgr_set_engine(const char* engine)
 {
        if (0 >= g_slist_length(g_config_client_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "Not initialized");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
                return TTS_CONFIG_ERROR_INVALID_STATE;
        }
 
@@ -1486,15 +1527,15 @@ int tts_config_mgr_set_engine(const char* engine)
                return 0;
 
        if (0 >= g_slist_length(g_engine_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine!!");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] There is no engine!!");
                return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
        }
 
-       SLOG(LOG_DEBUG, tts_tag(), "New engine id : %s", engine);
+       SLOG(LOG_DEBUG, TAG_TTSCONFIG, "New engine id : %s", engine);
 
        int ret = __tts_set_buxtonkey(engine);
        if (0 != ret) {
-               SLOG(LOG_DEBUG, tts_tag(), "[DEBUG] set_buxtonkey Fail!!");
+               SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[DEBUG] set_buxtonkey Fail!!");
                return ret;
        }
 
@@ -1509,7 +1550,7 @@ int tts_config_mgr_set_engine(const char* engine)
                engine_info = iter->data;
 
                if (NULL == engine_info) {
-                       SLOG(LOG_ERROR, tts_tag(), "[ERROR] Engine info is NULL");
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Engine info is NULL");
                        iter = g_slist_next(iter);
                        continue;
                }
@@ -1545,7 +1586,7 @@ int tts_config_mgr_set_engine(const char* engine)
                        if (NULL != voice) {
                                if (NULL == voice->language)
                                        continue;
-                               SLOG(LOG_DEBUG, tts_tag(), " lang(%s) type(%d)", voice->language, voice->type);
+                               SLOG(LOG_DEBUG, TAG_TTSCONFIG, " lang(%s) type(%d)", voice->language, voice->type);
 
                                if (0 == strcmp(voice->language, g_config_info->language)) {
                                        if (voice->type == g_config_info->type) {
@@ -1582,19 +1623,19 @@ int tts_config_mgr_set_engine(const char* engine)
        }
 
        if (true == is_valid_engine) {
-               SLOG(LOG_DEBUG, tts_tag(), "[Config] Engine changed");
-               SECURE_SLOG(LOG_DEBUG, tts_tag(), "  Engine : %s", g_config_info->engine_id);
-               SECURE_SLOG(LOG_DEBUG, tts_tag(), "  Setting : %s", g_config_info->setting);
-               SECURE_SLOG(LOG_DEBUG, tts_tag(), "  Language : %s", g_config_info->language);
-               SECURE_SLOG(LOG_DEBUG, tts_tag(), "  Type : %d", g_config_info->type);
+               SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[Config] Engine changed");
+               SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "  Engine : %s", g_config_info->engine_id);
+               SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "  Setting : %s", g_config_info->setting);
+               SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "  Language : %s", g_config_info->language);
+               SECURE_SLOG(LOG_DEBUG, TAG_TTSCONFIG, "  Type : %d", g_config_info->type);
 
                if (0 != tts_parser_set_engine(g_config_info->engine_id, g_config_info->setting,
                        g_config_info->language, g_config_info->type)) {
-                               SLOG(LOG_ERROR, tts_tag(), " Fail to save config");
+                               SLOG(LOG_ERROR, TAG_TTSCONFIG, " Fail to save config");
                                return TTS_CONFIG_ERROR_OPERATION_FAILED;
                }
        } else {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Engine id is not valid");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Engine id is not valid");
                return TTS_CONFIG_ERROR_OPERATION_FAILED;
        }
 
@@ -1604,12 +1645,12 @@ int tts_config_mgr_set_engine(const char* engine)
 int tts_config_mgr_get_voice_list(const char* engine_id, tts_config_supported_voice_cb callback, void* user_data)
 {
        if (0 >= g_slist_length(g_config_client_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "Not initialized");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
                return TTS_CONFIG_ERROR_INVALID_STATE;
        }
 
        if (0 >= g_slist_length(g_engine_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] There is no engine");
                return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
        }
 
@@ -1623,7 +1664,7 @@ int tts_config_mgr_get_voice_list(const char* engine_id, tts_config_supported_vo
                engine_info = iter->data;
 
                if (NULL == engine_info) {
-                       SLOG(LOG_ERROR, tts_tag(), "[ERROR] engine info is NULL");
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] engine info is NULL");
                        return TTS_CONFIG_ERROR_OPERATION_FAILED;
                }
 
@@ -1642,7 +1683,7 @@ int tts_config_mgr_get_voice_list(const char* engine_id, tts_config_supported_vo
                        /*Get handle data from list*/
                        voice = iter_voice->data;
 
-                       SLOG(LOG_DEBUG, tts_tag(), " lang(%s) type(%d)", voice->language, voice->type);
+                       SLOG(LOG_DEBUG, TAG_TTSCONFIG, " lang(%s) type(%d)", voice->language, voice->type);
                        if (NULL != voice->language) {
                                if (false == callback(engine_info->uuid, voice->language, voice->type, user_data))
                                        break;
@@ -1660,12 +1701,12 @@ int tts_config_mgr_get_voice_list(const char* engine_id, tts_config_supported_vo
 int tts_config_mgr_get_voice(char** language, int* type)
 {
        if (0 >= g_slist_length(g_config_client_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "Not initialized");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
                return TTS_CONFIG_ERROR_INVALID_PARAMETER;
        }
 
        if (0 >= g_slist_length(g_engine_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] There is no engine");
                return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
        }
 
@@ -1676,7 +1717,7 @@ int tts_config_mgr_get_voice(char** language, int* type)
                *language = strdup(g_config_info->language);
                *type = g_config_info->type;
        } else {
-               SLOG(LOG_ERROR, tts_tag(), "language is NULL");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "language is NULL");
                return TTS_CONFIG_ERROR_OPERATION_FAILED;
        }
 
@@ -1686,23 +1727,23 @@ int tts_config_mgr_get_voice(char** language, int* type)
 int tts_config_mgr_set_voice(const char* language, int type)
 {
        if (0 >= g_slist_length(g_config_client_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "Not initialized");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
                return TTS_CONFIG_ERROR_INVALID_PARAMETER;
        }
 
        if (NULL == language) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Input parameter is NULL");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Input parameter is NULL");
                return TTS_CONFIG_ERROR_INVALID_PARAMETER;
        }
 
        if (0 >= g_slist_length(g_engine_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] There is no engine");
                return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
        }
 
        /* Check language is valid */
        if (0 != tts_parser_set_voice(language, type)) {
-               SLOG(LOG_ERROR, tts_tag(), "Fail to save default voice");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "Fail to save default voice");
                return TTS_CONFIG_ERROR_OPERATION_FAILED;
        }
        memset(g_language, '\0', sizeof(g_language));
@@ -1717,7 +1758,7 @@ int tts_config_mgr_set_voice(const char* language, int type)
 int tts_config_mgr_get_auto_voice(bool* value)
 {
        if (0 >= g_slist_length(g_config_client_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "Not initialized");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
                return TTS_CONFIG_ERROR_INVALID_PARAMETER;
        }
 
@@ -1732,14 +1773,14 @@ int tts_config_mgr_get_auto_voice(bool* value)
 int tts_config_mgr_set_auto_voice(bool value)
 {
        if (0 >= g_slist_length(g_config_client_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "Not initialized");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
                return TTS_CONFIG_ERROR_INVALID_PARAMETER;
        }
 
        if (g_config_info->auto_voice != value) {
                /* Check language is valid */
                if (0 != tts_parser_set_auto_voice(value)) {
-                       SLOG(LOG_ERROR, tts_tag(), "Fail to save auto voice option");
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "Fail to save auto voice option");
                        return TTS_CONFIG_ERROR_OPERATION_FAILED;
                }
                g_config_info->auto_voice = value;
@@ -1755,7 +1796,7 @@ int tts_config_mgr_set_auto_voice(bool value)
 int tts_config_mgr_get_speech_rate(int* value)
 {
        if (0 >= g_slist_length(g_config_client_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "Not initialized");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
                return TTS_CONFIG_ERROR_INVALID_PARAMETER;
        }
 
@@ -1771,20 +1812,20 @@ int tts_config_mgr_get_speech_rate(int* value)
 int tts_config_mgr_set_speech_rate(int value)
 {
        if (0 >= g_slist_length(g_config_client_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "Not initialized");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
                return TTS_CONFIG_ERROR_INVALID_PARAMETER;
        }
 
        if (TTS_CONFIG_SPEED_MIN <= value && value <= TTS_CONFIG_SPEED_MAX) {
-               SLOG(LOG_DEBUG, tts_tag(), "[Config] Set speech rate : %d", value);
+               SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[Config] Set speech rate : %d", value);
                if (0 != tts_parser_set_speech_rate(value)) {
-                       SLOG(LOG_ERROR, tts_tag(), "Fail to save speech rate");
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "Fail to save speech rate");
                        return TTS_CONFIG_ERROR_OPERATION_FAILED;
                }
 
                g_config_info->speech_rate = value;
        } else {
-               SLOG(LOG_ERROR, tts_tag(), "[Config ERROR] Speech rate is invalid : %d", value);
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[Config ERROR] Speech rate is invalid : %d", value);
        }
 
        return 0;
@@ -1793,7 +1834,7 @@ int tts_config_mgr_set_speech_rate(int value)
 int tts_config_mgr_get_pitch(int* value)
 {
        if (0 >= g_slist_length(g_config_client_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "Not initialized");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
                return TTS_CONFIG_ERROR_INVALID_PARAMETER;
        }
 
@@ -1805,7 +1846,7 @@ int tts_config_mgr_get_pitch(int* value)
        tts_engine_info_s *engine_info = NULL;
 
        if (0 >= g_slist_length(g_engine_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine!!");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] There is no engine!!");
                return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
        }
 
@@ -1816,7 +1857,7 @@ int tts_config_mgr_get_pitch(int* value)
                engine_info = iter->data;
 
                if (NULL == engine_info) {
-                       SLOG(LOG_ERROR, tts_tag(), "engine info is NULL");
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "engine info is NULL");
                        return TTS_CONFIG_ERROR_OPERATION_FAILED;
                }
 
@@ -1840,7 +1881,7 @@ int tts_config_mgr_get_pitch(int* value)
 int tts_config_mgr_set_pitch(int value)
 {
        if (0 >= g_slist_length(g_config_client_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "Not initialized");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
                return -1;
        }
 
@@ -1848,7 +1889,7 @@ int tts_config_mgr_set_pitch(int value)
        tts_engine_info_s *engine_info = NULL;
 
        if (0 >= g_slist_length(g_engine_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] There is no engine!!");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] There is no engine!!");
                return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
        }
 
@@ -1859,7 +1900,7 @@ int tts_config_mgr_set_pitch(int value)
                engine_info = iter->data;
 
                if (NULL == engine_info) {
-                       SLOG(LOG_ERROR, tts_tag(), "engine info is NULL");
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "engine info is NULL");
                        return TTS_CONFIG_ERROR_OPERATION_FAILED;
                }
 
@@ -1876,7 +1917,7 @@ int tts_config_mgr_set_pitch(int value)
        }
 
        if (0 != tts_parser_set_pitch(value)) {
-               SLOG(LOG_ERROR, tts_tag(), "Fail to save speech rate");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "Fail to save speech rate");
                return TTS_CONFIG_ERROR_OPERATION_FAILED;
        }
 
@@ -1885,10 +1926,44 @@ int tts_config_mgr_set_pitch(int value)
        return 0;
 }
 
+int tts_config_mgr_get_bg_volume_ratio(double *value)
+{
+       if (0 >= g_slist_length(g_config_client_list)) {
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
+               return TTS_CONFIG_ERROR_INVALID_PARAMETER;
+       }
+
+       if (NULL == value)
+               return TTS_CONFIG_ERROR_INVALID_PARAMETER;
+       else
+               *value = g_config_info->bg_volume_ratio;
+
+       return 0;
+}
+
+int tts_config_mgr_set_bg_volume_ratio(double value)
+{
+       if (0 >= g_slist_length(g_config_client_list)) {
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
+               return TTS_CONFIG_ERROR_INVALID_PARAMETER;
+       }
+
+       SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[Config] Set bg volume ratio : %lf", value);
+       if (0 != tts_parser_set_bg_volume_ratio(value))
+       {
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "Fail to save bg volume ratio");
+               return TTS_CONFIG_ERROR_OPERATION_FAILED;
+       }
+
+       g_config_info->bg_volume_ratio = value;
+
+       return 0;
+}
+
 bool tts_config_check_default_engine_is_valid(const char* engine)
 {
        if (0 >= g_slist_length(g_config_client_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "Not initialized");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
                return -1;
        }
 
@@ -1921,7 +1996,7 @@ bool tts_config_check_default_engine_is_valid(const char* engine)
 bool tts_config_check_default_voice_is_valid(const char* language, int type)
 {
        if (0 >= g_slist_length(g_config_client_list)) {
-               SLOG(LOG_ERROR, tts_tag(), "Not initialized");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
                return -1;
        }
 
@@ -1929,7 +2004,7 @@ bool tts_config_check_default_voice_is_valid(const char* language, int type)
                return false;
 
        if (0 == strlen(g_config_info->engine_id)) {
-               SLOG(LOG_ERROR, tts_tag(), "[ERROR] Default engine id is NULL");
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Default engine id is NULL");
                return false;
        }
 
@@ -1946,7 +2021,7 @@ bool tts_config_check_default_voice_is_valid(const char* language, int type)
                engine_info = iter->data;
 
                if (NULL == engine_info) {
-                       SLOG(LOG_ERROR, tts_tag(), "[ERROR] Engine info is NULL");
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] Engine info is NULL");
                        iter = g_slist_next(iter);
                        continue;
                }
@@ -1985,27 +2060,27 @@ int __tts_config_mgr_print_engine_info()
        tts_engine_info_s *engine_info = NULL;
 
        if (0 >= g_slist_length(g_engine_list)) {
-               SLOG(LOG_DEBUG, tts_tag(), "-------------- engine list -----------------");
-               SLOG(LOG_DEBUG, tts_tag(), "  No Engine in engine directory");
-               SLOG(LOG_DEBUG, tts_tag(), "--------------------------------------------");
+               SLOG(LOG_DEBUG, TAG_TTSCONFIG, "-------------- engine list -----------------");
+               SLOG(LOG_DEBUG, TAG_TTSCONFIG, "  No Engine in engine directory");
+               SLOG(LOG_DEBUG, TAG_TTSCONFIG, "--------------------------------------------");
                return 0;
        }
 
        /* Get a first item */
        iter = g_slist_nth(g_engine_list, 0);
 
-       SLOG(LOG_DEBUG, tts_tag(), "--------------- engine list -----------------");
+       SLOG(LOG_DEBUG, TAG_TTSCONFIG, "--------------- engine list -----------------");
 
        int i = 1;
        while (NULL != iter) {
                engine_info = iter->data;
 
-               SLOG(LOG_DEBUG, tts_tag(), "[%dth]", i);
-               SLOG(LOG_DEBUG, tts_tag(), " name : %s", engine_info->name);
-               SLOG(LOG_DEBUG, tts_tag(), " id   : %s", engine_info->uuid);
-               SLOG(LOG_DEBUG, tts_tag(), " setting : %s", engine_info->setting);
+               SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[%dth]", i);
+               SLOG(LOG_DEBUG, TAG_TTSCONFIG, " name : %s", engine_info->name);
+               SLOG(LOG_DEBUG, TAG_TTSCONFIG, " id   : %s", engine_info->uuid);
+               SLOG(LOG_DEBUG, TAG_TTSCONFIG, " setting : %s", engine_info->setting);
 
-               SLOG(LOG_DEBUG, tts_tag(), " Voices");
+               SLOG(LOG_DEBUG, TAG_TTSCONFIG, " Voices");
                GSList *iter_voice = NULL;
                tts_config_voice_s* voice = NULL;
 
@@ -2018,19 +2093,68 @@ int __tts_config_mgr_print_engine_info()
                                /*Get handle data from list*/
                                voice = iter_voice->data;
 
-                               SLOG(LOG_DEBUG, tts_tag(), "  [%dth] lang(%s) type(%d)", j, voice->language, voice->type);
+                               SLOG(LOG_DEBUG, TAG_TTSCONFIG, "  [%dth] lang(%s) type(%d)", j, voice->language, voice->type);
 
                                /*Get next item*/
                                iter_voice = g_slist_next(iter_voice);
                                j++;
                        }
                } else {
-                       SLOG(LOG_ERROR, tts_tag(), "  Voice is NONE");
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "  Voice is NONE");
                }
                iter = g_slist_next(iter);
                i++;
        }
-       SLOG(LOG_DEBUG, tts_tag(), "--------------------------------------------");
+       SLOG(LOG_DEBUG, TAG_TTSCONFIG, "--------------------------------------------");
+
+       return 0;
+}
+
+int tts_config_mgr_get_max_text_size(unsigned int* size)
+{
+       if (0 >= g_slist_length(g_config_client_list)) {
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "Not initialized");
+               return TTS_CONFIG_ERROR_INVALID_PARAMETER;
+       }
+
+       if (NULL == size) {
+               return TTS_CONFIG_ERROR_INVALID_PARAMETER;
+       }
+
+       GSList *iter = NULL;
+       tts_engine_info_s *engine_info = NULL;
+
+       if (0 >= g_slist_length(g_engine_list)) {
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "[ERROR] There is no engine!!");
+               return TTS_CONFIG_ERROR_ENGINE_NOT_FOUND;
+       }
+
+       /* Get a first item */
+       iter = g_slist_nth(g_engine_list, 0);
+
+       while (NULL != iter) {
+               engine_info = iter->data;
+
+               if (NULL == engine_info) {
+                       SLOG(LOG_ERROR, TAG_TTSCONFIG, "engine info is NULL");
+                       return TTS_CONFIG_ERROR_OPERATION_FAILED;
+               }
+
+               if (0 != strcmp(g_config_info->engine_id, engine_info->uuid)) {
+                       iter = g_slist_next(iter);
+                       continue;
+               }
+
+               break;
+       }
+
+       if (NULL == engine_info) {
+               SLOG(LOG_ERROR, TAG_TTSCONFIG, "engine info is NULL");
+               return TTS_CONFIG_ERROR_OPERATION_FAILED;
+       }
+
+       *size = engine_info->text_size;
+       SLOG(LOG_DEBUG, TAG_TTSCONFIG, "[DEBUG] Max text size is %d.", *size);
 
        return 0;
 }