Hey Leute,
ich arbeite mit folgender Vorlage von den oracle java tutorials:
Playing Back Audio (The Java™ Tutorials > Sound)
Die Sounds, die ich abspiele sind .wav-Dateien von 200kb - 3MB. Es scheint mir, als würden die Ressourcen nicht freigegeben, nachdem der Sound zu Ende gelaufen ist.
Jedes Mal, wenn so ein Sound abgespielt wird, geht der Speicher nach oben, bis schließlich der Heap voll ist und die Exception dafür kommt.
Hier mein Code:
Habe ich das so falsch gemacht? Vielleicht habe ich etwas übersehen.
Danke für Eure Unterstützung
Gruß Basti
ich arbeite mit folgender Vorlage von den oracle java tutorials:
Playing Back Audio (The Java™ Tutorials > Sound)
Die Sounds, die ich abspiele sind .wav-Dateien von 200kb - 3MB. Es scheint mir, als würden die Ressourcen nicht freigegeben, nachdem der Sound zu Ende gelaufen ist.
Jedes Mal, wenn so ein Sound abgespielt wird, geht der Speicher nach oben, bis schließlich der Heap voll ist und die Exception dafür kommt.
Hier mein Code:
Java:
public static Clip play(Sounds in, float volumeChange,
boolean isBackgroundMusic) throws LineUnavailableException,
IOException, UnsupportedAudioFileException {
URL url = getURL(in);
final AudioInputStream input = AudioSystem.getAudioInputStream(url);
// load the sound into memory (a Clip)
DataLine.Info info = new DataLine.Info(Clip.class, input.getFormat());
final long frameLength = input.getFrameLength();
clip = (Clip) AudioSystem.getLine(info);
clips.add(new ClipInfo(clip, isBackgroundMusic));
clip.addLineListener(new LineListener() {
@Override
public void update(LineEvent arg0) {
// check if it reached the end
if (LineEvent.Type.STOP == arg0.getType()) {
if (arg0.getFramePosition() == frameLength) {
for (ClipInfo info : SoundManager.getClips()) {
if (info.getClip().equals(clip))
SoundManager.getClips().remove(info);
}
clip.close();
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
clip = null;
}
}
}
});
clip.open(input);
FloatControl gainControl = (FloatControl) clip
.getControl(FloatControl.Type.MASTER_GAIN);
if (volumeChange <= gainControl.getMaximum()
&& volumeChange >= gainControl.getMinimum()) {
gainControl.setValue(volumeChange);
}
clip.start();
return clip;
}
Habe ich das so falsch gemacht? Vielleicht habe ich etwas übersehen.
Danke für Eure Unterstützung
Gruß Basti