# Kontinuierlich laufende Hintergrundmusik in Java



## GyRa (23. April 2010)

Hallo liebe User,

bin gerade dabei, ein Spiel zu programmieren und hätte da eine Frage zum Sound.

Mit diesem Quellcode habe ich es geschafft, beim Klicken auf ein Objekt, einen Sound abzuspielen.


```
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(getClass().getResourceAsStream("example.wav"));
        AudioFormat af = audioInputStream.getFormat();
        int size = (int) (af.getFrameSize() * audioInputStream.getFrameLength());
        byte[] audio = new byte[size];
        DataLine.Info info = new DataLine.Info(Clip.class, af, size);
            audioInputStream.read(audio, 0, size);
            Clip clip = (Clip) AudioSystem.getLine(info);
            clip.open(af, audio, 0, size);
            clip.start();
```

Nun möchte ich, dass ein Sound (z.B eine tickende Uhr) vom Start bis zum Beenden des Programmes läuft. Wird also das Programm gestartet läuft im Hintergrund die tickende Uhr und die läuft solange bis das Programm beendet wird.

Mit freundlichen Grüßen


----------



## vfl_freak (23. April 2010)

Moin,

ich würd's in einen eigenen Thread packen 

Gruß
Klaus


----------



## GyRa (23. April 2010)

vfl_freak hat gesagt.:


> Moin,
> 
> ich würd's in einen eigenen Thread packen
> 
> ...



Könntest du das bitte ein wenig ausführen  ?

Gruß


----------



## Billie (23. April 2010)

Auf dem Clip-Objekt gibt es eine loop-Methode der Du als speziellen Parameter die Konstante LOOP_CONTINUOUSLY übergeben kannst.

http://java.sun.com/j2se/1.5.0/docs/api/javax/sound/sampled/Clip.html#loop(int)


----------



## GyRa (23. April 2010)

Billie hat gesagt.:


> Auf dem Clip-Objekt gibt es eine loop-Methode der Du als speziellen Parameter die Konstante LOOP_CONTINUOUSLY übergeben kannst.
> 
> http://java.sun.com/j2se/1.5.0/docs/api/javax/sound/sampled/Clip.html#loop(int)



Wo füge ich denn die Konstante LOOP_CONTINOUSLY in dem von mir oben geposteten Code ein?

Sorry bin noch Anfänger was Java angeht 

Gruß


----------



## Thomas Darimont (23. April 2010)

Hallo,

schau mal hier:

```
package de.tutorials;

import static javax.sound.sampled.AudioSystem.getAudioInputStream;
import static javax.sound.sampled.AudioSystem.getClip;

import java.io.File;
import java.util.concurrent.TimeUnit;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.Clip;

public class SoundLoopExample {
  public static void main(String[] args) throws Exception {
    File audioFile = new File("c:/Windows/Media/tada.wav");

    // Läuft bereits in einem eigenen Thread
    play(audioFile);

    TimeUnit.SECONDS.sleep(10);
  }


  private static void play(File audioFile) throws Exception {
    AudioInputStream audioInputStream = getAudioInputStream(audioFile);
    Clip clip = getClip();
    clip.open(audioInputStream);
    clip.loop(Clip.LOOP_CONTINUOUSLY);
    clip.start();
  }
}
```

Gruß Tom


----------



## Billie (23. April 2010)

Vor dem Starten einfach die loop-Methode mit der Konstante aufrufen:


```
clip.loop(Clip.LOOP_CONTINUOUSLY);
```

Aber ich empfehle Dir auch folgendes Tutorial über die Sound-API:

http://fivedots.coe.psu.ac.th/~ad/jg/ch05/index.html

Eines der ersten Beispiele ist ein einfacher Media-Player welcher ebenfalls in einer Endlosschleife eine Sound-Datei abspielt.


----------



## GyRa (27. April 2010)

Hallo!

Erstmal vielen Dank für die Antworten. Hab jetzt den Code von Thomas eingebunden klappt soweit auch, nur das ich einen einzigen Sound abspielen kann, der knapp 18 KB groß ist. Sobald ich die tickende Uhr abspielen will (2.5 MB) gibt Eclipse Fehlermeldungen.


```
at java.io.FileInputStream.<init>(Unknown Source)
	at com.sun.media.sound.WaveFileReader.getAudioInputStream(Unknown Source)
	at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)
	at escape.play(escape.java:557)
	at escape.main(escape.java:584)
```

Mit freundlichen Grüßen


----------



## GyRa (30. April 2010)

Keiner ne Idee?


----------



## Thomas Darimont (30. April 2010)

Hallo,

den relevanten Teil der Exception (Welche Exception, die Fehlermeldung...) hast du leider ausgelassen...

Gruß Tom


----------



## GyRa (30. April 2010)

So, ich hab jetzt endlich geschaftt. Hab Zwar keine Ahnung woran es lag, doch es funktioniert jetzt 

Was mich noch interessieren würde, wäre die Analyse des Codes. Was passiert eigentlich genau, wenn man den unteren Code analysiert? 


```
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(getClass().getResourceAsStream("example.wav"));
        AudioFormat af = audioInputStream.getFormat();
        int size = (int) (af.getFrameSize() * audioInputStream.getFrameLength());
        byte[] audio = new byte[size];
        DataLine.Info info = new DataLine.Info(Clip.class, af, size);
            audioInputStream.read(audio, 0, size);
            Clip clip = (Clip) AudioSystem.getLine(info);
            clip.open(af, audio, 0, size);
            clip.start();
```

Wäre sehr hilfreich, wenn mir jemand kurz und bündig erklärt, was genau in diese 9 Zeilen passiert.

Leieb Grüße,

GyRa


----------



## GyRa (7. Mai 2010)

Keiner ne Idee?


----------



## Billie (7. Mai 2010)

Wenn Du es so genau wissen willst, solltest Du Dich nach Litaratur über die Java Sound API umsehen. Unter dem Link welchen ich geposted habe wird im Kapitel eigentlich auch die Sound API detailierter erklärt.


----------

