Browse Source

Merge pull request #15223 from ibrahn/ogg-data-leak-fix

free associated audio data on AudioStreamOGGVorbis destruction
Rémi Verschelde 7 years ago
parent
commit
c4c1ca9cb1

+ 15 - 0
modules/stb_vorbis/audio_stream_ogg_vorbis.cpp

@@ -164,6 +164,14 @@ String AudioStreamOGGVorbis::get_stream_name() const {
 	return ""; //return stream_name;
 	return ""; //return stream_name;
 }
 }
 
 
+void AudioStreamOGGVorbis::clear_data() {
+	if (data) {
+		AudioServer::get_singleton()->audio_data_free(data);
+		data = NULL;
+		data_len = 0;
+	}
+}
+
 void AudioStreamOGGVorbis::set_data(const PoolVector<uint8_t> &p_data) {
 void AudioStreamOGGVorbis::set_data(const PoolVector<uint8_t> &p_data) {
 
 
 	int src_data_len = p_data.size();
 	int src_data_len = p_data.size();
@@ -209,6 +217,9 @@ void AudioStreamOGGVorbis::set_data(const PoolVector<uint8_t> &p_data) {
 			length = stb_vorbis_stream_length_in_seconds(ogg_stream);
 			length = stb_vorbis_stream_length_in_seconds(ogg_stream);
 			stb_vorbis_close(ogg_stream);
 			stb_vorbis_close(ogg_stream);
 
 
+			// free any existing data
+			clear_data();
+
 			data = AudioServer::get_singleton()->audio_data_alloc(src_data_len, src_datar.ptr());
 			data = AudioServer::get_singleton()->audio_data_alloc(src_data_len, src_datar.ptr());
 			data_len = src_data_len;
 			data_len = src_data_len;
 
 
@@ -275,3 +286,7 @@ AudioStreamOGGVorbis::AudioStreamOGGVorbis() {
 	decode_mem_size = 0;
 	decode_mem_size = 0;
 	loop = false;
 	loop = false;
 }
 }
+
+AudioStreamOGGVorbis::~AudioStreamOGGVorbis() {
+	clear_data();
+}

+ 2 - 0
modules/stb_vorbis/audio_stream_ogg_vorbis.h

@@ -93,6 +93,7 @@ class AudioStreamOGGVorbis : public AudioStream {
 	float length;
 	float length;
 	bool loop;
 	bool loop;
 	float loop_offset;
 	float loop_offset;
+	void clear_data();
 
 
 protected:
 protected:
 	static void _bind_methods();
 	static void _bind_methods();
@@ -111,6 +112,7 @@ public:
 	PoolVector<uint8_t> get_data() const;
 	PoolVector<uint8_t> get_data() const;
 
 
 	AudioStreamOGGVorbis();
 	AudioStreamOGGVorbis();
+	virtual ~AudioStreamOGGVorbis();
 };
 };
 
 
 #endif
 #endif