# HG changeset patch # User Chris Cannam # Date 1615566839 0 # Fri Mar 12 16:33:59 2021 +0000 # Branch resampler # Node ID beeafb105b6fca09a7b3ee0d7d4f453f6026313a # Parent 2907f4d3d0bb5520edfcbf5ebad26f991ebf5629 Add quality option etc to example resampler diff --git a/example/resample.cpp b/example/resample.cpp --- a/example/resample.cpp +++ b/example/resample.cpp @@ -13,23 +13,53 @@ void usage() { - cerr << "Usage: resample -to " << endl; + cerr << "Usage: resample [-v] [-c ] -to " << endl; + cerr << "where may be 0, 1, or 2, for best, medium, or fastest respectively" << endl; + cerr << "supply -v for verbose output" << endl; exit(2); } int main(int argc, char **argv) { - if (argc != 5 || strcmp(argv[1], "-to")) { + double target = 0.0; + int quality = 0; + int arg; + bool verbose = false; + + for (arg = 1; arg + 2 < argc; ++arg) { + if (!strcmp(argv[arg], "-c")) { + char *e = argv[arg+1]; + quality = strtol(argv[arg+1], &e, 10); + if (*e || (quality < 0) || (quality > 2)) { + cerr << "error: invalid converter \"" + << argv[arg+1] << "\" (must be 0, 1, 2)" << endl; + usage(); + } + ++arg; + continue; + } else if (!strcmp(argv[arg], "-to")) { + target = strtod(argv[arg+1], 0); + if (!target) { + cerr << "error: invalid target \"" << argv[arg+1] + << "\" (must be numeric)" << endl; + usage(); + } + ++arg; + continue; + } else if (!strcmp(argv[arg], "-v")) { + verbose = true; + } else { + cerr << "error: unexpected option \"" << argv[arg] << "\"" << endl; + usage(); + } + } + + if (!target || arg + 2 != argc) { usage(); } - double target = strtod(argv[2], 0); - if (!target) { - usage(); - } - - string infilename = argv[3]; - string outfilename = argv[4]; + string infilename = argv[arg]; + string outfilename = argv[arg+1]; SF_INFO info_in; SNDFILE *file_in = sf_open(infilename.c_str(), SFM_READ, &info_in); @@ -47,6 +77,22 @@ double ratio = target / info_in.samplerate; cerr << "ratio = " << ratio << endl; + breakfastquay::Resampler::Parameters parameters; + switch (quality) { + case 0: + parameters.quality = breakfastquay::Resampler::Best; + cerr << "quality = best" << endl; + break; + case 1: + parameters.quality = breakfastquay::Resampler::FastestTolerable; + cerr << "quality = middling" << endl; + break; + case 2: + parameters.quality = breakfastquay::Resampler::Fastest; + cerr << "quality = worst" << endl; + break; + } + SF_INFO info_out; memset(&info_out, 0, sizeof(SF_INFO)); info_out.channels = channels; @@ -63,17 +109,18 @@ float *ibuf = new float[ibs * channels]; float *obuf = new float[obs * channels]; - breakfastquay::Resampler::Parameters parameters; - parameters.quality = breakfastquay::Resampler::Best; parameters.dynamism = breakfastquay::Resampler::RatioMostlyFixed; + parameters.ratioChange = breakfastquay::Resampler::SuddenRatioChange; parameters.initialSampleRate = info_in.samplerate; - parameters.debugLevel = 1; + parameters.debugLevel = (verbose ? 1 : 0); breakfastquay::Resampler resampler(parameters, info_in.channels); int n = 0; while (true) { int count = sf_readf_float(file_in, ibuf, ibs); - cerr << "."; + if (verbose) { + cerr << "."; + } if (count < 0) { cerr << "error: count = " << count << endl; break; @@ -93,7 +140,9 @@ ++n; } - cerr << endl; + if (verbose) { + cerr << endl; + } sf_close(file_in); sf_close(file_out);