summaryrefslogtreecommitdiff
path: root/NET/worlds/scape/CDDBHash.java
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;
   }
}