00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "stdafx.h"
00011 #include "sndfile.h"
00012
00013 #define MODMAGIC_OFFSET (20+31*30+130)
00014
00015
00016 BOOL CSoundFile::ReadUMX(const BYTE *lpStream, DWORD dwMemLength)
00017
00018 {
00019 if ((!lpStream) || (dwMemLength < 0x800)) return FALSE;
00020
00021 if ((bswapLE32(*((DWORD *)(lpStream+0x20))) < dwMemLength)
00022 && (bswapLE32(*((DWORD *)(lpStream+0x18))) <= dwMemLength - 0x10)
00023 && (bswapLE32(*((DWORD *)(lpStream+0x18))) >= dwMemLength - 0x200))
00024 {
00025 for (UINT uscan=0x40; uscan<0x500; uscan++)
00026 {
00027 DWORD dwScan = bswapLE32(*((DWORD *)(lpStream+uscan)));
00028
00029 if (dwScan == 0x4D504D49)
00030 {
00031 DWORD dwRipOfs = uscan;
00032 return ReadIT(lpStream + dwRipOfs, dwMemLength - dwRipOfs);
00033 }
00034
00035 if (dwScan == 0x4D524353)
00036 {
00037 DWORD dwRipOfs = uscan - 44;
00038 return ReadS3M(lpStream + dwRipOfs, dwMemLength - dwRipOfs);
00039 }
00040
00041 if (!strnicmp((LPCSTR)(lpStream+uscan), "Extended Module", 15))
00042 {
00043 DWORD dwRipOfs = uscan;
00044 return ReadXM(lpStream + dwRipOfs, dwMemLength - dwRipOfs);
00045 }
00046
00047 if ((uscan > MODMAGIC_OFFSET) && (dwScan == 0x2e4b2e4d))
00048 {
00049 DWORD dwRipOfs = uscan - MODMAGIC_OFFSET;
00050 return ReadMod(lpStream+dwRipOfs, dwMemLength-dwRipOfs);
00051 }
00052 }
00053 }
00054 return FALSE;
00055 }
00056