annotate src/libsamplerate-0.1.9/tests/reset_test.c @ 56:af97cad61ff0

Add updated build of PortAudio for OSX
author Chris Cannam <cannam@all-day-breakfast.com>
date Tue, 03 Jan 2017 15:10:52 +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