xref: /aosp_15_r20/external/sonic/Main.java (revision b290403dc9d28f89f133eb7e190ea8185d440ecd)
1*b290403dSRicardo Garcia /* This file was written by Bill Cox in 2011, and is licensed under the Apache
2*b290403dSRicardo Garcia    2.0 license. */
3*b290403dSRicardo Garcia 
4*b290403dSRicardo Garcia package sonic;
5*b290403dSRicardo Garcia 
6*b290403dSRicardo Garcia import java.io.File;
7*b290403dSRicardo Garcia import java.io.IOException;
8*b290403dSRicardo Garcia import javax.sound.sampled.AudioFormat;
9*b290403dSRicardo Garcia import javax.sound.sampled.AudioInputStream;
10*b290403dSRicardo Garcia import javax.sound.sampled.AudioSystem;
11*b290403dSRicardo Garcia import javax.sound.sampled.DataLine;
12*b290403dSRicardo Garcia import javax.sound.sampled.LineUnavailableException;
13*b290403dSRicardo Garcia import javax.sound.sampled.SourceDataLine;
14*b290403dSRicardo Garcia import javax.sound.sampled.UnsupportedAudioFileException;
15*b290403dSRicardo Garcia 
16*b290403dSRicardo Garcia public class Main {
17*b290403dSRicardo Garcia 
18*b290403dSRicardo Garcia     // Run sonic.
runSonic( AudioInputStream audioStream, SourceDataLine line, float speed, float pitch, float rate, float volume, boolean emulateChordPitch, int quality, int sampleRate, int numChannels)19*b290403dSRicardo Garcia     private static void runSonic(
20*b290403dSRicardo Garcia         AudioInputStream audioStream,
21*b290403dSRicardo Garcia         SourceDataLine line,
22*b290403dSRicardo Garcia         float speed,
23*b290403dSRicardo Garcia         float pitch,
24*b290403dSRicardo Garcia         float rate,
25*b290403dSRicardo Garcia         float volume,
26*b290403dSRicardo Garcia         boolean emulateChordPitch,
27*b290403dSRicardo Garcia         int quality,
28*b290403dSRicardo Garcia         int sampleRate,
29*b290403dSRicardo Garcia         int numChannels) throws IOException
30*b290403dSRicardo Garcia     {
31*b290403dSRicardo Garcia         Sonic sonic = new Sonic(sampleRate, numChannels);
32*b290403dSRicardo Garcia         int bufferSize = line.getBufferSize();
33*b290403dSRicardo Garcia         byte inBuffer[] = new byte[bufferSize];
34*b290403dSRicardo Garcia         byte outBuffer[] = new byte[bufferSize];
35*b290403dSRicardo Garcia         int numRead, numWritten;
36*b290403dSRicardo Garcia 
37*b290403dSRicardo Garcia         sonic.setSpeed(speed);
38*b290403dSRicardo Garcia         sonic.setPitch(pitch);
39*b290403dSRicardo Garcia         sonic.setRate(rate);
40*b290403dSRicardo Garcia         sonic.setVolume(volume);
41*b290403dSRicardo Garcia         sonic.setChordPitch(emulateChordPitch);
42*b290403dSRicardo Garcia         sonic.setQuality(quality);
43*b290403dSRicardo Garcia         do {
44*b290403dSRicardo Garcia             numRead = audioStream.read(inBuffer, 0, bufferSize);
45*b290403dSRicardo Garcia             if(numRead <= 0) {
46*b290403dSRicardo Garcia                 sonic.flushStream();
47*b290403dSRicardo Garcia             } else {
48*b290403dSRicardo Garcia                 sonic.writeBytesToStream(inBuffer, numRead);
49*b290403dSRicardo Garcia             }
50*b290403dSRicardo Garcia             do {
51*b290403dSRicardo Garcia                 numWritten = sonic.readBytesFromStream(outBuffer, bufferSize);
52*b290403dSRicardo Garcia                 if(numWritten > 0) {
53*b290403dSRicardo Garcia                     line.write(outBuffer, 0, numWritten);
54*b290403dSRicardo Garcia                 }
55*b290403dSRicardo Garcia             } while(numWritten > 0);
56*b290403dSRicardo Garcia         } while(numRead > 0);
57*b290403dSRicardo Garcia     }
58*b290403dSRicardo Garcia 
main( String[] argv)59*b290403dSRicardo Garcia     public static void main(
60*b290403dSRicardo Garcia     	String[] argv) throws UnsupportedAudioFileException, IOException, LineUnavailableException
61*b290403dSRicardo Garcia     {
62*b290403dSRicardo Garcia         float speed = 1.0f;
63*b290403dSRicardo Garcia         float pitch = 1.0f;
64*b290403dSRicardo Garcia         float rate = 1.5f;
65*b290403dSRicardo Garcia         float volume = 1.0f;
66*b290403dSRicardo Garcia         boolean emulateChordPitch = false;
67*b290403dSRicardo Garcia         int quality = 0;
68*b290403dSRicardo Garcia 
69*b290403dSRicardo Garcia         AudioInputStream stream = AudioSystem.getAudioInputStream(new File("stereo_test.wav"));
70*b290403dSRicardo Garcia         AudioFormat format = stream.getFormat();
71*b290403dSRicardo Garcia         int sampleRate = (int)format.getSampleRate();
72*b290403dSRicardo Garcia         int numChannels = format.getChannels();
73*b290403dSRicardo Garcia         SourceDataLine.Info info = new DataLine.Info(SourceDataLine.class, format,
74*b290403dSRicardo Garcia         	((int)stream.getFrameLength()*format.getFrameSize()));
75*b290403dSRicardo Garcia         SourceDataLine line = (SourceDataLine)AudioSystem.getLine(info);
76*b290403dSRicardo Garcia         line.open(stream.getFormat());
77*b290403dSRicardo Garcia         line.start();
78*b290403dSRicardo Garcia         runSonic(stream, line, speed, pitch, rate, volume, emulateChordPitch, quality,
79*b290403dSRicardo Garcia             sampleRate, numChannels);
80*b290403dSRicardo Garcia         line.drain();
81*b290403dSRicardo Garcia         line.stop();
82*b290403dSRicardo Garcia     }
83*b290403dSRicardo Garcia }
84