Polling music event, fires every 1 second

This commit is contained in:
lieght
2025-10-15 23:21:00 +02:00
parent 62e2b71ece
commit 69bc55dc26
5 changed files with 55 additions and 1 deletions

View File

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

View File

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

View File

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

View File

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

View File

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