From: Suyeon Hwang Date: Tue, 14 Sep 2021 07:17:06 +0000 (+0900) Subject: Prevent audio mixing between each mode X-Git-Tag: submit/tizen/20211012.065801~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F89%2F264189%2F3;p=platform%2Fcore%2Fuifw%2Ftts.git Prevent audio mixing between each mode By the change of audio policy, tts have to do not mix the voice of each engine process. This patch makes all engine process acquire sound focus to send signal to other engine process. By this change, each engine process can pause or stop the player by policy. Change-Id: Ica781a49c90e07802f7f8cdb880ab64b0c6db525 Signed-off-by: Suyeon Hwang --- diff --git a/server/ttsd_player.c b/server/ttsd_player.c index 498b577b..dafa9166 100644 --- a/server/ttsd_player.c +++ b/server/ttsd_player.c @@ -106,8 +106,6 @@ If you choose too big value, it may cause integer overflow issue. static struct timespec g_policy_set_time; static Ecore_Timer* g_delayed_unset_policy_timer = NULL; -static int g_focus_watch_id = -1; - static double g_bg_volume_ratio; static pthread_mutex_t g_play_thread_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -193,112 +191,43 @@ static void __player_focus_state_cb(sound_stream_info_h stream_info, sound_strea return; } - if (TTSD_MODE_DEFAULT == ttsd_get_mode()) { + switch (ttsd_get_mode()) { + case TTSD_MODE_DEFAULT: + SLOG(LOG_DEBUG, tts_tag(), "[Player] Pause current player - mode(%d)", ttsd_get_mode()); g_audio_state = AUDIO_STATE_READY; int uid = g_playing_info->uid; if (0 != ttsd_player_pause(uid)) { SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to pause the player"); - return; + break; } ttsd_data_set_client_state(uid, APP_STATE_PAUSED); int pid = ttsd_data_get_pid(uid); if (pid <= 0) { SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to get pid. uid(%d)", uid); - return; } else { /* send message to client about changing state */ SLOG(LOG_INFO, tts_tag(), "[Player INFO] Player paused. pid(%d), uid(%d)", pid, uid); ttsdc_ipc_send_set_state_message(pid, uid, APP_STATE_PAUSED); } - } else { - SLOG(LOG_DEBUG, tts_tag(), "[Player] Ignore focus state cb - mode(%d)", ttsd_get_mode()); - } - -/* if (AUDIO_STATE_READY == g_audio_state && focus_mask == SOUND_STREAM_FOCUS_FOR_PLAYBACK && SOUND_STREAM_FOCUS_STATE_ACQUIRED == focus_state) { - if (TTSD_MODE_DEFAULT == ttsd_get_mode()) { - g_audio_state = AUDIO_STATE_PLAY; - - if (NULL == g_playing_info) { - SLOG(LOG_WARN, tts_tag(), "[Player WARNING] No current player"); - return; - } - - if (APP_STATE_PAUSED == g_playing_info->state) { - int uid = g_playing_info->uid; - - g_audio_state = AUDIO_STATE_PLAY; - if (0 != ttsd_player_resume(uid)) { - SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to resume the player"); - g_audio_state = AUDIO_STATE_READY; - return; - } - - ttsd_data_set_client_state(uid, APP_STATE_PLAYING); - int pid = ttsd_data_get_pid(uid); - ttsdc_send_set_state_message(pid, uid, APP_STATE_PLAYING); - } - - } else { - SLOG(LOG_DEBUG, tts_tag(), "[Player] Ignore focus state cb - mode(%d)", ttsd_get_mode()); - } - } -*/ - SLOG(LOG_DEBUG, tts_tag(), "@@@"); - - return; -} - -void __player_focus_state_watch_cb(int id, sound_stream_focus_mask_e focus_mask, sound_stream_focus_state_e focus_state, sound_stream_focus_change_reason_e reason, - const char *extra_info, void *user_data) -{ - SLOG(LOG_DEBUG, tts_tag(), "@@@ Focus state watch cb"); - - ttsd_mode_e mode = ttsd_get_mode(); - - if (TTSD_MODE_SCREEN_READER != mode && TTSD_MODE_NOTIFICATION != mode) { - SLOG(LOG_DEBUG, tts_tag(), "[Player DEBUG] This is not screen-reader mode and notification mode."); - return; - } - - if (SOUND_STREAM_FOCUS_CHANGED_BY_VOICE_INFORMATION == reason && NULL != extra_info && strlen(extra_info) > 0 && 0 == strncmp(extra_info, "TTSD_MODE_INTERRUPT", strlen(extra_info))) { - /* If the focus is changed by "Interrupt" mode and current players of "SR" and "Noti" modes are on going, please stop all players. */ - SLOG(LOG_INFO, tts_tag(), "[Player INFO] All stop the playing or the request to play. audio state(%d)", g_audio_state); - -// if (AUDIO_STATE_PLAY == g_audio_state || AUDIO_STATE_WAIT_FOR_PLAYING == g_audio_state) + break; + case TTSD_MODE_NOTIFICATION: + case TTSD_MODE_SCREEN_READER: + SLOG(LOG_DEBUG, tts_tag(), "[Player] Stop current player - mode(%d)", ttsd_get_mode()); g_audio_state = AUDIO_STATE_READY; - ttsd_send_all_stop(); - -/* if (NULL == g_playing_info) { - SLOG(LOG_WARN, tts_tag(), "[Player WARNING] No current player"); - return; - } - - if (APP_STATE_PLAYING == g_playing_info->state) { - int uid = g_playing_info->uid; - - if (0 != ttsd_server_stop(uid)) { - SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to stop TTS server"); - return; - } - if (0 != ttsd_player_stop(uid)) { - SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to stop the player"); - return; - } - - ttsd_data_set_client_state(uid, APP_STATE_READY); - int pid = ttsd_data_get_pid(uid); - // send message to client about changing state - ttsdc_send_set_state_message(pid, uid, APP_STATE_READY); - } else { - SLOG(LOG_DEBUG, tts_tag(), "[Player] Not playing state"); - } -*/ } else { - SLOG(LOG_DEBUG, tts_tag(), "[Player] Extra info is not Interrupt mode(%s) or not playing state(%d).", (NULL == extra_info) ? "NULL" : extra_info, g_audio_state); + break; + case TTSD_MODE_INTERRUPT: + SLOG(LOG_DEBUG, tts_tag(), "[Player] Ignore focus release - mode(%d)", ttsd_get_mode()); + break; + default: + SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Invalid mode - mode(%d)", ttsd_get_mode()); + break; } + SLOG(LOG_DEBUG, tts_tag(), "@@@"); + return; } @@ -453,22 +382,16 @@ static void __set_policy_for_playing(int volume) ecore_main_loop_thread_safe_call_async(__del_timer_for_delayed_recover, NULL); /* Set stream info */ - int ret; - ttsd_mode_e mode = ttsd_get_mode(); - if (TTSD_MODE_DEFAULT == mode) { - ret = sound_manager_acquire_focus(g_stream_info_h, SOUND_STREAM_FOCUS_FOR_PLAYBACK, SOUND_BEHAVIOR_NONE, NULL); - if (SOUND_MANAGER_ERROR_NONE != ret) { - SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to acquire focus"); - } else { - SLOG(LOG_DEBUG, tts_tag(), "[Player DEBUG] Success to acquire focus (default mode)"); - } - } else if (TTSD_MODE_INTERRUPT == mode) { - ret = sound_manager_acquire_focus(g_stream_info_h, SOUND_STREAM_FOCUS_FOR_PLAYBACK, SOUND_BEHAVIOR_NONE, "TTSD_MODE_INTERRUPT"); - if (SOUND_MANAGER_ERROR_NONE != ret) { - SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to acquire focus"); - } else { - SLOG(LOG_DEBUG, tts_tag(), "[Player DEBUG] Success to acquire focus (interrupt mode)"); - } + char* extra_info = NULL; + if (TTSD_MODE_INTERRUPT == ttsd_get_mode()) { + extra_info = "TTSD_MODE_INTERRUPT"; + } + + int ret = sound_manager_acquire_focus(g_stream_info_h, SOUND_STREAM_FOCUS_FOR_PLAYBACK, SOUND_BEHAVIOR_NONE, extra_info); + if (SOUND_MANAGER_ERROR_NONE != ret) { + SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to acquire focus"); + } else { + SLOG(LOG_DEBUG, tts_tag(), "[Player DEBUG] Success to acquire focus"); } ret = audio_out_set_sound_stream_info(g_audio_h, g_stream_info_h); @@ -527,25 +450,18 @@ static void __set_timer_for_delay_recover(void* data) static void __unset_policy_for_playing() { - int ret; - ttsd_mode_e mode = ttsd_get_mode(); /* Unset stream info */ - if (TTSD_MODE_DEFAULT == mode || TTSD_MODE_INTERRUPT == mode) { - sound_stream_focus_state_e state_for_playing = SOUND_STREAM_FOCUS_STATE_ACQUIRED; - ret = sound_manager_get_focus_state(g_stream_info_h, &state_for_playing, NULL); - if (SOUND_MANAGER_ERROR_NONE != ret) { - SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to get focus state: %d", ret); - } - - if (SOUND_STREAM_FOCUS_STATE_ACQUIRED == state_for_playing) { - if (TTSD_MODE_DEFAULT == mode || TTSD_MODE_INTERRUPT == mode) { - ret = sound_manager_release_focus(g_stream_info_h, SOUND_STREAM_FOCUS_FOR_PLAYBACK, SOUND_BEHAVIOR_NONE, NULL); - SLOG(LOG_DEBUG, tts_tag(), "[Player DEBUG] release focus (mode: %d)", mode); - } + sound_stream_focus_state_e state_for_playing = SOUND_STREAM_FOCUS_STATE_ACQUIRED; + int ret = sound_manager_get_focus_state(g_stream_info_h, &state_for_playing, NULL); + if (SOUND_MANAGER_ERROR_NONE != ret) { + SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to get focus state: %d", ret); + } - if (SOUND_MANAGER_ERROR_NONE != ret) { - SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to release focus"); - } + if (SOUND_STREAM_FOCUS_STATE_ACQUIRED == state_for_playing) { + SLOG(LOG_DEBUG, tts_tag(), "[Player DEBUG] release focus (mode: %d)", ttsd_get_mode()); + ret = sound_manager_release_focus(g_stream_info_h, SOUND_STREAM_FOCUS_FOR_PLAYBACK, SOUND_BEHAVIOR_NONE, NULL); + if (SOUND_MANAGER_ERROR_NONE != ret) { + SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to release focus: %d", ret); } } @@ -1086,18 +1002,6 @@ int ttsd_player_init() SLOG(LOG_DEBUG, tts_tag(), "[Player SUCCESS] Create stream info"); } - /* add sound focus state watch callback */ - ret = sound_manager_add_focus_state_watch_cb(SOUND_STREAM_FOCUS_FOR_PLAYBACK, __player_focus_state_watch_cb, NULL, &g_focus_watch_id); - if (SOUND_MANAGER_ERROR_NONE != ret) { - SLOG(LOG_ERROR, tts_tag(), "[Player ERROR] Fail to add sound focus watch callback"); - sound_manager_destroy_stream_information(g_stream_info_h); - g_stream_info_h = NULL; - pthread_mutex_unlock(&g_player_control_mutex); - return -1; - } else { - SLOG(LOG_DEBUG, tts_tag(), "[Player SUCCESS] Add sound focus watch callback"); - } - ret = __create_ducking_handle(); if (SOUND_MANAGER_ERROR_NONE != ret) { SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to create ducking handle, ret(%d)", ret); @@ -1110,9 +1014,7 @@ int ttsd_player_init() ret = __create_audio_out(TTSE_AUDIO_TYPE_RAW_S16, 16000); if (0 != ret) { sound_manager_destroy_stream_information(g_stream_info_h); - sound_manager_remove_focus_state_watch_cb(g_focus_watch_id); g_stream_info_h = NULL; - g_focus_watch_id = -1; pthread_mutex_unlock(&g_player_control_mutex); return -1; @@ -1205,14 +1107,6 @@ int ttsd_player_release(void) SLOG(LOG_DEBUG, tts_tag(), "[Player SUCCESS] Destroy stream info"); } - /* remove focus state watch callback */ - ret = sound_manager_remove_focus_state_watch_cb(g_focus_watch_id); - if (SOUND_MANAGER_ERROR_NONE != ret) { - SLOG(LOG_WARN, tts_tag(), "[Player WARNING] Fail to remove the focus state watch cb"); - } else { - SLOG(LOG_DEBUG, tts_tag(), "[Player SUCCESS] Remove the focus state watch cb"); - } - __destroy_all_ducking_handles(); /* clear g_player_list */ @@ -1220,7 +1114,6 @@ int ttsd_player_release(void) g_player_init = false; g_stream_info_h = NULL; - g_focus_watch_id = -1; pthread_mutex_unlock(&g_player_control_mutex);