• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef fooresamplerhfoo
2 #define fooresamplerhfoo
3 
4 /***
5   This file is part of PulseAudio.
6 
7   Copyright 2004-2006 Lennart Poettering
8 
9   PulseAudio is free software; you can redistribute it and/or modify
10   it under the terms of the GNU Lesser General Public License as published
11   by the Free Software Foundation; either version 2.1 of the License,
12   or (at your option) any later version.
13 
14   PulseAudio is distributed in the hope that it will be useful, but
15   WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17   General Public License for more details.
18 
19   You should have received a copy of the GNU Lesser General Public License
20   along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
21 ***/
22 
23 #include <pulse/sample.h>
24 #include <pulse/channelmap.h>
25 #include <pulsecore/memblock.h>
26 #include <pulsecore/memchunk.h>
27 #include <pulsecore/sconv.h>
28 #include <pulsecore/remap.h>
29 #include <pulsecore/filter/lfe-filter.h>
30 
31 typedef struct pa_resampler pa_resampler;
32 typedef struct pa_resampler_impl pa_resampler_impl;
33 
34 struct pa_resampler_impl {
35     void (*free)(pa_resampler *r);
36     void (*update_rates)(pa_resampler *r);
37 
38     /* Returns the number of leftover frames in the input buffer. */
39     unsigned (*resample)(pa_resampler *r, const pa_memchunk *in, unsigned in_n_frames, pa_memchunk *out, unsigned *out_n_frames);
40 
41     void (*reset)(pa_resampler *r);
42     void *data;
43 };
44 
45 typedef enum pa_resample_method {
46     PA_RESAMPLER_INVALID                 = -1,
47     PA_RESAMPLER_SRC_SINC_BEST_QUALITY   = 0, /* = SRC_SINC_BEST_QUALITY */
48     PA_RESAMPLER_SRC_SINC_MEDIUM_QUALITY = 1, /* = SRC_SINC_MEDIUM_QUALITY */
49     PA_RESAMPLER_SRC_SINC_FASTEST        = 2, /* = SRC_SINC_FASTEST */
50     PA_RESAMPLER_SRC_ZERO_ORDER_HOLD     = 3, /* = SRC_ZERO_ORDER_HOLD */
51     PA_RESAMPLER_SRC_LINEAR              = 4, /* = SRC_LINEAR */
52     PA_RESAMPLER_TRIVIAL,
53     PA_RESAMPLER_SPEEX_FLOAT_BASE,
54     PA_RESAMPLER_SPEEX_FLOAT_MAX = PA_RESAMPLER_SPEEX_FLOAT_BASE + 10,
55     PA_RESAMPLER_SPEEX_FIXED_BASE,
56     PA_RESAMPLER_SPEEX_FIXED_MAX = PA_RESAMPLER_SPEEX_FIXED_BASE + 10,
57     PA_RESAMPLER_FFMPEG,
58     PA_RESAMPLER_AUTO, /* automatic select based on sample format */
59     PA_RESAMPLER_COPY,
60     PA_RESAMPLER_PEAKS,
61     PA_RESAMPLER_SOXR_MQ,
62     PA_RESAMPLER_SOXR_HQ,
63     PA_RESAMPLER_SOXR_VHQ,
64     PA_PRORESAMPLER_BASE,
65     PA_PRORESAMPLER_MAX = PA_PRORESAMPLER_BASE + 10,
66     PA_RESAMPLER_MAX
67 } pa_resample_method_t;
68 
69 typedef enum pa_resample_flags {
70     PA_RESAMPLER_VARIABLE_RATE = 0x0001U,
71     PA_RESAMPLER_NO_REMAP      = 0x0002U,  /* implies NO_REMIX */
72     PA_RESAMPLER_NO_REMIX      = 0x0004U,
73     PA_RESAMPLER_NO_FILL_SINK  = 0x0010U,
74     PA_RESAMPLER_PRODUCE_LFE   = 0x0020U,
75     PA_RESAMPLER_CONSUME_LFE   = 0x0040U,
76 } pa_resample_flags_t;
77 
78 /* Currently, the soxr reampler has the largest delay of all supported resamplers.
79  * The maximum value below has been obtained empirically and contains a safety
80  * margin of about 3ms. If the resampler configuration is changed or additional
81  * resamplers are added, the constant must be re-evaluated. */
82 #define PA_RESAMPLER_MAX_DELAY_USEC 33000
83 
84 struct pa_resampler {
85     pa_resample_method_t method;
86     pa_resample_flags_t flags;
87 
88     pa_sample_spec i_ss, o_ss;
89     pa_channel_map i_cm, o_cm;
90     size_t i_fz, o_fz, w_fz, w_sz;
91     pa_mempool *mempool;
92 
93     pa_memchunk to_work_format_buf;
94     pa_memchunk remap_buf;
95     pa_memchunk resample_buf;
96     pa_memchunk from_work_format_buf;
97     size_t to_work_format_buf_size;
98     size_t remap_buf_size;
99     size_t resample_buf_size;
100     size_t from_work_format_buf_size;
101 
102     /* points to buffer before resampling stage, remap or to_work */
103     pa_memchunk *leftover_buf;
104     size_t *leftover_buf_size;
105 
106     /* have_leftover points to leftover_in_remap or leftover_in_to_work */
107     bool *have_leftover;
108     bool leftover_in_remap;
109     bool leftover_in_to_work;
110 
111     pa_sample_format_t work_format;
112     uint8_t work_channels;
113 
114     pa_convert_func_t to_work_format_func;
115     pa_convert_func_t from_work_format_func;
116 
117     pa_remap_t remap;
118     bool map_required;
119 
120     double in_frames;
121     double out_frames;
122     unsigned gcd;
123 
124     pa_lfe_filter_t *lfe_filter;
125 
126     pa_resampler_impl impl;
127 };
128 
129 pa_resampler* pa_resampler_new(
130         pa_mempool *pool,
131         const pa_sample_spec *a,
132         const pa_channel_map *am,
133         const pa_sample_spec *b,
134         const pa_channel_map *bm,
135 	unsigned crossover_freq,
136         pa_resample_method_t resample_method,
137         pa_resample_flags_t flags);
138 
139 void pa_resampler_free(pa_resampler *r);
140 
141 /* Returns the size of an input memory block which is required to return the specified amount of output data */
142 size_t pa_resampler_request(pa_resampler *r, size_t out_length);
143 
144 /* Inverse of pa_resampler_request() */
145 size_t pa_resampler_result(pa_resampler *r, size_t in_length);
146 
147 /* Returns the maximum size of input blocks we can process without needing bounce buffers larger than the mempool tile size. */
148 size_t pa_resampler_max_block_size(pa_resampler *r);
149 
150 /* Pass the specified memory chunk to the resampler and return the newly resampled data */
151 void pa_resampler_run(pa_resampler *r, const pa_memchunk *in, pa_memchunk *out);
152 
153 /* Change the input rate of the resampler object */
154 void pa_resampler_set_input_rate(pa_resampler *r, uint32_t rate);
155 
156 /* Change the output rate of the resampler object */
157 void pa_resampler_set_output_rate(pa_resampler *r, uint32_t rate);
158 
159 /* Reinitialize state of the resampler, possibly due to seeking or other discontinuities */
160 void pa_resampler_reset(pa_resampler *r);
161 
162 /* Prepare resampler for use by running some old data through it. */
163 size_t pa_resampler_prepare(pa_resampler *r, pa_memblockq *history_queue, size_t amount);
164 
165 /* Rewind resampler */
166 size_t pa_resampler_rewind(pa_resampler *r, size_t out_bytes, pa_memblockq *history_queue, size_t amount);
167 
168 /* Return the resampling method of the resampler object */
169 pa_resample_method_t pa_resampler_get_method(pa_resampler *r);
170 
171 /* Try to parse the resampler method */
172 pa_resample_method_t pa_parse_resample_method(const char *string);
173 
174 /* return a human readable string for the specified resampling method. Inverse of pa_parse_resample_method() */
175 const char *pa_resample_method_to_string(pa_resample_method_t m);
176 
177 /* Return 1 when the specified resampling method is supported */
178 int pa_resample_method_supported(pa_resample_method_t m);
179 
180 /* Get delay of the resampler in input frames */
181 double pa_resampler_get_delay(pa_resampler *r, bool allow_negative);
182 
183 /* Get delay of the resampler in usec */
184 pa_usec_t pa_resampler_get_delay_usec(pa_resampler *r);
185 
186 /* Get the GCD of input and outpu rate */
187 unsigned pa_resampler_get_gcd(pa_resampler *r);
188 
189 /* Get maximum number of history frames */
190 size_t pa_resampler_get_max_history(pa_resampler *r);
191 
192 const pa_channel_map* pa_resampler_input_channel_map(pa_resampler *r);
193 const pa_sample_spec* pa_resampler_input_sample_spec(pa_resampler *r);
194 const pa_channel_map* pa_resampler_output_channel_map(pa_resampler *r);
195 const pa_sample_spec* pa_resampler_output_sample_spec(pa_resampler *r);
196 
197 /* Implementation specific init functions */
198 int pa_resampler_ffmpeg_init(pa_resampler *r);
199 int pa_resampler_libsamplerate_init(pa_resampler *r);
200 int pa_resampler_peaks_init(pa_resampler *r);
201 int pa_resampler_speex_init(pa_resampler *r);
202 int pa_resampler_trivial_init(pa_resampler*r);
203 int pa_resampler_soxr_init(pa_resampler *r);
204 
205 /* Resampler-specific quirks */
206 bool pa_speex_is_fixed_point(void);
207 
208 #endif
209