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;
+}
+