1
#ifndef fooresamplerhfoo
2
#define fooresamplerhfoo
5
This file is part of PulseAudio.
7
Copyright 2004-2006 Lennart Poettering
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.
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.
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/>.
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>
31
typedef struct pa_resampler pa_resampler;
32
typedef struct pa_resampler_impl pa_resampler_impl;
34
struct pa_resampler_impl {
35
void (*free)(pa_resampler *r);
36
void (*update_rates)(pa_resampler *r);
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);
41
void (*reset)(pa_resampler *r);
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 */
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,
58
PA_RESAMPLER_AUTO, /* automatic select based on sample format */
62
} pa_resample_method_t;
64
typedef enum pa_resample_flags {
65
PA_RESAMPLER_VARIABLE_RATE = 0x0001U,
66
PA_RESAMPLER_NO_REMAP = 0x0002U, /* implies NO_REMIX */
67
PA_RESAMPLER_NO_REMIX = 0x0004U,
68
PA_RESAMPLER_NO_LFE = 0x0008U
69
} pa_resample_flags_t;
72
pa_resample_method_t method;
73
pa_resample_flags_t flags;
75
pa_sample_spec i_ss, o_ss;
76
pa_channel_map i_cm, o_cm;
77
size_t i_fz, o_fz, w_fz, w_sz;
80
pa_memchunk to_work_format_buf;
81
pa_memchunk remap_buf;
82
pa_memchunk resample_buf;
83
pa_memchunk from_work_format_buf;
84
size_t to_work_format_buf_size;
85
size_t remap_buf_size;
86
size_t resample_buf_size;
87
size_t from_work_format_buf_size;
89
/* points to buffer before resampling stage, remap or to_work */
90
pa_memchunk *leftover_buf;
91
size_t *leftover_buf_size;
93
/* have_leftover points to leftover_in_remap or leftover_in_to_work */
95
bool leftover_in_remap;
96
bool leftover_in_to_work;
98
pa_sample_format_t work_format;
99
uint8_t work_channels;
101
pa_convert_func_t to_work_format_func;
102
pa_convert_func_t from_work_format_func;
107
pa_lfe_filter_t *lfe_filter;
109
pa_resampler_impl impl;
112
pa_resampler* pa_resampler_new(
114
const pa_sample_spec *a,
115
const pa_channel_map *am,
116
const pa_sample_spec *b,
117
const pa_channel_map *bm,
118
unsigned crossover_freq,
119
pa_resample_method_t resample_method,
120
pa_resample_flags_t flags);
122
void pa_resampler_free(pa_resampler *r);
124
/* Returns the size of an input memory block which is required to return the specified amount of output data */
125
size_t pa_resampler_request(pa_resampler *r, size_t out_length);
127
/* Inverse of pa_resampler_request() */
128
size_t pa_resampler_result(pa_resampler *r, size_t in_length);
130
/* Returns the maximum size of input blocks we can process without needing bounce buffers larger than the mempool tile size. */
131
size_t pa_resampler_max_block_size(pa_resampler *r);
133
/* Pass the specified memory chunk to the resampler and return the newly resampled data */
134
void pa_resampler_run(pa_resampler *r, const pa_memchunk *in, pa_memchunk *out);
136
/* Change the input rate of the resampler object */
137
void pa_resampler_set_input_rate(pa_resampler *r, uint32_t rate);
139
/* Change the output rate of the resampler object */
140
void pa_resampler_set_output_rate(pa_resampler *r, uint32_t rate);
142
/* Reinitialize state of the resampler, possibly due to seeking or other discontinuities */
143
void pa_resampler_reset(pa_resampler *r);
145
/* Return the resampling method of the resampler object */
146
pa_resample_method_t pa_resampler_get_method(pa_resampler *r);
148
/* Try to parse the resampler method */
149
pa_resample_method_t pa_parse_resample_method(const char *string);
151
/* return a human readable string for the specified resampling method. Inverse of pa_parse_resample_method() */
152
const char *pa_resample_method_to_string(pa_resample_method_t m);
154
/* Return 1 when the specified resampling method is supported */
155
int pa_resample_method_supported(pa_resample_method_t m);
157
const pa_channel_map* pa_resampler_input_channel_map(pa_resampler *r);
158
const pa_sample_spec* pa_resampler_input_sample_spec(pa_resampler *r);
159
const pa_channel_map* pa_resampler_output_channel_map(pa_resampler *r);
160
const pa_sample_spec* pa_resampler_output_sample_spec(pa_resampler *r);
162
/* Implementation specific init functions */
163
int pa_resampler_ffmpeg_init(pa_resampler *r);
164
int pa_resampler_libsamplerate_init(pa_resampler *r);
165
int pa_resampler_peaks_init(pa_resampler *r);
166
int pa_resampler_speex_init(pa_resampler *r);
167
int pa_resampler_trivial_init(pa_resampler*r);
169
/* Resampler-specific quirks */
170
bool pa_speex_is_fixed_point(void);