Forráskód Böngészése

Fix AudioEffectRecord circular reference

(cherry picked from commit ae1b209d6e5d86e4924338f8bffebe2f45d21698)
Wilson E. Alvarez 2 éve
szülő
commit
2eaa385a64

+ 19 - 18
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<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();
 }

+ 1 - 5
servers/audio/effects/audio_effect_record.h

@@ -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