X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=server%2Fttsd_data.cpp;h=6c9e7f1113e6991b39c5184d5b184a4fed544084;hb=0814570099666fd344cad05a63f8c6a425648ef1;hp=932ea3538a9202a664975fc14d596f4df92af90e;hpb=279cb0929c5c3292c3b0f43d3b1102d9383082cc;p=platform%2Fcore%2Fuifw%2Ftts.git diff --git a/server/ttsd_data.cpp b/server/ttsd_data.cpp index 932ea35..6c9e7f1 100644 --- a/server/ttsd_data.cpp +++ b/server/ttsd_data.cpp @@ -20,18 +20,18 @@ using namespace std; -typedef struct +typedef struct { char* lang; int vctype; }used_voice_s; -typedef struct +typedef struct { int pid; int uid; int utt_id_stopped; - app_state_e state; + app_tts_state_e state; std::list m_speak_data; std::list m_wav_data; @@ -41,6 +41,7 @@ typedef struct static vector g_app_list; +static pthread_mutex_t g_speak_data_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t g_sound_data_mutex = PTHREAD_MUTEX_INITIALIZER; /* @@ -68,13 +69,15 @@ int __data_show_list() int __data_show_sound_list(int index) { SLOG(LOG_DEBUG, tts_tag(), "----- Sound list -----"); - + unsigned int i = 0; - std::list::iterator iter; - for (iter = g_app_list[index].m_wav_data.begin(); iter != g_app_list[index].m_wav_data.end(); iter++) { - SLOG(LOG_DEBUG, tts_tag(), "[%dth][%p] data(%p) data size(%ld), uttid(%d), type(%d)", - i, *iter, (*iter)->data, (*iter)->data_size, (*iter)->utt_id, (*iter)->audio_type); - i++; + if (!g_app_list[index].m_wav_data.empty()) { + std::list::iterator iter; + for (iter = g_app_list[index].m_wav_data.begin(); (NULL != *iter && iter != g_app_list[index].m_wav_data.end()); ++iter) { + SLOG(LOG_DEBUG, tts_tag(), "[%dth][%p] data(%p) data size(%d), uttid(%d), type(%d)", + i, *iter, (*iter)->data, (*iter)->data_size, (*iter)->utt_id, (*iter)->audio_type); + i++; + } } if (i == 0) { @@ -90,11 +93,13 @@ int __data_show_text_list(int index) SLOG(LOG_DEBUG, tts_tag(), "----- Text list -----"); unsigned int i = 0; - std::list::iterator iter; - for (iter = g_app_list[index].m_speak_data.begin(); iter != g_app_list[index].m_speak_data.end(); iter++) { - SLOG(LOG_DEBUG, tts_tag(), "[%dth][%p] lang(%s), vctype(%d), speed(%d), uttid(%d), text(%s)", - i + 1, *iter, (*iter)->lang, (*iter)->vctype, (*iter)->speed, (*iter)->utt_id, (*iter)->text); - i++; + if (!g_app_list[index].m_speak_data.empty()) { + std::list::iterator iter; + for (iter = g_app_list[index].m_speak_data.begin(); (NULL != *iter && iter != g_app_list[index].m_speak_data.end()); ++iter) { + SLOG(LOG_DEBUG, tts_tag(), "[%dth][%p] lang(%s), vctype(%d), speed(%d), uttid(%d), text(%s)", + i + 1, *iter, (*iter)->lang, (*iter)->vctype, (*iter)->speed, (*iter)->utt_id, (*iter)->text); + i++; + } } if (0 == i) { @@ -110,10 +115,12 @@ int __data_show_used_voice_list(int index) SLOG(LOG_DEBUG, tts_tag(), "----- Used voice list -----"); unsigned int i = 0; - std::list::iterator iter; - for (iter = g_app_list[index].m_used_voice.begin(); iter != g_app_list[index].m_used_voice.end(); iter++) { - SLOG(LOG_DEBUG, tts_tag(), "[%dth] lang(%s), vctype(%d)", i + 1, iter->lang, iter->vctype); - i++; + if (!g_app_list[index].m_used_voice.empty()) { + std::list::iterator iter; + for (iter = g_app_list[index].m_used_voice.begin(); iter != g_app_list[index].m_used_voice.end(); ++iter) { + SLOG(LOG_DEBUG, tts_tag(), "[%dth] lang(%s), vctype(%d)", i + 1, iter->lang, iter->vctype); + i++; + } } if (0 == i) { @@ -145,7 +152,7 @@ int ttsd_data_new_client(int pid, int uid) #ifdef DATA_DEBUG __data_show_list(); -#endif +#endif return TTSD_ERROR_NONE; } @@ -154,7 +161,7 @@ int ttsd_data_delete_client(int uid) int index = 0; index = ttsd_data_is_client(uid); - + if (index < 0) { SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%d)", uid); return -1; @@ -169,7 +176,7 @@ int ttsd_data_delete_client(int uid) #ifdef DATA_DEBUG __data_show_list(); -#endif +#endif return TTSD_ERROR_NONE; } @@ -179,7 +186,7 @@ int ttsd_data_is_client(int uid) for (int i = 0; i < vsize; i++) { if(g_app_list[i].uid == uid) { - return i; + return i; } } @@ -196,7 +203,7 @@ int ttsd_data_get_pid(int uid) int index; index = ttsd_data_is_client(uid); - + if (index < 0) { SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%d)", uid); return TTSD_ERROR_INVALID_PARAMETER; @@ -209,13 +216,19 @@ int ttsd_data_get_speak_data_size(int uid) { int index = 0; index = ttsd_data_is_client(uid); - + if (index < 0) { SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%d)", uid); return TTSD_ERROR_INVALID_PARAMETER; } + /* mutex is locked */ + pthread_mutex_lock(&g_speak_data_mutex); int size = g_app_list[index].m_speak_data.size(); + + /* mutex is unlocked */ + pthread_mutex_unlock(&g_speak_data_mutex); + return size; } @@ -231,11 +244,12 @@ int ttsd_data_set_used_voice(int uid, const char* lang, int type) /* Find voice */ std::list::iterator iter; - - for (iter = g_app_list[index].m_used_voice.begin();iter != g_app_list[index].m_used_voice.end();iter++) { - if (0 == strcmp(lang, iter->lang) && type == iter->vctype) { - SLOG(LOG_DEBUG, tts_tag(), "[DATA] The voice is already registered (%s)(%d)", lang, type); - return 0; + if (!g_app_list[index].m_used_voice.empty()) { + for (iter = g_app_list[index].m_used_voice.begin(); iter != g_app_list[index].m_used_voice.end();++iter) { + if (0 == strcmp(lang, iter->lang) && type == iter->vctype) { + SLOG(LOG_DEBUG, tts_tag(), "[DATA] The voice is already registered (%s)(%d)", lang, type); + return 0; + } } } @@ -244,7 +258,13 @@ int ttsd_data_set_used_voice(int uid, const char* lang, int type) used_voice.lang = strdup(lang); used_voice.vctype = type; - g_app_list[index].m_used_voice.insert(g_app_list[index].m_used_voice.end(), used_voice); + try { + iter = g_app_list[index].m_used_voice.insert(g_app_list[index].m_used_voice.end(), used_voice); + } catch (const std::bad_alloc&) { + SLOG(LOG_ERROR, tts_tag(), "[DATA][ERROR] Fail to insert m_used_voice (bad_alloc)"); + return -1; + } + SLOG(LOG_ERROR, tts_tag(), "[DATA] lang(%s), vctype(%d)", iter->lang, iter->vctype); #ifdef DATA_DEBUG __data_show_used_voice_list(index); @@ -268,19 +288,22 @@ int ttsd_data_reset_used_voice(int uid, ttsd_used_voice_cb callback) } /* Find voice */ - std::list::iterator iter; + if (!g_app_list[index].m_used_voice.empty()) { + std::list::iterator iter; - for (iter = g_app_list[index].m_used_voice.begin(); iter != g_app_list[index].m_used_voice.end(); iter++) { - if (NULL != callback) { - callback(iter->lang, iter->vctype); - } + for (iter = g_app_list[index].m_used_voice.begin(); iter != g_app_list[index].m_used_voice.end(); ++iter) { + if (NULL != callback) { + callback(iter->lang, iter->vctype); + } - if (NULL != iter->lang) { - free(iter->lang); + if (NULL != iter->lang) { + free(iter->lang); + iter->lang = NULL; + } } - } - g_app_list[index].m_used_voice.clear(); + g_app_list[index].m_used_voice.clear(); + } #ifdef DATA_DEBUG __data_show_used_voice_list(index); @@ -298,15 +321,31 @@ int ttsd_data_add_speak_data(int uid, speak_data_s* data) SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%d)", uid); return TTSD_ERROR_INVALID_PARAMETER; } - - g_app_list[index].m_speak_data.insert(g_app_list[index].m_speak_data.end(), data); + + /* mutex is locked */ + pthread_mutex_lock(&g_speak_data_mutex); + + std::list::iterator iter; + + try { + iter = g_app_list[index].m_speak_data.insert(g_app_list[index].m_speak_data.end(), data); + } catch (const std::bad_alloc&) { + SLOG(LOG_ERROR, tts_tag(), "[DATA][ERROR] Fail to insert m_speak_data (bad_alloc)"); + pthread_mutex_unlock(&g_speak_data_mutex); + + return TTSD_ERROR_OUT_OF_MEMORY; + } + SLOG(LOG_ERROR, tts_tag(), "[DATA][%p] utt_id(%d), text(%s), lang(%s), vctype(%d), speed(%d)", + *iter, (*iter)->utt_id, (*iter)->text, (*iter)->lang, (*iter)->vctype, (*iter)->speed); if (1 == data->utt_id) g_app_list[index].utt_id_stopped = 0; #ifdef DATA_DEBUG __data_show_text_list(index); -#endif +#endif + pthread_mutex_unlock(&g_speak_data_mutex); + return TTSD_ERROR_NONE; } @@ -320,20 +359,28 @@ int ttsd_data_get_speak_data(int uid, speak_data_s** data) return TTSD_ERROR_INVALID_PARAMETER; } + /* mutex is locked */ + pthread_mutex_lock(&g_speak_data_mutex); + if (0 == g_app_list[index].m_speak_data.size()) { #ifdef DATA_DEBUG - SLOG(LOG_WARN, tts_tag(), "[DATA WARNING] There is no speak data"); -#endif + SLOG(LOG_WARN, tts_tag(), "[DATA WARNING] There is no speak data"); +#endif + pthread_mutex_unlock(&g_speak_data_mutex); return -1; } - std::list::iterator iter = g_app_list[index].m_speak_data.begin(); - *data = *iter; - g_app_list[index].m_speak_data.pop_front(); + if (!g_app_list[index].m_speak_data.empty()) { + std::list::iterator iter = g_app_list[index].m_speak_data.begin(); + *data = *iter; + g_app_list[index].m_speak_data.pop_front(); + } #ifdef DATA_DEBUG __data_show_text_list(index); -#endif +#endif + pthread_mutex_unlock(&g_speak_data_mutex); + return TTSD_ERROR_NONE; } @@ -354,11 +401,21 @@ int ttsd_data_add_sound_data(int uid, sound_data_s* data) /* mutex is locked */ pthread_mutex_lock(&g_sound_data_mutex); - g_app_list[index].m_wav_data.insert(g_app_list[index].m_wav_data.end(), data); + std::list::iterator iter; + + try { + iter = g_app_list[index].m_wav_data.insert(g_app_list[index].m_wav_data.end(), data); + } catch (const std::bad_alloc&) { + SLOG(LOG_ERROR, tts_tag(), "[DATA][ERROR] Fail to insert m_sound_data (bad_alloc)"); + pthread_mutex_unlock(&g_sound_data_mutex); + + return TTSD_ERROR_OUT_OF_MEMORY; + } + SLOG(LOG_ERROR, tts_tag(), "[DATA][%p] utt_id(%d), data(%p) data size(%d), type(%d)", *iter, (*iter)->utt_id, (*iter)->data, (*iter)->data_size, (*iter)->audio_type); #ifdef DATA_DEBUG __data_show_sound_list(index); -#endif +#endif /* mutex is unlocked */ pthread_mutex_unlock(&g_sound_data_mutex); @@ -388,13 +445,15 @@ int ttsd_data_get_sound_data(int uid, sound_data_s** data) return -1; } - std::list::iterator iter = g_app_list[index].m_wav_data.begin(); - *data = *iter; - g_app_list[index].m_wav_data.pop_front(); + if (!g_app_list[index].m_wav_data.empty()) { + std::list::iterator iter = g_app_list[index].m_wav_data.begin(); + *data = *iter; + g_app_list[index].m_wav_data.pop_front(); + } #ifdef DATA_DEBUG __data_show_sound_list(index); -#endif +#endif /* mutex is unlocked */ pthread_mutex_unlock(&g_sound_data_mutex); @@ -443,6 +502,7 @@ int ttsd_data_clear_data(int uid) break; } + pthread_mutex_lock(&g_speak_data_mutex); if (NULL != temp_speak) { SLOG(LOG_DEBUG, tts_tag(), "[DEBUG] utt(%d), text(%s), lang(%s), vctype(%d) speed(%d)", temp_speak->utt_id, temp_speak->text, temp_speak->lang, temp_speak->vctype, temp_speak->speed); @@ -460,17 +520,23 @@ int ttsd_data_clear_data(int uid) free(temp_speak); temp_speak = NULL; } + pthread_mutex_unlock(&g_speak_data_mutex); } if (-1 != removed_last_uttid) { g_app_list[index].utt_id_stopped = removed_last_uttid; } + pthread_mutex_lock(&g_speak_data_mutex); + g_app_list[index].m_speak_data.clear(); + pthread_mutex_unlock(&g_speak_data_mutex); + while(1) { if (0 != ttsd_data_get_sound_data(uid, &temp_sound)) { break; } + pthread_mutex_lock(&g_sound_data_mutex); if (NULL != temp_sound) { SLOG(LOG_ERROR, tts_tag(), "[DEBUG][%p] uid(%d), event(%d) data(%p) size(%d) rate(%d) utt(%d)", temp_sound, uid, temp_sound->event, temp_sound->data, temp_sound->data_size, temp_sound->rate, temp_sound->utt_id); @@ -483,15 +549,17 @@ int ttsd_data_clear_data(int uid) free(temp_sound); temp_sound = NULL; } + pthread_mutex_unlock(&g_sound_data_mutex); } - g_app_list[index].m_speak_data.clear(); + pthread_mutex_lock(&g_sound_data_mutex); g_app_list[index].m_wav_data.clear(); + pthread_mutex_unlock(&g_sound_data_mutex); return TTSD_ERROR_NONE; } -int ttsd_data_get_client_state(int uid, app_state_e* state) +int ttsd_data_get_client_state(int uid, app_tts_state_e* state) { int index = 0; @@ -506,7 +574,7 @@ int ttsd_data_get_client_state(int uid, app_state_e* state) return TTSD_ERROR_NONE; } -int ttsd_data_set_client_state(int uid, app_state_e state) +int ttsd_data_set_client_state(int uid, app_tts_state_e state) { int index = 0; @@ -555,8 +623,8 @@ int ttsd_data_foreach_clients(ttsd_data_get_client_cb callback, void* user_data) #ifdef DATA_DEBUG __data_show_list(); -#endif - +#endif + /* Copy app info */ vector temp_app_list; int vsize = g_app_list.size(); @@ -582,7 +650,7 @@ int ttsd_data_foreach_clients(ttsd_data_get_client_cb callback, void* user_data) for (i = 0;i < vsize;i++) { temp_app_list.erase(temp_app_list.begin()); } - + return 0; } @@ -593,7 +661,7 @@ bool ttsd_data_is_uttid_valid(int uid, int uttid) index = ttsd_data_is_client(uid); if (index < 0) { SECURE_SLOG(LOG_ERROR, tts_tag(), "[DATA ERROR] uid is not valid (%d)", uid); - return TTSD_ERROR_INVALID_PARAMETER; + return false; } if (uttid < g_app_list[index].utt_id_stopped) @@ -608,7 +676,7 @@ int ttsd_data_is_current_playing() for (int i = 0; i < vsize; i++) { if(g_app_list[i].state == APP_STATE_PLAYING) { - return g_app_list[i].uid; + return g_app_list[i].uid; } } @@ -622,7 +690,7 @@ int ttsd_data_get_same_pid_client_count(int pid) for (int i = 0;i < vsize;i++) { if(g_app_list[i].pid == pid) { - number++; + number++; } } @@ -641,7 +709,7 @@ int ttsd_data_save_error_log(int uid, FILE* fp) fprintf(fp, "pid - %d", pid); } /* app state */ - app_state_e state; + app_tts_state_e state; ret = ttsd_data_get_client_state(uid, &state); if (0 != ret) { SLOG(LOG_ERROR, tts_tag(), "[ERROR] Fail to get app state"); @@ -662,26 +730,30 @@ int ttsd_data_save_error_log(int uid, FILE* fp) fprintf(fp, "----- Sound list -----"); i = 0; - std::list::iterator iter; - for (iter = g_app_list[index].m_wav_data.begin(); iter != g_app_list[index].m_wav_data.end(); iter++) { - SLOG(LOG_DEBUG, tts_tag(), "[%dth][%p] data(%p) data size(%ld), uttid(%d), type(%d)", - i, *iter, (*iter)->data, (*iter)->data_size, (*iter)->utt_id, (*iter)->audio_type); - i++; + if (!g_app_list[index].m_wav_data.empty()) { + std::list::iterator iter; + for (iter = g_app_list[index].m_wav_data.begin(); (NULL != *iter && iter != g_app_list[index].m_wav_data.end()); ++iter) { + SLOG(LOG_DEBUG, tts_tag(), "[%dth][%p] data(%p) data size(%d), uttid(%d), type(%d)", + i, *iter, (*iter)->data, (*iter)->data_size, (*iter)->utt_id, (*iter)->audio_type); + i++; + } } fprintf(fp, "----------------------"); - + /* get speck data */ fprintf(fp, "----- Text list -----"); i = 0; - std::list::iterator iter_speak; - for (iter_speak = g_app_list[index].m_speak_data.begin(); iter_speak != g_app_list[index].m_speak_data.end(); iter_speak++) { - SLOG(LOG_DEBUG, tts_tag(), "[%dth][%p] lang(%s), vctype(%d), speed(%d), uttid(%d), text(%s)", - i, *iter_speak, (*iter_speak)->lang, (*iter_speak)->vctype, (*iter_speak)->speed, (*iter_speak)->utt_id, (*iter_speak)->text); - i++; + if (!g_app_list[index].m_speak_data.empty()) { + std::list::iterator iter_speak; + for (iter_speak = g_app_list[index].m_speak_data.begin(); (NULL != *iter_speak && iter_speak != g_app_list[index].m_speak_data.end()); ++iter_speak) { + SLOG(LOG_DEBUG, tts_tag(), "[%dth][%p] lang(%s), vctype(%d), speed(%d), uttid(%d), text(%s)", + i, *iter_speak, (*iter_speak)->lang, (*iter_speak)->vctype, (*iter_speak)->speed, (*iter_speak)->utt_id, (*iter_speak)->text); + i++; + } } fprintf(fp, "---------------------"); - + return 0; }