/[svn]/jsampler/trunk/src/org/jsampler/view/fantasia/AudioDevicePane.java
ViewVC logotype

Annotation of /jsampler/trunk/src/org/jsampler/view/fantasia/AudioDevicePane.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1357 - (hide annotations) (download)
Sat Sep 22 17:27:06 2007 UTC (16 years, 7 months ago) by iliev
File size: 9125 byte(s)
* Added options for setting the maximum master and channel volume
  (choose Edit/Preferences)
* Fantasia: Edit instrument button is now shown on the channel
  screen only when there is loaded instrument on that channel
* Fantasia: Added options for showing additional device parameters in
  audio/MIDI device panes (Edit/Preferences, then click the `View' tab)
* Fantasia: Master volume is now fully implemented

1 iliev 1286 /*
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.view.fantasia;
24    
25     import java.awt.Dimension;
26     import java.awt.Insets;
27    
28     import java.awt.event.ActionEvent;
29     import java.awt.event.ActionListener;
30     import java.awt.event.ItemEvent;
31     import java.awt.event.ItemListener;
32    
33 iliev 1357 import java.beans.PropertyChangeEvent;
34     import java.beans.PropertyChangeListener;
35    
36 iliev 1286 import javax.swing.BorderFactory;
37     import javax.swing.Box;
38     import javax.swing.BoxLayout;
39     import javax.swing.JCheckBox;
40     import javax.swing.JComboBox;
41     import javax.swing.JLabel;
42     import javax.swing.JPanel;
43     import javax.swing.JScrollPane;
44     import javax.swing.JSpinner;
45     import javax.swing.SpinnerNumberModel;
46    
47     import javax.swing.event.ChangeEvent;
48     import javax.swing.event.ChangeListener;
49    
50 iliev 1310 import net.sf.juife.Task;
51     import net.sf.juife.event.TaskEvent;
52     import net.sf.juife.event.TaskListener;
53    
54 iliev 1286 import org.jsampler.AudioDeviceModel;
55     import org.jsampler.CC;
56    
57     import org.jsampler.event.AudioDeviceEvent;
58     import org.jsampler.event.AudioDeviceListener;
59     import org.jsampler.event.ParameterEvent;
60     import org.jsampler.event.ParameterListener;
61    
62 iliev 1310 import org.jsampler.task.Audio;
63 iliev 1286 import org.jsampler.view.ParameterTable;
64    
65     import org.linuxsampler.lscp.AudioOutputChannel;
66     import org.linuxsampler.lscp.AudioOutputDevice;
67     import org.linuxsampler.lscp.Parameter;
68    
69     import static org.jsampler.view.fantasia.FantasiaI18n.i18n;
70 iliev 1357 import static org.jsampler.view.fantasia.FantasiaPrefs.preferences;
71 iliev 1286
72     /**
73     *
74     * @author Grigor Iliev
75     */
76     public class AudioDevicePane extends DevicePane {
77     private final OptionsPane optionsPane;
78     private final ParameterTable channelParamTable = new ParameterTable();
79    
80     private final AudioDeviceModel audioDeviceModel;
81    
82    
83     /** Creates a new instance of <code>AudioDevicePane</code> */
84     public
85     AudioDevicePane(AudioDeviceModel model) {
86     audioDeviceModel = model;
87    
88     optionsPane = new OptionsPane();
89     setOptionsPane(optionsPane);
90    
91     int id = model.getDeviceId();
92     setDeviceName(i18n.getLabel("AudioDevicePane.lDevName", id));
93     }
94    
95     protected void
96     destroyDevice() {
97 iliev 1310 final Task t = new Audio.DestroyDevice(getDeviceId());
98     t.addTaskListener(new TaskListener() {
99     public void
100     taskPerformed(TaskEvent e) {
101     if(t.doneWithErrors()) restoreDevice();
102     }
103     });
104    
105     CC.getTaskQueue().add(t);
106 iliev 1286 }
107    
108     public int
109     getDeviceId() { return audioDeviceModel.getDeviceId(); }
110    
111     class OptionsPane extends PixmapPane implements ActionListener, ItemListener,
112     ChangeListener, AudioDeviceListener, ParameterListener {
113    
114     private final JCheckBox checkActive =
115     new JCheckBox(i18n.getLabel("AudioDevicePane.checkActive"));
116    
117     private final JLabel lChannels
118     = new JLabel(i18n.getLabel("AudioDevicePane.lChannels"));
119    
120     private final JSpinner spinnerChannels
121     = new JSpinner(new SpinnerNumberModel(1, 1, 50, 1));
122    
123     private final JLabel lChannel =
124     new JLabel(i18n.getLabel("AudioDevicePane.lChannel"));
125    
126     private final JComboBox cbChannel = new JComboBox();
127    
128 iliev 1357 private final ParameterTable additionalParamsTable = new ParameterTable();
129     private final JPanel additionalParamsPane = new JPanel();
130    
131 iliev 1286 OptionsPane() {
132     super(Res.gfxChannelOptions);
133    
134     setAlignmentX(LEFT_ALIGNMENT);
135    
136     setPixmapInsets(new Insets(1, 1, 1, 1));
137     setLayout(new java.awt.BorderLayout());
138     setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
139     setOpaque(false);
140    
141     PixmapPane mainPane = new PixmapPane(Res.gfxRoundBg7);
142     mainPane.setPixmapInsets(new Insets(3, 3, 3, 3));
143     mainPane.setOpaque(false);
144    
145     mainPane.setLayout(new BoxLayout(mainPane, BoxLayout.Y_AXIS));
146     mainPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
147     mainPane.setMaximumSize(new Dimension(Short.MAX_VALUE, Short.MAX_VALUE));
148    
149     JPanel p = new JPanel();
150     p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
151    
152     p.add(checkActive);
153     p.add(Box.createRigidArea(new Dimension(12, 0)));
154     p.add(lChannels);
155     p.add(Box.createRigidArea(new Dimension(5, 0)));
156     p.add(spinnerChannels);
157     p.setOpaque(false);
158    
159     mainPane.add(p);
160     mainPane.add(Box.createRigidArea(new Dimension(0, 5)));
161    
162 iliev 1357 JPanel p2 = additionalParamsPane;
163     p2.setLayout(new BoxLayout(p2, BoxLayout.Y_AXIS));
164     p2.setOpaque(false);
165    
166     p2.add(createHSeparator());
167     p2.add(Box.createRigidArea(new Dimension(0, 5)));
168    
169     JScrollPane sp = new JScrollPane(additionalParamsTable);
170    
171     sp.setPreferredSize(new Dimension(77, 90));
172     p2.add(sp);
173     mainPane.add(p2);
174    
175     mainPane.add(Box.createRigidArea(new Dimension(0, 5)));
176    
177 iliev 1286 mainPane.add(createHSeparator());
178     mainPane.add(Box.createRigidArea(new Dimension(0, 5)));
179    
180     p = new JPanel();
181     p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
182     p.setOpaque(false);
183    
184 iliev 1357 p2 = new JPanel();
185 iliev 1286 p2.setLayout(new BoxLayout(p2, BoxLayout.X_AXIS));
186     p2.add(lChannel);
187     p2.add(Box.createRigidArea(new Dimension(5, 0)));
188     p2.add(cbChannel);
189     p2.setOpaque(false);
190     p.add(p2);
191    
192     p.add(Box.createRigidArea(new Dimension(0, 5)));
193    
194 iliev 1357 sp = new JScrollPane(channelParamTable);
195 iliev 1286 sp.setPreferredSize(new Dimension(77, 90));
196     p.add(sp);
197    
198     mainPane.add(p);
199     add(mainPane);
200    
201     checkActive.setSelected(audioDeviceModel.isActive());
202     spinnerChannels.setValue(audioDeviceModel.getDeviceInfo().getChannelCount());
203    
204     cbChannel.addActionListener(this);
205     checkActive.addItemListener(this);
206     spinnerChannels.addChangeListener(this);
207     audioDeviceModel.addAudioDeviceListener(this);
208     channelParamTable.getModel().addParameterListener(this);
209    
210     AudioDeviceModel m = audioDeviceModel;
211     for(AudioOutputChannel chn : m.getDeviceInfo().getAudioChannels()) {
212     cbChannel.addItem(chn);
213     }
214 iliev 1357
215     Parameter[] pS = audioDeviceModel.getDeviceInfo().getAdditionalParameters();
216     additionalParamsTable.getModel().setParameters(pS);
217     additionalParamsTable.getModel().addParameterListener(new ParameterListener() {
218     public void
219     parameterChanged(ParameterEvent e) {
220     audioDeviceModel.setBackendDeviceParameter(e.getParameter());
221     }
222     });
223    
224     updateAdditionalParamsViewState();
225     String s = "AudioDevice.showAdditionalParameters";
226     preferences().addPropertyChangeListener(s, new PropertyChangeListener() {
227     public void
228     propertyChange(PropertyChangeEvent e) {
229     updateAdditionalParamsViewState();
230     }
231     });
232 iliev 1286 }
233    
234 iliev 1357 private void
235     updateAdditionalParamsViewState() {
236     String s = "AudioDevice.showAdditionalParameters";
237     additionalParamsPane.setVisible(preferences().getBoolProperty(s));
238     validate();
239     }
240    
241 iliev 1286 public void
242     actionPerformed(ActionEvent e) {
243     Object obj = cbChannel.getSelectedItem();
244     if(obj == null) {
245     channelParamTable.getModel().setParameters(new Parameter[0]);
246     return;
247     }
248    
249     AudioOutputChannel chn = (AudioOutputChannel)obj;
250    
251     channelParamTable.getModel().setParameters(chn.getAllParameters());
252     }
253    
254     public void
255     itemStateChanged(ItemEvent e) {
256     boolean a = checkActive.isSelected();
257     if(a != audioDeviceModel.isActive()) audioDeviceModel.setBackendActive(a);
258     }
259    
260     public void
261     stateChanged(ChangeEvent e) {
262     int c = (Integer)spinnerChannels.getValue();
263     if(c != audioDeviceModel.getDeviceInfo().getAudioChannelCount()) {
264     audioDeviceModel.setBackendChannelCount(c);
265     }
266     }
267    
268     public void
269     settingsChanged(AudioDeviceEvent e) {
270     int c = (Integer)spinnerChannels.getValue();
271     int nc = audioDeviceModel.getDeviceInfo().getAudioChannelCount();
272     if(c != nc) spinnerChannels.setValue(nc);
273    
274     boolean a = checkActive.isSelected();
275     boolean na = audioDeviceModel.isActive();
276     if(a != na) checkActive.setSelected(na);
277    
278     AudioOutputDevice d = e.getAudioDeviceModel().getDeviceInfo();
279    
280 iliev 1357 Parameter[] params = d.getAdditionalParameters();
281     additionalParamsTable.getModel().setParameters(params);
282    
283 iliev 1286 int idx = cbChannel.getSelectedIndex();
284     cbChannel.removeAllItems();
285     for(AudioOutputChannel chn : d.getAudioChannels()) cbChannel.addItem(chn);
286    
287     if(idx >= cbChannel.getModel().getSize()) idx = 0;
288    
289     if(cbChannel.getModel().getSize() > 0) cbChannel.setSelectedIndex(idx);
290     }
291    
292     public void
293     parameterChanged(ParameterEvent e) {
294     int c = cbChannel.getSelectedIndex();
295     if(c == -1) {
296     CC.getLogger().warning("There is no audio channel selected!");
297     return;
298     }
299    
300     audioDeviceModel.setBackendChannelParameter(c, e.getParameter());
301     }
302     }
303    
304     }

  ViewVC Help
Powered by ViewVC