# Java Sound OutOfMemoryError



## PattXterminator (1. Dez 2009)

Also, hallo erstmal, bin neu hier ^^
Ich weiß nicht ob das der richtige Ort hierfür ist, aber da ich ja ein Spiel programmiere poste ich einfach mal hier rein...

Also, ich habe folgenden Clip Player programmiert:


```
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineListener;
import javax.sound.sampled.LineUnavailableException;


public class ClipPlayer
{

  private Clip m_clip;

  public ClipPlayer(String so)
  {
    File clipFile = new File(so);
    AudioInputStream audioInputStream = null;
    try
    {
      audioInputStream = AudioSystem.getAudioInputStream(clipFile);
    }
    catch (Exception e)
    {
      e.printStackTrace();
    }
    AudioFormat format = audioInputStream.getFormat();
    DataLine.Info info = new DataLine.Info(Clip.class, format);
    try
    {
      m_clip = (Clip)AudioSystem.getLine(info);
      m_clip.open(audioInputStream);
    }
    catch (LineUnavailableException e)
    {
      e.printStackTrace();
    }
    catch (IOException e)
    {
      e.printStackTrace();
    }
      m_clip.loop(m_clip.LOOP_CONTINUOUSLY);
    }
  
    public void stoppe()
    {
      m_clip.stop();
    }
  
    public void volume(double pVolume)
    {
      FloatControl gainControl = (FloatControl) m_clip.getControl(FloatControl.Type.MASTER_GAIN);
      float dB = (float)(Math.log(pVolume)/Math.log(10.0)*20.0);
      gainControl.setValue(dB);
    }
}
```

Dann rufe ich den Constructor aus meiner GUI heraus auf.
Das sieht dann so aus:


```
private ClipPlayer player;
private boolean btnAbspielenKlickt=false;

// Hier ist der restliche GUI Code

public void btnAbspielen_ActionPerformed(ActionEvent evt) {
    if(btnAbspielenKlickt==false)
    {
      String so = "C:/Anime/" + (String)cboxTitel.getSelectedItem() + ".wav";
      btnAbspielen.setText("Anhalten");
      player = new ClipPlayer(so);
      btnAbspielenKlickt=true;
    }
    else
    {
      btnAbspielen.setText("Abspielen");
      player.stoppe();
      btnAbspielenKlickt=false;
    }
  }
```

Dabei wird der Dateiname aus einer Combobox eingelesen, der dann dem Constructor als Dateipfad übergeben wird.

Jetzt zu meinem Problem... Ich kann damit prima die Sounds abspielen und stoppen, aber nach einiger Zeit, beim wiederholten Aufrufen des Constructors von ClipPlayer erhalte ich einen OutOfMemoryError: Java heap space. Hier sei erwähnt, dass es sich bei den Sounds nicht nur um kleine Audios handelt, sondern um ca. 1 Minute lange Tracks. Meine Frage ist jetzt, ob eine Möglichkeit besteht, den Speicher wieder freizugeben, sobald ich player.stoppe() aufrufe, oder ob es irgendwie anders möglich ist.
Vielen Dank für eure Antworten schon im Vorraus

PS: Bin noch ziemlich neu im Gebiet Sound... ^^


----------



## Soulfly (1. Dez 2009)

Mach looke looke hier:
Line (Java 2 Platform SE 5.0)

nach stop() auch close() aufrufen. Das Signalisiert der VM, dass der Garbage Collector hier aufräumen kann.

Greetz


----------



## PattXterminator (1. Dez 2009)

Ah super danke, klappt alles wunderbar ^^ Sorry, dass ich vorher nicht ordentlich geguckt hab


----------

