From 6fd444c67c16842c71a7fa27b735e4b5310d1cef Mon Sep 17 00:00:00 2001 From: Marcus Tomlinson Date: Fri, 27 Sep 2019 14:56:01 +0100 Subject: [PATCH 1/2] Add maxOutSampleCount to WasapiResampler::Convert() --- RtAudio.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/RtAudio.cpp b/RtAudio.cpp index dce61fe..06bc8d8 100644 --- a/RtAudio.cpp +++ b/RtAudio.cpp @@ -4073,7 +4073,7 @@ public: #endif } - void Convert( char* outBuffer, const char* inBuffer, unsigned int inSampleCount, unsigned int& outSampleCount ) + void Convert( char* outBuffer, const char* inBuffer, unsigned int inSampleCount, unsigned int& outSampleCount, int maxOutSampleCount = -1 ) { unsigned int inputBufferSize = _bytesPerSample * _channelCount * inSampleCount; if ( _sampleRatio == 1 ) @@ -4086,6 +4086,15 @@ public: unsigned int outputBufferSize = ( unsigned int ) ceilf( inputBufferSize * _sampleRatio ) + ( _bytesPerSample * _channelCount ); + if ( maxOutSampleCount != -1 ) + { + unsigned int maxOutputBufferSize = _bytesPerSample * _channelCount * maxOutSampleCount; + if ( outputBufferSize > maxOutputBufferSize ) + { + outputBufferSize = maxOutputBufferSize; + } + } + IMFMediaBuffer* rInBuffer; IMFSample* rInSample; BYTE* rInByteBuffer = NULL; @@ -5223,7 +5232,8 @@ void RtApiWasapi::wasapiThread() captureResampler->Convert( stream_.deviceBuffer + deviceBufferOffset, convBuffer, samplesToPull, - convSamples ); + convSamples, + stream_.bufferSize - convBufferSize ); convBufferSize += convSamples; samplesToPull = 1; // now pull one sample at a time until we have stream_.bufferSize samples From 298396eca03c3027073f39760459f909b30cda9c Mon Sep 17 00:00:00 2001 From: Marcus Tomlinson Date: Fri, 27 Sep 2019 18:51:45 +0100 Subject: [PATCH 2/2] Slight optimization --- RtAudio.cpp | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/RtAudio.cpp b/RtAudio.cpp index 06bc8d8..82622ad 100644 --- a/RtAudio.cpp +++ b/RtAudio.cpp @@ -4084,15 +4084,14 @@ public: return; } - unsigned int outputBufferSize = ( unsigned int ) ceilf( inputBufferSize * _sampleRatio ) + ( _bytesPerSample * _channelCount ); - + unsigned int outputBufferSize = 0; if ( maxOutSampleCount != -1 ) { - unsigned int maxOutputBufferSize = _bytesPerSample * _channelCount * maxOutSampleCount; - if ( outputBufferSize > maxOutputBufferSize ) - { - outputBufferSize = maxOutputBufferSize; - } + outputBufferSize = _bytesPerSample * _channelCount * maxOutSampleCount; + } + else + { + outputBufferSize = ( unsigned int ) ceilf( inputBufferSize * _sampleRatio ) + ( _bytesPerSample * _channelCount ); } IMFMediaBuffer* rInBuffer; @@ -5206,11 +5205,6 @@ void RtApiWasapi::wasapiThread() if ( captureAudioClient ) { int samplesToPull = ( unsigned int ) floorf( stream_.bufferSize * captureSrRatio ); - if ( captureSrRatio != 1 ) - { - // account for remainders - samplesToPull--; - } convBufferSize = 0; while ( convBufferSize < stream_.bufferSize ) @@ -5233,7 +5227,7 @@ void RtApiWasapi::wasapiThread() convBuffer, samplesToPull, convSamples, - stream_.bufferSize - convBufferSize ); + convBufferSize == 0 ? -1 : stream_.bufferSize - convBufferSize ); convBufferSize += convSamples; samplesToPull = 1; // now pull one sample at a time until we have stream_.bufferSize samples