Ich spiele mp3 aus einem Thread ab, dieser verfügt dazu über eine Referenz auf einen ByteArrayOutputStream, mit der noch codierten mp3. Soll die Wiedergabe gestartet werden, so werden der passende AudioInputStream und die SourceDataLine erstellt.
Um nach der Wiedergabe des Sounds alles wieder aufzuräumen rufe ich das auf:
playList.remove entfernt dabei die Referenz auf den Thread aus einer Liste in der ich die Threads verwalte, auf den Thread gibt es also keine Referenz mehr, danach rufe ich noch aus dem Thread heraus interrupt aus. Nun sollte doch eigentlich alle freigegeben sein ? Trotzdem braucht mein Programm nach dem Start nur so 33 MB, nach dem abspielen von einigen hundert kurzen Sounds (immer der gleiche) stabilisiert es sich so bei 66 Mb. (Angaben laut TaskManager)
Wenn ich die Referenz auf den Thread nicht entferne, oder zumindet die Referenzen auf dataStream und dataLine, dann gibts nen OutOfMemory. Hab ich da irgendwas übersehen ?
Java:
private void fetchStream(ByteArrayOutputStream data, AudioFormat bFormat) {
try {
AudioInputStream dataCopy = new AudioInputStream(
new ByteArrayInputStream(data.toByteArray()), bFormat, -1);
AudioFormat dFormat = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED, bFormat.getSampleRate(),
16, bFormat.getChannels(), bFormat.getChannels() * 2,
bFormat.getSampleRate(), false);
//Decodiere über mp3 SPI
dataStream = AudioSystem.getAudioInputStream(dFormat, dataCopy);
dataCopy.close();
dataLine = getLine(dataStream.getFormat());
volume = (FloatControl) dataLine
.getControl(FloatControl.Type.MASTER_GAIN);
} catch (Exception e) {
e.printStackTrace();
}
}
[...]
// Methode von [url=http://www.javazoom.net/mp3spi/documents.html]MP3 SPI documentation[/url]
private SourceDataLine getLine(AudioFormat audioFormat)
throws LineUnavailableException {
SourceDataLine res = null;
DataLine.Info info = new DataLine.Info(SourceDataLine.class,
audioFormat);
res = (SourceDataLine) AudioSystem.getLine(info);
res.open(audioFormat);
return res;
}
Um nach der Wiedergabe des Sounds alles wieder aufzuräumen rufe ich das auf:
Java:
private void clearData() {
dataLine.drain();
dataLine.stop();
dataLine.close();
dataLine = null;
try {
dataStream.close();
dataStream = null;
} catch (IOException e) {
e.printStackTrace();
}
playList.remove(this);
}
playList.remove entfernt dabei die Referenz auf den Thread aus einer Liste in der ich die Threads verwalte, auf den Thread gibt es also keine Referenz mehr, danach rufe ich noch aus dem Thread heraus interrupt aus. Nun sollte doch eigentlich alle freigegeben sein ? Trotzdem braucht mein Programm nach dem Start nur so 33 MB, nach dem abspielen von einigen hundert kurzen Sounds (immer der gleiche) stabilisiert es sich so bei 66 Mb. (Angaben laut TaskManager)
Wenn ich die Referenz auf den Thread nicht entferne, oder zumindet die Referenzen auf dataStream und dataLine, dann gibts nen OutOfMemory. Hab ich da irgendwas übersehen ?