Merge pull request #23 from fluddokt/omaster
Fixes Music Ended (hopefully)
This commit is contained in:
commit
64f5d5032d
|
@ -252,6 +252,7 @@ public class MusicController {
|
||||||
*/
|
*/
|
||||||
public static void play(boolean loop) {
|
public static void play(boolean loop) {
|
||||||
if (trackExists()) {
|
if (trackExists()) {
|
||||||
|
trackEnded = false;
|
||||||
if (loop)
|
if (loop)
|
||||||
player.loop();
|
player.loop();
|
||||||
else
|
else
|
||||||
|
|
|
@ -49,6 +49,9 @@ public class Music {
|
||||||
/** The music currently being played or null if none */
|
/** The music currently being played or null if none */
|
||||||
private static Music currentMusic;
|
private static Music currentMusic;
|
||||||
|
|
||||||
|
/** The lock object for synchronized modification to Music*/
|
||||||
|
private static Object musicLock = new Object();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Poll the state of the current music. This causes streaming music
|
* Poll the state of the current music. This causes streaming music
|
||||||
* to stream and checks listeners. Note that if you're using a game container
|
* to stream and checks listeners. Note that if you're using a game container
|
||||||
|
@ -57,16 +60,18 @@ public class Music {
|
||||||
* @param delta The amount of time since last poll
|
* @param delta The amount of time since last poll
|
||||||
*/
|
*/
|
||||||
public static void poll(int delta) {
|
public static void poll(int delta) {
|
||||||
if (currentMusic != null) {
|
synchronized (musicLock) {
|
||||||
SoundStore.get().poll(delta);
|
if (currentMusic != null) {
|
||||||
if (!SoundStore.get().isMusicPlaying()) {
|
SoundStore.get().poll(delta);
|
||||||
if (!currentMusic.positioning && !currentMusic.playing) {
|
if (!SoundStore.get().isMusicPlaying()) {
|
||||||
Music oldMusic = currentMusic;
|
if (!currentMusic.positioning) {
|
||||||
currentMusic = null;
|
Music oldMusic = currentMusic;
|
||||||
oldMusic.fireMusicEnded();
|
currentMusic = null;
|
||||||
|
oldMusic.fireMusicEnded();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
currentMusic.update(delta);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
currentMusic.update(delta);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -155,7 +160,9 @@ public class Music {
|
||||||
try {
|
try {
|
||||||
if (ref.toLowerCase().endsWith(".ogg") || ref.toLowerCase().endsWith(".mp3")) {
|
if (ref.toLowerCase().endsWith(".ogg") || ref.toLowerCase().endsWith(".mp3")) {
|
||||||
if (streamingHint) {
|
if (streamingHint) {
|
||||||
sound = SoundStore.get().getOggStream(url);
|
synchronized (musicLock) {
|
||||||
|
sound = SoundStore.get().getOggStream(url);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
sound = SoundStore.get().getOgg(url.openStream());
|
sound = SoundStore.get().getOgg(url.openStream());
|
||||||
}
|
}
|
||||||
|
@ -187,7 +194,12 @@ public class Music {
|
||||||
try {
|
try {
|
||||||
if (ref.toLowerCase().endsWith(".ogg") || ref.toLowerCase().endsWith(".mp3")) {
|
if (ref.toLowerCase().endsWith(".ogg") || ref.toLowerCase().endsWith(".mp3")) {
|
||||||
if (streamingHint) {
|
if (streamingHint) {
|
||||||
sound = SoundStore.get().getOggStream(ref);
|
synchronized (musicLock) {
|
||||||
|
//getting a stream ends the current stream....
|
||||||
|
//which may cause a MusicEnded instead of of MusicSwap
|
||||||
|
//Not that it really matters for MusicController use
|
||||||
|
sound = SoundStore.get().getOggStream(ref);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
sound = SoundStore.get().getOgg(ref);
|
sound = SoundStore.get().getOgg(ref);
|
||||||
}
|
}
|
||||||
|
@ -286,22 +298,24 @@ public class Music {
|
||||||
* @param loop if false the music is played once, the music is looped otherwise
|
* @param loop if false the music is played once, the music is looped otherwise
|
||||||
*/
|
*/
|
||||||
private void startMusic(float pitch, float volume, boolean loop) {
|
private void startMusic(float pitch, float volume, boolean loop) {
|
||||||
if (currentMusic != null) {
|
synchronized (musicLock) {
|
||||||
currentMusic.stop();
|
if (currentMusic != null) {
|
||||||
currentMusic.fireMusicSwapped(this);
|
currentMusic.stop();
|
||||||
}
|
currentMusic.fireMusicSwapped(this);
|
||||||
|
}
|
||||||
|
|
||||||
if (volume < 0.0f)
|
if (volume < 0.0f)
|
||||||
volume = 0.0f;
|
volume = 0.0f;
|
||||||
if (volume > 1.0f)
|
if (volume > 1.0f)
|
||||||
volume = 1.0f;
|
volume = 1.0f;
|
||||||
|
|
||||||
playing = true;
|
playing = true;
|
||||||
currentMusic = this;
|
currentMusic = this;
|
||||||
sound.playAsMusic(pitch, volume, loop);
|
sound.playAsMusic(pitch, volume, loop);
|
||||||
setVolume(volume);
|
setVolume(volume);
|
||||||
if (requiredPosition != -1) {
|
if (requiredPosition != -1) {
|
||||||
setPosition(requiredPosition);
|
setPosition(requiredPosition);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -317,7 +331,10 @@ public class Music {
|
||||||
* Stop the music playing
|
* Stop the music playing
|
||||||
*/
|
*/
|
||||||
public void stop() {
|
public void stop() {
|
||||||
sound.stop();
|
synchronized (musicLock) {
|
||||||
|
playing = false;
|
||||||
|
sound.stop();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -414,19 +431,21 @@ public class Music {
|
||||||
* @return True if the seek was successful
|
* @return True if the seek was successful
|
||||||
*/
|
*/
|
||||||
public boolean setPosition(float position) {
|
public boolean setPosition(float position) {
|
||||||
if (playing) {
|
synchronized (musicLock) {
|
||||||
requiredPosition = -1;
|
if (playing) {
|
||||||
|
requiredPosition = -1;
|
||||||
|
|
||||||
positioning = true;
|
positioning = true;
|
||||||
playing = false;
|
playing = false;
|
||||||
boolean result = sound.setPosition(position);
|
boolean result = sound.setPosition(position);
|
||||||
playing = true;
|
playing = true;
|
||||||
positioning = false;
|
positioning = false;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
} else {
|
} else {
|
||||||
requiredPosition = position;
|
requiredPosition = position;
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,7 @@ public class OpenALStreamPlayer {
|
||||||
private int remainingBufferCount;
|
private int remainingBufferCount;
|
||||||
/** True if we should loop the track */
|
/** True if we should loop the track */
|
||||||
private boolean loop;
|
private boolean loop;
|
||||||
/** True if we've completed play back */
|
/** True if we've completed streaming to buffer (but may not be done playing) */
|
||||||
private boolean done = true;
|
private boolean done = true;
|
||||||
/** The stream we're currently reading from */
|
/** The stream we're currently reading from */
|
||||||
private AudioInputStream audio;
|
private AudioInputStream audio;
|
||||||
|
@ -158,6 +158,7 @@ public class OpenALStreamPlayer {
|
||||||
sampleSize = 2; // AL10.AL_FORMAT_MONO16
|
sampleSize = 2; // AL10.AL_FORMAT_MONO16
|
||||||
// positionOffset = 0;
|
// positionOffset = 0;
|
||||||
streamPos = 0;
|
streamPos = 0;
|
||||||
|
playedPos = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -189,7 +190,7 @@ public class OpenALStreamPlayer {
|
||||||
* @param loop True if the stream should loop
|
* @param loop True if the stream should loop
|
||||||
* @throws IOException Indicates a failure to read from the stream
|
* @throws IOException Indicates a failure to read from the stream
|
||||||
*/
|
*/
|
||||||
public void play(boolean loop) throws IOException {
|
public synchronized void play(boolean loop) throws IOException {
|
||||||
this.loop = loop;
|
this.loop = loop;
|
||||||
initStreams();
|
initStreams();
|
||||||
|
|
||||||
|
|
|
@ -918,7 +918,7 @@ public class SoundStore {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.stream != null) {
|
if (this.stream != null && this.stream != stream) {
|
||||||
this.stream.close();
|
this.stream.close();
|
||||||
}
|
}
|
||||||
currentMusic = sources.get(0);
|
currentMusic = sources.get(0);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user