Exemplo n.º 1
0
        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);
        }