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;
}