# Sound einfügen



## UbuLin (22. Sep 2016)

Hallo zusammen,
Ich habe vor einem halben Jahr angefangen Java zu programmieren und dabei habe ich schon einige halb, oder ganz fertige Spiele entwickelt. Eins fehlte jedoch immer und zwar der Sound(Soundeffeckte, Hintergrundmusik, ...). Habe schon versucht im Internet nach einer lösung zu suchen. Hat immer fast funktioniert, aber es kam dann doch die ein oder andere Fehlermeldung. Kann mir vielleicht jemand ein CodeBeispiel geben. Am besten in meinem  TestCode.
TestCode: Main

```
// Package
package testsound;

// Imports
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JFrame;

// TestSound Klasse (Hauptklasse)
public class TestSound extends JFrame {
   
    // Variablen
    private JFrame f;
    private JButton sound;
   
    static boolean playSound = false;
   
    // Konstruktor TestSound
    public TestSound() {
       
        // Hier wird das Frame erstellt
        f = new JFrame("TestSounds");
        f.setLayout(null);
        f.setSize(500, 500);
        f.setLocationRelativeTo(null);
        f.setResizable(false);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ///////////////////////////////////////////////////////////////
        // Hier wird der Button erstellt
        sound = new JButton("Hier kommt ein Sound");
        sound.setBounds((500 - 200) / 2, (500 - 60) / 2, 200, 60);
        sound.addActionListener((ActionEvent e) -> {
            if(e.getSource() == sound) {
                playSound = true;
                System.out.println("Button wurde Gedrückt");
            }
        });
        sound.setVisible(true);
        // Hier hinzugefügt
        f.add(sound);
        //////////////////////////////////////////////////////////////
        f.setVisible(true);
       
    }

    // Hauptmethode
    public static void main(String[] args) {
       
        // Hier werden die Klassen angegeben
        new Sound();
        new TestSound();

    }
   
}
```

TestCode Sound:

```
// Package
package testsound;

// Imports
import java.io.File;

// Klasse Sound
public class Sound {
   
    // Anhand dierser File soll die .wav Datei geladen werden
    static File soundFile = new File("rsc/timeBomb.wav");
   
    // Konstruktor Sound
    public Sound() {
       
    }
   
}
```

Mein Ziel ist im Prinzip das wenn man auf den Button drückt eine .wav Datei abgespielt wird.
Kann jemand von euch eventuel in der Sond Klasse einen Code für mich einfügen.
Die Sound Datei soll mit der File soundFile geladen werden.

Hoffe ich habe alles gut Auskommentiert, freue mich auf jede hilfreiche Antwort

Lg UbuLin


----------



## Sogomn (23. Sep 2016)

Es gibt mehrere Wege dafür.
Am einfachsten ist es wahrscheinlich, sich einen _Clip_ aus dem _AudioSystem_ zu holen, einen Sound per _AudioInputStream_ zu laden, und den Clip zu starten.

```
final Clip clip = AudioSystem.getClip();
final AudioInputStream in = AudioSystem.getAudioInputStream(myFile);

clip.open(in);
clip.start();
```


----------



## UbuLin (23. Sep 2016)

Erstmal vielen Dank für die schnelle Antwort,

Es hat super funktioniert wenn der Button gedrückt wird wird die clip.start() Methode aufgerufen.
Jedoch wenn ich den Button zweimal drücke kommt kein Sound mehr.
Ich habe schonmal irgendwas von clip.loop oder so etwa gehört.
Kriegt man es irgendwie hin den Sound so oft wie man will abzuspielen ?

Lg UbuLin


----------



## JStein52 (23. Sep 2016)

Ich weiss nicht wie AudioSystem arbeitet und wie du es genau bei dir eingebaut hast. Aber kann es sein dass du das abspielen selber in einem Swing-Worker machen musst der einen Schalter bereitstellt der angibt ob er gerade einen Sound abspielt und den du dann im ActionListener abfragst ?


----------



## Sogomn (23. Sep 2016)

@UbuLin Das liegt daran, dass die Position vom Clip nach dem Abspielen ganz am Ende ist.
Du könntest z.B.

```
myClip.setFramePosition(0);
```
aufrufen und den Clip erneut abspielen.

Natürlich könntest Du auch einen neuen Clip erzeugen. Dann solltest Du aber in betracht ziehen, den AudioInputStream manuell zu lesen und die Bytes zu speichern, damit Du die Datei nicht jedes mal wieder lesen musst.
Dann bräuchtest Du die andere Methode "open" aufrufen.


----------



## UbuLin (23. Sep 2016)

Das mit dem
myClip.setFramePosition(0);
hat super funktioniert.

Gibt es irgendetwas das überprüft ob der Sound fertig abgespielt wurde?


----------



## Sogomn (23. Sep 2016)

Naja, es gibt eine Methode _Clip#getFrameLength_ und eine Methode _Clip#getFramePosition_.
Wenn Du die beiden nun vergleichst...


----------

