Beispiel #1
0
        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);
        }
Beispiel #2
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);
        }
Beispiel #4
0
        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);
        }