public void Init(StreamReader.IReader fileReader, UInt64 offset, ref VGM_Stream vgmStream, bool InitReader, UInt64 fileLength) { bool loop_flag = (fileReader.Read_32bits(offset + 0x1C) != 0xFFFFFFFF); int channel_count = (int)fileReader.Read_32bits(offset + 0x10); int sample_rate = (int)fileReader.Read_32bits(offset + 0x0c); /* 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 + 0x24) / 16 * 28 / channel_count; vgmStream.vgmLayout = new Interleave(); vgmStream.vgmInterleaveBlockSize = (int)fileReader.Read_32bits(offset + 0x14); vgmStream.vgmDecoder = new PSX_Decoder(); if (loop_flag) { vgmStream.vgmLoopStartSample = ((int)fileReader.Read_32bits(offset + 0x18) * 0x10) / 16 * 28 / vgmStream.vgmChannelCount; vgmStream.vgmLoopEndSample = ((int)fileReader.Read_32bits(offset + 0x1C) * 0x10) / 16 * 28 / vgmStream.vgmChannelCount; if (vgmStream.vgmLoopEndSample > vgmStream.vgmTotalSamples) { vgmStream.vgmLoopStartSample = ((int)fileReader.Read_32bits(offset + 0x18)) / 16 * 28 / vgmStream.vgmChannelCount; vgmStream.vgmLoopEndSample = ((int)fileReader.Read_32bits(offset + 0x1C)) / 16 * 28 / vgmStream.vgmChannelCount; } } UInt64 start_offset = offset + 0x28; if (!VGM_Utils.IsPS2ADPCM(fileReader, start_offset, start_offset + 0x8000)) { start_offset = offset + 0x800; if (!VGM_Utils.IsPS2ADPCM(fileReader, start_offset, start_offset + 0x8000)) { start_offset = offset + 0x28; vgmStream.vgmDecoder = new PCM16_Decoder(); vgmStream.vgmDecoderType = VGM_Decoder_Type.PCM16BITS; vgmStream.vgmTotalSamples = (int)fileReader.Read_32bits(offset + 0x24) / 2 / channel_count; if (loop_flag) { vgmStream.vgmLoopStartSample = (int)fileReader.Read_32bits(offset + 0x18); vgmStream.vgmLoopEndSample = (int)fileReader.Read_32bits(offset + 0x1C); } } } 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 ("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); }