Loading services/audioflinger/AudioResampler.cpp +13 −10 Original line number Diff line number Diff line Loading @@ -41,7 +41,7 @@ public: AudioResamplerOrder1(int inChannelCount, int32_t sampleRate) : AudioResampler(inChannelCount, sampleRate, LOW_QUALITY), mX0L(0), mX0R(0) { } virtual void resample(int32_t* out, size_t outFrameCount, virtual size_t resample(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider); private: // number of bits used in interpolation multiply - 15 bits avoids overflow Loading @@ -51,9 +51,9 @@ private: static const int kPreInterpShift = kNumPhaseBits - kNumInterpBits; void init() {} void resampleMono16(int32_t* out, size_t outFrameCount, size_t resampleMono16(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider); void resampleStereo16(int32_t* out, size_t outFrameCount, size_t resampleStereo16(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider); #ifdef ASM_ARM_RESAMP1 // asm optimisation for ResamplerOrder1 void AsmMono16Loop(int16_t *in, int32_t* maxOutPt, int32_t maxInIdx, Loading Loading @@ -329,7 +329,7 @@ void AudioResampler::reset() { // ---------------------------------------------------------------------------- void AudioResamplerOrder1::resample(int32_t* out, size_t outFrameCount, size_t AudioResamplerOrder1::resample(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider) { // should never happen, but we overflow if it does Loading @@ -338,15 +338,16 @@ void AudioResamplerOrder1::resample(int32_t* out, size_t outFrameCount, // select the appropriate resampler switch (mChannelCount) { case 1: resampleMono16(out, outFrameCount, provider); break; return resampleMono16(out, outFrameCount, provider); case 2: resampleStereo16(out, outFrameCount, provider); break; return resampleStereo16(out, outFrameCount, provider); default: LOG_ALWAYS_FATAL("invalid channel count: %d", mChannelCount); return 0; } } void AudioResamplerOrder1::resampleStereo16(int32_t* out, size_t outFrameCount, size_t AudioResamplerOrder1::resampleStereo16(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider) { int32_t vl = mVolume[0]; Loading Loading @@ -442,9 +443,10 @@ resampleStereo16_exit: // save state mInputIndex = inputIndex; mPhaseFraction = phaseFraction; return outputIndex / 2 /* channels for stereo */; } void AudioResamplerOrder1::resampleMono16(int32_t* out, size_t outFrameCount, size_t AudioResamplerOrder1::resampleMono16(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider) { int32_t vl = mVolume[0]; Loading Loading @@ -538,6 +540,7 @@ resampleMono16_exit: // save state mInputIndex = inputIndex; mPhaseFraction = phaseFraction; return outputIndex; } #ifdef ASM_ARM_RESAMP1 // asm optimisation for ResamplerOrder1 Loading services/audioflinger/AudioResampler.h +9 −3 Original line number Diff line number Diff line Loading @@ -67,12 +67,18 @@ public: // Resample int16_t samples from provider and accumulate into 'out'. // A mono provider delivers a sequence of samples. // A stereo provider delivers a sequence of interleaved pairs of samples. // Multi-channel providers are not supported. // // In either case, 'out' holds interleaved pairs of fixed-point Q4.27. // That is, for a mono provider, there is an implicit up-channeling. // Since this method accumulates, the caller is responsible for clearing 'out' initially. // FIXME assumes provider is always successful; it should return the actual frame count. virtual void resample(int32_t* out, size_t outFrameCount, // // For a float resampler, 'out' holds interleaved pairs of float samples. // // Multichannel interleaved frames for n > 2 is supported for quality DYN_LOW_QUALITY, // DYN_MED_QUALITY, and DYN_HIGH_QUALITY. // // Returns the number of frames resampled into the out buffer. virtual size_t resample(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider) = 0; virtual void reset(); Loading services/audioflinger/AudioResamplerCubic.cpp +13 −10 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ * limitations under the License. */ #define LOG_TAG "AudioSRC" #define LOG_TAG "AudioResamplerCubic" #include <stdint.h> #include <string.h> Loading @@ -32,7 +32,7 @@ void AudioResamplerCubic::init() { memset(&right, 0, sizeof(state)); } void AudioResamplerCubic::resample(int32_t* out, size_t outFrameCount, size_t AudioResamplerCubic::resample(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider) { // should never happen, but we overflow if it does Loading @@ -41,15 +41,16 @@ void AudioResamplerCubic::resample(int32_t* out, size_t outFrameCount, // select the appropriate resampler switch (mChannelCount) { case 1: resampleMono16(out, outFrameCount, provider); break; return resampleMono16(out, outFrameCount, provider); case 2: resampleStereo16(out, outFrameCount, provider); break; return resampleStereo16(out, outFrameCount, provider); default: LOG_ALWAYS_FATAL("invalid channel count: %d", mChannelCount); return 0; } } void AudioResamplerCubic::resampleStereo16(int32_t* out, size_t outFrameCount, size_t AudioResamplerCubic::resampleStereo16(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider) { int32_t vl = mVolume[0]; Loading @@ -67,7 +68,7 @@ void AudioResamplerCubic::resampleStereo16(int32_t* out, size_t outFrameCount, mBuffer.frameCount = inFrameCount; provider->getNextBuffer(&mBuffer, mPTS); if (mBuffer.raw == NULL) { return; return 0; } // ALOGW("New buffer: offset=%p, frames=%dn", mBuffer.raw, mBuffer.frameCount); } Loading Loading @@ -115,9 +116,10 @@ save_state: // ALOGW("Done: index=%d, fraction=%u", inputIndex, phaseFraction); mInputIndex = inputIndex; mPhaseFraction = phaseFraction; return outputIndex / 2 /* channels for stereo */; } void AudioResamplerCubic::resampleMono16(int32_t* out, size_t outFrameCount, size_t AudioResamplerCubic::resampleMono16(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider) { int32_t vl = mVolume[0]; Loading @@ -135,7 +137,7 @@ void AudioResamplerCubic::resampleMono16(int32_t* out, size_t outFrameCount, mBuffer.frameCount = inFrameCount; provider->getNextBuffer(&mBuffer, mPTS); if (mBuffer.raw == NULL) { return; return 0; } // ALOGW("New buffer: offset=%p, frames=%d", mBuffer.raw, mBuffer.frameCount); } Loading Loading @@ -182,6 +184,7 @@ save_state: // ALOGW("Done: index=%d, fraction=%u", inputIndex, phaseFraction); mInputIndex = inputIndex; mPhaseFraction = phaseFraction; return outputIndex; } // ---------------------------------------------------------------------------- Loading services/audioflinger/AudioResamplerCubic.h +3 −3 Original line number Diff line number Diff line Loading @@ -31,7 +31,7 @@ public: AudioResamplerCubic(int inChannelCount, int32_t sampleRate) : AudioResampler(inChannelCount, sampleRate, MED_QUALITY) { } virtual void resample(int32_t* out, size_t outFrameCount, virtual size_t resample(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider); private: // number of bits used in interpolation multiply - 14 bits avoids overflow Loading @@ -43,9 +43,9 @@ private: int32_t a, b, c, y0, y1, y2, y3; } state; void init(); void resampleMono16(int32_t* out, size_t outFrameCount, size_t resampleMono16(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider); void resampleStereo16(int32_t* out, size_t outFrameCount, size_t resampleStereo16(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider); static inline int32_t interp(state* p, int32_t x) { return (((((p->a * x >> 14) + p->b) * x >> 14) + p->c) * x >> 14) + p->y1; Loading services/audioflinger/AudioResamplerDyn.cpp +4 −3 Original line number Diff line number Diff line Loading @@ -477,15 +477,15 @@ void AudioResamplerDyn<TC, TI, TO>::setSampleRate(int32_t inSampleRate) } template<typename TC, typename TI, typename TO> void AudioResamplerDyn<TC, TI, TO>::resample(int32_t* out, size_t outFrameCount, size_t AudioResamplerDyn<TC, TI, TO>::resample(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider) { (this->*mResampleFunc)(reinterpret_cast<TO*>(out), outFrameCount, provider); return (this->*mResampleFunc)(reinterpret_cast<TO*>(out), outFrameCount, provider); } template<typename TC, typename TI, typename TO> template<int CHANNELS, bool LOCKED, int STRIDE> void AudioResamplerDyn<TC, TI, TO>::resample(TO* out, size_t outFrameCount, size_t AudioResamplerDyn<TC, TI, TO>::resample(TO* out, size_t outFrameCount, AudioBufferProvider* provider) { // TODO Mono -> Mono is not supported. OUTPUT_CHANNELS reflects minimum of stereo out. Loading Loading @@ -610,6 +610,7 @@ resample_exit: ALOG_ASSERT(mBuffer.frameCount == 0); // there must be no frames in the buffer mInBuffer.setImpulse(impulse); mPhaseFraction = phaseFraction; return outputIndex / OUTPUT_CHANNELS; } /* instantiate templates used by AudioResampler::create */ Loading Loading
services/audioflinger/AudioResampler.cpp +13 −10 Original line number Diff line number Diff line Loading @@ -41,7 +41,7 @@ public: AudioResamplerOrder1(int inChannelCount, int32_t sampleRate) : AudioResampler(inChannelCount, sampleRate, LOW_QUALITY), mX0L(0), mX0R(0) { } virtual void resample(int32_t* out, size_t outFrameCount, virtual size_t resample(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider); private: // number of bits used in interpolation multiply - 15 bits avoids overflow Loading @@ -51,9 +51,9 @@ private: static const int kPreInterpShift = kNumPhaseBits - kNumInterpBits; void init() {} void resampleMono16(int32_t* out, size_t outFrameCount, size_t resampleMono16(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider); void resampleStereo16(int32_t* out, size_t outFrameCount, size_t resampleStereo16(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider); #ifdef ASM_ARM_RESAMP1 // asm optimisation for ResamplerOrder1 void AsmMono16Loop(int16_t *in, int32_t* maxOutPt, int32_t maxInIdx, Loading Loading @@ -329,7 +329,7 @@ void AudioResampler::reset() { // ---------------------------------------------------------------------------- void AudioResamplerOrder1::resample(int32_t* out, size_t outFrameCount, size_t AudioResamplerOrder1::resample(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider) { // should never happen, but we overflow if it does Loading @@ -338,15 +338,16 @@ void AudioResamplerOrder1::resample(int32_t* out, size_t outFrameCount, // select the appropriate resampler switch (mChannelCount) { case 1: resampleMono16(out, outFrameCount, provider); break; return resampleMono16(out, outFrameCount, provider); case 2: resampleStereo16(out, outFrameCount, provider); break; return resampleStereo16(out, outFrameCount, provider); default: LOG_ALWAYS_FATAL("invalid channel count: %d", mChannelCount); return 0; } } void AudioResamplerOrder1::resampleStereo16(int32_t* out, size_t outFrameCount, size_t AudioResamplerOrder1::resampleStereo16(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider) { int32_t vl = mVolume[0]; Loading Loading @@ -442,9 +443,10 @@ resampleStereo16_exit: // save state mInputIndex = inputIndex; mPhaseFraction = phaseFraction; return outputIndex / 2 /* channels for stereo */; } void AudioResamplerOrder1::resampleMono16(int32_t* out, size_t outFrameCount, size_t AudioResamplerOrder1::resampleMono16(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider) { int32_t vl = mVolume[0]; Loading Loading @@ -538,6 +540,7 @@ resampleMono16_exit: // save state mInputIndex = inputIndex; mPhaseFraction = phaseFraction; return outputIndex; } #ifdef ASM_ARM_RESAMP1 // asm optimisation for ResamplerOrder1 Loading
services/audioflinger/AudioResampler.h +9 −3 Original line number Diff line number Diff line Loading @@ -67,12 +67,18 @@ public: // Resample int16_t samples from provider and accumulate into 'out'. // A mono provider delivers a sequence of samples. // A stereo provider delivers a sequence of interleaved pairs of samples. // Multi-channel providers are not supported. // // In either case, 'out' holds interleaved pairs of fixed-point Q4.27. // That is, for a mono provider, there is an implicit up-channeling. // Since this method accumulates, the caller is responsible for clearing 'out' initially. // FIXME assumes provider is always successful; it should return the actual frame count. virtual void resample(int32_t* out, size_t outFrameCount, // // For a float resampler, 'out' holds interleaved pairs of float samples. // // Multichannel interleaved frames for n > 2 is supported for quality DYN_LOW_QUALITY, // DYN_MED_QUALITY, and DYN_HIGH_QUALITY. // // Returns the number of frames resampled into the out buffer. virtual size_t resample(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider) = 0; virtual void reset(); Loading
services/audioflinger/AudioResamplerCubic.cpp +13 −10 Original line number Diff line number Diff line Loading @@ -14,7 +14,7 @@ * limitations under the License. */ #define LOG_TAG "AudioSRC" #define LOG_TAG "AudioResamplerCubic" #include <stdint.h> #include <string.h> Loading @@ -32,7 +32,7 @@ void AudioResamplerCubic::init() { memset(&right, 0, sizeof(state)); } void AudioResamplerCubic::resample(int32_t* out, size_t outFrameCount, size_t AudioResamplerCubic::resample(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider) { // should never happen, but we overflow if it does Loading @@ -41,15 +41,16 @@ void AudioResamplerCubic::resample(int32_t* out, size_t outFrameCount, // select the appropriate resampler switch (mChannelCount) { case 1: resampleMono16(out, outFrameCount, provider); break; return resampleMono16(out, outFrameCount, provider); case 2: resampleStereo16(out, outFrameCount, provider); break; return resampleStereo16(out, outFrameCount, provider); default: LOG_ALWAYS_FATAL("invalid channel count: %d", mChannelCount); return 0; } } void AudioResamplerCubic::resampleStereo16(int32_t* out, size_t outFrameCount, size_t AudioResamplerCubic::resampleStereo16(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider) { int32_t vl = mVolume[0]; Loading @@ -67,7 +68,7 @@ void AudioResamplerCubic::resampleStereo16(int32_t* out, size_t outFrameCount, mBuffer.frameCount = inFrameCount; provider->getNextBuffer(&mBuffer, mPTS); if (mBuffer.raw == NULL) { return; return 0; } // ALOGW("New buffer: offset=%p, frames=%dn", mBuffer.raw, mBuffer.frameCount); } Loading Loading @@ -115,9 +116,10 @@ save_state: // ALOGW("Done: index=%d, fraction=%u", inputIndex, phaseFraction); mInputIndex = inputIndex; mPhaseFraction = phaseFraction; return outputIndex / 2 /* channels for stereo */; } void AudioResamplerCubic::resampleMono16(int32_t* out, size_t outFrameCount, size_t AudioResamplerCubic::resampleMono16(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider) { int32_t vl = mVolume[0]; Loading @@ -135,7 +137,7 @@ void AudioResamplerCubic::resampleMono16(int32_t* out, size_t outFrameCount, mBuffer.frameCount = inFrameCount; provider->getNextBuffer(&mBuffer, mPTS); if (mBuffer.raw == NULL) { return; return 0; } // ALOGW("New buffer: offset=%p, frames=%d", mBuffer.raw, mBuffer.frameCount); } Loading Loading @@ -182,6 +184,7 @@ save_state: // ALOGW("Done: index=%d, fraction=%u", inputIndex, phaseFraction); mInputIndex = inputIndex; mPhaseFraction = phaseFraction; return outputIndex; } // ---------------------------------------------------------------------------- Loading
services/audioflinger/AudioResamplerCubic.h +3 −3 Original line number Diff line number Diff line Loading @@ -31,7 +31,7 @@ public: AudioResamplerCubic(int inChannelCount, int32_t sampleRate) : AudioResampler(inChannelCount, sampleRate, MED_QUALITY) { } virtual void resample(int32_t* out, size_t outFrameCount, virtual size_t resample(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider); private: // number of bits used in interpolation multiply - 14 bits avoids overflow Loading @@ -43,9 +43,9 @@ private: int32_t a, b, c, y0, y1, y2, y3; } state; void init(); void resampleMono16(int32_t* out, size_t outFrameCount, size_t resampleMono16(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider); void resampleStereo16(int32_t* out, size_t outFrameCount, size_t resampleStereo16(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider); static inline int32_t interp(state* p, int32_t x) { return (((((p->a * x >> 14) + p->b) * x >> 14) + p->c) * x >> 14) + p->y1; Loading
services/audioflinger/AudioResamplerDyn.cpp +4 −3 Original line number Diff line number Diff line Loading @@ -477,15 +477,15 @@ void AudioResamplerDyn<TC, TI, TO>::setSampleRate(int32_t inSampleRate) } template<typename TC, typename TI, typename TO> void AudioResamplerDyn<TC, TI, TO>::resample(int32_t* out, size_t outFrameCount, size_t AudioResamplerDyn<TC, TI, TO>::resample(int32_t* out, size_t outFrameCount, AudioBufferProvider* provider) { (this->*mResampleFunc)(reinterpret_cast<TO*>(out), outFrameCount, provider); return (this->*mResampleFunc)(reinterpret_cast<TO*>(out), outFrameCount, provider); } template<typename TC, typename TI, typename TO> template<int CHANNELS, bool LOCKED, int STRIDE> void AudioResamplerDyn<TC, TI, TO>::resample(TO* out, size_t outFrameCount, size_t AudioResamplerDyn<TC, TI, TO>::resample(TO* out, size_t outFrameCount, AudioBufferProvider* provider) { // TODO Mono -> Mono is not supported. OUTPUT_CHANNELS reflects minimum of stereo out. Loading Loading @@ -610,6 +610,7 @@ resample_exit: ALOG_ASSERT(mBuffer.frameCount == 0); // there must be no frames in the buffer mInBuffer.setImpulse(impulse); mPhaseFraction = phaseFraction; return outputIndex / OUTPUT_CHANNELS; } /* instantiate templates used by AudioResampler::create */ Loading