📄 testbase.java
字号:
package test;
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 TestBase implements Runnable {
private static final int BUFFER_SIZE = 64000;
private String fileToPlay = "test.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 TestBase() {
}
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 + -