| /* This file was written by Bill Cox in 2011, and is licensed under the Apache |
| 2.0 license. */ |
| |
| package sonic; |
| |
| import java.io.File; |
| import java.io.IOException; |
| |
| import javax.sound.sampled.AudioFormat; |
| import javax.sound.sampled.AudioInputStream; |
| import javax.sound.sampled.AudioSystem; |
| import javax.sound.sampled.DataLine; |
| import javax.sound.sampled.LineUnavailableException; |
| import javax.sound.sampled.SourceDataLine; |
| import javax.sound.sampled.UnsupportedAudioFileException; |
| |
| public class Main { |
| |
| // Run sonic. |
| private static void runSonic( |
| AudioInputStream audioStream, |
| SourceDataLine line, |
| float speed, |
| float pitch, |
| float rate, |
| float volume, |
| boolean emulateChordPitch, |
| int quality, |
| int sampleRate, |
| int numChannels) throws IOException |
| { |
| Sonic sonic = new Sonic(sampleRate, numChannels); |
| int bufferSize = line.getBufferSize(); |
| byte inBuffer[] = new byte[bufferSize]; |
| byte outBuffer[] = new byte[bufferSize]; |
| int numRead, numWritten; |
| |
| sonic.setSpeed(speed); |
| sonic.setPitch(pitch); |
| sonic.setRate(rate); |
| sonic.setVolume(volume); |
| sonic.setChordPitch(emulateChordPitch); |
| sonic.setQuality(quality); |
| do { |
| numRead = audioStream.read(inBuffer, 0, bufferSize); |
| if(numRead <= 0) { |
| sonic.flushStream(); |
| } else { |
| sonic.writeBytesToStream(inBuffer, numRead); |
| } |
| do { |
| numWritten = sonic.readBytesFromStream(outBuffer, bufferSize); |
| if(numWritten > 0) { |
| line.write(outBuffer, 0, numWritten); |
| } |
| } while(numWritten > 0); |
| } while(numRead > 0); |
| } |
| |
| public static void main( |
| String[] argv) throws UnsupportedAudioFileException, IOException, LineUnavailableException |
| { |
| float speed = 2.0f; |
| float pitch = 1.0f; |
| float rate = 1.0f; |
| float volume = 1.0f; |
| boolean emulateChordPitch = false; |
| int quality = 0; |
| |
| AudioInputStream stream = AudioSystem.getAudioInputStream(new File("talking.wav")); |
| AudioFormat format = stream.getFormat(); |
| int sampleRate = (int)format.getSampleRate(); |
| int numChannels = format.getChannels(); |
| SourceDataLine.Info info = new DataLine.Info(SourceDataLine.class, format, |
| ((int)stream.getFrameLength()*format.getFrameSize())); |
| SourceDataLine line = (SourceDataLine)AudioSystem.getLine(info); |
| line.open(stream.getFormat()); |
| line.start(); |
| runSonic(stream, line, speed, pitch, rate, volume, emulateChordPitch, quality, |
| sampleRate, numChannels); |
| line.drain(); |
| line.stop(); |
| } |
| } |