OSDN Git Service

6a68c3a2b0f478cc066388545c6af282def82ab1
[mikumikustudio/MikuMikuStudio.git] / src / com / jmex / audio / EnvironmentalPool.java
1 /*
2  * Copyright (c) 2003-2009 jMonkeyEngine
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met:
8  *
9  * * Redistributions of source code must retain the above copyright
10  *   notice, this list of conditions and the following disclaimer.
11  *
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.
15  *
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.
19  *
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.
31  */
32
33 package com.jmex.audio;
34
35 import java.util.ArrayList;
36
37 import javax.swing.event.ChangeEvent;
38 import javax.swing.event.ChangeListener;
39
40 import com.jmex.audio.AudioTrack.TrackType;
41 import com.jmex.audio.event.TrackStateAdapter;
42
43 /**
44  * A container for environmental sounds - ambient sound effects that play in
45  * head space (as opposed to a 3d location in space.)
46  * 
47  * @author Joshua Slack
48  * @version $Id: EnvironmentalPool.java,v 1.1 2007/03/06 15:29:15 nca Exp $
49  */
50 public class EnvironmentalPool {
51     private ArrayList<AudioTrack> tracks = new ArrayList<AudioTrack>();
52     private ArrayList<ChangeListener> listListeners = new ArrayList<ChangeListener>();
53
54     private float crossfadeoutTime = 3.5f;
55     private float crossfadeinTime = 3.5f;
56
57     public EnvironmentalPool() {
58     }
59     
60
61     public void addTrack(AudioTrack track) {
62         track.setType(TrackType.ENVIRONMENT);
63         if (!tracks.contains(track)) {
64             tracks.add(track);
65             fireListChanged();
66         }
67     }
68
69     public void removeTrack(AudioTrack track) {
70         track.stop();
71         track.getPlayer().cleanup();
72         tracks.remove(track);
73         fireListChanged();
74     }
75
76     private void fireListChanged() {
77         ChangeEvent e = new ChangeEvent(this);
78         
79         for (int x = 0; x < listListeners.size(); x++) {
80             listListeners.get(x).stateChanged(e);
81         }
82     }
83
84     public ArrayList<AudioTrack> getTrackList() {
85         return tracks;
86     }
87
88     public void clearTracks() {
89         stopAllTracks();
90         tracks.clear();
91         fireListChanged();
92     }
93
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()) {
98                 t.stop();
99                 if (crossfadeinTime > 0)
100                     t.fadeIn(crossfadeinTime, 1.0f);
101                 t.play();
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() {
107                         @Override
108                         public void trackFinishedFade(AudioTrack track) {
109                             track.removeTrackStateListener(this);
110                             track.stop();
111                             track.setVolume(1.0f);
112                             track.setTargetVolume(1.0f);
113                         }
114                         @Override
115                         public void trackStopped(AudioTrack track) {
116                             track.removeTrackStateListener(this);
117                             track.setVolume(1.0f);
118                             track.setTargetVolume(1.0f);
119                         }
120                     });
121                 } else
122                     t.stop();
123             }
124         }
125     }
126
127     public void stopAllTracks() {
128         for (AudioTrack t : tracks) {
129             if (t.isActive()) t.stop();
130         }
131     }
132
133     public void fadeOutAllTracks(float fadeTime) {
134         for (AudioTrack t : tracks) {
135             if (t.isActive()) t.fadeOut(fadeTime);
136         }
137     }
138
139
140     public void addSongListChangeListener(ChangeListener listener) {
141         listListeners.add(listener);
142     }
143
144     public void removeSongListChangeListener(ChangeListener listener) {
145         listListeners.remove(listener);
146     }
147
148     public void clearSongListChangeListeners() {
149         listListeners.clear();
150     }
151
152     public float getCrossfadeinTime() {
153         return crossfadeinTime;
154     }
155
156     public void setCrossfadeinTime(float crossfadeinTime) {
157         this.crossfadeinTime = crossfadeinTime;
158     }
159
160     public float getCrossfadeoutTime() {
161         return crossfadeoutTime;
162     }
163
164     public void setCrossfadeoutTime(float crossfadeoutTime) {
165         this.crossfadeoutTime = crossfadeoutTime;
166     }
167
168     public void fadeOutAndClear(float fadeTime) {
169         // remove any listeners
170         listListeners.clear();
171         
172         // fade out the current tracks.
173         fadeOutAllTracks(fadeTime);
174
175         // remove all tracks.
176         tracks.clear();
177     }
178 }