153a5a1b3Sopenharmony_ci/*** 253a5a1b3Sopenharmony_ci This file is part of PulseAudio. 353a5a1b3Sopenharmony_ci 453a5a1b3Sopenharmony_ci Copyright 2004-2006 Lennart Poettering 553a5a1b3Sopenharmony_ci 653a5a1b3Sopenharmony_ci PulseAudio is free software; you can redistribute it and/or modify 753a5a1b3Sopenharmony_ci it under the terms of the GNU Lesser General Public License as published 853a5a1b3Sopenharmony_ci by the Free Software Foundation; either version 2.1 of the License, 953a5a1b3Sopenharmony_ci or (at your option) any later version. 1053a5a1b3Sopenharmony_ci 1153a5a1b3Sopenharmony_ci PulseAudio is distributed in the hope that it will be useful, but 1253a5a1b3Sopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 1353a5a1b3Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1453a5a1b3Sopenharmony_ci General Public License for more details. 1553a5a1b3Sopenharmony_ci 1653a5a1b3Sopenharmony_ci You should have received a copy of the GNU Lesser General Public License 1753a5a1b3Sopenharmony_ci along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. 1853a5a1b3Sopenharmony_ci***/ 1953a5a1b3Sopenharmony_ci 2053a5a1b3Sopenharmony_ci#ifdef HAVE_CONFIG_H 2153a5a1b3Sopenharmony_ci#include <config.h> 2253a5a1b3Sopenharmony_ci#endif 2353a5a1b3Sopenharmony_ci 2453a5a1b3Sopenharmony_ci#include <samplerate.h> 2553a5a1b3Sopenharmony_ci 2653a5a1b3Sopenharmony_ci#include <pulsecore/resampler.h> 2753a5a1b3Sopenharmony_ci 2853a5a1b3Sopenharmony_cistatic unsigned libsamplerate_resample(pa_resampler *r, const pa_memchunk *input, unsigned in_n_frames, pa_memchunk *output, unsigned *out_n_frames) { 2953a5a1b3Sopenharmony_ci SRC_DATA data; 3053a5a1b3Sopenharmony_ci SRC_STATE *state; 3153a5a1b3Sopenharmony_ci 3253a5a1b3Sopenharmony_ci pa_assert(r); 3353a5a1b3Sopenharmony_ci pa_assert(input); 3453a5a1b3Sopenharmony_ci pa_assert(output); 3553a5a1b3Sopenharmony_ci pa_assert(out_n_frames); 3653a5a1b3Sopenharmony_ci 3753a5a1b3Sopenharmony_ci state = r->impl.data; 3853a5a1b3Sopenharmony_ci memset(&data, 0, sizeof(data)); 3953a5a1b3Sopenharmony_ci 4053a5a1b3Sopenharmony_ci data.data_in = pa_memblock_acquire_chunk(input); 4153a5a1b3Sopenharmony_ci data.input_frames = (long int) in_n_frames; 4253a5a1b3Sopenharmony_ci 4353a5a1b3Sopenharmony_ci data.data_out = pa_memblock_acquire_chunk(output); 4453a5a1b3Sopenharmony_ci data.output_frames = (long int) *out_n_frames; 4553a5a1b3Sopenharmony_ci 4653a5a1b3Sopenharmony_ci data.src_ratio = (double) r->o_ss.rate / r->i_ss.rate; 4753a5a1b3Sopenharmony_ci data.end_of_input = 0; 4853a5a1b3Sopenharmony_ci 4953a5a1b3Sopenharmony_ci pa_assert_se(src_process(state, &data) == 0); 5053a5a1b3Sopenharmony_ci 5153a5a1b3Sopenharmony_ci pa_memblock_release(input->memblock); 5253a5a1b3Sopenharmony_ci pa_memblock_release(output->memblock); 5353a5a1b3Sopenharmony_ci 5453a5a1b3Sopenharmony_ci *out_n_frames = (unsigned) data.output_frames_gen; 5553a5a1b3Sopenharmony_ci 5653a5a1b3Sopenharmony_ci return in_n_frames - data.input_frames_used; 5753a5a1b3Sopenharmony_ci} 5853a5a1b3Sopenharmony_ci 5953a5a1b3Sopenharmony_cistatic void libsamplerate_update_rates(pa_resampler *r) { 6053a5a1b3Sopenharmony_ci SRC_STATE *state; 6153a5a1b3Sopenharmony_ci pa_assert(r); 6253a5a1b3Sopenharmony_ci 6353a5a1b3Sopenharmony_ci state = r->impl.data; 6453a5a1b3Sopenharmony_ci pa_assert_se(src_set_ratio(state, (double) r->o_ss.rate / r->i_ss.rate) == 0); 6553a5a1b3Sopenharmony_ci} 6653a5a1b3Sopenharmony_ci 6753a5a1b3Sopenharmony_cistatic void libsamplerate_reset(pa_resampler *r) { 6853a5a1b3Sopenharmony_ci SRC_STATE *state; 6953a5a1b3Sopenharmony_ci pa_assert(r); 7053a5a1b3Sopenharmony_ci 7153a5a1b3Sopenharmony_ci state = r->impl.data; 7253a5a1b3Sopenharmony_ci pa_assert_se(src_reset(state) == 0); 7353a5a1b3Sopenharmony_ci} 7453a5a1b3Sopenharmony_ci 7553a5a1b3Sopenharmony_cistatic void libsamplerate_free(pa_resampler *r) { 7653a5a1b3Sopenharmony_ci SRC_STATE *state; 7753a5a1b3Sopenharmony_ci pa_assert(r); 7853a5a1b3Sopenharmony_ci 7953a5a1b3Sopenharmony_ci state = r->impl.data; 8053a5a1b3Sopenharmony_ci if (state) 8153a5a1b3Sopenharmony_ci src_delete(state); 8253a5a1b3Sopenharmony_ci} 8353a5a1b3Sopenharmony_ci 8453a5a1b3Sopenharmony_ciint pa_resampler_libsamplerate_init(pa_resampler *r) { 8553a5a1b3Sopenharmony_ci int err; 8653a5a1b3Sopenharmony_ci SRC_STATE *state; 8753a5a1b3Sopenharmony_ci 8853a5a1b3Sopenharmony_ci pa_assert(r); 8953a5a1b3Sopenharmony_ci 9053a5a1b3Sopenharmony_ci if (!(state = src_new(r->method, r->work_channels, &err))) 9153a5a1b3Sopenharmony_ci return -1; 9253a5a1b3Sopenharmony_ci 9353a5a1b3Sopenharmony_ci r->impl.free = libsamplerate_free; 9453a5a1b3Sopenharmony_ci r->impl.update_rates = libsamplerate_update_rates; 9553a5a1b3Sopenharmony_ci r->impl.resample = libsamplerate_resample; 9653a5a1b3Sopenharmony_ci r->impl.reset = libsamplerate_reset; 9753a5a1b3Sopenharmony_ci r->impl.data = state; 9853a5a1b3Sopenharmony_ci 9953a5a1b3Sopenharmony_ci return 0; 10053a5a1b3Sopenharmony_ci} 101