annotate src/libsamplerate-0.1.8/tests/callback_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 c7265573341e
children
rev   line source
Chris@0 1 /*
Chris@0 2 ** Copyright (C) 2003-2011 Erik de Castro Lopo <erikd@mega-nerd.com>
Chris@0 3 **
Chris@0 4 ** This program is free software; you can redistribute it and/or modify
Chris@0 5 ** it under the terms of the GNU General Public License as published by
Chris@0 6 ** the Free Software Foundation; either version 2 of the License, or
Chris@0 7 ** (at your option) any later version.
Chris@0 8 **
Chris@0 9 ** This program is distributed in the hope that it will be useful,
Chris@0 10 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@0 11 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@0 12 ** GNU General Public License for more details.
Chris@0 13 **
Chris@0 14 ** You should have received a copy of the GNU General Public License
Chris@0 15 ** along with this program; if not, write to the Free Software
Chris@0 16 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
Chris@0 17 */
Chris@0 18
Chris@0 19 #include <stdio.h>
Chris@0 20 #include <stdlib.h>
Chris@0 21 #include <string.h>
Chris@0 22 #include <math.h>
Chris@0 23
Chris@0 24 #include <samplerate.h>
Chris@0 25
Chris@0 26 #include "util.h"
Chris@0 27
Chris@0 28 #define BUFFER_LEN 10000
Chris@0 29 #define CB_READ_LEN 256
Chris@0 30
Chris@0 31 static void callback_test (int converter, double ratio) ;
Chris@0 32 static void end_of_stream_test (int converter) ;
Chris@0 33
Chris@0 34 int
Chris@0 35 main (void)
Chris@0 36 { static double src_ratios [] =
Chris@0 37 { 1.0, 0.099, 0.1, 0.33333333, 0.789, 1.0001, 1.9, 3.1, 9.9
Chris@0 38 } ;
Chris@0 39
Chris@0 40 int k ;
Chris@0 41
Chris@0 42 puts ("") ;
Chris@0 43
Chris@0 44 puts (" Zero Order Hold interpolator :") ;
Chris@0 45 for (k = 0 ; k < ARRAY_LEN (src_ratios) ; k++)
Chris@0 46 callback_test (SRC_ZERO_ORDER_HOLD, src_ratios [k]) ;
Chris@0 47
Chris@0 48 puts (" Linear interpolator :") ;
Chris@0 49 for (k = 0 ; k < ARRAY_LEN (src_ratios) ; k++)
Chris@0 50 callback_test (SRC_LINEAR, src_ratios [k]) ;
Chris@0 51
Chris@0 52 puts (" Sinc interpolator :") ;
Chris@0 53 for (k = 0 ; k < ARRAY_LEN (src_ratios) ; k++)
Chris@0 54 callback_test (SRC_SINC_FASTEST, src_ratios [k]) ;
Chris@0 55
Chris@0 56 puts ("") ;
Chris@0 57
Chris@0 58 puts (" End of stream test :") ;
Chris@0 59 end_of_stream_test (SRC_ZERO_ORDER_HOLD) ;
Chris@0 60 end_of_stream_test (SRC_LINEAR) ;
Chris@0 61 end_of_stream_test (SRC_SINC_FASTEST) ;
Chris@0 62
Chris@0 63 puts ("") ;
Chris@0 64 return 0 ;
Chris@0 65 } /* main */
Chris@0 66
Chris@0 67 /*=====================================================================================
Chris@0 68 */
Chris@0 69
Chris@0 70 typedef struct
Chris@0 71 { int channels ;
Chris@0 72 long count, total ;
Chris@0 73 int end_of_data ;
Chris@0 74 float data [BUFFER_LEN] ;
Chris@0 75 } TEST_CB_DATA ;
Chris@0 76
Chris@0 77 static long
Chris@0 78 test_callback_func (void *cb_data, float **data)
Chris@0 79 { TEST_CB_DATA *pcb_data ;
Chris@0 80
Chris@0 81 long frames ;
Chris@0 82
Chris@0 83 if ((pcb_data = cb_data) == NULL)
Chris@0 84 return 0 ;
Chris@0 85
Chris@0 86 if (data == NULL)
Chris@0 87 return 0 ;
Chris@0 88
Chris@0 89 if (pcb_data->total - pcb_data->count > CB_READ_LEN)
Chris@0 90 frames = CB_READ_LEN / pcb_data->channels ;
Chris@0 91 else
Chris@0 92 frames = (pcb_data->total - pcb_data->count) / pcb_data->channels ;
Chris@0 93
Chris@0 94 *data = pcb_data->data + pcb_data->count ;
Chris@0 95 pcb_data->count += frames ;
Chris@0 96
Chris@0 97 return frames ;
Chris@0 98 } /* test_callback_func */
Chris@0 99
Chris@0 100
Chris@0 101 static void
Chris@0 102 callback_test (int converter, double src_ratio)
Chris@0 103 { static TEST_CB_DATA test_callback_data ;
Chris@0 104 static float output [BUFFER_LEN] ;
Chris@0 105
Chris@0 106 SRC_STATE *src_state ;
Chris@0 107
Chris@0 108 long read_count, read_total ;
Chris@0 109 int error ;
Chris@0 110
Chris@0 111 printf ("\tcallback_test (SRC ratio = %6.4f) ........... ", src_ratio) ;
Chris@0 112 fflush (stdout) ;
Chris@0 113
Chris@0 114 test_callback_data.channels = 2 ;
Chris@0 115 test_callback_data.count = 0 ;
Chris@0 116 test_callback_data.end_of_data = 0 ;
Chris@0 117 test_callback_data.total = ARRAY_LEN (test_callback_data.data) ;
Chris@0 118
Chris@0 119 if ((src_state = src_callback_new (test_callback_func, converter, test_callback_data.channels, &error, &test_callback_data)) == NULL)
Chris@0 120 { printf ("\n\nLine %d : %s\n\n", __LINE__, src_strerror (error)) ;
Chris@0 121 exit (1) ;
Chris@0 122 } ;
Chris@0 123
Chris@0 124 read_total = 0 ;
Chris@0 125 do
Chris@0 126 { /* We will be throwing away output data, so just grab as much as possible. */
Chris@0 127 read_count = ARRAY_LEN (output) / test_callback_data.channels ;
Chris@0 128 read_count = src_callback_read (src_state, src_ratio, read_count, output) ;
Chris@0 129 read_total += read_count ;
Chris@0 130 }
Chris@0 131 while (read_count > 0) ;
Chris@0 132
Chris@0 133 if ((error = src_error (src_state)) != 0)
Chris@0 134 { printf ("\n\nLine %d : %s\n\n", __LINE__, src_strerror (error)) ;
Chris@0 135 exit (1) ;
Chris@0 136 } ;
Chris@0 137
Chris@0 138 src_state = src_delete (src_state) ;
Chris@0 139
Chris@0 140 if (fabs (read_total / src_ratio - ARRAY_LEN (test_callback_data.data)) > 2.0)
Chris@0 141 { printf ("\n\nLine %d : input / output length mismatch.\n\n", __LINE__) ;
Chris@0 142 printf (" input len : %d\n", ARRAY_LEN (test_callback_data.data)) ;
Chris@0 143 printf (" output len : %ld (should be %g +/- 2)\n\n", read_total,
Chris@0 144 floor (0.5 + src_ratio * ARRAY_LEN (test_callback_data.data))) ;
Chris@0 145 exit (1) ;
Chris@0 146 } ;
Chris@0 147
Chris@0 148 puts ("ok") ;
Chris@0 149
Chris@0 150 return ;
Chris@0 151 } /* callback_test */
Chris@0 152
Chris@0 153 /*=====================================================================================
Chris@0 154 */
Chris@0 155
Chris@0 156 static long
Chris@0 157 eos_callback_func (void *cb_data, float **data)
Chris@0 158 {
Chris@0 159 TEST_CB_DATA *pcb_data ;
Chris@0 160 long frames ;
Chris@0 161
Chris@0 162 if (data == NULL)
Chris@0 163 return 0 ;
Chris@0 164
Chris@0 165 if ((pcb_data = cb_data) == NULL)
Chris@0 166 return 0 ;
Chris@0 167
Chris@0 168 /*
Chris@0 169 ** Return immediately if there is no more data.
Chris@0 170 ** In this case, the output pointer 'data' will not be set and
Chris@0 171 ** valgrind should not warn about it.
Chris@0 172 */
Chris@0 173 if (pcb_data->end_of_data)
Chris@0 174 return 0 ;
Chris@0 175
Chris@0 176 if (pcb_data->total - pcb_data->count > CB_READ_LEN)
Chris@0 177 frames = CB_READ_LEN / pcb_data->channels ;
Chris@0 178 else
Chris@0 179 frames = (pcb_data->total - pcb_data->count) / pcb_data->channels ;
Chris@0 180
Chris@0 181 *data = pcb_data->data + pcb_data->count ;
Chris@0 182 pcb_data->count += frames ;
Chris@0 183
Chris@0 184 /*
Chris@0 185 ** Set end_of_data so that the next call to the callback function will
Chris@0 186 ** return zero ocunt without setting the 'data' pointer.
Chris@0 187 */
Chris@0 188 if (pcb_data->total < 2 * pcb_data->count)
Chris@0 189 pcb_data->end_of_data = 1 ;
Chris@0 190
Chris@0 191 return frames ;
Chris@0 192 } /* eos_callback_data */
Chris@0 193
Chris@0 194
Chris@0 195 static void
Chris@0 196 end_of_stream_test (int converter)
Chris@0 197 { static TEST_CB_DATA test_callback_data ;
Chris@0 198 static float output [BUFFER_LEN] ;
Chris@0 199
Chris@0 200 SRC_STATE *src_state ;
Chris@0 201
Chris@0 202 double src_ratio = 0.3 ;
Chris@0 203 long read_count, read_total ;
Chris@0 204 int error ;
Chris@0 205
Chris@0 206 printf ("\t%-30s ........... ", src_get_name (converter)) ;
Chris@0 207 fflush (stdout) ;
Chris@0 208
Chris@0 209 test_callback_data.channels = 2 ;
Chris@0 210 test_callback_data.count = 0 ;
Chris@0 211 test_callback_data.end_of_data = 0 ;
Chris@0 212 test_callback_data.total = ARRAY_LEN (test_callback_data.data) ;
Chris@0 213
Chris@0 214 if ((src_state = src_callback_new (eos_callback_func, converter, test_callback_data.channels, &error, &test_callback_data)) == NULL)
Chris@0 215 { printf ("\n\nLine %d : %s\n\n", __LINE__, src_strerror (error)) ;
Chris@0 216 exit (1) ;
Chris@0 217 } ;
Chris@0 218
Chris@0 219 read_total = 0 ;
Chris@0 220 do
Chris@0 221 { /* We will be throwing away output data, so just grab as much as possible. */
Chris@0 222 read_count = ARRAY_LEN (output) / test_callback_data.channels ;
Chris@0 223 read_count = src_callback_read (src_state, src_ratio, read_count, output) ;
Chris@0 224 read_total += read_count ;
Chris@0 225 }
Chris@0 226 while (read_count > 0) ;
Chris@0 227
Chris@0 228 if ((error = src_error (src_state)) != 0)
Chris@0 229 { printf ("\n\nLine %d : %s\n\n", __LINE__, src_strerror (error)) ;
Chris@0 230 exit (1) ;
Chris@0 231 } ;
Chris@0 232
Chris@0 233 src_state = src_delete (src_state) ;
Chris@0 234
Chris@0 235 if (test_callback_data.end_of_data == 0)
Chris@0 236 { printf ("\n\nLine %d : test_callback_data.end_of_data should not be 0."
Chris@0 237 " This is a bug in the test.\n\n", __LINE__) ;
Chris@0 238 exit (1) ;
Chris@0 239 } ;
Chris@0 240
Chris@0 241 puts ("ok") ;
Chris@0 242 return ;
Chris@0 243 } /* end_of_stream_test */