예제 #1
0
        public static RiffForm Load(Stream fs)
        {
            RiffForm riff = new RiffForm();
            ChunkCollection cks = riff.Cks = new ChunkCollection();
            using (BinaryReader bread = new BinaryReader(fs))
            {
                cks.ckMain = new CHUNK(bread);
                cks.SubChunks = new Dictionary<long,SUBCHUNK>();

                if (cks.ckMain.ckID=="RIFF")
                {
                    while (fs.Position < fs.Length)
                    {
                        SUBCHUNK CX = new SUBCHUNK(bread);
                        long tpos = fs.Position - Marshal.SizeOf(CX);

                        cks.SubChunks.Add(tpos,CX);

                        if (CX.ckID != null)
                            switch (CX.ckID)
                        {
                            case "fmt ":
                                cks.ckFmt = IOHelper.ReadChunk<WaveFormat>(tpos,fs,bread);
                                break;
                            case "fact":
                            case "INFO":
                                cks.ckFact = IOHelper.ReadChunk<ChunkFact>(tpos,fs,bread);
                                break;
                            case "inst":
                                cks.ckInst = IOHelper.ReadChunk<_inst>(tpos,fs,bread);
                                break;
                            case "smpl":
                                cks.ckSmpl = IOHelper.ReadChunk<_smp>(tpos,fs,bread);
                                List<_smpLoop> bob = new List<_smpLoop>();
                                for (int i=0; i<cks.ckSmpl.smpSampleLoops; i++) bob.Add(new _smpLoop(bread));
                                // clear the list.
                                cks.ckSmpLoop = bob.ToArray();
                                bob.Clear();
                                bob = null;
                                break;
                            case "data":
                            case "JUNK":
                            case "PAD ":
                                System.Diagnostics.Debug.Print("Skipping Chunk: '{0}'\n",CX.ckID);
                                break;
                            default:
                                System.Diagnostics.Debug.Print("Unknown Chunk: '{0}'\n",CX.ckID);
            //								Console.Beep();
                                break;
                        }
                        fs.Seek(tpos+CX.ckLength+Marshal.SizeOf(CX),SeekOrigin.Begin);
                    }
                }
                bread.Close();
            }
            fs.Close();
            riff.Cks = cks;
            return riff;
        }
예제 #2
0
        static public RiffForm Load(Stream fs)
        {
            RiffForm        riff = new RiffForm();
            ChunkCollection cks  = riff.Cks = new ChunkCollection();

            using (BinaryReader bread = new BinaryReader(fs))
            {
                cks.ckMain    = new CHUNK(bread);
                cks.SubChunks = new Dictionary <long, SUBCHUNK>();

                if (cks.ckMain.ckID == "RIFF")
                {
                    while (fs.Position < fs.Length)
                    {
                        SUBCHUNK CX   = new SUBCHUNK(bread);
                        long     tpos = fs.Position - Marshal.SizeOf(CX);

                        cks.SubChunks.Add(tpos, CX);

                        if (CX.ckID != null)
                        {
                            switch (CX.ckID)
                            {
                            case "fmt ":
                                cks.ckFmt = IOHelper.ReadChunk <WaveFormat>(tpos, fs, bread);
                                break;

                            case "fact":
                            case "INFO":
                                cks.ckFact = IOHelper.ReadChunk <ChunkFact>(tpos, fs, bread);
                                break;

                            case "inst":
                                cks.ckInst = IOHelper.ReadChunk <_inst>(tpos, fs, bread);
                                break;

                            case "smpl":
                                cks.ckSmpl = IOHelper.ReadChunk <_smp>(tpos, fs, bread);
                                List <_smpLoop> bob = new List <_smpLoop>();
                                for (int i = 0; i < cks.ckSmpl.smpSampleLoops; i++)
                                {
                                    bob.Add(new _smpLoop(bread));
                                }
                                // clear the list.
                                cks.ckSmpLoop = bob.ToArray();
                                bob.Clear();
                                bob = null;
                                break;

                            case "data":
                            case "JUNK":
                            case "PAD ":
                                System.Diagnostics.Debug.Print("Skipping Chunk: '{0}'\n", CX.ckID);
                                break;

                            default:
                                System.Diagnostics.Debug.Print("Unknown Chunk: '{0}'\n", CX.ckID);
//								Console.Beep();
                                break;
                            }
                        }
                        fs.Seek(tpos + CX.ckLength + Marshal.SizeOf(CX), SeekOrigin.Begin);
                    }
                }
                bread.Close();
            }
            fs.Close();
            riff.Cks = cks;
            return(riff);
        }