annotate src/libsamplerate-0.1.9/tests/util.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 #include <string.h>
Chris@41 12 #include <ctype.h>
Chris@41 13 #include <math.h>
Chris@41 14
Chris@41 15 #include "util.h"
Chris@41 16
Chris@41 17 #ifndef M_PI
Chris@41 18 #define M_PI 3.14159265358979323846264338
Chris@41 19 #endif
Chris@41 20
Chris@41 21 void
Chris@41 22 gen_windowed_sines (int freq_count, const double *freqs, double max, float *output, int output_len)
Chris@41 23 { int k, freq ;
Chris@41 24 double amplitude, phase ;
Chris@41 25
Chris@41 26 amplitude = max / freq_count ;
Chris@41 27
Chris@41 28 for (k = 0 ; k < output_len ; k++)
Chris@41 29 output [k] = 0.0 ;
Chris@41 30
Chris@41 31 for (freq = 0 ; freq < freq_count ; freq++)
Chris@41 32 { phase = 0.9 * M_PI / freq_count ;
Chris@41 33
Chris@41 34 if (freqs [freq] <= 0.0 || freqs [freq] >= 0.5)
Chris@41 35 { printf ("\n%s : Error : freq [%d] == %g is out of range. Should be < 0.5.\n", __FILE__, freq, freqs [freq]) ;
Chris@41 36 exit (1) ;
Chris@41 37 } ;
Chris@41 38
Chris@41 39 for (k = 0 ; k < output_len ; k++)
Chris@41 40 output [k] += amplitude * sin (freqs [freq] * (2 * k) * M_PI + phase) ;
Chris@41 41 } ;
Chris@41 42
Chris@41 43 /* Apply Hanning Window. */
Chris@41 44 for (k = 0 ; k < output_len ; k++)
Chris@41 45 output [k] *= 0.5 - 0.5 * cos ((2 * k) * M_PI / (output_len - 1)) ;
Chris@41 46
Chris@41 47 /* data [k] *= 0.3635819 - 0.4891775 * cos ((2 * k) * M_PI / (output_len - 1))
Chris@41 48 + 0.1365995 * cos ((4 * k) * M_PI / (output_len - 1))
Chris@41 49 - 0.0106411 * cos ((6 * k) * M_PI / (output_len - 1)) ;
Chris@41 50 */
Chris@41 51
Chris@41 52 return ;
Chris@41 53 } /* gen_windowed_sines */
Chris@41 54
Chris@41 55 void
Chris@41 56 save_oct_float (char *filename, float *input, int in_len, float *output, int out_len)
Chris@41 57 { FILE *file ;
Chris@41 58 int k ;
Chris@41 59
Chris@41 60 printf ("Dumping input and output data to file : %s.\n\n", filename) ;
Chris@41 61
Chris@41 62 if (! (file = fopen (filename, "w")))
Chris@41 63 return ;
Chris@41 64
Chris@41 65 fprintf (file, "# Not created by Octave\n") ;
Chris@41 66
Chris@41 67 fprintf (file, "# name: input\n") ;
Chris@41 68 fprintf (file, "# type: matrix\n") ;
Chris@41 69 fprintf (file, "# rows: %d\n", in_len) ;
Chris@41 70 fprintf (file, "# columns: 1\n") ;
Chris@41 71
Chris@41 72 for (k = 0 ; k < in_len ; k++)
Chris@41 73 fprintf (file, "% g\n", input [k]) ;
Chris@41 74
Chris@41 75 fprintf (file, "# name: output\n") ;
Chris@41 76 fprintf (file, "# type: matrix\n") ;
Chris@41 77 fprintf (file, "# rows: %d\n", out_len) ;
Chris@41 78 fprintf (file, "# columns: 1\n") ;
Chris@41 79
Chris@41 80 for (k = 0 ; k < out_len ; k++)
Chris@41 81 fprintf (file, "% g\n", output [k]) ;
Chris@41 82
Chris@41 83 fclose (file) ;
Chris@41 84 return ;
Chris@41 85 } /* save_oct_float */
Chris@41 86
Chris@41 87 void
Chris@41 88 save_oct_double (char *filename, double *input, int in_len, double *output, int out_len)
Chris@41 89 { FILE *file ;
Chris@41 90 int k ;
Chris@41 91
Chris@41 92 printf ("Dumping input and output data to file : %s.\n\n", filename) ;
Chris@41 93
Chris@41 94 if (! (file = fopen (filename, "w")))
Chris@41 95 return ;
Chris@41 96
Chris@41 97 fprintf (file, "# Not created by Octave\n") ;
Chris@41 98
Chris@41 99 fprintf (file, "# name: input\n") ;
Chris@41 100 fprintf (file, "# type: matrix\n") ;
Chris@41 101 fprintf (file, "# rows: %d\n", in_len) ;
Chris@41 102 fprintf (file, "# columns: 1\n") ;
Chris@41 103
Chris@41 104 for (k = 0 ; k < in_len ; k++)
Chris@41 105 fprintf (file, "% g\n", input [k]) ;
Chris@41 106
Chris@41 107 fprintf (file, "# name: output\n") ;
Chris@41 108 fprintf (file, "# type: matrix\n") ;
Chris@41 109 fprintf (file, "# rows: %d\n", out_len) ;
Chris@41 110 fprintf (file, "# columns: 1\n") ;
Chris@41 111
Chris@41 112 for (k = 0 ; k < out_len ; k++)
Chris@41 113 fprintf (file, "% g\n", output [k]) ;
Chris@41 114
Chris@41 115 fclose (file) ;
Chris@41 116 return ;
Chris@41 117 } /* save_oct_double */
Chris@41 118
Chris@41 119 void
Chris@41 120 interleave_data (const float *in, float *out, int frames, int channels)
Chris@41 121 { int fr, ch ;
Chris@41 122
Chris@41 123 for (fr = 0 ; fr < frames ; fr++)
Chris@41 124 for (ch = 0 ; ch < channels ; ch++)
Chris@41 125 out [ch + channels * fr] = in [fr + frames * ch] ;
Chris@41 126
Chris@41 127 return ;
Chris@41 128 } /* interleave_data */
Chris@41 129
Chris@41 130 void
Chris@41 131 deinterleave_data (const float *in, float *out, int frames, int channels)
Chris@41 132 { int fr, ch ;
Chris@41 133
Chris@41 134 for (ch = 0 ; ch < channels ; ch++)
Chris@41 135 for (fr = 0 ; fr < frames ; fr++)
Chris@41 136 out [fr + frames * ch] = in [ch + channels * fr] ;
Chris@41 137
Chris@41 138 return ;
Chris@41 139 } /* deinterleave_data */
Chris@41 140
Chris@41 141 void
Chris@41 142 reverse_data (float *data, int datalen)
Chris@41 143 { int left, right ;
Chris@41 144 float temp ;
Chris@41 145
Chris@41 146 left = 0 ;
Chris@41 147 right = datalen - 1 ;
Chris@41 148
Chris@41 149 while (left < right)
Chris@41 150 { temp = data [left] ;
Chris@41 151 data [left] = data [right] ;
Chris@41 152 data [right] = temp ;
Chris@41 153 left ++ ;
Chris@41 154 right -- ;
Chris@41 155 } ;
Chris@41 156
Chris@41 157 } /* reverse_data */
Chris@41 158
Chris@41 159 const char *
Chris@41 160 get_cpu_name (void)
Chris@41 161 {
Chris@41 162 const char *name = "Unknown", *search = NULL ;
Chris@41 163 static char buffer [512] ;
Chris@41 164 FILE * file = NULL ;
Chris@41 165 int is_pipe = 0 ;
Chris@41 166
Chris@41 167 #if defined (__linux__)
Chris@41 168 file = fopen ("/proc/cpuinfo", "r") ;
Chris@41 169 search = "model name" ;
Chris@41 170 #elif defined (__APPLE__)
Chris@41 171 file = popen ("/usr/sbin/system_profiler -detailLevel full SPHardwareDataType", "r") ;
Chris@41 172 search = "Processor Name" ;
Chris@41 173 is_pipe = 1 ;
Chris@41 174 #elif defined (__FreeBSD__)
Chris@41 175 file = popen ("sysctl -a", "r") ;
Chris@41 176 search = "hw.model" ;
Chris@41 177 is_pipe = 1 ;
Chris@41 178 #else
Chris@41 179 file = NULL ;
Chris@41 180 #endif
Chris@41 181
Chris@41 182 if (file == NULL)
Chris@41 183 return name ;
Chris@41 184
Chris@41 185 if (search == NULL)
Chris@41 186 { printf ("Error : search is NULL in function %s.\n", __func__) ;
Chris@41 187 return name ;
Chris@41 188 } ;
Chris@41 189
Chris@41 190 while (fgets (buffer, sizeof (buffer), file) != NULL)
Chris@41 191 if (strstr (buffer, search))
Chris@41 192 { char *src, *dest ;
Chris@41 193
Chris@41 194 if ((src = strchr (buffer, ':')) != NULL)
Chris@41 195 { src ++ ;
Chris@41 196 while (isspace (src [0]))
Chris@41 197 src ++ ;
Chris@41 198 name = src ;
Chris@41 199
Chris@41 200 /* Remove consecutive spaces. */
Chris@41 201 src ++ ;
Chris@41 202 for (dest = src ; src [0] ; src ++)
Chris@41 203 { if (isspace (src [0]) && isspace (dest [-1]))
Chris@41 204 continue ;
Chris@41 205 dest [0] = src [0] ;
Chris@41 206 dest ++ ;
Chris@41 207 } ;
Chris@41 208 dest [0] = 0 ;
Chris@41 209 break ;
Chris@41 210 } ;
Chris@41 211 } ;
Chris@41 212
Chris@41 213 if (is_pipe)
Chris@41 214 pclose (file) ;
Chris@41 215 else
Chris@41 216 fclose (file) ;
Chris@41 217
Chris@41 218 return name ;
Chris@41 219 } /* get_cpu_name */
Chris@41 220