Merge pull request #74986 from Rubonnek/fix-audio-effect-leak
[3.x] Fix AudioEffectRecord circular reference
This commit is contained in:
commit
7ce807a9c5
2 changed files with 20 additions and 23 deletions
|
@ -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<AudioEffectInstance> AudioEffectRecord::instance() {
|
||||
Ref<AudioEffectRecordInstance> ins;
|
||||
ins.instance();
|
||||
ins->base = Ref<AudioEffectRecord>(this);
|
||||
ins->is_recording = false;
|
||||
|
||||
//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;
|
||||
|
||||
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();
|
||||
}
|
||||
|
|
|
@ -45,7 +45,6 @@ class AudioEffectRecord;
|
|||
class AudioEffectRecordInstance : public AudioEffectInstance {
|
||||
GDCLASS(AudioEffectRecordInstance, AudioEffectInstance);
|
||||
friend class AudioEffectRecord;
|
||||
Ref<AudioEffectRecord> 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<AudioEffectRecordInstance> current_instance;
|
||||
|
||||
AudioStreamSample::Format format;
|
||||
|
@ -101,6 +96,7 @@ public:
|
|||
Ref<AudioStreamSample> get_recording() const;
|
||||
|
||||
AudioEffectRecord();
|
||||
~AudioEffectRecord();
|
||||
};
|
||||
|
||||
#endif // AUDIO_EFFECT_RECORD_H
|
||||
|
|
Loading…
Reference in a new issue