iRiver: The audio init fix caused problems if a voice file was present.
[kugel-rb.git] / songdbj / FileEntry.java
blob9af5b3d70a122e97d1af00f7dc768d3429e232a1
1 import java.io.*;
3 public class FileEntry extends Entry implements Comparable {
4 protected String filename;
5 protected int hash;
6 protected SongEntry sentry;
7 protected RundbEntry rentry;
8 protected File file;
10 public FileEntry(File f) throws FileNotFoundException, IOException {
11 filename=convertPath(f.getAbsolutePath());
12 file=f;
13 sentry=null;
14 rentry=null;
17 public int compareTo(Object o) {
18 return String.CASE_INSENSITIVE_ORDER.compare(filename,((FileEntry)o).getFilename());
21 public String getFilename() { return filename; }
23 public File getFile() { return file; }
25 protected void calcHash() throws FileNotFoundException, IOException {
26 DataInputStream r = new DataInputStream(new FileInputStream(file));
27 byte[] buf = new byte[32768];
28 if(sentry!=null)
29 r.skip(sentry.getFirstFrameOffset());
30 r.read(buf);
31 hash=CalcCRC32(buf);
32 r.close();
35 public int getHash() { return hash; }
37 public static String add(String t) {
38 String add=TagDatabase.getInstance().add;
39 if(add!=null)
40 return add+t;
41 else
42 return t;
45 public static String convertPath(String t) {
46 String temp = add(strip(t)).replace('\\','/');
47 if (temp.charAt(0)!='/')
48 temp="/"+temp;
49 return temp;
52 public static String strip(String t) {
53 return stripPrefix(stripDriveletter(stripPrefix(t)));
56 public static String stripPrefix(String t) {
57 String prefix=TagDatabase.getInstance().strip;
58 if(prefix!=null&&t.toLowerCase().startsWith(prefix.toLowerCase())) {
59 return t.substring(prefix.length());
61 return t;
64 public static String stripDriveletter(String t) {
65 if(t.indexOf(':')==1) { // second char is ':'
66 return t.substring(2);
68 return t;
71 public void setSongEntry(SongEntry e) { sentry=e; try { calcHash(); } catch(Exception d) { } }
72 public void setRundbEntry(RundbEntry e) { rentry=e; }
73 public SongEntry getSongEntry() { return sentry; }
74 public RundbEntry getRundbEntry() { return rentry; }
75 public int getSongEntryOffset() {
76 if(sentry!=null)
77 return sentry.getOffset();
78 else
79 return -1;
81 public int getRundbEntryOffset() {
82 /* if(rentry!=null)
83 return rentry.getOffset();
84 else*/
85 return -1;
87 public void write(DataOutputStream w) throws IOException {
88 String name=getFilename();
89 w.writeBytes(name);
90 for(int x=TagDatabase.getInstance().filelen-name.length();x>0;x--)
91 w.write(0);
92 w.writeInt(hash);
93 w.writeInt(getSongEntryOffset());
94 w.writeInt(getRundbEntryOffset());
97 public static int entrySize() {
98 return TagDatabase.getInstance().filelen+12;
101 static final int crc_table[] =
102 { // CRC32 lookup table for polynomial 0x04C11DB7
103 0x00000000, 0x04C11DB7, 0x09823B6E, 0x0D4326D9, 0x130476DC, 0x17C56B6B,
104 0x1A864DB2, 0x1E475005, 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61,
105 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD, 0x4C11DB70, 0x48D0C6C7,
106 0x4593E01E, 0x4152FDA9, 0x5F15ADAC, 0x5BD4B01B, 0x569796C2, 0x52568B75,
107 0x6A1936C8, 0x6ED82B7F, 0x639B0DA6, 0x675A1011, 0x791D4014, 0x7DDC5DA3,
108 0x709F7B7A, 0x745E66CD, 0x9823B6E0, 0x9CE2AB57, 0x91A18D8E, 0x95609039,
109 0x8B27C03C, 0x8FE6DD8B, 0x82A5FB52, 0x8664E6E5, 0xBE2B5B58, 0xBAEA46EF,
110 0xB7A96036, 0xB3687D81, 0xAD2F2D84, 0xA9EE3033, 0xA4AD16EA, 0xA06C0B5D,
111 0xD4326D90, 0xD0F37027, 0xDDB056FE, 0xD9714B49, 0xC7361B4C, 0xC3F706FB,
112 0xCEB42022, 0xCA753D95, 0xF23A8028, 0xF6FB9D9F, 0xFBB8BB46, 0xFF79A6F1,
113 0xE13EF6F4, 0xE5FFEB43, 0xE8BCCD9A, 0xEC7DD02D, 0x34867077, 0x30476DC0,
114 0x3D044B19, 0x39C556AE, 0x278206AB, 0x23431B1C, 0x2E003DC5, 0x2AC12072,
115 0x128E9DCF, 0x164F8078, 0x1B0CA6A1, 0x1FCDBB16, 0x018AEB13, 0x054BF6A4,
116 0x0808D07D, 0x0CC9CDCA, 0x7897AB07, 0x7C56B6B0, 0x71159069, 0x75D48DDE,
117 0x6B93DDDB, 0x6F52C06C, 0x6211E6B5, 0x66D0FB02, 0x5E9F46BF, 0x5A5E5B08,
118 0x571D7DD1, 0x53DC6066, 0x4D9B3063, 0x495A2DD4, 0x44190B0D, 0x40D816BA,
119 0xACA5C697, 0xA864DB20, 0xA527FDF9, 0xA1E6E04E, 0xBFA1B04B, 0xBB60ADFC,
120 0xB6238B25, 0xB2E29692, 0x8AAD2B2F, 0x8E6C3698, 0x832F1041, 0x87EE0DF6,
121 0x99A95DF3, 0x9D684044, 0x902B669D, 0x94EA7B2A, 0xE0B41DE7, 0xE4750050,
122 0xE9362689, 0xEDF73B3E, 0xF3B06B3B, 0xF771768C, 0xFA325055, 0xFEF34DE2,
123 0xC6BCF05F, 0xC27DEDE8, 0xCF3ECB31, 0xCBFFD686, 0xD5B88683, 0xD1799B34,
124 0xDC3ABDED, 0xD8FBA05A, 0x690CE0EE, 0x6DCDFD59, 0x608EDB80, 0x644FC637,
125 0x7A089632, 0x7EC98B85, 0x738AAD5C, 0x774BB0EB, 0x4F040D56, 0x4BC510E1,
126 0x46863638, 0x42472B8F, 0x5C007B8A, 0x58C1663D, 0x558240E4, 0x51435D53,
127 0x251D3B9E, 0x21DC2629, 0x2C9F00F0, 0x285E1D47, 0x36194D42, 0x32D850F5,
128 0x3F9B762C, 0x3B5A6B9B, 0x0315D626, 0x07D4CB91, 0x0A97ED48, 0x0E56F0FF,
129 0x1011A0FA, 0x14D0BD4D, 0x19939B94, 0x1D528623, 0xF12F560E, 0xF5EE4BB9,
130 0xF8AD6D60, 0xFC6C70D7, 0xE22B20D2, 0xE6EA3D65, 0xEBA91BBC, 0xEF68060B,
131 0xD727BBB6, 0xD3E6A601, 0xDEA580D8, 0xDA649D6F, 0xC423CD6A, 0xC0E2D0DD,
132 0xCDA1F604, 0xC960EBB3, 0xBD3E8D7E, 0xB9FF90C9, 0xB4BCB610, 0xB07DABA7,
133 0xAE3AFBA2, 0xAAFBE615, 0xA7B8C0CC, 0xA379DD7B, 0x9B3660C6, 0x9FF77D71,
134 0x92B45BA8, 0x9675461F, 0x8832161A, 0x8CF30BAD, 0x81B02D74, 0x857130C3,
135 0x5D8A9099, 0x594B8D2E, 0x5408ABF7, 0x50C9B640, 0x4E8EE645, 0x4A4FFBF2,
136 0x470CDD2B, 0x43CDC09C, 0x7B827D21, 0x7F436096, 0x7200464F, 0x76C15BF8,
137 0x68860BFD, 0x6C47164A, 0x61043093, 0x65C52D24, 0x119B4BE9, 0x155A565E,
138 0x18197087, 0x1CD86D30, 0x029F3D35, 0x065E2082, 0x0B1D065B, 0x0FDC1BEC,
139 0x3793A651, 0x3352BBE6, 0x3E119D3F, 0x3AD08088, 0x2497D08D, 0x2056CD3A,
140 0x2D15EBE3, 0x29D4F654, 0xC5A92679, 0xC1683BCE, 0xCC2B1D17, 0xC8EA00A0,
141 0xD6AD50A5, 0xD26C4D12, 0xDF2F6BCB, 0xDBEE767C, 0xE3A1CBC1, 0xE760D676,
142 0xEA23F0AF, 0xEEE2ED18, 0xF0A5BD1D, 0xF464A0AA, 0xF9278673, 0xFDE69BC4,
143 0x89B8FD09, 0x8D79E0BE, 0x803AC667, 0x84FBDBD0, 0x9ABC8BD5, 0x9E7D9662,
144 0x933EB0BB, 0x97FFAD0C, 0xAFB010B1, 0xAB710D06, 0xA6322BDF, 0xA2F33668,
145 0xBCB4666D, 0xB8757BDA, 0xB5365D03, 0xB1F740B4
148 public static int CalcCRC32(byte[] buf) {
149 int i;
150 int crc = 0xffffffff;
151 for (i = 0; i < buf.length; i++)
152 crc = (crc << 8) ^ crc_table[(int)((crc >> 24) ^ buf[i]) & 0xFF];
153 return crc;