X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=client%2Ftts.c;h=08e8d9a3fa238b7852faa77d8e5f5df74e00d51f;hb=68ae641b2958e1df09406cef9374092830f640b6;hp=64c073e4e60687da93143418eea3ab36b8291a21;hpb=a65c39e6b953b0bf10676f0ca4fa4d28c7a1f0cb;p=platform%2Fcore%2Fuifw%2Ftts.git diff --git a/client/tts.c b/client/tts.c index 64c073e..08e8d9a 100644 --- a/client/tts.c +++ b/client/tts.c @@ -37,6 +37,17 @@ static bool g_err_callback_status = false; static int g_max_text_size = -1; +static Ecore_Timer* g_check_state_timer = NULL; + + +/* for repetition */ +static char* g_language = NULL; + +static int g_voice_type = -1; + +static int g_speed = -1; + + /* Function definition */ static Eina_Bool __tts_notify_state_changed(void *data); static Eina_Bool __tts_notify_error(void *data); @@ -109,6 +120,7 @@ static int __tts_convert_config_error_code(tts_config_error_e code) return code; } +//LCOV_EXCL_START void __tts_config_voice_changed_cb(const char* before_lang, int before_voice_type, const char* language, int voice_type, bool auto_voice, void* user_data) { SLOG(LOG_DEBUG, TAG_TTSC, "Voice changed : Before lang(%s) type(%d) , Current lang(%s), type(%d)", @@ -132,6 +144,14 @@ void __tts_config_voice_changed_cb(const char* before_lang, int before_voice_typ language, voice_type, data->default_voice_changed_user_data); } + /* Check whether language is changed or not. If it is changed, make 'text_repeat' NULL */ + if (0 != strncmp(before_lang, language, strlen(before_lang))) { + if (NULL != data->text_repeat) { + free(data->text_repeat); + data->text_repeat = NULL; + } + } + /* Next item */ iter = g_list_next(iter); } @@ -211,6 +231,7 @@ void _tts_config_engine_changed_cb(const char* engine_id, const char* setting, c } return; } +//LCOV_EXCL_STOP int tts_create(tts_h* tts) { @@ -314,6 +335,7 @@ int tts_destroy(tts_h tts) do { ret = tts_dbus_request_finalize(client->uid); if (0 != ret) { + //LCOV_EXCL_START if (TTS_ERROR_TIMED_OUT != ret) { SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] result : %s", __tts_get_error_code(ret)); break; @@ -326,6 +348,7 @@ int tts_destroy(tts_h tts) break; } } + //LCOV_EXCL_STOP } } while (0 != ret); } else { @@ -355,6 +378,17 @@ int tts_destroy(tts_h tts) } } + if (NULL != g_language) { + free(g_language); + g_language = NULL; + } + + /* Delete state timer before destroying handle */ + if (NULL != g_check_state_timer) { + ecore_timer_del(g_check_state_timer); + g_check_state_timer = NULL; + } + tts = NULL; SLOG(LOG_DEBUG, TAG_TTSC, "@@@"); @@ -362,10 +396,12 @@ int tts_destroy(tts_h tts) return TTS_ERROR_NONE; } +//LCOV_EXCL_START void __tts_screen_reader_changed_cb(bool value) { g_screen_reader = value; } +//LCOV_EXCL_STOP int tts_set_mode(tts_h tts, tts_mode_e mode) { @@ -493,6 +529,7 @@ int tts_set_credential(tts_h tts, const char* credential) return TTS_ERROR_NONE; } +//LCOV_EXCL_START int tts_set_server_tts(tts_h tts, const char* credential) { if (0 != __tts_get_feature_enabled()) { @@ -577,6 +614,7 @@ int tts_set_server_tts(tts_h tts, const char* credential) return TTS_ERROR_NONE; } +// LCOV_EXCL_STOP static Eina_Bool __tts_connect_daemon(void *data) { @@ -609,7 +647,10 @@ static Eina_Bool __tts_connect_daemon(void *data) client->utt_id = -1; ecore_timer_add(0, __tts_notify_error, (void*)client->tts); - client->conn_timer = NULL; + if (client->conn_timer) { + ecore_timer_del(client->conn_timer); + client->conn_timer = NULL; + } return EINA_FALSE; } else if (TTS_ERROR_PERMISSION_DENIED == ret) { @@ -619,7 +660,10 @@ static Eina_Bool __tts_connect_daemon(void *data) client->utt_id = -1; ecore_timer_add(0, __tts_notify_error, (void*)client->tts); - client->conn_timer = NULL; + if (client->conn_timer) { + ecore_timer_del(client->conn_timer); + client->conn_timer = NULL; + } return EINA_FALSE; } else if (TTS_ERROR_NONE != ret) { @@ -632,7 +676,10 @@ static Eina_Bool __tts_connect_daemon(void *data) SLOG(LOG_ERROR, TAG_TTSC, "Supported options : credential(%s)", credential_needed ? "need" : "no need"); } - client->conn_timer = NULL; + if (client->conn_timer) { + ecore_timer_del(client->conn_timer); + client->conn_timer = NULL; + } client = tts_client_get(tts); /* check handle */ @@ -681,13 +728,20 @@ int tts_prepare(tts_h tts) return TTS_ERROR_INVALID_STATE; } + ecore_thread_main_loop_begin(); + if (client->conn_timer) { + ecore_timer_del(client->conn_timer); + client->conn_timer = NULL; + } client->conn_timer = ecore_timer_add(0.02, __tts_connect_daemon, (void*)tts); + ecore_thread_main_loop_end(); SLOG(LOG_DEBUG, TAG_TTSC, "@@@"); return TTS_ERROR_NONE; } +//LCOV_EXCL_START int tts_prepare_sync(tts_h tts) { if (0 != __tts_get_feature_enabled()) { @@ -726,6 +780,7 @@ int tts_prepare_sync(tts_h tts) return TTS_ERROR_NONE; } +//LCOV_EXCL_STOP int tts_unprepare(tts_h tts) { @@ -766,6 +821,7 @@ int tts_unprepare(tts_h tts) do { ret = tts_dbus_request_finalize(client->uid); if (0 != ret) { + //LCOV_EXCL_START if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) { client->current_state = TTS_STATE_CREATED; if (0 == tts_prepare_sync(tts)) { @@ -784,6 +840,7 @@ int tts_unprepare(tts_h tts) break; } } + //LCOV_EXCL_STOP } } while (0 != ret); } else { @@ -1135,6 +1192,28 @@ int tts_add_text(tts_h tts, const char* text, const char* language, int voice_ty } SLOG(LOG_DEBUG, TAG_TTSC, "Text is valid - text is '%s'", text); + /* save texts for repetition */ + if (NULL != client->text_repeat) { + free(client->text_repeat); + client->text_repeat = NULL; + } + + client->text_repeat = strdup(text); + + if (NULL != g_language) { + free(g_language); + g_language = NULL; + } + if (NULL == language) + g_language = NULL; + else + g_language = strdup(language); + + g_voice_type = voice_type; + g_speed = speed; + + SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] repeat: text(%s), language(%s), voice type(%d), speed(%d)", client->text_repeat, g_language, g_voice_type, g_speed); + /* change default language value */ char* temp = NULL; @@ -1155,6 +1234,7 @@ int tts_add_text(tts_h tts, const char* text, const char* language, int voice_ty while (0 != ret) { ret = tts_dbus_request_add_text(client->uid, text, temp, voice_type, speed, client->current_utt_id, client->credential); if (0 != ret) { + //LCOV_EXCL_START if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) { client->current_state = TTS_STATE_CREATED; if (0 == tts_prepare_sync(tts)) { @@ -1173,6 +1253,7 @@ int tts_add_text(tts_h tts, const char* text, const char* language, int voice_ty break; } } + //LCOV_EXCL_STOP } else { *utt_id = client->current_utt_id; } @@ -1188,6 +1269,7 @@ int tts_add_text(tts_h tts, const char* text, const char* language, int voice_ty return ret; } +//LCOV_EXCL_START static void __tts_play_async(void *data) { tts_h tts = (tts_h)data; @@ -1294,7 +1376,7 @@ int tts_play_async(tts_h tts) return TTS_ERROR_NONE; } - +//LCOV_EXCL_STOP int tts_play(tts_h tts) { if (0 != __tts_get_feature_enabled()) { @@ -1339,6 +1421,7 @@ int tts_play(tts_h tts) while (0 != ret) { ret = tts_dbus_request_play(client->uid, client->credential); if (0 != ret) { + //LCOV_EXCL_START if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) { client->current_state = TTS_STATE_CREATED; if (0 == tts_prepare_sync(tts)) { @@ -1357,6 +1440,7 @@ int tts_play(tts_h tts) return ret; } } + //LCOV_EXCL_STOP } } @@ -1374,7 +1458,7 @@ int tts_play(tts_h tts) return TTS_ERROR_NONE; } - +//LCOV_EXCL_START static void __tts_stop_async(void *data) { tts_h tts = (tts_h)data; @@ -1476,7 +1560,7 @@ int tts_stop_aync(tts_h tts) return TTS_ERROR_NONE; } - +//LCOV_EXCL_STOP int tts_stop(tts_h tts) { if (0 != __tts_get_feature_enabled()) { @@ -1515,6 +1599,7 @@ int tts_stop(tts_h tts) while (0 != ret) { ret = tts_dbus_request_stop(client->uid); if (0 != ret) { + //LCOV_EXCL_START if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) { client->current_state = TTS_STATE_CREATED; if (0 == tts_prepare_sync(tts)) { @@ -1533,6 +1618,7 @@ int tts_stop(tts_h tts) return ret; } } + //LCOV_EXCL_STOP } } @@ -1550,7 +1636,7 @@ int tts_stop(tts_h tts) return TTS_ERROR_NONE; } - +//LCOV_EXCL_START static void __tts_pause_async(void *data) { tts_h tts = (tts_h)data; @@ -1653,7 +1739,7 @@ int tts_pause_async(tts_h tts) return TTS_ERROR_NONE; } - +//LCOV_EXCL_STOP int tts_pause(tts_h tts) { if (0 != __tts_get_feature_enabled()) { @@ -1693,6 +1779,7 @@ int tts_pause(tts_h tts) while (0 != ret) { ret = tts_dbus_request_pause(client->uid); if (0 != ret) { + //LCOV_EXCL_START if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) { client->current_state = TTS_STATE_CREATED; if (0 == tts_prepare_sync(tts)) { @@ -1711,6 +1798,7 @@ int tts_pause(tts_h tts) return ret; } } + //LCOV_EXCL_STOP } } @@ -1738,7 +1826,7 @@ int tts_set_private_data(tts_h tts, const char* key, const char* data) SLOG(LOG_INFO, TAG_TTSC, "@@@ Set private data, key(%s), data(%s)", key, data); if (NULL == tts) { - SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle isnull"); + SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null"); return TTS_ERROR_INVALID_PARAMETER; } @@ -1770,6 +1858,7 @@ int tts_set_private_data(tts_h tts, const char* key, const char* data) while (0 != ret) { ret = tts_dbus_request_set_private_data(client->uid, key, data); if (0 != ret) { + //LCOV_EXCL_START if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) { client->current_state = TTS_STATE_CREATED; if (0 == tts_prepare_sync(tts)) { @@ -1788,6 +1877,7 @@ int tts_set_private_data(tts_h tts, const char* key, const char* data) return ret; } } + //LCOV_EXCL_STOP } } @@ -1832,6 +1922,7 @@ int tts_get_private_data(tts_h tts, const char* key, char** data) while (0 != ret) { ret = tts_dbus_request_get_private_data(client->uid, key, data); if (0 != ret) { + //LCOV_EXCL_START if (TTS_ERROR_INVALID_PARAMETER == ret && false == is_prepared) { client->current_state = TTS_STATE_CREATED; if (0 == tts_prepare_sync(tts)) { @@ -1850,6 +1941,7 @@ int tts_get_private_data(tts_h tts, const char* key, char** data) return ret; } } + //LCOV_EXCL_STOP } } @@ -1863,6 +1955,7 @@ int tts_get_private_data(tts_h tts, const char* key, char** data) return 0; } +//LCOV_EXCL_START static Eina_Bool __tts_notify_error(void *data) { tts_h tts = (tts_h)data; @@ -2013,7 +2106,11 @@ int __tts_cb_set_state(int uid, int state) } if (NULL != client->state_changed_cb) { - ecore_timer_add(0, __tts_notify_state_changed, client->tts); + if (NULL != g_check_state_timer) { + ecore_timer_del(g_check_state_timer); + g_check_state_timer = NULL; + } + g_check_state_timer = ecore_timer_add(0, __tts_notify_state_changed, client->tts); } else { SLOG(LOG_WARN, TAG_TTSC, "[WARNING] State changed callback is null"); } @@ -2023,6 +2120,7 @@ int __tts_cb_set_state(int uid, int state) return 0; } +//LCOV_EXCL_STOP int __tts_cb_utt_started(int uid, int utt_id) { @@ -2133,6 +2231,11 @@ int tts_unset_state_changed_cb(tts_h tts) client->state_changed_cb = NULL; client->state_changed_user_data = NULL; + if (NULL != g_check_state_timer) { + ecore_timer_del(g_check_state_timer); + g_check_state_timer = NULL; + } + SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset state changed cb"); return 0; @@ -2447,6 +2550,7 @@ int tts_unset_engine_changed_cb(tts_h tts) return 0; } +//LCOV_EXCL_START int tts_add_pcm(tts_h tts, int event, const void* data, unsigned int data_size, int audio_type, int rate) { if (0 != __tts_get_feature_enabled()) { @@ -2658,3 +2762,97 @@ int tts_stop_pcm(tts_h tts) return TTS_ERROR_NONE; } +//LCOV_EXCL_STOP + +int tts_repeat(tts_h tts, char** text_repeat, int* utt_id) +{ + if (0 != __tts_get_feature_enabled()) { + return TTS_ERROR_NOT_SUPPORTED; + } + + SLOG(LOG_INFO, TAG_TTSC, "@@@ Repeat TTS"); + + if (NULL == tts) { + SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input handle is null."); + SLOG(LOG_DEBUG, TAG_TTSC, "@@@"); + return TTS_ERROR_INVALID_PARAMETER; + } + + if (NULL == text_repeat || NULL == utt_id) { + SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Input parameter is null."); + SLOG(LOG_DEBUG, TAG_TTSC, "@@@"); + return TTS_ERROR_INVALID_PARAMETER; + } + + *text_repeat = NULL; + *utt_id = -1; + + tts_client_s* client = tts_client_get(tts); + + if (NULL == client) { + SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] A handle is not valid."); + SLOG(LOG_DEBUG, TAG_TTSC, "@@@"); + return TTS_ERROR_INVALID_PARAMETER; + } + + if (TTS_STATE_READY != client->current_state) { + SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] The current state is invalid. (%d)", client->current_state); + return TTS_ERROR_INVALID_STATE; + } + + /* Clear the legacy and Add texts to be played repeatedly */ + int ret = -1; + ret = tts_stop(tts); + if (TTS_ERROR_NONE != ret) { + SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to clear the legacy"); + return ret; + } + + if (NULL != client->text_repeat) { + char* tmp_text = strdup(client->text_repeat); + char* tmp_lang = NULL; + if (NULL != g_language) { + tmp_lang = strdup(g_language); + } + ret = tts_add_text(tts, tmp_text, tmp_lang, g_voice_type, g_speed, utt_id); + if (TTS_ERROR_NONE != ret) { + SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to add texts for repetition."); + if (NULL != tmp_text) { + free(tmp_text); + tmp_text = NULL; + } + if (NULL != tmp_lang) { + free(tmp_lang); + tmp_lang = NULL; + } + return ret; + } + *text_repeat = strdup(client->text_repeat); + SLOG(LOG_DEBUG, TAG_TTSC, "[DEBUG] text to repeat(%s), utt_id(%d)", *text_repeat, *utt_id); + if (NULL != tmp_text) { + free(tmp_text); + tmp_text = NULL; + } + if (NULL != tmp_lang) { + free(tmp_lang); + tmp_lang = NULL; + } + } else { + SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] There is no previous added texts. Please add texts"); + return TTS_ERROR_OPERATION_FAILED; + } + + /* Play added texts */ + ret = tts_play(tts); + if (TTS_ERROR_NONE != ret) { + SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] Fail to play texts for repetition."); + if (NULL != *text_repeat) { + free(*text_repeat); + *text_repeat = NULL; + } + *utt_id = -1; + return ret; + } + + return TTS_ERROR_NONE; +}