xref: /aosp_15_r20/external/speex/libspeexdsp/testresample2.c (revision 28e138c64d234588b5cd2a8a403b584bd3036e4e)
1*28e138c6SAndroid Build Coastguard Worker /* Copyright (C) 2007 Jean-Marc Valin
2*28e138c6SAndroid Build Coastguard Worker 
3*28e138c6SAndroid Build Coastguard Worker    File: testresample2.c
4*28e138c6SAndroid Build Coastguard Worker    Testing the resampling code
5*28e138c6SAndroid Build Coastguard Worker 
6*28e138c6SAndroid Build Coastguard Worker    Redistribution and use in source and binary forms, with or without
7*28e138c6SAndroid Build Coastguard Worker    modification, are permitted provided that the following conditions are
8*28e138c6SAndroid Build Coastguard Worker    met:
9*28e138c6SAndroid Build Coastguard Worker 
10*28e138c6SAndroid Build Coastguard Worker    1. Redistributions of source code must retain the above copyright notice,
11*28e138c6SAndroid Build Coastguard Worker    this list of conditions and the following disclaimer.
12*28e138c6SAndroid Build Coastguard Worker 
13*28e138c6SAndroid Build Coastguard Worker    2. Redistributions in binary form must reproduce the above copyright
14*28e138c6SAndroid Build Coastguard Worker    notice, this list of conditions and the following disclaimer in the
15*28e138c6SAndroid Build Coastguard Worker    documentation and/or other materials provided with the distribution.
16*28e138c6SAndroid Build Coastguard Worker 
17*28e138c6SAndroid Build Coastguard Worker    3. The name of the author may not be used to endorse or promote products
18*28e138c6SAndroid Build Coastguard Worker    derived from this software without specific prior written permission.
19*28e138c6SAndroid Build Coastguard Worker 
20*28e138c6SAndroid Build Coastguard Worker    THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21*28e138c6SAndroid Build Coastguard Worker    IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22*28e138c6SAndroid Build Coastguard Worker    OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23*28e138c6SAndroid Build Coastguard Worker    DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
24*28e138c6SAndroid Build Coastguard Worker    INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25*28e138c6SAndroid Build Coastguard Worker    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26*28e138c6SAndroid Build Coastguard Worker    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27*28e138c6SAndroid Build Coastguard Worker    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28*28e138c6SAndroid Build Coastguard Worker    STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
29*28e138c6SAndroid Build Coastguard Worker    ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30*28e138c6SAndroid Build Coastguard Worker    POSSIBILITY OF SUCH DAMAGE.
31*28e138c6SAndroid Build Coastguard Worker */
32*28e138c6SAndroid Build Coastguard Worker 
33*28e138c6SAndroid Build Coastguard Worker #ifdef HAVE_CONFIG_H
34*28e138c6SAndroid Build Coastguard Worker #include "config.h"
35*28e138c6SAndroid Build Coastguard Worker #endif
36*28e138c6SAndroid Build Coastguard Worker 
37*28e138c6SAndroid Build Coastguard Worker #include "speex/speex_resampler.h"
38*28e138c6SAndroid Build Coastguard Worker #include <stdio.h>
39*28e138c6SAndroid Build Coastguard Worker #include <math.h>
40*28e138c6SAndroid Build Coastguard Worker #include <stdlib.h>
41*28e138c6SAndroid Build Coastguard Worker 
42*28e138c6SAndroid Build Coastguard Worker #define PERIOD 32
43*28e138c6SAndroid Build Coastguard Worker #define INBLOCK 1024
44*28e138c6SAndroid Build Coastguard Worker #define RATE 48000
45*28e138c6SAndroid Build Coastguard Worker 
main()46*28e138c6SAndroid Build Coastguard Worker int main()
47*28e138c6SAndroid Build Coastguard Worker {
48*28e138c6SAndroid Build Coastguard Worker    spx_uint32_t i;
49*28e138c6SAndroid Build Coastguard Worker    float *fin, *fout;
50*28e138c6SAndroid Build Coastguard Worker    int rate = 1000, off = 0, avail = INBLOCK;
51*28e138c6SAndroid Build Coastguard Worker    SpeexResamplerState *st = speex_resampler_init(1, RATE, RATE, 4, NULL);
52*28e138c6SAndroid Build Coastguard Worker    speex_resampler_set_rate(st, RATE, rate);
53*28e138c6SAndroid Build Coastguard Worker    speex_resampler_skip_zeros(st);
54*28e138c6SAndroid Build Coastguard Worker 
55*28e138c6SAndroid Build Coastguard Worker    fin = malloc(INBLOCK*2*sizeof(float));
56*28e138c6SAndroid Build Coastguard Worker    for (i=0; i<INBLOCK*2;i++)
57*28e138c6SAndroid Build Coastguard Worker      fin[i] = sinf ((float)i/PERIOD * 2 * M_PI) * 0.9;
58*28e138c6SAndroid Build Coastguard Worker 
59*28e138c6SAndroid Build Coastguard Worker    fout = malloc(INBLOCK*4*sizeof(float));
60*28e138c6SAndroid Build Coastguard Worker 
61*28e138c6SAndroid Build Coastguard Worker    while (1)
62*28e138c6SAndroid Build Coastguard Worker    {
63*28e138c6SAndroid Build Coastguard Worker       spx_uint32_t in_len;
64*28e138c6SAndroid Build Coastguard Worker       spx_uint32_t out_len;
65*28e138c6SAndroid Build Coastguard Worker 
66*28e138c6SAndroid Build Coastguard Worker       in_len = avail;
67*28e138c6SAndroid Build Coastguard Worker       out_len = (in_len * rate + RATE-1) / RATE;
68*28e138c6SAndroid Build Coastguard Worker 
69*28e138c6SAndroid Build Coastguard Worker       fprintf (stderr, "%d %d %d %d -> ", rate, off, in_len, out_len);
70*28e138c6SAndroid Build Coastguard Worker 
71*28e138c6SAndroid Build Coastguard Worker       speex_resampler_process_float(st, 0, fin + off, &in_len, fout, &out_len);
72*28e138c6SAndroid Build Coastguard Worker 
73*28e138c6SAndroid Build Coastguard Worker       fprintf (stderr, "%d %d\n", in_len, out_len);
74*28e138c6SAndroid Build Coastguard Worker       off += in_len;
75*28e138c6SAndroid Build Coastguard Worker       avail = avail - in_len + INBLOCK;
76*28e138c6SAndroid Build Coastguard Worker 
77*28e138c6SAndroid Build Coastguard Worker       if (off >= INBLOCK)
78*28e138c6SAndroid Build Coastguard Worker         off -= INBLOCK;
79*28e138c6SAndroid Build Coastguard Worker 
80*28e138c6SAndroid Build Coastguard Worker       fwrite(fout, sizeof(float), out_len, stdout);
81*28e138c6SAndroid Build Coastguard Worker 
82*28e138c6SAndroid Build Coastguard Worker       rate += 100;
83*28e138c6SAndroid Build Coastguard Worker       if (rate > 128000)
84*28e138c6SAndroid Build Coastguard Worker         break;
85*28e138c6SAndroid Build Coastguard Worker 
86*28e138c6SAndroid Build Coastguard Worker       speex_resampler_set_rate(st, RATE, rate);
87*28e138c6SAndroid Build Coastguard Worker    }
88*28e138c6SAndroid Build Coastguard Worker    speex_resampler_destroy(st);
89*28e138c6SAndroid Build Coastguard Worker    free(fin);
90*28e138c6SAndroid Build Coastguard Worker    free(fout);
91*28e138c6SAndroid Build Coastguard Worker    return 0;
92*28e138c6SAndroid Build Coastguard Worker }
93*28e138c6SAndroid Build Coastguard Worker 
94