annotate src/libsamplerate-0.1.9/tests/multichan_throughput_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) 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