diff options
author | Silc Renew <tokage.it.lab@gmail.com> | 2023-02-05 03:50:55 +0900 |
---|---|---|
committer | Silc Renew <tokage.it.lab@gmail.com> | 2023-02-05 03:57:52 +0900 |
commit | b9b81304327bb6c47545c7036cf95baa01a39a09 (patch) | |
tree | e4547783c6f2aa9490c41a3780a4a2d8a31d5b7d /scene/animation | |
parent | 0b1d516f67a3b2b7dd158b923559f192ec103a85 (diff) |
Fixed animation audio to play considering time when seeking
Diffstat (limited to 'scene/animation')
-rw-r--r-- | scene/animation/animation_player.cpp | 15 | ||||
-rw-r--r-- | scene/animation/animation_tree.cpp | 4 |
2 files changed, 12 insertions, 7 deletions
diff --git a/scene/animation/animation_player.cpp b/scene/animation/animation_player.cpp index 2e25d685d6..8087ac6250 100644 --- a/scene/animation/animation_player.cpp +++ b/scene/animation/animation_player.cpp @@ -857,7 +857,7 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, double HashMap<int, TrackNodeCache::PlayingAudioStreamInfo> &map = aa->playing_streams; // Find stream. int idx = -1; - if (p_seeked) { + if (p_seeked || p_started) { idx = a->track_find_key(i, p_time); // Discard previous stream when seeking. if (map.has(idx)) { @@ -866,12 +866,7 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, double } } else { List<int> to_play; - if (p_started) { - int first_key = a->track_find_key(i, p_prev_time, Animation::FIND_MODE_EXACT); - if (first_key >= 0) { - to_play.push_back(first_key); - } - } + a->track_get_key_indices_in_range(i, p_time, p_delta, &to_play, p_looped_flag); if (to_play.size()) { idx = to_play.back()->get(); @@ -888,6 +883,10 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, double double end_ofs = a->audio_track_get_key_end_offset(i, idx); double len = stream->get_length(); + if (p_seeked || p_started) { + start_ofs += p_time - a->track_get_key_time(i, idx); + } + if (aa->object->call(SNAME("get_stream")) != aa->audio_stream) { aa->object->call(SNAME("set_stream"), aa->audio_stream); aa->audio_stream_playback.unref(); @@ -1286,6 +1285,8 @@ void AnimationPlayer::_animation_process(double p_delta) { _animation_update_transforms(); if (end_reached) { + _clear_audio_streams(); + _stop_playing_caches(false); if (queued.size()) { String old = playback.assigned; play(queued.front()->get()); diff --git a/scene/animation/animation_tree.cpp b/scene/animation/animation_tree.cpp index dd5bf31c66..8b1a5e3aac 100644 --- a/scene/animation/animation_tree.cpp +++ b/scene/animation/animation_tree.cpp @@ -1546,6 +1546,10 @@ void AnimationTree::_process_graph(double p_delta) { double end_ofs = a->audio_track_get_key_end_offset(i, idx); double len = stream->get_length(); + if (seeked) { + start_ofs += time - a->track_get_key_time(i, idx); + } + if (t->object->call(SNAME("get_stream")) != t->audio_stream) { t->object->call(SNAME("set_stream"), t->audio_stream); t->audio_stream_playback.unref(); |