annotate src/libsamplerate-0.1.9/tests/reset_test.c @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents 481f5f8c5634
children
rev   line source
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
Chris@41 12 #include <samplerate.h>
Chris@41 13
Chris@41 14 #include "util.h"
Chris@41 15
Chris@41 16 #define BUFFER_LEN 2048
Chris@41 17 #define CB_READ_LEN 256
Chris@41 18
Chris@41 19 static void process_reset_test (int converter) ;
Chris@41 20 static void callback_reset_test (int converter) ;
Chris@41 21
Chris@41 22 static float data_one [BUFFER_LEN] ;
Chris@41 23 static float data_zero [BUFFER_LEN] ;
Chris@41 24
Chris@41 25 int
Chris@41 26 main (void)
Chris@41 27 {
Chris@41 28 puts ("") ;
Chris@41 29
Chris@41 30 process_reset_test (SRC_ZERO_ORDER_HOLD) ;
Chris@41 31 process_reset_test (SRC_LINEAR) ;
Chris@41 32 process_reset_test (SRC_SINC_FASTEST) ;
Chris@41 33
Chris@41 34 callback_reset_test (SRC_ZERO_ORDER_HOLD) ;
Chris@41 35 callback_reset_test (SRC_LINEAR) ;
Chris@41 36 callback_reset_test (SRC_SINC_FASTEST) ;
Chris@41 37
Chris@41 38 puts ("") ;
Chris@41 39
Chris@41 40 return 0 ;
Chris@41 41 } /* main */
Chris@41 42
Chris@41 43 static void
Chris@41 44 process_reset_test (int converter)
Chris@41 45 { static float output [BUFFER_LEN] ;
Chris@41 46
Chris@41 47 SRC_STATE *src_state ;
Chris@41 48 SRC_DATA src_data ;
Chris@41 49 int k, error ;
Chris@41 50
Chris@41 51 printf ("\tprocess_reset_test (%-28s) ....... ", src_get_name (converter)) ;
Chris@41 52 fflush (stdout) ;
Chris@41 53
Chris@41 54 for (k = 0 ; k < BUFFER_LEN ; k++)
Chris@41 55 { data_one [k] = 1.0 ;
Chris@41 56 data_zero [k] = 0.0 ;
Chris@41 57 } ;
Chris@41 58
Chris@41 59 /* Get a converter. */
Chris@41 60 if ((src_state = src_new (converter, 1, &error)) == NULL)
Chris@41 61 { printf ("\n\nLine %d : src_new() failed : %s.\n\n", __LINE__, src_strerror (error)) ;
Chris@41 62 exit (1) ;
Chris@41 63 } ;
Chris@41 64
Chris@41 65 /* Process a bunch of 1.0 valued samples. */
Chris@41 66 src_data.data_in = data_one ;
Chris@41 67 src_data.data_out = output ;
Chris@41 68 src_data.input_frames = BUFFER_LEN ;
Chris@41 69 src_data.output_frames = BUFFER_LEN ;
Chris@41 70 src_data.src_ratio = 0.9 ;
Chris@41 71 src_data.end_of_input = 1 ;
Chris@41 72
Chris@41 73 if ((error = src_process (src_state, &src_data)) != 0)
Chris@41 74 { printf ("\n\nLine %d : src_simple () returned error : %s\n\n", __LINE__, src_strerror (error)) ;
Chris@41 75 exit (1) ;
Chris@41 76 } ;
Chris@41 77
Chris@41 78 /* Reset the state of the converter.*/
Chris@41 79 src_reset (src_state) ;
Chris@41 80
Chris@41 81 /* Now process some zero data. */
Chris@41 82 src_data.data_in = data_zero ;
Chris@41 83 src_data.data_out = output ;
Chris@41 84 src_data.input_frames = BUFFER_LEN ;
Chris@41 85 src_data.output_frames = BUFFER_LEN ;
Chris@41 86 src_data.src_ratio = 0.9 ;
Chris@41 87 src_data.end_of_input = 1 ;
Chris@41 88
Chris@41 89 if ((error = src_process (src_state, &src_data)) != 0)
Chris@41 90 { printf ("\n\nLine %d : src_simple () returned error : %s\n\n", __LINE__, src_strerror (error)) ;
Chris@41 91 exit (1) ;
Chris@41 92 } ;
Chris@41 93
Chris@41 94 /* Finally make sure that the output data is zero ie reset was sucessful. */
Chris@41 95 for (k = 0 ; k < BUFFER_LEN / 2 ; k++)
Chris@41 96 if (output [k] != 0.0)
Chris@41 97 { printf ("\n\nLine %d : output [%d] should be 0.0, is %f.\n", __LINE__, k, output [k]) ;
Chris@41 98 exit (1) ;
Chris@41 99 } ;
Chris@41 100
Chris@41 101 /* Make sure that this function has been exported. */
Chris@41 102 src_set_ratio (src_state, 1.0) ;
Chris@41 103
Chris@41 104 /* Delete converter. */
Chris@41 105 src_state = src_delete (src_state) ;
Chris@41 106
Chris@41 107 puts ("ok") ;
Chris@41 108 } /* process_reset_test */
Chris@41 109
Chris@41 110 /*==============================================================================
Chris@41 111 */
Chris@41 112
Chris@41 113 typedef struct
Chris@41 114 { int channels ;
Chris@41 115 long count, total ;
Chris@41 116 float *data ;
Chris@41 117 } TEST_CB_DATA ;
Chris@41 118
Chris@41 119 static long
Chris@41 120 test_callback_func (void *cb_data, float **data)
Chris@41 121 { TEST_CB_DATA *pcb_data ;
Chris@41 122
Chris@41 123 long frames ;
Chris@41 124
Chris@41 125 if ((pcb_data = cb_data) == NULL)
Chris@41 126 return 0 ;
Chris@41 127
Chris@41 128 if (data == NULL)
Chris@41 129 return 0 ;
Chris@41 130
Chris@41 131 if (pcb_data->total - pcb_data->count > 0)
Chris@41 132 frames = pcb_data->total - pcb_data->count ;
Chris@41 133 else
Chris@41 134 frames = 0 ;
Chris@41 135
Chris@41 136 *data = pcb_data->data + pcb_data->count ;
Chris@41 137 pcb_data->count += frames ;
Chris@41 138
Chris@41 139 return frames ;
Chris@41 140 } /* test_callback_func */
Chris@41 141
Chris@41 142 static void
Chris@41 143 callback_reset_test (int converter)
Chris@41 144 { static TEST_CB_DATA test_callback_data ;
Chris@41 145
Chris@41 146 static float output [BUFFER_LEN] ;
Chris@41 147
Chris@41 148 SRC_STATE *src_state ;
Chris@41 149
Chris@41 150 double src_ratio = 1.1 ;
Chris@41 151 long read_count, read_total ;
Chris@41 152 int k, error ;
Chris@41 153
Chris@41 154 printf ("\tcallback_reset_test (%-28s) ....... ", src_get_name (converter)) ;
Chris@41 155 fflush (stdout) ;
Chris@41 156
Chris@41 157 for (k = 0 ; k < ARRAY_LEN (data_one) ; k++)
Chris@41 158 { data_one [k] = 1.0 ;
Chris@41 159 data_zero [k] = 0.0 ;
Chris@41 160 } ;
Chris@41 161
Chris@41 162 if ((src_state = src_callback_new (test_callback_func, converter, 1, &error, &test_callback_data)) == NULL)
Chris@41 163 { printf ("\n\nLine %d : %s\n\n", __LINE__, src_strerror (error)) ;
Chris@41 164 exit (1) ;
Chris@41 165 } ;
Chris@41 166
Chris@41 167 /* Process a bunch of 1.0 valued samples. */
Chris@41 168 test_callback_data.channels = 1 ;
Chris@41 169 test_callback_data.count = 0 ;
Chris@41 170 test_callback_data.total = ARRAY_LEN (data_one) ;
Chris@41 171 test_callback_data.data = data_one ;
Chris@41 172
Chris@41 173 read_total = 0 ;
Chris@41 174 do
Chris@41 175 { read_count = (ARRAY_LEN (output) - read_total > CB_READ_LEN) ? CB_READ_LEN : ARRAY_LEN (output) - read_total ;
Chris@41 176 read_count = src_callback_read (src_state, src_ratio, read_count, output + read_total) ;
Chris@41 177 read_total += read_count ;
Chris@41 178 }
Chris@41 179 while (read_count > 0) ;
Chris@41 180
Chris@41 181 /* Check for errors. */
Chris@41 182 if ((error = src_error (src_state)) != 0)
Chris@41 183 { printf ("\n\nLine %d : %s\n\n", __LINE__, src_strerror (error)) ;
Chris@41 184 exit (1) ;
Chris@41 185 } ;
Chris@41 186
Chris@41 187 /* Reset the state of the converter.*/
Chris@41 188 src_reset (src_state) ;
Chris@41 189
Chris@41 190 /* Process a bunch of 0.0 valued samples. */
Chris@41 191 test_callback_data.channels = 1 ;
Chris@41 192 test_callback_data.count = 0 ;
Chris@41 193 test_callback_data.total = ARRAY_LEN (data_zero) ;
Chris@41 194 test_callback_data.data = data_zero ;
Chris@41 195
Chris@41 196 /* Now process some zero data. */
Chris@41 197 read_total = 0 ;
Chris@41 198 do
Chris@41 199 { read_count = (ARRAY_LEN (output) - read_total > CB_READ_LEN) ? CB_READ_LEN : ARRAY_LEN (output) - read_total ;
Chris@41 200 read_count = src_callback_read (src_state, src_ratio, read_count, output + read_total) ;
Chris@41 201 read_total += read_count ;
Chris@41 202 }
Chris@41 203 while (read_count > 0) ;
Chris@41 204
Chris@41 205 /* Check for errors. */
Chris@41 206 if ((error = src_error (src_state)) != 0)
Chris@41 207 { printf ("\n\nLine %d : %s\n\n", __LINE__, src_strerror (error)) ;
Chris@41 208 exit (1) ;
Chris@41 209 } ;
Chris@41 210
Chris@41 211 /* Finally make sure that the output data is zero ie reset was sucessful. */
Chris@41 212 for (k = 0 ; k < BUFFER_LEN / 2 ; k++)
Chris@41 213 if (output [k] != 0.0)
Chris@41 214 { printf ("\n\nLine %d : output [%d] should be 0.0, is %f.\n\n", __LINE__, k, output [k]) ;
Chris@41 215 save_oct_float ("output.dat", data_one, ARRAY_LEN (data_one), output, ARRAY_LEN (output)) ;
Chris@41 216 exit (1) ;
Chris@41 217 } ;
Chris@41 218
Chris@41 219 /* Make sure that this function has been exported. */
Chris@41 220 src_set_ratio (src_state, 1.0) ;
Chris@41 221
Chris@41 222 /* Delete converter. */
Chris@41 223 src_state = src_delete (src_state) ;
Chris@41 224
Chris@41 225 puts ("ok") ;
Chris@41 226 } /* callback_reset_test */
Chris@41 227
Chris@41 228