1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ANDROID_AUDIO_RESAMPLER_DYN_H 18 #define ANDROID_AUDIO_RESAMPLER_DYN_H 19 20 #include <stdint.h> 21 #include <sys/types.h> 22 #include <android/log.h> 23 24 #include <media/AudioResampler.h> 25 26 namespace android { 27 28 /* AudioResamplerDyn 29 * 30 * This class template is used for floating point and integer resamplers. 31 * 32 * Type variables: 33 * TC = filter coefficient type (one of int16_t, int32_t, or float) 34 * TI = input data type (one of int16_t or float) 35 * TO = output data type (one of int32_t or float) 36 * 37 * For integer input data types TI, the coefficient type TC is either int16_t or int32_t. 38 * For float input data types TI, the coefficient type TC is float. 39 */ 40 41 template<typename TC, typename TI, typename TO> 42 class AudioResamplerDyn: public AudioResampler { 43 public: 44 AudioResamplerDyn(int inChannelCount, 45 int32_t sampleRate, src_quality quality); 46 47 virtual ~AudioResamplerDyn(); 48 49 virtual void init(); 50 51 virtual void setSampleRate(int32_t inSampleRate); 52 53 virtual void setVolume(float left, float right); 54 55 virtual size_t resample(int32_t* out, size_t outFrameCount, 56 AudioBufferProvider* provider); 57 58 private: 59 60 class Constants { // stores the filter constants. 61 public: Constants()62 Constants() : 63 mL(0), mShift(0), mHalfNumCoefs(0), mFirCoefs(NULL) 64 {} 65 void set(int L, int halfNumCoefs, 66 int inSampleRate, int outSampleRate); 67 68 int mL; // interpolation phases in the filter. 69 int mShift; // right shift to get polyphase index 70 unsigned int mHalfNumCoefs; // filter half #coefs 71 const TC* mFirCoefs; // polyphase filter bank 72 }; 73 74 class InBuffer { // buffer management for input type TI 75 public: 76 InBuffer(); 77 ~InBuffer(); 78 void init(); 79 80 void resize(int CHANNELS, int halfNumCoefs); 81 82 // used for direct management of the mImpulse pointer getImpulse()83 inline TI* getImpulse() { 84 return mImpulse; 85 } 86 setImpulse(TI * impulse)87 inline void setImpulse(TI *impulse) { 88 mImpulse = impulse; 89 } 90 91 template<int CHANNELS> 92 inline void readAgain(TI*& impulse, const int halfNumCoefs, 93 const TI* const in, const size_t inputIndex); 94 95 template<int CHANNELS> 96 inline void readAdvance(TI*& impulse, const int halfNumCoefs, 97 const TI* const in, const size_t inputIndex); 98 99 void reset(); 100 101 private: 102 // tuning parameter guidelines: 2 <= multiple <= 8 103 static const int kStateSizeMultipleOfFilterLength = 4; 104 105 // in general, mRingFull = mState + mStateSize - halfNumCoefs*CHANNELS. 106 TI* mState; // base pointer for the input buffer storage 107 TI* mImpulse; // current location of the impulse response (centered) 108 TI* mRingFull; // mState <= mImpulse < mRingFull 109 size_t mStateCount; // size of state in units of TI. 110 }; 111 112 void createKaiserFir(Constants &c, double stopBandAtten, 113 int inSampleRate, int outSampleRate, double tbwCheat); 114 115 template<int CHANNELS, bool LOCKED, int STRIDE> 116 size_t resample(TO* out, size_t outFrameCount, AudioBufferProvider* provider); 117 118 // define a pointer to member function type for resample 119 typedef size_t (AudioResamplerDyn<TC, TI, TO>::*resample_ABP_t)(TO* out, 120 size_t outFrameCount, AudioBufferProvider* provider); 121 122 // data - the contiguous storage and layout of these is important. 123 InBuffer mInBuffer; 124 Constants mConstants; // current set of coefficient parameters 125 TO __attribute__ ((aligned (8))) mVolumeSimd[2]; // must be aligned or NEON may crash 126 resample_ABP_t mResampleFunc; // called function for resampling 127 int32_t mFilterSampleRate; // designed filter sample rate. 128 src_quality mFilterQuality; // designed filter quality. 129 void* mCoefBuffer; // if a filter is created, this is not null 130 }; 131 132 } // namespace android 133 134 #endif /*ANDROID_AUDIO_RESAMPLER_DYN_H*/ 135