public static Module Load(Stream stream, int maxchan, int curious) { BuildRegisteredModules(); Module mod = null; ModuleReader modReader = new ModuleReader(stream); IModLoader loader = null; for (int i = 0; i < s_RegistedModuleLoader.Count; i++) { modReader.Rewind(); IModLoader tester = (IModLoader)Activator.CreateInstance(s_RegistedModuleLoader[i]); tester.ModuleReader = modReader; if (tester.Test()) { loader = tester; tester.Cleanup(); break; } tester.Cleanup(); } if (loader != null) { int t = 0; mod = new Module(); loader.Module = mod; bool loaded = false; munitrk track = new munitrk(); track.UniInit(); loader.Tracker = track; mod.bpmlimit = 33; mod.initvolume = 128; for (t = 0; t < SharpMikCommon.UF_MAXCHAN; t++) { mod.chanvol[t] = 64; mod.panning[t] = (ushort)((((t + 1) & 2) == 2) ? SharpMikCommon.PAN_RIGHT : SharpMikCommon.PAN_LEFT); } if (loader.Init()) { modReader.Rewind(); loaded = loader.Load(curious); if (loaded) { for (t = 0; t < mod.numsmp; t++) { if (mod.samples[t].inflags == 0) { mod.samples[t].inflags = mod.samples[t].flags; } } } } loader.Cleanup(); track.UniCleanup(); if (loaded) { ML_LoadSamples(mod, modReader); if (!((mod.flags & SharpMikCommon.UF_PANNING) == SharpMikCommon.UF_PANNING)) { for (t = 0; t < mod.numchn; t++) { mod.panning[t] = (ushort)((((t + 1) & 2) == 2) ? SharpMikCommon.PAN_HALFRIGHT : SharpMikCommon.PAN_HALFLEFT); } } if (maxchan > 0) { if (!((mod.flags & SharpMikCommon.UF_NNA) == SharpMikCommon.UF_NNA) && (mod.numchn < maxchan)) { maxchan = mod.numchn; } else { if ((mod.numvoices != 0) && (mod.numvoices < maxchan)) { maxchan = mod.numvoices; } } if (maxchan < mod.numchn) { mod.flags |= SharpMikCommon.UF_NNA; } if (ModDriver.MikMod_SetNumVoices_internal(maxchan, -1)) { mod = null; return(null); } } SampleLoader.SL_LoadSamples(); ModPlayer.Player_Init(mod); } else { mod = null; LoadFailed(loader, null); } } else { throw new Exception("File {0} didn't match any of the loader types"); } return(mod); }