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

Annotation of /jsampler/trunk/src/org/jsampler/task/Channel.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1313 - (hide annotations) (download)
Thu Aug 30 22:44:29 2007 UTC (16 years, 8 months ago) by iliev
File size: 30042 byte(s)
* Added option for default actions when channel is created
  (choose Edit/Preferences, then click the `Defaults' tab)

1 iliev 1144 /*
2     * JSampler - a java front-end for LinuxSampler
3     *
4     * Copyright (C) 2005-2007 Grigor Iliev <grigor@grigoriliev.com>
5     *
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.task;
24    
25     import java.util.logging.Level;
26    
27     import net.sf.juife.Task;
28    
29     import org.jsampler.CC;
30     import org.jsampler.HF;
31 iliev 1313 import org.jsampler.JSPrefs;
32 iliev 1144 import org.jsampler.SamplerChannelModel;
33     import org.jsampler.SamplerModel;
34    
35     import org.linuxsampler.lscp.FxSend;
36    
37     import static org.jsampler.JSI18n.i18n;
38 iliev 1313 import static org.jsampler.JSPrefs.*;
39 iliev 1144
40    
41     /**
42     * Provides the sampler channel's specific tasks.
43     * @author Grigor Iliev
44     */
45     public class Channel {
46    
47     /** Forbits the instantiation of this class. */
48     private Channel() { }
49    
50    
51     /**
52     * This task creates a new sampler channel.\
53     */
54     public static class Add extends EnhancedTask<Integer> {
55     /** Creates a new instance of <code>Add</code>. */
56     public
57     Add() {
58     setTitle("Channel.Add_task");
59     setDescription(i18n.getMessage("Channel.Add.desc"));
60     }
61    
62     /** The entry point of the task. */
63     public void
64     run() {
65 iliev 1313 try {
66     setResult(CC.getClient().addSamplerChannel());
67    
68     JSPrefs p = CC.getViewConfig().preferences();
69     if(!p.getBoolProperty(USE_CHANNEL_DEFAULTS)) return;
70    
71     String s = p.getStringProperty(DEFAULT_ENGINE);
72     if(s != null && s.length() > 0) {
73     CC.getClient().loadSamplerEngine(s, getResult());
74     }
75    
76     s = p.getStringProperty(DEFAULT_MIDI_INPUT);
77     if(s != null && s.equals("firstDevice")) {
78     assignFirstMidiDevice();
79     } else if(s != null && s.equals("firstDeviceNextChannel")) {
80     assignFirstMidiDeviceNextChannel();
81     }
82    
83     s = p.getStringProperty(DEFAULT_AUDIO_OUTPUT);
84     if(s != null && s.equals("firstDevice")) {
85     assignFirstAudioDevice();
86     }
87     } catch(Exception x) {
88 iliev 1144 setErrorMessage(getDescription() + ": " + HF.getErrorMessage(x));
89     CC.getLogger().log(Level.FINE, getErrorMessage(), x);
90     }
91     }
92 iliev 1313
93     private void
94     assignFirstMidiDevice() throws Exception {
95     if(CC.getSamplerModel().getMidiDeviceCount() < 1) return;
96     int id = CC.getSamplerModel().getMidiDevices()[0].getDeviceId();
97     CC.getClient().setChannelMidiInputDevice(getResult(), id);
98     }
99    
100     private void
101     assignFirstMidiDeviceNextChannel() throws Exception {
102     int channelId = getResult();
103     if(CC.getSamplerModel().getMidiDeviceCount() < 1) return;
104     int id = CC.getSamplerModel().getMidiDevices()[0].getDeviceId();
105     CC.getClient().setChannelMidiInputDevice(channelId, id);
106    
107     boolean[] usedChannels = new boolean[16];
108     for(int i = 0; i < usedChannels.length; i++) usedChannels[i] = false;
109    
110     for(SamplerChannelModel m : CC.getSamplerModel().getChannels()) {
111     if(m.getChannelId() == channelId) continue;
112     if(m.getChannelInfo().getMidiInputDevice() != id) continue;
113     if(m.getChannelInfo().getMidiInputPort() != 0) continue;
114     int chn = m.getChannelInfo().getMidiInputChannel();
115     if(chn >= 0 && chn < 16) usedChannels[chn] = true;
116     }
117    
118     int lastUsed = -1;
119     for(int i = 0; i < usedChannels.length; i++) {
120     if(usedChannels[i]) lastUsed = i;
121     }
122    
123     if(lastUsed == -1) {
124     CC.getClient().setChannelMidiInputChannel(channelId, 0);
125     return;
126     }
127    
128     if(lastUsed < 15) {
129     CC.getClient().setChannelMidiInputChannel(channelId, lastUsed + 1);
130     return;
131     }
132    
133     int firstUnused = -1;
134     for(int i = 0; i < usedChannels.length; i++) {
135     if(!usedChannels[i]) {
136     firstUnused = i;
137     break;
138     }
139     }
140    
141     if(firstUnused == -1) {
142     CC.getClient().setChannelMidiInputChannel(channelId, 0);
143     return;
144     }
145    
146     CC.getClient().setChannelMidiInputChannel(channelId, firstUnused);
147     }
148    
149     private void
150     assignFirstAudioDevice() throws Exception {
151     if(CC.getSamplerModel().getAudioDeviceCount() < 1) return;
152     int id = CC.getSamplerModel().getAudioDevices()[0].getDeviceId();
153     CC.getClient().setChannelAudioOutputDevice(getResult(), id);
154     }
155 iliev 1144 }
156    
157     /**
158     * This task removes the specified sampler channel.
159     */
160     public static class Remove extends EnhancedTask {
161     private int channel;
162    
163     /**
164     * Creates new instance of <code>Remove</code>.
165     * @param channel The numerical ID of the channel to remove.
166     */
167     public
168     Remove(int channel) {
169     setTitle("Channel.Remove_task");
170     setDescription(i18n.getMessage("Channel.Remove.desc", channel));
171    
172     this.channel = channel;
173     }
174    
175     /** The entry point of the task. */
176     public void
177     run() {
178     try { CC.getClient().removeSamplerChannel(channel); }
179     catch(Exception x) {
180     setErrorMessage(getDescription() + ": " + HF.getErrorMessage(x));
181     CC.getLogger().log(Level.FINE, getErrorMessage(), x);
182     }
183     }
184     }
185    
186     /**
187     * This task resets the specified sampler channel.
188     */
189     public static class Reset extends EnhancedTask {
190     private int channel;
191    
192     /**
193     * Creates new instance of <code>Reset</code>.
194     * @param channel The numerical ID of the channel to reset.
195     */
196     public
197     Reset(int channel) {
198     setTitle("Channel.Reset_task");
199     setDescription(i18n.getMessage("Channel.Reset.desc", channel));
200    
201     this.channel = channel;
202     }
203    
204     /** The entry point of the task. */
205     public void
206     run() {
207     try { CC.getClient().resetChannel(channel); }
208     catch(Exception x) {
209     setErrorMessage(getDescription() + ": " + HF.getErrorMessage(x));
210     CC.getLogger().log(Level.FINE, getErrorMessage(), x);
211     }
212     }
213     }
214    
215     /**
216     * This task sets an audio output channel of a specific sampler channel.
217     */
218     public static class SetAudioOutputChannel extends EnhancedTask {
219     private int chn;
220     private int audioOut;
221     private int audioIn;
222    
223     /**
224     * Creates new instance of <code>SetAudioOutputChannel</code>.
225     * @param channel The sampler channel number.
226     * @param audioOut The sampler channel's audio output
227     * channel which should be rerouted.
228     * @param audioIn The audio channel of the selected audio output device where
229     * <code>audioOut</code> should be routed to.
230     */
231     public
232     SetAudioOutputChannel(int channel, int audioOut, int audioIn) {
233     setTitle("Channel.SetAudioOutputChannel_task");
234     String s = i18n.getMessage("Channel.SetAudioOutputChannel.desc", channel);
235     setDescription(s);
236    
237     this.chn = channel;
238     this.audioOut = audioOut;
239     this.audioIn = audioIn;
240     }
241    
242     /** The entry point of the task. */
243     public void
244     run() {
245     try { CC.getClient().setChannelAudioOutputChannel(chn, audioOut, audioIn); }
246     catch(Exception x) {
247     setErrorMessage(getDescription() + ": " + HF.getErrorMessage(x));
248     CC.getLogger().log(Level.FINE, getErrorMessage(), x);
249     }
250     }
251     }
252    
253     /**
254     * This task sets the audio output device of a specific sampler channel.
255     */
256     public static class SetAudioOutputDevice extends EnhancedTask {
257     private int channel;
258     private int deviceID;
259    
260     /**
261     * Creates new instance of <code>SetAudioOutputDevice</code>.
262     * @param channel The sampler channel number.
263     * @param deviceID The numerical ID of the audio output device.
264     */
265     public
266     SetAudioOutputDevice(int channel, int deviceID) {
267     setTitle("Channel.SetAudioOutputDevice_task");
268     String s = i18n.getMessage("Channel.SetAudioOutputDevice.desc", channel);
269     setDescription(s);
270    
271     this.channel = channel;
272     this.deviceID = deviceID;
273     }
274    
275     /** The entry point of the task. */
276     public void
277     run() {
278     try { CC.getClient().setChannelAudioOutputDevice(channel, deviceID); }
279     catch(Exception x) {
280     setErrorMessage(getDescription() + ": " + HF.getErrorMessage(x));
281     CC.getLogger().log(Level.FINE, getErrorMessage(), x);
282     }
283     }
284     }
285    
286     /**
287     * This task sets the MIDI input channel the specified sampler channel should listen to.
288     */
289     public static class SetMidiInputChannel extends EnhancedTask {
290     private int channel;
291     private int midiChannel;
292    
293     /**
294     * Creates new instance of <code>SetMidiInputChannel</code>.
295     * @param channel The sampler channel number.
296     * @param midiChannel The number of the new MIDI input channel where
297     * <code>channel</code> should listen to or -1 to listen on all 16 MIDI channels.
298     */
299     public
300     SetMidiInputChannel(int channel, int midiChannel) {
301     setTitle("Channel.SetMidiInputChannel_task");
302     String s = i18n.getMessage("Channel.SetMidiInputChannel.desc", channel);
303     setDescription(s);
304    
305     this.channel = channel;
306     this.midiChannel = midiChannel;
307     }
308    
309     /** The entry point of the task. */
310     public void
311     run() {
312     try { CC.getClient().setChannelMidiInputChannel(channel, midiChannel); }
313     catch(Exception x) {
314     setErrorMessage(getDescription() + ": " + HF.getErrorMessage(x));
315     CC.getLogger().log(Level.FINE, getErrorMessage(), x);
316     }
317     }
318     }
319    
320     /**
321     * This task sets the MIDI input device on a specific sampler channel.
322     */
323     public static class SetMidiInputDevice extends EnhancedTask {
324     private int channel;
325     private int deviceID;
326    
327     /**
328     * Creates new instance of <code>SetMidiInputDevice</code>.
329     * @param channel The sampler channel number.
330     * @param deviceID The numerical ID of the MIDI input device.
331     */
332     public
333     SetMidiInputDevice(int channel, int deviceID) {
334     setTitle("Channel.SetMidiInputDevice_task");
335     String s = i18n.getMessage("Channel.SetMidiInputDevice.desc", channel);
336     setDescription(s);
337    
338     this.channel = channel;
339     this.deviceID = deviceID;
340     }
341    
342     /** The entry point of the task. */
343     public void
344     run() {
345     try { CC.getClient().setChannelMidiInputDevice(channel, deviceID); }
346     catch(Exception x) {
347     setErrorMessage(getDescription() + ": " + HF.getErrorMessage(x));
348     CC.getLogger().log(Level.FINE, getErrorMessage(), x);
349     }
350     }
351     }
352    
353     /**
354     * This task sets the MIDI input port of a specific sampler channel.
355     */
356     public static class SetMidiInputPort extends EnhancedTask {
357     private int channel;
358     private int port;
359    
360     /**
361     * Creates new instance of <code>SetMidiInputPort</code>.
362     * @param channel The sampler channel number.
363     * @param port The MIDI input port number
364     * of the MIDI input device connected to the specified sampler channel.
365     */
366     public
367     SetMidiInputPort(int channel, int port) {
368     setTitle("Channel.SetMidiInputPort_task");
369     setDescription(i18n.getMessage("Channel.SetMidiInputPort.desc", channel));
370    
371     this.channel = channel;
372     this.port = port;
373     }
374    
375     /** The entry point of the task. */
376     public void
377     run() {
378     try { CC.getClient().setChannelMidiInputPort(channel, port); }
379     catch(Exception x) {
380     setErrorMessage(getDescription() + ": " + HF.getErrorMessage(x));
381     CC.getLogger().log(Level.FINE, getErrorMessage(), x);
382     }
383     }
384     }
385    
386     /**
387 iliev 1204 * This task loads a sampler engine in a specific sampler channel.
388     * @author Grigor Iliev
389     */
390     public static class LoadEngine extends EnhancedTask {
391     private String engine;
392     private int channel;
393    
394     /**
395     * Creates new instance of <code>LoadEngine</code>.
396     * @param engine The name of the engine to load.
397     * @param channel The number of the sampler channel
398     * the deployed engine should be assigned to.
399     */
400     public
401     LoadEngine(String engine, int channel) {
402     this.engine = engine;
403     this.channel = channel;
404    
405     setTitle("Channel.LoadEngine_task");
406    
407     Object[] objs = { engine, new Integer(channel) };
408     setDescription(i18n.getMessage("Channel.LoadEngine.desc", objs));
409     }
410    
411     /** The entry point of the task. */
412     public void
413     run() {
414     try { CC.getClient().loadSamplerEngine(engine, channel); }
415     catch(Exception x) {
416     setErrorMessage(getDescription() + ": " + HF.getErrorMessage(x));
417     CC.getLogger().log(Level.FINE, getErrorMessage(), x);
418     }
419     }
420     }
421    
422     /**
423     * This task loads and assigns an instrument to a sampler channel.
424     * @author Grigor Iliev
425     */
426     public static class LoadInstrument extends EnhancedTask {
427     private String filename;
428     private int instrIndex;
429     private int channel;
430    
431     /**
432     * Creates new instance of <code>LoadInstrument</code>.
433     * @param filename The name of the instrument file
434     * on the LinuxSampler instance's host system.
435     * @param instrIndex The index of the instrument in the instrument file.
436     * @param channel The number of the sampler channel the
437     * instrument should be assigned to.
438     */
439     public
440     LoadInstrument(String filename, int instrIndex, int channel) {
441     this.filename = filename;
442     this.instrIndex = instrIndex;
443     this.channel = channel;
444    
445     setTitle("Channel.LoadInstrument_task");
446     setDescription(i18n.getMessage("Channel.LoadInstrument.desc"));
447     }
448    
449     /** The entry point of the task. */
450     public void
451     run() {
452     try { CC.getClient().loadInstrument(filename, instrIndex, channel, true); }
453     catch(Exception x) {
454     setErrorMessage(getDescription() + ": " + HF.getErrorMessage(x));
455     CC.getLogger().log(Level.FINE, getErrorMessage(), x);
456     }
457     }
458     }
459    
460     /**
461 iliev 1144 * This task assigns the specifed MIDI instrument map to the specified sampler channel.
462     */
463     public static class SetMidiInstrumentMap extends EnhancedTask {
464     private int channel;
465     private int mapId;
466    
467     /**
468     * Creates new instance of <code>SetMidiInstrumentMap</code>.
469     * @param channel The sampler channel number.
470     * @param mapId The numerical ID of the MIDI instrument
471     * map that should be assigned to the specified sampler
472     * channel or <code>-1</code> to remove the current map binding.
473     */
474     public
475     SetMidiInstrumentMap(int channel, int mapId) {
476     setTitle("Channel.SetMidiInstrumentMap_task");
477     String s = i18n.getMessage("Channel.SetMidiInstrumentMap.desc", channel);
478     setDescription(s);
479    
480     this.channel = channel;
481     this.mapId = mapId;
482     }
483    
484     /** The entry point of the task. */
485     public void
486     run() {
487     try { CC.getClient().setChannelMidiInstrumentMap(channel, mapId); }
488     catch(Exception x) {
489     setErrorMessage(getDescription() + ": " + HF.getErrorMessage(x));
490     CC.getLogger().log(Level.FINE, getErrorMessage(), x);
491     }
492     }
493     }
494    
495     /**
496     * This task mutes/unmutes a specific sampler channel.
497     */
498     public static class SetMute extends EnhancedTask {
499     private int channel;
500     private boolean mute;
501    
502     /**
503     * Creates new instance of <code>SetMute</code>.
504     * @param channel The sampler channel to be muted/unmuted.
505     * @param mute If <code>true</code> the specified channel is muted,
506     * else the channel is unmuted.
507     */
508     public
509     SetMute(int channel, boolean mute) {
510     setTitle("Channel.SetMute_task");
511     setDescription(i18n.getMessage("Channel.SetMute.desc", channel));
512    
513     this.channel = channel;
514     this.mute = mute;
515     }
516    
517     /** The entry point of the task. */
518     public void
519     run() {
520     try { CC.getClient().setChannelMute(channel, mute); }
521     catch(Exception x) {
522     setErrorMessage(getDescription() + ": " + HF.getErrorMessage(x));
523     CC.getLogger().log(Level.FINE, getErrorMessage(), x);
524     }
525     }
526     }
527    
528     /**
529     * This task solos/unsolos a specific sampler channel.
530     */
531     public static class SetSolo extends EnhancedTask {
532     private int channel;
533     private boolean solo;
534    
535     /**
536     * Creates new instance of <code>SetSolo</code>.
537     * @param channel The sampler channel number.
538     * @param solo Specify <code>true</code> to solo the specified channel,
539     * <code>false</code> otherwise.
540     */
541     public
542     SetSolo(int channel, boolean solo) {
543     setTitle("Channel.SetSolo_task");
544     setDescription(i18n.getMessage("Channel.SetSolo.desc", channel));
545    
546     this.channel = channel;
547     this.solo = solo;
548     }
549    
550     /** The entry point of the task. */
551     public void
552     run() {
553     try { CC.getClient().setChannelSolo(channel, solo); }
554     catch(Exception x) {
555     setErrorMessage(getDescription() + ": " + HF.getErrorMessage(x));
556     CC.getLogger().log(Level.FINE, getErrorMessage(), x);
557     }
558     }
559     }
560    
561     /**
562     * This taks sets the volume of a specific sampler channel.
563     */
564     public static class SetVolume extends EnhancedTask {
565     private int channel;
566     private float volume;
567    
568     /**
569     * Creates new instance of <code>SetVolume</code>.
570     * @param channel The sampler channel number.
571     * @param volume The new volume value.
572     */
573     public
574     SetVolume(int channel, float volume) {
575     setTitle("Channel.SetVolume_task");
576     setDescription(i18n.getMessage("Channel.SetVolume.desc", channel));
577    
578     this.channel = channel;
579     this.volume = volume;
580     }
581    
582     /** The entry point of the task. */
583     public void
584     run() {
585     /*
586     * Because of the rapid flow of volume change tasks in some cases
587     * we need to do some optimization to decrease the traffic.
588     */
589     boolean b = true;
590     Task[] tS = CC.getTaskQueue().getPendingTasks();
591    
592     for(int i = tS.length - 1; i >= 0; i--) {
593     Task t = tS[i];
594    
595     if(t instanceof SetVolume) {
596     SetVolume scv = (SetVolume)t;
597     if(scv.getChannelId() == channel) {
598     CC.getTaskQueue().removeTask(scv);
599     }
600     }
601     }
602    
603     try { CC.getClient().setChannelVolume(channel, volume); }
604     catch(Exception x) {
605     setErrorMessage(getDescription() + ": " + HF.getErrorMessage(x));
606     CC.getLogger().log(Level.FINE, getErrorMessage(), x);
607     }
608     }
609    
610     /**
611     * Gets the ID of the channel whose volume should be changed.
612     * @return The ID of the channel whose volume should be changed.
613     */
614     public int
615     getChannelId() { return channel; }
616     }
617    
618     /**
619     * This task updates the settings of a specific sampler channel.
620     */
621     public static class UpdateInfo extends EnhancedTask {
622     private int channel;
623    
624     /**
625     * Creates new instance of <code>UpdateInfo</code>.
626     * @param channel The sampler channel to be updated.
627     */
628     public
629     UpdateInfo(int channel) {
630     setTitle("Channel.UpdateInfo_task");
631     setDescription(i18n.getMessage("Channel.UpdateInfo.desc"));
632    
633     this.channel = channel;
634     }
635    
636     /** The entry point of the task. */
637     public void
638     run() {
639     try {
640     SamplerModel sm = CC.getSamplerModel();
641     sm.updateChannel(CC.getClient().getSamplerChannelInfo(channel));
642     } catch(Exception x) {
643     /*
644     * We don't want to bother the user if error occurs when updating
645     * a channel because in most cases this happens due to a race
646     * condition between delete/update events. So we just log this
647     * error instead to indicate the failure of this task.
648     */
649     String msg = getDescription() + ": " + HF.getErrorMessage(x);
650     CC.getLogger().log(Level.INFO, msg, x);
651     }
652     }
653    
654     /**
655     * Gets the ID of the channel for which information should be obtained.
656     * @return The ID of the channel for which information should be obtained.
657     */
658     public int
659     getChannelId() { return channel; }
660     }
661    
662     /**
663     * This task creates an additional effect send on the specified sampler channel.
664     */
665     public static class AddFxSend extends EnhancedTask<Integer> {
666     private int channel;
667     private int midiCtrl;
668     private String name;
669    
670     /**
671     * Creates a new instance of <code>AddFxSend</code>.
672     * @param channel The sampler channel, on which a new effect send should be added.
673     * @param midiCtrl Defines the MIDI controller, which
674     * will be able alter the effect send level.
675     */
676     public
677     AddFxSend(int channel, int midiCtrl) {
678     this(channel, midiCtrl, null);
679     }
680    
681     /**
682     * Creates a new instance of <code>AddFxSend</code>.
683     * @param channel The sampler channel, on which a new effect send should be added.
684     * @param midiCtrl Defines the MIDI controller, which
685     * will be able alter the effect send level.
686     * @param name The name of the effect send entity.
687     * The name does not have to be unique.
688     */
689     public
690     AddFxSend(int channel, int midiCtrl, String name) {
691     setTitle("Channel.AddFxSend_task");
692     setDescription(i18n.getMessage("Channel.AddFxSend.desc"));
693     this.channel = channel;
694     this.midiCtrl = midiCtrl;
695     this.name = name;
696     }
697    
698     /** The entry point of the task. */
699     public void
700     run() {
701     try { setResult(CC.getClient().createFxSend(channel, midiCtrl, name)); }
702     catch(Exception x) {
703     setErrorMessage(getDescription() + ": " + HF.getErrorMessage(x));
704     CC.getLogger().log(Level.FINE, getErrorMessage(), x);
705     x.printStackTrace();
706     }
707     }
708     }
709    
710     /**
711     * This task removes the specified effect send on the specified sampler channel.
712     */
713     public static class RemoveFxSend extends EnhancedTask {
714     private int channel;
715     private int fxSend;
716    
717     /**
718     * Creates a new instance of <code>RemoveFxSend</code>.
719     * @param channel The sampler channel, from which an effect send should be removed.
720     * @param fxSend The ID of the effect send that should be removed.
721     */
722     public
723     RemoveFxSend(int channel, int fxSend) {
724     setTitle("Channel.RemoveFxSend_task");
725     String s = i18n.getMessage("Channel.RemoveFxSend.desc", channel, fxSend);
726     setDescription(s);
727     this.channel = channel;
728     this.fxSend = fxSend;
729     }
730    
731     /** The entry point of the task. */
732     public void
733     run() {
734     try { CC.getClient().destroyFxSend(channel, fxSend); }
735     catch(Exception x) {
736     setErrorMessage(getDescription() + ": " + HF.getErrorMessage(x));
737     CC.getLogger().log(Level.FINE, getErrorMessage(), x);
738     }
739     }
740     }
741    
742     /**
743     * This task gets the list of effect sends on the specified sampler channel.
744     */
745     public static class GetFxSends extends EnhancedTask<FxSend[]> {
746     private int channel;
747    
748     /**
749     * Creates a new instance of <code>GetFxSends</code>.
750     */
751     public
752     GetFxSends() { this(-1); }
753    
754     /**
755     * Creates a new instance of <code>GetFxSends</code>.
756     */
757     public
758     GetFxSends(int channel) {
759     setTitle("Channel.GetFxSends_task");
760     setDescription(i18n.getMessage("Channel.GetFxSends.desc", channel));
761    
762     this.channel = channel;
763     }
764    
765     /** The entry point of the task. */
766     public void
767     run() {
768     try {
769     setResult(CC.getClient().getFxSends(channel));
770     } catch(Exception x) {
771     setErrorMessage(getDescription() + ": " + HF.getErrorMessage(x));
772     CC.getLogger().log(Level.FINE, getErrorMessage(), x);
773     }
774     }
775    
776     /**
777     * Gets the channel ID.
778     */
779     public int
780     getChannel() { return channel; }
781    
782     /**
783     * Sets the channel, for which effect sends should be obtained.
784     */
785     public void
786     setChannel(int channel) {
787     this.channel = channel;
788     setDescription(i18n.getMessage("Channel.GetFxSends.desc", channel));
789     }
790     }
791    
792     /**
793     * This task updates the list of effect sends on the specified sampler channel.
794     */
795     public static class UpdateFxSends extends EnhancedTask {
796     private int channel;
797    
798     /**
799     * Creates a new instance of <code>UpdateFxSends</code>.
800     * @param channel The numerical ID of the sampler channel
801     * whose effect send list should be updated.
802     */
803     public
804     UpdateFxSends(int channel) {
805     setTitle("Channel.UpdateFxSends_task");
806     setDescription(i18n.getMessage("Channel.UpdateFxSends.desc", channel));
807    
808     this.channel = channel;
809     }
810    
811     /** The entry point of the task. */
812     public void
813     run() {
814     try {
815     SamplerChannelModel scm;
816 iliev 1204 scm = CC.getSamplerModel().getChannelById(channel);
817 iliev 1144 Integer[] fxSendIDs = CC.getClient().getFxSendIDs(channel);
818    
819     boolean found = false;
820    
821     for(FxSend fxs : scm.getFxSends()) {
822     for(int i = 0; i < fxSendIDs.length; i++) {
823     if(fxSendIDs[i] == fxs.getFxSendId()) {
824     fxSendIDs[i] = -1;
825     found = true;
826     }
827     }
828    
829     if(!found) scm.removeFxSendById(fxs.getFxSendId());
830     found = false;
831     }
832    
833     FxSend fxs;
834    
835     for(int id : fxSendIDs) {
836     if(id >= 0) {
837     fxs = CC.getClient().getFxSendInfo(channel, id);
838     scm.addFxSend(fxs);
839     }
840     }
841     } catch(Exception x) {
842     setErrorMessage(getDescription() + ": " + HF.getErrorMessage(x));
843     CC.getLogger().log(Level.FINE, getErrorMessage(), x);
844     }
845     }
846     }
847    
848     /**
849     * This task updates the settings of a specific effect send.
850     */
851     public static class UpdateFxSendInfo extends EnhancedTask {
852     private int channel;
853     private int fxSend;
854    
855     /**
856     * Creates new instance of <code>UpdateFxSendInfo</code>.
857     * @param channel The numerical ID of the sampler channel
858     * containing the effect send entity that should be updated.
859     * @param fxSend The numerical ID of the effect send
860     * that should be updated.
861     */
862     public
863     UpdateFxSendInfo(int channel, int fxSend) {
864     setTitle("Channel.UpdateFxSendInfo_task");
865     String s = "Channel.UpdateFxSendInfo.desc";
866     setDescription(i18n.getMessage(s, channel, fxSend));
867    
868     this.channel = channel;
869     this.fxSend = fxSend;
870     }
871    
872     /** The entry point of the task. */
873     public void
874     run() {
875     try {
876     SamplerChannelModel scm;
877 iliev 1204 scm = CC.getSamplerModel().getChannelById(channel);
878 iliev 1144 scm.updateFxSend(CC.getClient().getFxSendInfo(channel, fxSend));
879     } catch(Exception x) {
880     /*
881     * We don't want to bother the user if error occurs when updating
882     * an effect send because in most cases this happens due to a race
883     * condition between delete/update events. So we just log this
884     * error instead to indicate the failure of this task.
885     */
886     String msg = getDescription() + ": " + HF.getErrorMessage(x);
887     CC.getLogger().log(Level.INFO, msg, x);
888     }
889     }
890     }
891    
892     /**
893     * This taks changes the name of a specific effect send.
894     */
895     public static class SetFxSendName extends EnhancedTask {
896     private int channel;
897     private int fxSend;
898     private String name;
899    
900     /**
901     * Creates new instance of <code>SetFxSendName</code>.
902     * @param channel The sampler channel number.
903     * @param fxSend The numerical ID of the effect
904     * send, which name should be changed.
905     * @param name The new name of the effect send entity.
906     */
907     public
908     SetFxSendName(int channel, int fxSend, String name) {
909     setTitle("Channel.SetFxSendName_task");
910     String s = "Channel.SetFxSendName.desc";
911     setDescription(i18n.getMessage(s, channel, fxSend));
912    
913     this.channel = channel;
914     this.fxSend = fxSend;
915     this.name = name;
916     }
917    
918     /** The entry point of the task. */
919     public void
920     run() {
921     try { CC.getClient().setFxSendName(channel, fxSend, name); }
922     catch(Exception x) {
923     setErrorMessage(getDescription() + ": " + HF.getErrorMessage(x));
924     CC.getLogger().log(Level.FINE, getErrorMessage(), x);
925     }
926     }
927     }
928    
929     /**
930     * This taks sets the MIDI controller of a specific effect send.
931     */
932     public static class SetFxSendAudioOutputChannel extends EnhancedTask {
933     private int channel;
934     private int fxSend;
935     private int audioSrc;
936     private int audioDst;
937    
938     /**
939     * Creates new instance of <code>SetFxSendAudioOutputChannel</code>.
940     * @param channel The sampler channel number.
941     * @param fxSend The numerical ID of the effect send entity to be rerouted.
942     * @param audioSrc The numerical ID of the effect send's audio output channel,
943     * which should be rerouted.
944     * @param audioDst The audio channel of the selected audio output device
945     * where <code>audioSrc</code> should be routed to.
946     */
947     public
948     SetFxSendAudioOutputChannel(int channel, int fxSend, int audioSrc, int audioDst) {
949     setTitle("Channel.SetFxSendAudioOutputChannel_task");
950     String s = "Channel.SetFxSendAudioOutputChannel.desc";
951     setDescription(i18n.getMessage(s, channel, fxSend));
952    
953     this.channel = channel;
954     this.fxSend = fxSend;
955     this.audioSrc = audioSrc;
956     this.audioDst = audioDst;
957     }
958    
959     /** The entry point of the task. */
960     public void
961     run() {
962     try {
963     CC.getClient().setFxSendAudioOutputChannel (
964     channel, fxSend, audioSrc, audioDst
965     );
966     }
967     catch(Exception x) {
968     setErrorMessage(getDescription() + ": " + HF.getErrorMessage(x));
969     CC.getLogger().log(Level.FINE, getErrorMessage(), x);
970     }
971     }
972     }
973    
974     /**
975     * This taks sets the volume of a specific effect send.
976     */
977     public static class SetFxSendLevel extends EnhancedTask {
978     private int channel;
979     private int fxSend;
980     private float volume;
981    
982     /**
983     * Creates new instance of <code>SetFxSendLevel</code>.
984     * @param channel The sampler channel number.
985     * @param fxSend The numerical ID of the effect send, which
986     * volume should be changed.
987     * @param volume The new volume value.
988     */
989     public
990     SetFxSendLevel(int channel, int fxSend, float volume) {
991     setTitle("Channel.SetFxSendLevel_task");
992     String s = i18n.getMessage("Channel.SetFxSendLevel.desc", channel, fxSend);
993     setDescription(s);
994    
995     this.channel = channel;
996     this.fxSend = fxSend;
997     this.volume = volume;
998     }
999    
1000     /** The entry point of the task. */
1001     public void
1002     run() {
1003     try { CC.getClient().setFxSendLevel(channel, fxSend, volume); }
1004     catch(Exception x) {
1005     setErrorMessage(getDescription() + ": " + HF.getErrorMessage(x));
1006     CC.getLogger().log(Level.FINE, getErrorMessage(), x);
1007     }
1008     }
1009     }
1010    
1011     /**
1012     * This taks sets the MIDI controller of a specific effect send.
1013     */
1014     public static class SetFxSendMidiController extends EnhancedTask {
1015     private int channel;
1016     private int fxSend;
1017     private int midiCtrl;
1018    
1019     /**
1020     * Creates new instance of <code>SetFxSendMidiController</code>.
1021     * @param channel The sampler channel number.
1022     * @param fxSend The numerical ID of the effect
1023     * send, which MIDI controller should be changed.
1024     * @param midiCtrl The MIDI controller which shall be
1025     * able to modify the effect send's send level.
1026     */
1027     public
1028     SetFxSendMidiController(int channel, int fxSend, int midiCtrl) {
1029     setTitle("Channel.SetFxSendMidiController_task");
1030     String s = "Channel.SetFxSendMidiController.desc";
1031     setDescription(i18n.getMessage(s, channel, fxSend));
1032    
1033     this.channel = channel;
1034     this.fxSend = fxSend;
1035     this.midiCtrl = midiCtrl;
1036     }
1037    
1038     /** The entry point of the task. */
1039     public void
1040     run() {
1041     try { CC.getClient().setFxSendMidiController(channel, fxSend, midiCtrl); }
1042     catch(Exception x) {
1043     setErrorMessage(getDescription() + ": " + HF.getErrorMessage(x));
1044     CC.getLogger().log(Level.FINE, getErrorMessage(), x);
1045     }
1046     }
1047     }
1048    
1049     }

  ViewVC Help
Powered by ViewVC