Added pitch scale property to AudioStreamPlayer, AudioStreamPlayer2D and AudioStreamPlayer3D

This commit is contained in:
MrCdK 2018-01-01 22:23:16 +01:00
parent b50a9114b1
commit 5bc010e8ee
7 changed files with 57 additions and 9 deletions

View File

@ -25,7 +25,7 @@ void AudioStreamPlayer2D::_mix_audio() {
int buffer_size = mix_buffer.size(); int buffer_size = mix_buffer.size();
//mix //mix
stream_playback->mix(buffer, 1.0, buffer_size); stream_playback->mix(buffer, pitch_scale, buffer_size);
//write all outputs //write all outputs
for (int i = 0; i < output_count; i++) { for (int i = 0; i < output_count; i++) {
@ -250,6 +250,13 @@ float AudioStreamPlayer2D::get_volume_db() const {
return volume_db; 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) { void AudioStreamPlayer2D::play(float p_from_pos) {
if (stream_playback.is_valid()) { 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("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("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("play", "from_position"), &AudioStreamPlayer2D::play, DEFVAL(0.0));
ClassDB::bind_method(D_METHOD("seek", "to_position"), &AudioStreamPlayer2D::seek); ClassDB::bind_method(D_METHOD("seek", "to_position"), &AudioStreamPlayer2D::seek);
ClassDB::bind_method(D_METHOD("stop"), &AudioStreamPlayer2D::stop); 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::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, "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, "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::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"); 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() { AudioStreamPlayer2D::AudioStreamPlayer2D() {
volume_db = 0; volume_db = 0;
pitch_scale = 1.0;
autoplay = false; autoplay = false;
setseek = -1; setseek = -1;
active = false; active = false;

View File

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

View File

@ -27,18 +27,18 @@ void AudioStreamPlayer3D::_mix_audio() {
//mix //mix
if (output_count > 0 || out_of_range_mode == OUT_OF_RANGE_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) { if (output_count) {
//used for doppler, not realistic but good enough //used for doppler, not realistic but good enough
for (int i = 0; i < output_count; i++) { 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 { } 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 //write all outputs
@ -577,6 +577,13 @@ float AudioStreamPlayer3D::get_max_db() const {
return max_db; 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) { void AudioStreamPlayer3D::play(float p_from_pos) {
if (stream_playback.is_valid()) { 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("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("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("play", "from_position"), &AudioStreamPlayer3D::play, DEFVAL(0.0));
ClassDB::bind_method(D_METHOD("seek", "to_position"), &AudioStreamPlayer3D::seek); ClassDB::bind_method(D_METHOD("seek", "to_position"), &AudioStreamPlayer3D::seek);
ClassDB::bind_method(D_METHOD("stop"), &AudioStreamPlayer3D::stop); 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_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, "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, "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, "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::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"); 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; unit_size = 1;
attenuation_model = ATTENUATION_INVERSE_DISTANCE; attenuation_model = ATTENUATION_INVERSE_DISTANCE;
max_db = 3; max_db = 3;
pitch_scale = 1.0;
autoplay = false; autoplay = false;
setseek = -1; setseek = -1;
active = false; active = false;

View File

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

View File

@ -44,7 +44,7 @@ void AudioStreamPlayer::_mix_internal(bool p_fadeout) {
} }
//mix //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 //multiply volume interpolating to avoid clicks if this changes
float target_volume = p_fadeout ? -80.0 : volume_db; float target_volume = p_fadeout ? -80.0 : volume_db;
@ -176,6 +176,13 @@ float AudioStreamPlayer::get_volume_db() const {
return volume_db; 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) { void AudioStreamPlayer::play(float p_from_pos) {
if (stream_playback.is_valid()) { 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("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("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("play", "from_position"), &AudioStreamPlayer::play, DEFVAL(0.0));
ClassDB::bind_method(D_METHOD("seek", "to_position"), &AudioStreamPlayer::seek); ClassDB::bind_method(D_METHOD("seek", "to_position"), &AudioStreamPlayer::seek);
ClassDB::bind_method(D_METHOD("stop"), &AudioStreamPlayer::stop); 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::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, "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, "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::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"); 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() { AudioStreamPlayer::AudioStreamPlayer() {
mix_volume_db = 0; mix_volume_db = 0;
pitch_scale = 1.0;
volume_db = 0; volume_db = 0;
autoplay = false; autoplay = false;
setseek = -1; setseek = -1;

View File

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

View File

@ -45,9 +45,9 @@ void AudioStreamPlaybackResampled::_begin_resample() {
void AudioStreamPlaybackResampled::mix(AudioFrame *p_buffer, float p_rate_scale, int p_frames) { 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++) { for (int i = 0; i < p_frames; i++) {