📄 juke.java
字号:
if (currentSound instanceof Clip) { Clip clip = (Clip) currentSound; seconds = clip.getFramePosition() / clip.getFormat().getFrameRate(); } else if ( (currentSound instanceof Sequence) || (currentSound instanceof BufferedInputStream) ) { try { seconds = sequencer.getMicrosecondPosition() / 1000000.0; } catch (IllegalStateException e){ System.out.println("TEMP: IllegalStateException "+ "on sequencer.getMicrosecondPosition(): " + e); } } return seconds; } public void update(LineEvent event) { if (event.getType() == LineEvent.Type.STOP && !paused) { audioEOM = true; } } public void meta(MetaMessage message) { if (message.getType() == 47) { // 47 is end of track midiEOM = true; } } private void reportStatus(String msg) { if ((errStr = msg) != null) { System.out.println(errStr); playbackMonitor.repaint(); } if (credits != null && credits.isAlive()) { credits.interrupt(); } } public Thread getThread() { return thread; } public void start() { thread = new Thread(this); thread.setName("Juke"); thread.start(); } public void stop() { if (thread != null) { thread.interrupt(); } thread = null; } public void run() { do { table.scrollRectToVisible(new Rectangle(0,0,1,1)); for (; num < sounds.size() && thread != null; num++) { table.scrollRectToVisible(new Rectangle(0,(num+2)*(table.getRowHeight()+table.getRowMargin()),1,1)); table.setRowSelectionInterval(num, num); if( loadSound(sounds.get(num)) == true ) { playSound(); } // take a little break between sounds try { thread.sleep(222); } catch (Exception e) {break;} } num = 0; } while (loopB.isSelected() && thread != null); if (thread != null) { startB.doClick(); } thread = null; currentName = null; currentSound = null; playbackMonitor.repaint(); } public void setPan() { int value = panSlider.getValue(); if (currentSound instanceof Clip) { try { Clip clip = (Clip) currentSound; FloatControl panControl = (FloatControl) clip.getControl(FloatControl.Type.PAN); panControl.setValue(value/100.0f); } catch (Exception ex) { ex.printStackTrace(); } } else if (currentSound instanceof Sequence || currentSound instanceof BufferedInputStream) { for (int i = 0; i < channels.length; i++) { channels[i].controlChange(10, (int)(((double)value + 100.0) / 200.0 * 127.0)); } } } public void setGain() { double value = gainSlider.getValue() / 100.0; if (currentSound instanceof Clip) { try { Clip clip = (Clip) currentSound; FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN); float dB = (float) (Math.log(value==0.0?0.0001:value)/Math.log(10.0)*20.0); gainControl.setValue(dB); } catch (Exception ex) { ex.printStackTrace(); } } else if (currentSound instanceof Sequence || currentSound instanceof BufferedInputStream) { for (int i = 0; i < channels.length; i++) { channels[i].controlChange(7, (int)(value * 127.0)); } } } /** * GUI controls for start, stop, previous, next, pan and gain. */ class JukeControls extends JPanel implements ActionListener, ChangeListener { public JukeControls() { setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); JPanel p1 = new JPanel(); p1.setLayout(new BoxLayout(p1, BoxLayout.Y_AXIS)); p1.setBorder(new EmptyBorder(10,0,5,0)); JPanel p2 = new JPanel(); startB = addButton("Start", p2, sounds.size() != 0); pauseB = addButton("Pause", p2, false); p1.add(p2); JPanel p3 = new JPanel(); prevB = addButton("<<", p3, false); nextB = addButton(">>", p3, false); p1.add(p3); add(p1); JPanel p4 = new JPanel(new BorderLayout()); EmptyBorder eb = new EmptyBorder(5,20,10,20); BevelBorder bb = new BevelBorder(BevelBorder.LOWERED); p4.setBorder(new CompoundBorder(eb,bb)); p4.add(playbackMonitor); seekSlider = new JSlider(JSlider.HORIZONTAL, 0, 100, 0); seekSlider.setEnabled(false); seekSlider.addChangeListener(this); p4.add("South", seekSlider); add(p4); JPanel p5 = new JPanel(); p5.setLayout(new BoxLayout(p5, BoxLayout.X_AXIS)); p5.setBorder(new EmptyBorder(5,5,10,5)); panSlider = new JSlider(-100, 100, 0); panSlider.addChangeListener(this); TitledBorder tb = new TitledBorder(new EtchedBorder()); tb.setTitle("Pan = 0.0"); panSlider.setBorder(tb); p5.add(panSlider); gainSlider = new JSlider(0, 100, 80); gainSlider.addChangeListener(this); tb = new TitledBorder(new EtchedBorder()); tb.setTitle("Gain = 80"); gainSlider.setBorder(tb); p5.add(gainSlider); add(p5); } private JButton addButton(String name, JPanel panel, boolean state) { JButton b = new JButton(name); b.addActionListener(this); b.setEnabled(state); panel.add(b); return b; } public void stateChanged(ChangeEvent e) { JSlider slider = (JSlider) e.getSource(); int value = slider.getValue(); if (slider.equals(seekSlider)) { if (currentSound instanceof Clip) { ((Clip) currentSound).setFramePosition(value); } else if (currentSound instanceof Sequence) { long dur = ((Sequence) currentSound).getMicrosecondLength(); sequencer.setMicrosecondPosition(value * 1000); } else if (currentSound instanceof BufferedInputStream) { long dur = sequencer.getMicrosecondLength(); sequencer.setMicrosecondPosition(value * 1000); } playbackMonitor.repaint(); return; } TitledBorder tb = (TitledBorder) slider.getBorder(); String s = tb.getTitle(); if (s.startsWith("Pan")) { s = s.substring(0, s.indexOf('=')+1) + s.valueOf(value/100.0); if (currentSound != null) { setPan(); } } else if (s.startsWith("Gain")) { s = s.substring(0, s.indexOf('=')+1) + s.valueOf(value); if (currentSound != null) { setGain(); } } tb.setTitle(s); slider.repaint(); } public void setComponentsEnabled(boolean state) { seekSlider.setEnabled(state); pauseB.setEnabled(state); prevB.setEnabled(state); nextB.setEnabled(state); } public void actionPerformed(ActionEvent e) { JButton button = (JButton) e.getSource(); if (button.getText().equals("Start")) { if (credits != null) { credits.interrupt(); } paused = false; num = table.getSelectedRow(); num = num == -1 ? 0 : num; start(); button.setText("Stop"); setComponentsEnabled(true); } else if (button.getText().equals("Stop")) { credits = new Credits(); credits.start(); paused = false; stop(); button.setText("Start"); pauseB.setText("Pause"); setComponentsEnabled(false); } else if (button.getText().equals("Pause")) { paused = true; if (currentSound instanceof Clip) { ((Clip) currentSound).stop(); } else if (currentSound instanceof Sequence || currentSound instanceof BufferedInputStream) { sequencer.stop(); } playbackMonitor.stop(); pauseB.setText("Resume"); } else if (button.getText().equals("Resume")) { paused = false; if (currentSound instanceof Clip) { ((Clip) currentSound).start(); } else if (currentSound instanceof Sequence || currentSound instanceof BufferedInputStream) { sequencer.start(); } playbackMonitor.start(); pauseB.setText("Pause"); } else if (button.getText().equals("<<")) { paused = false; pauseB.setText("Pause"); num = num-1 < 0 ? sounds.size()-1 : num-2; bump = true; } else if (button.getText().equals(">>")) { paused = false; pauseB.setText("Pause"); num = num+1 == sounds.size() ? -1 : num; bump = true; } } } // End JukeControls /** * Displays current sound and time elapsed. */ public class PlaybackMonitor extends JPanel implements Runnable { String welcomeStr = "Welcome to Java Sound"; Thread pbThread; Color black = new Color(20, 20, 20); Color jfcBlue = new Color(204, 204, 255); Color jfcDarkBlue = jfcBlue.darker(); Font font24 = new Font("serif", Font.BOLD, 24); Font font28 = new Font("serif", Font.BOLD, 28); Font font42 = new Font("serif", Font.BOLD, 42); FontMetrics fm28, fm42; public PlaybackMonitor() { fm28 = getFontMetrics(font28); fm42 = getFontMetrics(font42); } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D) g; Dimension d = getSize(); g2.setBackground(black); g2.clearRect(0, 0, d.width, d.height); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setColor(jfcBlue); if (errStr != null) { g2.setFont(new Font("serif", Font.BOLD, 18)); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF); g2.drawString("ERROR", 5, 20); AttributedString as = new AttributedString(errStr); Font font12 = new Font("serif", Font.PLAIN, 12); as.addAttribute(TextAttribute.FONT, font12, 0, errStr.length()); AttributedCharacterIterator aci = as.getIterator(); FontRenderContext frc = g2.getFontRenderContext(); LineBreakMeasurer lbm = new LineBreakMeasurer(aci, frc); float x = 5, y = 25; lbm.setPosition(0); while (lbm.getPosition() < errStr.length()) { TextLayout tl = lbm.nextLayout(d.width-x-5); if (!tl.isLeftToRight()) { x = d.width - tl.getAdvance(); } tl.draw(g2, x, y += tl.getAscent()); y += tl.getDescent() + tl.getLeading(); } } else if (currentName == null) { FontRenderContext frc = g2.getFontRenderContext(); TextLayout tl = new TextLayout(welcomeStr, font28, frc); float x = (float) (d.width/2-tl.getBounds().getWidth()/2); tl.draw(g2, x, d.height/2); if (credits != null) { credits.render(d, g2); } } else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -