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