1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2007 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #ifndef ANDROID_AUDIO_RESAMPLER_CUBIC_H 18*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_AUDIO_RESAMPLER_CUBIC_H 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include <stdint.h> 21*ec779b8eSAndroid Build Coastguard Worker #include <sys/types.h> 22*ec779b8eSAndroid Build Coastguard Worker #include <android/log.h> 23*ec779b8eSAndroid Build Coastguard Worker 24*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioResampler.h> 25*ec779b8eSAndroid Build Coastguard Worker 26*ec779b8eSAndroid Build Coastguard Worker namespace android { 27*ec779b8eSAndroid Build Coastguard Worker // ---------------------------------------------------------------------------- 28*ec779b8eSAndroid Build Coastguard Worker 29*ec779b8eSAndroid Build Coastguard Worker class AudioResamplerCubic : public AudioResampler { 30*ec779b8eSAndroid Build Coastguard Worker public: AudioResamplerCubic(int inChannelCount,int32_t sampleRate)31*ec779b8eSAndroid Build Coastguard Worker AudioResamplerCubic(int inChannelCount, int32_t sampleRate) : 32*ec779b8eSAndroid Build Coastguard Worker AudioResampler(inChannelCount, sampleRate, MED_QUALITY) { 33*ec779b8eSAndroid Build Coastguard Worker } 34*ec779b8eSAndroid Build Coastguard Worker virtual size_t resample(int32_t* out, size_t outFrameCount, 35*ec779b8eSAndroid Build Coastguard Worker AudioBufferProvider* provider); 36*ec779b8eSAndroid Build Coastguard Worker private: 37*ec779b8eSAndroid Build Coastguard Worker // number of bits used in interpolation multiply - 14 bits avoids overflow 38*ec779b8eSAndroid Build Coastguard Worker static const int kNumInterpBits = 14; 39*ec779b8eSAndroid Build Coastguard Worker 40*ec779b8eSAndroid Build Coastguard Worker // bits to shift the phase fraction down to avoid overflow 41*ec779b8eSAndroid Build Coastguard Worker static const int kPreInterpShift = kNumPhaseBits - kNumInterpBits; 42*ec779b8eSAndroid Build Coastguard Worker typedef struct { 43*ec779b8eSAndroid Build Coastguard Worker int32_t a, b, c, y0, y1, y2, y3; 44*ec779b8eSAndroid Build Coastguard Worker } state; 45*ec779b8eSAndroid Build Coastguard Worker void init(); 46*ec779b8eSAndroid Build Coastguard Worker size_t resampleMono16(int32_t* out, size_t outFrameCount, 47*ec779b8eSAndroid Build Coastguard Worker AudioBufferProvider* provider); 48*ec779b8eSAndroid Build Coastguard Worker size_t resampleStereo16(int32_t* out, size_t outFrameCount, 49*ec779b8eSAndroid Build Coastguard Worker AudioBufferProvider* provider); interp(state * p,int32_t x)50*ec779b8eSAndroid Build Coastguard Worker static inline int32_t interp(state* p, int32_t x) { 51*ec779b8eSAndroid Build Coastguard Worker return (((((p->a * x >> 14) + p->b) * x >> 14) + p->c) * x >> 14) + p->y1; 52*ec779b8eSAndroid Build Coastguard Worker } advance(state * p,int16_t in)53*ec779b8eSAndroid Build Coastguard Worker static inline void advance(state* p, int16_t in) { 54*ec779b8eSAndroid Build Coastguard Worker p->y0 = p->y1; 55*ec779b8eSAndroid Build Coastguard Worker p->y1 = p->y2; 56*ec779b8eSAndroid Build Coastguard Worker p->y2 = p->y3; 57*ec779b8eSAndroid Build Coastguard Worker p->y3 = in; 58*ec779b8eSAndroid Build Coastguard Worker p->a = (3 * (p->y1 - p->y2) - p->y0 + p->y3) >> 1; 59*ec779b8eSAndroid Build Coastguard Worker p->b = (p->y2 << 1) + p->y0 - (((5 * p->y1 + p->y3)) >> 1); 60*ec779b8eSAndroid Build Coastguard Worker p->c = (p->y2 - p->y0) >> 1; 61*ec779b8eSAndroid Build Coastguard Worker } 62*ec779b8eSAndroid Build Coastguard Worker state left, right; 63*ec779b8eSAndroid Build Coastguard Worker }; 64*ec779b8eSAndroid Build Coastguard Worker 65*ec779b8eSAndroid Build Coastguard Worker // ---------------------------------------------------------------------------- 66*ec779b8eSAndroid Build Coastguard Worker } // namespace android 67*ec779b8eSAndroid Build Coastguard Worker 68*ec779b8eSAndroid Build Coastguard Worker #endif /*ANDROID_AUDIO_RESAMPLER_CUBIC_H*/ 69