Mercurial > hg > easaier-soundaccess
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