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