Mercurial > audlegacy-plugins
diff src/adplug/core/dmo.cxx @ 955:4709ce4e209e trunk
[svn] Run indent -ts4 -nut -bli0 -cdw on this messy lot. Upstream is not consistent with whitespace anyway, no loss there.
| author | chainsaw |
|---|---|
| date | Sat, 14 Apr 2007 15:23:50 -0700 |
| parents | cae46214b8bf |
| children | 224ebe9caaac |
line wrap: on
line diff
--- a/src/adplug/core/dmo.cxx Sat Apr 14 08:48:41 2007 -0700 +++ b/src/adplug/core/dmo.cxx Sat Apr 14 15:23:50 2007 -0700 @@ -44,361 +44,401 @@ /* -------- Public Methods -------------------------------- */ -CPlayer *CdmoLoader::factory(Copl *newopl) +CPlayer * +CdmoLoader::factory (Copl * newopl) { - return new CdmoLoader(newopl); + return new CdmoLoader (newopl); } -bool CdmoLoader::load(VFSFile *fd, const CFileProvider &fp) +bool +CdmoLoader::load (VFSFile * fd, const CFileProvider & fp) { - int i,j; + int i, j; binistream *f; - std::string filename(fd->uri); + std::string filename (fd->uri); // check header dmo_unpacker *unpacker = new dmo_unpacker; unsigned char chkhdr[16]; - f = fp.open(fd); if(!f) return false; - if(!fp.extension(filename, ".dmo")) return false; - - f->readString((char *)chkhdr, 16); + f = fp.open (fd); + if (!f) + return false; + if (!fp.extension (filename, ".dmo")) + return false; - if (!unpacker->decrypt(chkhdr, 16)) - { - delete unpacker; - fp.close(f); - return false; - } + f->readString ((char *) chkhdr, 16); + + if (!unpacker->decrypt (chkhdr, 16)) + { + delete unpacker; + fp.close (f); + return false; + } // get file size - long packed_length = fp.filesize(f); - f->seek(0); + long packed_length = fp.filesize (f); + f->seek (0); - unsigned char *packed_module = new unsigned char [packed_length]; + unsigned char *packed_module = new unsigned char[packed_length]; // load file - f->readString((char *)packed_module, packed_length); - fp.close(f); + f->readString ((char *) packed_module, packed_length); + fp.close (f); // decrypt - unpacker->decrypt(packed_module,packed_length); + unpacker->decrypt (packed_module, packed_length); - long unpacked_length = 0x2000 * ARRAY_AS_WORD(packed_module, 12); - unsigned char *module = new unsigned char [unpacked_length]; + long unpacked_length = 0x2000 * ARRAY_AS_WORD (packed_module, 12); + unsigned char *module = new unsigned char[unpacked_length]; // unpack - if (!unpacker->unpack(packed_module+12,module,unpacked_length)) - { - delete unpacker; - delete [] packed_module; - delete [] module; - return false; - } + if (!unpacker->unpack (packed_module + 12, module, unpacked_length)) + { + delete unpacker; + delete[]packed_module; + delete[]module; + return false; + } delete unpacker; - delete [] packed_module; + delete[]packed_module; // "TwinTeam" - signed ? - if (memcmp(module,"TwinTeam Module File""\x0D\x0A",22)) - { - delete module; - return false; - } + if (memcmp (module, "TwinTeam Module File" "\x0D\x0A", 22)) + { + delete module; + return false; + } // load header - binisstream uf(module, unpacked_length); - uf.setFlag(binio::BigEndian, false); uf.setFlag(binio::FloatIEEE); + binisstream uf (module, unpacked_length); + uf.setFlag (binio::BigEndian, false); + uf.setFlag (binio::FloatIEEE); - memset(&header,0,sizeof(s3mheader)); + memset (&header, 0, sizeof (s3mheader)); - uf.ignore(22); // ignore DMO header ID string - uf.readString(header.name, 28); + uf.ignore (22); // ignore DMO header ID string + uf.readString (header.name, 28); - uf.ignore(2); // _unk_1 - header.ordnum = uf.readInt(2); - header.insnum = uf.readInt(2); - header.patnum = uf.readInt(2); - uf.ignore(2); // _unk_2 - header.is = uf.readInt(2); - header.it = uf.readInt(2); + uf.ignore (2); // _unk_1 + header.ordnum = uf.readInt (2); + header.insnum = uf.readInt (2); + header.patnum = uf.readInt (2); + uf.ignore (2); // _unk_2 + header.is = uf.readInt (2); + header.it = uf.readInt (2); - memset(header.chanset,0xFF,32); + memset (header.chanset, 0xFF, 32); - for (i=0;i<9;i++) + for (i = 0; i < 9; i++) header.chanset[i] = 0x10 + i; - uf.ignore(32); // ignore panning settings for all 32 channels + uf.ignore (32); // ignore panning settings for all 32 channels // load orders - for(i = 0; i < 256; i++) orders[i] = uf.readInt(1); + for (i = 0; i < 256; i++) + orders[i] = uf.readInt (1); orders[header.ordnum] = 0xFF; // load pattern lengths unsigned short my_patlen[100]; - for(i = 0; i < 100; i++) my_patlen[i] = uf.readInt(2); + for (i = 0; i < 100; i++) + my_patlen[i] = uf.readInt (2); // load instruments for (i = 0; i < header.insnum; i++) - { - memset(&inst[i],0,sizeof(s3minst)); + { + memset (&inst[i], 0, sizeof (s3minst)); - uf.readString(inst[i].name, 28); + uf.readString (inst[i].name, 28); - inst[i].volume = uf.readInt(1); - inst[i].dsk = uf.readInt(1); - inst[i].c2spd = uf.readInt(4); - inst[i].type = uf.readInt(1); - inst[i].d00 = uf.readInt(1); - inst[i].d01 = uf.readInt(1); - inst[i].d02 = uf.readInt(1); - inst[i].d03 = uf.readInt(1); - inst[i].d04 = uf.readInt(1); - inst[i].d05 = uf.readInt(1); - inst[i].d06 = uf.readInt(1); - inst[i].d07 = uf.readInt(1); - inst[i].d08 = uf.readInt(1); - inst[i].d09 = uf.readInt(1); - inst[i].d0a = uf.readInt(1); - /* - * Originally, riven sets d0b = d0a and ignores 1 byte in the - * stream, but i guess this was a typo, so i read it here. - */ - inst[i].d0b = uf.readInt(1); - } + inst[i].volume = uf.readInt (1); + inst[i].dsk = uf.readInt (1); + inst[i].c2spd = uf.readInt (4); + inst[i].type = uf.readInt (1); + inst[i].d00 = uf.readInt (1); + inst[i].d01 = uf.readInt (1); + inst[i].d02 = uf.readInt (1); + inst[i].d03 = uf.readInt (1); + inst[i].d04 = uf.readInt (1); + inst[i].d05 = uf.readInt (1); + inst[i].d06 = uf.readInt (1); + inst[i].d07 = uf.readInt (1); + inst[i].d08 = uf.readInt (1); + inst[i].d09 = uf.readInt (1); + inst[i].d0a = uf.readInt (1); + /* + * Originally, riven sets d0b = d0a and ignores 1 byte in the + * stream, but i guess this was a typo, so i read it here. + */ + inst[i].d0b = uf.readInt (1); + } // load patterns - for (i = 0; i < header.patnum; i++) { - long cur_pos = uf.pos(); + for (i = 0; i < header.patnum; i++) + { + long cur_pos = uf.pos (); - for (j = 0; j < 64; j++) { - while (1) { - unsigned char token = uf.readInt(1); + for (j = 0; j < 64; j++) + { + while (1) + { + unsigned char token = uf.readInt (1); - if (!token) - break; + if (!token) + break; - unsigned char chan = token & 31; + unsigned char chan = token & 31; - // note + instrument ? - if (token & 32) { - unsigned char bufbyte = uf.readInt(1); + // note + instrument ? + if (token & 32) + { + unsigned char bufbyte = uf.readInt (1); - pattern[i][j][chan].note = bufbyte & 15; - pattern[i][j][chan].oct = bufbyte >> 4; - pattern[i][j][chan].instrument = uf.readInt(1); - } + pattern[i][j][chan].note = bufbyte & 15; + pattern[i][j][chan].oct = bufbyte >> 4; + pattern[i][j][chan].instrument = uf.readInt (1); + } - // volume ? - if (token & 64) - pattern[i][j][chan].volume = uf.readInt(1); + // volume ? + if (token & 64) + pattern[i][j][chan].volume = uf.readInt (1); - // command ? - if (token & 128) { - pattern[i][j][chan].command = uf.readInt(1); - pattern[i][j][chan].info = uf.readInt(1); - } + // command ? + if (token & 128) + { + pattern[i][j][chan].command = uf.readInt (1); + pattern[i][j][chan].info = uf.readInt (1); + } } } - uf.seek(cur_pos + my_patlen[i]); + uf.seek (cur_pos + my_patlen[i]); } - delete [] module; - rewind(0); + delete[]module; + rewind (0); return true; } -std::string CdmoLoader::gettype() +std::string CdmoLoader::gettype () { - return std::string("TwinTeam (packed S3M)"); + return std::string ("TwinTeam (packed S3M)"); } -std::string CdmoLoader::getauthor() +std::string CdmoLoader::getauthor () { /* - All available .DMO modules written by one composer. And because all .DMO - stuff was lost due to hd crash (TwinTeam guys said this), there are - never(?) be another. - */ - return std::string("Benjamin GERARDIN"); + All available .DMO modules written by one composer. And because all .DMO + stuff was lost due to hd crash (TwinTeam guys said this), there are + never(?) be another. + */ + return std::string ("Benjamin GERARDIN"); } /* -------- Private Methods ------------------------------- */ -unsigned short CdmoLoader::dmo_unpacker::brand(unsigned short range) +unsigned short +CdmoLoader::dmo_unpacker::brand (unsigned short range) { - unsigned short ax,bx,cx,dx; + unsigned short + ax, + bx, + cx, + dx; - ax = LOWORD(bseed); - bx = HIWORD(bseed); + ax = LOWORD (bseed); + bx = HIWORD (bseed); cx = ax; - ax = LOWORD(cx * 0x8405); - dx = HIWORD(cx * 0x8405); + ax = LOWORD (cx * 0x8405); + dx = HIWORD (cx * 0x8405); cx <<= 3; - cx = (((HIBYTE(cx) + LOBYTE(cx)) & 0xFF) << 8) + LOBYTE(cx); + cx = (((HIBYTE (cx) + LOBYTE (cx)) & 0xFF) << 8) + LOBYTE (cx); dx += cx; dx += bx; bx <<= 2; dx += bx; - dx = (((HIBYTE(dx) + LOBYTE(bx)) & 0xFF) << 8) + LOBYTE(dx); + dx = (((HIBYTE (dx) + LOBYTE (bx)) & 0xFF) << 8) + LOBYTE (dx); bx <<= 5; - dx = (((HIBYTE(dx) + LOBYTE(bx)) & 0xFF) << 8) + LOBYTE(dx); + dx = (((HIBYTE (dx) + LOBYTE (bx)) & 0xFF) << 8) + LOBYTE (dx); ax += 1; - if (!ax) dx += 1; + if (!ax) + dx += 1; // leave it that way or amd64 might get it wrong bseed = dx; bseed <<= 16; bseed += ax; - return HIWORD(HIWORD(LOWORD(bseed) * range) + HIWORD(bseed) * range); + return HIWORD (HIWORD (LOWORD (bseed) * range) + HIWORD (bseed) * range); } -bool CdmoLoader::dmo_unpacker::decrypt(unsigned char *buf, long len) +bool +CdmoLoader::dmo_unpacker::decrypt (unsigned char *buf, long len) { - unsigned long seed = 0; - int i; - - bseed = ARRAY_AS_DWORD(buf, 0); + unsigned long + seed = 0; + int + i; - for (i=0; i < ARRAY_AS_WORD(buf, 4) + 1; i++) - seed += brand(0xffff); + bseed = ARRAY_AS_DWORD (buf, 0); - bseed = seed ^ ARRAY_AS_DWORD(buf, 6); + for (i = 0; i < ARRAY_AS_WORD (buf, 4) + 1; i++) + seed += brand (0xffff); - if (ARRAY_AS_WORD(buf, 10) != brand(0xffff)) + bseed = seed ^ ARRAY_AS_DWORD (buf, 6); + + if (ARRAY_AS_WORD (buf, 10) != brand (0xffff)) return false; - for (i=0;i<(len-12);i++) - buf[12+i] ^= brand(0x100); + for (i = 0; i < (len - 12); i++) + buf[12 + i] ^= brand (0x100); buf[len - 2] = buf[len - 1] = 0; return true; } -short CdmoLoader::dmo_unpacker::unpack_block(unsigned char *ibuf, long ilen, unsigned char *obuf) +short +CdmoLoader::dmo_unpacker::unpack_block (unsigned char *ibuf, long ilen, + unsigned char *obuf) { - unsigned char code,par1,par2; - unsigned short ax,bx,cx; + unsigned char + code, + par1, + par2; + unsigned short + ax, + bx, + cx; - unsigned char *ipos = ibuf; - unsigned char *opos = obuf; + unsigned char * + ipos = ibuf; + unsigned char * + opos = obuf; // LZ77 child while (ipos - ibuf < ilen) - { - code = *ipos++; + { + code = *ipos++; - // 00xxxxxx: copy (xxxxxx + 1) bytes - if ((code >> 6) == 0) - { - cx = (code & 0x3F) + 1; + // 00xxxxxx: copy (xxxxxx + 1) bytes + if ((code >> 6) == 0) + { + cx = (code & 0x3F) + 1; - if(opos + cx >= oend) - return -1; + if (opos + cx >= oend) + return -1; - for (int i=0;i<cx;i++) - *opos++ = *ipos++; + for (int i = 0; i < cx; i++) + *opos++ = *ipos++; - continue; - } + continue; + } - // 01xxxxxx xxxyyyyy: copy (Y + 3) bytes from (X + 1) - if ((code >> 6) == 1) - { - par1 = *ipos++; + // 01xxxxxx xxxyyyyy: copy (Y + 3) bytes from (X + 1) + if ((code >> 6) == 1) + { + par1 = *ipos++; - ax = ((code & 0x3F) << 3) + ((par1 & 0xE0) >> 5) + 1; - cx = (par1 & 0x1F) + 3; + ax = ((code & 0x3F) << 3) + ((par1 & 0xE0) >> 5) + 1; + cx = (par1 & 0x1F) + 3; - if(opos + cx >= oend) - return -1; + if (opos + cx >= oend) + return -1; - for(int i=0;i<cx;i++) - *opos++ = *(opos - ax); + for (int i = 0; i < cx; i++) + *opos++ = *(opos - ax); - continue; - } + continue; + } - // 10xxxxxx xyyyzzzz: copy (Y + 3) bytes from (X + 1); copy Z bytes - if ((code >> 6) == 2) - { - int i; + // 10xxxxxx xyyyzzzz: copy (Y + 3) bytes from (X + 1); copy Z bytes + if ((code >> 6) == 2) + { + int + i; - par1 = *ipos++; + par1 = *ipos++; - ax = ((code & 0x3F) << 1) + (par1 >> 7) + 1; - cx = ((par1 & 0x70) >> 4) + 3; - bx = par1 & 0x0F; + ax = ((code & 0x3F) << 1) + (par1 >> 7) + 1; + cx = ((par1 & 0x70) >> 4) + 3; + bx = par1 & 0x0F; - if(opos + bx + cx >= oend) - return -1; + if (opos + bx + cx >= oend) + return -1; - for(i=0;i<cx;i++) - *opos++ = *(opos - ax); + for (i = 0; i < cx; i++) + *opos++ = *(opos - ax); - for (i=0;i<bx;i++) - *opos++ = *ipos++; + for (i = 0; i < bx; i++) + *opos++ = *ipos++; - continue; - } + continue; + } - // 11xxxxxx xxxxxxxy yyyyzzzz: copy (Y + 4) from X; copy Z bytes - if ((code >> 6) == 3) - { - int i; + // 11xxxxxx xxxxxxxy yyyyzzzz: copy (Y + 4) from X; copy Z bytes + if ((code >> 6) == 3) + { + int + i; - par1 = *ipos++; - par2 = *ipos++; + par1 = *ipos++; + par2 = *ipos++; - bx = ((code & 0x3F) << 7) + (par1 >> 1); - cx = ((par1 & 0x01) << 4) + (par2 >> 4) + 4; - ax = par2 & 0x0F; + bx = ((code & 0x3F) << 7) + (par1 >> 1); + cx = ((par1 & 0x01) << 4) + (par2 >> 4) + 4; + ax = par2 & 0x0F; - if(opos + ax + cx >= oend) - return -1; + if (opos + ax + cx >= oend) + return -1; - for(i=0;i<cx;i++) - *opos++ = *(opos - bx); + for (i = 0; i < cx; i++) + *opos++ = *(opos - bx); - for (i=0;i<ax;i++) - *opos++ = *ipos++; + for (i = 0; i < ax; i++) + *opos++ = *ipos++; - continue; - } + continue; } + } return opos - obuf; } -long CdmoLoader::dmo_unpacker::unpack(unsigned char *ibuf, unsigned char *obuf, - unsigned long outputsize) +long +CdmoLoader::dmo_unpacker::unpack (unsigned char *ibuf, unsigned char *obuf, + unsigned long outputsize) { - long olen = 0; - unsigned short block_count = CHARP_AS_WORD(ibuf); + long + olen = 0; + unsigned short + block_count = CHARP_AS_WORD (ibuf); ibuf += 2; - unsigned char *block_length = ibuf; + unsigned char * + block_length = ibuf; ibuf += 2 * block_count; oend = obuf + outputsize; - for (int i=0;i<block_count;i++) - { - unsigned short bul = CHARP_AS_WORD(ibuf); - - if(unpack_block(ibuf + 2,CHARP_AS_WORD(block_length) - 2,obuf) != bul) - return 0; + for (int i = 0; i < block_count; i++) + { + unsigned short + bul = CHARP_AS_WORD (ibuf); - obuf += bul; - olen += bul; + if (unpack_block (ibuf + 2, CHARP_AS_WORD (block_length) - 2, obuf) != + bul) + return 0; - ibuf += CHARP_AS_WORD(block_length); - block_length += 2; - } + obuf += bul; + olen += bul; + + ibuf += CHARP_AS_WORD (block_length); + block_length += 2; + } return olen; }
