Added method to get duration of MP3s.
Currently used for the music bar in the main menu. Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
This commit is contained in:
parent
678f902744
commit
f23159d003
|
@ -24,8 +24,14 @@ import itdelatrisu.opsu.OsuFile;
|
||||||
import itdelatrisu.opsu.OsuParser;
|
import itdelatrisu.opsu.OsuParser;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.nio.IntBuffer;
|
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.BufferUtils;
|
||||||
import org.lwjgl.openal.AL;
|
import org.lwjgl.openal.AL;
|
||||||
|
@ -35,6 +41,7 @@ import org.newdawn.slick.MusicListener;
|
||||||
import org.newdawn.slick.SlickException;
|
import org.newdawn.slick.SlickException;
|
||||||
import org.newdawn.slick.openal.Audio;
|
import org.newdawn.slick.openal.Audio;
|
||||||
import org.newdawn.slick.openal.SoundStore;
|
import org.newdawn.slick.openal.SoundStore;
|
||||||
|
import org.tritonus.share.sampled.file.TAudioFileFormat;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Controller for all music.
|
* Controller for all music.
|
||||||
|
@ -252,6 +259,30 @@ public class MusicController {
|
||||||
return (trackExists() && position >= 0 && player.setPosition(position / 1000f));
|
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.
|
* Plays the current track.
|
||||||
* @param loop whether or not to loop the track
|
* @param loop whether or not to loop the track
|
||||||
|
|
|
@ -239,7 +239,7 @@ public class MainMenu extends BasicGameState {
|
||||||
g.fillRoundRect(musicBarX, musicBarY, musicBarWidth, musicBarHeight, 4);
|
g.fillRoundRect(musicBarX, musicBarY, musicBarWidth, musicBarHeight, 4);
|
||||||
g.setColor(Color.white);
|
g.setColor(Color.white);
|
||||||
if (!MusicController.isTrackLoading() && osu != null) {
|
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);
|
g.fillRoundRect(musicBarX, musicBarY, musicBarWidth * musicBarPosition, musicBarHeight, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -430,8 +430,7 @@ public class MainMenu extends BasicGameState {
|
||||||
if (MusicController.isPlaying()) {
|
if (MusicController.isPlaying()) {
|
||||||
if (musicPositionBarContains(x, y)) {
|
if (musicPositionBarContains(x, y)) {
|
||||||
float pos = (x - musicBarX) / musicBarWidth;
|
float pos = (x - musicBarX) / musicBarWidth;
|
||||||
OsuFile osu = MusicController.getOsuFile();
|
MusicController.setPosition((int) (pos * MusicController.getDuration()));
|
||||||
MusicController.setPosition((int) (pos * osu.endTime));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user