Sort of fixed a streaming related memory leak. Well,

streams won't leak anymore but the buffered case
technically will if you create them and drop them because
that's a different level of fix.
Also made the deleteAudioData synchronized since it can
be called from another thread pretty trivially.
And fixed a race condition that caused an IndexOutOfBounds
exception if you happen to try adjusting an AudioNode's
parameters right as it was finishing playing.


git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7506 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
PSp..om 14 years ago
parent e73e97f753
commit c75f157cbb
  1. 36
      engine/src/lwjgl-oal/com/jme3/audio/lwjgl/LwjglAudioRenderer.java

@ -299,6 +299,18 @@ public class LwjglAudioRenderer implements AudioRenderer, Runnable {
if (audioDisabled)
return;
// There is a race condition in AudioNode that can
// cause this to be called for a node that has been
// detached from its channel. For example, setVolume()
// called from the render thread may see that that AudioNode
// still has a channel value but the audio thread may
// clear that channel before setVolume() gets to call
// updateSourceParam() (because the audio stopped playing
// on its own right as the volume was set). In this case,
// it should be safe to just ignore the update
if (src.getChannel() < 0)
return;
assert src.getChannel() >= 0;
int id = channels[src.getChannel()];
@ -745,6 +757,10 @@ public class LwjglAudioRenderer implements AudioRenderer, Runnable {
src.setChannel(-1);
clearChannel(i);
freeChannel(i);
// And free the audio since it cannot be
// played again anyway.
deleteAudioData(stream);
}
}
}else if (!streaming){
@ -913,6 +929,18 @@ public class LwjglAudioRenderer implements AudioRenderer, Runnable {
src.setChannel(-1);
clearChannel(chan);
freeChannel(chan);
if (src.getAudioData() instanceof AudioStream) {
AudioStream stream = (AudioStream)src.getAudioData();
if (stream.isOpen()) {
stream.close();
}
// And free the audio since it cannot be
// played again anyway.
deleteAudioData(src.getAudioData());
}
}
}
}
@ -974,6 +1002,13 @@ public class LwjglAudioRenderer implements AudioRenderer, Runnable {
}
public void deleteAudioData(AudioData ad){
synchronized (threadLock){
while (!threadLock.get()){
try {
threadLock.wait();
} catch (InterruptedException ex) {
}
}
if (audioDisabled)
return;
@ -997,5 +1032,6 @@ public class LwjglAudioRenderer implements AudioRenderer, Runnable {
}
}
}
}
}

Loading…
Cancel
Save