Extract function for playting pcm data 27/271827/1
authorSuyeon Hwang <stom.hwang@samsung.com>
Mon, 8 Nov 2021 06:26:28 +0000 (15:26 +0900)
committerSuyeon Hwang <stom.hwang@samsung.com>
Wed, 2 Mar 2022 06:26:51 +0000 (15:26 +0900)
Change-Id: I595011cac656c1a90936fbf0cf1bdaa7aead0839
Signed-off-by: Suyeon Hwang <stom.hwang@samsung.com>
server/ttsd_player.cpp

index 09292c5..1b5d5c6 100644 (file)
@@ -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;