📄 musicbase.java
字号:
package musicplayer;import java.io.File;import java.io.IOException;import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioInputStream;import javax.sound.sampled.AudioSystem;import javax.sound.sampled.LineUnavailableException;import javax.sound.sampled.SourceDataLine;import javax.sound.sampled.DataLine;public class MusicBase implements Runnable { private static final int BUFFER_SIZE = 64000; private String fileToPlay = "music.mp3"; private boolean pause = false; private boolean stop = false; private static boolean threadExit = false; private static boolean stopped = true; private static boolean paused = false; private static boolean playing = false; public static Object synch = new Object(); private Thread playerThread = null; public MusicBase() { } public void run() { while (! threadExit) { waitforSignal(); if (! stopped) playMusic(); } } public void endThread() { threadExit = true; synchronized(synch) { synch.notifyAll(); } try { Thread.sleep(500); } catch (Exception ex) {} } public void waitforSignal() { try { synchronized(synch) { synch.wait(); } } catch (Exception ex) {} } public void play() { if ((!stopped) || (paused)) return; if (playerThread == null) { playerThread = new Thread(this); playerThread.start(); try { Thread.sleep(500); } catch (Exception ex) {} } synchronized(synch) { stopped = false; synch.notifyAll(); } } public void setFileToPlay(String fname) { fileToPlay = fname; } public void playFile(String fname) { setFileToPlay(fname); play(); } public void playMusic() { byte[] audioData = new byte[BUFFER_SIZE]; AudioInputStream ais = null; SourceDataLine line = null; AudioFormat baseFormat = null; try { ais = AudioSystem.getAudioInputStream(new File (fileToPlay)); } catch (Exception e) { } if (ais != null) { baseFormat = ais.getFormat(); line = getLine(baseFormat); if (line == null) { AudioFormat decodedFormat = new AudioFormat( AudioFormat.Encoding.PCM_SIGNED, baseFormat.getSampleRate(), 16, baseFormat.getChannels(), baseFormat.getChannels() * 2, baseFormat.getSampleRate(), false); ais = AudioSystem.getAudioInputStream(decodedFormat, ais); line = getLine(decodedFormat); } } if (line == null) return; // 不能播放此文件 playing = true; line.start(); int inBytes = 0; while ((inBytes != -1) && (!stopped) && (!threadExit)) { try { inBytes = ais.read(audioData, 0, BUFFER_SIZE); } catch (IOException e) { e.printStackTrace(); } if (inBytes >= 0) { int outBytes = line.write(audioData, 0, inBytes); } if (paused) waitforSignal(); } line.drain(); line.stop(); line.close(); playing = false; } public void stop() { if(paused) return; stopped = true; waitForPlayToStop(); } public void waitForPlayToStop() { while( playing) try { Thread.sleep(500); } catch (Exception ex) {} } public void pause() { if (stopped) return; synchronized(synch) { paused = !paused; synch.notifyAll(); } } private SourceDataLine getLine(AudioFormat audioFormat) { SourceDataLine res = null; DataLine.Info info = new DataLine.Info( SourceDataLine.class, audioFormat); try { res = (SourceDataLine) AudioSystem.getLine(info); res.open(audioFormat); } catch (Exception e) { } return res; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -