From 69bc55dc26b3bf830660427ac8822927e9589e3a Mon Sep 17 00:00:00 2001 From: lieght <49651652+BAFGdeJong@users.noreply.github.com> Date: Wed, 15 Oct 2025 23:21:00 +0200 Subject: [PATCH] Polling music event, fires every 1 second --- .../toop/framework/audio/MusicManager.java | 24 ++++++++++++++++++- .../framework/audio/events/AudioEvents.java | 2 ++ .../resource/resources/MusicAsset.java | 17 +++++++++++++ .../resource/resources/SoundEffectAsset.java | 11 +++++++++ .../resource/types/AudioResource.java | 2 ++ 5 files changed, 55 insertions(+), 1 deletion(-) diff --git a/framework/src/main/java/org/toop/framework/audio/MusicManager.java b/framework/src/main/java/org/toop/framework/audio/MusicManager.java index b99d44e..4770930 100644 --- a/framework/src/main/java/org/toop/framework/audio/MusicManager.java +++ b/framework/src/main/java/org/toop/framework/audio/MusicManager.java @@ -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 implements org.toop.framework.audio.interfaces.MusicManager { private static final Logger logger = LogManager.getLogger(MusicManager.class); @@ -93,19 +99,32 @@ public class MusicManager 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 implements org.toop.framework playing = false; } }); + + scheduler.schedule(currentMusicTask, 0, TimeUnit.MILLISECONDS); } + @Override public void stop() { if (!playing) return; diff --git a/framework/src/main/java/org/toop/framework/audio/events/AudioEvents.java b/framework/src/main/java/org/toop/framework/audio/events/AudioEvents.java index 530b5be..3a4222b 100644 --- a/framework/src/main/java/org/toop/framework/audio/events/AudioEvents.java +++ b/framework/src/main/java/org/toop/framework/audio/events/AudioEvents.java @@ -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 {} diff --git a/framework/src/main/java/org/toop/framework/resource/resources/MusicAsset.java b/framework/src/main/java/org/toop/framework/resource/resources/MusicAsset.java index 31e580f..005a0d9 100644 --- a/framework/src/main/java/org/toop/framework/resource/resources/MusicAsset.java +++ b/framework/src/main/java/org/toop/framework/resource/resources/MusicAsset.java @@ -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; + } + } diff --git a/framework/src/main/java/org/toop/framework/resource/resources/SoundEffectAsset.java b/framework/src/main/java/org/toop/framework/resource/resources/SoundEffectAsset.java index df1f637..8fae992 100644 --- a/framework/src/main/java/org/toop/framework/resource/resources/SoundEffectAsset.java +++ b/framework/src/main/java/org/toop/framework/resource/resources/SoundEffectAsset.java @@ -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 + } + + } diff --git a/framework/src/main/java/org/toop/framework/resource/types/AudioResource.java b/framework/src/main/java/org/toop/framework/resource/types/AudioResource.java index d5d4e89..d001aa8 100644 --- a/framework/src/main/java/org/toop/framework/resource/types/AudioResource.java +++ b/framework/src/main/java/org/toop/framework/resource/types/AudioResource.java @@ -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); }