summaryrefslogtreecommitdiff
path: root/lib/libsamplerate/libsamplerate-0.2.2/tests/src-evaluate.c
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-08-04 20:07:44 +1000
committerjacqueline <me@jacqueline.id.au>2023-08-04 20:07:44 +1000
commit60f767713227b5405b855e6e6e2a0475ecd96bcc (patch)
treefe55b7048e9e7f1f587f465a1845aef9d3b7b731 /lib/libsamplerate/libsamplerate-0.2.2/tests/src-evaluate.c
parent3b240d1cd5c52caf189ca036a1a841f7e6d84ccd (diff)
downloadtangara-fw-60f767713227b5405b855e6e6e2a0475ecd96bcc.tar.gz
Do our own resampling
Diffstat (limited to 'lib/libsamplerate/libsamplerate-0.2.2/tests/src-evaluate.c')
-rwxr-xr-xlib/libsamplerate/libsamplerate-0.2.2/tests/src-evaluate.c530
1 files changed, 0 insertions, 530 deletions
diff --git a/lib/libsamplerate/libsamplerate-0.2.2/tests/src-evaluate.c b/lib/libsamplerate/libsamplerate-0.2.2/tests/src-evaluate.c
deleted file mode 100755
index d55d6483..00000000
--- a/lib/libsamplerate/libsamplerate-0.2.2/tests/src-evaluate.c
+++ /dev/null
@@ -1,530 +0,0 @@
-/*
-** Copyright (c) 2002-2016, Erik de Castro Lopo <erikd@mega-nerd.com>
-** All rights reserved.
-**
-** This code is released under 2-clause BSD license. Please see the
-** file at : https://github.com/libsndfile/libsamplerate/blob/master/COPYING
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <string.h>
-#include <ctype.h>
-
-#if defined(_WIN32)
-#define popen _popen
-#define pclose _pclose
-#endif
-
-#if (HAVE_FFTW3 && HAVE_SNDFILE && HAVE_SYS_TIMES_H)
-
-#include <time.h>
-#include <sys/times.h>
-
-#include <sndfile.h>
-#include <math.h>
-#include <sys/utsname.h>
-
-#include "util.h"
-
-#define MAX_FREQS 4
-#define BUFFER_LEN 80000
-
-#define SAFE_STRNCAT(dest,src,len) \
- { int safe_strncat_count ; \
- safe_strncat_count = (len) - strlen (dest) - 1 ; \
- strncat ((dest), (src), safe_strncat_count) ; \
- (dest) [(len) - 1] = 0 ; \
- } ;
-
-typedef struct
-{ int freq_count ;
- double freqs [MAX_FREQS] ;
-
- int output_samplerate ;
- int pass_band_peaks ;
-
- double peak_value ;
-} SNR_TEST ;
-
-typedef struct
-{ const char *progname ;
- const char *version_cmd ;
- const char *version_start ;
- const char *convert_cmd ;
- int format ;
-} RESAMPLE_PROG ;
-
-static char *get_progname (char *) ;
-static void usage_exit (const char *, const RESAMPLE_PROG *prog, int count) ;
-static void measure_program (const RESAMPLE_PROG *prog, int verbose) ;
-static void generate_source_wav (const char *filename, const double *freqs, int freq_count, int format) ;
-static const char* get_machine_details (void) ;
-
-static char version_string [512] ;
-
-int
-main (int argc, char *argv [])
-{ static RESAMPLE_PROG resample_progs [] =
- { { "sndfile-resample",
- "examples/sndfile-resample --version",
- "libsamplerate",
- "examples/sndfile-resample --max-speed -c 0 -to %d source.wav destination.wav",
- SF_FORMAT_WAV | SF_FORMAT_PCM_32
- },
- { "sox",
- "sox -h 2>&1",
- "sox",
- "sox source.wav -r %d destination.wav resample 0.835",
- SF_FORMAT_WAV | SF_FORMAT_PCM_32
- },
- { "ResampAudio",
- "ResampAudio --version",
- "ResampAudio",
- "ResampAudio -f cutoff=0.41,atten=100,ratio=128 -s %d source.wav destination.wav",
- SF_FORMAT_WAV | SF_FORMAT_PCM_32
- },
-
- /*-
- { /+*
- ** The Shibatch converter doesn't work for all combinations of
- ** source and destination sample rates. Therefore it can't be
- ** included in this test.
- *+/
- "shibatch",
- "ssrc",
- "Shibatch",
- "ssrc --rate %d source.wav destination.wav",
- SF_FORMAT_WAV | SF_FORMAT_PCM_32
- },-*/
-
- /*-
- { /+*
- ** The resample program is not able to match the bandwidth and SNR
- ** specs or sndfile-resample and hence will not be tested.
- *+/
- "resample",
- "resample -version",
- "resample",
- "resample -to %d source.wav destination.wav",
- SF_FORMAT_WAV | SF_FORMAT_FLOAT
- },-*/
-
- /*-
- { "mplayer",
- "mplayer -v 2>&1",
- "MPlayer ",
- "mplayer -ao pcm -srate %d source.wav >/dev/null 2>&1 && mv audiodump.wav destination.wav",
- SF_FORMAT_WAV | SF_FORMAT_PCM_32
- },-*/
-
- } ; /* resample_progs */
-
- char *progname ;
- int prog = 0, verbose = 0 ;
-
- progname = get_progname (argv [0]) ;
-
- printf ("\n %s : evaluate a sample rate converter.\n", progname) ;
-
- if (argc == 3 && strcmp ("--verbose", argv [1]) == 0)
- { verbose = 1 ;
- prog = atoi (argv [2]) ;
- }
- else if (argc == 2)
- { verbose = 0 ;
- prog = atoi (argv [1]) ;
- }
- else
- usage_exit (progname, resample_progs, ARRAY_LEN (resample_progs)) ;
-
- if (prog < 0 || prog >= ARRAY_LEN (resample_progs))
- usage_exit (progname, resample_progs, ARRAY_LEN (resample_progs)) ;
-
- measure_program (& (resample_progs [prog]), verbose) ;
-
- puts ("") ;
-
- return 0 ;
-} /* main */
-
-/*==============================================================================
-*/
-
-static char *
-get_progname (char *progname)
-{ char *cptr ;
-
- if ((cptr = strrchr (progname, '/')) != NULL)
- progname = cptr + 1 ;
-
- if ((cptr = strrchr (progname, '\\')) != NULL)
- progname = cptr + 1 ;
-
- return progname ;
-} /* get_progname */
-
-static void
-usage_exit (const char *progname, const RESAMPLE_PROG *prog, int count)
-{ int k ;
-
- printf ("\n Usage : %s <number>\n\n", progname) ;
-
- puts (" where <number> specifies the program to test:\n") ;
-
- for (k = 0 ; k < count ; k++)
- printf (" %d : %s\n", k, prog [k].progname) ;
-
- puts ("\n"
- " Obviously to test a given program you have to have it available on\n"
- " your system. See http://libsndfile.github.io/libsamplerate/quality.html for\n"
- " the download location of these programs.\n") ;
-
- exit (1) ;
-} /* usage_exit */
-
-static const char*
-get_machine_details (void)
-{ static char namestr [262] ;
-
- struct utsname name ;
-
- if (uname (&name) != 0)
- { snprintf (namestr, sizeof (namestr), "Unknown") ;
- return namestr ;
- } ;
-
- snprintf (namestr, sizeof (namestr), "%s (%s %s %s)", name.nodename,
- name.machine, name.sysname, name.release) ;
-
- return namestr ;
-} /* get_machine_details */
-
-
-/*==============================================================================
-*/
-
-static void
-get_version_string (const RESAMPLE_PROG *prog)
-{ FILE *file ;
- char *cptr ;
-
- /* Default. */
- snprintf (version_string, sizeof (version_string), "no version") ;
-
- if (prog->version_cmd == NULL)
- return ;
-
- if ((file = popen (prog->version_cmd, "r")) == NULL)
- return ;
-
- while ((cptr = fgets (version_string, sizeof (version_string), file)) != NULL)
- {
- if (strstr (cptr, prog->version_start) != NULL)
- break ;
-
- version_string [0] = 0 ;
- } ;
-
- pclose (file) ;
-
- /* Remove trailing newline. */
- if ((cptr = strchr (version_string, '\n')) != NULL)
- cptr [0] = 0 ;
-
- /* Remove leading whitespace from version string. */
- cptr = version_string ;
- while (cptr [0] != 0 && isspace (cptr [0]))
- cptr ++ ;
-
- if (cptr != version_string)
- { strncpy (version_string, cptr, sizeof (version_string) - 1) ;
- version_string [sizeof (version_string) - 1] = 0 ;
- } ;
-
- return ;
-} /* get_version_string */
-
-static void
-generate_source_wav (const char *filename, const double *freqs, int freq_count, int format)
-{ static float buffer [BUFFER_LEN] ;
-
- SNDFILE *sndfile ;
- SF_INFO sfinfo ;
-
- sfinfo.channels = 1 ;
- sfinfo.samplerate = 44100 ;
- sfinfo.format = format ;
-
- if ((sndfile = sf_open (filename, SFM_WRITE, &sfinfo)) == NULL)
- { printf ("Line %d : cound not open '%s' : %s\n", __LINE__, filename, sf_strerror (NULL)) ;
- exit (1) ;
- } ;
-
- sf_command (sndfile, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ;
-
- gen_windowed_sines (freq_count, freqs, 0.9, buffer, ARRAY_LEN (buffer)) ;
-
- if (sf_write_float (sndfile, buffer, ARRAY_LEN (buffer)) != ARRAY_LEN (buffer))
- { printf ("Line %d : sf_write_float short write.\n", __LINE__) ;
- exit (1) ;
- } ;
-
- sf_close (sndfile) ;
-} /* generate_source_wav */
-
-static double
-measure_destination_wav (char *filename, int *output_samples, int expected_peaks)
-{ static float buffer [250000] ;
-
- SNDFILE *sndfile ;
- SF_INFO sfinfo ;
- double snr ;
-
- if ((sndfile = sf_open (filename, SFM_READ, &sfinfo)) == NULL)
- { printf ("Line %d : Cound not open '%s' : %s\n", __LINE__, filename, sf_strerror (NULL)) ;
- exit (1) ;
- } ;
-
- if (sfinfo.channels != 1)
- { printf ("Line %d : Bad channel count (%d). Should be 1.\n", __LINE__, sfinfo.channels) ;
- exit (1) ;
- } ;
-
- if (sfinfo.frames > ARRAY_LEN (buffer))
- { printf ("Line %d : Too many frames (%ld) of data in file.\n", __LINE__, (long) sfinfo.frames) ;
- exit (1) ;
- } ;
-
- *output_samples = (int) sfinfo.frames ;
-
- if (sf_read_float (sndfile, buffer, sfinfo.frames) != sfinfo.frames)
- { printf ("Line %d : Bad read.\n", __LINE__) ;
- exit (1) ;
- } ;
-
- sf_close (sndfile) ;
-
- snr = calculate_snr (buffer, sfinfo.frames, expected_peaks) ;
-
- return snr ;
-} /* measure_desination_wav */
-
-static double
-measure_snr (const RESAMPLE_PROG *prog, int *output_samples, int verbose)
-{ static SNR_TEST snr_test [] =
- {
- { 1, { 0.211111111111 }, 48000, 1, 1.0 },
- { 1, { 0.011111111111 }, 132301, 1, 1.0 },
- { 1, { 0.111111111111 }, 92301, 1, 1.0 },
- { 1, { 0.011111111111 }, 26461, 1, 1.0 },
- { 1, { 0.011111111111 }, 13231, 1, 1.0 },
- { 1, { 0.011111111111 }, 44101, 1, 1.0 },
- { 2, { 0.311111, 0.49 }, 78199, 2, 1.0 },
- { 2, { 0.011111, 0.49 }, 12345, 1, 0.5 },
- { 2, { 0.0123456, 0.4 }, 20143, 1, 0.5 },
- { 2, { 0.0111111, 0.4 }, 26461, 1, 0.5 },
- { 1, { 0.381111111111 }, 58661, 1, 1.0 }
- } ; /* snr_test */
- static char command [256] ;
-
- double snr, worst_snr = 500.0 ;
- int k , retval, sample_count ;
-
- *output_samples = 0 ;
-
- for (k = 0 ; k < ARRAY_LEN (snr_test) ; k++)
- { remove ("source.wav") ;
- remove ("destination.wav") ;
-
- if (verbose)
- printf (" SNR test #%d : ", k) ;
- fflush (stdout) ;
- generate_source_wav ("source.wav", snr_test [k].freqs, snr_test [k].freq_count, prog->format) ;
-
- snprintf (command, sizeof (command), prog->convert_cmd, snr_test [k].output_samplerate) ;
- SAFE_STRNCAT (command, " >/dev/null 2>&1", sizeof (command)) ;
- if ((retval = system (command)) != 0)
- printf ("system returned %d\n", retval) ;
-
- snr = measure_destination_wav ("destination.wav", &sample_count, snr_test->pass_band_peaks) ;
-
- *output_samples += sample_count ;
-
- if (fabs (snr) < fabs (worst_snr))
- worst_snr = fabs (snr) ;
-
- if (verbose)
- printf ("%6.2f dB\n", snr) ;
- } ;
-
- return worst_snr ;
-} /* measure_snr */
-
-/*------------------------------------------------------------------------------
-*/
-
-static double
-measure_destination_peak (const char *filename)
-{ static float data [2 * BUFFER_LEN] ;
- SNDFILE *sndfile ;
- SF_INFO sfinfo ;
- double peak = 0.0 ;
- int k = 0 ;
-
- if ((sndfile = sf_open (filename, SFM_READ, &sfinfo)) == NULL)
- { printf ("Line %d : failed to open file %s\n", __LINE__, filename) ;
- exit (1) ;
- } ;
-
- if (sfinfo.channels != 1)
- { printf ("Line %d : bad channel count.\n", __LINE__) ;
- exit (1) ;
- } ;
-
- if (sfinfo.frames > ARRAY_LEN (data) + 4 || sfinfo.frames < ARRAY_LEN (data) - 100)
- { printf ("Line %d : bad frame count (got %d, expected %d).\n", __LINE__, (int) sfinfo.frames, ARRAY_LEN (data)) ;
- exit (1) ;
- } ;
-
- if (sf_read_float (sndfile, data, sfinfo.frames) != sfinfo.frames)
- { printf ("Line %d : bad read.\n", __LINE__) ;
- exit (1) ;
- } ;
-
- sf_close (sndfile) ;
-
- for (k = 0 ; k < (int) sfinfo.frames ; k++)
- if (fabs (data [k]) > peak)
- peak = fabs (data [k]) ;
-
- return peak ;
-} /* measure_destination_peak */
-
-static double
-find_attenuation (double freq, const RESAMPLE_PROG *prog, int verbose)
-{ static char command [256] ;
- double output_peak ;
- int retval ;
- char *filename ;
-
- filename = "destination.wav" ;
-
- generate_source_wav ("source.wav", &freq, 1, prog->format) ;
-
- remove (filename) ;
-
- snprintf (command, sizeof (command), prog->convert_cmd, 88189) ;
- SAFE_STRNCAT (command, " >/dev/null 2>&1", sizeof (command)) ;
- if ((retval = system (command)) != 0)
- printf ("system returned %d\n", retval) ;
-
- output_peak = measure_destination_peak (filename) ;
-
- if (verbose)
- printf (" freq : %f peak : %f\n", freq, output_peak) ;
-
- return fabs (20.0 * log10 (output_peak)) ;
-} /* find_attenuation */
-
-static double
-bandwidth_test (const RESAMPLE_PROG *prog, int verbose)
-{ double f1, f2, a1, a2 ;
- double freq, atten ;
-
- f1 = 0.35 ;
- a1 = find_attenuation (f1, prog, verbose) ;
-
- f2 = 0.49999 ;
- a2 = find_attenuation (f2, prog, verbose) ;
-
-
- if (fabs (a1) < 1e-2 && a2 < 3.0)
- return -1.0 ;
-
- if (a1 > 3.0 || a2 < 3.0)
- { printf ("\n\nLine %d : cannot bracket 3dB point.\n\n", __LINE__) ;
- exit (1) ;
- } ;
-
- while (a2 - a1 > 1.0)
- { freq = f1 + 0.5 * (f2 - f1) ;
- atten = find_attenuation (freq, prog, verbose) ;
-
- if (atten < 3.0)
- { f1 = freq ;
- a1 = atten ;
- }
- else
- { f2 = freq ;
- a2 = atten ;
- } ;
- } ;
-
- freq = f1 + (3.0 - a1) * (f2 - f1) / (a2 - a1) ;
-
- return 200.0 * freq ;
-} /* bandwidth_test */
-
-static void
-measure_program (const RESAMPLE_PROG *prog, int verbose)
-{ double snr, bandwidth, conversion_rate ;
- int output_samples ;
- struct tms time_data ;
- time_t time_now ;
-
- printf ("\n Machine : %s\n", get_machine_details ()) ;
- time_now = time (NULL) ;
- printf (" Date : %s", ctime (&time_now)) ;
-
- get_version_string (prog) ;
- printf (" Program : %s\n", version_string) ;
- printf (" Command : %s\n\n", prog->convert_cmd) ;
-
- snr = measure_snr (prog, &output_samples, verbose) ;
-
- printf (" Worst case SNR : %6.2f dB\n", snr) ;
-
- times (&time_data) ;
-
- conversion_rate = (1.0 * output_samples * sysconf (_SC_CLK_TCK)) / time_data.tms_cutime ;
-
- printf (" Conversion rate : %5.0f samples/sec\n", conversion_rate) ;
-
- bandwidth = bandwidth_test (prog, verbose) ;
-
- if (bandwidth > 0.0)
- printf (" Measured bandwidth : %5.2f %%\n", bandwidth) ;
- else
- printf (" Could not measure bandwidth (no -3dB point found).\n") ;
-
- return ;
-} /* measure_program */
-
-/*##############################################################################
-*/
-
-#else
-
-int
-main (void)
-{ puts ("\n"
- "****************************************************************\n"
- " This program has been compiled without :\n"
- " 1) FFTW (http://www.fftw.org/).\n"
- " 2) libsndfile (http://www.zip.com.au/~erikd/libsndfile/).\n"
- " Without these two libraries there is not much it can do.\n"
- "****************************************************************\n") ;
-
- return 0 ;
-} /* main */
-
-#endif /* (HAVE_FFTW3 && HAVE_SNDFILE) */
-