153a5a1b3Sopenharmony_ci#ifndef fooresamplerhfoo 253a5a1b3Sopenharmony_ci#define fooresamplerhfoo 353a5a1b3Sopenharmony_ci 453a5a1b3Sopenharmony_ci/*** 553a5a1b3Sopenharmony_ci This file is part of PulseAudio. 653a5a1b3Sopenharmony_ci 753a5a1b3Sopenharmony_ci Copyright 2004-2006 Lennart Poettering 853a5a1b3Sopenharmony_ci 953a5a1b3Sopenharmony_ci PulseAudio is free software; you can redistribute it and/or modify 1053a5a1b3Sopenharmony_ci it under the terms of the GNU Lesser General Public License as published 1153a5a1b3Sopenharmony_ci by the Free Software Foundation; either version 2.1 of the License, 1253a5a1b3Sopenharmony_ci or (at your option) any later version. 1353a5a1b3Sopenharmony_ci 1453a5a1b3Sopenharmony_ci PulseAudio is distributed in the hope that it will be useful, but 1553a5a1b3Sopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 1653a5a1b3Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1753a5a1b3Sopenharmony_ci General Public License for more details. 1853a5a1b3Sopenharmony_ci 1953a5a1b3Sopenharmony_ci You should have received a copy of the GNU Lesser General Public License 2053a5a1b3Sopenharmony_ci along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. 2153a5a1b3Sopenharmony_ci***/ 2253a5a1b3Sopenharmony_ci 2353a5a1b3Sopenharmony_ci#include <pulse/sample.h> 2453a5a1b3Sopenharmony_ci#include <pulse/channelmap.h> 2553a5a1b3Sopenharmony_ci#include <pulsecore/memblock.h> 2653a5a1b3Sopenharmony_ci#include <pulsecore/memchunk.h> 2753a5a1b3Sopenharmony_ci#include <pulsecore/sconv.h> 2853a5a1b3Sopenharmony_ci#include <pulsecore/remap.h> 2953a5a1b3Sopenharmony_ci#include <pulsecore/filter/lfe-filter.h> 3053a5a1b3Sopenharmony_ci 3153a5a1b3Sopenharmony_citypedef struct pa_resampler pa_resampler; 3253a5a1b3Sopenharmony_citypedef struct pa_resampler_impl pa_resampler_impl; 3353a5a1b3Sopenharmony_ci 3453a5a1b3Sopenharmony_cistruct pa_resampler_impl { 3553a5a1b3Sopenharmony_ci void (*free)(pa_resampler *r); 3653a5a1b3Sopenharmony_ci void (*update_rates)(pa_resampler *r); 3753a5a1b3Sopenharmony_ci 3853a5a1b3Sopenharmony_ci /* Returns the number of leftover frames in the input buffer. */ 3953a5a1b3Sopenharmony_ci unsigned (*resample)(pa_resampler *r, const pa_memchunk *in, unsigned in_n_frames, pa_memchunk *out, unsigned *out_n_frames); 4053a5a1b3Sopenharmony_ci 4153a5a1b3Sopenharmony_ci void (*reset)(pa_resampler *r); 4253a5a1b3Sopenharmony_ci void *data; 4353a5a1b3Sopenharmony_ci}; 4453a5a1b3Sopenharmony_ci 4553a5a1b3Sopenharmony_citypedef enum pa_resample_method { 4653a5a1b3Sopenharmony_ci PA_RESAMPLER_INVALID = -1, 4753a5a1b3Sopenharmony_ci PA_RESAMPLER_SRC_SINC_BEST_QUALITY = 0, /* = SRC_SINC_BEST_QUALITY */ 4853a5a1b3Sopenharmony_ci PA_RESAMPLER_SRC_SINC_MEDIUM_QUALITY = 1, /* = SRC_SINC_MEDIUM_QUALITY */ 4953a5a1b3Sopenharmony_ci PA_RESAMPLER_SRC_SINC_FASTEST = 2, /* = SRC_SINC_FASTEST */ 5053a5a1b3Sopenharmony_ci PA_RESAMPLER_SRC_ZERO_ORDER_HOLD = 3, /* = SRC_ZERO_ORDER_HOLD */ 5153a5a1b3Sopenharmony_ci PA_RESAMPLER_SRC_LINEAR = 4, /* = SRC_LINEAR */ 5253a5a1b3Sopenharmony_ci PA_RESAMPLER_TRIVIAL, 5353a5a1b3Sopenharmony_ci PA_RESAMPLER_SPEEX_FLOAT_BASE, 5453a5a1b3Sopenharmony_ci PA_RESAMPLER_SPEEX_FLOAT_MAX = PA_RESAMPLER_SPEEX_FLOAT_BASE + 10, 5553a5a1b3Sopenharmony_ci PA_RESAMPLER_SPEEX_FIXED_BASE, 5653a5a1b3Sopenharmony_ci PA_RESAMPLER_SPEEX_FIXED_MAX = PA_RESAMPLER_SPEEX_FIXED_BASE + 10, 5753a5a1b3Sopenharmony_ci PA_RESAMPLER_FFMPEG, 5853a5a1b3Sopenharmony_ci PA_RESAMPLER_AUTO, /* automatic select based on sample format */ 5953a5a1b3Sopenharmony_ci PA_RESAMPLER_COPY, 6053a5a1b3Sopenharmony_ci PA_RESAMPLER_PEAKS, 6153a5a1b3Sopenharmony_ci PA_RESAMPLER_SOXR_MQ, 6253a5a1b3Sopenharmony_ci PA_RESAMPLER_SOXR_HQ, 6353a5a1b3Sopenharmony_ci PA_RESAMPLER_SOXR_VHQ, 6453a5a1b3Sopenharmony_ci PA_RESAMPLER_MAX 6553a5a1b3Sopenharmony_ci} pa_resample_method_t; 6653a5a1b3Sopenharmony_ci 6753a5a1b3Sopenharmony_citypedef enum pa_resample_flags { 6853a5a1b3Sopenharmony_ci PA_RESAMPLER_VARIABLE_RATE = 0x0001U, 6953a5a1b3Sopenharmony_ci PA_RESAMPLER_NO_REMAP = 0x0002U, /* implies NO_REMIX */ 7053a5a1b3Sopenharmony_ci PA_RESAMPLER_NO_REMIX = 0x0004U, 7153a5a1b3Sopenharmony_ci PA_RESAMPLER_NO_FILL_SINK = 0x0010U, 7253a5a1b3Sopenharmony_ci PA_RESAMPLER_PRODUCE_LFE = 0x0020U, 7353a5a1b3Sopenharmony_ci PA_RESAMPLER_CONSUME_LFE = 0x0040U, 7453a5a1b3Sopenharmony_ci} pa_resample_flags_t; 7553a5a1b3Sopenharmony_ci 7653a5a1b3Sopenharmony_ci/* Currently, the soxr reampler has the largest delay of all supported resamplers. 7753a5a1b3Sopenharmony_ci * The maximum value below has been obtained empirically and contains a safety 7853a5a1b3Sopenharmony_ci * margin of about 3ms. If the resampler configuration is changed or additional 7953a5a1b3Sopenharmony_ci * resamplers are added, the constant must be re-evaluated. */ 8053a5a1b3Sopenharmony_ci#define PA_RESAMPLER_MAX_DELAY_USEC 33000 8153a5a1b3Sopenharmony_ci 8253a5a1b3Sopenharmony_cistruct pa_resampler { 8353a5a1b3Sopenharmony_ci pa_resample_method_t method; 8453a5a1b3Sopenharmony_ci pa_resample_flags_t flags; 8553a5a1b3Sopenharmony_ci 8653a5a1b3Sopenharmony_ci pa_sample_spec i_ss, o_ss; 8753a5a1b3Sopenharmony_ci pa_channel_map i_cm, o_cm; 8853a5a1b3Sopenharmony_ci size_t i_fz, o_fz, w_fz, w_sz; 8953a5a1b3Sopenharmony_ci pa_mempool *mempool; 9053a5a1b3Sopenharmony_ci 9153a5a1b3Sopenharmony_ci pa_memchunk to_work_format_buf; 9253a5a1b3Sopenharmony_ci pa_memchunk remap_buf; 9353a5a1b3Sopenharmony_ci pa_memchunk resample_buf; 9453a5a1b3Sopenharmony_ci pa_memchunk from_work_format_buf; 9553a5a1b3Sopenharmony_ci size_t to_work_format_buf_size; 9653a5a1b3Sopenharmony_ci size_t remap_buf_size; 9753a5a1b3Sopenharmony_ci size_t resample_buf_size; 9853a5a1b3Sopenharmony_ci size_t from_work_format_buf_size; 9953a5a1b3Sopenharmony_ci 10053a5a1b3Sopenharmony_ci /* points to buffer before resampling stage, remap or to_work */ 10153a5a1b3Sopenharmony_ci pa_memchunk *leftover_buf; 10253a5a1b3Sopenharmony_ci size_t *leftover_buf_size; 10353a5a1b3Sopenharmony_ci 10453a5a1b3Sopenharmony_ci /* have_leftover points to leftover_in_remap or leftover_in_to_work */ 10553a5a1b3Sopenharmony_ci bool *have_leftover; 10653a5a1b3Sopenharmony_ci bool leftover_in_remap; 10753a5a1b3Sopenharmony_ci bool leftover_in_to_work; 10853a5a1b3Sopenharmony_ci 10953a5a1b3Sopenharmony_ci pa_sample_format_t work_format; 11053a5a1b3Sopenharmony_ci uint8_t work_channels; 11153a5a1b3Sopenharmony_ci 11253a5a1b3Sopenharmony_ci pa_convert_func_t to_work_format_func; 11353a5a1b3Sopenharmony_ci pa_convert_func_t from_work_format_func; 11453a5a1b3Sopenharmony_ci 11553a5a1b3Sopenharmony_ci pa_remap_t remap; 11653a5a1b3Sopenharmony_ci bool map_required; 11753a5a1b3Sopenharmony_ci 11853a5a1b3Sopenharmony_ci double in_frames; 11953a5a1b3Sopenharmony_ci double out_frames; 12053a5a1b3Sopenharmony_ci unsigned gcd; 12153a5a1b3Sopenharmony_ci 12253a5a1b3Sopenharmony_ci pa_lfe_filter_t *lfe_filter; 12353a5a1b3Sopenharmony_ci 12453a5a1b3Sopenharmony_ci pa_resampler_impl impl; 12553a5a1b3Sopenharmony_ci}; 12653a5a1b3Sopenharmony_ci 12753a5a1b3Sopenharmony_cipa_resampler* pa_resampler_new( 12853a5a1b3Sopenharmony_ci pa_mempool *pool, 12953a5a1b3Sopenharmony_ci const pa_sample_spec *a, 13053a5a1b3Sopenharmony_ci const pa_channel_map *am, 13153a5a1b3Sopenharmony_ci const pa_sample_spec *b, 13253a5a1b3Sopenharmony_ci const pa_channel_map *bm, 13353a5a1b3Sopenharmony_ci unsigned crossover_freq, 13453a5a1b3Sopenharmony_ci pa_resample_method_t resample_method, 13553a5a1b3Sopenharmony_ci pa_resample_flags_t flags); 13653a5a1b3Sopenharmony_ci 13753a5a1b3Sopenharmony_civoid pa_resampler_free(pa_resampler *r); 13853a5a1b3Sopenharmony_ci 13953a5a1b3Sopenharmony_ci/* Returns the size of an input memory block which is required to return the specified amount of output data */ 14053a5a1b3Sopenharmony_cisize_t pa_resampler_request(pa_resampler *r, size_t out_length); 14153a5a1b3Sopenharmony_ci 14253a5a1b3Sopenharmony_ci/* Inverse of pa_resampler_request() */ 14353a5a1b3Sopenharmony_cisize_t pa_resampler_result(pa_resampler *r, size_t in_length); 14453a5a1b3Sopenharmony_ci 14553a5a1b3Sopenharmony_ci/* Returns the maximum size of input blocks we can process without needing bounce buffers larger than the mempool tile size. */ 14653a5a1b3Sopenharmony_cisize_t pa_resampler_max_block_size(pa_resampler *r); 14753a5a1b3Sopenharmony_ci 14853a5a1b3Sopenharmony_ci/* Pass the specified memory chunk to the resampler and return the newly resampled data */ 14953a5a1b3Sopenharmony_civoid pa_resampler_run(pa_resampler *r, const pa_memchunk *in, pa_memchunk *out); 15053a5a1b3Sopenharmony_ci 15153a5a1b3Sopenharmony_ci/* Change the input rate of the resampler object */ 15253a5a1b3Sopenharmony_civoid pa_resampler_set_input_rate(pa_resampler *r, uint32_t rate); 15353a5a1b3Sopenharmony_ci 15453a5a1b3Sopenharmony_ci/* Change the output rate of the resampler object */ 15553a5a1b3Sopenharmony_civoid pa_resampler_set_output_rate(pa_resampler *r, uint32_t rate); 15653a5a1b3Sopenharmony_ci 15753a5a1b3Sopenharmony_ci/* Reinitialize state of the resampler, possibly due to seeking or other discontinuities */ 15853a5a1b3Sopenharmony_civoid pa_resampler_reset(pa_resampler *r); 15953a5a1b3Sopenharmony_ci 16053a5a1b3Sopenharmony_ci/* Prepare resampler for use by running some old data through it. */ 16153a5a1b3Sopenharmony_cisize_t pa_resampler_prepare(pa_resampler *r, pa_memblockq *history_queue, size_t amount); 16253a5a1b3Sopenharmony_ci 16353a5a1b3Sopenharmony_ci/* Rewind resampler */ 16453a5a1b3Sopenharmony_cisize_t pa_resampler_rewind(pa_resampler *r, size_t out_bytes, pa_memblockq *history_queue, size_t amount); 16553a5a1b3Sopenharmony_ci 16653a5a1b3Sopenharmony_ci/* Return the resampling method of the resampler object */ 16753a5a1b3Sopenharmony_cipa_resample_method_t pa_resampler_get_method(pa_resampler *r); 16853a5a1b3Sopenharmony_ci 16953a5a1b3Sopenharmony_ci/* Try to parse the resampler method */ 17053a5a1b3Sopenharmony_cipa_resample_method_t pa_parse_resample_method(const char *string); 17153a5a1b3Sopenharmony_ci 17253a5a1b3Sopenharmony_ci/* return a human readable string for the specified resampling method. Inverse of pa_parse_resample_method() */ 17353a5a1b3Sopenharmony_ciconst char *pa_resample_method_to_string(pa_resample_method_t m); 17453a5a1b3Sopenharmony_ci 17553a5a1b3Sopenharmony_ci/* Return 1 when the specified resampling method is supported */ 17653a5a1b3Sopenharmony_ciint pa_resample_method_supported(pa_resample_method_t m); 17753a5a1b3Sopenharmony_ci 17853a5a1b3Sopenharmony_ci/* Get delay of the resampler in input frames */ 17953a5a1b3Sopenharmony_cidouble pa_resampler_get_delay(pa_resampler *r, bool allow_negative); 18053a5a1b3Sopenharmony_ci 18153a5a1b3Sopenharmony_ci/* Get delay of the resampler in usec */ 18253a5a1b3Sopenharmony_cipa_usec_t pa_resampler_get_delay_usec(pa_resampler *r); 18353a5a1b3Sopenharmony_ci 18453a5a1b3Sopenharmony_ci/* Get the GCD of input and outpu rate */ 18553a5a1b3Sopenharmony_ciunsigned pa_resampler_get_gcd(pa_resampler *r); 18653a5a1b3Sopenharmony_ci 18753a5a1b3Sopenharmony_ci/* Get maximum number of history frames */ 18853a5a1b3Sopenharmony_cisize_t pa_resampler_get_max_history(pa_resampler *r); 18953a5a1b3Sopenharmony_ci 19053a5a1b3Sopenharmony_ciconst pa_channel_map* pa_resampler_input_channel_map(pa_resampler *r); 19153a5a1b3Sopenharmony_ciconst pa_sample_spec* pa_resampler_input_sample_spec(pa_resampler *r); 19253a5a1b3Sopenharmony_ciconst pa_channel_map* pa_resampler_output_channel_map(pa_resampler *r); 19353a5a1b3Sopenharmony_ciconst pa_sample_spec* pa_resampler_output_sample_spec(pa_resampler *r); 19453a5a1b3Sopenharmony_ci 19553a5a1b3Sopenharmony_ci/* Implementation specific init functions */ 19653a5a1b3Sopenharmony_ciint pa_resampler_ffmpeg_init(pa_resampler *r); 19753a5a1b3Sopenharmony_ciint pa_resampler_libsamplerate_init(pa_resampler *r); 19853a5a1b3Sopenharmony_ciint pa_resampler_peaks_init(pa_resampler *r); 19953a5a1b3Sopenharmony_ciint pa_resampler_speex_init(pa_resampler *r); 20053a5a1b3Sopenharmony_ciint pa_resampler_trivial_init(pa_resampler*r); 20153a5a1b3Sopenharmony_ciint pa_resampler_soxr_init(pa_resampler *r); 20253a5a1b3Sopenharmony_ci 20353a5a1b3Sopenharmony_ci/* Resampler-specific quirks */ 20453a5a1b3Sopenharmony_cibool pa_speex_is_fixed_point(void); 20553a5a1b3Sopenharmony_ci 20653a5a1b3Sopenharmony_ci#endif 207