Merge pull request #91382 from adamscott/sample-player

Add sample playback support
This commit is contained in:
Rémi Verschelde
2024-06-19 07:59:07 +02:00
committed by GitHub
42 changed files with 2611 additions and 46 deletions

View File

@ -128,6 +128,8 @@ void AudioStreamPlayer2D::_update_panning() {
volume_vector.write[2] = AudioFrame(0, 0);
volume_vector.write[3] = AudioFrame(0, 0);
StringName actual_bus = _get_actual_bus();
for (Viewport *vp : viewports) {
if (!vp->is_audio_listener_2d()) {
continue;
@ -172,15 +174,20 @@ void AudioStreamPlayer2D::_update_panning() {
const AudioFrame &prev_sample = volume_vector[0];
AudioFrame new_sample = AudioFrame(l, r) * multiplier;
volume_vector.write[0] = AudioFrame(MAX(prev_sample[0], new_sample[0]), MAX(prev_sample[1], new_sample[1]));
}
for (const Ref<AudioStreamPlayback> &playback : internal->stream_playbacks) {
AudioServer::get_singleton()->set_playback_bus_exclusive(playback, _get_actual_bus(), volume_vector);
AudioServer::get_singleton()->set_playback_bus_exclusive(playback, actual_bus, volume_vector);
}
for (Ref<AudioStreamPlayback> &playback : internal->stream_playbacks) {
for (const Ref<AudioStreamPlayback> &playback : internal->stream_playbacks) {
AudioServer::get_singleton()->set_playback_pitch_scale(playback, internal->pitch_scale);
if (playback->get_is_sample() && playback->get_sample_playback().is_valid()) {
Ref<AudioSamplePlayback> sample_playback = playback->get_sample_playback();
AudioServer::get_singleton()->update_sample_playback_pitch_scale(sample_playback, internal->pitch_scale);
}
}
last_mix_count = AudioServer::get_singleton()->get_mix_count();
@ -218,6 +225,15 @@ void AudioStreamPlayer2D::play(float p_from_pos) {
}
setplayback = stream_playback;
setplay.set(p_from_pos);
// Sample handling.
if (stream_playback->get_is_sample() && stream_playback->get_sample_playback().is_valid()) {
Ref<AudioSamplePlayback> sample_playback = stream_playback->get_sample_playback();
sample_playback->offset = p_from_pos;
sample_playback->bus = _get_actual_bus();
AudioServer::get_singleton()->start_sample_playback(sample_playback);
}
}
void AudioStreamPlayer2D::seek(float p_seconds) {
@ -326,6 +342,14 @@ float AudioStreamPlayer2D::get_panning_strength() const {
return panning_strength;
}
AudioServer::PlaybackType AudioStreamPlayer2D::get_playback_type() const {
return internal->get_playback_type();
}
void AudioStreamPlayer2D::set_playback_type(AudioServer::PlaybackType p_playback_type) {
internal->set_playback_type(p_playback_type);
}
bool AudioStreamPlayer2D::_set(const StringName &p_name, const Variant &p_value) {
return internal->set(p_name, p_value);
}
@ -385,6 +409,9 @@ void AudioStreamPlayer2D::_bind_methods() {
ClassDB::bind_method(D_METHOD("has_stream_playback"), &AudioStreamPlayer2D::has_stream_playback);
ClassDB::bind_method(D_METHOD("get_stream_playback"), &AudioStreamPlayer2D::get_stream_playback);
ClassDB::bind_method(D_METHOD("set_playback_type", "playback_type"), &AudioStreamPlayer2D::set_playback_type);
ClassDB::bind_method(D_METHOD("get_playback_type"), &AudioStreamPlayer2D::get_playback_type);
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "stream", PROPERTY_HINT_RESOURCE_TYPE, "AudioStream"), "set_stream", "get_stream");
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "volume_db", PROPERTY_HINT_RANGE, "-80,24,suffix:dB"), "set_volume_db", "get_volume_db");
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "pitch_scale", PROPERTY_HINT_RANGE, "0.01,4,0.01,or_greater"), "set_pitch_scale", "get_pitch_scale");
@ -397,6 +424,7 @@ void AudioStreamPlayer2D::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "panning_strength", PROPERTY_HINT_RANGE, "0,3,0.01,or_greater"), "set_panning_strength", "get_panning_strength");
ADD_PROPERTY(PropertyInfo(Variant::STRING_NAME, "bus", PROPERTY_HINT_ENUM, ""), "set_bus", "get_bus");
ADD_PROPERTY(PropertyInfo(Variant::INT, "area_mask", PROPERTY_HINT_LAYERS_2D_PHYSICS), "set_area_mask", "get_area_mask");
ADD_PROPERTY(PropertyInfo(Variant::INT, "playback_type", PROPERTY_HINT_ENUM, "Default,Stream,Sample"), "set_playback_type", "get_playback_type");
ADD_SIGNAL(MethodInfo("finished"));
}

View File

@ -32,6 +32,7 @@
#define AUDIO_STREAM_PLAYER_2D_H
#include "scene/2d/node_2d.h"
#include "servers/audio_server.h"
struct AudioFrame;
class AudioStream;
@ -64,6 +65,8 @@ private:
uint64_t last_mix_count = -1;
bool force_update_panning = false;
AudioServer::PlaybackType playback_type = AudioServer::PlaybackType::PLAYBACK_TYPE_DEFAULT;
void _set_playing(bool p_enable);
bool _is_active() const;
@ -137,6 +140,9 @@ public:
bool has_stream_playback();
Ref<AudioStreamPlayback> get_stream_playback();
AudioServer::PlaybackType get_playback_type() const;
void set_playback_type(AudioServer::PlaybackType p_playback_type);
AudioStreamPlayer2D();
~AudioStreamPlayer2D();
};