Chris@41
|
1 /*
|
Chris@41
|
2 ** Copyright (c) 2002-2016, Erik de Castro Lopo <erikd@mega-nerd.com>
|
Chris@41
|
3 ** All rights reserved.
|
Chris@41
|
4 **
|
Chris@41
|
5 ** This code is released under 2-clause BSD license. Please see the
|
Chris@41
|
6 ** file at : https://github.com/erikd/libsamplerate/blob/master/COPYING
|
Chris@41
|
7 */
|
Chris@41
|
8
|
Chris@41
|
9 #include <stdio.h>
|
Chris@41
|
10 #include <stdlib.h>
|
Chris@41
|
11 #include <string.h>
|
Chris@41
|
12
|
Chris@41
|
13 #include <samplerate.h>
|
Chris@41
|
14
|
Chris@41
|
15 #include "util.h"
|
Chris@41
|
16
|
Chris@41
|
17 static void name_test (void) ;
|
Chris@41
|
18 static void error_test (void) ;
|
Chris@41
|
19 static void src_ratio_test (void) ;
|
Chris@41
|
20 static void zero_input_test (int converter) ;
|
Chris@41
|
21
|
Chris@41
|
22 int
|
Chris@41
|
23 main (void)
|
Chris@41
|
24 {
|
Chris@41
|
25 puts ("") ;
|
Chris@41
|
26
|
Chris@41
|
27 printf (" version : %s\n\n", src_get_version ()) ;
|
Chris@41
|
28
|
Chris@41
|
29 /* Current max converter is SRC_LINEAR. */
|
Chris@41
|
30 name_test () ;
|
Chris@41
|
31
|
Chris@41
|
32 error_test () ;
|
Chris@41
|
33
|
Chris@41
|
34 src_ratio_test () ;
|
Chris@41
|
35
|
Chris@41
|
36 zero_input_test (SRC_ZERO_ORDER_HOLD) ;
|
Chris@41
|
37 zero_input_test (SRC_LINEAR) ;
|
Chris@41
|
38 zero_input_test (SRC_SINC_FASTEST) ;
|
Chris@41
|
39
|
Chris@41
|
40 puts ("") ;
|
Chris@41
|
41 return 0 ;
|
Chris@41
|
42 } /* main */
|
Chris@41
|
43
|
Chris@41
|
44 static void
|
Chris@41
|
45 name_test (void)
|
Chris@41
|
46 { const char *name ;
|
Chris@41
|
47 int k = 0 ;
|
Chris@41
|
48
|
Chris@41
|
49 puts (" name_test :") ;
|
Chris@41
|
50
|
Chris@41
|
51 while (1)
|
Chris@41
|
52 { name = src_get_name (k) ;
|
Chris@41
|
53 if (name == NULL)
|
Chris@41
|
54 break ;
|
Chris@41
|
55 printf ("\tName %d : %s\n", k, name) ;
|
Chris@41
|
56 printf ("\tDesc %d : %s\n", k, src_get_description (k)) ;
|
Chris@41
|
57 k ++ ;
|
Chris@41
|
58 } ;
|
Chris@41
|
59
|
Chris@41
|
60 puts ("") ;
|
Chris@41
|
61
|
Chris@41
|
62 return ;
|
Chris@41
|
63 } /* name_test */
|
Chris@41
|
64
|
Chris@41
|
65 /*------------------------------------------------------------------------------
|
Chris@41
|
66 */
|
Chris@41
|
67
|
Chris@41
|
68 typedef struct
|
Chris@41
|
69 { double ratio ;
|
Chris@41
|
70 int should_pass ;
|
Chris@41
|
71 } RATIO_TEST ;
|
Chris@41
|
72
|
Chris@41
|
73 static RATIO_TEST ratio_test [] =
|
Chris@41
|
74 { { 1.0 / 256.1, 0 },
|
Chris@41
|
75 { 1.0 / 256.0, 1 },
|
Chris@41
|
76 { 1.0, 1 },
|
Chris@41
|
77 { 256.0, 1 },
|
Chris@41
|
78 { 256.1, 0 },
|
Chris@41
|
79 { -1.0, 0 }
|
Chris@41
|
80 } ;
|
Chris@41
|
81
|
Chris@41
|
82 static void
|
Chris@41
|
83 src_ratio_test (void)
|
Chris@41
|
84 { int k ;
|
Chris@41
|
85
|
Chris@41
|
86 puts (" src_ratio_test (SRC ratio must be in range [1/256, 256]):" ) ;
|
Chris@41
|
87
|
Chris@41
|
88
|
Chris@41
|
89 for (k = 0 ; k < ARRAY_LEN (ratio_test) ; k++)
|
Chris@41
|
90 { if (ratio_test [k].should_pass && src_is_valid_ratio (ratio_test [k].ratio) == 0)
|
Chris@41
|
91 { printf ("\n\nLine %d : SRC ratio %f should have passed.\n\n", __LINE__, ratio_test [k].ratio) ;
|
Chris@41
|
92 exit (1) ;
|
Chris@41
|
93 } ;
|
Chris@41
|
94 if (! ratio_test [k].should_pass && src_is_valid_ratio (ratio_test [k].ratio) != 0)
|
Chris@41
|
95 { printf ("\n\nLine %d : SRC ratio %f should not have passed.\n\n", __LINE__, ratio_test [k].ratio) ;
|
Chris@41
|
96 exit (1) ;
|
Chris@41
|
97 } ;
|
Chris@41
|
98 printf ("\t SRC ratio (%9.5f) : %s ................... ok\n", ratio_test [k].ratio,
|
Chris@41
|
99 (ratio_test [k].should_pass ? "pass" : "fail")) ;
|
Chris@41
|
100 } ;
|
Chris@41
|
101
|
Chris@41
|
102 puts ("") ;
|
Chris@41
|
103
|
Chris@41
|
104 return ;
|
Chris@41
|
105 } /* src_ratio_test */
|
Chris@41
|
106
|
Chris@41
|
107 static void
|
Chris@41
|
108 error_test (void)
|
Chris@41
|
109 { const char *errorstr ;
|
Chris@41
|
110 int k, errors = 0 ;
|
Chris@41
|
111
|
Chris@41
|
112 puts (" error_test :") ;
|
Chris@41
|
113
|
Chris@41
|
114 for (k = 0 ; 1 ; k++)
|
Chris@41
|
115 { errorstr = src_strerror (k) ;
|
Chris@41
|
116 printf ("\t%-2d : %s\n", k, errorstr) ;
|
Chris@41
|
117 if (errorstr == NULL)
|
Chris@41
|
118 { errors ++ ;
|
Chris@41
|
119 continue ;
|
Chris@41
|
120 } ;
|
Chris@41
|
121 if (strstr (errorstr, "Placeholder.") == errorstr)
|
Chris@41
|
122 break ;
|
Chris@41
|
123 } ;
|
Chris@41
|
124
|
Chris@41
|
125 if (errors != 0)
|
Chris@41
|
126 { printf ("\n\nLine %d : Missing error numbers above.\n\n", __LINE__) ;
|
Chris@41
|
127 exit (1) ;
|
Chris@41
|
128 } ;
|
Chris@41
|
129
|
Chris@41
|
130 puts ("") ;
|
Chris@41
|
131
|
Chris@41
|
132 return ;
|
Chris@41
|
133 } /* error_test */
|
Chris@41
|
134
|
Chris@41
|
135 static void
|
Chris@41
|
136 zero_input_test (int converter)
|
Chris@41
|
137 { SRC_DATA data ;
|
Chris@41
|
138 SRC_STATE *state ;
|
Chris@41
|
139 float out [100] ;
|
Chris@41
|
140 int error ;
|
Chris@41
|
141
|
Chris@41
|
142 printf (" %s (%-26s) ........ ", __func__, src_get_name (converter)) ;
|
Chris@41
|
143 fflush (stdout) ;
|
Chris@41
|
144
|
Chris@41
|
145 if ((state = src_new (converter, 1, &error)) == NULL)
|
Chris@41
|
146 { printf ("\n\nLine %d : src_new failed : %s.\n\n", __LINE__, src_strerror (error)) ;
|
Chris@41
|
147 exit (1) ;
|
Chris@41
|
148 } ;
|
Chris@41
|
149
|
Chris@41
|
150 data.data_in = (float *) 0xdeadbeef ;
|
Chris@41
|
151 data.input_frames = 0 ;
|
Chris@41
|
152 data.data_out = out ;
|
Chris@41
|
153 data.output_frames = ARRAY_LEN (out) ;
|
Chris@41
|
154 data.end_of_input = 0 ;
|
Chris@41
|
155 data.src_ratio = 1.0 ;
|
Chris@41
|
156
|
Chris@41
|
157 if ((error = src_process (state, &data)))
|
Chris@41
|
158 { printf ("\n\nLine %d : src_new failed : %s.\n\n", __LINE__, src_strerror (error)) ;
|
Chris@41
|
159 exit (1) ;
|
Chris@41
|
160 } ;
|
Chris@41
|
161
|
Chris@41
|
162 state = src_delete (state) ;
|
Chris@41
|
163
|
Chris@41
|
164 puts ("ok") ;
|
Chris@41
|
165 } /* zero_input_test */
|