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_RESAMPLER_MAX 65 } pa_resample_method_t; 66 67 typedef enum pa_resample_flags { 68 PA_RESAMPLER_VARIABLE_RATE = 0x0001U, 69 PA_RESAMPLER_NO_REMAP = 0x0002U, /* implies NO_REMIX */ 70 PA_RESAMPLER_NO_REMIX = 0x0004U, 71 PA_RESAMPLER_NO_FILL_SINK = 0x0010U, 72 PA_RESAMPLER_PRODUCE_LFE = 0x0020U, 73 PA_RESAMPLER_CONSUME_LFE = 0x0040U, 74 } pa_resample_flags_t; 75 76 struct pa_resampler { 77 pa_resample_method_t method; 78 pa_resample_flags_t flags; 79 80 pa_sample_spec i_ss, o_ss; 81 pa_channel_map i_cm, o_cm; 82 size_t i_fz, o_fz, w_fz, w_sz; 83 pa_mempool *mempool; 84 85 pa_memchunk to_work_format_buf; 86 pa_memchunk remap_buf; 87 pa_memchunk resample_buf; 88 pa_memchunk from_work_format_buf; 89 size_t to_work_format_buf_size; 90 size_t remap_buf_size; 91 size_t resample_buf_size; 92 size_t from_work_format_buf_size; 93 94 /* points to buffer before resampling stage, remap or to_work */ 95 pa_memchunk *leftover_buf; 96 size_t *leftover_buf_size; 97 98 /* have_leftover points to leftover_in_remap or leftover_in_to_work */ 99 bool *have_leftover; 100 bool leftover_in_remap; 101 bool leftover_in_to_work; 102 103 pa_sample_format_t work_format; 104 uint8_t work_channels; 105 106 pa_convert_func_t to_work_format_func; 107 pa_convert_func_t from_work_format_func; 108 109 pa_remap_t remap; 110 bool map_required; 111 112 pa_lfe_filter_t *lfe_filter; 113 114 pa_resampler_impl impl; 115 }; 116 117 pa_resampler* pa_resampler_new( 118 pa_mempool *pool, 119 const pa_sample_spec *a, 120 const pa_channel_map *am, 121 const pa_sample_spec *b, 122 const pa_channel_map *bm, 123 unsigned crossover_freq, 124 pa_resample_method_t resample_method, 125 pa_resample_flags_t flags); 126 127 void pa_resampler_free(pa_resampler *r); 128 129 /* Returns the size of an input memory block which is required to return the specified amount of output data */ 130 size_t pa_resampler_request(pa_resampler *r, size_t out_length); 131 132 /* Inverse of pa_resampler_request() */ 133 size_t pa_resampler_result(pa_resampler *r, size_t in_length); 134 135 /* Returns the maximum size of input blocks we can process without needing bounce buffers larger than the mempool tile size. */ 136 size_t pa_resampler_max_block_size(pa_resampler *r); 137 138 /* Pass the specified memory chunk to the resampler and return the newly resampled data */ 139 void pa_resampler_run(pa_resampler *r, const pa_memchunk *in, pa_memchunk *out); 140 141 /* Change the input rate of the resampler object */ 142 void pa_resampler_set_input_rate(pa_resampler *r, uint32_t rate); 143 144 /* Change the output rate of the resampler object */ 145 void pa_resampler_set_output_rate(pa_resampler *r, uint32_t rate); 146 147 /* Reinitialize state of the resampler, possibly due to seeking or other discontinuities */ 148 void pa_resampler_reset(pa_resampler *r); 149 150 /* Rewind resampler */ 151 void pa_resampler_rewind(pa_resampler *r, size_t out_frames); 152 153 /* Return the resampling method of the resampler object */ 154 pa_resample_method_t pa_resampler_get_method(pa_resampler *r); 155 156 /* Try to parse the resampler method */ 157 pa_resample_method_t pa_parse_resample_method(const char *string); 158 159 /* return a human readable string for the specified resampling method. Inverse of pa_parse_resample_method() */ 160 const char *pa_resample_method_to_string(pa_resample_method_t m); 161 162 /* Return 1 when the specified resampling method is supported */ 163 int pa_resample_method_supported(pa_resample_method_t m); 164 165 const pa_channel_map* pa_resampler_input_channel_map(pa_resampler *r); 166 const pa_sample_spec* pa_resampler_input_sample_spec(pa_resampler *r); 167 const pa_channel_map* pa_resampler_output_channel_map(pa_resampler *r); 168 const pa_sample_spec* pa_resampler_output_sample_spec(pa_resampler *r); 169 170 /* Implementation specific init functions */ 171 int pa_resampler_ffmpeg_init(pa_resampler *r); 172 int pa_resampler_libsamplerate_init(pa_resampler *r); 173 int pa_resampler_peaks_init(pa_resampler *r); 174 int pa_resampler_speex_init(pa_resampler *r); 175 int pa_resampler_trivial_init(pa_resampler*r); 176 int pa_resampler_soxr_init(pa_resampler *r); 177 178 /* Resampler-specific quirks */ 179 bool pa_speex_is_fixed_point(void); 180 181 #endif 182