static VGM_HEADER ReadVGMHeader(BinaryReader hFile) { VGM_HEADER CurHead = new VGM_HEADER(); FieldInfo[] fields = typeof(VGM_HEADER).GetFields(); foreach (FieldInfo field in fields) { if (field.FieldType == typeof(uint)) { uint val = hFile.ReadUInt32(); field.SetValue(CurHead, val); } else if (field.FieldType == typeof(ushort)) { ushort val = hFile.ReadUInt16(); field.SetValue(CurHead, val); } else if (field.FieldType == typeof(char)) { char val = hFile.ReadChar(); field.SetValue(CurHead, val); } else if (field.FieldType == typeof(byte)) { byte val = hFile.ReadByte(); field.SetValue(CurHead, val); } } // Header preperations if (CurHead.lngVersion < 0x00000101) { CurHead.lngRate = 0; } if (CurHead.lngVersion < 0x00000110) { CurHead.shtPSG_Feedback = 0x0000; CurHead.bytPSG_SRWidth = 0x00; CurHead.lngHzYM2612 = CurHead.lngHzYM2413; CurHead.lngHzYM2151 = CurHead.lngHzYM2413; } if (CurHead.lngHzPSG != 0) { if (CurHead.shtPSG_Feedback == 0) { CurHead.shtPSG_Feedback = 0x0009; } if (CurHead.bytPSG_SRWidth == 0) { CurHead.bytPSG_SRWidth = 0x10; } } return(CurHead); }
bool OpenVGMFile(string fileName) { bool zipped = CheckIfZip(fileName, 3, "1F-8B-08"); //Read size uint FileSize = 0; FileStream vgmFile = File.Open(fileName, FileMode.Open); if (zipped) { vgmFile.Position = vgmFile.Length - 4; byte[] b = new byte[4]; vgmFile.Read(b, 0, 4); uint fileSize = BitConverter.ToUInt32(b, 0); FileSize = fileSize; vgmFile.Position = 0; GZipStream stream = new GZipStream(vgmFile, CompressionMode.Decompress); _vgmReader = new BinaryReader(stream); zipped = true; } else { FileSize = (uint)vgmFile.Length; _vgmReader = new BinaryReader(vgmFile); } uint fccHeader; fccHeader = (uint)_vgmReader.ReadUInt32(); if (fccHeader != FCC_VGM) { return(false); } _VGMDataLen = FileSize; _VGMHead = ReadVGMHeader(_vgmReader); if (zipped) { _vgmReader.Close(); vgmFile = File.Open(fileName, FileMode.Open); GZipStream stream = new GZipStream(vgmFile, CompressionMode.Decompress); _vgmReader = new BinaryReader(stream); } else { _vgmReader.BaseStream.Seek(0, SeekOrigin.Begin); } //Figure out header offset int offset = (int)_VGMHead.lngDataOffset; if (offset == 0 || offset == 0x0000000C) { offset = 0x40; } _VGMDataOffset = offset; _vgmReader.ReadBytes(offset); _VGMData = _vgmReader.ReadBytes((int)(FileSize - offset)); _vgmReader = new BinaryReader(new MemoryStream(_VGMData)); if ((byte)_vgmReader.PeekChar() == 0x67) { _vgmReader.ReadByte(); if ((byte)_vgmReader.PeekChar() == 0x66) { _vgmReader.ReadByte(); byte type = _vgmReader.ReadByte(); uint size = _vgmReader.ReadUInt32(); _DACData = _vgmReader.ReadBytes((int)size); } } vgmFile.Close(); return(true); }