Fix AudioEffectRecord circular reference

This commit is contained in:
Wilson E. Alvarez 2023-03-16 10:30:43 -04:00
parent 26a584179c
commit ae1b209d6e
No known key found for this signature in database
GPG key ID: A32174A3D2ED3F9E
2 changed files with 20 additions and 23 deletions

View file

@ -67,11 +67,6 @@ bool AudioEffectRecordInstance::process_silence() const {
void AudioEffectRecordInstance::_io_thread_process() { void AudioEffectRecordInstance::_io_thread_process() {
while (is_recording) { while (is_recording) {
//Check: The current recording has been requested to stop
if (!base->recording_active) {
is_recording = false;
}
_update_buffer(); _update_buffer();
if (is_recording) { if (is_recording) {
@ -119,6 +114,7 @@ void AudioEffectRecordInstance::init() {
} }
void AudioEffectRecordInstance::finish() { void AudioEffectRecordInstance::finish() {
is_recording = false;
#ifdef NO_THREADS #ifdef NO_THREADS
AudioServer::get_singleton()->remove_update_callback(&AudioEffectRecordInstance::_update, this); AudioServer::get_singleton()->remove_update_callback(&AudioEffectRecordInstance::_update, this);
#else #else
@ -126,14 +122,9 @@ void AudioEffectRecordInstance::finish() {
#endif #endif
} }
AudioEffectRecordInstance::~AudioEffectRecordInstance() {
finish();
}
Ref<AudioEffectInstance> AudioEffectRecord::instance() { Ref<AudioEffectInstance> AudioEffectRecord::instance() {
Ref<AudioEffectRecordInstance> ins; Ref<AudioEffectRecordInstance> ins;
ins.instance(); ins.instance();
ins->base = Ref<AudioEffectRecord>(this);
ins->is_recording = false; ins->is_recording = false;
//Re-using the buffer size calculations from audio_effect_delay.cpp //Re-using the buffer size calculations from audio_effect_delay.cpp
@ -159,16 +150,19 @@ Ref<AudioEffectInstance> AudioEffectRecord::instance() {
ins->ring_buffer_read_pos = 0; ins->ring_buffer_read_pos = 0;
ensure_thread_stopped(); ensure_thread_stopped();
current_instance = ins; bool is_currently_recording = false;
if (recording_active) { if (current_instance != nullptr) {
is_currently_recording = current_instance->is_recording;
}
if (is_currently_recording) {
ins->init(); ins->init();
} }
current_instance = ins;
return ins; return ins;
} }
void AudioEffectRecord::ensure_thread_stopped() { void AudioEffectRecord::ensure_thread_stopped() {
recording_active = false;
if (current_instance != nullptr) { if (current_instance != nullptr) {
current_instance->finish(); current_instance->finish();
} }
@ -178,20 +172,24 @@ void AudioEffectRecord::set_recording_active(bool p_record) {
if (p_record) { if (p_record) {
if (current_instance == nullptr) { if (current_instance == nullptr) {
WARN_PRINT("Recording should not be set as active before Godot has initialized."); WARN_PRINT("Recording should not be set as active before Godot has initialized.");
recording_active = false;
return; return;
} }
ensure_thread_stopped(); ensure_thread_stopped();
recording_active = true;
current_instance->init(); current_instance->init();
} else { } else {
recording_active = false; if (current_instance != nullptr) {
current_instance->is_recording = false;
}
} }
} }
bool AudioEffectRecord::is_recording_active() const { 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) { void AudioEffectRecord::set_format(AudioStreamSample::Format p_format) {
@ -289,5 +287,8 @@ void AudioEffectRecord::_bind_methods() {
AudioEffectRecord::AudioEffectRecord() { AudioEffectRecord::AudioEffectRecord() {
format = AudioStreamSample::FORMAT_16_BITS; format = AudioStreamSample::FORMAT_16_BITS;
recording_active = false; }
AudioEffectRecord::~AudioEffectRecord() {
ensure_thread_stopped();
} }

View file

@ -45,7 +45,6 @@ class AudioEffectRecord;
class AudioEffectRecordInstance : public AudioEffectInstance { class AudioEffectRecordInstance : public AudioEffectInstance {
GDCLASS(AudioEffectRecordInstance, AudioEffectInstance); GDCLASS(AudioEffectRecordInstance, AudioEffectInstance);
friend class AudioEffectRecord; friend class AudioEffectRecord;
Ref<AudioEffectRecord> base;
bool is_recording; bool is_recording;
Thread io_thread; Thread io_thread;
@ -68,9 +67,6 @@ public:
void finish(); void finish();
virtual void process(const AudioFrame *p_src_frames, AudioFrame *p_dst_frames, int p_frame_count); virtual void process(const AudioFrame *p_src_frames, AudioFrame *p_dst_frames, int p_frame_count);
virtual bool process_silence() const; virtual bool process_silence() const;
AudioEffectRecordInstance() {}
~AudioEffectRecordInstance();
}; };
class AudioEffectRecord : public AudioEffect { class AudioEffectRecord : public AudioEffect {
@ -82,7 +78,6 @@ class AudioEffectRecord : public AudioEffect {
IO_BUFFER_SIZE_MS = 1500 IO_BUFFER_SIZE_MS = 1500
}; };
bool recording_active;
Ref<AudioEffectRecordInstance> current_instance; Ref<AudioEffectRecordInstance> current_instance;
AudioStreamSample::Format format; AudioStreamSample::Format format;
@ -101,6 +96,7 @@ public:
Ref<AudioStreamSample> get_recording() const; Ref<AudioStreamSample> get_recording() const;
AudioEffectRecord(); AudioEffectRecord();
~AudioEffectRecord();
}; };
#endif // AUDIO_EFFECT_RECORD_H #endif // AUDIO_EFFECT_RECORD_H