mirror of
https://github.com/2OOP/pism.git
synced 2026-02-04 19:04:49 +00:00
Polling music event, fires every 1 second
This commit is contained in:
@@ -2,12 +2,18 @@ package org.toop.framework.audio;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.toop.framework.audio.events.AudioEvents;
|
||||
import org.toop.framework.dispatch.interfaces.Dispatcher;
|
||||
import org.toop.framework.dispatch.JavaFXDispatcher;
|
||||
import org.toop.annotations.TestsOnly;
|
||||
import org.toop.framework.eventbus.EventFlow;
|
||||
import org.toop.framework.eventbus.GlobalEventBus;
|
||||
import org.toop.framework.resource.types.AudioResource;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
public class MusicManager<T extends AudioResource> implements org.toop.framework.audio.interfaces.MusicManager<T> {
|
||||
private static final Logger logger = LogManager.getLogger(MusicManager.class);
|
||||
@@ -93,19 +99,32 @@ public class MusicManager<T extends AudioResource> implements org.toop.framework
|
||||
current.play();
|
||||
|
||||
setTrackRunnable(current);
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
private void setTrackRunnable(T track) {
|
||||
|
||||
|
||||
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
|
||||
|
||||
Runnable currentMusicTask = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
GlobalEventBus.post(new AudioEvents.PlayingMusic(track.getName(), track.currentPosition(), track.duration()));
|
||||
scheduler.schedule(this, 1, TimeUnit.SECONDS);
|
||||
}
|
||||
};
|
||||
|
||||
track.setOnEnd(() -> {
|
||||
playingIndex++;
|
||||
scheduler.shutdown();
|
||||
playCurrentTrack();
|
||||
});
|
||||
|
||||
track.setOnError(() -> {
|
||||
logger.error("Error playing track: {}", track);
|
||||
backgroundMusic.remove(track);
|
||||
scheduler.shutdown();
|
||||
|
||||
if (!backgroundMusic.isEmpty()) {
|
||||
playCurrentTrack();
|
||||
@@ -113,7 +132,10 @@ public class MusicManager<T extends AudioResource> implements org.toop.framework
|
||||
playing = false;
|
||||
}
|
||||
});
|
||||
|
||||
scheduler.schedule(currentMusicTask, 0, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stop() {
|
||||
if (!playing) return;
|
||||
|
||||
@@ -18,6 +18,8 @@ public class AudioEvents extends EventsBase {
|
||||
/** Start background music. */
|
||||
public record StartBackgroundMusic() implements GenericEvent {}
|
||||
|
||||
public record PlayingMusic(String name, long currentPosition, long duration) implements GenericEvent {}
|
||||
|
||||
/** Change volume, choose type with {@link VolumeControl}. */
|
||||
public record ChangeVolume(double newVolume, VolumeControl controlType) implements GenericEvent {}
|
||||
|
||||
|
||||
@@ -82,4 +82,21 @@ public class MusicAsset extends BaseResource implements LoadableResource, AudioR
|
||||
public void stop() {
|
||||
getMediaPlayer().stop();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long duration() {
|
||||
if (mediaPlayer != null) {
|
||||
return (long) this.mediaPlayer.getTotalDuration().toSeconds(); // Why is this a double? TODO: Fix cast
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long currentPosition() {
|
||||
if (mediaPlayer != null) {
|
||||
return (long) this.mediaPlayer.getCurrentTime().toSeconds(); // Same here. TODO: Fix cast
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -144,4 +144,15 @@ public class SoundEffectAsset extends BaseResource implements LoadableResource,
|
||||
if (this.clip.isRunning()) this.clip.stop();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long duration() {
|
||||
return 0; // TODO
|
||||
}
|
||||
|
||||
@Override
|
||||
public long currentPosition() {
|
||||
return 0; // TODO
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -5,6 +5,8 @@ public interface AudioResource {
|
||||
void updateVolume(double volume);
|
||||
void play();
|
||||
void stop();
|
||||
long duration();
|
||||
long currentPosition();
|
||||
void setOnEnd(Runnable run);
|
||||
void setOnError(Runnable run);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user