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

View File

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

View File

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

View File

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

View File

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