diff --git a/servers/audio/effects/audio_effect_record.cpp b/servers/audio/effects/audio_effect_record.cpp index 1f274c0570c..912693c434b 100644 --- a/servers/audio/effects/audio_effect_record.cpp +++ b/servers/audio/effects/audio_effect_record.cpp @@ -67,11 +67,6 @@ bool AudioEffectRecordInstance::process_silence() const { void AudioEffectRecordInstance::_io_thread_process() { while (is_recording) { - //Check: The current recording has been requested to stop - if (!base->recording_active) { - is_recording = false; - } - _update_buffer(); if (is_recording) { @@ -119,6 +114,7 @@ void AudioEffectRecordInstance::init() { } void AudioEffectRecordInstance::finish() { + is_recording = false; #ifdef NO_THREADS AudioServer::get_singleton()->remove_update_callback(&AudioEffectRecordInstance::_update, this); #else @@ -126,14 +122,9 @@ void AudioEffectRecordInstance::finish() { #endif } -AudioEffectRecordInstance::~AudioEffectRecordInstance() { - finish(); -} - Ref AudioEffectRecord::instance() { Ref ins; ins.instance(); - ins->base = Ref(this); ins->is_recording = false; //Re-using the buffer size calculations from audio_effect_delay.cpp @@ -159,16 +150,19 @@ Ref AudioEffectRecord::instance() { ins->ring_buffer_read_pos = 0; ensure_thread_stopped(); - current_instance = ins; - if (recording_active) { + bool is_currently_recording = false; + if (current_instance != nullptr) { + is_currently_recording = current_instance->is_recording; + } + if (is_currently_recording) { ins->init(); } + current_instance = ins; return ins; } void AudioEffectRecord::ensure_thread_stopped() { - recording_active = false; if (current_instance != nullptr) { current_instance->finish(); } @@ -178,20 +172,24 @@ void AudioEffectRecord::set_recording_active(bool p_record) { if (p_record) { if (current_instance == nullptr) { WARN_PRINT("Recording should not be set as active before Godot has initialized."); - recording_active = false; return; } ensure_thread_stopped(); - recording_active = true; current_instance->init(); } else { - recording_active = false; + if (current_instance != nullptr) { + current_instance->is_recording = false; + } } } bool AudioEffectRecord::is_recording_active() const { - return recording_active; + if (current_instance != nullptr) { + return current_instance->is_recording; + } else { + return false; + } } void AudioEffectRecord::set_format(AudioStreamSample::Format p_format) { @@ -289,5 +287,8 @@ void AudioEffectRecord::_bind_methods() { AudioEffectRecord::AudioEffectRecord() { format = AudioStreamSample::FORMAT_16_BITS; - recording_active = false; +} + +AudioEffectRecord::~AudioEffectRecord() { + ensure_thread_stopped(); } diff --git a/servers/audio/effects/audio_effect_record.h b/servers/audio/effects/audio_effect_record.h index ecb74e59d9e..f45e7bbd499 100644 --- a/servers/audio/effects/audio_effect_record.h +++ b/servers/audio/effects/audio_effect_record.h @@ -45,7 +45,6 @@ class AudioEffectRecord; class AudioEffectRecordInstance : public AudioEffectInstance { GDCLASS(AudioEffectRecordInstance, AudioEffectInstance); friend class AudioEffectRecord; - Ref base; bool is_recording; Thread io_thread; @@ -68,9 +67,6 @@ public: void finish(); virtual void process(const AudioFrame *p_src_frames, AudioFrame *p_dst_frames, int p_frame_count); virtual bool process_silence() const; - - AudioEffectRecordInstance() {} - ~AudioEffectRecordInstance(); }; class AudioEffectRecord : public AudioEffect { @@ -82,7 +78,6 @@ class AudioEffectRecord : public AudioEffect { IO_BUFFER_SIZE_MS = 1500 }; - bool recording_active; Ref current_instance; AudioStreamSample::Format format; @@ -101,6 +96,7 @@ public: Ref get_recording() const; AudioEffectRecord(); + ~AudioEffectRecord(); }; #endif // AUDIO_EFFECT_RECORD_H