1 /* This file was written by Bill Cox in 2010, and is licensed under the Apache
2 2.0 license.
3
4 This file is meant as a simple example for how to use libsonic. It is also a
5 useful utility on its own, which can speed up or slow down wav files, change
6 pitch, and scale volume. */
7
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include "sonic_lite.h"
12 #include "wave.h"
13
14 /* Run sonic_lite. */
runSonic(char * inFileName,char * outFileName,float speed,float volume)15 static void runSonic(char* inFileName, char* outFileName, float speed, float volume) {
16 waveFile inFile, outFile = NULL;
17 short inBuffer[SONIC_INPUT_SAMPLES], outBuffer[SONIC_INPUT_SAMPLES];
18 int samplesRead, samplesWritten, sampleRate, numChannels;
19
20 inFile = openInputWaveFile(inFileName, &sampleRate, &numChannels);
21 if (numChannels != 1) {
22 fprintf(stderr, "sonic_lite only processes mono wave files. This file has %d channels.\n",
23 numChannels);
24 exit(1);
25 }
26 if (sampleRate != SONIC_SAMPLE_RATE) {
27 fprintf(stderr,
28 "sonic_lite only processes wave files with a sample rate of %d Hz. This file uses %d\n",
29 SONIC_SAMPLE_RATE, sampleRate);
30 exit(1);
31 }
32 if (inFile == NULL) {
33 fprintf(stderr, "Unable to read wave file %s\n", inFileName);
34 exit(1);
35 }
36 outFile = openOutputWaveFile(outFileName, sampleRate, 1);
37 if (outFile == NULL) {
38 closeWaveFile(inFile);
39 fprintf(stderr, "Unable to open wave file %s for writing\n", outFileName);
40 exit(1);
41 }
42 sonicInit();
43 sonicSetSpeed(speed);
44 sonicSetVolume(volume);
45 do {
46 samplesRead = readFromWaveFile(inFile, inBuffer, SONIC_INPUT_SAMPLES);
47 if (samplesRead == 0) {
48 sonicFlushStream();
49 } else {
50 sonicWriteShortToStream(inBuffer, samplesRead);
51 }
52 do {
53 samplesWritten = sonicReadShortFromStream(outBuffer, SONIC_INPUT_SAMPLES);
54 if (samplesWritten > 0) {
55 writeToWaveFile(outFile, outBuffer, samplesWritten);
56 }
57 } while (samplesWritten > 0);
58 } while (samplesRead > 0);
59 closeWaveFile(inFile);
60 closeWaveFile(outFile);
61 }
62
63 /* Print the usage. */
usage(void)64 static void usage(void) {
65 fprintf(
66 stderr,
67 "Usage: sonic_lite [OPTION]... infile outfile\n"
68 " -s speed -- Set speed up factor. 2.0 means 2X faster.\n"
69 " -v volume -- Scale volume by a constant factor.\n");
70 exit(1);
71 }
72
main(int argc,char ** argv)73 int main(int argc, char** argv) {
74 char* inFileName;
75 char* outFileName;
76 float speed = 1.0f;
77 float volume = 1.0f;
78 int xArg = 1;
79
80 while (xArg < argc && *(argv[xArg]) == '-') {
81 if (!strcmp(argv[xArg], "-s")) {
82 xArg++;
83 if (xArg < argc) {
84 speed = atof(argv[xArg]);
85 printf("Setting speed to %0.2fX\n", speed);
86 }
87 } else if (!strcmp(argv[xArg], "-v")) {
88 xArg++;
89 if (xArg < argc) {
90 volume = atof(argv[xArg]);
91 printf("Setting volume to %0.2f\n", volume);
92 }
93 }
94 xArg++;
95 }
96 if (argc - xArg != 2) {
97 usage();
98 }
99 inFileName = argv[xArg];
100 outFileName = argv[xArg + 1];
101 runSonic(inFileName, outFileName, speed, volume);
102 return 0;
103 }
104