diff --git a/doc/classes/AudioStreamPlayback.xml b/doc/classes/AudioStreamPlayback.xml
index d7f6ef20145..f01406d0f1d 100644
--- a/doc/classes/AudioStreamPlayback.xml
+++ b/doc/classes/AudioStreamPlayback.xml
@@ -113,6 +113,13 @@
[b]Note:[/b] Can return fewer frames than requested, make sure to use the size of the return value.
+
+
+
+
+ Seeks the stream at the given [param time], in seconds.
+
+
diff --git a/servers/audio/audio_stream.cpp b/servers/audio/audio_stream.cpp
index 4921299ef15..13ba139f316 100644
--- a/servers/audio/audio_stream.cpp
+++ b/servers/audio/audio_stream.cpp
@@ -76,31 +76,42 @@ int AudioStreamPlayback::mix(AudioFrame *p_buffer, float p_rate_scale, int p_fra
return ret;
}
-PackedVector2Array AudioStreamPlayback::mix_audio(float p_rate_scale, int p_frames) {
- Vector frames_in;
- frames_in.resize(p_frames);
-
- int frames = mix(frames_in.ptrw(), p_rate_scale, p_frames);
+PackedVector2Array AudioStreamPlayback::_mix_audio_bind(float p_rate_scale, int p_frames) {
+ Vector frames = mix_audio(p_rate_scale, p_frames);
PackedVector2Array res;
- res.resize(frames);
+ res.resize(frames.size());
Vector2 *res_ptrw = res.ptrw();
- for (int i = 0; i < frames; i++) {
- res_ptrw[i] = Vector2(frames_in[i].left, frames_in[i].right);
+ for (int i = 0; i < frames.size(); i++) {
+ res_ptrw[i] = Vector2(frames[i].left, frames[i].right);
}
return res;
}
+Vector AudioStreamPlayback::mix_audio(float p_rate_scale, int p_frames) {
+ Vector res;
+ res.resize(p_frames);
+
+ int frames = mix(res.ptrw(), p_rate_scale, p_frames);
+ res.resize(frames);
+
+ return res;
+}
+
void AudioStreamPlayback::start_playback(double p_from_pos) {
- start();
+ start(p_from_pos);
}
void AudioStreamPlayback::stop_playback() {
stop();
}
+void AudioStreamPlayback::seek_playback(double p_time) {
+ seek(p_time);
+}
+
void AudioStreamPlayback::tag_used_streams() {
GDVIRTUAL_CALL(_tag_used_streams);
}
@@ -133,8 +144,9 @@ void AudioStreamPlayback::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_sample_playback", "playback_sample"), &AudioStreamPlayback::set_sample_playback);
ClassDB::bind_method(D_METHOD("get_sample_playback"), &AudioStreamPlayback::get_sample_playback);
- ClassDB::bind_method(D_METHOD("mix_audio", "rate_scale", "frames"), &AudioStreamPlayback::mix_audio);
+ ClassDB::bind_method(D_METHOD("mix_audio", "rate_scale", "frames"), &AudioStreamPlayback::_mix_audio_bind);
ClassDB::bind_method(D_METHOD("start", "from_pos"), &AudioStreamPlayback::start_playback, DEFVAL(0.0));
+ ClassDB::bind_method(D_METHOD("seek", "time"), &AudioStreamPlayback::seek_playback, DEFVAL(0.0));
ClassDB::bind_method(D_METHOD("stop"), &AudioStreamPlayback::stop_playback);
ClassDB::bind_method(D_METHOD("get_loop_count"), &AudioStreamPlayback::get_loop_count);
ClassDB::bind_method(D_METHOD("get_playback_position"), &AudioStreamPlayback::get_playback_position);
diff --git a/servers/audio/audio_stream.h b/servers/audio/audio_stream.h
index 31fd94038ea..f49eb8af015 100644
--- a/servers/audio/audio_stream.h
+++ b/servers/audio/audio_stream.h
@@ -81,6 +81,7 @@ class AudioStreamPlayback : public RefCounted {
protected:
static void _bind_methods();
+ PackedVector2Array _mix_audio_bind(float p_rate_scale, int p_frames);
GDVIRTUAL1(_start, double)
GDVIRTUAL0(_stop)
GDVIRTUAL0RC(bool, _is_playing)
@@ -117,9 +118,10 @@ public:
AudioStreamPlayback();
~AudioStreamPlayback();
- PackedVector2Array mix_audio(float p_rate_scale, int p_frames);
+ Vector mix_audio(float p_rate_scale, int p_frames);
void start_playback(double p_from_pos = 0.0);
void stop_playback();
+ void seek_playback(double p_time);
};
class AudioStreamPlaybackResampled : public AudioStreamPlayback {