Merge pull request #23 from fluddokt/omaster

Fixes Music Ended (hopefully)
This commit is contained in:
Jeffrey Han 2015-02-21 22:07:10 -05:00
commit 64f5d5032d
4 changed files with 65 additions and 44 deletions

View File

@ -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

View File

@ -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;
}
} }
} }

View File

@ -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();

View File

@ -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);