summaryrefslogtreecommitdiffstats
path: root/resample.c
blob: 20615413b3f4661a5738fd1c00c184da3a30d5f2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#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);
}

resample_func_t get_resample_func(sa_pcm_format_t f) {

    static const 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];
}