The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2007 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_CUBIC_H |
| 18 | #define ANDROID_AUDIO_RESAMPLER_CUBIC_H |
| 19 | |
| 20 | #include <stdint.h> |
| 21 | #include <sys/types.h> |
| 22 | #include <cutils/log.h> |
| 23 | |
| 24 | #include "AudioResampler.h" |
| 25 | |
| 26 | namespace android { |
| 27 | // ---------------------------------------------------------------------------- |
| 28 | |
| 29 | class AudioResamplerCubic : public AudioResampler { |
| 30 | public: |
| 31 | AudioResamplerCubic(int bitDepth, int inChannelCount, int32_t sampleRate) : |
| 32 | AudioResampler(bitDepth, inChannelCount, sampleRate) { |
| 33 | } |
| 34 | virtual void resample(int32_t* out, size_t outFrameCount, |
| 35 | AudioBufferProvider* provider); |
| 36 | private: |
| 37 | // number of bits used in interpolation multiply - 14 bits avoids overflow |
| 38 | static const int kNumInterpBits = 14; |
| 39 | |
| 40 | // bits to shift the phase fraction down to avoid overflow |
| 41 | static const int kPreInterpShift = kNumPhaseBits - kNumInterpBits; |
| 42 | typedef struct { |
| 43 | int32_t a, b, c, y0, y1, y2, y3; |
| 44 | } state; |
| 45 | void init(); |
| 46 | void resampleMono16(int32_t* out, size_t outFrameCount, |
| 47 | AudioBufferProvider* provider); |
| 48 | void resampleStereo16(int32_t* out, size_t outFrameCount, |
| 49 | AudioBufferProvider* provider); |
| 50 | static inline int32_t interp(state* p, int32_t x) { |
| 51 | return (((((p->a * x >> 14) + p->b) * x >> 14) + p->c) * x >> 14) + p->y1; |
| 52 | } |
| 53 | static inline void advance(state* p, int16_t in) { |
| 54 | p->y0 = p->y1; |
| 55 | p->y1 = p->y2; |
| 56 | p->y2 = p->y3; |
| 57 | p->y3 = in; |
| 58 | p->a = (3 * (p->y1 - p->y2) - p->y0 + p->y3) >> 1; |
| 59 | p->b = (p->y2 << 1) + p->y0 - (((5 * p->y1 + p->y3)) >> 1); |
| 60 | p->c = (p->y2 - p->y0) >> 1; |
| 61 | } |
| 62 | state left, right; |
| 63 | }; |
| 64 | |
| 65 | // ---------------------------------------------------------------------------- |
| 66 | }; // namespace android |
| 67 | |
| 68 | #endif /*ANDROID_AUDIO_RESAMPLER_CUBIC_H*/ |