AudioHardware: Dispatch setParameters to input and output
[tinyalsa-audio.git] / AudioResampler.h
1 /*
2  * Copyright (C) 2012 Paul Kocialkowski <contact@paulk.fr>
3  *
4  * This is based on Android 4.0 resampler
5  * Copyright 2011, The Android Open-Source Project
6  *
7  * This is based on Nexus S AudioHardware implementation:
8  * Copyright 2010, The Android Open-Source Project
9  *
10  * Licensed under the Apache License, Version 2.0 (the "License");
11  * you may not use this file except in compliance with the License.
12  * You may obtain a copy of the License at
13  *
14  *     http://www.apache.org/licenses/LICENSE-2.0
15  *
16  * Unless required by applicable law or agreed to in writing, software
17  * distributed under the License is distributed on an "AS IS" BASIS,
18  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19  * See the License for the specific language governing permissions and
20  * limitations under the License.
21  */
22
23 #ifndef TINYALSA_AUDIO_RESAMPLER_H
24 #define TINYALSA_AUDIO_RESAMPLER_H
25
26 #include <stdint.h>
27 #include <sys/time.h>
28
29 #include <hardware_legacy/AudioHardwareBase.h>
30 #include <speex/speex_resampler.h>
31 #include "AudioHardware.h"
32
33 #define RESAMPLER_QUALITY_MAX 10
34 #define RESAMPLER_QUALITY_MIN 0
35 #define RESAMPLER_QUALITY_DEFAULT 4
36 #define RESAMPLER_QUALITY_VOIP 3
37 #define RESAMPLER_QUALITY_DESKTOP 5
38
39 namespace android {
40
41 struct resampler_buffer {
42     union {
43         void*       raw;
44         short*      i16;
45         int8_t*     i8;
46     };
47     size_t frame_count;
48 };
49
50 /* call back interface used by the resampler to get new data */
51 struct resampler_buffer_provider
52 {
53     /**
54      *  get a new buffer of data:
55      *   as input: buffer->frame_count is the number of frames requested
56      *   as output: buffer->frame_count is the number of frames returned
57      *              buffer->raw points to data returned
58      */
59     int (*get_next_buffer)(struct resampler_buffer_provider *provider,
60             struct resampler_buffer *buffer);
61     /**
62      *  release a consumed buffer of data:
63      *   as input: buffer->frame_count is the number of frames released
64      *             buffer->raw points to data released
65      */
66     void (*release_buffer)(struct resampler_buffer_provider *provider,
67             struct resampler_buffer *buffer);
68
69     void *pdata;
70 };
71
72 /* resampler interface */
73 struct resampler_itfe {
74     /**
75      * reset resampler state
76      */
77     void (*reset)(struct resampler_itfe *resampler);
78     /**
79      * resample input from buffer provider and output at most *outFrameCount to out buffer.
80      * *outFrameCount is updated with the actual number of frames produced.
81      */
82     int (*resample_from_provider)(struct resampler_itfe *resampler,
83                     int16_t *out,
84                     size_t *outFrameCount);
85     /**
86      * resample at most *inFrameCount frames from in buffer and output at most
87      * *outFrameCount to out buffer. *inFrameCount and *outFrameCount are updated respectively
88      * with the number of frames remaining in input and written to output.
89      */
90     int (*resample_from_input)(struct resampler_itfe *resampler,
91                     int16_t *in,
92                     size_t *inFrameCount,
93                     int16_t *out,
94                     size_t *outFrameCount);
95     /**
96      * return the latency introduced by the resampler in ns.
97      */
98     int32_t (*delay_ns)(struct resampler_itfe *resampler);
99 };
100
101 /**
102  * create a resampler according to input parameters passed.
103  * If resampler_buffer_provider is not NULL only resample_from_provider() can be called.
104  * If resampler_buffer_provider is NULL only resample_from_input() can be called.
105  */
106 int create_resampler(uint32_t inSampleRate,
107           uint32_t outSampleRate,
108           uint32_t channelCount,
109           uint32_t quality,
110           struct resampler_buffer_provider *provider,
111           struct resampler_itfe **);
112
113 /**
114  * release resampler resources.
115  */
116 void release_resampler(struct resampler_itfe *);
117
118 class TinyALSAAudioResampler
119 {
120 public:
121         TinyALSAAudioResampler(
122                 struct pcm *Pcm, int PcmReadFrames,
123                 uint32_t sampleRateIn, uint32_t channelsIn,
124                 uint32_t sampleRateOut, uint32_t channelsOut);
125         virtual ~TinyALSAAudioResampler();
126
127         virtual void convertChannels(void *inBuffer, void *outBuffer,
128         int inChannels, int outChannels, int frames);
129         virtual ssize_t resample(void *buffer, int length);
130
131         virtual uint32_t sampleRate(void) const;
132         virtual size_t bufferSize(void) const;
133         virtual uint32_t channels(void) const;
134
135         struct pcm *mPcm;
136
137         int mFrameSizeIn;
138         int mFrameSizeOut;
139
140         void *mPcmReadBuffer;
141
142         int mPcmReadFrames;
143         int mFramesIn;
144
145 private:
146         uint32_t mSampleRateIn;
147         uint32_t mChannelsIn;
148         uint32_t mSampleRateOut;
149         uint32_t mChannelsOut;
150
151         void *mResampledBuffer;
152         int mResampledFrames;
153         void *mOutBuffer;
154
155         struct resampler_itfe *mResampler;
156         struct resampler_buffer_provider mResamplerProvider;
157 };
158
159 }; // namespace android
160
161 #endif