# Sounds abspielen, ohne sie jedesmal neu zu laden



## stevey (20. Jun 2012)

Hey Leute,
ich bin jetz bei meinem Spiel an dem Punkt angelangt, an dem ich Sounds und Musik einfügen will. Da ich das bisher noch nie in Java gemacht habe, tu ich mich auch dem entsprechend schwer. Ich verwende javax.sound.sampled.* und hab folgende Methode, um Sound abzuspielen: 

```
public void playSound(String path)
{
    try {
	     URL url = new File(path).toURI().toURL();
	     AudioInputStream audioIn = AudioSystem.getAudioInputStream(url);
	     Clip clip = AudioSystem.getClip();
	     clip.open(audioIn);
	     clip.start();
    } catch(Exception e) {e.printStackTrace();}
}
```
Nur finde ich diese Lösung nicht wirklich schön und performant, da er bei jedem Abspielen den Sound neu laden muss...vielleicht verstehe ich da auch entwas komplett falsch, aber ich weiß ned, wie ich den Sound intern speichern kann...

Ich hoffe ihr könnt mir helfen, euer stevey


----------



## Fu3L (20. Jun 2012)

```
//Bei erstmaligen Laden:
AudioClip a = Applet.newAudioClip(getClass().getClassLoader().getResource(soundFolder + "/" + name));

//später:
a.play();
```

Streams sind denke ich eher für riesige Sounds, die den Hauptspeicher zu sehr zumüllen.


----------



## stevey (20. Jun 2012)

so hatte ich es auch zuerst, aber mein Problem damit war, dass ich einen Sound nicht schnell hintereinander abspielen konnte...


----------



## stevey (22. Jun 2012)

sorry für den Doppelpost, aber hat denn keiner ne Idee?


----------



## Kr0e (22. Jun 2012)

Arbeite auch grad damit. Diese Sound schnittstelle von Javax ist nicht die schnellste/effizienteste. OpenAL könnte da Abhilfe schaffen, oder vlt. JMF...

Ich nehme allerdings dennoch die Javax Impl. Ich starte die Clips jedes mal neu in einem ThreadExecutor. GIbt für Java only keine bessere Variante leider...

Java + Media = Nein Danke! Verwende bei Mediaprojekten, sofern du kannst, lieber externe Libs oder ne andere Sprache...


----------



## Ralph-Uwe (22. Jun 2012)

Hallo,

vielleicht helfen Dir die Anhänge in der folgenden Link.

http://www.java-forum.org/spiele-mu...-mp3-lied-laenge-auslesen-jmf.html#post796554


----------



## stevey (24. Jun 2012)

@Kr0e
jaa, mit externen Bibliotheken is das immer so ne Sache, ich nimm die nur sehr ungern her...und bei deiner Implementation muss der Sound ja auch jedes mal neu geladen werden, oder?

@Ralph-Uwe
wenn ich das Programm jetzt richtig verstanden habe, dann wir da auch jedes mal der Sound neu geladen, bevor ich ihn wieder abspielen kann.


----------



## Ralph-Uwe (24. Jun 2012)

Hi,


Ich kenne kein Soundprogramm, dass eine Sounddateien im Speicher hält.
Standardmäßig werden die Sound immer von den Datenträger nachgeladen. (Ich denke 
gerade an eine Wave-Datei, die gerne mal 50MB haben kann)

Bei der Klasse Sound werden immer Datenblöcke aus der Datei gelesen und an die Soundkarte geschickt.
Das hat zur folge, dass wenig Speicher benötigt wird. Der Sound läuft in einem eigenen Thread,
so das der weitere Programmablauf durch den Sound nicht gestört wird.


Ich kann mir vorstellen eine Sounddatei in einem Array zu speichern und von dort an die 
Soundkarte zu schicken. Man müßte der Klasse Sound eine Methode hinzufügen, die ein Array 
mit dem Sound bereit stellt. Beim Starten werden dann die Daten aus dem Arry geladen statt
von einem Datenträger.


----------



## stevey (24. Jun 2012)

achso, na wenn das so üblich ist, dann kann ichs ja so lassen. Ich hab mir nur gedacht, dass das etwas unperformant ist, aber bei Sounds mit ein paar kb ist das sicher nicht so schlimm.

Danke für die Hilfe


----------

