Discern between virtual and abstract class bindings
* Previous "virtual" classes (which can't be instantiated) are not corretly named "abstract". * Added a new "virtual" category for classes, they can't be instantiated from the editor, but can be inherited from script and extensions. * Converted a large amount of classes from "abstract" to "virtual" where it makes sense. Most classes that make sense have been converted. Missing: * Physics servers * VideoStream * Script* classes. which will go in a separate PR due to the complexity involved.
This commit is contained in:
parent
741bbb9d7c
commit
6f51eca1e3
90 changed files with 1075 additions and 272 deletions
|
|
@ -30,5 +30,36 @@
|
|||
|
||||
#include "audio_effect.h"
|
||||
|
||||
void AudioEffectInstance::process(const AudioFrame *p_src_frames, AudioFrame *p_dst_frames, int p_frame_count) {
|
||||
if (GDVIRTUAL_REQUIRED_CALL(_process, p_src_frames, p_dst_frames, p_frame_count)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
bool AudioEffectInstance::process_silence() const {
|
||||
bool ret;
|
||||
if (GDVIRTUAL_CALL(_process_silence, ret)) {
|
||||
return ret;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void AudioEffectInstance::_bind_methods() {
|
||||
GDVIRTUAL_BIND(_process, "src_buffer", "dst_buffer", "frame_count");
|
||||
GDVIRTUAL_BIND(_process_silence);
|
||||
}
|
||||
|
||||
////
|
||||
|
||||
Ref<AudioEffectInstance> AudioEffect::instantiate() {
|
||||
Ref<AudioEffectInstance> ret;
|
||||
if (GDVIRTUAL_REQUIRED_CALL(_instantiate, ret)) {
|
||||
return ret;
|
||||
}
|
||||
return Ref<AudioEffectInstance>();
|
||||
}
|
||||
void AudioEffect::_bind_methods() {
|
||||
GDVIRTUAL_BIND(_instantiate);
|
||||
}
|
||||
|
||||
AudioEffect::AudioEffect() {
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,20 +33,32 @@
|
|||
|
||||
#include "core/io/resource.h"
|
||||
#include "core/math/audio_frame.h"
|
||||
#include "core/object/gdvirtual.gen.inc"
|
||||
#include "core/object/script_language.h"
|
||||
#include "core/variant/native_ptr.h"
|
||||
|
||||
class AudioEffectInstance : public RefCounted {
|
||||
GDCLASS(AudioEffectInstance, RefCounted);
|
||||
|
||||
protected:
|
||||
GDVIRTUAL3(_process, GDNativeConstPtr<AudioFrame>, GDNativePtr<AudioFrame>, int)
|
||||
GDVIRTUAL0RC(bool, _process_silence)
|
||||
static void _bind_methods();
|
||||
|
||||
public:
|
||||
virtual void process(const AudioFrame *p_src_frames, AudioFrame *p_dst_frames, int p_frame_count) = 0;
|
||||
virtual bool process_silence() const { return false; }
|
||||
virtual void process(const AudioFrame *p_src_frames, AudioFrame *p_dst_frames, int p_frame_count);
|
||||
virtual bool process_silence() const;
|
||||
};
|
||||
|
||||
class AudioEffect : public Resource {
|
||||
GDCLASS(AudioEffect, Resource);
|
||||
|
||||
protected:
|
||||
GDVIRTUAL0R(Ref<AudioEffectInstance>, _instantiate)
|
||||
static void _bind_methods();
|
||||
|
||||
public:
|
||||
virtual Ref<AudioEffectInstance> instantiate() = 0;
|
||||
virtual Ref<AudioEffectInstance> instantiate();
|
||||
AudioEffect();
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -76,10 +76,10 @@ void AudioStreamPlayback::seek(float p_time) {
|
|||
|
||||
int AudioStreamPlayback::mix(AudioFrame *p_buffer, float p_rate_scale, int p_frames) {
|
||||
int ret;
|
||||
if (GDVIRTUAL_CALL(_mix, p_buffer, p_rate_scale, p_frames, ret)) {
|
||||
if (GDVIRTUAL_REQUIRED_CALL(_mix, p_buffer, p_rate_scale, p_frames, ret)) {
|
||||
return ret;
|
||||
}
|
||||
WARN_PRINT_ONCE("AudioStreamPlayback::mix unimplemented!");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -94,7 +94,7 @@ void AudioStreamPlayback::_bind_methods() {
|
|||
}
|
||||
//////////////////////////////
|
||||
|
||||
void AudioStreamPlaybackResampled::_begin_resample() {
|
||||
void AudioStreamPlaybackResampled::begin_resample() {
|
||||
//clear cubic interpolation history
|
||||
internal_buffer[0] = AudioFrame(0.0, 0.0);
|
||||
internal_buffer[1] = AudioFrame(0.0, 0.0);
|
||||
|
|
@ -105,6 +105,30 @@ void AudioStreamPlaybackResampled::_begin_resample() {
|
|||
mix_offset = 0;
|
||||
}
|
||||
|
||||
int AudioStreamPlaybackResampled::_mix_internal(AudioFrame *p_buffer, int p_frames) {
|
||||
int ret;
|
||||
if (GDVIRTUAL_REQUIRED_CALL(_mix_resampled, p_buffer, p_frames, ret)) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
float AudioStreamPlaybackResampled::get_stream_sampling_rate() {
|
||||
float ret;
|
||||
if (GDVIRTUAL_REQUIRED_CALL(_get_stream_sampling_rate, ret)) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void AudioStreamPlaybackResampled::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("begin_resample"), &AudioStreamPlaybackResampled::begin_resample);
|
||||
|
||||
GDVIRTUAL_BIND(_mix_resampled, "dst_buffer", "frame_count");
|
||||
GDVIRTUAL_BIND(_get_stream_sampling_rate);
|
||||
}
|
||||
|
||||
int AudioStreamPlaybackResampled::mix(AudioFrame *p_buffer, float p_rate_scale, int p_frames) {
|
||||
float target_rate = AudioServer::get_singleton()->get_mix_rate();
|
||||
float playback_speed_scale = AudioServer::get_singleton()->get_playback_speed_scale();
|
||||
|
|
@ -315,7 +339,7 @@ void AudioStreamPlaybackMicrophone::start(float p_from_pos) {
|
|||
|
||||
if (AudioDriver::get_singleton()->capture_start() == OK) {
|
||||
active = true;
|
||||
_begin_resample();
|
||||
begin_resample();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -81,10 +81,15 @@ class AudioStreamPlaybackResampled : public AudioStreamPlayback {
|
|||
uint64_t mix_offset;
|
||||
|
||||
protected:
|
||||
void _begin_resample();
|
||||
void begin_resample();
|
||||
// Returns the number of frames that were mixed.
|
||||
virtual int _mix_internal(AudioFrame *p_buffer, int p_frames) = 0;
|
||||
virtual float get_stream_sampling_rate() = 0;
|
||||
virtual int _mix_internal(AudioFrame *p_buffer, int p_frames);
|
||||
virtual float get_stream_sampling_rate();
|
||||
|
||||
GDVIRTUAL2R(int, _mix_resampled, GDNativePtr<AudioFrame>, int)
|
||||
GDVIRTUAL0RC(float, _get_stream_sampling_rate)
|
||||
|
||||
static void _bind_methods();
|
||||
|
||||
public:
|
||||
virtual int mix(AudioFrame *p_buffer, float p_rate_scale, int p_frames) override;
|
||||
|
|
|
|||
|
|
@ -169,7 +169,7 @@ float AudioStreamGeneratorPlayback::get_stream_sampling_rate() {
|
|||
|
||||
void AudioStreamGeneratorPlayback::start(float p_from_pos) {
|
||||
if (mixed == 0.0) {
|
||||
_begin_resample();
|
||||
begin_resample();
|
||||
}
|
||||
skips = 0;
|
||||
active = true;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue