Using javax.sound.sampled.Clip to play, loop, and stop multiple sounds in the game. Unexpected errors

I try to play two beeps at once during the game (Background music and effect). First, I built this piece of code using a different sound processor in java, which would handle the playback, stop, and loop of sound. This design will play background music or effect, but only one at a time. I surfed the internet and was told to use javax.sound.sampled.Clip to process sounds in order to reuse the same construct (play, stop, loop), but switched it to use javax.sound.sampled.Clip. Now I am completely lost. From what I have read so far, I did everything correctly and did not receive errors in the eclipse editor, but when I run it, I get one of two errors. In eclipse (runs on Linux), a LineUnavailableableException is thrown. In eclipse (runs on Windows 7), I get java.lang.NullPointerException in the loop () section of this code. If you could show me what I am doing wrong, or point me to the relevant documentation, I would appreciate it. I am assuming something with my code that handles Exceptions, but I'm not sure. If you see any other disgusting code errors, please let me know that I strive to be the best programmer I can and really appreciate constructive criticism. Thank you for your time.

import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.UnsupportedAudioFileException; /** * Handles play, pause, and looping of sounds for the game. * @author Tyler Thomas * */ public class Sound { private Clip myClip; public Sound(String fileName) { try { File file = new File(fileName); if (file.exists()) { Clip myClip = AudioSystem.getClip(); AudioInputStream ais = AudioSystem.getAudioInputStream(file.toURI().toURL()); myClip.open(ais); } else { throw new RuntimeException("Sound: file not found: " + fileName); } } catch (MalformedURLException e) { throw new RuntimeException("Sound: Malformed URL: " + e); } catch (UnsupportedAudioFileException e) { throw new RuntimeException("Sound: Unsupported Audio File: " + e); } catch (IOException e) { throw new RuntimeException("Sound: Input/Output Error: " + e); } catch (LineUnavailableException e) { throw new RuntimeException("Sound: Line Unavailable: " + e); } } public void play(){ myClip.setFramePosition(0); // Must always rewind! myClip.loop(0); myClip.start(); } public void loop(){ myClip.loop(Clip.LOOP_CONTINUOUSLY); } public void stop(){ myClip.stop(); } } 
+6
source share
2 answers

I managed to get the code to work and now understand Clips better. The page that helped me the most was http://www3.ntu.edu.sg/home/ehchua/programming/java/J8c_PlayingSound.html , it broke everything and helped me see where I made mistakes. Here is my last working code. As before, if you see any terrible mistakes or views in logic or style, let me know.

 import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.UnsupportedAudioFileException; /** * Handles playing, stoping, and looping of sounds for the game. * @author Tyler Thomas * */ public class Sound { private Clip clip; public Sound(String fileName) { // specify the sound to play // (assuming the sound can be played by the audio system) // from a wave File try { File file = new File(fileName); if (file.exists()) { AudioInputStream sound = AudioSystem.getAudioInputStream(file); // load the sound into memory (a Clip) clip = AudioSystem.getClip(); clip.open(sound); } else { throw new RuntimeException("Sound: file not found: " + fileName); } } catch (MalformedURLException e) { e.printStackTrace(); throw new RuntimeException("Sound: Malformed URL: " + e); } catch (UnsupportedAudioFileException e) { e.printStackTrace(); throw new RuntimeException("Sound: Unsupported Audio File: " + e); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("Sound: Input/Output Error: " + e); } catch (LineUnavailableException e) { e.printStackTrace(); throw new RuntimeException("Sound: Line Unavailable Exception Error: " + e); } // play, stop, loop the sound clip } public void play(){ clip.setFramePosition(0); // Must always rewind! clip.start(); } public void loop(){ clip.loop(Clip.LOOP_CONTINUOUSLY); } public void stop(){ clip.stop(); } } 
+14
source

I found a useful technique to stop the sound. You can copy these two classes and test it yourself. However, the clip.stop () method is more relevant to the pause method. This interferes with the reproduction of sound, yes, but it does not clear the sound from the line. As a result, the sound is still queued to play, and the new sound is not played. Thus, using the clip.close () method will clear the data in the queue and allow you to play a new sound or other action. Also note that in the following code, the sound file was placed in the project folder called "predator.wav", this sound can be any type of sound that you want to use instead of the sound that I selected, but make sure it is .wav format and the sound should be in the highest tier of the project folder.

 /* * File: KeyMap.java * Author: Andrew Peturis Chaselyn Langley; UAB EE Students * Assignment: SoundBox - EE333 Fall 2015 * Vers: 1.0.0 10/20/2015 agp - initial coding * * Credits: Dr. Green, UAB EE Engineering Professor */ import java.io.File; import java.io.IOException; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.UnsupportedAudioFileException; public class KeyMap { private char keyCode; private String song; private Clip clip; // Don't allow default constructor private KeyMap() { } public KeyMap(char keyCode, String song) throws LineUnavailableException { this.keyCode = keyCode; this.song = song; // Create an audiostream from the inputstream clip = AudioSystem.getClip(); } public boolean match(char key) { return key == keyCode; } // Play a sound using javax.sound and Clip interface public String play() { try { // Open a sound file stored in the project folder clip.open(AudioSystem.getAudioInputStream(new File(song + ".wav"))); // Play the audio clip with the audioplayer class clip.start(); // Create a sleep time of 2 seconds to prevent any action from occuring for the first // 2 seconds of the sound playing Thread.sleep(2000); } catch (LineUnavailableException | UnsupportedAudioFileException | IOException | InterruptedException e) { System.out.println("Things did not go well"); System.exit(-1); } return song; } // Stop a sound from playing and clear out the line to play another sound if need be. public void stop() { // clip.stop() will only pause the sound and still leave the sound in the line // waiting to be continued. It does not actually clear the line so a new action could be performed. clip.stop(); // clip.close(); will clear out the line and allow a new sound to play. clip.flush() was not // used because it can only flush out a line of data already performed. clip.close(); } } 

 /* * File: SoundBox.java * Author: Andrew Peturis, Chaselyn Langley; UAB EE Students * Assignment: GUI SoundBox - EE333 Fall 2015 * Vers: 1.0.0 09/08/2015 agp - initial coding */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Scanner; import javax.sound.sampled.LineUnavailableException; /** * * @author Andrew Peturis, Chaselyn Langley * */ public class SoundBox { static Scanner scanner = new Scanner(System.in); //Scanner object to read user input InputStream input; /** * @param args the command line arguments * @throws java.io.IOException */ public static void main(String[] args) throws IOException, LineUnavailableException { String line; Character firstChar; String predator = "predator"; String explosion = "explosion"; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); KeyMap[] keyedSongs = { new KeyMap('a', predator),}; while (true) { line = br.readLine(); firstChar = line.charAt(0); for (int i = 0; i < keyedSongs.length; i++) { if (keyedSongs[i].match(firstChar)) { // Notice now by running the code, after the first second of sleep time the sound can // and another sound can be played in its place keyedSongs[i].stop(); System.out.println("Played the sound: " + keyedSongs[i].play()); break; } } if (firstChar == 'q') { break; } } } } 
+2
source

Source: https://habr.com/ru/post/922655/


All Articles