From 6eb5f3ac5bb251c7524d72020100b232ebbb8537 Mon Sep 17 00:00:00 2001 From: Paul Licameli Date: Fri, 27 Nov 2020 21:06:39 -0500 Subject: [PATCH] Eliminate CopySamples calls where destination is always float... .. Call the function SamplesToFloats instead, or in one place, where source is also always float, just do memcpy. Dithering never happened in these cases. --- src/AudioIO.cpp | 11 ++++------- src/SampleFormat.cpp | 9 +++++++++ src/SampleFormat.h | 13 +++++++++++++ src/SqliteSampleBlock.cpp | 7 ++----- src/WaveClip.cpp | 6 +++--- src/effects/nyquist/Nyquist.cpp | 6 +++--- 6 files changed, 34 insertions(+), 18 deletions(-) diff --git a/src/AudioIO.cpp b/src/AudioIO.cpp index 9ccc16667..994d9293f 100644 --- a/src/AudioIO.cpp +++ b/src/AudioIO.cpp @@ -3622,11 +3622,9 @@ static void DoSoftwarePlaythrough(const void *inputBuffer, { for (unsigned int i=0; i < inputChannels; i++) { samplePtr inputPtr = ((samplePtr)inputBuffer) + (i * SAMPLE_SIZE(inputFormat)); - samplePtr outputPtr = ((samplePtr)outputBuffer) + (i * SAMPLE_SIZE(floatSample)); - CopySamples(inputPtr, inputFormat, - (samplePtr)outputPtr, floatSample, - len, true, inputChannels, 2); + SamplesToFloats(inputPtr, inputFormat, + outputBuffer + i, len, inputChannels, 2); } // One mono input channel goes to both output channels... @@ -4411,9 +4409,8 @@ int AudioIoCallback::AudioCallback(const void *inputBuffer, void *outputBuffer, inputSamples = (float *) inputBuffer; } else { - CopySamples((samplePtr)inputBuffer, mCaptureFormat, - (samplePtr)tempFloats, floatSample, - framesPerBuffer * numCaptureChannels); + SamplesToFloats(reinterpret_cast(inputBuffer), + mCaptureFormat, tempFloats, framesPerBuffer * numCaptureChannels); inputSamples = tempFloats; } diff --git a/src/SampleFormat.cpp b/src/SampleFormat.cpp index de13bfbd6..58f06d568 100644 --- a/src/SampleFormat.cpp +++ b/src/SampleFormat.cpp @@ -99,6 +99,15 @@ void ReverseSamples(samplePtr dst, sampleFormat format, } } +void SamplesToFloats(constSamplePtr src, sampleFormat srcFormat, + float *dst, size_t len, size_t srcStride, size_t dstStride) +{ + CopySamples( src, srcFormat, + reinterpret_cast(dst), floatSample, len, + true, // doesn't matter, no dither happens when destination is float + srcStride, dstStride); +} + void CopySamples(constSamplePtr src, sampleFormat srcFormat, samplePtr dst, sampleFormat dstFormat, unsigned int len, diff --git a/src/SampleFormat.h b/src/SampleFormat.h index eec4009dc..344c8add8 100644 --- a/src/SampleFormat.h +++ b/src/SampleFormat.h @@ -124,6 +124,19 @@ private: // Copying, Converting and Clearing Samples // +AUDACITY_DLL_API +//! Copy samples from any format into the widest format, which is 32 bit float, with no dithering +/*! + @param src address of source samples + @param srcFormat format of source samples, determines sizeof each one + @param dst address of floating-point numbers + @param len count of samples to copy + @param srcStride how many samples to advance src after copying each one + @param dstString how many samples to advance dst after copying each one + */ +void SamplesToFloats(constSamplePtr src, sampleFormat srcFormat, + float *dst, size_t len, size_t srcStride = 1, size_t dstStride = 1); + AUDACITY_DLL_API void CopySamples(constSamplePtr src, sampleFormat srcFormat, samplePtr dst, sampleFormat dstFormat, diff --git a/src/SqliteSampleBlock.cpp b/src/SqliteSampleBlock.cpp index e647a4c78..645b4ef13 100644 --- a/src/SqliteSampleBlock.cpp +++ b/src/SqliteSampleBlock.cpp @@ -806,11 +806,8 @@ void SqliteSampleBlock::CalcSummary(Sizes sizes) else { samplebuffer.reinit((unsigned) mSampleCount); - CopySamples(mSamples.get(), - mSampleFormat, - (samplePtr) samplebuffer.get(), - floatSample, - mSampleCount); + SamplesToFloats(mSamples.get(), mSampleFormat, + samplebuffer.get(), mSampleCount); samples = samplebuffer.get(); } diff --git a/src/WaveClip.cpp b/src/WaveClip.cpp index 38fb6577c..74f0eb53d 100644 --- a/src/WaveClip.cpp +++ b/src/WaveClip.cpp @@ -525,9 +525,9 @@ bool WaveClip::GetWaveDisplay(WaveDisplay &display, double t0, else { b.reinit(len); pb = b.get(); - CopySamples(mAppendBuffer.ptr() + sLeft * SAMPLE_SIZE(seqFormat), - seqFormat, - (samplePtr)pb, floatSample, len); + SamplesToFloats( + mAppendBuffer.ptr() + sLeft * SAMPLE_SIZE(seqFormat), + seqFormat, pb, len); } float theMax, theMin, sumsq; diff --git a/src/effects/nyquist/Nyquist.cpp b/src/effects/nyquist/Nyquist.cpp index 4e9c3faf7..d011e3243 100644 --- a/src/effects/nyquist/Nyquist.cpp +++ b/src/effects/nyquist/Nyquist.cpp @@ -29,6 +29,7 @@ effects from this one class. #include #include +#include #include @@ -2462,9 +2463,8 @@ int NyquistEffect::GetCallback(float *buffer, int ch, // We have guaranteed above that this is nonnegative and bounded by // mCurBufferLen[ch]: auto offset = ( mCurStart[ch] + start - mCurBufferStart[ch] ).as_size_t(); - CopySamples(mCurBuffer[ch].ptr() + offset*SAMPLE_SIZE(floatSample), floatSample, - (samplePtr)buffer, floatSample, - len); + const void *src = mCurBuffer[ch].ptr() + offset*SAMPLE_SIZE(floatSample); + std::memcpy(buffer, src, len * sizeof(float)); if (ch == 0) { double progress = mScale *