Browse Source

Add speed scale feature for VideoStreamPlayer node

2750558108 2 months ago
parent
commit
c2eba05312

+ 3 - 0
doc/classes/VideoStreamPlayer.xml

@@ -73,6 +73,9 @@
 		<member name="paused" type="bool" setter="set_paused" getter="is_paused" default="false">
 		<member name="paused" type="bool" setter="set_paused" getter="is_paused" default="false">
 			If [code]true[/code], the video is paused.
 			If [code]true[/code], the video is paused.
 		</member>
 		</member>
+		<member name="speed_scale" type="float" setter="set_speed_scale" getter="get_speed_scale" default="1.0">
+			The stream's current speed scale. [code]1.0[/code] is the normal speed, while [code]2.0[/code] is double speed and [code]0.5[/code] is half speed. A speed scale of [code]0.0[/code] pauses the video, similar to setting [member paused] to [code]true[/code].
+		</member>
 		<member name="stream" type="VideoStream" setter="set_stream" getter="get_stream">
 		<member name="stream" type="VideoStream" setter="set_stream" getter="get_stream">
 			The assigned video stream. See description for supported formats.
 			The assigned video stream. See description for supported formats.
 		</member>
 		</member>

+ 15 - 2
scene/gui/video_stream_player.cpp

@@ -157,9 +157,9 @@ void VideoStreamPlayer::_notification(int p_notification) {
 			double delta = first_frame ? 0 : get_process_delta_time();
 			double delta = first_frame ? 0 : get_process_delta_time();
 			first_frame = false;
 			first_frame = false;
 
 
-			resampler.set_playback_speed(Engine::get_singleton()->get_time_scale());
+			resampler.set_playback_speed(Engine::get_singleton()->get_time_scale() * speed_scale);
 
 
-			playback->update(delta); // playback->is_playing() returns false in the last video frame
+			playback->update(delta * speed_scale); // playback->is_playing() returns false in the last video frame
 
 
 			if (!playback->is_playing()) {
 			if (!playback->is_playing()) {
 				resampler.flush();
 				resampler.flush();
@@ -433,6 +433,15 @@ float VideoStreamPlayer::get_volume_db() const {
 	}
 	}
 }
 }
 
 
+void VideoStreamPlayer::set_speed_scale(float p_speed_scale) {
+	ERR_FAIL_COND(p_speed_scale < 0.0);
+	speed_scale = p_speed_scale;
+}
+
+float VideoStreamPlayer::get_speed_scale() const {
+	return speed_scale;
+}
+
 String VideoStreamPlayer::get_stream_name() const {
 String VideoStreamPlayer::get_stream_name() const {
 	if (stream.is_null()) {
 	if (stream.is_null()) {
 		return "<No Stream>";
 		return "<No Stream>";
@@ -530,6 +539,9 @@ void VideoStreamPlayer::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_volume_db", "db"), &VideoStreamPlayer::set_volume_db);
 	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("get_volume_db"), &VideoStreamPlayer::get_volume_db);
 
 
+	ClassDB::bind_method(D_METHOD("set_speed_scale", "speed_scale"), &VideoStreamPlayer::set_speed_scale);
+	ClassDB::bind_method(D_METHOD("get_speed_scale"), &VideoStreamPlayer::get_speed_scale);
+
 	ClassDB::bind_method(D_METHOD("set_audio_track", "track"), &VideoStreamPlayer::set_audio_track);
 	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);
 	ClassDB::bind_method(D_METHOD("get_audio_track"), &VideoStreamPlayer::get_audio_track);
 
 
@@ -559,6 +571,7 @@ void VideoStreamPlayer::_bind_methods() {
 	ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "stream", PROPERTY_HINT_RESOURCE_TYPE, "VideoStream"), "set_stream", "get_stream");
 	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_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, "volume", PROPERTY_HINT_RANGE, "0,15,0.01,exp", PROPERTY_USAGE_NONE), "set_volume", "get_volume");
+	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "speed_scale", PROPERTY_HINT_RANGE, "0,4,0.001,or_greater"), "set_speed_scale", "get_speed_scale");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "autoplay"), "set_autoplay", "has_autoplay");
 	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, "paused"), "set_paused", "is_paused");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "expand"), "set_expand", "has_expand");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "expand"), "set_expand", "has_expand");

+ 4 - 0
scene/gui/video_stream_player.h

@@ -63,6 +63,7 @@ class VideoStreamPlayer : public Control {
 	bool paused_from_tree = false;
 	bool paused_from_tree = false;
 	bool autoplay = false;
 	bool autoplay = false;
 	float volume = 1.0;
 	float volume = 1.0;
+	float speed_scale = 1.0;
 	bool expand = false;
 	bool expand = false;
 	bool loop = false;
 	bool loop = false;
 	bool first_frame = false;
 	bool first_frame = false;
@@ -107,6 +108,9 @@ public:
 	void set_volume_db(float p_db);
 	void set_volume_db(float p_db);
 	float get_volume_db() const;
 	float get_volume_db() const;
 
 
+	void set_speed_scale(float p_speed_scale);
+	float get_speed_scale() const;
+
 	String get_stream_name() const;
 	String get_stream_name() const;
 	double get_stream_length() const;
 	double get_stream_length() const;
 	double get_stream_position() const;
 	double get_stream_position() const;