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 *