| 
				
				
					
				
				
				 | 
			
			 | 
			@@ -58,7 +58,7 @@ std::vector<int> StretchAudioSource::getSpectrumProcessOrder() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			void StretchAudioSource::setSpectrumProcessOrder(std::vector<int> order) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				std::lock_guard <decltype(m_mutex)> locker(m_mutex); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				ScopedLock locker(m_cs); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				m_specproc_order = order; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				for (int i = 0; i < m_stretchers.size(); ++i) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				{ | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -88,7 +88,7 @@ ValueTree StretchAudioSource::getStateTree() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			void StretchAudioSource::setStateTree(ValueTree state) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				std::lock_guard <decltype(m_mutex)> locker(m_mutex); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				ScopedLock locker(m_cs); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				getFromTreeProperties(state, "pitch_shift", m_ppar.pitch_shift.cents, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					"octaves_minus2", m_ppar.octave.om2, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					"octaves_minus1", m_ppar.octave.om1, | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -111,7 +111,7 @@ bool StretchAudioSource::isLoopingEnabled() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			void StretchAudioSource::setLoopingEnabled(bool b) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				std::lock_guard <decltype(m_mutex)> locker(m_mutex); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				ScopedLock locker(m_cs); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				if (m_inputfile != nullptr) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					m_inputfile->setLoopEnabled(b); | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -120,20 +120,21 @@ void StretchAudioSource::setLoopingEnabled(bool b) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			void StretchAudioSource::setAudioBufferAsInputSource(AudioBuffer<float>* buf, int sr, int len) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				std::lock_guard <decltype(m_mutex)> locker(m_mutex); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				ScopedLock locker(m_cs); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				m_inputfile->setAudioBuffer(buf, sr, len); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				m_seekpos = 0.0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				m_curfile = File(); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				if (m_playrange.isEmpty()) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					setPlayRange({ 0.0,1.0 }, true); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				++m_param_change_count; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			void StretchAudioSource::setMainVolume(double decibels) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				if (decibels == m_main_volume) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					return; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				std::lock_guard <decltype(m_mutex)> locker(m_mutex); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				ScopedLock locker(m_cs); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				m_main_volume = jlimit(-144.0, 12.0, decibels); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				++m_param_change_count; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -142,15 +143,14 @@ void StretchAudioSource::setLoopXFadeLength(double lenseconds) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				if (lenseconds == m_loopxfadelen) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					return; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				std::lock_guard <decltype(m_mutex)> locker(m_mutex); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				ScopedLock locker(m_cs); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				m_loopxfadelen = jlimit(0.0, 1.0, lenseconds); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				++m_param_change_count; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			void StretchAudioSource::getNextAudioBlock(const AudioSourceChannelInfo & bufferToFill) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				// for realtime play, this is assumed to be used with BufferingAudioSource, so mutex locking should not be too bad... | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				std::lock_guard <decltype(m_mutex)> locker(m_mutex); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				ScopedLock locker(m_cs); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				if (m_stretchoutringbuf.available() > 0) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					m_output_has_begun = true; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				bool freezing = m_freezing; | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -356,7 +356,7 @@ bool StretchAudioSource::isLooping() const | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			String StretchAudioSource::setAudioFile(File file) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				std::lock_guard <decltype(m_mutex)> locker(m_mutex); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				ScopedLock locker(m_cs); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				if (m_inputfile->openAudioFile(file)) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					m_curfile = file; | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -378,7 +378,7 @@ void StretchAudioSource::setNumOutChannels(int chans) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			void StretchAudioSource::initObjects() | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				std::lock_guard <decltype(m_mutex)> locker(m_mutex); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				ScopedLock locker(m_cs); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				m_inputfile->setActiveRange(m_playrange); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				m_inputfile->seek(m_seekpos); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				 | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -448,33 +448,31 @@ void StretchAudioSource::setRate(double rate) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				if (rate == m_playrate) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					return; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				std::lock_guard <decltype(m_mutex)> locker(m_mutex); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				//if (rate != m_lastplayrate) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				if (m_cs.tryEnter()) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					//m_output_counter = m_output_counter*rate; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					//m_output_length = (2*m_process_fftsize)+m_inputfile->getActiveRangeFrames().getLength()*rate; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					//Logger::writeToLog("new len " + String(m_output_length) + " new output pos " + String(m_output_counter)); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					m_playrate = rate; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					for (int i = 0; i < m_stretchers.size(); ++i) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
						m_stretchers[i]->set_rap((float)rate); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					++m_param_change_count; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				++m_param_change_count; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			void StretchAudioSource::setProcessParameters(ProcessParameters * pars) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				if (*pars == m_ppar) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					return; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				//SpinLock::ScopedLockType | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				std::lock_guard <decltype(m_mutex)> locker(m_mutex); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				m_ppar = *pars; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				for (int i = 0; i < m_stretchers.size(); ++i) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				if (m_cs.tryEnter()) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					m_stretchers[i]->set_parameters(pars); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					m_ppar = *pars; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					for (int i = 0; i < m_stretchers.size(); ++i) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
						m_stretchers[i]->set_parameters(pars); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					++m_param_change_count; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					m_cs.exit(); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				++m_param_change_count; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			const ProcessParameters& StretchAudioSource::getProcessParameters() | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -486,7 +484,7 @@ void StretchAudioSource::setFFTWindowingType(int windowtype) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (windowtype==m_fft_window_type) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				std::lock_guard <decltype(m_mutex)> locker(m_mutex); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				ScopedLock locker(m_cs); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    m_fft_window_type = windowtype; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    for (int i = 0; i < m_stretchers.size(); ++i) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    { | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -499,7 +497,7 @@ void StretchAudioSource::setFFTSize(int size) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    jassert(size>0); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (m_xfadetask.state == 0 && (m_process_fftsize == 0 || size != m_process_fftsize)) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					std::lock_guard <decltype(m_mutex)> locker(m_mutex); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					ScopedLock locker(m_cs); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					if (m_xfadetask.buffer.getNumChannels() < m_num_outchans) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
						m_xfadetask.buffer.setSize(m_num_outchans, m_xfadetask.buffer.getNumSamples()); | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -524,10 +522,10 @@ void StretchAudioSource::setFFTSize(int size) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			void StretchAudioSource::seekPercent(double pos) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				std::lock_guard <decltype(m_mutex)> locker(m_mutex); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				ScopedLock locker(m_cs); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				m_seekpos = pos; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				m_inputfile->seek(pos); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				++m_param_change_count; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			double StretchAudioSource::getOutputDurationSecondsForRange(Range<double> range, int fftsize) | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -540,31 +538,34 @@ double StretchAudioSource::getOutputDurationSecondsForRange(Range<double> range, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			void StretchAudioSource::setOnsetDetection(double x) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				std::lock_guard <decltype(m_mutex)> locker(m_mutex); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				ScopedLock locker(m_cs); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				m_onsetdetection = x; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				for (int i = 0; i < m_stretchers.size(); ++i) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					m_stretchers[i]->set_onset_detection_sensitivity((float)x); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				++m_param_change_count; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			void StretchAudioSource::setPlayRange(Range<double> playrange, bool isloop) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				if (m_playrange.isEmpty() == false && playrange == m_playrange) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					return; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				std::lock_guard <decltype(m_mutex)> locker(m_mutex); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				if (playrange.isEmpty()) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					m_playrange = { 0.0,1.0 }; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				else | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					m_playrange = playrange; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				m_stream_end_reached = false; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				m_inputfile->setActiveRange(m_playrange); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				m_inputfile->setLoopEnabled(isloop); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				if (m_playrange.contains(m_seekpos)==false) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					m_inputfile->seek(m_playrange.getStart()); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				m_seekpos = m_playrange.getStart(); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				++m_param_change_count; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				if (m_cs.tryEnter()) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				{ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					if (playrange.isEmpty()) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
						m_playrange = { 0.0,1.0 }; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					else | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
						m_playrange = playrange; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					m_stream_end_reached = false; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					m_inputfile->setActiveRange(m_playrange); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					m_inputfile->setLoopEnabled(isloop); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					if (m_playrange.contains(m_seekpos) == false) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
						m_inputfile->seek(m_playrange.getStart()); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					m_seekpos = m_playrange.getStart(); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					++m_param_change_count; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
					m_cs.exit(); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
				} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			bool StretchAudioSource::isLoopEnabled() | 
		
		
	
	
		
			
				| 
				
					
				
				
				
				 | 
			
			 | 
			
  |