annotate src/libsamplerate-0.1.8/tests/callback_test.c @ 23:619f715526df sv_v2.1

Update Vamp plugin SDK to 2.5
author Chris Cannam
date Thu, 09 May 2013 10:52:46 +0100
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 */