示例#1
0
        ArcFile OpenTp055Arc(ArcView file)
        {
            uint index_offset = 0x20;
            uint data_offset;

            for (;;)
            {
                data_offset = file.View.ReadUInt32(index_offset);
                if (0 != data_offset)
                {
                    break;
                }
                index_offset += 0x10;
                if (0xA010 == index_offset)
                {
                    return(null);
                }
            }
            if (data_offset >= file.MaxOffset)
            {
                return(null);
            }
            var dir = new List <Entry>();

            while (index_offset < data_offset)
            {
                var offset = file.View.ReadUInt32(index_offset);
                if (0 != offset)
                {
                    if (offset >= file.MaxOffset)
                    {
                        return(null);
                    }
                    var name  = string.Format("TP#{0:D6}.wav", index_offset / 0x10 - 1);
                    var entry = new Tp055Entry {
                        Name       = name,
                        Offset     = offset,
                        ChunkCount = file.View.ReadInt32(index_offset + 4),
                    };
                    dir.Add(entry);
                }
                index_offset += 0x10;
            }
            for (int i = 0; i < dir.Count - 1; ++i)
            {
                dir[i].Size = (uint)(dir[i + 1].Offset - dir[i].Offset);
            }
            dir[dir.Count - 1].Size = (uint)(file.MaxOffset - dir[dir.Count - 1].Offset);
            return(new TpArchive(file, this, dir));
        }
示例#2
0
        Stream OpenVoice055Entry(ArcFile arc, Tp055Entry entry)
        {
            int pcm_size = entry.ChunkCount * 0x800;
            var offset   = entry.Offset;
            var wav_mem  = new MemoryStream(0x24 + pcm_size);

            using (var wav = new BinaryWriter(wav_mem, Encoding.ASCII, true))
            {
                WriteWavHeader(wav, 1, 22050, pcm_size);
                var buffer = new byte[0x402];
                var output = new int[0x400];
                for (int i = 0; i < entry.ChunkCount; ++i)
                {
                    int ctl = arc.File.View.ReadByte(offset++) & 0x3F;
                    for (int j = 0; j < output.Length; ++j)
                    {
                        output[j] = 0;
                    }
                    for (; ctl != 0; ctl >>= 1)
                    {
                        if (0 == (ctl & 1))
                        {
                            continue;
                        }
                        arc.File.View.Read(offset, buffer, 0, 0x402);
                        offset += 0x402;
                        int pcm    = LittleEndian.ToInt16(buffer, 1);
                        int dst    = 0;
                        int addend = buffer[0] << 8;
                        output[dst++] += pcm;
                        for (int src = 3; src < buffer.Length; ++src)
                        {
                            byte v    = buffer[src];
                            int  diff = v + addend;
                            pcm           += WaveTable1.Value[diff];
                            output[dst++] += (short)pcm;
                            addend        += WaveTable2.Value[v];
                            if (addend < 0)
                            {
                                addend = 0;
                            }
                            else if (addend >= 16384)
                            {
                                addend = 16128;
                            }
                        }
                    }
                    for (int j = 0; j < output.Length; ++j)
                    {
                        int pcm = output[j];
                        if (pcm > 32767)
                        {
                            pcm = 32767;
                        }
                        else if (pcm < -32767)
                        {
                            pcm = -32767;
                        }
                        wav.Write((short)pcm);
                    }
                }
            }
            wav_mem.Position = 0;
            return(wav_mem);
        }