changeset 110:71e5f393b727

debugging TimeStretchFilter - adding safety margin to buffers
author lbajardsilogic
date Mon, 17 Sep 2007 08:07:23 +0000
parents 6249d87b3780
children 9cd248a25b74
files sv/audioio/AudioCallbackPlaySource.cpp sv/filter/TimeStretchFilter.cpp
diffstat 2 files changed, 30 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/sv/audioio/AudioCallbackPlaySource.cpp	Fri Sep 14 16:50:30 2007 +0000
+++ b/sv/audioio/AudioCallbackPlaySource.cpp	Mon Sep 17 08:07:23 2007 +0000
@@ -33,7 +33,8 @@
 //#define DEBUG_AUDIO_PLAY_SOURCE 1
 //#define DEBUG_AUDIO_PLAY_SOURCE_PLAYING 1
 
-const size_t AudioCallbackPlaySource::m_ringBufferSize = 131071;
+//const size_t AudioCallbackPlaySource::m_ringBufferSize = 131071;
+const size_t AudioCallbackPlaySource::m_ringBufferSize = 1764000;
 
 AudioCallbackPlaySource::AudioCallbackPlaySource(ViewManager *manager) :
     m_viewManager(manager),
@@ -1558,6 +1559,20 @@
 	{
 		ib[c] = (float*) malloc(required*sizeof(float));
 		RingBuffer<float> *rb = getReadRingBuffer(c);
+		if (!rb) {
+            std::cerr << "WARNING: AudioCallbackPlaySource::applyRealTimeFilters: "
+                      << "No ring buffer available for channel " << c
+                      << ", returning no data here" << std::endl;
+            return;
+        }
+		size_t rs = rb->getReadSpace();
+		if (rs < required) {
+			std::cerr << "WARNING: AudioCallbackPlaySource::applyRealTimeFilters: "
+                      << "Ring buffer for channel " << c << " has only "
+                      << rs << " (of " << got << ") samples available, "
+                      << "exit" << std::endl;
+			return;
+		}
         if (rb) {
 			size_t gotHere = rb->peek(ib[c], got);
 			if (gotHere < got)
--- a/sv/filter/TimeStretchFilter.cpp	Fri Sep 14 16:50:30 2007 +0000
+++ b/sv/filter/TimeStretchFilter.cpp	Mon Sep 17 08:07:23 2007 +0000
@@ -61,7 +61,7 @@
 {
 	m_hop = m_framesize/4;
 
-	m_inputBuffer = (float *)calloc(((m_framesize-1)*2 + 1 + m_hop), sizeof(float));
+	m_inputBuffer = (float *)calloc(m_framesize*3, sizeof(float));
 	
 	/**********malloc***********/
 	FFTframe=(float *)calloc((m_framesize), sizeof(float));
@@ -232,6 +232,12 @@
 	} else if (name == "Peaklock"){
 		m_peakcheck = (value > 0) ? true : false;
 	}
+#ifdef DEBUG_FILTERS
+	std::cerr << "TimeStretchFilter::hopfactor = " << hopfactor << std::endl;
+	std::cerr << "TimeStretchFilter::m_interpfactor = " << m_interpfactor << std::endl;
+	std::cerr << "TimeStretchFilter::m_hop = " << m_hop << std::endl;
+	std::cerr << "TimeStretchFilter::skip = " << getRequiredSkipSamples() << std::endl;
+#endif
 
 }
 
@@ -247,7 +253,7 @@
 
 	int currentposition = m_hop;
 
-	if (samples < floor((m_framesize-1)*m_interpfactor + 1 + m_hop))
+	if ( samples < floor(m_framesize*(m_interpfactor + 1)) )
 		return;
 
 	int channel = getSourceChannelCount();
@@ -370,16 +376,17 @@
 
 	int channel = getSourceChannelCount();
 
-	for (int i=0; i<samples; i++){
-		output[0][i] = outbuffer[i];
-		if (channel > 1)
-			output[1][i] = outbuffer[i];
+	for (size_t ch = 0; ch < channel; ++ch) 
+	{
+		for (size_t i = 0; i < samples; ++i) {
+			output[ch][i] = outbuffer[i];
+		}
 	}
 }
 
 size_t TimeStretchFilter::getRequiredInputSamples(size_t outputSamplesNeeded)
 {
-	size_t need = floor((m_framesize-1)*m_interpfactor + 1 + m_hop);
+	size_t need = floor(m_framesize*(m_interpfactor + 1));
 	return need;
 }
 
@@ -395,6 +402,5 @@
 	{		
 			skip = m_hop;
 	}
-
 	return skip;
 }
\ No newline at end of file