Loading services/audioflinger/AudioResampler.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -341,7 +341,7 @@ void AudioResamplerOrder1::resampleStereo16(int32_t* out, size_t outFrameCount, uint32_t phaseIncrement = mPhaseIncrement; size_t outputIndex = 0; size_t outputSampleCount = outFrameCount * 2; size_t inFrameCount = (outFrameCount*mInSampleRate)/mSampleRate; size_t inFrameCount = getInFrameCountRequired(outFrameCount); // ALOGE("starting resample %d frames, inputIndex=%d, phaseFraction=%d, phaseIncrement=%d", // outFrameCount, inputIndex, phaseFraction, phaseIncrement); Loading Loading @@ -439,7 +439,7 @@ void AudioResamplerOrder1::resampleMono16(int32_t* out, size_t outFrameCount, uint32_t phaseIncrement = mPhaseIncrement; size_t outputIndex = 0; size_t outputSampleCount = outFrameCount * 2; size_t inFrameCount = (outFrameCount*mInSampleRate)/mSampleRate; size_t inFrameCount = getInFrameCountRequired(outFrameCount); // ALOGE("starting resample %d frames, inputIndex=%d, phaseFraction=%d, phaseIncrement=%d", // outFrameCount, inputIndex, phaseFraction, phaseIncrement); Loading services/audioflinger/AudioResampler.h +32 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,38 @@ protected: uint64_t mLocalTimeFreq; int64_t mPTS; // returns the inFrameCount required to generate outFrameCount frames. // // Placed here to be a consistent for all resamplers. // // Right now, we use the upper bound without regards to the current state of the // input buffer using integer arithmetic, as follows: // // (static_cast<uint64_t>(outFrameCount)*mInSampleRate + (mSampleRate - 1))/mSampleRate; // // The double precision equivalent (float may not be precise enough): // ceil(static_cast<double>(outFrameCount) * mInSampleRate / mSampleRate); // // this relies on the fact that the mPhaseIncrement is rounded down from // #phases * mInSampleRate/mSampleRate and the fact that Sum(Floor(x)) <= Floor(Sum(x)). // http://www.proofwiki.org/wiki/Sum_of_Floors_Not_Greater_Than_Floor_of_Sums // // (so long as double precision is computed accurately enough to be considered // greater than or equal to the Floor(x) value in int32_t arithmetic; thus this // will not necessarily hold for floats). // // TODO: // Greater accuracy and a tight bound is obtained by: // 1) subtract and adjust for the current state of the AudioBufferProvider buffer. // 2) using the exact integer formula where (ignoring 64b casting) // inFrameCount = (mPhaseIncrement * (outFrameCount - 1) + mPhaseFraction) / phaseWrapLimit; // phaseWrapLimit is the wraparound (1 << kNumPhaseBits), if not specified explicitly. // inline size_t getInFrameCountRequired(size_t outFrameCount) { return (static_cast<uint64_t>(outFrameCount)*mInSampleRate + (mSampleRate - 1))/mSampleRate; } private: const src_quality mQuality; Loading services/audioflinger/AudioResamplerCubic.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -60,7 +60,7 @@ void AudioResamplerCubic::resampleStereo16(int32_t* out, size_t outFrameCount, uint32_t phaseIncrement = mPhaseIncrement; size_t outputIndex = 0; size_t outputSampleCount = outFrameCount * 2; size_t inFrameCount = (outFrameCount*mInSampleRate)/mSampleRate; size_t inFrameCount = getInFrameCountRequired(outFrameCount); // fetch first buffer if (mBuffer.frameCount == 0) { Loading Loading @@ -128,7 +128,7 @@ void AudioResamplerCubic::resampleMono16(int32_t* out, size_t outFrameCount, uint32_t phaseIncrement = mPhaseIncrement; size_t outputIndex = 0; size_t outputSampleCount = outFrameCount * 2; size_t inFrameCount = (outFrameCount*mInSampleRate)/mSampleRate; size_t inFrameCount = getInFrameCountRequired(outFrameCount); // fetch first buffer if (mBuffer.frameCount == 0) { Loading services/audioflinger/AudioResamplerDyn.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -466,7 +466,7 @@ void AudioResamplerDyn::resample(int32_t* out, size_t outFrameCount, const uint32_t phaseIncrement = mPhaseIncrement; size_t outputIndex = 0; size_t outputSampleCount = outFrameCount * 2; // stereo output size_t inFrameCount = (outFrameCount*mInSampleRate)/mSampleRate; size_t inFrameCount = getInFrameCountRequired(outFrameCount); const uint32_t phaseWrapLimit = c.mL << c.mShift; // NOTE: be very careful when modifying the code here. register Loading services/audioflinger/AudioResamplerSinc.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -540,7 +540,7 @@ void AudioResamplerSinc::resample(int32_t* out, size_t outFrameCount, uint32_t phaseIncrement = mPhaseIncrement; size_t outputIndex = 0; size_t outputSampleCount = outFrameCount * 2; size_t inFrameCount = (outFrameCount*mInSampleRate)/mSampleRate; size_t inFrameCount = getInFrameCountRequired(outFrameCount); while (outputIndex < outputSampleCount) { // buffer is empty, fetch a new one Loading Loading
services/audioflinger/AudioResampler.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -341,7 +341,7 @@ void AudioResamplerOrder1::resampleStereo16(int32_t* out, size_t outFrameCount, uint32_t phaseIncrement = mPhaseIncrement; size_t outputIndex = 0; size_t outputSampleCount = outFrameCount * 2; size_t inFrameCount = (outFrameCount*mInSampleRate)/mSampleRate; size_t inFrameCount = getInFrameCountRequired(outFrameCount); // ALOGE("starting resample %d frames, inputIndex=%d, phaseFraction=%d, phaseIncrement=%d", // outFrameCount, inputIndex, phaseFraction, phaseIncrement); Loading Loading @@ -439,7 +439,7 @@ void AudioResamplerOrder1::resampleMono16(int32_t* out, size_t outFrameCount, uint32_t phaseIncrement = mPhaseIncrement; size_t outputIndex = 0; size_t outputSampleCount = outFrameCount * 2; size_t inFrameCount = (outFrameCount*mInSampleRate)/mSampleRate; size_t inFrameCount = getInFrameCountRequired(outFrameCount); // ALOGE("starting resample %d frames, inputIndex=%d, phaseFraction=%d, phaseIncrement=%d", // outFrameCount, inputIndex, phaseFraction, phaseIncrement); Loading
services/audioflinger/AudioResampler.h +32 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,38 @@ protected: uint64_t mLocalTimeFreq; int64_t mPTS; // returns the inFrameCount required to generate outFrameCount frames. // // Placed here to be a consistent for all resamplers. // // Right now, we use the upper bound without regards to the current state of the // input buffer using integer arithmetic, as follows: // // (static_cast<uint64_t>(outFrameCount)*mInSampleRate + (mSampleRate - 1))/mSampleRate; // // The double precision equivalent (float may not be precise enough): // ceil(static_cast<double>(outFrameCount) * mInSampleRate / mSampleRate); // // this relies on the fact that the mPhaseIncrement is rounded down from // #phases * mInSampleRate/mSampleRate and the fact that Sum(Floor(x)) <= Floor(Sum(x)). // http://www.proofwiki.org/wiki/Sum_of_Floors_Not_Greater_Than_Floor_of_Sums // // (so long as double precision is computed accurately enough to be considered // greater than or equal to the Floor(x) value in int32_t arithmetic; thus this // will not necessarily hold for floats). // // TODO: // Greater accuracy and a tight bound is obtained by: // 1) subtract and adjust for the current state of the AudioBufferProvider buffer. // 2) using the exact integer formula where (ignoring 64b casting) // inFrameCount = (mPhaseIncrement * (outFrameCount - 1) + mPhaseFraction) / phaseWrapLimit; // phaseWrapLimit is the wraparound (1 << kNumPhaseBits), if not specified explicitly. // inline size_t getInFrameCountRequired(size_t outFrameCount) { return (static_cast<uint64_t>(outFrameCount)*mInSampleRate + (mSampleRate - 1))/mSampleRate; } private: const src_quality mQuality; Loading
services/audioflinger/AudioResamplerCubic.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -60,7 +60,7 @@ void AudioResamplerCubic::resampleStereo16(int32_t* out, size_t outFrameCount, uint32_t phaseIncrement = mPhaseIncrement; size_t outputIndex = 0; size_t outputSampleCount = outFrameCount * 2; size_t inFrameCount = (outFrameCount*mInSampleRate)/mSampleRate; size_t inFrameCount = getInFrameCountRequired(outFrameCount); // fetch first buffer if (mBuffer.frameCount == 0) { Loading Loading @@ -128,7 +128,7 @@ void AudioResamplerCubic::resampleMono16(int32_t* out, size_t outFrameCount, uint32_t phaseIncrement = mPhaseIncrement; size_t outputIndex = 0; size_t outputSampleCount = outFrameCount * 2; size_t inFrameCount = (outFrameCount*mInSampleRate)/mSampleRate; size_t inFrameCount = getInFrameCountRequired(outFrameCount); // fetch first buffer if (mBuffer.frameCount == 0) { Loading
services/audioflinger/AudioResamplerDyn.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -466,7 +466,7 @@ void AudioResamplerDyn::resample(int32_t* out, size_t outFrameCount, const uint32_t phaseIncrement = mPhaseIncrement; size_t outputIndex = 0; size_t outputSampleCount = outFrameCount * 2; // stereo output size_t inFrameCount = (outFrameCount*mInSampleRate)/mSampleRate; size_t inFrameCount = getInFrameCountRequired(outFrameCount); const uint32_t phaseWrapLimit = c.mL << c.mShift; // NOTE: be very careful when modifying the code here. register Loading
services/audioflinger/AudioResamplerSinc.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -540,7 +540,7 @@ void AudioResamplerSinc::resample(int32_t* out, size_t outFrameCount, uint32_t phaseIncrement = mPhaseIncrement; size_t outputIndex = 0; size_t outputSampleCount = outFrameCount * 2; size_t inFrameCount = (outFrameCount*mInSampleRate)/mSampleRate; size_t inFrameCount = getInFrameCountRequired(outFrameCount); while (outputIndex < outputSampleCount) { // buffer is empty, fetch a new one Loading