/[svn]/jsampler/trunk/src/org/jsampler/DefaultAudioDeviceModel.java
ViewVC logotype

Annotation of /jsampler/trunk/src/org/jsampler/DefaultAudioDeviceModel.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2288 - (hide annotations) (download)
Wed Nov 23 21:19:44 2011 UTC (12 years, 5 months ago) by iliev
File size: 9911 byte(s)
* Added option to select a sampler engine in Add/Edit Instrument dialog
* Moved all Swing dependent code outside the JSampler core

1 iliev 787 /*
2     * JSampler - a java front-end for LinuxSampler
3     *
4 iliev 2192 * Copyright (C) 2005-2011 Grigor Iliev <grigor@grigoriliev.com>
5 iliev 787 *
6     * This file is part of JSampler.
7     *
8     * JSampler is free software; you can redistribute it and/or modify
9     * it under the terms of the GNU General Public License version 2
10     * as published by the Free Software Foundation.
11     *
12     * JSampler is distributed in the hope that it will be useful,
13     * but WITHOUT ANY WARRANTY; without even the implied warranty of
14     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     * GNU General Public License for more details.
16     *
17     * You should have received a copy of the GNU General Public License
18     * along with JSampler; if not, write to the Free Software
19     * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
20     * MA 02111-1307 USA
21     */
22    
23     package org.jsampler;
24    
25 iliev 2192 import java.util.ArrayList;
26 iliev 787
27 iliev 2288 import net.sf.juife.PDUtils;
28 iliev 787
29     import org.jsampler.event.AudioDeviceEvent;
30     import org.jsampler.event.AudioDeviceListener;
31    
32 iliev 1143 import org.jsampler.task.Audio;
33    
34 iliev 787 import org.linuxsampler.lscp.AudioOutputDevice;
35 iliev 2192 import org.linuxsampler.lscp.Effect;
36 iliev 1143 import org.linuxsampler.lscp.Parameter;
37 iliev 787
38    
39     /**
40 iliev 911 * This class provides default implementation of the <code>AudioDeviceModel</code> interface.
41 iliev 787 * @author Grigor Iliev
42     */
43     public class DefaultAudioDeviceModel implements AudioDeviceModel {
44     private AudioOutputDevice audioDevice;
45    
46 iliev 2192 private final ArrayList<AudioDeviceListener> listeners = new ArrayList<AudioDeviceListener>();
47     private final ArrayList<EffectChain> effectChains = new ArrayList<EffectChain>();
48 iliev 787
49     /**
50     * Creates a new instance of <code>DefaultAudioDeviceModel</code> using the
51     * specified non-null audio device.
52     * @param audioDevice An <code>AudioOutputDevice</code> instance providing the current
53     * settings of the audio device which will be represented by this model.
54     * @throws IllegalArgumentException If <code>audioDevice</code> is <code>null</code>.
55     */
56     public
57     DefaultAudioDeviceModel(AudioOutputDevice audioDevice) {
58     if(audioDevice == null)
59     throw new IllegalArgumentException("audioDevice must be non null");
60    
61     this.audioDevice = audioDevice;
62     }
63    
64     /**
65     * Registers the specified listener to be notified when
66     * the settings of the audio device are changed.
67     * @param l The <code>AudioDeviceListener</code> to register.
68     */
69 iliev 2192 @Override
70 iliev 787 public void
71     addAudioDeviceListener(AudioDeviceListener l) { listeners.add(l); }
72    
73     /**
74     * Removes the specified listener.
75     * @param l The <code>AudioDeviceListener</code> to remove.
76     */
77 iliev 2192 @Override
78 iliev 787 public void
79     removeAudioDeviceListener(AudioDeviceListener l) { listeners.remove(l); }
80    
81     /**
82     * Gets the numerical ID of this audio device.
83     * @return The numerical ID of this audio device or
84     * -1 if the device number is not set.
85     */
86 iliev 2192 @Override
87 iliev 787 public int
88 iliev 1143 getDeviceId() { return audioDevice.getDeviceId(); }
89 iliev 787
90     /**
91     * Gets the current settings of the audio device represented by this model.
92     * @return <code>AudioOutputDevice</code> instance providing
93     * the current settings of the audio device represented by this model.
94     */
95 iliev 2192 @Override
96 iliev 787 public AudioOutputDevice
97     getDeviceInfo() { return audioDevice; }
98    
99     /**
100     * Updates the settings of the audio device represented by this model.
101     * @param device The new audio device settings.
102     */
103 iliev 2192 @Override
104 iliev 787 public void
105     setDeviceInfo(AudioOutputDevice device) {
106     audioDevice = device;
107     fireSettingsChanged();
108     }
109    
110     /**
111     * Sets whether the audio device is enabled or disabled.
112     * @param active If <code>true</code> the audio device is enabled,
113     * else the device is disabled.
114     */
115 iliev 2192 @Override
116 iliev 787 public void
117     setActive(boolean active) {
118     if(active == getDeviceInfo().isActive()) return;
119    
120     audioDevice.setActive(active);
121     fireSettingsChanged();
122     }
123    
124     /**
125     * Determines whether the audio device is active.
126     * @return <code>true</code> if the device is enabled and <code>false</code> otherwise.
127     */
128 iliev 2192 @Override
129 iliev 787 public boolean
130     isActive() { return audioDevice.isActive(); }
131    
132     /**
133 iliev 1143 * Schedules a new task for enabling/disabling the audio device.
134     * @param active If <code>true</code> the audio device is enabled,
135     * else the device is disabled.
136     */
137 iliev 2192 @Override
138 iliev 1143 public void
139     setBackendActive(boolean active) {
140     CC.getTaskQueue().add(new Audio.EnableDevice(getDeviceId(), active));
141     }
142    
143     /**
144 iliev 1357 * Schedules a new task for altering
145     * a specific setting of the audio output device.
146     * @param prm The parameter to be set.
147     */
148 iliev 2192 @Override
149 iliev 1357 public void
150     setBackendDeviceParameter(Parameter prm) {
151     CC.getTaskQueue().add(new Audio.SetDeviceParameter(getDeviceId(), prm));
152     }
153    
154     /**
155 iliev 1143 * Schedules a new task for changing the channel number of the audio device.
156     * @param channels The new number of audio channels.
157     */
158 iliev 2192 @Override
159 iliev 1143 public void
160     setBackendChannelCount(int channels) {
161     CC.getTaskQueue().add(new Audio.SetChannelCount(getDeviceId(), channels));
162     }
163    
164     /**
165     * Schedules a new task for altering a specific
166     * setting of the specified audio output channel.
167     * @param channel The channel number.
168     * @param prm The parameter to be set.
169     */
170 iliev 2192 @Override
171 iliev 1143 public void
172     setBackendChannelParameter(int channel, Parameter prm) {
173     CC.getTaskQueue().add(new Audio.SetChannelParameter(getDeviceId(), channel, prm));
174     }
175    
176 iliev 2192 /** Gets the current number of send effect chains. */
177     @Override
178     public int
179     getSendEffectChainCount() { return effectChains.size(); }
180    
181     /** Gets the effect chain at the specified position. */
182     @Override
183     public EffectChain
184     getSendEffectChain(int chainIdx) { return effectChains.get(chainIdx); }
185    
186     @Override
187     public EffectChain
188     getSendEffectChainById(int chainId) {
189     for(int i = 0; i < getSendEffectChainCount(); i++) {
190     EffectChain chain = getSendEffectChain(i);
191     if(chain.getChainId() == chainId) return chain;
192     }
193    
194     return null;
195     }
196    
197 iliev 1143 /**
198 iliev 2200 * Gets the index of the send effect chain with ID <code>chainId</code>.
199     * @param chainId The ID of the send effect chain.
200     * @return The zero-based position of the specified send effect chain
201     * in the send effect chain list or <code>-1</code>
202     * if there is no send effect chain with ID <code>chainId</code>.
203     */
204 iliev 2288 @Override
205     public int
206     getSendEffectChainIndex(int chainId) {
207 iliev 2200 for(int i = 0; i < getSendEffectChainCount(); i++) {
208     if(getSendEffectChain(i).getChainId() == chainId) return i;
209     }
210    
211     return -1;
212     }
213    
214     /**
215 iliev 2192 * Adds the specified send effect chain to the specified audio output device.
216     */
217     @Override
218     public void
219     addSendEffectChain(EffectChain chain) {
220     effectChains.add(chain);
221     fireSendEffectChainAdded(chain);
222     }
223    
224     /**
225     * Removes the specified send effect chain from the audio output device.
226     */
227     @Override
228     public void
229     removeSendEffectChain(int chainId) {
230     for(int i = 0; i < effectChains.size(); i++) {
231     if(effectChains.get(i).getChainId() == chainId) {
232     fireSendEffectChainRemoved(effectChains.remove(i));
233     return;
234     }
235     }
236     }
237    
238 iliev 2288 @Override
239 iliev 2192 public void
240     removeAllSendEffectChains() {
241     for(int i = effectChains.size() - 1; i >= 0; i--) {
242     fireSendEffectChainRemoved(effectChains.remove(i));
243     }
244     }
245    
246     /**
247     * Schedules a new task for adding a new send effect chain and
248     * assigning it to the specified audio output device.
249     */
250     @Override
251     public void
252     addBackendSendEffectChain() {
253     CC.getTaskQueue().add(new Audio.AddSendEffectChain(getDeviceId()));
254     }
255    
256     /** Schedules a new task for removing the specified send effect chain. */
257     @Override
258     public void
259     removeBackendSendEffectChain(int chainId) {
260     CC.getTaskQueue().add(new Audio.RemoveSendEffectChain(getDeviceId(), chainId));
261     }
262    
263     /**
264     * Schedules a new task for creating new effect instances and inserting them
265     * in the specified send effect chain at the specified position.
266     */
267     @Override
268     public void
269     addBackendEffectInstances(Effect[] effects, int chainId, int index) {
270     CC.getTaskQueue().add (
271     new Audio.AddNewEffectInstances(effects, getDeviceId(), chainId, index)
272     );
273     }
274    
275     /**
276     * Schedules a new task for removing the specified
277     * effect instance from the specified send effect chain.
278     */
279     @Override
280     public void
281     removeBackendEffectInstance(int chainId, int instanceId) {
282     CC.getTaskQueue().add(new Audio.RemoveEffectInstance(getDeviceId(), chainId, instanceId));
283     }
284    
285     /**
286 iliev 787 * Notifies listeners that the settings of the audio device are changed.
287     */
288     private void
289     fireSettingsChanged() {
290 iliev 2288 PDUtils.runOnUiThread(new Runnable() {
291 iliev 1567 public void
292     run() {
293     AudioDeviceModel model = DefaultAudioDeviceModel.this;
294     fireSettingsChanged(new AudioDeviceEvent(model, model));
295     }
296     });
297 iliev 787 }
298    
299     /**
300     * Notifies listeners that the settings of the audio device are changed.
301     * This method should be invoked from the event-dispatching thread.
302     */
303     private void
304     fireSettingsChanged(final AudioDeviceEvent e) {
305 iliev 1567 CC.getSamplerModel().setModified(true);
306     for(AudioDeviceListener l : listeners) l.settingsChanged(e);
307 iliev 787 }
308 iliev 2192
309     private void
310     fireSendEffectChainAdded(final EffectChain chain) {
311 iliev 2288 PDUtils.runOnUiThread(new Runnable() {
312 iliev 2192 public void
313     run() {
314     AudioDeviceModel m = DefaultAudioDeviceModel.this;
315     fireSendEffectChainAdded(new AudioDeviceEvent(m, m, chain));
316     }
317     });
318     }
319    
320     /** This method should be invoked from the event-dispatching thread. */
321     private void
322     fireSendEffectChainAdded(final AudioDeviceEvent e) {
323     CC.getSamplerModel().setModified(true);
324     for(AudioDeviceListener l : listeners) l.sendEffectChainAdded(e);
325     }
326    
327     private void
328     fireSendEffectChainRemoved(final EffectChain chain) {
329 iliev 2288 PDUtils.runOnUiThread(new Runnable() {
330 iliev 2192 public void
331     run() {
332     AudioDeviceModel m = DefaultAudioDeviceModel.this;
333     fireSendEffectChainRemoved(new AudioDeviceEvent(m, m, chain));
334     }
335     });
336     }
337    
338     /** This method should be invoked from the event-dispatching thread. */
339     private void
340     fireSendEffectChainRemoved(final AudioDeviceEvent e) {
341     CC.getSamplerModel().setModified(true);
342     for(AudioDeviceListener l : listeners) l.sendEffectChainRemoved(e);
343     }
344 iliev 787 }

  ViewVC Help
Powered by ViewVC