#include "macro.h" #include "resample.h" static void resample_s16(SpeexResamplerState *speex, unsigned channel, void *dst, size_t dstr, const void *src, size_t sstr, size_t in_bytes, size_t *out_bytes) { spx_uint32_t in_samples = in_bytes/sizeof(int16_t), out_samples = *out_bytes/sizeof(int16_t); speex_resampler_set_input_stride(speex, sstr/sizeof(int16_t)); speex_resampler_set_input_stride(speex, dstr/sizeof(int16_t)); speex_resampler_process_int(speex, channel, src, &in_samples, dst, &out_samples); sa_assert(in_samples == in_bytes/sizeof(int16_t)); *out_bytes = out_samples * sizeof(int16_t); } static void resample_f32(SpeexResamplerState *speex, unsigned channel, void *dst, size_t dstr, const void *src, size_t sstr, size_t in_bytes, size_t *out_bytes) { spx_uint32_t in_samples = in_bytes/sizeof(float), out_samples = *out_bytes/sizeof(float); speex_resampler_set_input_stride(speex, sstr/sizeof(float)); speex_resampler_set_input_stride(speex, dstr/sizeof(float)); speex_resampler_process_float(speex, channel, src, &in_samples, dst, &out_samples); sa_assert(in_samples == in_bytes/sizeof(float)); *out_bytes = out_samples * sizeof(float); } sa_resample_func_t sa_get_resample_func(sa_pcm_format_t f) { static const sa_resample_func_t funcs[_SA_PCM_FORMAT_MAX] = { [SA_PCM_FORMAT_S16_NE] = resample_s16, [SA_PCM_FORMAT_FLOAT32_NE] = resample_f32 }; sa_assert(f < _SA_PCM_FORMAT_MAX); return funcs[f]; }