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