Răsfoiți Sursa

Fix interactive audio transitions fade in for clips with auto_advance

(cherry picked from commit 4fa6287de1155def9b562599a34cd177527b9e38)
Gustavo Jaruga Cruz 1 an în urmă
părinte
comite
f5b5b6cbfe
1 a modificat fișierele cu 5 adăugiri și 3 ștergeri
  1. 5 3
      modules/interactive_music/audio_stream_interactive.cpp

+ 5 - 3
modules/interactive_music/audio_stream_interactive.cpp

@@ -777,7 +777,7 @@ void AudioStreamPlaybackInteractive::_queue(int p_to_clip_index, bool p_is_auto_
 
 	if (stream->clips[p_to_clip_index].auto_advance == AudioStreamInteractive::AUTO_ADVANCE_ENABLED) {
 		int next_clip = stream->clips[p_to_clip_index].auto_advance_next_clip;
-		if (next_clip >= 0 && next_clip < (int)stream->clip_count && states[next_clip].playback.is_valid() && next_clip != p_to_clip_index && next_clip != playback_current && (!transition.use_filler_clip || next_clip != transition.filler_clip)) {
+		if (next_clip >= 0 && next_clip < (int)stream->clip_count && states[next_clip].playback.is_valid() && next_clip != p_to_clip_index && (!transition.use_filler_clip || next_clip != transition.filler_clip)) {
 			auto_advance_to = next_clip;
 		}
 	}
@@ -905,7 +905,9 @@ void AudioStreamPlaybackInteractive::_mix_internal_state(int p_state_idx, int p_
 			// time to start!
 			from_frame = state.fade_wait * mix_rate;
 			state.fade_wait = 0;
-			queue_next = state.auto_advance;
+			if (state.fade_speed == 0.0) {
+				queue_next = state.auto_advance;
+			}
 			playback_current = p_state_idx;
 			state.first_mix = false;
 		} else {
@@ -919,7 +921,6 @@ void AudioStreamPlaybackInteractive::_mix_internal_state(int p_state_idx, int p_
 	state.playback->mix(temp_buffer + from_frame, 1.0, p_frames - from_frame);
 
 	double frame_fade_inc = state.fade_speed * frame_inc;
-
 	for (int i = from_frame; i < p_frames; i++) {
 		if (state.fade_wait) {
 			// This is for fade out of existing stream;
@@ -933,6 +934,7 @@ void AudioStreamPlaybackInteractive::_mix_internal_state(int p_state_idx, int p_
 				state.fade_speed = 0.0;
 				frame_fade_inc = 0.0;
 				state.fade_volume = 1.0;
+				queue_next = state.auto_advance;
 			}
 		} else if (frame_fade_inc < 0.0) {
 			state.fade_volume += frame_fade_inc;