annotate src/libsamplerate-0.1.9/tests/multichan_throughput_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) 2008-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 #include <string.h>
Chris@41 12 #include <time.h>
Chris@41 13 #include <unistd.h>
Chris@41 14
Chris@41 15 #include <samplerate.h>
Chris@41 16
Chris@41 17 #include "config.h"
Chris@41 18
Chris@41 19 #include "util.h"
Chris@41 20 #include "float_cast.h"
Chris@41 21
Chris@41 22 #define BUFFER_LEN (1<<17)
Chris@41 23
Chris@41 24 static float input [BUFFER_LEN] ;
Chris@41 25 static float output [BUFFER_LEN] ;
Chris@41 26
Chris@41 27 static long
Chris@41 28 throughput_test (int converter, int channels, long best_throughput)
Chris@41 29 { SRC_DATA src_data ;
Chris@41 30 clock_t start_time, clock_time ;
Chris@41 31 double duration ;
Chris@41 32 long total_frames = 0, throughput ;
Chris@41 33 int error ;
Chris@41 34
Chris@41 35 printf (" %-30s %2d ", src_get_name (converter), channels) ;
Chris@41 36 fflush (stdout) ;
Chris@41 37
Chris@41 38 src_data.data_in = input ;
Chris@41 39 src_data.input_frames = ARRAY_LEN (input) / channels ;
Chris@41 40
Chris@41 41 src_data.data_out = output ;
Chris@41 42 src_data.output_frames = ARRAY_LEN (output) / channels ;
Chris@41 43
Chris@41 44 src_data.src_ratio = 0.99 ;
Chris@41 45
Chris@41 46 sleep (2) ;
Chris@41 47
Chris@41 48 start_time = clock () ;
Chris@41 49
Chris@41 50 do
Chris@41 51 {
Chris@41 52 if ((error = src_simple (&src_data, converter, channels)) != 0)
Chris@41 53 { puts (src_strerror (error)) ;
Chris@41 54 exit (1) ;
Chris@41 55 } ;
Chris@41 56
Chris@41 57 total_frames += src_data.output_frames_gen ;
Chris@41 58
Chris@41 59 clock_time = clock () - start_time ;
Chris@41 60 duration = (1.0 * clock_time) / CLOCKS_PER_SEC ;
Chris@41 61 }
Chris@41 62 while (duration < 5.0) ;
Chris@41 63
Chris@41 64 if (src_data.input_frames_used != src_data.input_frames)
Chris@41 65 { printf ("\n\nLine %d : input frames used %ld should be %ld\n", __LINE__, src_data.input_frames_used, src_data.input_frames) ;
Chris@41 66 exit (1) ;
Chris@41 67 } ;
Chris@41 68
Chris@41 69 if (fabs (src_data.src_ratio * src_data.input_frames_used - src_data.output_frames_gen) > 2)
Chris@41 70 { printf ("\n\nLine %d : input / output length mismatch.\n\n", __LINE__) ;
Chris@41 71 printf (" input len : %d\n", ARRAY_LEN (input) / channels) ;
Chris@41 72 printf (" output len : %ld (should be %g +/- 2)\n\n", src_data.output_frames_gen,
Chris@41 73 floor (0.5 + src_data.src_ratio * src_data.input_frames_used)) ;
Chris@41 74 exit (1) ;
Chris@41 75 } ;
Chris@41 76
Chris@41 77 throughput = lrint (floor (total_frames / duration)) ;
Chris@41 78
Chris@41 79 if (best_throughput == 0)
Chris@41 80 { best_throughput = MAX (throughput, best_throughput) ;
Chris@41 81 printf ("%5.2f %10ld\n", duration, throughput) ;
Chris@41 82 }
Chris@41 83 else
Chris@41 84 { best_throughput = MAX (throughput, best_throughput) ;
Chris@41 85 printf ("%5.2f %10ld %10ld\n", duration, throughput, best_throughput) ;
Chris@41 86 }
Chris@41 87
Chris@41 88 return best_throughput ;
Chris@41 89 } /* throughput_test */
Chris@41 90
Chris@41 91 static void
Chris@41 92 single_run (void)
Chris@41 93 { const int max_channels = 10 ;
Chris@41 94 int k ;
Chris@41 95
Chris@41 96 printf ("\n CPU name : %s\n", get_cpu_name ()) ;
Chris@41 97
Chris@41 98 puts (
Chris@41 99 "\n"
Chris@41 100 " Converter Channels Duration Throughput\n"
Chris@41 101 " ---------------------------------------------------------------------"
Chris@41 102 ) ;
Chris@41 103
Chris@41 104 for (k = 1 ; k <= max_channels / 2 ; k++)
Chris@41 105 throughput_test (SRC_SINC_FASTEST, k, 0) ;
Chris@41 106
Chris@41 107 puts ("") ;
Chris@41 108 for (k = 1 ; k <= max_channels / 2 ; k++)
Chris@41 109 throughput_test (SRC_SINC_MEDIUM_QUALITY, k, 0) ;
Chris@41 110
Chris@41 111 puts ("") ;
Chris@41 112 for (k = 1 ; k <= max_channels ; k++)
Chris@41 113 throughput_test (SRC_SINC_BEST_QUALITY, k, 0) ;
Chris@41 114
Chris@41 115 puts ("") ;
Chris@41 116 return ;
Chris@41 117 } /* single_run */
Chris@41 118
Chris@41 119 static void
Chris@41 120 multi_run (int run_count)
Chris@41 121 { int k, ch ;
Chris@41 122
Chris@41 123 printf ("\n CPU name : %s\n", get_cpu_name ()) ;
Chris@41 124
Chris@41 125 puts (
Chris@41 126 "\n"
Chris@41 127 " Converter Channels Duration Throughput Best Throughput\n"
Chris@41 128 " ----------------------------------------------------------------------------------------"
Chris@41 129 ) ;
Chris@41 130
Chris@41 131 for (ch = 1 ; ch <= 5 ; ch++)
Chris@41 132 { long sinc_fastest = 0, sinc_medium = 0, sinc_best = 0 ;
Chris@41 133
Chris@41 134 for (k = 0 ; k < run_count ; k++)
Chris@41 135 { sinc_fastest = throughput_test (SRC_SINC_FASTEST, ch, sinc_fastest) ;
Chris@41 136 sinc_medium = throughput_test (SRC_SINC_MEDIUM_QUALITY, ch, sinc_medium) ;
Chris@41 137 sinc_best = throughput_test (SRC_SINC_BEST_QUALITY, ch, sinc_best) ;
Chris@41 138
Chris@41 139 puts ("") ;
Chris@41 140
Chris@41 141 /* Let the CPU cool down. We might be running on a laptop. */
Chris@41 142 sleep (10) ;
Chris@41 143 } ;
Chris@41 144
Chris@41 145 puts (
Chris@41 146 "\n"
Chris@41 147 " Converter Best Throughput\n"
Chris@41 148 " ------------------------------------------------"
Chris@41 149 ) ;
Chris@41 150
Chris@41 151 printf (" %-30s %10ld\n", src_get_name (SRC_SINC_FASTEST), sinc_fastest) ;
Chris@41 152 printf (" %-30s %10ld\n", src_get_name (SRC_SINC_MEDIUM_QUALITY), sinc_medium) ;
Chris@41 153 printf (" %-30s %10ld\n", src_get_name (SRC_SINC_BEST_QUALITY), sinc_best) ;
Chris@41 154 } ;
Chris@41 155
Chris@41 156 puts ("") ;
Chris@41 157 } /* multi_run */
Chris@41 158
Chris@41 159 static void
Chris@41 160 usage_exit (const char * argv0)
Chris@41 161 { const char * cptr ;
Chris@41 162
Chris@41 163 if ((cptr = strrchr (argv0, '/')) != NULL)
Chris@41 164 argv0 = cptr ;
Chris@41 165
Chris@41 166 printf (
Chris@41 167 "Usage :\n"
Chris@41 168 " %s - Single run of the throughput test.\n"
Chris@41 169 " %s --best-of N - Do N runs of test a print bext result.\n"
Chris@41 170 "\n",
Chris@41 171 argv0, argv0) ;
Chris@41 172
Chris@41 173 exit (0) ;
Chris@41 174 } /* usage_exit */
Chris@41 175
Chris@41 176 int
Chris@41 177 main (int argc, char ** argv)
Chris@41 178 { double freq ;
Chris@41 179
Chris@41 180 memset (input, 0, sizeof (input)) ;
Chris@41 181 freq = 0.01 ;
Chris@41 182 gen_windowed_sines (1, &freq, 1.0, input, BUFFER_LEN) ;
Chris@41 183
Chris@41 184 if (argc == 1)
Chris@41 185 single_run () ;
Chris@41 186 else if (argc == 3 && strcmp (argv [1], "--best-of") == 0)
Chris@41 187 { int run_count = atoi (argv [2]) ;
Chris@41 188
Chris@41 189 if (run_count < 1 || run_count > 20)
Chris@41 190 { printf ("Please be sensible. Run count should be in range (1, 10].\n") ;
Chris@41 191 exit (1) ;
Chris@41 192 } ;
Chris@41 193
Chris@41 194 multi_run (run_count) ;
Chris@41 195 }
Chris@41 196 else
Chris@41 197 usage_exit (argv [0]) ;
Chris@41 198
Chris@41 199 puts (
Chris@41 200 " Duration is in seconds.\n"
Chris@41 201 " Throughput is in frames/sec (more is better).\n"
Chris@41 202 ) ;
Chris@41 203
Chris@41 204 return 0 ;
Chris@41 205 } /* main */
Chris@41 206