19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "AudioResampler" 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//#define LOG_NDEBUG 0 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdlib.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <cutils/log.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <cutils/properties.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "AudioResampler.h" 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "AudioResamplerSinc.h" 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "AudioResamplerCubic.h" 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29592a6d976887e7d5f5aca42db52ef6c6576648f5Jim Huang#ifdef __arm__ 30592a6d976887e7d5f5aca42db52ef6c6576648f5Jim Huang#include <machine/cpu-features.h> 31592a6d976887e7d5f5aca42db52ef6c6576648f5Jim Huang#endif 32592a6d976887e7d5f5aca42db52ef6c6576648f5Jim Huang 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 35592a6d976887e7d5f5aca42db52ef6c6576648f5Jim Huang#ifdef __ARM_HAVE_HALFWORD_MULTIPLY // optimized asm option 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project #define ASM_ARM_RESAMP1 // enable asm optimisation for ResamplerOrder1 37592a6d976887e7d5f5aca42db52ef6c6576648f5Jim Huang#endif // __ARM_HAVE_HALFWORD_MULTIPLY 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AudioResamplerOrder1 : public AudioResampler { 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioResamplerOrder1(int bitDepth, int inChannelCount, int32_t sampleRate) : 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioResampler(bitDepth, inChannelCount, sampleRate), mX0L(0), mX0R(0) { 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void resample(int32_t* out, size_t outFrameCount, 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioBufferProvider* provider); 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // number of bits used in interpolation multiply - 15 bits avoids overflow 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static const int kNumInterpBits = 15; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // bits to shift the phase fraction down to avoid overflow 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static const int kPreInterpShift = kNumPhaseBits - kNumInterpBits; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void init() {} 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void resampleMono16(int32_t* out, size_t outFrameCount, 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioBufferProvider* provider); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void resampleStereo16(int32_t* out, size_t outFrameCount, 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioBufferProvider* provider); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef ASM_ARM_RESAMP1 // asm optimisation for ResamplerOrder1 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void AsmMono16Loop(int16_t *in, int32_t* maxOutPt, int32_t maxInIdx, 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t &outputIndex, int32_t* out, size_t &inputIndex, int32_t vl, int32_t vr, 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t &phaseFraction, uint32_t phaseIncrement); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void AsmStereo16Loop(int16_t *in, int32_t* maxOutPt, int32_t maxInIdx, 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t &outputIndex, int32_t* out, size_t &inputIndex, int32_t vl, int32_t vr, 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t &phaseFraction, uint32_t phaseIncrement); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ASM_ARM_RESAMP1 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static inline int32_t Interp(int32_t x0, int32_t x1, uint32_t f) { 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return x0 + (((x1 - x0) * (int32_t)(f >> kPreInterpShift)) >> kNumInterpBits); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static inline void Advance(size_t* index, uint32_t* frac, uint32_t inc) { 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *frac += inc; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *index += (size_t)(*frac >> kNumPhaseBits); 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *frac &= kPhaseMask; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mX0L; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mX0R; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectAudioResampler* AudioResampler::create(int bitDepth, int inChannelCount, 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t sampleRate, int quality) { 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // can only create low quality resample now 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioResampler* resampler; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char value[PROPERTY_VALUE_MAX]; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (property_get("af.resampler.quality", value, 0)) { 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project quality = atoi(value); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGD("forcing AudioResampler quality to %d", quality); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (quality == DEFAULT) 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project quality = LOW_QUALITY; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (quality) { 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case LOW_QUALITY: 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Create linear Resampler"); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resampler = new AudioResamplerOrder1(bitDepth, inChannelCount, sampleRate); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case MED_QUALITY: 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Create cubic Resampler"); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resampler = new AudioResamplerCubic(bitDepth, inChannelCount, sampleRate); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case HIGH_QUALITY: 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGV("Create sinc Resampler"); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resampler = new AudioResamplerSinc(bitDepth, inChannelCount, sampleRate); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // initialize resampler 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resampler->init(); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return resampler; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectAudioResampler::AudioResampler(int bitDepth, int inChannelCount, 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t sampleRate) : 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBitDepth(bitDepth), mChannelCount(inChannelCount), 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSampleRate(sampleRate), mInSampleRate(sampleRate), mInputIndex(0), 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhaseFraction(0) { 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // sanity check on format 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((bitDepth != 16) ||(inChannelCount < 1) || (inChannelCount > 2)) { 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOGE("Unsupported sample format, %d bits, %d channels", bitDepth, 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inChannelCount); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOG_ASSERT(0); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // initialize common members 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVolume[0] = mVolume[1] = 0; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBuffer.frameCount = 0; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // save format for quick lookup 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (inChannelCount == 1) { 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFormat = MONO_16_BIT; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFormat = STEREO_16_BIT; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectAudioResampler::~AudioResampler() { 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid AudioResampler::setSampleRate(int32_t inSampleRate) { 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInSampleRate = inSampleRate; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhaseIncrement = (uint32_t)((kPhaseMultiplier * inSampleRate) / mSampleRate); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid AudioResampler::setVolume(int16_t left, int16_t right) { 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: Implement anti-zipper filter 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVolume[0] = left; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mVolume[1] = right; 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1554bb21c496b2c9427c18b8370dd631339e4e11094Eric Laurentvoid AudioResampler::reset() { 1564bb21c496b2c9427c18b8370dd631339e4e11094Eric Laurent mInputIndex = 0; 1574bb21c496b2c9427c18b8370dd631339e4e11094Eric Laurent mPhaseFraction = 0; 1584bb21c496b2c9427c18b8370dd631339e4e11094Eric Laurent mBuffer.frameCount = 0; 1594bb21c496b2c9427c18b8370dd631339e4e11094Eric Laurent} 1604bb21c496b2c9427c18b8370dd631339e4e11094Eric Laurent 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid AudioResamplerOrder1::resample(int32_t* out, size_t outFrameCount, 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioBufferProvider* provider) { 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // should never happen, but we overflow if it does 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOG_ASSERT(outFrameCount < 32767); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // select the appropriate resampler 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (mChannelCount) { 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 1: 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resampleMono16(out, outFrameCount, provider); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case 2: 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project resampleStereo16(out, outFrameCount, provider); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid AudioResamplerOrder1::resampleStereo16(int32_t* out, size_t outFrameCount, 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioBufferProvider* provider) { 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t vl = mVolume[0]; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t vr = mVolume[1]; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t inputIndex = mInputIndex; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t phaseFraction = mPhaseFraction; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t phaseIncrement = mPhaseIncrement; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t outputIndex = 0; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t outputSampleCount = outFrameCount * 2; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t inFrameCount = (outFrameCount*mInSampleRate)/mSampleRate; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOGE("starting resample %d frames, inputIndex=%d, phaseFraction=%d, phaseIncrement=%d\n", 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // outFrameCount, inputIndex, phaseFraction, phaseIncrement); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (outputIndex < outputSampleCount) { 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // buffer is empty, fetch a new one 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (mBuffer.frameCount == 0) { 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBuffer.frameCount = inFrameCount; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project provider->getNextBuffer(&mBuffer); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBuffer.raw == NULL) { 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto resampleStereo16_exit; 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOGE("New buffer fetched: %d frames\n", mBuffer.frameCount); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBuffer.frameCount > inputIndex) break; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inputIndex -= mBuffer.frameCount; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mX0L = mBuffer.i16[mBuffer.frameCount*2-2]; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mX0R = mBuffer.i16[mBuffer.frameCount*2-1]; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project provider->releaseBuffer(&mBuffer); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // mBuffer.frameCount == 0 now so we reload a new buffer 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int16_t *in = mBuffer.i16; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // handle boundary case 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (inputIndex == 0) { 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOGE("boundary case\n"); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out[outputIndex++] += vl * Interp(mX0L, in[0], phaseFraction); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out[outputIndex++] += vr * Interp(mX0R, in[1], phaseFraction); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Advance(&inputIndex, &phaseFraction, phaseIncrement); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outputIndex == outputSampleCount) 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // process input samples 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOGE("general case\n"); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef ASM_ARM_RESAMP1 // asm optimisation for ResamplerOrder1 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (inputIndex + 2 < mBuffer.frameCount) { 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t* maxOutPt; 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t maxInIdx; 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxOutPt = out + (outputSampleCount - 2); // 2 because 2 frames per loop 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxInIdx = mBuffer.frameCount - 2; 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AsmStereo16Loop(in, maxOutPt, maxInIdx, outputIndex, out, inputIndex, vl, vr, 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phaseFraction, phaseIncrement); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ASM_ARM_RESAMP1 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (outputIndex < outputSampleCount && inputIndex < mBuffer.frameCount) { 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out[outputIndex++] += vl * Interp(in[inputIndex*2-2], 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project in[inputIndex*2], phaseFraction); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out[outputIndex++] += vr * Interp(in[inputIndex*2-1], 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project in[inputIndex*2+1], phaseFraction); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Advance(&inputIndex, &phaseFraction, phaseIncrement); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOGE("loop done - outputIndex=%d, inputIndex=%d\n", outputIndex, inputIndex); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if done with buffer, save samples 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (inputIndex >= mBuffer.frameCount) { 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inputIndex -= mBuffer.frameCount; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOGE("buffer done, new input index %d", inputIndex); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mX0L = mBuffer.i16[mBuffer.frameCount*2-2]; 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mX0R = mBuffer.i16[mBuffer.frameCount*2-1]; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project provider->releaseBuffer(&mBuffer); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // verify that the releaseBuffer resets the buffer frameCount 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOG_ASSERT(mBuffer.frameCount == 0); 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOGE("output buffer full - outputIndex=%d, inputIndex=%d\n", outputIndex, inputIndex); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectresampleStereo16_exit: 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // save state 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputIndex = inputIndex; 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhaseFraction = phaseFraction; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid AudioResamplerOrder1::resampleMono16(int32_t* out, size_t outFrameCount, 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioBufferProvider* provider) { 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t vl = mVolume[0]; 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t vr = mVolume[1]; 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t inputIndex = mInputIndex; 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t phaseFraction = mPhaseFraction; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t phaseIncrement = mPhaseIncrement; 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t outputIndex = 0; 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t outputSampleCount = outFrameCount * 2; 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t inFrameCount = (outFrameCount*mInSampleRate)/mSampleRate; 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOGE("starting resample %d frames, inputIndex=%d, phaseFraction=%d, phaseIncrement=%d\n", 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // outFrameCount, inputIndex, phaseFraction, phaseIncrement); 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (outputIndex < outputSampleCount) { 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // buffer is empty, fetch a new one 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (mBuffer.frameCount == 0) { 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBuffer.frameCount = inFrameCount; 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project provider->getNextBuffer(&mBuffer); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBuffer.raw == NULL) { 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputIndex = inputIndex; 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhaseFraction = phaseFraction; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto resampleMono16_exit; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOGE("New buffer fetched: %d frames\n", mBuffer.frameCount); 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBuffer.frameCount > inputIndex) break; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inputIndex -= mBuffer.frameCount; 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mX0L = mBuffer.i16[mBuffer.frameCount-1]; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project provider->releaseBuffer(&mBuffer); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // mBuffer.frameCount == 0 now so we reload a new buffer 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int16_t *in = mBuffer.i16; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // handle boundary case 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (inputIndex == 0) { 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOGE("boundary case\n"); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t sample = Interp(mX0L, in[0], phaseFraction); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out[outputIndex++] += vl * sample; 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out[outputIndex++] += vr * sample; 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Advance(&inputIndex, &phaseFraction, phaseIncrement); 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outputIndex == outputSampleCount) 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // process input samples 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOGE("general case\n"); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef ASM_ARM_RESAMP1 // asm optimisation for ResamplerOrder1 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (inputIndex + 2 < mBuffer.frameCount) { 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t* maxOutPt; 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t maxInIdx; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxOutPt = out + (outputSampleCount - 2); 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxInIdx = (int32_t)mBuffer.frameCount - 2; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AsmMono16Loop(in, maxOutPt, maxInIdx, outputIndex, out, inputIndex, vl, vr, 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phaseFraction, phaseIncrement); 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ASM_ARM_RESAMP1 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (outputIndex < outputSampleCount && inputIndex < mBuffer.frameCount) { 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t sample = Interp(in[inputIndex-1], in[inputIndex], 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project phaseFraction); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out[outputIndex++] += vl * sample; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out[outputIndex++] += vr * sample; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Advance(&inputIndex, &phaseFraction, phaseIncrement); 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOGE("loop done - outputIndex=%d, inputIndex=%d\n", outputIndex, inputIndex); 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if done with buffer, save samples 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (inputIndex >= mBuffer.frameCount) { 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inputIndex -= mBuffer.frameCount; 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOGE("buffer done, new input index %d", inputIndex); 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mX0L = mBuffer.i16[mBuffer.frameCount-1]; 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project provider->releaseBuffer(&mBuffer); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // verify that the releaseBuffer resets the buffer frameCount 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOG_ASSERT(mBuffer.frameCount == 0); 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOGE("output buffer full - outputIndex=%d, inputIndex=%d\n", outputIndex, inputIndex); 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectresampleMono16_exit: 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // save state 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInputIndex = inputIndex; 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhaseFraction = phaseFraction; 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef ASM_ARM_RESAMP1 // asm optimisation for ResamplerOrder1 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/******************************************************************* 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* AsmMono16Loop 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* asm optimized monotonic loop version; one loop is 2 frames 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* Input: 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* in : pointer on input samples 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* maxOutPt : pointer on first not filled 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* maxInIdx : index on first not used 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* outputIndex : pointer on current output index 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* out : pointer on output buffer 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* inputIndex : pointer on current input index 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* vl, vr : left and right gain 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* phaseFraction : pointer on current phase fraction 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* phaseIncrement 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* Ouput: 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* outputIndex : 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* out : updated buffer 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* inputIndex : index of next to use 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* phaseFraction : phase fraction for next interpolation 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*******************************************************************/ 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid AudioResamplerOrder1::AsmMono16Loop(int16_t *in, int32_t* maxOutPt, int32_t maxInIdx, 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t &outputIndex, int32_t* out, size_t &inputIndex, int32_t vl, int32_t vr, 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t &phaseFraction, uint32_t phaseIncrement) 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define MO_PARAM5 "36" // offset of parameter 5 (outputIndex) 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project asm( 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "stmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, lr}\n" 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // get parameters 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r6, [sp, #" MO_PARAM5 " + 20]\n" // &phaseFraction 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r6, [r6]\n" // phaseFraction 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r7, [sp, #" MO_PARAM5 " + 8]\n" // &inputIndex 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r7, [r7]\n" // inputIndex 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r8, [sp, #" MO_PARAM5 " + 4]\n" // out 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r0, [sp, #" MO_PARAM5 " + 0]\n" // &outputIndex 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r0, [r0]\n" // outputIndex 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " add r8, r0, asl #2\n" // curOut 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r9, [sp, #" MO_PARAM5 " + 24]\n" // phaseIncrement 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r10, [sp, #" MO_PARAM5 " + 12]\n" // vl 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r11, [sp, #" MO_PARAM5 " + 16]\n" // vr 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r0 pin, x0, Samp 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r1 in 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r2 maxOutPt 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r3 maxInIdx 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r4 x1, i1, i3, Out1 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r5 out0 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r6 frac 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r7 inputIndex 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r8 curOut 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r9 inc 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r10 vl 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r11 vr 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r12 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r13 sp 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r14 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the following loop works on 2 frames 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 43780754d2078c84656e1a12d6f8a0d76ab0c10b5e4Nick Kralevich "1:\n" 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " cmp r8, r2\n" // curOut - maxCurOut 43980754d2078c84656e1a12d6f8a0d76ab0c10b5e4Nick Kralevich " bcs 2f\n" 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define MO_ONE_FRAME \ 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " add r0, r1, r7, asl #1\n" /* in + inputIndex */\ 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldrsh r4, [r0]\n" /* in[inputIndex] */\ 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r5, [r8]\n" /* out[outputIndex] */\ 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldrsh r0, [r0, #-2]\n" /* in[inputIndex-1] */\ 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " bic r6, r6, #0xC0000000\n" /* phaseFraction & ... */\ 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " sub r4, r4, r0\n" /* in[inputIndex] - in[inputIndex-1] */\ 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " mov r4, r4, lsl #2\n" /* <<2 */\ 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " smulwt r4, r4, r6\n" /* (x1-x0)*.. */\ 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " add r6, r6, r9\n" /* phaseFraction + phaseIncrement */\ 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " add r0, r0, r4\n" /* x0 - (..) */\ 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " mla r5, r0, r10, r5\n" /* vl*interp + out[] */\ 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r4, [r8, #4]\n" /* out[outputIndex+1] */\ 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " str r5, [r8], #4\n" /* out[outputIndex++] = ... */\ 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " mla r4, r0, r11, r4\n" /* vr*interp + out[] */\ 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " add r7, r7, r6, lsr #30\n" /* inputIndex + phaseFraction>>30 */\ 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " str r4, [r8], #4\n" /* out[outputIndex++] = ... */ 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MO_ONE_FRAME // frame 1 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MO_ONE_FRAME // frame 2 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " cmp r7, r3\n" // inputIndex - maxInIdx 46380754d2078c84656e1a12d6f8a0d76ab0c10b5e4Nick Kralevich " bcc 1b\n" 46480754d2078c84656e1a12d6f8a0d76ab0c10b5e4Nick Kralevich "2:\n" 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " bic r6, r6, #0xC0000000\n" // phaseFraction & ... 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // save modified values 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r0, [sp, #" MO_PARAM5 " + 20]\n" // &phaseFraction 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " str r6, [r0]\n" // phaseFraction 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r0, [sp, #" MO_PARAM5 " + 8]\n" // &inputIndex 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " str r7, [r0]\n" // inputIndex 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r0, [sp, #" MO_PARAM5 " + 4]\n" // out 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " sub r8, r0\n" // curOut - out 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " asr r8, #2\n" // new outputIndex 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r0, [sp, #" MO_PARAM5 " + 0]\n" // &outputIndex 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " str r8, [r0]\n" // save outputIndex 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc}\n" 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ); 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/******************************************************************* 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* AsmStereo16Loop 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* asm optimized stereo loop version; one loop is 2 frames 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* Input: 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* in : pointer on input samples 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* maxOutPt : pointer on first not filled 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* maxInIdx : index on first not used 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* outputIndex : pointer on current output index 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* out : pointer on output buffer 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* inputIndex : pointer on current input index 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* vl, vr : left and right gain 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* phaseFraction : pointer on current phase fraction 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* phaseIncrement 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* Ouput: 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* outputIndex : 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* out : updated buffer 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* inputIndex : index of next to use 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* phaseFraction : phase fraction for next interpolation 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project* 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*******************************************************************/ 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid AudioResamplerOrder1::AsmStereo16Loop(int16_t *in, int32_t* maxOutPt, int32_t maxInIdx, 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t &outputIndex, int32_t* out, size_t &inputIndex, int32_t vl, int32_t vr, 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t &phaseFraction, uint32_t phaseIncrement) 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ST_PARAM5 "40" // offset of parameter 5 (outputIndex) 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project asm( 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "stmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, r12, lr}\n" 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // get parameters 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r6, [sp, #" ST_PARAM5 " + 20]\n" // &phaseFraction 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r6, [r6]\n" // phaseFraction 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r7, [sp, #" ST_PARAM5 " + 8]\n" // &inputIndex 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r7, [r7]\n" // inputIndex 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r8, [sp, #" ST_PARAM5 " + 4]\n" // out 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r0, [sp, #" ST_PARAM5 " + 0]\n" // &outputIndex 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r0, [r0]\n" // outputIndex 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " add r8, r0, asl #2\n" // curOut 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r9, [sp, #" ST_PARAM5 " + 24]\n" // phaseIncrement 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r10, [sp, #" ST_PARAM5 " + 12]\n" // vl 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r11, [sp, #" ST_PARAM5 " + 16]\n" // vr 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r0 pin, x0, Samp 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r1 in 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r2 maxOutPt 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r3 maxInIdx 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r4 x1, i1, i3, out1 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r5 out0 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r6 frac 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r7 inputIndex 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r8 curOut 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r9 inc 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r10 vl 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r11 vr 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r12 temporary 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r13 sp 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // r14 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 54480754d2078c84656e1a12d6f8a0d76ab0c10b5e4Nick Kralevich "3:\n" 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " cmp r8, r2\n" // curOut - maxCurOut 54680754d2078c84656e1a12d6f8a0d76ab0c10b5e4Nick Kralevich " bcs 4f\n" 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ST_ONE_FRAME \ 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " bic r6, r6, #0xC0000000\n" /* phaseFraction & ... */\ 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project\ 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " add r0, r1, r7, asl #2\n" /* in + 2*inputIndex */\ 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project\ 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldrsh r4, [r0]\n" /* in[2*inputIndex] */\ 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r5, [r8]\n" /* out[outputIndex] */\ 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldrsh r12, [r0, #-4]\n" /* in[2*inputIndex-2] */\ 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " sub r4, r4, r12\n" /* in[2*InputIndex] - in[2*InputIndex-2] */\ 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " mov r4, r4, lsl #2\n" /* <<2 */\ 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " smulwt r4, r4, r6\n" /* (x1-x0)*.. */\ 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " add r12, r12, r4\n" /* x0 - (..) */\ 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " mla r5, r12, r10, r5\n" /* vl*interp + out[] */\ 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r4, [r8, #4]\n" /* out[outputIndex+1] */\ 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " str r5, [r8], #4\n" /* out[outputIndex++] = ... */\ 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project\ 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldrsh r12, [r0, #+2]\n" /* in[2*inputIndex+1] */\ 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldrsh r0, [r0, #-2]\n" /* in[2*inputIndex-1] */\ 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " sub r12, r12, r0\n" /* in[2*InputIndex] - in[2*InputIndex-2] */\ 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " mov r12, r12, lsl #2\n" /* <<2 */\ 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " smulwt r12, r12, r6\n" /* (x1-x0)*.. */\ 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " add r12, r0, r12\n" /* x0 - (..) */\ 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " mla r4, r12, r11, r4\n" /* vr*interp + out[] */\ 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " str r4, [r8], #4\n" /* out[outputIndex++] = ... */\ 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project\ 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " add r6, r6, r9\n" /* phaseFraction + phaseIncrement */\ 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " add r7, r7, r6, lsr #30\n" /* inputIndex + phaseFraction>>30 */ 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ST_ONE_FRAME // frame 1 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ST_ONE_FRAME // frame 1 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " cmp r7, r3\n" // inputIndex - maxInIdx 58080754d2078c84656e1a12d6f8a0d76ab0c10b5e4Nick Kralevich " bcc 3b\n" 58180754d2078c84656e1a12d6f8a0d76ab0c10b5e4Nick Kralevich "4:\n" 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " bic r6, r6, #0xC0000000\n" // phaseFraction & ... 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // save modified values 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r0, [sp, #" ST_PARAM5 " + 20]\n" // &phaseFraction 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " str r6, [r0]\n" // phaseFraction 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r0, [sp, #" ST_PARAM5 " + 8]\n" // &inputIndex 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " str r7, [r0]\n" // inputIndex 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r0, [sp, #" ST_PARAM5 " + 4]\n" // out 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " sub r8, r0\n" // curOut - out 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " asr r8, #2\n" // new outputIndex 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldr r0, [sp, #" ST_PARAM5 " + 0]\n" // &outputIndex 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " str r8, [r0]\n" // save outputIndex 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project " ldmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, r12, pc}\n" 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ); 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ASM_ARM_RESAMP1 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project; // namespace android 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 606