public UInt64 IsFormat(StreamReader.IReader fileReader, UInt64 offset, UInt64 length) { // Check for Mark ID ("RIFF") if (fileReader.Read_32bitsBE(offset) != 0x52494646) { return(0); } // Check for Mark ID ("WAVE" + "fmt ") if ((fileReader.Read_32bitsBE(offset + 0x08) == 0x57415645) && (fileReader.Read_32bitsBE(offset + 0x0C) == 0x666D7420)) { if (fileReader.Read_16bits(offset + 0x14) == 0xFFFE) { if ((fileReader.Read_32bitsBE(offset + 0x2C) == 0xBFAA23E9) && (fileReader.Read_32bitsBE(offset + 0x30) == 0x58CB7144) && (fileReader.Read_32bitsBE(offset + 0x34) == 0xA119FFFA)) { if (VGM_Utils.CheckSampleRate(fileReader.Read_16bits(offset + 0x18))) { length = fileReader.Read_32bits(offset + 0x04) + 0x8; return(length); } } } } return(0); }
public void Init(StreamReader.IReader fileReader, UInt64 offset, ref VGM_Stream vgmStream, bool InitReader, UInt64 fileLength) { Int16[] coef = new Int16[16] { 0x04ab, -0x0313, 0x0789, -0x0121, 0x09a2, -0x051b, 0x0c90, -0x053f, 0x084d, -0x055c, 0x0982, -0x0209, 0x0af6, -0x0506, 0x0be6, -0x040b }; int channel_count = fileReader.Read_8Bits(offset + 0x16); /* build the VGMSTREAM */ VGM_Utils.allocate_vgmStream(ref vgmStream, channel_count, false); vgmStream.vgmDecoder = new DSP_Decoder(); vgmStream.vgmLayout = new Interleave(); vgmStream.vgmChannelCount = channel_count; vgmStream.vgmLoopFlag = false; vgmStream.vgmTotalSamples = (int)(fileReader.Read_32bits(offset + 0x42) / 8 * 14) / channel_count; vgmStream.vgmSampleRate = fileReader.Read_16bits(offset + 0x18); if (channel_count == 1) { vgmStream.vgmLayout = new NoLayout(); } else { vgmStream.vgmLayout = new Interleave(); vgmStream.vgmLayoutType = VGM_Layout_Type.Interleave_With_Shortblock; } vgmStream.vgmInterleaveBlockSize = 0x08; int i, j; for (j = 0; j < vgmStream.vgmChannelCount; j++) { for (i = 0; i < 16; i++) { vgmStream.vgmChannel[j].adpcm_coef[i] = coef[i]; } } UInt64 start_offset = offset + 0x46; if (InitReader) { for (i = 0; i < channel_count; i++) { vgmStream.vgmChannel[i].fReader = (StreamReader.IReader)Activator.CreateInstance(fileReader.GetType());; vgmStream.vgmChannel[i].fReader.Open(fileReader.GetFilename()); vgmStream.vgmChannel[i].fReader.SetSessionID(fileReader.GetSessionID()); vgmStream.vgmChannel[i].currentOffset = start_offset + (UInt64)(i * vgmStream.vgmInterleaveBlockSize); } } }
public FST IsContainer(StreamReader.IReader fileReader, FST.cFile file, int index) { if (System.IO.Path.GetExtension(file.Filename).ToUpper() != ".PAK") { return(null); } FST tmpFST = new FST(); UInt64 offset = file.FileStartOffset; // check for marker ID if ((fileReader.Read_16bits(offset + 0x0A) != 0xA3DA)) { return(null); } uint fileCount = (uint)fileReader.Read_32bits(offset + 0x08) ^ 0xa3da79b6; uint filenameSize = fileReader.Read_32bits(offset + 0x0C); uint folderNameSize = fileReader.Read_32bits(offset + 0x10); byte[] folderName = fileReader.Read(offset + 0x14, folderNameSize); for (int i = 0; i < folderNameSize; i++) { folderName[i] = (byte)(folderName[i] ^ 0xC5); } string folder = MemoryReader.GetString(ref folderName, 0); byte[] buffer = fileReader.Read(offset + 0x14 + folderNameSize + 1, (fileCount * 0x10)); byte[] bufferName = fileReader.Read(offset + 0x14 + folderNameSize + 1 + (fileCount * 0x10), filenameSize); for (int i = 0; i < filenameSize; i++) { bufferName[i] = (byte)(bufferName[i] ^ 0xB5); } for (uint i = 0; i < fileCount; i++) { uint fileNameOffset = MemoryReader.ReadLong(ref buffer, (i * 0x10)); uint fileOffset = MemoryReader.ReadLong(ref buffer, (i * 0x10) + 0x04); uint fileSize = MemoryReader.ReadLong(ref buffer, (i * 0x10) + 0x08); string filename = string.Empty; filename = MemoryReader.GetString(ref bufferName, fileNameOffset); tmpFST.FST_File.Add(new FST.cFile(file.SessionID, (uint)index, 0, filename, file.FileOwner, file.FilePath, offset + fileOffset, fileSize, tmpFST.EmptyDateTime, false)); } return(tmpFST); }
public FST IsContainer(StreamReader.IReader fileReader, FST.cFile file, int index) { if (System.IO.Path.GetExtension(file.Filename).ToUpper() != ".AFS") { return(null); } byte[] filenameBuffer = null; FST tmpFST = new FST(); UInt64 offset = file.FileStartOffset; // check for AFS marker if ((fileReader.Read_32bitsBE(offset) != 0x41465300) && (fileReader.Read_32bitsBE(offset) != 0x41465320)) { return(null); } //string archiveName = fileReader.Read_String(offset + 0x08, 0x50); uint fileCount = (uint)fileReader.Read_16bits(offset + 0x04); byte[] buffer = fileReader.Read(offset + 0x08, (fileCount * 8)); UInt64 filenameOffset = fileReader.Read_32bits(offset + 0x08 + (fileCount * 8)); if (filenameOffset != 0) { uint filenameSize = fileReader.Read_32bits(offset + 0x08 + (fileCount * 8) + 4); filenameBuffer = fileReader.Read(offset + filenameOffset, filenameSize); } for (uint i = 0; i < fileCount; i++) { uint fileOffset = MemoryReader.ReadLong(ref buffer, (i * 8)); uint fileSize = MemoryReader.ReadLong(ref buffer, (i * 8) + 0x04); string filename = string.Empty; if ((filenameOffset != 0) && (filenameBuffer.Length != 0)) { filename = MemoryReader.GetString(ref filenameBuffer, (i * 0x30), 0x20); } tmpFST.FST_File.Add(new FST.cFile(file.SessionID, (uint)index, 0, filename, file.FileOwner, file.FilePath, offset + fileOffset, fileSize, tmpFST.EmptyDateTime, false)); } return(tmpFST); }