2 * Copyright (c) 2003-2009 jMonkeyEngine
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 package com.jmex.audio;
35 import java.util.ArrayList;
37 import javax.swing.event.ChangeEvent;
38 import javax.swing.event.ChangeListener;
40 import com.jmex.audio.AudioTrack.TrackType;
41 import com.jmex.audio.event.TrackStateAdapter;
44 * A container for environmental sounds - ambient sound effects that play in
45 * head space (as opposed to a 3d location in space.)
47 * @author Joshua Slack
48 * @version $Id: EnvironmentalPool.java,v 1.1 2007/03/06 15:29:15 nca Exp $
50 public class EnvironmentalPool {
51 private ArrayList<AudioTrack> tracks = new ArrayList<AudioTrack>();
52 private ArrayList<ChangeListener> listListeners = new ArrayList<ChangeListener>();
54 private float crossfadeoutTime = 3.5f;
55 private float crossfadeinTime = 3.5f;
57 public EnvironmentalPool() {
61 public void addTrack(AudioTrack track) {
62 track.setType(TrackType.ENVIRONMENT);
63 if (!tracks.contains(track)) {
69 public void removeTrack(AudioTrack track) {
71 track.getPlayer().cleanup();
76 private void fireListChanged() {
77 ChangeEvent e = new ChangeEvent(this);
79 for (int x = 0; x < listListeners.size(); x++) {
80 listListeners.get(x).stateChanged(e);
84 public ArrayList<AudioTrack> getTrackList() {
88 public void clearTracks() {
94 public void update(float dt) {
95 for (int x = tracks.size(); --x >= 0; ) {
96 AudioTrack t = tracks.get(x);
97 if (t.isEnabled() && !t.isActive()) {
99 if (crossfadeinTime > 0)
100 t.fadeIn(crossfadeinTime, 1.0f);
102 } else if (!t.isEnabled() && t.isActive()) {
103 if (crossfadeoutTime > 0) {
104 if (t.getVolume() != t.getTargetVolume()) continue; // already fading
105 t.fadeOut(crossfadeoutTime);
106 t.addTrackStateListener(new TrackStateAdapter() {
108 public void trackFinishedFade(AudioTrack track) {
109 track.removeTrackStateListener(this);
111 track.setVolume(1.0f);
112 track.setTargetVolume(1.0f);
115 public void trackStopped(AudioTrack track) {
116 track.removeTrackStateListener(this);
117 track.setVolume(1.0f);
118 track.setTargetVolume(1.0f);
127 public void stopAllTracks() {
128 for (AudioTrack t : tracks) {
129 if (t.isActive()) t.stop();
133 public void fadeOutAllTracks(float fadeTime) {
134 for (AudioTrack t : tracks) {
135 if (t.isActive()) t.fadeOut(fadeTime);
140 public void addSongListChangeListener(ChangeListener listener) {
141 listListeners.add(listener);
144 public void removeSongListChangeListener(ChangeListener listener) {
145 listListeners.remove(listener);
148 public void clearSongListChangeListeners() {
149 listListeners.clear();
152 public float getCrossfadeinTime() {
153 return crossfadeinTime;
156 public void setCrossfadeinTime(float crossfadeinTime) {
157 this.crossfadeinTime = crossfadeinTime;
160 public float getCrossfadeoutTime() {
161 return crossfadeoutTime;
164 public void setCrossfadeoutTime(float crossfadeoutTime) {
165 this.crossfadeoutTime = crossfadeoutTime;
168 public void fadeOutAndClear(float fadeTime) {
169 // remove any listeners
170 listListeners.clear();
172 // fade out the current tracks.
173 fadeOutAllTracks(fadeTime);
175 // remove all tracks.