xref: /aosp_15_r20/external/sonic/main_lite.c (revision b290403dc9d28f89f133eb7e190ea8185d440ecd)
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