📄 playbacksettings.java
字号:
package abchr.settings;
import abchr.audio.PlaybackThread;
import guiutils.FlexibleGridLayout;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListDataListener;
import javax.swing.event.ListDataEvent;
import javax.sound.sampled.Mixer;
import javax.sound.sampled.AudioSystem;
import java.util.prefs.Preferences;
import java.util.List;
import java.util.ArrayList;
import java.awt.*;
public class PlaybackSettings implements Settings {
private static class DeviceInfo {
Mixer.Info mixerInfo;
public DeviceInfo(Mixer.Info mixerInfo){this.mixerInfo=mixerInfo;}
public String toString(){return mixerInfo.getName();}
}
private JPanel panel;
private JLabel bufferSizeLabel;
private JSlider bufferSizeSlider;
private JComboBox deviceComboBox;
private boolean bufferChanged=false;
private boolean deviceChanged=false;
private Preferences prefNode;
public PlaybackSettings() {
prefNode=Preferences.userRoot().node("/abchr/playback");
PlaybackThread.getInstance().setBufferSize(prefNode.getInt("buffersize",500));
String deviceName=prefNode.get("device","");
if(!deviceName.equals("")) {
Mixer.Info[] mixerInfos=AudioSystem.getMixerInfo();
for(Mixer.Info info : mixerInfos) {
if(info.getName().equals(deviceName)) {
PlaybackThread.getInstance().setMixer(info);
break;
}
}
}
}
private DeviceInfo[] getDeviceInfos(Mixer.Info[] mixerInfos) {
List<DeviceInfo> deviceInfos=new ArrayList<DeviceInfo>();
for(Mixer.Info info : mixerInfos) {
Mixer mixer=AudioSystem.getMixer(info);
if(mixer.getSourceLineInfo().length!=0) {
deviceInfos.add(new DeviceInfo(info));
}
}
return deviceInfos.toArray(new DeviceInfo[0]);
}
private DeviceInfo findInfo(DeviceInfo[] devices,Mixer.Info info) {
for(int i=0;i<devices.length;i++) {
if(devices[i].mixerInfo.equals(info)){return devices[i];}
}
return null;
}
private void initPanel() {
if(panel!=null){return;}
panel=new JPanel(new FlexibleGridLayout(7,1,5,5,true));
JPanel playbackDevicePanel=new JPanel(new FlowLayout());
playbackDevicePanel.add(new JLabel("Playback Device: "));
DeviceInfo[] deviceInfos=getDeviceInfos(AudioSystem.getMixerInfo());
deviceComboBox=new JComboBox(deviceInfos);
deviceComboBox.setSelectedItem(findInfo(deviceInfos,PlaybackThread.getInstance().getMixer()));
deviceComboBox.getModel().addListDataListener(new ListDataListener() {
public void intervalAdded(ListDataEvent e){}
public void intervalRemoved(ListDataEvent e){}
public void contentsChanged(ListDataEvent e){deviceChanged=true;}
});
playbackDevicePanel.add(deviceComboBox);
panel.add(playbackDevicePanel);
int bufferSize=PlaybackThread.getInstance().getBufferSize();
bufferSizeLabel=new JLabel("Buffer size: "+bufferSize+" ms");
bufferSizeSlider=new JSlider(JSlider.HORIZONTAL,50,2000,bufferSize);
panel.add(bufferSizeLabel);
panel.add(bufferSizeSlider);
panel.add(new JLabel("Small buffer: low latency (better quick switching)"));
panel.add(new JLabel(" but higher probability of skips during playback"));
panel.add(new JLabel("Large buffer: high latency,"));
panel.add(new JLabel(" low probability of skips during playback"));
bufferSizeSlider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
bufferChanged=true;
bufferSizeLabel.setText("Buffer size: "+bufferSizeSlider.getValue()+" ms");
}
});
}
private static final String[] path=new String[]{"Playback"};
public String[] getPath(){return path;}
public JComponent getView() {
initPanel();
return panel;
}
public void apply() {
if(deviceChanged) {
PlaybackThread.getInstance().setMixer(((DeviceInfo)deviceComboBox.getSelectedItem()).mixerInfo);
prefNode.put("device",((DeviceInfo)deviceComboBox.getSelectedItem()).mixerInfo.getName());
deviceChanged=false;
}
if(bufferChanged) {
PlaybackThread.getInstance().setBufferSize(bufferSizeSlider.getValue());
prefNode.putInt("buffersize",PlaybackThread.getInstance().getBufferSize());
bufferChanged=false;
}
}
public void reset() {
if(panel==null){return;}
bufferSizeSlider.setValue(PlaybackThread.getInstance().getBufferSize());
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -