⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 playbacksettings.java

📁 Java version of ABC/HR comparator v0.5. by schnofler. Runs on Sun JRE 1.5 or later
💻 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 + -