From f1ea98d1f3aaa3abee1e359677644d73a58442cb Mon Sep 17 00:00:00 2001 From: Suyeon Hwang Date: Mon, 8 Nov 2021 15:26:28 +0900 Subject: [PATCH] Extract function for playting pcm data Change-Id: I595011cac656c1a90936fbf0cf1bdaa7aead0839 Signed-off-by: Suyeon Hwang --- server/ttsd_player.cpp | 145 ++++++++++++++++++++++++------------------------- 1 file changed, 71 insertions(+), 74 deletions(-) diff --git a/server/ttsd_player.cpp b/server/ttsd_player.cpp index 09292c5..1b5d5c6 100644 --- a/server/ttsd_player.cpp +++ b/server/ttsd_player.cpp @@ -313,6 +313,65 @@ bool ttsd_player_does_interrupt_have_playback_focus() return result; } +static int __play_sound_data(player_s* player, sound_data_s* sound_data) +{ + if (TTSD_ERROR_NONE != g_audio_stream->setAudioFormat(sound_data->audio_type, sound_data->rate)) { + SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Fail to create audio out"); + return TTSD_ERROR_OPERATION_FAILED; + } + + // Check whether set_policy is done or not + if (false == g_is_set_policy) { + SLOG(LOG_INFO, tts_tag(), "[Player INFO] Set policy"); + __set_policy_for_playing(); + } + + if (TTSD_ERROR_NONE != g_audio_stream->prepareAudioOut()) { + SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Fail to prepare audio"); + return TTSD_ERROR_OPERATION_FAILED; + } + + unsigned int idx = sound_data->played_data_size; + while (APP_STATE_PLAYING == player->state || APP_STATE_PAUSED == player->state) { + if (idx >= sound_data->data_size) { + break; + } + + unsigned int len = 0; + if (idx + SOUND_BUFFER_LENGTH > sound_data->data_size) { + len = sound_data->data_size - idx; + } else { + len = SOUND_BUFFER_LENGTH; + } + + char* temp_data = sound_data->data; + SLOG(LOG_INFO, tts_tag(), "[Player INFO] Before audio_out_write. data(%p), data[%d](%p), uid(%u), utt_id(%d), len(%u)", + temp_data, idx, &temp_data[idx], player->uid, sound_data->utt_id, len); + +#ifdef BUF_SAVE_MODE + __write_buffer_dump_file(&temp_data[idx], len); +#endif + + if (TTSD_ERROR_NONE != g_audio_stream->playAudioData(&temp_data[idx], len)) { + SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to write audio"); + } else { + idx += len; + sound_data->played_data_size = idx; + SLOG(LOG_INFO, tts_tag(), "[Player INFO] After audio_out_write"); + } + + if (APP_STATE_PAUSED == player->state) { + return TTSD_ERROR_INVALID_STATE; + } + + if (false == __is_player_valid(player)) { + return TTSD_ERROR_OPERATION_FAILED; + } + } + + return TTSD_ERROR_NONE; +} + static void __play_thread_old(void *data, Ecore_Thread *thread) { SLOG(LOG_DEBUG, tts_tag(), "@@@ Start thread"); @@ -326,8 +385,6 @@ static void __play_thread_old(void *data, Ecore_Thread *thread) sound_data_s* sound_data = NULL; int ret = -1; - int len = SOUND_BUFFER_LENGTH; - int idx = 0; /* set volume policy as 40% */ __set_policy_for_playing(); @@ -437,7 +494,6 @@ static void __play_thread_old(void *data, Ecore_Thread *thread) /* Save last event to check utterance start */ player->event = sound_data->event; - idx = 0; if (NULL == sound_data->data || 0 >= sound_data->data_size) { ttse_result_event_e event = sound_data->event; @@ -481,80 +537,21 @@ static void __play_thread_old(void *data, Ecore_Thread *thread) } // (NULL == sound_data->data || 0 >= sound_data->data_size) } // NO player->is_paused_data - // If there is any change in audio format, recreate audio handle - if (TTSD_ERROR_NONE != g_audio_stream->setAudioFormat(sound_data->audio_type, sound_data->rate)) { - SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Fail to create audio out"); - /* unset volume policy, volume will be 100% */ + ret = __play_sound_data(player, sound_data); + if (TTSD_ERROR_INVALID_STATE == ret) { + SLOG(LOG_DEBUG, tts_tag(), "[Player] Player(%p) is paused, uid(%u)", player, player->uid); + ttsd_data_set_paused_data_existing(player->uid, true); + g_audio_stream->unprepareAudioOut(); __unset_policy_for_playing(); return; - } + } else if (TTSD_ERROR_NONE != ret) { + SLOG(LOG_ERROR, tts_tag(), "[Player] Fail to play audio data. player(%p), uid(%u)", player, player->uid); - while (APP_STATE_PLAYING == player->state || APP_STATE_PAUSED == player->state) { - if ((unsigned int)idx >= sound_data->data_size) - break; - - if ((unsigned int)idx + SOUND_BUFFER_LENGTH > sound_data->data_size) { - len = sound_data->data_size - idx; - } else { - len = SOUND_BUFFER_LENGTH; - } - - // Check whether set_policy is done or not - if (false == g_is_set_policy) { - SLOG(LOG_INFO, tts_tag(), "[Player INFO] Set policy"); - __set_policy_for_playing(); - } - - if (AudioStream::AUDIO_STATE_READY == g_audio_stream->getState() || AudioStream::AUDIO_STATE_WAIT_FOR_PLAYING == g_audio_stream->getState()) { - /* Request prepare */ - ret = g_audio_stream->prepareAudioOut(); - if (TTSD_ERROR_NONE != ret) { - SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Fail to prepare audio : %d", ret); - - /* unset volume policy, volume will be 100% */ - __unset_policy_for_playing(); - return; - } - - SLOG(LOG_DEBUG, tts_tag(), "[Player SUCCESS] Prepare audio"); - } - - char* temp_data = sound_data->data; - SLOG(LOG_INFO, tts_tag(), "[Player INFO] Before audio_out_write. data(%p), data[%d](%p), uid(%u), utt_id(%d), len(%d)", - temp_data, idx, &temp_data[idx], player->uid, sound_data->utt_id, len); -#ifdef BUF_SAVE_MODE - __write_buffer_dump_file(&temp_data[idx], len); -#endif - ret = g_audio_stream->playAudioData(&temp_data[idx], len); - if (TTSD_ERROR_NONE != ret) { - SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to audio write - %d", ret); - } else { - idx += len; - sound_data->played_data_size = idx; - SLOG(LOG_INFO, tts_tag(), "[Player INFO] After audio_out_write"); - } - - if (NULL == g_playing_info && APP_STATE_PAUSED != player->state) { - SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Current player is NULL"); - g_audio_stream->unprepareAudioOut(); - /* unset volume policy, volume will be 100% */ - __unset_policy_for_playing(); - return; - } // (NULL == g_playing_info && APP_STATE_PAUSED != player->state) - - if (APP_STATE_PAUSED == player->state) { - /* Save data */ - SLOG(LOG_DEBUG, tts_tag(), "[Player] player(%p)", player); - ttsd_data_set_paused_data_existing(player->uid, true); - - SLOG(LOG_INFO, tts_tag(), "[Player] Stop player thread by pause"); - /* Request prepare */ - g_audio_stream->unprepareAudioOut(); - /* unset volume policy, volume will be 100% */ - __unset_policy_for_playing(); - return; - } // (APP_STATE_PAUSED == player->state) - } // while (APP_STATE_PLAYING == player->state || APP_STATE_PAUSED == player->state) + g_playing_info = NULL; + g_audio_stream->unprepareAudioOut(); + __unset_policy_for_playing(); + return; + } ttse_result_event_e event = sound_data->event; int utt_id = sound_data->utt_id; -- 2.7.4