Mercurial > audlegacy-plugins
diff src/modplug/load_umx.cxx @ 136:6b5a52635b3b trunk
[svn] - like with so many other things, modplug is now maintained by us.
author | nenolod |
---|---|
date | Sun, 29 Oct 2006 01:04:52 -0700 |
parents | |
children | 032053ca08ab |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/modplug/load_umx.cxx Sun Oct 29 01:04:52 2006 -0700 @@ -0,0 +1,53 @@ +/* + * This source code is public domain. + * + * Authors: Olivier Lapicque <olivierl@jps.net> +*/ + +#include "stdafx.h" +#include "sndfile.h" + +#define MODMAGIC_OFFSET (20+31*30+130) + + +BOOL CSoundFile::ReadUMX(const BYTE *lpStream, DWORD dwMemLength) +//--------------------------------------------------------------- +{ + if ((!lpStream) || (dwMemLength < 0x800)) return FALSE; + // Rip Mods from UMX + if ((bswapLE32(*((DWORD *)(lpStream+0x20))) < dwMemLength) + && (bswapLE32(*((DWORD *)(lpStream+0x18))) <= dwMemLength - 0x10) + && (bswapLE32(*((DWORD *)(lpStream+0x18))) >= dwMemLength - 0x200)) + { + for (UINT uscan=0x40; uscan<0x500; uscan++) + { + DWORD dwScan = bswapLE32(*((DWORD *)(lpStream+uscan))); + // IT + if (dwScan == 0x4D504D49) + { + DWORD dwRipOfs = uscan; + return ReadIT(lpStream + dwRipOfs, dwMemLength - dwRipOfs); + } + // S3M + if (dwScan == 0x4D524353) + { + DWORD dwRipOfs = uscan - 44; + return ReadS3M(lpStream + dwRipOfs, dwMemLength - dwRipOfs); + } + // XM + if (!strnicmp((LPCSTR)(lpStream+uscan), "Extended Module", 15)) + { + DWORD dwRipOfs = uscan; + return ReadXM(lpStream + dwRipOfs, dwMemLength - dwRipOfs); + } + // MOD + if ((uscan > MODMAGIC_OFFSET) && (dwScan == 0x2e4b2e4d)) + { + DWORD dwRipOfs = uscan - MODMAGIC_OFFSET; + return ReadMod(lpStream+dwRipOfs, dwMemLength-dwRipOfs); + } + } + } + return FALSE; +} +