Basic mechanisms for fading in and out.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4109 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -104,6 +104,14 @@ public class SoundManager
|
|||||||
return new SoundGroup(this, provider, sources);
|
return new SoundGroup(this, provider, sources);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a reference to the list of active streams.
|
||||||
|
*/
|
||||||
|
public ArrayList<Stream> getStreams ()
|
||||||
|
{
|
||||||
|
return _streams;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates all of the streams controlled by the manager. This should be
|
* Updates all of the streams controlled by the manager. This should be
|
||||||
* called once per frame by the application.
|
* called once per frame by the application.
|
||||||
|
|||||||
@@ -64,7 +64,9 @@ public abstract class Stream
|
|||||||
public void setGain (float gain)
|
public void setGain (float gain)
|
||||||
{
|
{
|
||||||
_gain = gain;
|
_gain = gain;
|
||||||
AL10.alSourcef(_sourceId, AL10.AL_GAIN, _gain);
|
if (_fadeMode == FadeMode.NONE) {
|
||||||
|
AL10.alSourcef(_sourceId, AL10.AL_GAIN, _gain);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -119,6 +121,33 @@ public abstract class Stream
|
|||||||
_state = AL10.AL_STOPPED;
|
_state = AL10.AL_STOPPED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fades this stream in over the specified interval. If the stream isn't
|
||||||
|
* playing, it will be started.
|
||||||
|
*/
|
||||||
|
public void fadeIn (float interval)
|
||||||
|
{
|
||||||
|
if (_state != AL10.AL_PLAYING) {
|
||||||
|
play();
|
||||||
|
}
|
||||||
|
AL10.alSourcef(_sourceId, AL10.AL_GAIN, 0f);
|
||||||
|
_fadeMode = FadeMode.IN;
|
||||||
|
_fadeInterval = interval;
|
||||||
|
_fadeElapsed = 0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fades this stream out over the specified interval.
|
||||||
|
*
|
||||||
|
* @param dispose if true, dispose of the stream when done fading out
|
||||||
|
*/
|
||||||
|
public void fadeOut (float interval, boolean dispose)
|
||||||
|
{
|
||||||
|
_fadeMode = dispose ? FadeMode.OUT_DISPOSE : FadeMode.OUT;
|
||||||
|
_fadeInterval = interval;
|
||||||
|
_fadeElapsed = 0f;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Releases the resources held by this stream and removes it from
|
* Releases the resources held by this stream and removes it from
|
||||||
* the manager.
|
* the manager.
|
||||||
@@ -151,9 +180,12 @@ public abstract class Stream
|
|||||||
*/
|
*/
|
||||||
protected void update (float time)
|
protected void update (float time)
|
||||||
{
|
{
|
||||||
|
// update fade, which may stop playing
|
||||||
|
updateFade(time);
|
||||||
if (_state != AL10.AL_PLAYING) {
|
if (_state != AL10.AL_PLAYING) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// find out how many buffers have been played
|
// find out how many buffers have been played
|
||||||
int played = AL10.alGetSourcei(_sourceId, AL10.AL_BUFFERS_PROCESSED);
|
int played = AL10.alGetSourcei(_sourceId, AL10.AL_BUFFERS_PROCESSED);
|
||||||
if (played == 0) {
|
if (played == 0) {
|
||||||
@@ -170,6 +202,27 @@ public abstract class Stream
|
|||||||
queueBuffers(played);
|
queueBuffers(played);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the gain of the stream according to the fade state.
|
||||||
|
*/
|
||||||
|
protected void updateFade (float time)
|
||||||
|
{
|
||||||
|
if (_fadeMode == FadeMode.NONE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
float alpha = Math.min((_fadeElapsed += time) / _fadeInterval, 1f);
|
||||||
|
AL10.alSourcef(_sourceId, AL10.AL_GAIN, _gain *
|
||||||
|
(_fadeMode == FadeMode.IN ? alpha : (1f - alpha)));
|
||||||
|
if (alpha == 1f) {
|
||||||
|
if (_fadeMode == FadeMode.OUT) {
|
||||||
|
stop();
|
||||||
|
} else if (_fadeMode == FadeMode.OUT_DISPOSE) {
|
||||||
|
dispose();
|
||||||
|
}
|
||||||
|
_fadeMode = FadeMode.NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Queues (up to) the specified number of buffers.
|
* Queues (up to) the specified number of buffers.
|
||||||
*/
|
*/
|
||||||
@@ -249,10 +302,16 @@ public abstract class Stream
|
|||||||
protected int _qidx, _qlen;
|
protected int _qidx, _qlen;
|
||||||
|
|
||||||
/** The pitch of the stream. */
|
/** The pitch of the stream. */
|
||||||
protected float _pitch;
|
protected float _pitch = 1f;
|
||||||
|
|
||||||
/** The gain of the stream. */
|
/** The gain of the stream. */
|
||||||
protected float _gain;
|
protected float _gain = 1f;
|
||||||
|
|
||||||
|
/** The interval and elapsed time for fading. */
|
||||||
|
protected float _fadeInterval, _fadeElapsed;
|
||||||
|
|
||||||
|
/** The type of fading being performed. */
|
||||||
|
protected FadeMode _fadeMode = FadeMode.NONE;
|
||||||
|
|
||||||
/** The buffer used to store names. */
|
/** The buffer used to store names. */
|
||||||
protected IntBuffer _nbuf;
|
protected IntBuffer _nbuf;
|
||||||
@@ -269,4 +328,7 @@ public abstract class Stream
|
|||||||
|
|
||||||
/** The number of buffers to use. */
|
/** The number of buffers to use. */
|
||||||
protected static final int NUM_BUFFERS = 4;
|
protected static final int NUM_BUFFERS = 4;
|
||||||
|
|
||||||
|
/** Fading modes. */
|
||||||
|
protected enum FadeMode { NONE, IN, OUT, OUT_DISPOSE };
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user