/* * 21.04.2004 Original verion. davagin@udm.ru. * ----------------------------------------------------------------------- This * program is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, Inc., * 675 Mass Ave, Cambridge, MA 02139, USA. * ---------------------------------------------------------------------- */ package call.jeq; import javax.sound.sampled.*; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; /** * Author: Dmitry Vaguine Date: 12.03.2004 Time: 13:35:13 */ public class JavaSoundSimpleAudioPlayer { /** * Plays audio from given file names. */ public static void main(String[] args) { // Check for given sound file names. if (args.length < 1) { System.out.println("Play usage:"); System.out.println("\tjava Play <sound file names>*"); System.exit(0); } // Process arguments. for (int i = 0; i < args.length; i++) playAudioFile(args[i]); // Must exit explicitly since audio creates non-daemon threads. System.exit(0); } // main /** * Play audio from the given file name. */ public static void playAudioFile(String fileName) { try { AudioInputStream audioInputStream; try { URL url = new URL(fileName); audioInputStream = AudioSystem.getAudioInputStream(url); } catch (MalformedURLException e) { File soundFile = new File(fileName); audioInputStream = AudioSystem.getAudioInputStream(soundFile); } // Create a stream from the given file. // Throws IOException or UnsupportedAudioFileException playAudioStream(audioInputStream); } catch (Exception e) { System.out.println("Problem with file " + fileName + ":"); e.printStackTrace(); } } // playAudioFile /** * Plays audio from the given audio input stream. */ public static void playAudioStream(AudioInputStream audioInputStream) { // Audio format provides information like sample rate, size, channels. AudioFormat audioFormat = audioInputStream.getFormat(); // Convert compressed audio data to uncompressed PCM format. if (audioFormat.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) { AudioFormat newFormat = new AudioFormat(audioFormat.getSampleRate(), audioFormat.getSampleSizeInBits(), audioFormat.getChannels(), true, false); System.out.println("Converting audio format to " + newFormat); AudioInputStream newStream = AudioSystem.getAudioInputStream(newFormat, audioInputStream); audioFormat = newFormat; audioInputStream = newStream; } // Open a data line to play our type of sampled audio. // Use SourceDataLine for play and TargetDataLine for record. DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat); if (!AudioSystem.isLineSupported(info)) { System.out.println("Play.playAudioStream does not handle this type of audio on this system."); return; } try { // Create a SourceDataLine for play back (throws // LineUnavailableException). SourceDataLine dataLine = (SourceDataLine) AudioSystem.getLine(info); System.out.println("SourceDataLine class=" + dataLine.getClass()); // The line acquires system resources (throws // LineAvailableException). dataLine.open(audioFormat); // Adjust the volume on the output line. if (dataLine.isControlSupported(FloatControl.Type.MASTER_GAIN)) { FloatControl volume = (FloatControl) dataLine.getControl(FloatControl.Type.MASTER_GAIN); volume.setValue((volume.getMaximum() - volume.getMinimum()) * 0.8f + volume.getMinimum()); } // Allows the line to move data in and out to a port. dataLine.start(); EqualizerAudioInputStream eq = new EqualizerAudioInputStream(audioInputStream, 31); for (int i = 1; i < 31; ++i)eq.getControls().setBandValue(i, 0, eq.getControls().getMinimumBandValue()); // Create a buffer for moving data from the audio stream to the // line. int bufferSize = (int) audioFormat.getSampleRate() * audioFormat.getFrameSize(); byte[] buffer = new byte[bufferSize]; // Move the data until done or there is an error. try { int bytesRead = 0; while (bytesRead >= 0) { bytesRead = eq.read(buffer, 0, buffer.length); if (bytesRead >= 0) dataLine.write(buffer, 0, bytesRead); } // while } catch (IOException e) { e.printStackTrace(); } System.out.println("Play.playAudioStream draining line."); // Continues data line I/O until its buffer is drained. dataLine.drain(); System.out.println("Play.playAudioStream closing line."); // Closes the data line, freeing any resources such as the audio // device. dataLine.close(); } catch (LineUnavailableException e) { e.printStackTrace(); } } // playAudioStream }