xref: /aosp_15_r20/frameworks/av/media/libaudioprocessing/AudioResamplerCubic.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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