public void Init(StreamReader.IReader fileReader, UInt64 offset, ref VGM_Stream vgmStream, bool InitReader, UInt64 fileLength) { bool loop_flag = (fileReader.Read_32bits(offset + 0x14) != 0xFFFFFFFF); int channel_count = (int)fileReader.Read_32bits(offset + 0x0C); int sample_rate = (int)fileReader.Read_32bits(offset + 0x18); m_Filename = fileReader.Read_String(offset + 0x34, 0x20); /* build the VGMSTREAM */ VGM_Utils.allocate_vgmStream(ref vgmStream, channel_count, loop_flag); vgmStream.vgmLoopFlag = loop_flag; vgmStream.vgmChannelCount = channel_count; vgmStream.vgmSampleRate = sample_rate; vgmStream.vgmTotalSamples = (int)(fileReader.Read_32bits(offset + 0x08) * 28 / 16); if (channel_count == 1) { vgmStream.vgmLayout = new NoLayout(); } else { vgmStream.vgmLayout = new Interleave(); } vgmStream.vgmInterleaveBlockSize = (int)(fileReader.Read_32bits(offset + 0x04) / 2); vgmStream.vgmDecoder = new PSX_Decoder(); if (loop_flag) { vgmStream.vgmLoopStartSample = (int)fileReader.Read_32bits(offset + 0x14); vgmStream.vgmLoopEndSample = (int)(fileReader.Read_32bits(offset + 0x08) * 28 / 16); } UInt64 start_offset = offset + fileReader.Read_32bits(offset + 0x10); if (InitReader) { for (int 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].startOffset = vgmStream.vgmChannel[i].currentOffset = start_offset + (UInt64)(vgmStream.vgmInterleaveBlockSize * i); } } }
public UInt64 IsFormat(StreamReader.IReader fileReader, UInt64 offset, UInt64 length) { // Check for Mark ID ("NPSF") if (fileReader.Read_32bitsBE(offset) != 0x4E505346) { return(0); } uint channel_count = fileReader.Read_32bits(offset + 0x0C); uint sample_rate = fileReader.Read_32bits(offset + 0x18); if (!VGM_Utils.CheckChannels(channel_count)) { return(0); } if (!VGM_Utils.CheckSampleRate(sample_rate)) { return(0); } if (fileReader.Read_32bits(offset + 0x10) != 0x800) { return(0); } uint fileLength = fileReader.Read_32bits(offset + 0x08); m_Filename = fileReader.Read_String(offset + 0x34, 0x20); if (channel_count == 1) { return(fileLength + 0x800); } else { uint blockCount = fileLength / 0x800; if ((fileLength % 0x800) != 0) { blockCount++; } fileLength = (blockCount * channel_count * 0x800) + 0x800; } return(fileLength); }
public UInt64 IsFormat(StreamReader.IReader fileReader, UInt64 offset, UInt64 length) { // Check for Mark ID ("STER") if (fileReader.Read_32bitsBE(offset) != 0x53544552) { return(0); } // 0x04 = Length of each channels in byte // 0x08 = Length of each channels in byte (in Little Endian Format) if (fileReader.Read_32bits(offset + 0x04) != fileReader.Read_32bitsBE(offset + 0x0C)) { return(0); } // Check for Sample Rate uint sampleRate = fileReader.Read_32bitsBE(offset + 0x10); if ((sampleRate < 11025) || (sampleRate > 48000)) { return(0); } // others data must be equal to 0 if ((fileReader.Read_32bits(offset + 0x14) != 0) || (fileReader.Read_32bits(offset + 0x18) != 0) || (fileReader.Read_32bits(offset + 0x1C) != 0)) { return(0); } // Try to find file Length UInt64 startOffset = 0x30; UInt64 fileLength = fileReader.Read_32bits(offset + 0x04) * 2; //if (!VGM_Utils.IsPS2ADPCM(fileReader, startOffset + offset, startOffset + offset + fileLength)) // return 0; // Filename is stored at offset +0x20 m_Filename = fileReader.Read_String(offset + 0x20, 0x10); return(fileLength + startOffset); }
public UInt64 IsFormat(StreamReader.IReader fileReader, UInt64 offset, UInt64 length) { // Check for Mark ID ("VAGx") where x can be "p","i","s" if ((fileReader.Read_32bitsBE(offset) & 0xFFFFFF00) != 0x56414700) { return(0); } uint vagLength = fileReader.Read_32bitsBE(offset + 0x0C) + 0x30; if (fileReader.Read_32bitsBE(offset + 0x24) == 0x56414778) { uint k = 0; do { k += 0x10; vagLength += 0x10; }while (fileReader.Read_16bitsBE(offset + fileReader.Read_32bitsBE(offset + 0x0C) + k) != 0x0007); } if ((length != (UInt64)(0xFFFFFFFFF)) && (vagLength != length)) { return(0); } // Check for Sample Rate if (!VGM_Utils.CheckSampleRate(fileReader.Read_32bitsBE(offset + 0x10))) { return(0); } if (!VGM_Utils.IsPS2ADPCM(fileReader, offset + 0x30, offset + vagLength)) { return(0); } // Filename is stored at offset +0x20 m_Filename = fileReader.Read_String(offset + 0x20, 0x10); return(vagLength + 0x30); }
public FST IsContainer(StreamReader.IReader fileReader, FST.cFile file, int index) { FST tmpFST = new FST(); UInt64 offset = file.FileStartOffset; // check for file extension ".POD" if (System.IO.Path.GetExtension(file.Filename).ToUpper() != ".POD") { return(null); } // check for POD2 marker if (fileReader.Read_32bitsBE(offset) != 0x504F4432) { return(null); } string archiveName = fileReader.Read_String(offset + 0x08, 0x50); uint fileCount = fileReader.Read_32bits(offset + 0x58); uint filenameOffset = 0x60 + (fileCount * 20); uint filenameSize = fileReader.Read_32bits(offset + 0x68) - filenameOffset; byte[] buffer = fileReader.Read(offset + 0x60, (fileCount * 20)); byte[] filenameBuffer = fileReader.Read(offset + filenameOffset, filenameSize); for (uint i = 0; i < fileCount; i++) { uint nameOffset = MemoryReader.ReadLong(ref buffer, (i * 20)); uint fileSize = MemoryReader.ReadLong(ref buffer, (i * 20) + 0x04); uint fileOffset = MemoryReader.ReadLong(ref buffer, (i * 20) + 0x08); string filename = MemoryReader.GetString(ref filenameBuffer, nameOffset); tmpFST.FST_File.Add(new FST.cFile(file.SessionID, (uint)index, 0, filename, file.Filename, file.FilePath, offset + fileOffset, fileSize, tmpFST.EmptyDateTime, false)); } return(tmpFST); }
public void Init(StreamReader.IReader fileReader, UInt64 offset, ref VGM_Stream vgmStream, bool InitReader, UInt64 fileLength) { m_Filename = System.IO.Path.GetFileNameWithoutExtension(fileReader.Read_String(offset + 0x32, 0x1e)); }
public UInt64 IsFormat(StreamReader.IReader fileReader, UInt64 offset, UInt64 length) { m_Filename = System.IO.Path.GetFileNameWithoutExtension(fileReader.Read_String(offset + 0x32, 0x1e)); return(length); }