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