-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
seems find one mp3 player that works
- Loading branch information
1 parent
8641889
commit 1cf9676
Showing
9 changed files
with
156 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,155 @@ | ||
package MultiThreadingLearning; | ||
|
||
import java.io.FileInputStream; | ||
import java.io.InputStream; | ||
|
||
import javazoom.jl.decoder.JavaLayerException; | ||
import javazoom.jl.player.AudioDevice; | ||
import javazoom.jl.player.Player; | ||
|
||
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); | ||
} | ||
} | ||
|
||
} |