/********************************************************************** resample-sndfile.c Written by Dominic Mazzoni Based on resample-1.7: http://www-ccrma.stanford.edu/~jos/resample/ License: LGPL - see the file LICENSE.txt for more information **********************************************************************/ #include "../include/libresample.h" #include #include #include #include #include #include #define MIN(A, B) (A) < (B)? (A) : (B) void usage(char *progname) { fprintf(stderr, "Usage: %s -by \n", progname); fprintf(stderr, " %s -to \n", progname); fprintf(stderr, "\n"); exit(-1); } int main(int argc, char **argv) { SNDFILE *srcfile, *dstfile; SF_INFO srcinfo, dstinfo; SF_FORMAT_INFO formatinfo; char *extension; void **handle; int channels; int srclen, dstlen; float *src, *srci; float *dst, *dsti; double ratio = 0.0; double srcrate; double dstrate = 0.0; struct timeval tv0, tv1; double deltat; int numformats; int pos, bufferpos, outcount; int i, c; if (argc != 5) usage(argv[0]); if (!strcmp(argv[1], "-by")) { ratio = atof(argv[2]); if (ratio <= 0.0) { fprintf(stderr, "Ratio of %f is illegal\n", ratio); usage(argv[0]); } } else if (!strcmp(argv[1], "-to")) { dstrate = atof(argv[2]); if (dstrate < 10.0 || dstrate > 100000.0) { fprintf(stderr, "Sample rate of %f is illegal\n", dstrate); usage(argv[0]); } } else usage(argv[0]); memset(&srcinfo, 0, sizeof(srcinfo)); memset(&dstinfo, 0, sizeof(dstinfo)); srcfile = sf_open(argv[3], SFM_READ, &srcinfo); if (!srcfile) { fprintf(stderr, "%s", sf_strerror(NULL)); exit(-1); } srcrate = srcinfo.samplerate; if (dstrate == 0.0) dstrate = srcrate * ratio; else ratio = dstrate / srcrate; channels = srcinfo.channels; /* figure out format of destination file */ extension = strstr(argv[4], "."); if (extension) { extension++; sf_command(NULL, SFC_GET_FORMAT_MAJOR_COUNT, &numformats, sizeof(numformats)); for(i=0; i= 1) dsti[i*channels+c] = 1; else dsti[i*channels+c] = dst[i]; } } sf_writef_float(dstfile, dsti, out); bufferpos = block - inUsed; for(i=0; i