From 24d1f505a43060c7771b162da862d121d5616523 Mon Sep 17 00:00:00 2001 From: Kwangyoun Kim Date: Thu, 28 Mar 2013 19:40:10 +0900 Subject: [PATCH] support speech rate Change-Id: I7836c438b6c40392b9d48027c09016fdfeb3c02e --- CMakeLists.txt | 2 +- changelog | 9 ++ packaging/tts.spec | 3 +- server/CMakeLists.txt | 4 +- server/ttsd_config.c | 179 +++++++------------------- server/ttsd_config.h | 4 +- server/ttsd_config_noti.c | 276 +++++++++++++++++++++++++++++++++++++++ server/ttsd_config_sr.c | 319 ++++++++++++++++++++++++++++++++++++++++++++++ server/ttsd_server.c | 13 +- 9 files changed, 669 insertions(+), 140 deletions(-) mode change 100644 => 100755 changelog create mode 100755 server/ttsd_config_noti.c create mode 100755 server/ttsd_config_sr.c mode change 100644 => 100755 server/ttsd_server.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 9009ece..9c41bb8 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/common") ## Dependent packages ## INCLUDE(FindPkgConfig) pkg_check_modules(pkgs REQUIRED - mm-player vconf dlog ecore ecore-file dbus-1 mm-session capi-system-runtime-info + mm-player dlog ecore ecore-file dbus-1 mm-session capi-system-runtime-info vconf vconf-internal-keys ) ## Client library ## diff --git a/changelog b/changelog old mode 100644 new mode 100755 index 0cbfdc1..4fc66bf --- a/changelog +++ b/changelog @@ -1,3 +1,12 @@ +tts (0.1.57) -- Fri, 22 Mar 2013 + + * Release version (Dongyeol Lee ) + +tts (0.1.56-1) -- Wed, 21 Mar 2013 + + * Add using speech rate by setting in screen reader (Dongyeol Lee ) + * Divide config file (Dongyeol Lee ) + tts (0.1.56) -- Wed, 20 Mar 2013 * Release version (Dongyeol Lee ) diff --git a/packaging/tts.spec b/packaging/tts.spec index e642a8d..3d9388b 100755 --- a/packaging/tts.spec +++ b/packaging/tts.spec @@ -1,6 +1,6 @@ Name: tts Summary: Text To Speech client library and daemon -Version: 0.1.56 +Version: 0.1.57 Release: 1 Group: libs License: Samsung @@ -14,6 +14,7 @@ BuildRequires: pkgconfig(mm-common) BuildRequires: pkgconfig(mm-session) BuildRequires: pkgconfig(dlog) BuildRequires: pkgconfig(vconf) +BuildRequires: pkgconfig(vconf-internal-keys) BuildRequires: pkgconfig(ecore) BuildRequires: pkgconfig(ecore-file) BuildRequires: pkgconfig(capi-system-runtime-info) diff --git a/server/CMakeLists.txt b/server/CMakeLists.txt index e84018a..2385cfd 100755 --- a/server/CMakeLists.txt +++ b/server/CMakeLists.txt @@ -29,7 +29,7 @@ SET(NOTI_SRCS ttsd_data.cpp ttsd_player.c ttsd_engine_agent.c - ttsd_config.c + ttsd_config_noti.c ttsd_server.c ttsd_network.c ttsd_dbus.c @@ -41,7 +41,7 @@ SET(SR_SRCS ttsd_data.cpp ttsd_player.c ttsd_engine_agent.c - ttsd_config.c + ttsd_config_sr.c ttsd_server.c ttsd_network.c ttsd_dbus.c diff --git a/server/ttsd_config.c b/server/ttsd_config.c index dcda317..edc4823 100755 --- a/server/ttsd_config.c +++ b/server/ttsd_config.c @@ -20,13 +20,8 @@ #define CONFIG_DEFAULT BASE_DIRECTORY_DEFAULT"/ttsd.conf" -#define DEFAULT_CONFIG_FILE_NAME "/ttsd_default.conf" -#define NOTI_CONFIG_FILE_NAME "/ttsd_noti.conf" -#define SR_CONFIG_FILE_NAME "/ttsd_sr.conf" - -#define DEFAULT_ERROR_FILE_NAME "/ttsd_default.err" -#define NOTI_ERROR_FILE_NAME "/ttsd_noti.err" -#define SR_ERROR_FILE_NAME "/ttsd_sr.err" +#define DEFAULT_CONFIG_FILE_NAME CONFIG_DIRECTORY"/ttsd_default.conf" +#define DEFAULT_ERROR_FILE_NAME CONFIG_DIRECTORY"/ttsd_default.err" #define ENGINE_ID "ENGINE_ID" #define VOICE "VOICE" @@ -37,52 +32,25 @@ static char* g_language; static int g_vc_type; static int g_speed; -static char* g_config_file; - -static ttsd_config_lang_changed_cb g_callback; - -void __system_language_changed_cb(runtime_info_key_e key, void *user_data) -{ - if (RUNTIME_INFO_KEY_LANGUAGE == key) { - if (TTSD_MODE_NOTIFICATION == ttsd_get_mode() || TTSD_MODE_SCREEN_READER == ttsd_get_mode()) { - int ret = -1; - char *value; - - ret = runtime_info_get_value_string(RUNTIME_INFO_KEY_LANGUAGE, &value); - if (0 != ret) { - SLOG(LOG_ERROR, get_tag(), "[Config ERROR] Fail to get system language : %d", ret); - return; - } else { - SLOG(LOG_DEBUG, get_tag(), "[Config] System language changed : %s", value); - if (NULL != g_callback) - g_callback(value, g_vc_type); - - if (NULL != value) - free(value); - } - } - } - - return; -} +static ttsd_config_lang_changed_cb g_lang_cb; +static ttsd_config_speed_changed_cb g_speed_cb; int __ttsd_config_save() { - if (0 != access(g_config_file, R_OK|W_OK)) { + if (0 != access(DEFAULT_CONFIG_FILE_NAME, R_OK|W_OK)) { if (0 == ecore_file_mkpath(CONFIG_DIRECTORY)) { - SLOG(LOG_ERROR, get_tag(), "[Config ERROR ] Fail to create directory (%s)", CONFIG_DIRECTORY); - return -1; + SLOG(LOG_WARN, get_tag(), "[Config WARNING] Fail to create directory (%s)", CONFIG_DIRECTORY); + } else { + SLOG(LOG_DEBUG, get_tag(), "[Config] Create directory (%s)", CONFIG_DIRECTORY); } - - SLOG(LOG_WARN, get_tag(), "[Config] Create directory (%s)", CONFIG_DIRECTORY); } FILE* config_fp; - config_fp = fopen(g_config_file, "w+"); + config_fp = fopen(DEFAULT_CONFIG_FILE_NAME, "w+"); if (NULL == config_fp) { /* make file and file default */ - SLOG(LOG_WARN, get_tag(), "[Config WARNING] Fail to open config (%s)", g_config_file); + SLOG(LOG_WARN, get_tag(), "[Config WARNING] Fail to open config (%s)", DEFAULT_CONFIG_FILE_NAME); return -1; } @@ -110,10 +78,10 @@ int __ttsd_config_load() int int_param = 0; bool is_default_open = false; - config_fp = fopen(g_config_file, "r"); + config_fp = fopen(DEFAULT_CONFIG_FILE_NAME, "r"); if (NULL == config_fp) { - SLOG(LOG_WARN, get_tag(), "[Config WARNING] Not open file(%s)", g_config_file); + SLOG(LOG_WARN, get_tag(), "[Config WARNING] Not open file(%s)", DEFAULT_CONFIG_FILE_NAME); config_fp = fopen(CONFIG_DEFAULT, "r"); if (NULL == config_fp) { @@ -182,45 +150,27 @@ int __ttsd_config_load() if (true == is_default_open) { if(0 == __ttsd_config_save()) { - SLOG(LOG_DEBUG, get_tag(), "[Config] Create config(%s)", g_config_file); + SLOG(LOG_DEBUG, get_tag(), "[Config] Create config(%s)", DEFAULT_CONFIG_FILE_NAME); } } return 0; } -int ttsd_config_initialize(ttsd_config_lang_changed_cb callback) +int ttsd_config_initialize(ttsd_config_lang_changed_cb lang_cb, ttsd_config_speed_changed_cb speed_cb) { g_engine_id = NULL; g_language = NULL; g_vc_type = 1; g_speed = 3; - g_callback = callback; + g_lang_cb = lang_cb; + g_speed_cb = speed_cb; - if (TTSD_MODE_NOTIFICATION == ttsd_get_mode()) { - g_config_file = (char*)malloc(strlen(CONFIG_DIRECTORY) + strlen(NOTI_CONFIG_FILE_NAME) + 1); - strcpy(g_config_file, CONFIG_DIRECTORY); - strcat(g_config_file, NOTI_CONFIG_FILE_NAME); - } else if (TTSD_MODE_SCREEN_READER == ttsd_get_mode()) { - g_config_file = (char*)malloc(strlen(CONFIG_DIRECTORY) + strlen(SR_CONFIG_FILE_NAME) + 1); - strcpy(g_config_file, CONFIG_DIRECTORY); - strcat(g_config_file, SR_CONFIG_FILE_NAME); - } else { - g_config_file = (char*)malloc(strlen(CONFIG_DIRECTORY) + strlen(DEFAULT_CONFIG_FILE_NAME) + 1); - strcpy(g_config_file, CONFIG_DIRECTORY); - strcat(g_config_file, DEFAULT_CONFIG_FILE_NAME); - } + ecore_file_mkpath(CONFIG_DIRECTORY); __ttsd_config_load(); - /* Register system language changed callback */ - int ret = runtime_info_set_changed_cb(RUNTIME_INFO_KEY_LANGUAGE, __system_language_changed_cb, NULL); - if (0 != ret) { - SLOG(LOG_ERROR, get_tag(), "[Config ERROR] Fail to register callback : %d", ret); - return TTSD_ERROR_OPERATION_FAILED; - } - return 0; } @@ -228,40 +178,20 @@ int ttsd_config_finalize() { __ttsd_config_save(); - if (NULL != g_config_file) { - free(g_config_file); + if (NULL != g_language) { + free(g_language); } - + + if (NULL != g_engine_id) { + free(g_engine_id); + } + return 0; } int ttsd_config_update_language() { - if (TTSD_MODE_NOTIFICATION == ttsd_get_mode() || TTSD_MODE_SCREEN_READER == ttsd_get_mode()) { - int ret = -1; - char *value; - - ret = runtime_info_get_value_string(RUNTIME_INFO_KEY_LANGUAGE, &value); - if (0 != ret) { - SLOG(LOG_ERROR, get_tag(), "[Config ERROR] Fail to get system language : %d", ret); - return -1; - } else { - if (NULL == value) { - SLOG(LOG_ERROR, get_tag(), "[Config] Fail to get system language"); - return -1; - } else { - SLOG(LOG_DEBUG, get_tag(), "[Config] System language : %s", value); - - if (0 != strcmp(value, g_language)) { - if (NULL != g_callback) - g_callback(value, g_vc_type); - } - - free(value); - } - } - } - + /* no work in default mode */ return 0; } @@ -270,7 +200,13 @@ int ttsd_config_get_default_engine(char** engine_id) if (NULL == engine_id) return -1; - *engine_id = strdup(g_engine_id); + if (NULL != g_engine_id) { + *engine_id = strdup(g_engine_id); + } else { + SLOG(LOG_ERROR, get_tag(), "[Config ERROR] Current engine id is NULL"); + return -1; + } + return 0; } @@ -283,6 +219,7 @@ int ttsd_config_set_default_engine(const char* engine_id) free(g_engine_id); g_engine_id = strdup(engine_id); + __ttsd_config_save(); return 0; } @@ -292,9 +229,14 @@ int ttsd_config_get_default_voice(char** language, int* type) if (NULL == language || NULL == type) return -1; - *language = strdup(g_language); - *type = g_vc_type; - + if (NULL != g_language) { + *language = strdup(g_language); + *type = g_vc_type; + } else { + SLOG(LOG_ERROR, get_tag(), "[Config ERROR] Current language is NULL"); + return -1; + } + return 0; } @@ -310,7 +252,6 @@ int ttsd_config_set_default_voice(const char* language, int type) g_vc_type = type; __ttsd_config_save(); - return 0; } @@ -327,6 +268,7 @@ int ttsd_config_get_default_speed(int* speed) int ttsd_config_set_default_speed(int speed) { g_speed = speed; + __ttsd_config_save(); return 0; } @@ -334,42 +276,13 @@ int ttsd_config_set_default_speed(int speed) int ttsd_config_save_error(int uid, int uttid, const char* lang, int vctype, const char* text, const char* func, int line, const char* message) { - char* err_file; - - if (TTSD_MODE_NOTIFICATION == ttsd_get_mode()) { - err_file = (char*)malloc(strlen(CONFIG_DIRECTORY) + strlen(NOTI_ERROR_FILE_NAME) + 1); - if (NULL == err_file) { - SLOG(LOG_WARN, get_tag(), "[WARNING] Fail to get error file name"); - return -1; - } - strcpy(err_file, CONFIG_DIRECTORY); - strcat(err_file, NOTI_ERROR_FILE_NAME); - } else if (TTSD_MODE_SCREEN_READER == ttsd_get_mode()) { - err_file = (char*)malloc(strlen(CONFIG_DIRECTORY) + strlen(SR_ERROR_FILE_NAME) + 1); - if (NULL == err_file) { - SLOG(LOG_WARN, get_tag(), "[WARNING] Fail to get error file name"); - return -1; - } - strcpy(err_file, CONFIG_DIRECTORY); - strcat(err_file, SR_ERROR_FILE_NAME); - } else { - err_file = (char*)malloc(strlen(CONFIG_DIRECTORY) + strlen(DEFAULT_ERROR_FILE_NAME) + 1); - if (NULL == err_file) { - SLOG(LOG_WARN, get_tag(), "[WARNING] Fail to get error file name"); - return -1; - } - strcpy(err_file, CONFIG_DIRECTORY); - strcat(err_file, DEFAULT_ERROR_FILE_NAME); - } - FILE* err_fp; - err_fp = fopen(err_file, "w+"); + err_fp = fopen(DEFAULT_ERROR_FILE_NAME, "a"); if (NULL == err_fp) { - SLOG(LOG_WARN, get_tag(), "[WARNING] Fail to open error file (%s)", err_file); - free(err_file); + SLOG(LOG_WARN, get_tag(), "[WARNING] Fail to open error file (%s)", DEFAULT_ERROR_FILE_NAME); return -1; } - SLOG(LOG_DEBUG, get_tag(), "Save Error File (%s)", err_file); + SLOG(LOG_DEBUG, get_tag(), "Save Error File (%s)", DEFAULT_ERROR_FILE_NAME); /* func */ if (NULL != func) { @@ -417,8 +330,6 @@ int ttsd_config_save_error(int uid, int uttid, const char* lang, int vctype, con /* get data */ ttsd_data_save_error_log(uid, err_fp); - free(err_file); - fclose(err_fp); return 0; diff --git a/server/ttsd_config.h b/server/ttsd_config.h index e4b256a..4f865ac 100755 --- a/server/ttsd_config.h +++ b/server/ttsd_config.h @@ -21,7 +21,9 @@ extern "C" { typedef void (*ttsd_config_lang_changed_cb)(const char* langauge, int type); -int ttsd_config_initialize(ttsd_config_lang_changed_cb callback); +typedef void (*ttsd_config_speed_changed_cb)(int speed); + +int ttsd_config_initialize(ttsd_config_lang_changed_cb lang_cb, ttsd_config_speed_changed_cb speed_cb); int ttsd_config_finalize(); diff --git a/server/ttsd_config_noti.c b/server/ttsd_config_noti.c new file mode 100755 index 0000000..c7bbc40 --- /dev/null +++ b/server/ttsd_config_noti.c @@ -0,0 +1,276 @@ +/* +* Copyright (c) 2012, 2013 Samsung Electronics Co., Ltd All Rights Reserved +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#include +#include +#include "ttsd_main.h" +#include "ttsd_config.h" +#include "ttsd_engine_agent.h" +#include "ttsd_data.h" + +#define CONFIG_DEFAULT BASE_DIRECTORY_DEFAULT"/ttsd.conf" +#define NOTI_ERROR_FILE_NAME CONFIG_DIRECTORY"/ttsd_noti.err" + +#define ENGINE_ID "ENGINE_ID" + +static char* g_engine_id; +static char* g_language; +static int g_vc_type; +static int g_speed; + +static ttsd_config_lang_changed_cb g_lang_cb; +static ttsd_config_speed_changed_cb g_speed_cb; + +void __noti_system_language_changed_cb(runtime_info_key_e key, void *user_data) +{ + if (RUNTIME_INFO_KEY_LANGUAGE == key) { + if (TTSD_MODE_NOTIFICATION == ttsd_get_mode()) { + int ret = -1; + char *value; + + ret = runtime_info_get_value_string(RUNTIME_INFO_KEY_LANGUAGE, &value); + if (0 != ret) { + SLOG(LOG_ERROR, get_tag(), "[Config ERROR] Fail to get system language : %d", ret); + return; + } else { + SLOG(LOG_DEBUG, get_tag(), "[Config] System language changed : %s", value); + if (NULL != g_lang_cb) + g_lang_cb(value, g_vc_type); + + if (NULL != value) + free(value); + } + } + } + + return; +} + +int ttsd_config_initialize(ttsd_config_lang_changed_cb lang_cb, ttsd_config_speed_changed_cb speed_cb) +{ + int ret = -1; + char* value = NULL; + FILE* config_fp; + char buf_id[256] = {0}; + char buf_param[256] = {0}; + + g_engine_id = NULL; + g_language = NULL; + g_vc_type = 2; + g_speed = 3; + + g_lang_cb = lang_cb; + g_speed_cb = speed_cb; + + ecore_file_mkpath(CONFIG_DIRECTORY); + + /* Get default engine id */ + config_fp = fopen(CONFIG_DEFAULT, "r"); + if (NULL == config_fp) { + SLOG(LOG_ERROR, get_tag(), "[Config ERROR] Not open original config file(%s)", CONFIG_DEFAULT); + return -1; + } + + /* Read engine id */ + if (EOF == fscanf(config_fp, "%s %s", buf_id, buf_param)) { + fclose(config_fp); + SLOG(LOG_WARN, get_tag(), "[Config ERROR] Fail to read config (engine id)"); + return -1; + } + + fclose(config_fp); + + /* Get display language */ + ret = runtime_info_get_value_string(RUNTIME_INFO_KEY_LANGUAGE, &value); + if (0 != ret || NULL == value) { + SLOG(LOG_ERROR, get_tag(), "[Config ERROR] Fail to get system language : %d", ret); + return -1; + } else { + SLOG(LOG_DEBUG, get_tag(), "[Config] System language changed : %s", value); + + g_language = strdup(value); + + if (NULL != value) + free(value); + } + + /* Register system language changed callback */ + ret = runtime_info_set_changed_cb(RUNTIME_INFO_KEY_LANGUAGE, __noti_system_language_changed_cb, NULL); + if (0 != ret) { + SLOG(LOG_ERROR, get_tag(), "[Config ERROR] Fail to register callback : %d", ret); + return TTSD_ERROR_OPERATION_FAILED; + } + + return 0; +} + +int ttsd_config_finalize() +{ + if (NULL != g_language) { + free(g_language); + } + + if (NULL != g_engine_id) { + free(g_engine_id); + } + + return 0; +} + +int ttsd_config_update_language() +{ + if (TTSD_MODE_NOTIFICATION == ttsd_get_mode()) { + int ret = -1; + char *value; + + ret = runtime_info_get_value_string(RUNTIME_INFO_KEY_LANGUAGE, &value); + if (0 != ret) { + SLOG(LOG_ERROR, get_tag(), "[Config ERROR] Fail to get system language : %d", ret); + return -1; + } else { + if (NULL == value) { + SLOG(LOG_ERROR, get_tag(), "[Config] Fail to get system language"); + return -1; + } else { + SLOG(LOG_DEBUG, get_tag(), "[Config] System language : %s", value); + + if (0 != strcmp(value, g_language)) { + if (NULL != g_lang_cb) + g_lang_cb(value, g_vc_type); + } + + free(value); + } + } + } + + return 0; +} + +int ttsd_config_get_default_engine(char** engine_id) +{ + if (NULL == engine_id) + return -1; + + if (NULL != g_engine_id) { + *engine_id = strdup(g_engine_id); + } else { + SLOG(LOG_ERROR, get_tag(), "[Config ERROR] Current engine id is NULL"); + return -1; + } + return 0; +} + +int ttsd_config_set_default_engine(const char* engine_id) +{ + /* Not available in notification mode */ + return 0; +} + +int ttsd_config_get_default_voice(char** language, int* type) +{ + if (NULL == language || NULL == type) + return -1; + + if (NULL != g_language) { + *language = strdup(g_language); + *type = g_vc_type; + } else { + SLOG(LOG_ERROR, get_tag(), "[Config ERROR] Current language is NULL"); + return -1; + } + return 0; +} + +int ttsd_config_set_default_voice(const char* language, int type) +{ + /* Not available in notification mode */ + return 0; +} + +int ttsd_config_get_default_speed(int* speed) +{ + if (NULL == speed) + return -1; + + *speed = g_speed; + return 0; +} + +int ttsd_config_set_default_speed(int speed) +{ + /* Not available in notification mode */ + return 0; +} + +int ttsd_config_save_error(int uid, int uttid, const char* lang, int vctype, const char* text, + const char* func, int line, const char* message) +{ + FILE* err_fp; + err_fp = fopen(NOTI_ERROR_FILE_NAME, "a"); + if (NULL == err_fp) { + SLOG(LOG_WARN, get_tag(), "[WARNING] Fail to open error file (%s)", NOTI_ERROR_FILE_NAME); + return -1; + } + SLOG(LOG_DEBUG, get_tag(), "Save Error File (%s)", NOTI_ERROR_FILE_NAME); + + /* func */ + if (NULL != func) { + fprintf(err_fp, "function - %s\n", func); + } + + /* line */ + fprintf(err_fp, "line - %d\n", line); + + /* message */ + if (NULL != message) { + fprintf(err_fp, "message - %s\n", message); + } + + int ret; + /* uid */ + fprintf(err_fp, "uid - %d\n", uid); + + /* uttid */ + fprintf(err_fp, "uttid - %d\n", uttid); + + /* lang */ + if (NULL != lang) { + fprintf(err_fp, "language - %s\n", lang); + } + + /* vctype */ + fprintf(err_fp, "vctype - %d\n", vctype); + + /* text */ + if (NULL != text) { + fprintf(err_fp, "text - %s\n", text); + } + + /* get current engine */ + char *engine_id = NULL; + + ret = ttsd_engine_setting_get_engine(&engine_id); + if (0 != ret) { + SLOG(LOG_ERROR, get_tag(), "[ERROR] Fail to get current engine"); + } else { + fprintf(err_fp, "current engine - %s", engine_id); + } + + /* get data */ + ttsd_data_save_error_log(uid, err_fp); + + fclose(err_fp); + + return 0; +} \ No newline at end of file diff --git a/server/ttsd_config_sr.c b/server/ttsd_config_sr.c new file mode 100755 index 0000000..818d12a --- /dev/null +++ b/server/ttsd_config_sr.c @@ -0,0 +1,319 @@ +/* +* Copyright (c) 2012, 2013 Samsung Electronics Co., Ltd All Rights Reserved +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* http://www.apache.org/licenses/LICENSE-2.0 +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +#include +#include +#include +#include +#include "ttsd_main.h" +#include "ttsd_config.h" +#include "ttsd_engine_agent.h" +#include "ttsd_data.h" + +#define CONFIG_DEFAULT BASE_DIRECTORY_DEFAULT"/ttsd.conf" +#define SR_ERROR_FILE_NAME CONFIG_DIRECTORY"/ttsd_sr.err" + +#define ENGINE_ID "ENGINE_ID" + +static char* g_engine_id; +static char* g_language; +static int g_vc_type; +static int g_speed; + +static ttsd_config_lang_changed_cb g_lang_cb; +static ttsd_config_speed_changed_cb g_speed_cb; + +void __sr_system_language_changed_cb(runtime_info_key_e key, void *user_data) +{ + if (RUNTIME_INFO_KEY_LANGUAGE == key) { + if (TTSD_MODE_SCREEN_READER == ttsd_get_mode()) { + int ret = -1; + char *value; + + ret = runtime_info_get_value_string(RUNTIME_INFO_KEY_LANGUAGE, &value); + if (0 != ret) { + SLOG(LOG_ERROR, get_tag(), "[Config ERROR] Fail to get system language : %d", ret); + return; + } else { + SLOG(LOG_DEBUG, get_tag(), "[Config] System language changed : %s", value); + if (NULL != g_lang_cb) + g_lang_cb(value, g_vc_type); + + if (NULL != value) + free(value); + } + } + } + + return; +} + +void __sr_speech_rate_changed_cb(keynode_t *key, void *data) +{ + char buf[255]; + sprintf(buf, "%s", vconf_keynode_get_name(key)); + + if (!strcmp(buf, VCONFKEY_SETAPPL_ACCESSIBILITY_SPEECH_RATE)) { + int temp_speech_rate = vconf_keynode_get_int(key); + + temp_speech_rate ++; + if (g_speed != temp_speech_rate) { + SLOG(LOG_DEBUG, get_tag(), "[Config] Speech rate changed : current(%d), previous(%d)", + temp_speech_rate, g_speed); + g_speed = temp_speech_rate; + + if (NULL != g_speed_cb) + g_speed_cb(g_speed); + } + } +} + +int ttsd_config_initialize(ttsd_config_lang_changed_cb lang_cb, ttsd_config_speed_changed_cb speed_cb) +{ + int ret = -1; + char* value = NULL; + FILE* config_fp; + char buf_id[256] = {0}; + char buf_param[256] = {0}; + + g_engine_id = NULL; + g_language = NULL; + g_vc_type = 2; + g_speed = 3; + + g_lang_cb = lang_cb; + g_speed_cb = speed_cb; + + ecore_file_mkpath(CONFIG_DIRECTORY); + + /* Get default engine id */ + config_fp = fopen(CONFIG_DEFAULT, "r"); + if (NULL == config_fp) { + SLOG(LOG_ERROR, get_tag(), "[Config ERROR] Not open original config file(%s)", CONFIG_DEFAULT); + return -1; + } + + /* Read engine id */ + if (EOF == fscanf(config_fp, "%s %s", buf_id, buf_param)) { + fclose(config_fp); + SLOG(LOG_ERROR, get_tag(), "[Config ERROR] Fail to read config (engine id)"); + return -1; + } + + fclose(config_fp); + + /* Get display language */ + ret = runtime_info_get_value_string(RUNTIME_INFO_KEY_LANGUAGE, &value); + if (0 != ret || NULL == value) { + SLOG(LOG_ERROR, get_tag(), "[Config ERROR] Fail to get system language : %d", ret); + return -1; + } else { + SLOG(LOG_DEBUG, get_tag(), "[Config] System language changed : %s", value); + + g_language = strdup(value); + + if (NULL != value) + free(value); + } + + /* Register system language changed callback */ + ret = runtime_info_set_changed_cb(RUNTIME_INFO_KEY_LANGUAGE, __sr_system_language_changed_cb, NULL); + if (0 != ret) { + SLOG(LOG_ERROR, get_tag(), "[Config ERROR] Fail to register callback : %d", ret); + return TTSD_ERROR_OPERATION_FAILED; + } + + /* Get speech rate */ + ret = vconf_get_int(VCONFKEY_SETAPPL_ACCESSIBILITY_SPEECH_RATE, &g_speed); + + /** + * vconf key value scope + * 0 : Very slow + * 1 : Slow + * 2 : Normal + * 3 : Fast + * 4 : Very fast + */ + /* vconf key value is between 0 ~ 4 but tts speech rate value is between 1 ~ 5 */ + g_speed ++; + SLOG(LOG_DEBUG, get_tag(), "[Config] Current speech rate : %d", g_speed); + + /* register callback function */ + vconf_notify_key_changed (VCONFKEY_SETAPPL_ACCESSIBILITY_SPEECH_RATE, __sr_speech_rate_changed_cb, NULL); + + return 0; +} + +int ttsd_config_finalize() +{ + vconf_ignore_key_changed (VCONFKEY_SETAPPL_ACCESSIBILITY_SPEECH_RATE, __sr_speech_rate_changed_cb); + + if (NULL != g_language) { + free(g_language); + } + + if (NULL != g_engine_id) { + free(g_engine_id); + } + + return 0; +} + +int ttsd_config_update_language() +{ + if (TTSD_MODE_SCREEN_READER == ttsd_get_mode()) { + int ret = -1; + char *value; + + ret = runtime_info_get_value_string(RUNTIME_INFO_KEY_LANGUAGE, &value); + if (0 != ret) { + SLOG(LOG_ERROR, get_tag(), "[Config ERROR] Fail to get system language : %d", ret); + return -1; + } else { + if (NULL == value) { + SLOG(LOG_ERROR, get_tag(), "[Config] Fail to get system language"); + return -1; + } else { + SLOG(LOG_DEBUG, get_tag(), "[Config] System language : %s", value); + + if (0 != strcmp(value, g_language)) { + if (NULL != g_lang_cb) + g_lang_cb(value, g_vc_type); + } + + free(value); + } + } + } + + return 0; +} + +int ttsd_config_get_default_engine(char** engine_id) +{ + if (NULL == engine_id) + return -1; + + if (NULL != g_engine_id) { + *engine_id = strdup(g_engine_id); + } else { + SLOG(LOG_ERROR, get_tag(), "[Config ERROR] Current engine id is NULL"); + return -1; + } + return 0; +} + +int ttsd_config_set_default_engine(const char* engine_id) +{ + /* Not available in screen mode */ + return 0; +} + +int ttsd_config_get_default_voice(char** language, int* type) +{ + if (NULL == language || NULL == type) + return -1; + + if (NULL != g_language) { + *language = strdup(g_language); + *type = g_vc_type; + } else { + SLOG(LOG_ERROR, get_tag(), "[Config ERROR] Current language is NULL"); + return -1; + } + return 0; +} + +int ttsd_config_set_default_voice(const char* language, int type) +{ + /* Not available in screen mode */ + return 0; +} + +int ttsd_config_get_default_speed(int* speed) +{ + if (NULL == speed) + return -1; + + *speed = g_speed; + + return 0; +} + +int ttsd_config_set_default_speed(int speed) +{ + /* Not available in screen mode */ + return 0; +} + +int ttsd_config_save_error(int uid, int uttid, const char* lang, int vctype, const char* text, + const char* func, int line, const char* message) +{ + FILE* err_fp; + err_fp = fopen(SR_ERROR_FILE_NAME, "a"); + if (NULL == err_fp) { + SLOG(LOG_WARN, get_tag(), "[WARNING] Fail to open error file (%s)", SR_ERROR_FILE_NAME); + return -1; + } + SLOG(LOG_DEBUG, get_tag(), "Save Error File (%s)", SR_ERROR_FILE_NAME); + + /* func */ + if (NULL != func) { + fprintf(err_fp, "function - %s\n", func); + } + + /* line */ + fprintf(err_fp, "line - %d\n", line); + + /* message */ + if (NULL != message) { + fprintf(err_fp, "message - %s\n", message); + } + + int ret; + /* uid */ + fprintf(err_fp, "uid - %d\n", uid); + + /* uttid */ + fprintf(err_fp, "uttid - %d\n", uttid); + + /* lang */ + if (NULL != lang) { + fprintf(err_fp, "language - %s\n", lang); + } + + /* vctype */ + fprintf(err_fp, "vctype - %d\n", vctype); + + /* text */ + if (NULL != text) { + fprintf(err_fp, "text - %s\n", text); + } + + /* get current engine */ + char *engine_id = NULL; + + ret = ttsd_engine_setting_get_engine(&engine_id); + if (0 != ret) { + SLOG(LOG_ERROR, get_tag(), "[ERROR] Fail to get current engine"); + } else { + fprintf(err_fp, "current engine - %s", engine_id); + } + + /* get data */ + ttsd_data_save_error_log(uid, err_fp); + + fclose(err_fp); + + return 0; +} \ No newline at end of file diff --git a/server/ttsd_server.c b/server/ttsd_server.c old mode 100644 new mode 100755 index 10dc01e..fb28bdb --- a/server/ttsd_server.c +++ b/server/ttsd_server.c @@ -347,6 +347,17 @@ void __config_lang_changed_cb(const char* language, int type) return; } +void __config_speed_changed_cb(int speed) +{ + if (TTSP_SPEED_VERY_SLOW <= speed && speed <= TTSP_SPEED_VERY_FAST) { + /* set default speed */ + int ret = 0; + ret = ttsd_engine_setting_set_default_speed((ttsp_speed_e)speed); + if (0 != ret) { + SLOG(LOG_ERROR, get_tag(), "[Server ERROR] fail to set default speed : result(%d)", ret); + } + } +} /* * Server APIs @@ -354,7 +365,7 @@ void __config_lang_changed_cb(const char* language, int type) int ttsd_initialize() { - if (ttsd_config_initialize(__config_lang_changed_cb)) { + if (ttsd_config_initialize(__config_lang_changed_cb, __config_speed_changed_cb)) { SLOG(LOG_ERROR, get_tag(), "[Server WARNING] Fail to initialize config."); } -- 2.7.4