annotate src/libsamplerate-0.1.8/tests/termination_test.c @ 169:223a55898ab9 tip default

Add null config files
author Chris Cannam <cannam@all-day-breakfast.com>
date Mon, 02 Mar 2020 14:03:47 +0000
parents 545efbb81310
children
rev   line source
cannam@85 1 /*
cannam@85 2 ** Copyright (C) 2002-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
cannam@85 3 **
cannam@85 4 ** This program is free software; you can redistribute it and/or modify
cannam@85 5 ** it under the terms of the GNU General Public License as published by
cannam@85 6 ** the Free Software Foundation; either version 2 of the License, or
cannam@85 7 ** (at your option) any later version.
cannam@85 8 **
cannam@85 9 ** This program is distributed in the hope that it will be useful,
cannam@85 10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
cannam@85 11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
cannam@85 12 ** GNU General Public License for more details.
cannam@85 13 **
cannam@85 14 ** You should have received a copy of the GNU General Public License
cannam@85 15 ** along with this program; if not, write to the Free Software
cannam@85 16 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
cannam@85 17 */
cannam@85 18
cannam@85 19 #include <stdio.h>
cannam@85 20 #include <stdlib.h>
cannam@85 21 #include <math.h>
cannam@85 22
cannam@85 23 #include <samplerate.h>
cannam@85 24
cannam@85 25 #include "util.h"
cannam@85 26
cannam@85 27 #define SHORT_BUFFER_LEN 2048
cannam@85 28 #define LONG_BUFFER_LEN ((1 << 16) - 20)
cannam@85 29
cannam@85 30 static void simple_test (int converter) ;
cannam@85 31 static void stream_test (int converter, double ratio) ;
cannam@85 32 static void init_term_test (int converter, double ratio) ;
cannam@85 33
cannam@85 34 static int next_block_length (int reset) ;
cannam@85 35
cannam@85 36 int
cannam@85 37 main (void)
cannam@85 38 { static double src_ratios [] =
cannam@85 39 { 0.999900, 1.000100, 0.789012, 1.200000, 0.333333, 3.100000,
cannam@85 40 0.125000, 8.000000, 0.099900, 9.990000, 0.100000, 10.00000
cannam@85 41 } ;
cannam@85 42
cannam@85 43 int k ;
cannam@85 44
cannam@85 45 puts ("\n Zero Order Hold interpolator:") ;
cannam@85 46
cannam@85 47 for (k = 0 ; k < ARRAY_LEN (src_ratios) ; k++)
cannam@85 48 init_term_test (SRC_ZERO_ORDER_HOLD, src_ratios [k]) ;
cannam@85 49 puts ("") ;
cannam@85 50 for (k = 0 ; k < ARRAY_LEN (src_ratios) ; k++)
cannam@85 51 stream_test (SRC_ZERO_ORDER_HOLD, src_ratios [k]) ;
cannam@85 52
cannam@85 53
cannam@85 54 puts ("\n Linear interpolator:") ;
cannam@85 55 for (k = 0 ; k < ARRAY_LEN (src_ratios) ; k++)
cannam@85 56 init_term_test (SRC_LINEAR, src_ratios [k]) ;
cannam@85 57 puts ("") ;
cannam@85 58 for (k = 0 ; k < ARRAY_LEN (src_ratios) ; k++)
cannam@85 59 stream_test (SRC_LINEAR, src_ratios [k]) ;
cannam@85 60
cannam@85 61
cannam@85 62 puts ("\n Sinc interpolator:") ;
cannam@85 63 for (k = 0 ; k < ARRAY_LEN (src_ratios) ; k++)
cannam@85 64 init_term_test (SRC_SINC_FASTEST, src_ratios [k]) ;
cannam@85 65 puts ("") ;
cannam@85 66 for (k = 0 ; k < ARRAY_LEN (src_ratios) ; k++)
cannam@85 67 stream_test (SRC_SINC_FASTEST, src_ratios [k]) ;
cannam@85 68
cannam@85 69 puts ("") ;
cannam@85 70
cannam@85 71 simple_test (SRC_SINC_FASTEST) ;
cannam@85 72
cannam@85 73 return 0 ;
cannam@85 74 } /* main */
cannam@85 75
cannam@85 76 static void
cannam@85 77 simple_test (int converter)
cannam@85 78 {
cannam@85 79 int ilen = 199030, olen = 1000, error ;
cannam@85 80
cannam@85 81 {
cannam@85 82 float in [ilen] ;
cannam@85 83 float out [olen] ;
cannam@85 84 double ratio = (1.0 * olen) / ilen ;
cannam@85 85 SRC_DATA src_data =
cannam@85 86 { in, out,
cannam@85 87 ilen, olen,
cannam@85 88 0, 0, 0,
cannam@85 89 ratio
cannam@85 90 } ;
cannam@85 91
cannam@85 92 error = src_simple (&src_data, converter, 1) ;
cannam@85 93 if (error)
cannam@85 94 { printf ("\n\nLine %d : %s\n\n", __LINE__, src_strerror (error)) ;
cannam@85 95 exit (1) ;
cannam@85 96 } ;
cannam@85 97 } ;
cannam@85 98
cannam@85 99 return ;
cannam@85 100 } /* simple_test */
cannam@85 101
cannam@85 102 static void
cannam@85 103 init_term_test (int converter, double src_ratio)
cannam@85 104 { static float input [SHORT_BUFFER_LEN], output [SHORT_BUFFER_LEN] ;
cannam@85 105
cannam@85 106 SRC_DATA src_data ;
cannam@85 107
cannam@85 108 int k, input_len, output_len, error, terminate ;
cannam@85 109
cannam@85 110 printf ("\tinit_term_test (SRC ratio = %7.4f) .......... ", src_ratio) ;
cannam@85 111 fflush (stdout) ;
cannam@85 112
cannam@85 113 /* Calculate maximun input and output lengths. */
cannam@85 114 if (src_ratio >= 1.0)
cannam@85 115 { output_len = SHORT_BUFFER_LEN ;
cannam@85 116 input_len = (int) floor (SHORT_BUFFER_LEN / src_ratio) ;
cannam@85 117 }
cannam@85 118 else
cannam@85 119 { input_len = SHORT_BUFFER_LEN ;
cannam@85 120 output_len = (int) floor (SHORT_BUFFER_LEN * src_ratio) ;
cannam@85 121 } ;
cannam@85 122
cannam@85 123 /* Reduce input_len by 10 so output is longer than necessary. */
cannam@85 124 input_len -= 10 ;
cannam@85 125
cannam@85 126 for (k = 0 ; k < ARRAY_LEN (input) ; k++)
cannam@85 127 input [k] = 1.0 ;
cannam@85 128
cannam@85 129 if (output_len > SHORT_BUFFER_LEN)
cannam@85 130 { printf ("\n\nLine %d : output_len > SHORT_BUFFER_LEN\n\n", __LINE__) ;
cannam@85 131 exit (1) ;
cannam@85 132 } ;
cannam@85 133
cannam@85 134 src_data.data_in = input ;
cannam@85 135 src_data.input_frames = input_len ;
cannam@85 136
cannam@85 137 src_data.src_ratio = src_ratio ;
cannam@85 138
cannam@85 139 src_data.data_out = output ;
cannam@85 140 src_data.output_frames = SHORT_BUFFER_LEN ;
cannam@85 141
cannam@85 142 if ((error = src_simple (&src_data, converter, 1)))
cannam@85 143 { printf ("\n\nLine %d : %s\n\n", __LINE__, src_strerror (error)) ;
cannam@85 144 exit (1) ;
cannam@85 145 } ;
cannam@85 146
cannam@85 147 terminate = (int) ceil ((src_ratio >= 1.0) ? 1 : 1.0 / src_ratio) ;
cannam@85 148
cannam@85 149 if (fabs (src_ratio * input_len - src_data.output_frames_gen) > terminate)
cannam@85 150 { printf ("\n\nLine %d : Bad output frame count.\n\n", __LINE__) ;
cannam@85 151 printf ("\tterminate : %d\n", terminate) ;
cannam@85 152 printf ("\tsrc_ratio : %.4f\n", src_ratio) ;
cannam@85 153 printf ("\tinput_len : %d\n"
cannam@85 154 "\tinput_len * src_ratio : %f\n", input_len, input_len * src_ratio) ;
cannam@85 155 printf ("\toutput_frames_gen : %ld\n\n", src_data.output_frames_gen) ;
cannam@85 156 exit (1) ;
cannam@85 157 } ;
cannam@85 158
cannam@85 159 if (abs (src_data.input_frames_used - input_len) > 1)
cannam@85 160 { printf ("\n\nLine %d : input_frames_used should be %d, is %ld.\n\n",
cannam@85 161 __LINE__, input_len, src_data.input_frames_used) ;
cannam@85 162 printf ("\tsrc_ratio : %.4f\n", src_ratio) ;
cannam@85 163 printf ("\tinput_len : %d\n\tinput_used : %ld\n\n", input_len, src_data.input_frames_used) ;
cannam@85 164 exit (1) ;
cannam@85 165 } ;
cannam@85 166
cannam@85 167 if (fabs (output [0]) < 0.1)
cannam@85 168 { printf ("\n\nLine %d : First output sample is bad.\n\n", __LINE__) ;
cannam@85 169 printf ("\toutput [0] == %f\n\n", output [0]) ;
cannam@85 170 exit (1) ;
cannam@85 171 }
cannam@85 172
cannam@85 173 puts ("ok") ;
cannam@85 174
cannam@85 175 return ;
cannam@85 176 } /* init_term_test */
cannam@85 177
cannam@85 178 static void
cannam@85 179 stream_test (int converter, double src_ratio)
cannam@85 180 { static float input [LONG_BUFFER_LEN], output [LONG_BUFFER_LEN] ;
cannam@85 181
cannam@85 182 SRC_STATE *src_state ;
cannam@85 183 SRC_DATA src_data ;
cannam@85 184
cannam@85 185 int input_len, output_len, current_in, current_out ;
cannam@85 186 int k, error, terminate ;
cannam@85 187
cannam@85 188 printf ("\tstream_test (SRC ratio = %7.4f) .......... ", src_ratio) ;
cannam@85 189 fflush (stdout) ;
cannam@85 190
cannam@85 191 /* Erik */
cannam@85 192 for (k = 0 ; k < LONG_BUFFER_LEN ; k++) input [k] = k * 1.0 ;
cannam@85 193
cannam@85 194 /* Calculate maximun input and output lengths. */
cannam@85 195 if (src_ratio >= 1.0)
cannam@85 196 { output_len = LONG_BUFFER_LEN ;
cannam@85 197 input_len = (int) floor (LONG_BUFFER_LEN / src_ratio) ;
cannam@85 198 }
cannam@85 199 else
cannam@85 200 { input_len = LONG_BUFFER_LEN ;
cannam@85 201 output_len = (int) floor (LONG_BUFFER_LEN * src_ratio) ;
cannam@85 202 } ;
cannam@85 203
cannam@85 204 /* Reduce input_len by 10 so output is longer than necessary. */
cannam@85 205 input_len -= 20 ;
cannam@85 206
cannam@85 207 if (output_len > LONG_BUFFER_LEN)
cannam@85 208 { printf ("\n\nLine %d : output_len > LONG_BUFFER_LEN\n\n", __LINE__) ;
cannam@85 209 exit (1) ;
cannam@85 210 } ;
cannam@85 211
cannam@85 212 current_in = current_out = 0 ;
cannam@85 213
cannam@85 214 /* Perform sample rate conversion. */
cannam@85 215 if ((src_state = src_new (converter, 1, &error)) == NULL)
cannam@85 216 { printf ("\n\nLine %d : src_new() failed : %s\n\n", __LINE__, src_strerror (error)) ;
cannam@85 217 exit (1) ;
cannam@85 218 } ;
cannam@85 219
cannam@85 220 src_data.end_of_input = 0 ; /* Set this later. */
cannam@85 221
cannam@85 222 src_data.data_in = input ;
cannam@85 223
cannam@85 224 src_data.src_ratio = src_ratio ;
cannam@85 225
cannam@85 226 src_data.data_out = output ;
cannam@85 227 src_data.output_frames = ARRAY_LEN (output) / 10 ;
cannam@85 228
cannam@85 229 terminate = 1 + (int) ceil ((src_ratio >= 1.0) ? src_ratio : 1.0 / src_ratio) ;
cannam@85 230
cannam@85 231 while (1)
cannam@85 232 {
cannam@85 233 src_data.input_frames = next_block_length (0) ;
cannam@85 234 src_data.input_frames = MIN (src_data.input_frames, input_len - current_in) ;
cannam@85 235
cannam@85 236 src_data.output_frames = ARRAY_LEN (output) - current_out ;
cannam@85 237 /*-Erik MIN (src_data.output_frames, output_len - current_out) ;-*/
cannam@85 238
cannam@85 239 src_data.end_of_input = (current_in >= input_len) ? 1 : 0 ;
cannam@85 240
cannam@85 241 if ((error = src_process (src_state, &src_data)))
cannam@85 242 { printf ("\n\nLine %d : %s\n\n", __LINE__, src_strerror (error)) ;
cannam@85 243 printf (" src_data.input_frames : %ld\n", src_data.input_frames) ;
cannam@85 244 printf (" src_data.output_frames : %ld\n\n", src_data.output_frames) ;
cannam@85 245 exit (1) ;
cannam@85 246 } ;
cannam@85 247
cannam@85 248 if (src_data.end_of_input && src_data.output_frames_gen == 0)
cannam@85 249 break ;
cannam@85 250
cannam@85 251 if (src_data.input_frames_used > src_data.input_frames)
cannam@85 252 { printf ("\n\nLine %d : input_frames_used > input_frames\n\n", __LINE__) ;
cannam@85 253 printf (" src_data.input_frames : %ld\n", src_data.input_frames) ;
cannam@85 254 printf (" src_data.input_frames_used : %ld\n", src_data.input_frames_used) ;
cannam@85 255 printf (" src_data.output_frames : %ld\n", src_data.output_frames) ;
cannam@85 256 printf (" src_data.output_frames_gen : %ld\n\n", src_data.output_frames_gen) ;
cannam@85 257 exit (1) ;
cannam@85 258 } ;
cannam@85 259
cannam@85 260 if (src_data.input_frames_used < 0)
cannam@85 261 { printf ("\n\nLine %d : input_frames_used (%ld) < 0\n\n", __LINE__, src_data.input_frames_used) ;
cannam@85 262 exit (1) ;
cannam@85 263 } ;
cannam@85 264
cannam@85 265 if (src_data.output_frames_gen < 0)
cannam@85 266 { printf ("\n\nLine %d : output_frames_gen (%ld) < 0\n\n", __LINE__, src_data.output_frames_gen) ;
cannam@85 267 exit (1) ;
cannam@85 268 } ;
cannam@85 269
cannam@85 270 current_in += src_data.input_frames_used ;
cannam@85 271 current_out += src_data.output_frames_gen ;
cannam@85 272
cannam@85 273 if (current_in > input_len + terminate)
cannam@85 274 { printf ("\n\nLine %d : current_in (%d) > input_len (%d + %d)\n\n", __LINE__, current_in, input_len, terminate) ;
cannam@85 275 exit (1) ;
cannam@85 276 } ;
cannam@85 277
cannam@85 278 if (current_out > output_len)
cannam@85 279 { printf ("\n\nLine %d : current_out (%d) > output_len (%d)\n\n", __LINE__, current_out, output_len) ;
cannam@85 280 exit (1) ;
cannam@85 281 } ;
cannam@85 282
cannam@85 283 if (src_data.input_frames_used > input_len)
cannam@85 284 { printf ("\n\nLine %d : input_frames_used (%ld) > %d\n\n", __LINE__, src_data.input_frames_used, input_len) ;
cannam@85 285 exit (1) ;
cannam@85 286 } ;
cannam@85 287
cannam@85 288 if (src_data.output_frames_gen > output_len)
cannam@85 289 { printf ("\n\nLine %d : output_frames_gen (%ld) > %d\n\n", __LINE__, src_data.output_frames_gen, output_len) ;
cannam@85 290 exit (1) ;
cannam@85 291 } ;
cannam@85 292
cannam@85 293 if (src_data.data_in == NULL && src_data.output_frames_gen == 0)
cannam@85 294 break ;
cannam@85 295
cannam@85 296
cannam@85 297 src_data.data_in += src_data.input_frames_used ;
cannam@85 298 src_data.data_out += src_data.output_frames_gen ;
cannam@85 299 } ;
cannam@85 300
cannam@85 301 src_state = src_delete (src_state) ;
cannam@85 302
cannam@85 303 if (fabs (current_out - src_ratio * input_len) > terminate)
cannam@85 304 { printf ("\n\nLine %d : bad output data length %d should be %2.1f +/- %d.\n", __LINE__,
cannam@85 305 current_out, src_ratio * input_len, terminate) ;
cannam@85 306 printf ("\tsrc_ratio : %.4f\n", src_ratio) ;
cannam@85 307 printf ("\tinput_len : %d\n\tinput_used : %d\n", input_len, current_in) ;
cannam@85 308 printf ("\toutput_len : %d\n\toutput_gen : %d\n\n", output_len, current_out) ;
cannam@85 309 exit (1) ;
cannam@85 310 } ;
cannam@85 311
cannam@85 312 if (current_in != input_len)
cannam@85 313 { printf ("\n\nLine %d : unused input.\n", __LINE__) ;
cannam@85 314 printf ("\tinput_len : %d\n", input_len) ;
cannam@85 315 printf ("\tinput_frames_used : %d\n\n", current_in) ;
cannam@85 316 exit (1) ;
cannam@85 317 } ;
cannam@85 318
cannam@85 319 puts ("ok") ;
cannam@85 320
cannam@85 321 return ;
cannam@85 322 } /* stream_test */
cannam@85 323
cannam@85 324 static int
cannam@85 325 next_block_length (int reset)
cannam@85 326 { static int block_lengths [] = /* Should be an odd length. */
cannam@85 327 { /*-2, 500, 5, 400, 10, 300, 20, 200, 50, 100, 70 -*/
cannam@85 328 5, 400, 10, 300, 20, 200, 50, 100, 70
cannam@85 329 } ;
cannam@85 330 static int block_len_index = 0 ;
cannam@85 331
cannam@85 332 if (reset)
cannam@85 333 block_len_index = 0 ;
cannam@85 334 else
cannam@85 335 block_len_index = (block_len_index + 1) % ARRAY_LEN (block_lengths) ;
cannam@85 336
cannam@85 337 return block_lengths [block_len_index] ;
cannam@85 338 } /* next_block_length */
cannam@85 339