Ejemplo n.º 1
0
        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);
                }
            }
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
 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));
 }
Ejemplo n.º 7
0
 public UInt64 IsFormat(StreamReader.IReader fileReader, UInt64 offset, UInt64 length)
 {
     m_Filename = System.IO.Path.GetFileNameWithoutExtension(fileReader.Read_String(offset + 0x32, 0x1e));
     return(length);
 }