<< Chapter < Page Chapter >> Page >

..

Listing 8 . The class named AudioPlayOrFile01.
/*File AudioPlayOrFile01.java Copyright 2014, R.G.BaldwinRevised 08/16/14 ******************************************************************************/import javax.sound.sampled.*; import java.io.*;import java.util.*; public class AudioPlayOrFile01{//An object of this class is used to either play the sound in the array // named melody or to write it into an audio file of type AU.//The following are general instance variables used to create a// SourceDataLine object. AudioFormat audioFormat;AudioInputStream audioInputStream; SourceDataLine sourceDataLine;AudioFormatParameters01 audioParams; byte[]melody; String playOrFile;//"play" to play immediately or a fileName to write// an output file of type AU. //-------------------------------------------------------------------------//public AudioPlayOrFile01(AudioFormatParameters01 audioParams,byte[] melody,String playOrFile){//constructor this.audioParams = audioParams;this.melody = melody; this.playOrFile = playOrFile;}//end constructor //-------------------------------------------------------------------------////This method plays or files the synthetic audio data that has been generated // and saved in an array.void playOrFileData() { try{//Get an input stream on the byte array containing the data InputStream byteArrayInputStream = new ByteArrayInputStream(melody);//Get the required audio format audioFormat = new AudioFormat(audioParams.sampleRate,audioParams.sampleSizeInBits, audioParams.channels,audioParams.signed, audioParams.bigEndian);//Get an audio input stream from the ByteArrayInputStream audioInputStream = new AudioInputStream(byteArrayInputStream, audioFormat,melody.length/audioFormat.getFrameSize()); //Get info on the required data lineDataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, audioFormat);//Get a SourceDataLine object sourceDataLine = (SourceDataLine)AudioSystem.getLine(dataLineInfo);//Decide whether to play the audio data immediately, or to write it // into an audio file of type AU based on the incoming parameter named// playOrFile. if(playOrFile.toUpperCase().equals("PLAY")){//Create a thread to play back the data and start it running. It will // run until all the data has been played backnew PlayAudioThread().start(); }else{//Write the data to an output file with the name provided by the // incoming parameter named playOrFile.try{ AudioSystem.write(audioInputStream,AudioFileFormat.Type.AU, new File(playOrFile + ".au"));}catch (Exception e) { e.printStackTrace();System.exit(0); }//end catch}//end else }catch (Exception e) {e.printStackTrace(); System.exit(0);}//end catch }//end playOrFileData//===========================================================================// //Inner class to play back the data that was saved.class PlayAudioThread extends Thread{ //This is a working buffer used to transfer the data between the// AudioInputStream and the SourceDataLine. The size is rather arbitrary. byte playBuffer[]= new byte[16384];public void run(){try{ //Open and start the SourceDataLinesourceDataLine.open(audioFormat); sourceDataLine.start();int cnt;//Get beginning of elapsed time for playback long startTime = new Date().getTime();//Transfer the audio data to the speakerswhile((cnt = audioInputStream.read( playBuffer,0,playBuffer.length)) != -1){//Keep looping until the input read method returns -1 for empty // stream.if(cnt>0){ //Write data to the internal buffer of the data line where it will// be delivered to the speakers in real time sourceDataLine.write(playBuffer, 0, cnt);}//end if }//end while//Block and wait for internal buffer of the SourceDataLine to become// empty. sourceDataLine.drain();//Get and display the elapsed time for the previous playback. int elapsedTime = (int)(new Date().getTime() - startTime);System.out.println("Elapsed time: " + elapsedTime);//Finish with the SourceDataLine sourceDataLine.stop();sourceDataLine.close(); }catch (Exception e) {e.printStackTrace(); System.exit(0);}//end catch}//end run }//end inner class PlayAudioThread//=========================================================================// }//end AudioPlayOrFile01 class

Get Jobilize Job Search Mobile App in your pocket Now!

Get it on Google Play Download on the App Store Now




Source:  OpenStax, Accessible objected-oriented programming concepts for blind students using java. OpenStax CNX. Sep 01, 2014 Download for free at https://legacy.cnx.org/content/col11349/1.17
Google Play and the Google Play logo are trademarks of Google Inc.

Notification Switch

Would you like to follow the 'Accessible objected-oriented programming concepts for blind students using java' conversation and receive update notifications?

Ask