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