当前位置: 首页 > 工具软件 > JLayer > 使用案例 >

java 音乐暂停_java – JLayer – 暂停和恢复歌曲

钦良弼
2023-12-01

一个非常简单的播放器实现,真正暂停播放.它的工作原理是使用一个单独的线程来播放流并告诉玩家线程是否/何时暂停和恢复.

public class PausablePlayer {

private final static int NOTSTARTED = 0;

private final static int PLAYING = 1;

private final static int PAUSED = 2;

private final static int FINISHED = 3;

// the player actually doing all the work

private final Player player;

// locking object used to communicate with player thread

private final Object playerLock = new Object();

// status variable what player thread is doing/supposed to do

private int playerStatus = NOTSTARTED;

public PausablePlayer(final InputStream inputStream) throws JavaLayerException {

this.player = new Player(inputStream);

}

public PausablePlayer(final InputStream inputStream, final AudioDevice audioDevice) throws JavaLayerException {

this.player = new Player(inputStream, audioDevice);

}

/**

* Starts playback (resumes if paused)

*/

public void play() throws JavaLayerException {

synchronized (playerLock) {

switch (playerStatus) {

case NOTSTARTED:

final Runnable r = new Runnable() {

public void run() {

playInternal();

}

};

final Thread t = new Thread(r);

t.setDaemon(true);

t.setPriority(Thread.MAX_PRIORITY);

playerStatus = PLAYING;

t.start();

break;

case PAUSED:

resume();

break;

default:

break;

}

}

}

/**

* Pauses playback. Returns true if new state is PAUSED.

*/

public boolean pause() {

synchronized (playerLock) {

if (playerStatus == PLAYING) {

playerStatus = PAUSED;

}

return playerStatus == PAUSED;

}

}

/**

* Resumes playback. Returns true if the new state is PLAYING.

*/

public boolean resume() {

synchronized (playerLock) {

if (playerStatus == PAUSED) {

playerStatus = PLAYING;

playerLock.notifyAll();

}

return playerStatus == PLAYING;

}

}

/**

* Stops playback. If not playing, does nothing

*/

public void stop() {

synchronized (playerLock) {

playerStatus = FINISHED;

playerLock.notifyAll();

}

}

private void playInternal() {

while (playerStatus != FINISHED) {

try {

if (!player.play(1)) {

break;

}

} catch (final JavaLayerException e) {

break;

}

// check if paused or terminated

synchronized (playerLock) {

while (playerStatus == PAUSED) {

try {

playerLock.wait();

} catch (final InterruptedException e) {

// terminate player

break;

}

}

}

}

close();

}

/**

* Closes the player, regardless of current state.

*/

public void close() {

synchronized (playerLock) {

playerStatus = FINISHED;

}

try {

player.close();

} catch (final Exception e) {

// ignore, we are terminating anyway

}

}

// demo how to use

public static void main(String[] argv) {

try {

FileInputStream input = new FileInputStream("myfile.mp3");

PausablePlayer player = new PausablePlayer(input);

// start playing

player.play();

// after 5 secs, pause

Thread.sleep(5000);

player.pause();

// after 5 secs, resume

Thread.sleep(5000);

player.resume();

} catch (final Exception e) {

throw new RuntimeException(e);

}

}

}

 类似资料: