165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/* 265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Copyright (C) 2007 The Android Open Source Project 365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * you may not use this file except in compliance with the License. 665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * You may obtain a copy of the License at 765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * 1065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Unless required by applicable law or agreed to in writing, software 1165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 1265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * See the License for the specific language governing permissions and 1465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * limitations under the License. 1565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian */ 1665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 1765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#ifndef ANDROID_AUDIO_RESAMPLER_SINC_H 1865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#define ANDROID_AUDIO_RESAMPLER_SINC_H 1965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 2065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <stdint.h> 2165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <sys/types.h> 2265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <cutils/log.h> 2365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 2465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include "AudioResampler.h" 2565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 2665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiannamespace android { 2765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 2876b111685010e1fea7c0a865c038aee35507fde4SathishKumar Mani 2976b111685010e1fea7c0a865c038aee35507fde4SathishKumar Manitypedef const int32_t * (*readCoefficientsFn)(bool upDownSample); 30ac6020508acedd316391dee42329040bf45f8d90Glenn Kastentypedef int32_t (*readResampleFirNumCoeffFn)(); 31ac6020508acedd316391dee42329040bf45f8d90Glenn Kastentypedef int32_t (*readResampleFirLerpIntBitsFn)(); 3276b111685010e1fea7c0a865c038aee35507fde4SathishKumar Mani 3365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// ---------------------------------------------------------------------------- 3465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 3565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianclass AudioResamplerSinc : public AudioResampler { 3665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianpublic: 37ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten AudioResamplerSinc(int bitDepth, int inChannelCount, int32_t sampleRate, 38ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten src_quality quality = HIGH_QUALITY); 3965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 40c19e22450e6e3d07594c935c7a9522e85e909e82Glenn Kasten virtual ~AudioResamplerSinc(); 4165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 4265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian virtual void resample(int32_t* out, size_t outFrameCount, 4365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian AudioBufferProvider* provider); 4465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianprivate: 4565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void init(); 4665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 4765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian template<int CHANNELS> 4865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian void resample(int32_t* out, size_t outFrameCount, 4965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian AudioBufferProvider* provider); 5065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 5165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian template<int CHANNELS> 5265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian inline void filterCoefficient( 5354c3b66444ebfb9f2265ee70ac3b76ccefa0506aGlenn Kasten int32_t& l, int32_t& r, uint32_t phase, const int16_t *samples); 5465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 5565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian template<int CHANNELS> 5665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian inline void interpolate( 5765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int32_t& l, int32_t& r, 5854c3b66444ebfb9f2265ee70ac3b76ccefa0506aGlenn Kasten const int32_t* coefs, int16_t lerp, const int16_t* samples); 5965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 6065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian template<int CHANNELS> 6165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian inline void read(int16_t*& impulse, uint32_t& phaseFraction, 6254c3b66444ebfb9f2265ee70ac3b76ccefa0506aGlenn Kasten const int16_t* in, size_t inputIndex); 6365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 6465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int16_t *mState; 6565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int16_t *mImpulse; 6665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian int16_t *mRingFull; 6765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 6854c3b66444ebfb9f2265ee70ac3b76ccefa0506aGlenn Kasten const int32_t * mFirCoefs; 6965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian static const int32_t mFirCoefsDown[]; 7065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian static const int32_t mFirCoefsUp[]; 7165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 7265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian // ---------------------------------------------------------------------------- 7365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian static const int32_t RESAMPLE_FIR_NUM_COEF = 8; 7465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian static const int32_t RESAMPLE_FIR_LERP_INT_BITS = 4; 7565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 76ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten struct Constants { 77ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten // we have 16 coefs samples per zero-crossing 78ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten int coefsBits; 79ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten int cShift; 80ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten uint32_t cMask; 81ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten 82ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten int pShift; 83ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten uint32_t pMask; 84ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten 85ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten // number of zero-crossing on each side 86ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten unsigned int halfNumCoefs; 87ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten }; 8865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 89ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten static Constants highQualityConstants; 90ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten static Constants veryHighQualityConstants; 91ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten const Constants *mConstants; // points to appropriate set of coefficient parameters 9265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 93ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten static void init_routine(); 9465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; 9565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 9665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// ---------------------------------------------------------------------------- 9765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; // namespace android 9865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian 9965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#endif /*ANDROID_AUDIO_RESAMPLER_SINC_H*/ 100