/* This file was written by Bill Cox in 2010, and is licensed under the Apache 2.0 license. This file is meant as a simple example for how to use libsonic. It is also a useful utility on its own, which can speed up or slow down wav files, change pitch, and scale volume. */ #include #include #include #include "sonic_lite.h" #include "wave.h" /* Run sonic_lite. */ static void runSonic(char* inFileName, char* outFileName, float speed, float volume) { waveFile inFile, outFile = NULL; short inBuffer[SONIC_INPUT_SAMPLES], outBuffer[SONIC_INPUT_SAMPLES]; int samplesRead, samplesWritten, sampleRate, numChannels; inFile = openInputWaveFile(inFileName, &sampleRate, &numChannels); if (numChannels != 1) { fprintf(stderr, "sonic_lite only processes mono wave files. This file has %d channels.\n", numChannels); exit(1); } if (sampleRate != SONIC_SAMPLE_RATE) { fprintf(stderr, "sonic_lite only processes wave files with a sample rate of %d Hz. This file uses %d\n", SONIC_SAMPLE_RATE, sampleRate); exit(1); } if (inFile == NULL) { fprintf(stderr, "Unable to read wave file %s\n", inFileName); exit(1); } outFile = openOutputWaveFile(outFileName, sampleRate, 1); if (outFile == NULL) { closeWaveFile(inFile); fprintf(stderr, "Unable to open wave file %s for writing\n", outFileName); exit(1); } sonicInit(); sonicSetSpeed(speed); sonicSetVolume(volume); do { samplesRead = readFromWaveFile(inFile, inBuffer, SONIC_INPUT_SAMPLES); if (samplesRead == 0) { sonicFlushStream(); } else { sonicWriteShortToStream(inBuffer, samplesRead); } do { samplesWritten = sonicReadShortFromStream(outBuffer, SONIC_INPUT_SAMPLES); if (samplesWritten > 0) { writeToWaveFile(outFile, outBuffer, samplesWritten); } } while (samplesWritten > 0); } while (samplesRead > 0); closeWaveFile(inFile); closeWaveFile(outFile); } /* Print the usage. */ static void usage(void) { fprintf( stderr, "Usage: sonic_lite [OPTION]... infile outfile\n" " -s speed -- Set speed up factor. 2.0 means 2X faster.\n" " -v volume -- Scale volume by a constant factor.\n"); exit(1); } int main(int argc, char** argv) { char* inFileName; char* outFileName; float speed = 1.0f; float volume = 1.0f; int xArg = 1; while (xArg < argc && *(argv[xArg]) == '-') { if (!strcmp(argv[xArg], "-s")) { xArg++; if (xArg < argc) { speed = atof(argv[xArg]); printf("Setting speed to %0.2fX\n", speed); } } else if (!strcmp(argv[xArg], "-v")) { xArg++; if (xArg < argc) { volume = atof(argv[xArg]); printf("Setting volume to %0.2f\n", volume); } } xArg++; } if (argc - xArg != 2) { usage(); } inFileName = argv[xArg]; outFileName = argv[xArg + 1]; runSonic(inFileName, outFileName, speed, volume); return 0; }