2
0
Эх сурвалжийг харах

Added pitch scale property to AudioStreamPlayer, AudioStreamPlayer2D and AudioStreamPlayer3D

MrCdK 7 жил өмнө
parent
commit
5bc010e8ee

+ 13 - 1
scene/2d/audio_stream_player_2d.cpp

@@ -25,7 +25,7 @@ void AudioStreamPlayer2D::_mix_audio() {
 	int buffer_size = mix_buffer.size();
 
 	//mix
-	stream_playback->mix(buffer, 1.0, buffer_size);
+	stream_playback->mix(buffer, pitch_scale, buffer_size);
 
 	//write all outputs
 	for (int i = 0; i < output_count; i++) {
@@ -250,6 +250,13 @@ float AudioStreamPlayer2D::get_volume_db() const {
 	return volume_db;
 }
 
+void AudioStreamPlayer2D::set_pitch_scale(float p_pitch_scale) {
+	pitch_scale = p_pitch_scale;
+}
+float AudioStreamPlayer2D::get_pitch_scale() const {
+	return pitch_scale;
+}
+
 void AudioStreamPlayer2D::play(float p_from_pos) {
 
 	if (stream_playback.is_valid()) {
@@ -390,6 +397,9 @@ void AudioStreamPlayer2D::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_volume_db", "volume_db"), &AudioStreamPlayer2D::set_volume_db);
 	ClassDB::bind_method(D_METHOD("get_volume_db"), &AudioStreamPlayer2D::get_volume_db);
 
+	ClassDB::bind_method(D_METHOD("set_pitch_scale", "pitch_scale"), &AudioStreamPlayer2D::set_pitch_scale);
+	ClassDB::bind_method(D_METHOD("get_pitch_scale"), &AudioStreamPlayer2D::get_pitch_scale);
+
 	ClassDB::bind_method(D_METHOD("play", "from_position"), &AudioStreamPlayer2D::play, DEFVAL(0.0));
 	ClassDB::bind_method(D_METHOD("seek", "to_position"), &AudioStreamPlayer2D::seek);
 	ClassDB::bind_method(D_METHOD("stop"), &AudioStreamPlayer2D::stop);
@@ -419,6 +429,7 @@ void AudioStreamPlayer2D::_bind_methods() {
 
 	ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "stream", PROPERTY_HINT_RESOURCE_TYPE, "AudioStream"), "set_stream", "get_stream");
 	ADD_PROPERTY(PropertyInfo(Variant::REAL, "volume_db", PROPERTY_HINT_RANGE, "-80,24"), "set_volume_db", "get_volume_db");
+	ADD_PROPERTY(PropertyInfo(Variant::REAL, "pitch_scale", PROPERTY_HINT_RANGE, "0.01,32,0.01"), "set_pitch_scale", "get_pitch_scale");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "playing", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR), "_set_playing", "is_playing");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "autoplay"), "set_autoplay", "is_autoplay_enabled");
 	ADD_PROPERTY(PropertyInfo(Variant::REAL, "max_distance", PROPERTY_HINT_RANGE, "1,65536,1"), "set_max_distance", "get_max_distance");
@@ -432,6 +443,7 @@ void AudioStreamPlayer2D::_bind_methods() {
 AudioStreamPlayer2D::AudioStreamPlayer2D() {
 
 	volume_db = 0;
+	pitch_scale = 1.0;
 	autoplay = false;
 	setseek = -1;
 	active = false;

+ 4 - 0
scene/2d/audio_stream_player_2d.h

@@ -40,6 +40,7 @@ private:
 	volatile float setplay;
 
 	float volume_db;
+	float pitch_scale;
 	bool autoplay;
 	StringName bus;
 
@@ -68,6 +69,9 @@ public:
 	void set_volume_db(float p_volume);
 	float get_volume_db() const;
 
+	void set_pitch_scale(float p_pitch_scale);
+	float get_pitch_scale() const;
+
 	void play(float p_from_pos = 0.0);
 	void seek(float p_seconds);
 	void stop();

+ 17 - 5
scene/3d/audio_stream_player_3d.cpp

@@ -27,18 +27,18 @@ void AudioStreamPlayer3D::_mix_audio() {
 	//mix
 	if (output_count > 0 || out_of_range_mode == OUT_OF_RANGE_MIX) {
 
-		float pitch_scale = 0.0;
+		float output_pitch_scale = 0.0;
 		if (output_count) {
 			//used for doppler, not realistic but good enough
 			for (int i = 0; i < output_count; i++) {
-				pitch_scale += outputs[i].pitch_scale;
+				output_pitch_scale += outputs[i].pitch_scale;
 			}
-			pitch_scale /= float(output_count);
+			output_pitch_scale /= float(output_count);
 		} else {
-			pitch_scale = 1.0;
+			output_pitch_scale = 1.0;
 		}
 
-		stream_playback->mix(buffer, pitch_scale, buffer_size);
+		stream_playback->mix(buffer, pitch_scale * output_pitch_scale, buffer_size);
 	}
 
 	//write all outputs
@@ -577,6 +577,13 @@ float AudioStreamPlayer3D::get_max_db() const {
 	return max_db;
 }
 
+void AudioStreamPlayer3D::set_pitch_scale(float p_pitch_scale) {
+	pitch_scale = p_pitch_scale;
+}
+float AudioStreamPlayer3D::get_pitch_scale() const {
+	return pitch_scale;
+}
+
 void AudioStreamPlayer3D::play(float p_from_pos) {
 
 	if (stream_playback.is_valid()) {
@@ -802,6 +809,9 @@ void AudioStreamPlayer3D::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_max_db", "max_db"), &AudioStreamPlayer3D::set_max_db);
 	ClassDB::bind_method(D_METHOD("get_max_db"), &AudioStreamPlayer3D::get_max_db);
 
+	ClassDB::bind_method(D_METHOD("set_pitch_scale", "pitch_scale"), &AudioStreamPlayer3D::set_pitch_scale);
+	ClassDB::bind_method(D_METHOD("get_pitch_scale"), &AudioStreamPlayer3D::get_pitch_scale);
+
 	ClassDB::bind_method(D_METHOD("play", "from_position"), &AudioStreamPlayer3D::play, DEFVAL(0.0));
 	ClassDB::bind_method(D_METHOD("seek", "to_position"), &AudioStreamPlayer3D::seek);
 	ClassDB::bind_method(D_METHOD("stop"), &AudioStreamPlayer3D::stop);
@@ -855,6 +865,7 @@ void AudioStreamPlayer3D::_bind_methods() {
 	ADD_PROPERTY(PropertyInfo(Variant::REAL, "unit_db", PROPERTY_HINT_RANGE, "-80,80"), "set_unit_db", "get_unit_db");
 	ADD_PROPERTY(PropertyInfo(Variant::REAL, "unit_size", PROPERTY_HINT_RANGE, "0.1,100,0.1"), "set_unit_size", "get_unit_size");
 	ADD_PROPERTY(PropertyInfo(Variant::REAL, "max_db", PROPERTY_HINT_RANGE, "-24,6"), "set_max_db", "get_max_db");
+	ADD_PROPERTY(PropertyInfo(Variant::REAL, "pitch_scale", PROPERTY_HINT_RANGE, "0.01,32,0.01"), "set_pitch_scale", "get_pitch_scale");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "playing", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR), "_set_playing", "is_playing");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "autoplay"), "set_autoplay", "is_autoplay_enabled");
 	ADD_PROPERTY(PropertyInfo(Variant::REAL, "max_distance", PROPERTY_HINT_RANGE, "0,65536,1"), "set_max_distance", "get_max_distance");
@@ -891,6 +902,7 @@ AudioStreamPlayer3D::AudioStreamPlayer3D() {
 	unit_size = 1;
 	attenuation_model = ATTENUATION_INVERSE_DISTANCE;
 	max_db = 3;
+	pitch_scale = 1.0;
 	autoplay = false;
 	setseek = -1;
 	active = false;

+ 4 - 0
scene/3d/audio_stream_player_3d.h

@@ -76,6 +76,7 @@ private:
 	float unit_db;
 	float unit_size;
 	float max_db;
+	float pitch_scale;
 	bool autoplay;
 	StringName bus;
 
@@ -123,6 +124,9 @@ public:
 	void set_max_db(float p_boost);
 	float get_max_db() const;
 
+	void set_pitch_scale(float p_pitch_scale);
+	float get_pitch_scale() const;
+
 	void play(float p_from_pos = 0.0);
 	void seek(float p_seconds);
 	void stop();

+ 13 - 1
scene/audio/audio_player.cpp

@@ -44,7 +44,7 @@ void AudioStreamPlayer::_mix_internal(bool p_fadeout) {
 	}
 
 	//mix
-	stream_playback->mix(buffer, 1.0, buffer_size);
+	stream_playback->mix(buffer, pitch_scale, buffer_size);
 
 	//multiply volume interpolating to avoid clicks if this changes
 	float target_volume = p_fadeout ? -80.0 : volume_db;
@@ -176,6 +176,13 @@ float AudioStreamPlayer::get_volume_db() const {
 	return volume_db;
 }
 
+void AudioStreamPlayer::set_pitch_scale(float p_pitch_scale) {
+	pitch_scale = p_pitch_scale;
+}
+float AudioStreamPlayer::get_pitch_scale() const {
+	return pitch_scale;
+}
+
 void AudioStreamPlayer::play(float p_from_pos) {
 
 	if (stream_playback.is_valid()) {
@@ -296,6 +303,9 @@ void AudioStreamPlayer::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_volume_db", "volume_db"), &AudioStreamPlayer::set_volume_db);
 	ClassDB::bind_method(D_METHOD("get_volume_db"), &AudioStreamPlayer::get_volume_db);
 
+	ClassDB::bind_method(D_METHOD("set_pitch_scale", "pitch_scale"), &AudioStreamPlayer::set_pitch_scale);
+	ClassDB::bind_method(D_METHOD("get_pitch_scale"), &AudioStreamPlayer::get_pitch_scale);
+
 	ClassDB::bind_method(D_METHOD("play", "from_position"), &AudioStreamPlayer::play, DEFVAL(0.0));
 	ClassDB::bind_method(D_METHOD("seek", "to_position"), &AudioStreamPlayer::seek);
 	ClassDB::bind_method(D_METHOD("stop"), &AudioStreamPlayer::stop);
@@ -319,6 +329,7 @@ void AudioStreamPlayer::_bind_methods() {
 
 	ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "stream", PROPERTY_HINT_RESOURCE_TYPE, "AudioStream"), "set_stream", "get_stream");
 	ADD_PROPERTY(PropertyInfo(Variant::REAL, "volume_db", PROPERTY_HINT_RANGE, "-80,24"), "set_volume_db", "get_volume_db");
+	ADD_PROPERTY(PropertyInfo(Variant::REAL, "pitch_scale", PROPERTY_HINT_RANGE, "0.01,32,0.01"), "set_pitch_scale", "get_pitch_scale");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "playing", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR), "_set_playing", "is_playing");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "autoplay"), "set_autoplay", "is_autoplay_enabled");
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "mix_target", PROPERTY_HINT_ENUM, "Stereo,Surround,Center"), "set_mix_target", "get_mix_target");
@@ -334,6 +345,7 @@ void AudioStreamPlayer::_bind_methods() {
 AudioStreamPlayer::AudioStreamPlayer() {
 
 	mix_volume_db = 0;
+	pitch_scale = 1.0;
 	volume_db = 0;
 	autoplay = false;
 	setseek = -1;

+ 4 - 0
scene/audio/audio_player.h

@@ -53,6 +53,7 @@ private:
 	volatile bool active;
 
 	float mix_volume_db;
+	float pitch_scale;
 	float volume_db;
 	bool autoplay;
 	StringName bus;
@@ -80,6 +81,9 @@ public:
 	void set_volume_db(float p_volume);
 	float get_volume_db() const;
 
+	void set_pitch_scale(float p_pitch_scale);
+	float get_pitch_scale() const;
+
 	void play(float p_from_pos = 0.0);
 	void seek(float p_seconds);
 	void stop();

+ 2 - 2
servers/audio/audio_stream.cpp

@@ -45,9 +45,9 @@ void AudioStreamPlaybackResampled::_begin_resample() {
 
 void AudioStreamPlaybackResampled::mix(AudioFrame *p_buffer, float p_rate_scale, int p_frames) {
 
-	float target_rate = AudioServer::get_singleton()->get_mix_rate() * p_rate_scale;
+	float target_rate = AudioServer::get_singleton()->get_mix_rate();
 
-	uint64_t mix_increment = uint64_t((get_stream_sampling_rate() / double(target_rate)) * double(FP_LEN));
+	uint64_t mix_increment = uint64_t(((get_stream_sampling_rate() * p_rate_scale) / double(target_rate)) * double(FP_LEN));
 
 	for (int i = 0; i < p_frames; i++) {