diff --git a/doc/classes/VideoStreamPlayback.xml b/doc/classes/VideoStreamPlayback.xml index 17e29ae337a..80f34ec5f90 100644 --- a/doc/classes/VideoStreamPlayback.xml +++ b/doc/classes/VideoStreamPlayback.xml @@ -33,6 +33,12 @@ Return the current playback timestamp. Called in response to the [member VideoStreamPlayer.stream_position] getter. + + + + Return the current playback speed. + + @@ -78,6 +84,13 @@ Set the paused status of video playback. [method _is_paused] must return [param paused]. Called in response to the [member VideoStreamPlayer.paused] setter. + + + + + Set playback speed. + + diff --git a/doc/classes/VideoStreamPlayer.xml b/doc/classes/VideoStreamPlayer.xml index f903f171d10..3e152a8149b 100644 --- a/doc/classes/VideoStreamPlayer.xml +++ b/doc/classes/VideoStreamPlayer.xml @@ -81,6 +81,10 @@ The current position of the stream, in seconds. [b]Note:[/b] Changing this value won't have any effect as seeking is not implemented yet, except in video formats implemented by a GDExtension add-on. + + The current speed of the stream. 1.0 means the normal speed. + [b]Note:[/b] Changing this value won't have any effect as there is no speed feature implemented yet, except in video formats implemented by a GDExtension add-on. + Audio volume as a linear value. diff --git a/modules/theora/video_stream_theora.cpp b/modules/theora/video_stream_theora.cpp index 02a1c7f8687..0b97e893aec 100644 --- a/modules/theora/video_stream_theora.cpp +++ b/modules/theora/video_stream_theora.cpp @@ -488,6 +488,15 @@ double VideoStreamPlaybackTheora::get_length() const { return 0; } +double VideoStreamPlaybackTheora::get_playback_speed() const { + WARN_PRINT_ONCE("Video speed option in Theora videos is not implemented yet (it's only supported for GDExtension-provided video streams)."); + return 1; +} + +void VideoStreamPlaybackTheora::set_playback_speed(double p_speed) { + WARN_PRINT_ONCE("Video speed option in Theora videos is not implemented yet (it's only supported for GDExtension-provided video streams)."); +} + double VideoStreamPlaybackTheora::get_playback_position() const { return get_time(); } diff --git a/modules/theora/video_stream_theora.h b/modules/theora/video_stream_theora.h index 45b6746d40b..5d719d6fe07 100644 --- a/modules/theora/video_stream_theora.h +++ b/modules/theora/video_stream_theora.h @@ -111,6 +111,9 @@ public: virtual double get_length() const override; + virtual double get_playback_speed() const override; + virtual void set_playback_speed(double p_speed) override; + virtual double get_playback_position() const override; virtual void seek(double p_time) override; diff --git a/scene/gui/video_stream_player.cpp b/scene/gui/video_stream_player.cpp index fa965179a4d..14004b5a6e8 100644 --- a/scene/gui/video_stream_player.cpp +++ b/scene/gui/video_stream_player.cpp @@ -412,6 +412,19 @@ float VideoStreamPlayer::get_volume_db() const { } } +void VideoStreamPlayer::set_stream_speed(float p_speed) { + if (playback.is_valid()) { + playback->set_playback_speed(p_speed); + } +} + +float VideoStreamPlayer::get_stream_speed() const { + if (playback.is_null()) { + return 1; + } + return playback->get_playback_speed(); +} + String VideoStreamPlayer::get_stream_name() const { if (stream.is_null()) { return ""; @@ -507,6 +520,9 @@ void VideoStreamPlayer::_bind_methods() { ClassDB::bind_method(D_METHOD("set_volume_db", "db"), &VideoStreamPlayer::set_volume_db); ClassDB::bind_method(D_METHOD("get_volume_db"), &VideoStreamPlayer::get_volume_db); + ClassDB::bind_method(D_METHOD("set_stream_speed", "speed"), &VideoStreamPlayer::set_stream_speed); + ClassDB::bind_method(D_METHOD("get_stream_speed"), &VideoStreamPlayer::get_stream_speed); + ClassDB::bind_method(D_METHOD("set_audio_track", "track"), &VideoStreamPlayer::set_audio_track); ClassDB::bind_method(D_METHOD("get_audio_track"), &VideoStreamPlayer::get_audio_track); @@ -536,6 +552,7 @@ void VideoStreamPlayer::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "stream", PROPERTY_HINT_RESOURCE_TYPE, "VideoStream"), "set_stream", "get_stream"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "volume_db", PROPERTY_HINT_RANGE, "-80,24,0.01,suffix:dB"), "set_volume_db", "get_volume_db"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "volume", PROPERTY_HINT_RANGE, "0,15,0.01,exp", PROPERTY_USAGE_NONE), "set_volume", "get_volume"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "stream_speed", PROPERTY_HINT_RANGE, "0,1280000,0.1", PROPERTY_USAGE_NONE), "set_stream_speed", "get_stream_speed"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "autoplay"), "set_autoplay", "has_autoplay"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "paused"), "set_paused", "is_paused"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "expand"), "set_expand", "has_expand"); diff --git a/scene/gui/video_stream_player.h b/scene/gui/video_stream_player.h index 2cbe6cac218..d4591eefe58 100644 --- a/scene/gui/video_stream_player.h +++ b/scene/gui/video_stream_player.h @@ -106,6 +106,9 @@ public: void set_volume_db(float p_db); float get_volume_db() const; + void set_stream_speed(float p_speed); + float get_stream_speed() const; + String get_stream_name() const; double get_stream_length() const; double get_stream_position() const; diff --git a/scene/resources/video_stream.cpp b/scene/resources/video_stream.cpp index 32e87c38f3e..70388017dc5 100644 --- a/scene/resources/video_stream.cpp +++ b/scene/resources/video_stream.cpp @@ -40,6 +40,8 @@ void VideoStreamPlayback::_bind_methods() { GDVIRTUAL_BIND(_set_paused, "paused"); GDVIRTUAL_BIND(_is_paused); GDVIRTUAL_BIND(_get_length); + GDVIRTUAL_BIND(_get_playback_speed); + GDVIRTUAL_BIND(_set_playback_speed, "speed"); GDVIRTUAL_BIND(_get_playback_position); GDVIRTUAL_BIND(_seek, "time"); GDVIRTUAL_BIND(_set_audio_track, "idx"); @@ -91,6 +93,18 @@ double VideoStreamPlayback::get_length() const { return 0; } +double VideoStreamPlayback::get_playback_speed() const { + double ret; + if (GDVIRTUAL_CALL(_get_playback_speed, ret)) { + return ret; + } + return 1; +} + +void VideoStreamPlayback::set_playback_speed(double p_speed) { + GDVIRTUAL_CALL(_set_playback_speed, p_speed); +} + double VideoStreamPlayback::get_playback_position() const { double ret; if (GDVIRTUAL_CALL(_get_playback_position, ret)) { diff --git a/scene/resources/video_stream.h b/scene/resources/video_stream.h index b3d0739e759..70c571d7536 100644 --- a/scene/resources/video_stream.h +++ b/scene/resources/video_stream.h @@ -51,6 +51,8 @@ protected: GDVIRTUAL1(_set_paused, bool); GDVIRTUAL0RC(bool, _is_paused); GDVIRTUAL0RC(double, _get_length); + GDVIRTUAL0RC(double, _get_playback_speed); + GDVIRTUAL1(_set_playback_speed, double); GDVIRTUAL0RC(double, _get_playback_position); GDVIRTUAL1(_seek, double); GDVIRTUAL1(_set_audio_track, int); @@ -75,6 +77,9 @@ public: virtual double get_length() const; + virtual double get_playback_speed() const; + virtual void set_playback_speed(double p_speed); + virtual double get_playback_position() const; virtual void seek(double p_time);