Merge pull request #91382 from adamscott/sample-player
Add sample playback support
This commit is contained in:
@ -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"));
|
||||
}
|
||||
|
||||
@ -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();
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user