diff sv/audioio/AudioCallbackPlaySource.cpp @ 82:8ebc85f6ce4e

integrate Pitch-Time scaling filter from DIT
author lbajardsilogic
date Fri, 22 Jun 2007 09:54:00 +0000
parents afcf540ae3a2
children 51a12971e10e
line wrap: on
line diff
--- a/sv/audioio/AudioCallbackPlaySource.cpp	Thu Jun 21 15:37:55 2007 +0000
+++ b/sv/audioio/AudioCallbackPlaySource.cpp	Fri Jun 22 09:54:00 2007 +0000
@@ -45,7 +45,7 @@
     m_bufferScavenger(1),
     m_sourceChannelCount(0),
     m_blockSize(1024),
-    m_sourceSampleRate(0),
+	m_sourceSampleRate(0),
     m_targetSampleRate(0),
     m_playLatency(0),
     m_playing(false),
@@ -1472,7 +1472,49 @@
 {
 	if (!m_filterStack) return;
 
-	m_filterStack->putInput(buffers, count);
+	size_t required = m_filterStack->getRequiredInputSamples(count);
+
+	if (required <= count)
+	{
+		m_filterStack->putInput(buffers, count);
+		
+	} else 
+	{
+		size_t missing = required - count;
+
+		size_t channels = getTargetChannelCount();
+
+		size_t got = required;
+
+		float **ib = (float**) malloc(channels*sizeof(float*));
+        
+        for (size_t c = 0; c < channels; ++c) {
+			ib[c] = (float*) malloc(required*sizeof(float));
+			for (int i=0; i<count; i++)
+			{
+				ib[c][i] = buffers[c][i];
+			}
+            RingBuffer<float> *rb = getReadRingBuffer(c);
+            if (rb) {
+				size_t gotHere = rb->peek(ib[c]+count, missing);
+				if (gotHere < got)
+					got = gotHere;
+			}
+        }
+		if (got < missing)
+		{
+			std::cerr << "ERROR applyRealTimeFilters(): Read underrun in playback ("
+                      << got << " < " << required << ")" << std::endl;
+			return; 
+		}
+
+        m_filterStack->putInput(ib, required);
+
+		for (size_t c = 0; c < channels; ++c) {
+			delete ib[c];
+		}
+		delete ib;
+	}
 	m_filterStack->getOutput(buffers, count);
 
 }
\ No newline at end of file