package NET.worlds.scape; public class CDTrackInfo { private int[] pos; private int[] len; public CDTrackInfo(int numTracks) { this.pos = new int[numTracks]; this.len = new int[numTracks]; } public int getNumTracks() { return this.pos.length; } public int getStartFrames(int track) { return this.getPosM(track) * 60 * 75 + this.getPosS(track) * 75 + this.getPosF(track); } public int getEndFrames(int track) { return track == this.pos.length - 1 ? this.getStartFrames(track) + this.getLenM(track) * 60 * 75 + this.getLenS(track) * 75 + this.getLenF(track) : this.getStartFrames(track + 1) - 1; } public int getPosM(int track) { return minutes(this.pos[track]); } public int getPosS(int track) { return seconds(this.pos[track]); } public int getPosF(int track) { return frames(this.pos[track]); } public int getLenM(int track) { return minutes(this.len[track]); } public int getLenS(int track) { return seconds(this.len[track]); } public int getLenF(int track) { return frames(this.len[track]); } private static int minutes(int packed) { return packed & 0xFF; } private static int seconds(int packed) { return packed >> 8 & 0xFF; } private static int frames(int packed) { return packed >> 16 & 0xFF; } private static String format2(int val) { String result = ""; if (val < 10) { result = "0"; } return result + val; } private static String format(int packed) { return minutes(packed) + ":" + format2(seconds(packed)) + ":" + format2(frames(packed)); } public void dump() { System.out.println("Tracks: " + this.pos.length); for (int i = 0; i < this.pos.length; i++) { System.out.println("Track " + i + " " + "start " + format(this.pos[i]) + " length " + format(this.len[i])); } } }