static int pcm_resample_get_converter(void) { const char *conf = config_get_string(CONF_SAMPLERATE_CONVERTER, NULL); long convalgo; char *test; const char *test2; size_t len; if (!conf) { convalgo = SRC_SINC_FASTEST; goto out; } convalgo = strtol(conf, &test, 10); if (*test == '\0' && src_get_name(convalgo)) goto out; len = strlen(conf); for (convalgo = 0 ; ; convalgo++) { test2 = src_get_name(convalgo); if (!test2) { convalgo = SRC_SINC_FASTEST; break; } if (g_ascii_strncasecmp(test2, conf, len) == 0) goto out; } g_warning("unknown samplerate converter \"%s\"", conf); out: g_debug("selecting samplerate converter \"%s\"", src_get_name(convalgo)); return convalgo; }
static bool lsr_parse_converter(const char *s) { assert(s != NULL); if (*s == 0) return true; char *endptr; long l = strtol(s, &endptr, 10); if (*endptr == 0 && src_get_name(l) != NULL) { lsr_converter = l; return true; } size_t length = strlen(s); for (int i = 0;; ++i) { const char *name = src_get_name(i); if (name == NULL) break; if (g_ascii_strncasecmp(s, name, length) == 0) { lsr_converter = i; return true; } } return false; }
static void zero_input_test (int converter) { SRC_DATA data ; SRC_STATE *state ; float out [100] ; int error ; printf (" %s (%-26s) ........ ", __func__, src_get_name (converter)) ; fflush (stdout) ; if ((state = src_new (converter, 1, &error)) == NULL) { printf ("\n\nLine %d : src_new failed : %s.\n\n", __LINE__, src_strerror (error)) ; exit (1) ; } ; data.data_in = (float *) 0xdeadbeef ; data.input_frames = 0 ; data.data_out = out ; data.output_frames = ARRAY_LEN (out) ; data.end_of_input = 0 ; data.src_ratio = 1.0 ; if ((error = src_process (state, &data))) { printf ("\n\nLine %d : src_new failed : %s.\n\n", __LINE__, src_strerror (error)) ; exit (1) ; } ; state = src_delete (state) ; puts ("ok") ; } /* zero_input_test */
int VarRateResample::GetNumMethods() { int i = 0; while(src_get_name(i)) i++; return i; }
static void multi_run (int run_count) { int k, ch ; printf ("\n CPU name : %s\n", get_cpu_name ()) ; puts ( "\n" " Converter Channels Duration Throughput Best Throughput\n" " ----------------------------------------------------------------------------------------" ) ; for (ch = 1 ; ch <= 5 ; ch++) { long sinc_fastest = 0, sinc_medium = 0, sinc_best = 0 ; for (k = 0 ; k < run_count ; k++) { sinc_fastest = throughput_test (SRC_SINC_FASTEST, ch, sinc_fastest) ; sinc_medium = throughput_test (SRC_SINC_MEDIUM_QUALITY, ch, sinc_medium) ; sinc_best = throughput_test (SRC_SINC_BEST_QUALITY, ch, sinc_best) ; puts ("") ; /* Let the CPU cool down. We might be running on a laptop. */ sleep (10) ; } ; puts ( "\n" " Converter Best Throughput\n" " ------------------------------------------------" ) ; printf (" %-30s %10ld\n", src_get_name (SRC_SINC_FASTEST), sinc_fastest) ; printf (" %-30s %10ld\n", src_get_name (SRC_SINC_MEDIUM_QUALITY), sinc_medium) ; printf (" %-30s %10ld\n", src_get_name (SRC_SINC_BEST_QUALITY), sinc_best) ; } ; puts ("") ; } /* multi_run */
bool pcm_resample_lsr_global_init(const char *converter, GError **error_r) { if (!lsr_parse_converter(converter)) { g_set_error(error_r, libsamplerate_quark(), 0, "unknown samplerate converter '%s'", converter); return false; } g_debug("libsamplerate converter '%s'", src_get_name(lsr_converter)); return true; }
static GtkWidget * make_method_list (void) { int count; const char * name; GtkWidget * list = gtk_combo_box_text_new (); for (count = 0; (name = src_get_name (count)) != NULL; count ++) gtk_combo_box_text_append_text ((GtkComboBoxText *) list, name); gtk_combo_box_set_active ((GtkComboBox *) list, method); g_signal_connect (list, "changed", (GCallback) list_changed, & method); return list; }
static void name_test (int converter) { int k ; puts (" name_test :") ; for (k = 0 ; k <= converter ; k++) { printf ("\tName %d : %s\n", k, src_get_name (k)) ; printf ("\tDesc %d : %s\n", k, src_get_description (k)) ; } ; puts ("") ; return ; } /* name_test */
static void usage_exit (const char *progname) { char lsf_ver [128] ; const char *cptr ; int k ; if ((cptr = strrchr (progname, '/')) != NULL) progname = cptr + 1 ; if ((cptr = strrchr (progname, '\\')) != NULL) progname = cptr + 1 ; sf_command (NULL, SFC_GET_LIB_VERSION, lsf_ver, sizeof (lsf_ver)) ; printf ("\n" " A Sample Rate Converter using libsndfile for file I/O and Secret \n" " Rabbit Code (aka libsamplerate) for performing the conversion.\n" " It works on any file format supported by libsndfile with any \n" " number of channels (limited only by host memory).\n" "\n" " %s\n" " %s\n" "\n" " Usage : \n" " %s -to <new sample rate> [-c <number>] <input file> <output file>\n" " %s -by <amount> [-c <number>] <input file> <output file>\n" "\n", src_get_version (), lsf_ver, progname, progname) ; puts ( " The optional -c argument allows the converter type to be chosen from\n" " the following list :" "\n" ) ; for (k = 0 ; (cptr = src_get_name (k)) != NULL ; k++) printf (" %d : %s%s\n", k, cptr, k == DEFAULT_CONVERTER ? " (default)" : "") ; puts ("\n" " The --no-normalize option disables clipping check and normalization.") ; puts ("") ; exit (1) ; } /* usage_exit */
static void name_test (void) { const char *name ; int k = 0 ; puts (" name_test :") ; while (1) { name = src_get_name (k) ; if (name == NULL) break ; printf ("\tName %d : %s\n", k, name) ; printf ("\tDesc %d : %s\n", k, src_get_description (k)) ; k ++ ; } ; puts ("") ; return ; } /* name_test */
static void downsample_test (int converter) { static float in [1000], out [10] ; SRC_DATA data ; printf (" downsample_test (%-28s) ....... ", src_get_name (converter)) ; fflush (stdout) ; data.src_ratio = 1.0 / 255.0 ; data.input_frames = ARRAY_LEN (in) ; data.output_frames = ARRAY_LEN (out) ; data.data_in = in ; data.data_out = out ; if (src_simple (&data, converter, 1)) { puts ("src_simple failed.") ; exit (1) ; } ; puts ("ok") ; } /* downsample_test */
static void callback_hang_test (int converter) { static float output [LONG_BUFFER_LEN] ; static SRC_PAIR pairs [] = { { 1.2, 5 }, { 1.1, 1 }, { 1.0, 1 }, { 3.0, 1 }, { 2.0, 1 }, { 0.3, 1 }, { 1.2, 0 }, { 1.1, 10 }, { 1.0, 1 } } ; SRC_STATE *src_state ; double src_ratio = 1.0 ; int k, error ; printf ("\tcallback_hang_test (%-28s) ....... ", src_get_name (converter)) ; fflush (stdout) ; /* Perform sample rate conversion. */ src_state = src_callback_new (input_callback, converter, 1, &error, NULL) ; if (src_state == NULL) { printf ("\n\nLine %d : src_callback_new () failed : %s\n\n", __LINE__, src_strerror (error)) ; exit (1) ; } ; for (k = 0 ; k < ARRAY_LEN (pairs) ; k++) { alarm (1) ; src_ratio = pairs [k].ratio ; src_callback_read (src_state, src_ratio, pairs [k].count, output) ; } ; src_state = src_delete (src_state) ; alarm (0) ; puts ("ok") ; return ; } /* callback_hang_test */
wxString Resample::GetMethodName(int index) { return wxString(src_get_name(index)); }
int main (int argc, char *argv []) { SNDFILE *infile, *outfile = NULL ; SF_INFO sfinfo ; int normalize = 1 ; sf_count_t count ; double src_ratio = -1.0, gain = 1.0 ; int new_sample_rate = -1, k, converter, max_speed = SF_FALSE ; if (argc == 2 && strcmp (argv [1], "--version") == 0) { char buffer [64], *cptr ; if ((cptr = strrchr (argv [0], '/')) != NULL) argv [0] = cptr + 1 ; if ((cptr = strrchr (argv [0], '\\')) != NULL) argv [0] = cptr + 1 ; sf_command (NULL, SFC_GET_LIB_VERSION, buffer, sizeof (buffer)) ; printf ("%s (%s,%s)\n", argv [0], src_get_version (), buffer) ; exit (0) ; } ; if (argc != 5 && argc != 7 && argc != 8) usage_exit (argv [0]) ; /* Set default converter. */ converter = DEFAULT_CONVERTER ; for (k = 1 ; k < argc - 2 ; k++) { if (strcmp (argv [k], "--max-speed") == 0) max_speed = SF_TRUE ; else if (strcmp (argv [k], "--no-normalize") == 0) normalize = 0 ; else if (strcmp (argv [k], "-to") == 0) { k ++ ; new_sample_rate = atoi (argv [k]) ; } else if (strcmp (argv [k], "-by") == 0) { k ++ ; src_ratio = atof (argv [k]) ; } else if (strcmp (argv [k], "-c") == 0) { k ++ ; converter = atoi (argv [k]) ; } else usage_exit (argv [0]) ; } ; if (new_sample_rate <= 0 && src_ratio <= 0.0) usage_exit (argv [0]) ; if (src_get_name (converter) == NULL) { printf ("Error : bad converter number.\n") ; usage_exit (argv [0]) ; } ; if (strcmp (argv [argc - 2], argv [argc - 1]) == 0) { printf ("Error : input and output file names are the same.\n") ; exit (1) ; } ; if ((infile = sf_open (argv [argc - 2], SFM_READ, &sfinfo)) == NULL) { printf ("Error : Not able to open input file '%s'\n", argv [argc - 2]) ; exit (1) ; } ; printf ("Input File : %s\n", argv [argc - 2]) ; printf ("Sample Rate : %d\n", sfinfo.samplerate) ; printf ("Input Frames : %ld\n\n", (long) sfinfo.frames) ; if (new_sample_rate > 0) { src_ratio = (1.0 * new_sample_rate) / sfinfo.samplerate ; sfinfo.samplerate = new_sample_rate ; } else if (src_is_valid_ratio (src_ratio)) sfinfo.samplerate = (int) floor (sfinfo.samplerate * src_ratio) ; else { printf ("Not able to determine new sample rate. Exiting.\n") ; sf_close (infile) ; exit (1) ; } ; if (fabs (src_ratio - 1.0) < 1e-20) { printf ("Target samplerate and input samplerate are the same. Exiting.\n") ; sf_close (infile) ; exit (0) ; } ; printf ("SRC Ratio : %f\n", src_ratio) ; printf ("Converter : %s\n\n", src_get_name (converter)) ; if (src_is_valid_ratio (src_ratio) == 0) { printf ("Error : Sample rate change out of valid range.\n") ; sf_close (infile) ; exit (1) ; } ; /* Delete the output file length to zero if already exists. */ remove (argv [argc - 1]) ; printf ("Output file : %s\n", argv [argc - 1]) ; printf ("Sample Rate : %d\n", sfinfo.samplerate) ; do { sf_close (outfile) ; if ((outfile = sf_open (argv [argc - 1], SFM_WRITE, &sfinfo)) == NULL) { printf ("Error : Not able to open output file '%s'\n", argv [argc - 1]) ; sf_close (infile) ; exit (1) ; } ; if (max_speed) { /* This is mainly for the comparison program tests/src-evaluate.c */ sf_command (outfile, SFC_SET_ADD_PEAK_CHUNK, NULL, SF_FALSE) ; } else { /* Update the file header after every write. */ sf_command (outfile, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ; } ; sf_command (outfile, SFC_SET_CLIPPING, NULL, SF_TRUE) ; count = sample_rate_convert (infile, outfile, converter, src_ratio, sfinfo.channels, &gain, normalize) ; } while (count < 0) ; printf ("Output Frames : %ld\n\n", (long) count) ; sf_close (infile) ; sf_close (outfile) ; return 0 ; } /* main */
string Audio_file_reader::resample(int new_sample_rate) { sf_count_t count; string rname; SNDFILE *sf_rs = NULL; double gain = 1.0, src_ratio = -1.0; int samplerate = sf_info.samplerate; if (samplerate <= new_sample_rate) { printf("WARNING: The original file has sampling frequency %d less than the resampled frequency %d\n", samplerate, new_sample_rate); } int converter = DEFAULT_CONVERTER ; #ifdef DEBUG printf ("Input File : %s\n", name) ; printf ("Sample Rate : %d\n", sf_info.samplerate) ; printf ("Input Frames : %ld\n\n", (long) sf_info.frames) ; #endif src_ratio = (1.0 * new_sample_rate) / samplerate; sf_info.samplerate = new_sample_rate ; if (fabs (src_ratio - 1.0) < 1e-20) { printf ("Target samplerate and input samplerate are the same. Exiting.\n") ; return ""; } #ifdef DEBUG printf ("SRC Ratio : %f\n", src_ratio) ; printf ("Converter : %s\n\n", src_get_name (converter)) ; #endif if (src_is_valid_ratio (src_ratio) == 0) { printf ("Error : Sample rate change out of valid range.\n"); return ""; } rname = "resample_" + string(name); remove (rname.c_str()) ; #ifdef DEBUG printf ("Output file : %s\n", rname.c_str()); printf ("Sample Rate : %d\n", sf_info.samplerate) ; #endif if (sf_rs != NULL) { sf_close (sf_rs); } if ((sf_rs = sf_open(rname.c_str(), SFM_WRITE, &sf_info)) == NULL) { printf ("Error : Not able to open output file '%s'\n", rname.c_str()); sf_close (sf); return ""; }; /* Update the file header after every write. */ sf_command (sf_rs, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE); sf_command (sf_rs, SFC_SET_CLIPPING, NULL, SF_TRUE) ; count = sample_rate_convert (sf_rs, converter, src_ratio, sf_info.channels, &gain) ; sf_close(sf_rs); #ifdef DEBUG printf ("Output Frames : %ld\n\n", (long) count) ; #endif return rname; }
int main (int argc, char *argv []) { CONVERTER_TEST snr_test_data [] = { { SRC_ZERO_ORDER_HOLD, 8, BOOLEAN_FALSE, { { 1, { 0.01111111111 }, 3.0, 1, 28.0, 1.0 }, { 1, { 0.01111111111 }, 0.6, 1, 36.0, 1.0 }, { 1, { 0.01111111111 }, 0.3, 1, 36.0, 1.0 }, { 1, { 0.01111111111 }, 1.0, 1, 150.0, 1.0 }, { 1, { 0.01111111111 }, 1.001, 1, 38.0, 1.0 }, { 2, { 0.011111, 0.324 }, 1.9999, 2, 14.0, .96 }, { 2, { 0.012345, 0.457 }, 0.456789, 1, 12.0, .96 }, { 1, { 0.3511111111 }, 1.33, 1, 10.0, 1.0 } } }, { SRC_LINEAR, 8, BOOLEAN_FALSE, { { 1, { 0.01111111111 }, 3.0, 1, 73.0, 1.0 }, { 1, { 0.01111111111 }, 0.6, 1, 73.0, 1.0 }, { 1, { 0.01111111111 }, 0.3, 1, 73.0, 1.0 }, { 1, { 0.01111111111 }, 1.0, 1, 150.0, 1.0 }, { 1, { 0.01111111111 }, 1.001, 1, 77.0, 1.0 }, { 2, { 0.011111, 0.324 }, 1.9999, 2, 16.0, 0.96 }, { 2, { 0.012345, 0.457 }, 0.456789, 1, 26.0, 0.96 }, { 1, { 0.3511111111 }, 1.33, 1, 14.4, 0.99 } } }, { SRC_SINC_FASTEST, 9, BOOLEAN_TRUE, { { 1, { 0.01111111111 }, 3.0, 1, 100.0, 1.0 }, { 1, { 0.01111111111 }, 0.6, 1, 99.0, 1.0 }, { 1, { 0.01111111111 }, 0.3, 1, 100.0, 1.0 }, { 1, { 0.01111111111 }, 1.0, 1, 150.0, 1.0 }, { 1, { 0.01111111111 }, 1.001, 1, 100.0, 1.0 }, { 2, { 0.011111, 0.324 }, 1.9999, 2, 97.0, 1.0 }, { 2, { 0.012345, 0.457 }, 0.456789, 1, 100.0, 0.5 }, { 2, { 0.011111, 0.45 }, 0.6, 1, 97.0, 0.5 }, { 1, { 0.3511111111 }, 1.33, 1, 97.0, 1.0 } } }, { SRC_SINC_MEDIUM_QUALITY, 9, BOOLEAN_TRUE, { { 1, { 0.01111111111 }, 3.0, 1, 130.0, 1.0 }, { 1, { 0.01111111111 }, 0.6, 1, 132.0, 1.0 }, { 1, { 0.01111111111 }, 0.3, 1, 138.0, 1.0 }, { 1, { 0.01111111111 }, 1.0, 1, 155.0, 1.0 }, { 1, { 0.01111111111 }, 1.001, 1, 134.0, 1.0 }, { 2, { 0.011111, 0.324 }, 1.9999, 2, 127.0, 1.0 }, { 2, { 0.012345, 0.457 }, 0.456789, 1, 124.0, 0.5 }, { 2, { 0.011111, 0.45 }, 0.6, 1, 126.0, 0.5 }, { 1, { 0.43111111111 }, 1.33, 1, 121.0, 1.0 } } }, { SRC_SINC_BEST_QUALITY, 9, BOOLEAN_TRUE, { { 1, { 0.01111111111 }, 3.0, 1, 147.0, 1.0 }, { 1, { 0.01111111111 }, 0.6, 1, 147.0, 1.0 }, { 1, { 0.01111111111 }, 0.3, 1, 147.0, 1.0 }, { 1, { 0.01111111111 }, 1.0, 1, 155.0, 1.0 }, { 1, { 0.01111111111 }, 1.001, 1, 147.0, 1.0 }, { 2, { 0.011111, 0.324 }, 1.9999, 2, 147.0, 1.0 }, { 2, { 0.012345, 0.457 }, 0.456789, 1, 148.0, 0.5 }, { 2, { 0.011111, 0.45 }, 0.6, 1, 149.0, 0.5 }, { 1, { 0.43111111111 }, 1.33, 1, 145.0, 1.0 } } }, } ; /* snr_test_data */ double best_snr, snr, freq3dB ; int j, k, converter, verbose = 0 ; if (argc == 2 && strcmp (argv [1], "--verbose") == 0) verbose = 1 ; puts ("") ; for (j = 0 ; j < ARRAY_LEN (snr_test_data) ; j++) { best_snr = 5000.0 ; converter = snr_test_data [j].converter ; printf (" Converter %d : %s\n", converter, src_get_name (converter)) ; printf (" %s\n", src_get_description (converter)) ; for (k = 0 ; k < snr_test_data [j].tests ; k++) { snr = snr_test (&(snr_test_data [j].test_data [k]), k, converter, verbose) ; if (best_snr > snr) best_snr = snr ; } ; printf (" Worst case Signal-to-Noise Ratio : %.2f dB.\n", best_snr) ; if (snr_test_data [j].do_bandwidth_test == BOOLEAN_FALSE) { puts (" Bandwith test not performed on this converter.\n") ; continue ; } freq3dB = bandwidth_test (converter, verbose) ; printf (" Measured -3dB rolloff point : %5.2f %%.\n\n", freq3dB) ; } ; return 0 ; } /* main */
int main (int argc, char *argv []) { CONVERTER_TEST snr_test_data [] = { { SRC_ZERO_ORDER_HOLD, 7, BOOLEAN_FALSE, { { 1, { 0.01111111111 }, 3.0, 1, 36.0, 1.0 }, { 1, { 0.01111111111 }, 0.6, 1, 37.0, 1.0 }, { 1, { 0.01111111111 }, 0.3, 1, 37.0, 1.0 }, { 1, { 0.01111111111 }, 1.001, 1, 38.0, 1.0 }, { 2, { 0.011111, 0.324 }, 1.9999, 2, 14.0, 1.0 }, { 2, { 0.012345, 0.457 }, 0.456789, 1, 32.0, 1.0 }, { 1, { 0.3511111111 }, 1.33, 1, 10.0, 1.0 } } }, { SRC_LINEAR, 7, BOOLEAN_FALSE, { { 1, { 0.01111111111 }, 3.0, 1, 73.0, 1.0 }, { 1, { 0.01111111111 }, 0.6, 1, 74.0, 1.0 }, { 1, { 0.01111111111 }, 0.3, 1, 74.0, 1.0 }, { 1, { 0.01111111111 }, 1.001, 1, 77.0, 1.0 }, { 2, { 0.011111, 0.324 }, 1.9999, 2, 97.0, 0.94 }, { 2, { 0.012345, 0.457 }, 0.456789, 1, 60.0, 0.95 }, { 1, { 0.3511111111 }, 1.33, 1, 22.0, 0.99 } } }, { SRC_SINC_FASTEST, 8, BOOLEAN_TRUE, { { 1, { 0.01111111111 }, 3.0, 1, 100.0, 1.0 }, { 1, { 0.01111111111 }, 0.6, 1, 100.0, 1.0 }, { 1, { 0.01111111111 }, 0.3, 1, 100.0, 1.0 }, { 1, { 0.01111111111 }, 1.001, 1, 100.0, 1.0 }, { 2, { 0.011111, 0.324 }, 1.9999, 2, 97.0, 1.0 }, { 2, { 0.012345, 0.457 }, 0.456789, 1, 100.0, 0.5 }, { 2, { 0.011111, 0.45 }, 0.6, 1, 97.0, 0.5 }, { 1, { 0.3511111111 }, 1.33, 1, 97.0, 1.0 } } }, { SRC_SINC_MEDIUM_QUALITY, 8, BOOLEAN_TRUE, { { 1, { 0.01111111111 }, 3.0, 1, 100.0, 1.0 }, { 1, { 0.01111111111 }, 0.6, 1, 100.0, 1.0 }, { 1, { 0.01111111111 }, 0.3, 1, 100.0, 1.0 }, { 1, { 0.01111111111 }, 1.001, 1, 100.0, 1.0 }, { 2, { 0.011111, 0.324 }, 1.9999, 2, 97.0, 1.0 }, { 2, { 0.012345, 0.457 }, 0.456789, 1, 100.0, 0.5 }, { 2, { 0.011111, 0.45 }, 0.6, 1, 97.0, 0.5 }, { 1, { 0.43111111111 }, 1.33, 1, 97.0, 1.0 } } }, { SRC_SINC_BEST_QUALITY, 8, BOOLEAN_TRUE, { { 1, { 0.01111111111 }, 3.0, 1, 100.0, 1.0 }, { 1, { 0.01111111111 }, 0.6, 1, 100.0, 1.0 }, { 1, { 0.01111111111 }, 0.3, 1, 100.0, 1.0 }, { 1, { 0.01111111111 }, 1.001, 1, 100.0, 1.0 }, { 2, { 0.011111, 0.324 }, 1.9999, 2, 97.0, 1.0 }, { 2, { 0.012345, 0.457 }, 0.456789, 1, 100.0, 0.5 }, { 2, { 0.011111, 0.45 }, 0.6, 1, 97.0, 0.5 }, { 1, { 0.47111111111 }, 1.33, 1, 97.0, 1.0 } }, }, } ; /* snr_test_data */ double best_snr, snr, freq3dB, conversion_rate, worst_conv_rate ; int j, k, converter, verbose = 0 ; /* Force output of the Electric Fence banner message. */ force_efence_banner () ; if (argc == 2 && strcmp (argv [1], "--verbose") == 0) verbose = 1 ; puts ("") ; for (j = 0 ; j < ARRAY_LEN (snr_test_data) ; j++) { best_snr = 5000.0 ; worst_conv_rate = 1e200 ; converter = snr_test_data [j].converter ; printf (" Converter %d : %s\n", converter, src_get_name (converter)) ; printf (" %s\n", src_get_description (converter)) ; for (k = 0 ; k < snr_test_data [j].tests ; k++) { snr = snr_test (&(snr_test_data [j].test_data [k]), k, converter, verbose, &conversion_rate) ; if (best_snr > snr) best_snr = snr ; if (worst_conv_rate > conversion_rate) worst_conv_rate = conversion_rate ; } ; printf (" Worst case Signal-to-Noise Ratio : %.2f dB.\n", best_snr) ; printf (" Worst case conversion rate : %.0f samples/sec.\n", worst_conv_rate) ; if (snr_test_data [j].do_bandwidth_test == BOOLEAN_FALSE) { puts (" Bandwith test not performed on this converter.\n") ; continue ; } freq3dB = bandwidth_test (converter, verbose) ; printf (" Measured -3dB rolloff point : %5.2f %%.\n\n", freq3dB) ; } ; return 0 ; } /* main */
static void callback_reset_test (int converter) { static TEST_CB_DATA test_callback_data ; static float output [BUFFER_LEN] ; SRC_STATE *src_state ; double src_ratio = 1.1 ; long read_count, read_total ; int k, error ; printf ("\tcallback_reset_test (%-28s) ....... ", src_get_name (converter)) ; fflush (stdout) ; for (k = 0 ; k < ARRAY_LEN (data_one) ; k++) { data_one [k] = 1.0 ; data_zero [k] = 0.0 ; } ; if ((src_state = src_callback_new (test_callback_func, converter, 1, &error, &test_callback_data)) == NULL) { printf ("\n\nLine %d : %s\n\n", __LINE__, src_strerror (error)) ; exit (1) ; } ; /* Process a bunch of 1.0 valued samples. */ test_callback_data.channels = 1 ; test_callback_data.count = 0 ; test_callback_data.total = ARRAY_LEN (data_one) ; test_callback_data.data = data_one ; read_total = 0 ; do { read_count = (ARRAY_LEN (output) - read_total > CB_READ_LEN) ? CB_READ_LEN : ARRAY_LEN (output) - read_total ; read_count = src_callback_read (src_state, src_ratio, read_count, output + read_total) ; read_total += read_count ; } while (read_count > 0) ; /* Check for errors. */ if ((error = src_error (src_state)) != 0) { printf ("\n\nLine %d : %s\n\n", __LINE__, src_strerror (error)) ; exit (1) ; } ; /* Reset the state of the converter.*/ src_reset (src_state) ; /* Process a bunch of 0.0 valued samples. */ test_callback_data.channels = 1 ; test_callback_data.count = 0 ; test_callback_data.total = ARRAY_LEN (data_zero) ; test_callback_data.data = data_zero ; /* Now process some zero data. */ read_total = 0 ; do { read_count = (ARRAY_LEN (output) - read_total > CB_READ_LEN) ? CB_READ_LEN : ARRAY_LEN (output) - read_total ; read_count = src_callback_read (src_state, src_ratio, read_count, output + read_total) ; read_total += read_count ; } while (read_count > 0) ; /* Check for errors. */ if ((error = src_error (src_state)) != 0) { printf ("\n\nLine %d : %s\n\n", __LINE__, src_strerror (error)) ; exit (1) ; } ; /* Finally make sure that the output data is zero ie reset was sucessful. */ for (k = 0 ; k < BUFFER_LEN / 2 ; k++) if (output [k] != 0.0) { printf ("\n\nLine %d : output [%d] should be 0.0, is %f.\n\n", __LINE__, k, output [k]) ; save_oct_float ("output.dat", data_one, ARRAY_LEN (data_one), output, ARRAY_LEN (output)) ; exit (1) ; } ; /* Make sure that this function has been exported. */ src_set_ratio (src_state, 1.0) ; /* Delete converter. */ src_state = src_delete (src_state) ; puts ("ok") ; } /* callback_reset_test */
PJ_DEF(pj_status_t) pjmedia_resample_create( pj_pool_t *pool, pj_bool_t high_quality, pj_bool_t large_filter, unsigned channel_count, unsigned rate_in, unsigned rate_out, unsigned samples_per_frame, pjmedia_resample **p_resample) { pjmedia_resample *resample; int type, err; PJ_ASSERT_RETURN(pool && p_resample && rate_in && rate_out && samples_per_frame, PJ_EINVAL); resample = PJ_POOL_ZALLOC_T(pool, pjmedia_resample); PJ_ASSERT_RETURN(resample, PJ_ENOMEM); /* Select conversion type */ if (high_quality) { type = large_filter ? SRC_SINC_BEST_QUALITY : SRC_SINC_MEDIUM_QUALITY; } else { type = large_filter ? SRC_SINC_FASTEST : SRC_LINEAR; } /* Create converter */ resample->state = src_new(type, channel_count, &err); if (resample->state == NULL) { PJ_LOG(4,(THIS_FILE, "Error creating resample: %s", src_strerror(err))); return PJMEDIA_ERROR; } /* Calculate ratio */ resample->ratio = rate_out * 1.0 / rate_in; /* Calculate number of samples for input and output */ resample->in_samples = samples_per_frame; resample->out_samples = rate_out / (rate_in / samples_per_frame); resample->frame_in = (float*) pj_pool_calloc(pool, resample->in_samples + 8, sizeof(float)); resample->frame_out = (float*) pj_pool_calloc(pool, resample->out_samples + 8, sizeof(float)); /* Set the converter ratio */ err = src_set_ratio(resample->state, resample->ratio); if (err != 0) { PJ_LOG(4,(THIS_FILE, "Error creating resample: %s", src_strerror(err))); return PJMEDIA_ERROR; } /* Done */ PJ_LOG(5,(THIS_FILE, "Resample using libsamplerate %s, type=%s (%s), " "ch=%d, in/out rate=%d/%d", src_get_version(), src_get_name(type), src_get_description(type), channel_count, rate_in, rate_out)); *p_resample = resample; return PJ_SUCCESS; }
static void process_reset_test (int converter) { static float output [BUFFER_LEN] ; SRC_STATE *src_state ; SRC_DATA src_data ; int k, error ; printf ("\tprocess_reset_test (%-28s) ....... ", src_get_name (converter)) ; fflush (stdout) ; for (k = 0 ; k < BUFFER_LEN ; k++) { data_one [k] = 1.0 ; data_zero [k] = 0.0 ; } ; /* Get a converter. */ if ((src_state = src_new (converter, 1, &error)) == NULL) { printf ("\n\nLine %d : src_new() failed : %s.\n\n", __LINE__, src_strerror (error)) ; exit (1) ; } ; /* Process a bunch of 1.0 valued samples. */ src_data.data_in = data_one ; src_data.data_out = output ; src_data.input_frames = BUFFER_LEN ; src_data.output_frames = BUFFER_LEN ; src_data.src_ratio = 0.9 ; src_data.end_of_input = 1 ; if ((error = src_process (src_state, &src_data)) != 0) { printf ("\n\nLine %d : src_simple () returned error : %s\n\n", __LINE__, src_strerror (error)) ; exit (1) ; } ; /* Reset the state of the converter.*/ src_reset (src_state) ; /* Now process some zero data. */ src_data.data_in = data_zero ; src_data.data_out = output ; src_data.input_frames = BUFFER_LEN ; src_data.output_frames = BUFFER_LEN ; src_data.src_ratio = 0.9 ; src_data.end_of_input = 1 ; if ((error = src_process (src_state, &src_data)) != 0) { printf ("\n\nLine %d : src_simple () returned error : %s\n\n", __LINE__, src_strerror (error)) ; exit (1) ; } ; /* Finally make sure that the output data is zero ie reset was sucessful. */ for (k = 0 ; k < BUFFER_LEN / 2 ; k++) if (output [k] != 0.0) { printf ("\n\nLine %d : output [%d] should be 0.0, is %f.\n", __LINE__, k, output [k]) ; exit (1) ; } ; /* Make sure that this function has been exported. */ src_set_ratio (src_state, 1.0) ; /* Delete converter. */ src_state = src_delete (src_state) ; puts ("ok") ; } /* process_reset_test */
wxString VarRateResample::GetMethodName(int index) { return wxString(wxString::FromAscii(src_get_name(index))); }
static long throughput_test (int converter, int channels, long best_throughput) { SRC_DATA src_data ; clock_t start_time, clock_time ; double duration ; long total_frames = 0, throughput ; int error ; printf (" %-30s %2d ", src_get_name (converter), channels) ; fflush (stdout) ; src_data.data_in = input ; src_data.input_frames = ARRAY_LEN (input) / channels ; src_data.data_out = output ; src_data.output_frames = ARRAY_LEN (output) / channels ; src_data.src_ratio = 0.99 ; sleep (2) ; start_time = clock () ; do { if ((error = src_simple (&src_data, converter, channels)) != 0) { puts (src_strerror (error)) ; exit (1) ; } ; total_frames += src_data.output_frames_gen ; clock_time = clock () - start_time ; duration = (1.0 * clock_time) / CLOCKS_PER_SEC ; } while (duration < 5.0) ; if (src_data.input_frames_used != src_data.input_frames) { printf ("\n\nLine %d : input frames used %ld should be %ld\n", __LINE__, src_data.input_frames_used, src_data.input_frames) ; exit (1) ; } ; if (fabs (src_data.src_ratio * src_data.input_frames_used - src_data.output_frames_gen) > 2) { printf ("\n\nLine %d : input / output length mismatch.\n\n", __LINE__) ; printf (" input len : %d\n", ARRAY_LEN (input) / channels) ; printf (" output len : %ld (should be %g +/- 2)\n\n", src_data.output_frames_gen, floor (0.5 + src_data.src_ratio * src_data.input_frames_used)) ; exit (1) ; } ; throughput = lrint (floor (total_frames / duration)) ; if (best_throughput == 0) { best_throughput = MAX (throughput, best_throughput) ; printf ("%5.2f %10ld\n", duration, throughput) ; } else { best_throughput = MAX (throughput, best_throughput) ; printf ("%5.2f %10ld %10ld\n", duration, throughput, best_throughput) ; } return best_throughput ; } /* throughput_test */