From 726c98446aff62a782b98386d14f1c68c3865a53 Mon Sep 17 00:00:00 2001
From: Thomas Harte <thomas.harte@gmail.com>
Date: Tue, 15 Mar 2016 21:34:00 -0400
Subject: [PATCH] Fixed a couple of memory leaks, at least got as far as
 instantiating a filter.

---
 Outputs/Speaker.hpp | 33 +++++++++------------------------
 1 file changed, 9 insertions(+), 24 deletions(-)

diff --git a/Outputs/Speaker.hpp b/Outputs/Speaker.hpp
index 7a9d11b8e..9f57a9cc3 100644
--- a/Outputs/Speaker.hpp
+++ b/Outputs/Speaker.hpp
@@ -13,6 +13,7 @@
 #include <stdio.h>
 #include <time.h>
 #include "../SignalProcessing/Stepper.hpp"
+#include "../SignalProcessing/FIRFilter.hpp"
 
 namespace Outputs {
 
@@ -28,8 +29,7 @@ class Speaker {
 			_output_cycles_per_second = cycles_per_second;
 			if(_buffer_size != buffer_size)
 			{
-				delete[] _buffer_in_progress;
-				_buffer_in_progress = new int16_t[buffer_size];
+				_buffer_in_progress = std::unique_ptr<int16_t>(new int16_t[buffer_size]);
 				_buffer_size = buffer_size;
 			}
 			set_needs_updated_filter_coefficients();
@@ -55,13 +55,12 @@ class Speaker {
 		Speaker() : _buffer_in_progress_pointer(0) {}
 
 	protected:
-		int16_t *_buffer_in_progress;
+		std::unique_ptr<int16_t> _buffer_in_progress;
 		int _buffer_size;
 		int _buffer_in_progress_pointer;
 		int _number_of_taps;
 		bool _coefficients_are_dirty;
 		Delegate *_delegate;
-		SignalProcessing::Stepper *_stepper;
 
 		int _input_cycles_per_second, _output_cycles_per_second;
 
@@ -77,23 +76,12 @@ template <class T> class Filter: public Speaker {
 		{
 			if(_coefficients_are_dirty) update_filter_coefficients();
 
-//			_periodic_cycles += input_cycles;
-//			time_t time_now = time(nullptr);
-//			if(time_now > _periodic_start)
-//			{
-//				printf("input audio samples: %d\n", _periodic_cycles);
-//				printf("output audio samples: %d\n", _periodic_output);
-//				_periodic_cycles = 0;
-//				_periodic_output = 0;
-//				_periodic_start = time_now;
-//			}
-
 			// point sample for now, as a temporary measure
 			input_cycles += _input_cycles_carry;
 			while(input_cycles > 0)
 			{
 				// get a sample for the current location
-				static_cast<T *>(this)->get_samples(1, &_buffer_in_progress[_buffer_in_progress_pointer]);
+				static_cast<T *>(this)->get_samples(1, &_buffer_in_progress.get()[_buffer_in_progress_pointer]);
 				_buffer_in_progress_pointer++;
 
 				// announce to delegate if full
@@ -102,7 +90,7 @@ template <class T> class Filter: public Speaker {
 					_buffer_in_progress_pointer = 0;
 					if(_delegate)
 					{
-						_delegate->speaker_did_complete_samples(this, _buffer_in_progress, _buffer_size);
+						_delegate->speaker_did_complete_samples(this, _buffer_in_progress.get(), _buffer_size);
 					}
 				}
 
@@ -111,7 +99,6 @@ template <class T> class Filter: public Speaker {
 				if(steps > 1)
 					static_cast<T *>(this)->skip_samples((unsigned int)(steps-1));
 				input_cycles -= steps;
-//				_periodic_output ++;
 			}
 			_input_cycles_carry = input_cycles;
 		}
@@ -119,10 +106,8 @@ template <class T> class Filter: public Speaker {
 		Filter() {} // _periodic_cycles(0), _periodic_start(0)
 
 	private:
-//				time_t _periodic_start;
-//				int _periodic_cycles;
-//				int _periodic_output;
-		SignalProcessing::Stepper *_stepper;
+		std::unique_ptr<SignalProcessing::Stepper> _stepper;
+		std::unique_ptr<SignalProcessing::FIRFilter> _filter;
 		int _input_cycles_carry;
 
 		void update_filter_coefficients()
@@ -130,8 +115,8 @@ template <class T> class Filter: public Speaker {
 			_coefficients_are_dirty = false;
 			_buffer_in_progress_pointer = 0;
 
-			delete _stepper;
-			_stepper = new SignalProcessing::Stepper((uint64_t)_input_cycles_per_second, (uint64_t)_output_cycles_per_second);
+			_stepper = std::unique_ptr<SignalProcessing::Stepper>(new SignalProcessing::Stepper((uint64_t)_input_cycles_per_second, (uint64_t)_output_cycles_per_second));
+			_filter = std::unique_ptr<SignalProcessing::FIRFilter>(new SignalProcessing::FIRFilter((unsigned int)_number_of_taps, (unsigned int)_input_cycles_per_second, 0.0, (float)_output_cycles_per_second / 2.0f, SignalProcessing::FIRFilter::DefaultAttenuation));
 		}
 };