summaryrefslogtreecommitdiff
path: root/servers
diff options
context:
space:
mode:
Diffstat (limited to 'servers')
-rw-r--r--servers/audio/audio_effect.cpp31
-rw-r--r--servers/audio/audio_effect.h18
-rw-r--r--servers/audio/audio_stream.cpp32
-rw-r--r--servers/audio/audio_stream.h11
-rw-r--r--servers/audio/effects/audio_stream_generator.cpp2
-rw-r--r--servers/register_server_types.cpp32
6 files changed, 99 insertions, 27 deletions
diff --git a/servers/audio/audio_effect.cpp b/servers/audio/audio_effect.cpp
index b9eca14a4c..f38d0adfb2 100644
--- a/servers/audio/audio_effect.cpp
+++ b/servers/audio/audio_effect.cpp
@@ -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() {
}
diff --git a/servers/audio/audio_effect.h b/servers/audio/audio_effect.h
index 00a5d6c004..3a0578679d 100644
--- a/servers/audio/audio_effect.h
+++ b/servers/audio/audio_effect.h
@@ -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();
};
diff --git a/servers/audio/audio_stream.cpp b/servers/audio/audio_stream.cpp
index a710658bff..1ebd57fa7f 100644
--- a/servers/audio/audio_stream.cpp
+++ b/servers/audio/audio_stream.cpp
@@ -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();
}
}
diff --git a/servers/audio/audio_stream.h b/servers/audio/audio_stream.h
index ce9bcabb9c..55031dec2c 100644
--- a/servers/audio/audio_stream.h
+++ b/servers/audio/audio_stream.h
@@ -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;
diff --git a/servers/audio/effects/audio_stream_generator.cpp b/servers/audio/effects/audio_stream_generator.cpp
index 6c917f3eb6..a3d615b925 100644
--- a/servers/audio/effects/audio_stream_generator.cpp
+++ b/servers/audio/effects/audio_stream_generator.cpp
@@ -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;
diff --git a/servers/register_server_types.cpp b/servers/register_server_types.cpp
index f405dea770..6848620b48 100644
--- a/servers/register_server_types.cpp
+++ b/servers/register_server_types.cpp
@@ -110,7 +110,7 @@ void preregister_server_types() {
shader_types = memnew(ShaderTypes);
GDREGISTER_CLASS(TextServerManager);
- GDREGISTER_VIRTUAL_CLASS(TextServer);
+ GDREGISTER_ABSTRACT_CLASS(TextServer);
GDREGISTER_CLASS(TextServerExtension);
Engine::get_singleton()->add_singleton(Engine::Singleton("TextServerManager", TextServerManager::get_singleton(), "TextServerManager"));
@@ -119,20 +119,20 @@ void preregister_server_types() {
void register_server_types() {
OS::get_singleton()->set_has_server_feature_callback(has_server_feature_callback);
- GDREGISTER_VIRTUAL_CLASS(DisplayServer);
- GDREGISTER_VIRTUAL_CLASS(RenderingServer);
+ GDREGISTER_ABSTRACT_CLASS(DisplayServer);
+ GDREGISTER_ABSTRACT_CLASS(RenderingServer);
GDREGISTER_CLASS(AudioServer);
- GDREGISTER_VIRTUAL_CLASS(PhysicsServer2D);
- GDREGISTER_VIRTUAL_CLASS(PhysicsServer3D);
- GDREGISTER_VIRTUAL_CLASS(NavigationServer2D);
- GDREGISTER_VIRTUAL_CLASS(NavigationServer3D);
+ GDREGISTER_ABSTRACT_CLASS(PhysicsServer2D);
+ GDREGISTER_ABSTRACT_CLASS(PhysicsServer3D);
+ GDREGISTER_ABSTRACT_CLASS(NavigationServer2D);
+ GDREGISTER_ABSTRACT_CLASS(NavigationServer3D);
GDREGISTER_CLASS(XRServer);
GDREGISTER_CLASS(CameraServer);
- GDREGISTER_VIRTUAL_CLASS(RenderingDevice);
+ GDREGISTER_ABSTRACT_CLASS(RenderingDevice);
- GDREGISTER_VIRTUAL_CLASS(XRInterface);
+ GDREGISTER_ABSTRACT_CLASS(XRInterface);
GDREGISTER_CLASS(XRInterfaceExtension); // can't register this as virtual because we need a creation function for our extensions.
GDREGISTER_CLASS(XRPose);
GDREGISTER_CLASS(XRPositionalTracker);
@@ -149,7 +149,7 @@ void register_server_types() {
GDREGISTER_CLASS(AudioBusLayout);
GDREGISTER_CLASS(AudioStreamGenerator);
- GDREGISTER_VIRTUAL_CLASS(AudioStreamGeneratorPlayback);
+ GDREGISTER_ABSTRACT_CLASS(AudioStreamGeneratorPlayback);
{
//audio effects
@@ -183,12 +183,12 @@ void register_server_types() {
GDREGISTER_CLASS(AudioEffectRecord);
GDREGISTER_CLASS(AudioEffectSpectrumAnalyzer);
- GDREGISTER_VIRTUAL_CLASS(AudioEffectSpectrumAnalyzerInstance);
+ GDREGISTER_ABSTRACT_CLASS(AudioEffectSpectrumAnalyzerInstance);
GDREGISTER_CLASS(AudioEffectCapture);
}
- GDREGISTER_VIRTUAL_CLASS(RenderingDevice);
+ GDREGISTER_ABSTRACT_CLASS(RenderingDevice);
GDREGISTER_CLASS(RDTextureFormat);
GDREGISTER_CLASS(RDTextureView);
GDREGISTER_CLASS(RDAttachmentFormat);
@@ -208,16 +208,16 @@ void register_server_types() {
GDREGISTER_CLASS(CameraFeed);
- GDREGISTER_VIRTUAL_CLASS(PhysicsDirectBodyState2D);
- GDREGISTER_VIRTUAL_CLASS(PhysicsDirectSpaceState2D);
+ GDREGISTER_ABSTRACT_CLASS(PhysicsDirectBodyState2D);
+ GDREGISTER_ABSTRACT_CLASS(PhysicsDirectSpaceState2D);
GDREGISTER_CLASS(PhysicsRayQueryParameters2D);
GDREGISTER_CLASS(PhysicsPointQueryParameters2D);
GDREGISTER_CLASS(PhysicsShapeQueryParameters2D);
GDREGISTER_CLASS(PhysicsTestMotionParameters2D);
GDREGISTER_CLASS(PhysicsTestMotionResult2D);
- GDREGISTER_VIRTUAL_CLASS(PhysicsDirectBodyState3D);
- GDREGISTER_VIRTUAL_CLASS(PhysicsDirectSpaceState3D);
+ GDREGISTER_ABSTRACT_CLASS(PhysicsDirectBodyState3D);
+ GDREGISTER_ABSTRACT_CLASS(PhysicsDirectSpaceState3D);
GDREGISTER_CLASS(PhysicsRayQueryParameters3D);
GDREGISTER_CLASS(PhysicsPointQueryParameters3D);
GDREGISTER_CLASS(PhysicsShapeQueryParameters3D);