| /* |
| * Copyright (C) 2007 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef ANDROID_AUDIO_RESAMPLER_CUBIC_H |
| #define ANDROID_AUDIO_RESAMPLER_CUBIC_H |
| |
| #include <stdint.h> |
| #include <sys/types.h> |
| #include <cutils/log.h> |
| |
| #include "AudioResampler.h" |
| |
| namespace android { |
| // ---------------------------------------------------------------------------- |
| |
| class AudioResamplerCubic : public AudioResampler { |
| public: |
| AudioResamplerCubic(int bitDepth, int inChannelCount, int32_t sampleRate) : |
| AudioResampler(bitDepth, inChannelCount, sampleRate) { |
| } |
| virtual void resample(int32_t* out, size_t outFrameCount, |
| AudioBufferProvider* provider); |
| private: |
| // number of bits used in interpolation multiply - 14 bits avoids overflow |
| static const int kNumInterpBits = 14; |
| |
| // bits to shift the phase fraction down to avoid overflow |
| static const int kPreInterpShift = kNumPhaseBits - kNumInterpBits; |
| typedef struct { |
| int32_t a, b, c, y0, y1, y2, y3; |
| } state; |
| void init(); |
| void resampleMono16(int32_t* out, size_t outFrameCount, |
| AudioBufferProvider* provider); |
| void resampleStereo16(int32_t* out, size_t outFrameCount, |
| AudioBufferProvider* provider); |
| static inline int32_t interp(state* p, int32_t x) { |
| return (((((p->a * x >> 14) + p->b) * x >> 14) + p->c) * x >> 14) + p->y1; |
| } |
| static inline void advance(state* p, int16_t in) { |
| p->y0 = p->y1; |
| p->y1 = p->y2; |
| p->y2 = p->y3; |
| p->y3 = in; |
| p->a = (3 * (p->y1 - p->y2) - p->y0 + p->y3) >> 1; |
| p->b = (p->y2 << 1) + p->y0 - (((5 * p->y1 + p->y3)) >> 1); |
| p->c = (p->y2 - p->y0) >> 1; |
| } |
| state left, right; |
| }; |
| |
| // ---------------------------------------------------------------------------- |
| }; // namespace android |
| |
| #endif /*ANDROID_AUDIO_RESAMPLER_CUBIC_H*/ |