|
|
@ -18,18 +18,18 @@ import org.newdawn.slick.openal.SoundStore; |
|
|
|
* @author Ondřej Hruška (MightyPork) |
|
|
|
* @author Ondřej Hruška (MightyPork) |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public class SlickSound extends DeferredAudio { |
|
|
|
public class SlickSound extends DeferredAudio { |
|
|
|
|
|
|
|
|
|
|
|
private double pauseLoopPosition = 0; |
|
|
|
private double pauseLoopPosition = 0; |
|
|
|
private boolean looping = false; |
|
|
|
private boolean looping = false; |
|
|
|
private boolean paused = false; |
|
|
|
private boolean paused = false; |
|
|
|
private double lastPlayPitch = 1; |
|
|
|
private double lastPlayPitch = 1; |
|
|
|
private double lastPlayGain = 1; |
|
|
|
private double lastPlayGain = 1; |
|
|
|
|
|
|
|
|
|
|
|
/** Audio resource */ |
|
|
|
/** Audio resource */ |
|
|
|
private Audio backingAudio = null; |
|
|
|
private Audio backingAudio = null; |
|
|
|
private int sourceID; |
|
|
|
private int sourceID; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Slick-util based sound resource |
|
|
|
* Slick-util based sound resource |
|
|
|
* |
|
|
|
* |
|
|
@ -39,113 +39,122 @@ public class SlickSound extends DeferredAudio { |
|
|
|
{ |
|
|
|
{ |
|
|
|
super(resourceName); |
|
|
|
super(resourceName); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
protected void loadResource(String resource) throws IOException |
|
|
|
protected void loadResource(String resource) throws IOException |
|
|
|
{ |
|
|
|
{ |
|
|
|
final String ext = FileUtil.getExtension(resource); |
|
|
|
final String ext = FileUtil.getExtension(resource); |
|
|
|
|
|
|
|
|
|
|
|
try(final InputStream stream = FileUtil.getResource(resource)) { |
|
|
|
try(final InputStream stream = FileUtil.getResource(resource)) { |
|
|
|
|
|
|
|
|
|
|
|
if (ext.equalsIgnoreCase("ogg")) { |
|
|
|
if (ext.equalsIgnoreCase("ogg")) { |
|
|
|
backingAudio = SoundStore.get().getOgg(resource, stream); |
|
|
|
backingAudio = SoundStore.get().getOgg(resource, stream); |
|
|
|
|
|
|
|
|
|
|
|
} else if (ext.equalsIgnoreCase("wav")) { |
|
|
|
} else if (ext.equalsIgnoreCase("wav")) { |
|
|
|
backingAudio = SoundStore.get().getWAV(resource, stream); |
|
|
|
backingAudio = SoundStore.get().getWAV(resource, stream); |
|
|
|
|
|
|
|
|
|
|
|
} else if (ext.equalsIgnoreCase("aif")) { |
|
|
|
} else if (ext.equalsIgnoreCase("aif")) { |
|
|
|
backingAudio = SoundStore.get().getAIF(resource, stream); |
|
|
|
backingAudio = SoundStore.get().getAIF(resource, stream); |
|
|
|
|
|
|
|
|
|
|
|
} else if (ext.equalsIgnoreCase("mod")) { |
|
|
|
} else if (ext.equalsIgnoreCase("mod")) { |
|
|
|
backingAudio = SoundStore.get().getMOD(resource, stream); |
|
|
|
backingAudio = SoundStore.get().getMOD(resource, stream); |
|
|
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
} else { |
|
|
|
throw new RuntimeException("Invalid audio file extension."); |
|
|
|
throw new RuntimeException("Invalid audio file extension."); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void pauseLoop() |
|
|
|
public void pauseLoop() |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (!ensureLoaded()) return; |
|
|
|
if (!ensureLoaded()) return; |
|
|
|
|
|
|
|
|
|
|
|
if (isPlaying() && looping) { |
|
|
|
if (isPlaying() && looping) { |
|
|
|
pauseLoopPosition = backingAudio.getPosition(); |
|
|
|
pauseLoopPosition = backingAudio.getPosition(); |
|
|
|
stop(); |
|
|
|
stop(); |
|
|
|
paused = true; |
|
|
|
paused = true; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void resumeLoop() |
|
|
|
public void resumeLoop() |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (!ensureLoaded()) return; |
|
|
|
if (!ensureLoaded()) return; |
|
|
|
|
|
|
|
|
|
|
|
if (looping && paused) { |
|
|
|
if (looping && paused) { |
|
|
|
sourceID = backingAudio.playAsSoundEffect((float) lastPlayPitch, (float) lastPlayGain, true); |
|
|
|
sourceID = backingAudio.playAsSoundEffect((float) lastPlayPitch, (float) lastPlayGain, true); |
|
|
|
backingAudio.setPosition((float) pauseLoopPosition); |
|
|
|
backingAudio.setPosition((float) pauseLoopPosition); |
|
|
|
paused = false; |
|
|
|
paused = false; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void adjustGain(double gain) |
|
|
|
public void adjustGain(double gain) |
|
|
|
{ |
|
|
|
{ |
|
|
|
AL10.alSourcef(sourceID, AL10.AL_GAIN, (float) gain); |
|
|
|
AL10.alSourcef(sourceID, AL10.AL_GAIN, (float) gain); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void stop() |
|
|
|
public void stop() |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (!isLoaded()) return; |
|
|
|
if (!isLoaded()) return; |
|
|
|
|
|
|
|
|
|
|
|
backingAudio.stop(); |
|
|
|
backingAudio.stop(); |
|
|
|
paused = false; |
|
|
|
paused = false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public boolean isPlaying() |
|
|
|
public boolean isPlaying() |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (!isLoaded()) return false; |
|
|
|
if (!isLoaded()) return false; |
|
|
|
|
|
|
|
|
|
|
|
return backingAudio.isPlaying(); |
|
|
|
return backingAudio.isPlaying(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public boolean isPaused() |
|
|
|
public boolean isPaused() |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (!isLoaded()) return false; |
|
|
|
if (!isLoaded()) return false; |
|
|
|
|
|
|
|
|
|
|
|
return backingAudio.isPaused(); |
|
|
|
return backingAudio.isPaused(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
|
|
|
public boolean isActive() |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (!isLoaded()) return false; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return sourceID != -1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void play(double pitch, double gain, boolean loop, double x, double y, double z) |
|
|
|
public void play(double pitch, double gain, boolean loop, double x, double y, double z) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (!ensureLoaded()) return; |
|
|
|
if (!ensureLoaded()) return; |
|
|
|
|
|
|
|
|
|
|
|
this.lastPlayPitch = pitch; |
|
|
|
this.lastPlayPitch = pitch; |
|
|
|
this.lastPlayGain = gain; |
|
|
|
this.lastPlayGain = gain; |
|
|
|
looping = loop; |
|
|
|
looping = loop; |
|
|
|
|
|
|
|
|
|
|
|
sourceID = backingAudio.playAsSoundEffect((float) pitch, (float) gain, loop, (float) x, (float) y, (float) z); |
|
|
|
sourceID = backingAudio.playAsSoundEffect((float) pitch, (float) gain, loop, (float) x, (float) y, (float) z); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public void destroy() |
|
|
|
public void destroy() |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (!isLoaded() || backingAudio == null) return; |
|
|
|
if (!isLoaded() || backingAudio == null) return; |
|
|
|
|
|
|
|
|
|
|
|
backingAudio.release(); |
|
|
|
backingAudio.release(); |
|
|
|
backingAudio = null; |
|
|
|
backingAudio = null; |
|
|
|
} |
|
|
|
} |
|
|
|