|
@@ -35,11 +35,8 @@
|
|
|
#include "scene/main/viewport.h"
|
|
|
void AudioStreamPlayer3D::_mix_audio() {
|
|
|
|
|
|
- if (!stream_playback.is_valid()) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- if (!active) {
|
|
|
+ if (!stream_playback.is_valid() || !active ||
|
|
|
+ (stream_paused && stream_paused_fade <= 0.f)) {
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -54,8 +51,9 @@ void AudioStreamPlayer3D::_mix_audio() {
|
|
|
AudioFrame *buffer = mix_buffer.ptrw();
|
|
|
int buffer_size = mix_buffer.size();
|
|
|
|
|
|
- //mix
|
|
|
- if (output_count > 0 || out_of_range_mode == OUT_OF_RANGE_MIX) {
|
|
|
+ // Mix if we're not paused or we're fading out
|
|
|
+ if ((output_count > 0 || out_of_range_mode == OUT_OF_RANGE_MIX) &&
|
|
|
+ (!stream_paused || stream_paused_fade > 0.f)) {
|
|
|
|
|
|
float output_pitch_scale = 0.0;
|
|
|
if (output_count) {
|
|
@@ -108,6 +106,13 @@ void AudioStreamPlayer3D::_mix_audio() {
|
|
|
AudioFrame vol_inc = (current.vol[k] - prev_outputs[i].vol[k]) / float(buffer_size);
|
|
|
AudioFrame vol = current.vol[k];
|
|
|
|
|
|
+ if (stream_paused) {
|
|
|
+ vol = vol * stream_paused_fade;
|
|
|
+ if (stream_paused_fade > 0.f) {
|
|
|
+ stream_paused_fade -= 0.1f;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
AudioFrame *target = AudioServer::get_singleton()->thread_get_channel_mix_buffer(current.bus_index, k);
|
|
|
|
|
|
current.filter.set_mode(AudioFilterSW::HIGHSHELF);
|
|
@@ -237,6 +242,18 @@ void AudioStreamPlayer3D::_notification(int p_what) {
|
|
|
|
|
|
AudioServer::get_singleton()->remove_callback(_mix_audios, this);
|
|
|
}
|
|
|
+
|
|
|
+ if (p_what == NOTIFICATION_PAUSED) {
|
|
|
+ if (!can_process()) {
|
|
|
+ // Node can't process so we start fading out to silence
|
|
|
+ set_stream_paused(true);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (p_what == NOTIFICATION_UNPAUSED) {
|
|
|
+ set_stream_paused(false);
|
|
|
+ }
|
|
|
+
|
|
|
if (p_what == NOTIFICATION_TRANSFORM_CHANGED) {
|
|
|
|
|
|
if (doppler_tracking != DOPPLER_TRACKING_DISABLED) {
|
|
@@ -825,6 +842,19 @@ AudioStreamPlayer3D::DopplerTracking AudioStreamPlayer3D::get_doppler_tracking()
|
|
|
return doppler_tracking;
|
|
|
}
|
|
|
|
|
|
+void AudioStreamPlayer3D::set_stream_paused(bool p_pause) {
|
|
|
+
|
|
|
+ if (p_pause != stream_paused) {
|
|
|
+ stream_paused = p_pause;
|
|
|
+ stream_paused_fade = stream_paused ? 1.f : 0.f;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+bool AudioStreamPlayer3D::get_stream_paused() const {
|
|
|
+
|
|
|
+ return stream_paused;
|
|
|
+}
|
|
|
+
|
|
|
void AudioStreamPlayer3D::_bind_methods() {
|
|
|
|
|
|
ClassDB::bind_method(D_METHOD("set_stream", "stream"), &AudioStreamPlayer3D::set_stream);
|
|
@@ -888,6 +918,9 @@ void AudioStreamPlayer3D::_bind_methods() {
|
|
|
ClassDB::bind_method(D_METHOD("set_doppler_tracking", "mode"), &AudioStreamPlayer3D::set_doppler_tracking);
|
|
|
ClassDB::bind_method(D_METHOD("get_doppler_tracking"), &AudioStreamPlayer3D::get_doppler_tracking);
|
|
|
|
|
|
+ ClassDB::bind_method(D_METHOD("set_stream_paused", "pause"), &AudioStreamPlayer3D::set_stream_paused);
|
|
|
+ ClassDB::bind_method(D_METHOD("get_stream_paused"), &AudioStreamPlayer3D::get_stream_paused);
|
|
|
+
|
|
|
ClassDB::bind_method(D_METHOD("_bus_layout_changed"), &AudioStreamPlayer3D::_bus_layout_changed);
|
|
|
|
|
|
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "stream", PROPERTY_HINT_RESOURCE_TYPE, "AudioStream"), "set_stream", "get_stream");
|
|
@@ -898,6 +931,7 @@ void AudioStreamPlayer3D::_bind_methods() {
|
|
|
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::BOOL, "stream_paused", PROPERTY_HINT_NONE, ""), "set_stream_paused", "get_stream_paused");
|
|
|
ADD_PROPERTY(PropertyInfo(Variant::REAL, "max_distance", PROPERTY_HINT_EXP_RANGE, "0,4096,1,or_greater"), "set_max_distance", "get_max_distance");
|
|
|
ADD_PROPERTY(PropertyInfo(Variant::INT, "out_of_range_mode", PROPERTY_HINT_ENUM, "Mix,Pause"), "set_out_of_range_mode", "get_out_of_range_mode");
|
|
|
ADD_PROPERTY(PropertyInfo(Variant::STRING, "bus", PROPERTY_HINT_ENUM, ""), "set_bus", "get_bus");
|
|
@@ -949,6 +983,8 @@ AudioStreamPlayer3D::AudioStreamPlayer3D() {
|
|
|
attenuation_filter_db = -24;
|
|
|
out_of_range_mode = OUT_OF_RANGE_MIX;
|
|
|
doppler_tracking = DOPPLER_TRACKING_DISABLED;
|
|
|
+ stream_paused = false;
|
|
|
+ stream_paused_fade = 0.f;
|
|
|
|
|
|
velocity_tracker.instance();
|
|
|
AudioServer::get_singleton()->connect("bus_layout_changed", this, "_bus_layout_changed");
|