blob: 5d9ba86a2cc4506d0b6c329a962757ff99d24d2b (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
package NET.worlds.scape;
public class CDDBHash {
public static String hashString(CDTrackInfo tracks) {
String id = Integer.toHexString(hash(tracks));
int len = id.length();
if (len >= 8) {
return id;
} else {
String pad = "0";
while (++len < 8) {
pad = pad + "0";
}
return pad + id;
}
}
public static String lookupString(CDTrackInfo tracks) {
int numTracks = tracks.getNumTracks();
String ret = hashString(tracks) + " " + numTracks;
for (int i = 0; i < numTracks; i++) {
ret = ret + " " + tracks.getStartFrames(i);
}
return ret + " " + leadOutSecs(tracks);
}
private static int addDigits(int n) {
String buf = "" + n;
int ret = 0;
for (int i = 0; i < buf.length(); i++) {
ret += buf.charAt(i) - '0';
}
return ret;
}
private static int leadOutSecs(CDTrackInfo tracks) {
int last = tracks.getNumTracks() - 1;
int omin = tracks.getPosM(last);
int osec = tracks.getPosS(last);
int ofrm = tracks.getPosF(last);
int lmin = tracks.getLenM(last);
int lsec = tracks.getLenS(last);
int lfrm = tracks.getLenF(last);
if (++lfrm == 75) {
lfrm = 0;
if (++lsec == 60) {
lsec = 0;
lmin++;
}
}
ofrm += lfrm;
osec += ofrm / 75 + lsec;
omin += osec / 60 + lmin;
osec %= 60;
return omin * 60 + osec;
}
private static int hash(CDTrackInfo tracks) {
int n = 0;
int numTracks = tracks.getNumTracks();
for (int i = 0; i < numTracks; i++) {
n += addDigits(tracks.getPosM(i) * 60 + tracks.getPosS(i));
}
int t = leadOutSecs(tracks) - tracks.getPosM(0) * 60 - tracks.getPosS(0);
return n % 255 << 24 | t << 8 | numTracks;
}
}
|