mirror of
https://github.com/2OOP/pism.git
synced 2026-02-04 10:54:51 +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.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
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.interfaces.Dispatcher;
|
||||||
import org.toop.framework.dispatch.JavaFXDispatcher;
|
import org.toop.framework.dispatch.JavaFXDispatcher;
|
||||||
import org.toop.annotations.TestsOnly;
|
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 org.toop.framework.resource.types.AudioResource;
|
||||||
|
|
||||||
import java.util.*;
|
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> {
|
public class MusicManager<T extends AudioResource> implements org.toop.framework.audio.interfaces.MusicManager<T> {
|
||||||
private static final Logger logger = LogManager.getLogger(MusicManager.class);
|
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();
|
current.play();
|
||||||
|
|
||||||
setTrackRunnable(current);
|
setTrackRunnable(current);
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setTrackRunnable(T track) {
|
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(() -> {
|
track.setOnEnd(() -> {
|
||||||
playingIndex++;
|
playingIndex++;
|
||||||
|
scheduler.shutdown();
|
||||||
playCurrentTrack();
|
playCurrentTrack();
|
||||||
});
|
});
|
||||||
|
|
||||||
track.setOnError(() -> {
|
track.setOnError(() -> {
|
||||||
logger.error("Error playing track: {}", track);
|
logger.error("Error playing track: {}", track);
|
||||||
backgroundMusic.remove(track);
|
backgroundMusic.remove(track);
|
||||||
|
scheduler.shutdown();
|
||||||
|
|
||||||
if (!backgroundMusic.isEmpty()) {
|
if (!backgroundMusic.isEmpty()) {
|
||||||
playCurrentTrack();
|
playCurrentTrack();
|
||||||
@@ -113,7 +132,10 @@ public class MusicManager<T extends AudioResource> implements org.toop.framework
|
|||||||
playing = false;
|
playing = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
scheduler.schedule(currentMusicTask, 0, TimeUnit.MILLISECONDS);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void stop() {
|
public void stop() {
|
||||||
if (!playing) return;
|
if (!playing) return;
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ public class AudioEvents extends EventsBase {
|
|||||||
/** Start background music. */
|
/** Start background music. */
|
||||||
public record StartBackgroundMusic() implements GenericEvent {}
|
public record StartBackgroundMusic() implements GenericEvent {}
|
||||||
|
|
||||||
|
public record PlayingMusic(String name, long currentPosition, long duration) implements GenericEvent {}
|
||||||
|
|
||||||
/** Change volume, choose type with {@link VolumeControl}. */
|
/** Change volume, choose type with {@link VolumeControl}. */
|
||||||
public record ChangeVolume(double newVolume, VolumeControl controlType) implements GenericEvent {}
|
public record ChangeVolume(double newVolume, VolumeControl controlType) implements GenericEvent {}
|
||||||
|
|
||||||
|
|||||||
@@ -82,4 +82,21 @@ public class MusicAsset extends BaseResource implements LoadableResource, AudioR
|
|||||||
public void stop() {
|
public void stop() {
|
||||||
getMediaPlayer().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();
|
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 updateVolume(double volume);
|
||||||
void play();
|
void play();
|
||||||
void stop();
|
void stop();
|
||||||
|
long duration();
|
||||||
|
long currentPosition();
|
||||||
void setOnEnd(Runnable run);
|
void setOnEnd(Runnable run);
|
||||||
void setOnError(Runnable run);
|
void setOnError(Runnable run);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user