From f23159d003e1634e029184c38f7c33fb62e10f77 Mon Sep 17 00:00:00 2001 From: Jeffrey Han Date: Mon, 16 Mar 2015 13:16:30 -0400 Subject: [PATCH] Added method to get duration of MP3s. Currently used for the music bar in the main menu. Signed-off-by: Jeffrey Han --- .../opsu/audio/MusicController.java | 31 +++++++++++++++++++ src/itdelatrisu/opsu/states/MainMenu.java | 5 ++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/itdelatrisu/opsu/audio/MusicController.java b/src/itdelatrisu/opsu/audio/MusicController.java index 6c84e7ad..797b355c 100644 --- a/src/itdelatrisu/opsu/audio/MusicController.java +++ b/src/itdelatrisu/opsu/audio/MusicController.java @@ -24,8 +24,14 @@ import itdelatrisu.opsu.OsuFile; import itdelatrisu.opsu.OsuParser; import java.io.File; +import java.io.IOException; import java.lang.reflect.Field; import java.nio.IntBuffer; +import java.util.Map; + +import javax.sound.sampled.AudioFileFormat; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.UnsupportedAudioFileException; import org.lwjgl.BufferUtils; import org.lwjgl.openal.AL; @@ -35,6 +41,7 @@ import org.newdawn.slick.MusicListener; import org.newdawn.slick.SlickException; import org.newdawn.slick.openal.Audio; import org.newdawn.slick.openal.SoundStore; +import org.tritonus.share.sampled.file.TAudioFileFormat; /** * Controller for all music. @@ -252,6 +259,30 @@ public class MusicController { return (trackExists() && position >= 0 && player.setPosition(position / 1000f)); } + /** + * Returns the duration of the current track, in milliseconds. + * Currently only works for MP3s. + * @return the duration, or -1 if no track exists, else the {@code endTime} + * field of the OsuFile loaded + * @author Tom Brito (http://stackoverflow.com/a/3056161) + */ + public static int getDuration() { + if (!trackExists() || lastOsu == null) + return -1; + + if (lastOsu.audioFilename.getName().endsWith(".mp3")) { + try { + AudioFileFormat fileFormat = AudioSystem.getAudioFileFormat(lastOsu.audioFilename); + if (fileFormat instanceof TAudioFileFormat) { + Map properties = ((TAudioFileFormat) fileFormat).properties(); + Long microseconds = (Long) properties.get("duration"); + return (int) (microseconds / 1000); + } + } catch (UnsupportedAudioFileException | IOException e) {} + } + return lastOsu.endTime; + } + /** * Plays the current track. * @param loop whether or not to loop the track diff --git a/src/itdelatrisu/opsu/states/MainMenu.java b/src/itdelatrisu/opsu/states/MainMenu.java index 7884b745..29440698 100644 --- a/src/itdelatrisu/opsu/states/MainMenu.java +++ b/src/itdelatrisu/opsu/states/MainMenu.java @@ -239,7 +239,7 @@ public class MainMenu extends BasicGameState { g.fillRoundRect(musicBarX, musicBarY, musicBarWidth, musicBarHeight, 4); g.setColor(Color.white); if (!MusicController.isTrackLoading() && osu != null) { - float musicBarPosition = Math.min((float) MusicController.getPosition() / osu.endTime, 1f); + float musicBarPosition = Math.min((float) MusicController.getPosition() / MusicController.getDuration(), 1f); g.fillRoundRect(musicBarX, musicBarY, musicBarWidth * musicBarPosition, musicBarHeight, 4); } @@ -430,8 +430,7 @@ public class MainMenu extends BasicGameState { if (MusicController.isPlaying()) { if (musicPositionBarContains(x, y)) { float pos = (x - musicBarX) / musicBarWidth; - OsuFile osu = MusicController.getOsuFile(); - MusicController.setPosition((int) (pos * osu.endTime)); + MusicController.setPosition((int) (pos * MusicController.getDuration())); return; } }