diff --git a/doc/classes/AudioStreamPlayer.xml b/doc/classes/AudioStreamPlayer.xml index c48c7f43008d..05aafa7afcc7 100644 --- a/doc/classes/AudioStreamPlayer.xml +++ b/doc/classes/AudioStreamPlayer.xml @@ -20,6 +20,7 @@ Returns the position in the [AudioStream] in seconds. + [b]Note:[/b] This method does not account for the small delay between mixing and hearing audio (see [method AudioServer.get_output_latency]). diff --git a/scene/2d/audio_stream_player_2d.cpp b/scene/2d/audio_stream_player_2d.cpp index 0a80467b6bd7..0a9fef5d90e0 100644 --- a/scene/2d/audio_stream_player_2d.cpp +++ b/scene/2d/audio_stream_player_2d.cpp @@ -301,7 +301,8 @@ bool AudioStreamPlayer2D::is_playing() const { float AudioStreamPlayer2D::get_playback_position() { // Return the playback position of the most recently started playback stream. if (!stream_playbacks.is_empty()) { - return AudioServer::get_singleton()->get_playback_position(stream_playbacks[stream_playbacks.size() - 1]); + float time_to_next_mix = get_stream_paused() ? 0.0 : MAX(AudioServer::get_singleton()->get_time_to_next_mix() * pitch_scale, 0.0); + return AudioServer::get_singleton()->get_playback_position(stream_playbacks[stream_playbacks.size() - 1]) - time_to_next_mix; } return 0; } diff --git a/scene/3d/audio_stream_player_3d.cpp b/scene/3d/audio_stream_player_3d.cpp index 9f99b5ecbdf0..89a3bce16465 100644 --- a/scene/3d/audio_stream_player_3d.cpp +++ b/scene/3d/audio_stream_player_3d.cpp @@ -618,7 +618,8 @@ bool AudioStreamPlayer3D::is_playing() const { float AudioStreamPlayer3D::get_playback_position() { // Return the playback position of the most recently started playback stream. if (!stream_playbacks.is_empty()) { - return AudioServer::get_singleton()->get_playback_position(stream_playbacks[stream_playbacks.size() - 1]); + float time_to_next_mix = get_stream_paused() ? 0.0 : MAX(AudioServer::get_singleton()->get_time_to_next_mix() * pitch_scale, 0.0); + return AudioServer::get_singleton()->get_playback_position(stream_playbacks[stream_playbacks.size() - 1]) - time_to_next_mix; } return 0; } diff --git a/scene/audio/audio_stream_player.cpp b/scene/audio/audio_stream_player.cpp index 7f6dfd0ab8b6..1dd2fdfec7b6 100644 --- a/scene/audio/audio_stream_player.cpp +++ b/scene/audio/audio_stream_player.cpp @@ -182,7 +182,8 @@ bool AudioStreamPlayer::is_playing() const { float AudioStreamPlayer::get_playback_position() { // Return the playback position of the most recently started playback stream. if (!stream_playbacks.is_empty()) { - return AudioServer::get_singleton()->get_playback_position(stream_playbacks[stream_playbacks.size() - 1]); + float time_to_next_mix = get_stream_paused() ? 0.0 : MAX(AudioServer::get_singleton()->get_time_to_next_mix() * pitch_scale, 0.0); + return AudioServer::get_singleton()->get_playback_position(stream_playbacks[stream_playbacks.size() - 1]) - time_to_next_mix; } return 0; }