📄 javamixer.java
字号:
* Returns whether the type of a FloatControl is BALANCE or PAN. * * @param control FloatControl control * @return boolean is Balance or Pan */ private static boolean isBalanceOrPan(FloatControl control) { Control.Type type = control.getType(); return type.equals(FloatControl.Type.PAN) || type.equals(FloatControl.Type.BALANCE); } public class MixerNode extends DefaultMutableTreeNode { Mixer mixer; public MixerNode(Mixer mixer) { super(mixer.getMixerInfo(), true); this.mixer = mixer; } public Mixer getMixer() { return mixer; } } public class PortNode extends DefaultMutableTreeNode { Line port; public PortNode(Line port) { super(port.getLineInfo(), true); this.port = port; } public Line getPort() { return port; } } public class ControlNode extends DefaultMutableTreeNode { Control control; Component component; public ControlNode(Control control) { super(control.getType(), true); this.control = control; if (control instanceof BooleanControl) { component = createControlComponent((BooleanControl) control); } else if (control instanceof EnumControl) { component = createControlComponent((EnumControl) control); } else if (control instanceof FloatControl) { component = createControlComponent((FloatControl) control); } else { component = null; } } public Control getControl() { return control; } public Component getComponent() { return component; } private JComponent createControlComponent(BooleanControl control) { AbstractButton button; String strControlName = control.getType().toString(); ButtonModel model = new JavaMixer.BooleanControlButtonModel(control); button = new JCheckBox(strControlName); button.setModel(model); return button; } private JComponent createControlComponent(EnumControl control) { JPanel component = new JPanel(); String strControlName = control.getType().toString(); component.setBorder(new TitledBorder(new EtchedBorder(), strControlName)); return component; } private JComponent createControlComponent(FloatControl control) { int orientation = isBalanceOrPan(control) ? JSlider.HORIZONTAL : JSlider.VERTICAL; BoundedRangeModel model = new JavaMixer.FloatControlBoundedRangeModel(control); JSlider slider = new JSlider(model); slider.setOrientation(orientation); slider.setPaintLabels(true); slider.setPaintTicks(true); slider.setSize(10, 50); return slider; } } public class BooleanControlButtonModel extends DefaultButtonModel { private BooleanControl control; public BooleanControlButtonModel(BooleanControl control) { this.control = control; this.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setSelected(!isSelected()); } }); } public void setSelected(boolean bSelected) { control.setValue(bSelected); } public boolean isSelected() { return control.getValue(); } } public class FloatControlBoundedRangeModel extends DefaultBoundedRangeModel { private FloatControl control; private float factor; public FloatControlBoundedRangeModel(FloatControl control) { this.control = control; float range = 100; float steps = range / 100; factor = range / steps; int min = (int) (control.getMinimum() * factor); int max = (int) (control.getMaximum() * factor); int value = (int) (control.getValue() * factor); setRangeProperties(value, 0, min, max, false); } private float getScaleFactor() { return factor; } public void setValue(int nValue) { super.setValue(nValue); control.setValue((float) nValue / getScaleFactor()); } public int getValue() { return (int) (control.getValue() * getScaleFactor()); } } public static void main(String[] args) { final JavaMixer sm = new JavaMixer(); final JFrame jf = new JFrame("Mixer Test"); final JPanel jp = new JPanel(); jf.add(jp); jp.add(sm.getTree()); jf.setSize(600, 500); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); sm.getTree().addTreeSelectionListener(new TreeSelectionListener() { public void valueChanged(TreeSelectionEvent e) { TreePath path = e.getPath(); if (path.getLastPathComponent() instanceof JavaMixer.ControlNode) { JavaMixer.ControlNode controlNode = (JavaMixer.ControlNode) path.getLastPathComponent(); if (!(controlNode.getControl() instanceof CompoundControl)) { if (jp.getComponentCount() > 1) jp.remove(1); jp.add(controlNode.getComponent(), 1); jp.repaint(); } } } }); jp.add(sm.getPrefferedMasterVolume()); jp.add(sm.getPrefferedMasterVolume()); jp.add(sm.getPrefferedInputVolume()); jp.repaint(); sm.setMicrophoneInput(); sm.setMuteForMicrophoneOutput(); } public TreePath find(TreePath path, Object[] nodes) { return find2(path, nodes, 0, false); } public TreePath findByName(TreePath path, String[] names) { return find2(path, names, 0, true); } private TreePath find2(TreePath parent, Object[] nodes, int depth, boolean byName) { TreeNode node = (TreeNode) parent.getLastPathComponent(); if (depth > nodes.length - 1) { return parent; } if (node.getChildCount() >= 0) { for (Enumeration e = node.children(); e.hasMoreElements();) { TreeNode n = (TreeNode) e.nextElement(); TreePath path = parent.pathByAddingChild(n); boolean find; if (byName) { find = n.toString().toUpperCase().indexOf(nodes[depth].toString().toUpperCase()) > -1; } else { find = n.equals(nodes[depth]); } if (find) { TreePath result = find2(path, nodes, depth + 1, byName); if (result != null) { return result; } } else { TreePath result = find2(path, nodes, depth, byName); if (result != null) { return result; } } } } return null; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -