示例#1
0
        private static void WriteMap(ImcFile imc, BinaryWriter file, List <ImcBlock> blocks, int mapSize)
        {
            file.Write(Encoding.ASCII.GetBytes("MAP "));
            file.WriteBigEndian(mapSize);

            file.Write(Encoding.ASCII.GetBytes("FRMT"));
            file.WriteBigEndian(20);
            file.WriteBigEndian(mapSize + 24);
            file.WriteBigEndian(1);
            file.WriteBigEndian(imc.BitsPerSample);
            file.WriteBigEndian(imc.SampleRate);
            file.WriteBigEndian(imc.Channels);

            foreach (var block in blocks)
            {
                block.Write(file, mapSize + 24);
            }

            file.Write(Encoding.ASCII.GetBytes("STOP"));
            file.WriteBigEndian(4);
            file.WriteBigEndian(imc.DataRawSize + mapSize + 24);
        }
        public static ImcFile FromFile(string fileName)
        {
            var imc = new ImcFile();

            imc.FileName = fileName;

            FileStream filestream = null;

            try
            {
                filestream = new FileStream(fileName, FileMode.Open, FileAccess.Read);

                using (BinaryReader file = new BinaryReader(filestream))
                {
                    filestream = null;

                    if (Encoding.ASCII.GetString(file.ReadBytes(4)) != "MCMP")
                    {
                        throw new InvalidDataException();
                    }

                    int entriesCount = file.ReadBigEndianInt16();

                    file.BaseStream.Seek(9, SeekOrigin.Current);

                    for (int i = 0; i < entriesCount - 1; i++)
                    {
                        var entry = new ImcEntry();

                        entry.Codec = file.ReadByte();
                        entry.RawSize = file.ReadBigEndianInt32();
                        entry.CompressedSize = file.ReadBigEndianInt32();

                        imc.Entries.Add(entry);
                    }

                    int codecsCount = file.ReadBigEndianInt16() / 5;

                    for (int i = 0; i < codecsCount; i++)
                    {
                        imc.Codecs.Add(Encoding.ASCII.GetString(file.ReadBytes(4)));
                        file.ReadByte();
                    }

                    if (imc.Codecs.Count != 2
                        || !string.Equals(imc.Codecs[0], "NULL", StringComparison.Ordinal)
                        || !string.Equals(imc.Codecs[1], "VIMA", StringComparison.Ordinal))
                    {
                        throw new NotSupportedException();
                    }

                    if (Encoding.ASCII.GetString(file.ReadBytes(4)) != "iMUS")
                    {
                        throw new InvalidDataException();
                    }

                    int imusRawSize = file.ReadInt32();

                    if (Encoding.ASCII.GetString(file.ReadBytes(4)) != "MAP ")
                    {
                        throw new InvalidDataException();
                    }

                    ImcFile.ReadMap(imc, file, imusRawSize);

                    if (Encoding.ASCII.GetString(file.ReadBytes(4)) != "DATA")
                    {
                        throw new InvalidDataException();
                    }

                    imc.DataRawSize = file.ReadBigEndianInt32();

                    if (imc.DataRawSize != imc.Entries.Sum(t => t.RawSize))
                    {
                        throw new InvalidDataException();
                    }

                    foreach (var entry in imc.Entries)
                    {
                        entry.Data = file.ReadBytes(entry.CompressedSize);
                    }

                    if (file.BaseStream.Position != file.BaseStream.Length)
                    {
                        throw new InvalidDataException("End of file not reached.");
                    }

                    imc.ComputeEntriesOffsets();
                }
            }
            finally
            {
                if (filestream != null)
                {
                    filestream.Dispose();
                }
            }

            return imc;
        }
        private static void WriteMap(ImcFile imc, BinaryWriter file, List<ImcBlock> blocks, int mapSize)
        {
            file.Write(Encoding.ASCII.GetBytes("MAP "));
            file.WriteBigEndian(mapSize);

            file.Write(Encoding.ASCII.GetBytes("FRMT"));
            file.WriteBigEndian(20);
            file.WriteBigEndian(mapSize + 24);
            file.WriteBigEndian(1);
            file.WriteBigEndian(imc.BitsPerSample);
            file.WriteBigEndian(imc.SampleRate);
            file.WriteBigEndian(imc.Channels);

            foreach (var block in blocks)
            {
                block.Write(file, mapSize + 24);
            }

            file.Write(Encoding.ASCII.GetBytes("STOP"));
            file.WriteBigEndian(4);
            file.WriteBigEndian(imc.DataRawSize + mapSize + 24);
        }
        private static void ReadMap(ImcFile imc, BinaryReader file, int imusRawSize)
        {
            int mapSize = file.ReadBigEndianInt32();

            if (Encoding.ASCII.GetString(file.ReadBytes(4)) != "FRMT")
            {
                throw new InvalidDataException();
            }

            int frmtSize = file.ReadBigEndianInt32();

            if (frmtSize != 20)
            {
                throw new InvalidDataException();
            }

            int frmtPosition = file.ReadBigEndianInt32();

            if (mapSize + 24 != frmtPosition)
            {
                throw new InvalidDataException();
            }

            int frmtIsBigEndian = file.ReadBigEndianInt32();

            if (frmtIsBigEndian != 1)
            {
                throw new InvalidDataException();
            }

            imc.BitsPerSample = file.ReadBigEndianInt32();
            imc.SampleRate = file.ReadBigEndianInt32();
            imc.Channels = file.ReadBigEndianInt32();

            int blockAlign = imc.BlockAlign;

            while (true)
            {
                string fourcc = Encoding.ASCII.GetString(file.ReadBytes(4));

                if (string.Equals(fourcc, "STOP", StringComparison.Ordinal))
                {
                    int size = file.ReadBigEndianInt32();

                    if (size != 4)
                    {
                        throw new InvalidDataException();
                    }

                    int position = file.ReadBigEndianInt32() - frmtPosition;

                    if (position != imusRawSize - mapSize - 16)
                    {
                        throw new InvalidDataException();
                    }

                    break;
                }

                switch (fourcc)
                {
                    case "REGN":
                        var regn = new ImcRegnBlock();
                        regn.Read(file, frmtPosition);
                        break;

                    case "TEXT":
                        var text = new ImcTextBlock();
                        text.Read(file, frmtPosition);

                        imc.Map.Add(new ImcText
                        {
                            Position = text.Position / blockAlign,
                            Text = text.Text
                        });
                        break;

                    case "JUMP":
                        var jump = new ImcJumpBlock();
                        jump.Read(file, frmtPosition);

                        imc.Map.Add(new ImcJump
                        {
                            Position = jump.Position / blockAlign,
                            Destination = jump.Destination / blockAlign,
                            HookId = jump.HookId,
                            Delay = jump.Delay
                        });
                        break;

                    default:
                        throw new NotSupportedException("Unknown block " + fourcc);
                }
            }
        }
示例#5
0
        public void Play(ImcFile imc, int start, int end)
        {
            this.Stop();

            this.player.Stream = imc.RetrieveWaveStream(start, end);
            this.Length = (double)(end - start) / imc.SampleRate;
            this.StreamName = imc.Name;

            this.player.Play();
            this.timer.Start();
        }
示例#6
0
        public static ImcFile FromFile(string fileName)
        {
            var imc = new ImcFile();

            imc.FileName = fileName;

            FileStream filestream = null;

            try
            {
                filestream = new FileStream(fileName, FileMode.Open, FileAccess.Read);

                using (BinaryReader file = new BinaryReader(filestream))
                {
                    filestream = null;

                    if (Encoding.ASCII.GetString(file.ReadBytes(4)) != "MCMP")
                    {
                        throw new InvalidDataException();
                    }

                    int entriesCount = file.ReadBigEndianInt16();

                    file.BaseStream.Seek(9, SeekOrigin.Current);

                    for (int i = 0; i < entriesCount - 1; i++)
                    {
                        var entry = new ImcEntry();

                        entry.Codec          = file.ReadByte();
                        entry.RawSize        = file.ReadBigEndianInt32();
                        entry.CompressedSize = file.ReadBigEndianInt32();

                        imc.Entries.Add(entry);
                    }

                    int codecsCount = file.ReadBigEndianInt16() / 5;

                    for (int i = 0; i < codecsCount; i++)
                    {
                        imc.Codecs.Add(Encoding.ASCII.GetString(file.ReadBytes(4)));
                        file.ReadByte();
                    }

                    if (imc.Codecs.Count != 2 ||
                        !string.Equals(imc.Codecs[0], "NULL", StringComparison.Ordinal) ||
                        !string.Equals(imc.Codecs[1], "VIMA", StringComparison.Ordinal))
                    {
                        throw new NotSupportedException();
                    }

                    if (Encoding.ASCII.GetString(file.ReadBytes(4)) != "iMUS")
                    {
                        throw new InvalidDataException();
                    }

                    int imusRawSize = file.ReadInt32();

                    if (Encoding.ASCII.GetString(file.ReadBytes(4)) != "MAP ")
                    {
                        throw new InvalidDataException();
                    }

                    ImcFile.ReadMap(imc, file, imusRawSize);

                    if (Encoding.ASCII.GetString(file.ReadBytes(4)) != "DATA")
                    {
                        throw new InvalidDataException();
                    }

                    imc.DataRawSize = file.ReadBigEndianInt32();

                    if (imc.DataRawSize != imc.Entries.Sum(t => t.RawSize))
                    {
                        throw new InvalidDataException();
                    }

                    foreach (var entry in imc.Entries)
                    {
                        entry.Data = file.ReadBytes(entry.CompressedSize);
                    }

                    if (file.BaseStream.Position != file.BaseStream.Length)
                    {
                        throw new InvalidDataException("End of file not reached.");
                    }

                    imc.ComputeEntriesOffsets();
                }
            }
            finally
            {
                if (filestream != null)
                {
                    filestream.Dispose();
                }
            }

            return(imc);
        }
示例#7
0
        private static void ReadMap(ImcFile imc, BinaryReader file, int imusRawSize)
        {
            int mapSize = file.ReadBigEndianInt32();

            if (Encoding.ASCII.GetString(file.ReadBytes(4)) != "FRMT")
            {
                throw new InvalidDataException();
            }

            int frmtSize = file.ReadBigEndianInt32();

            if (frmtSize != 20)
            {
                throw new InvalidDataException();
            }

            int frmtPosition = file.ReadBigEndianInt32();

            if (mapSize + 24 != frmtPosition)
            {
                throw new InvalidDataException();
            }

            int frmtIsBigEndian = file.ReadBigEndianInt32();

            if (frmtIsBigEndian != 1)
            {
                throw new InvalidDataException();
            }

            imc.BitsPerSample = file.ReadBigEndianInt32();
            imc.SampleRate    = file.ReadBigEndianInt32();
            imc.Channels      = file.ReadBigEndianInt32();

            int blockAlign = imc.BlockAlign;

            while (true)
            {
                string fourcc = Encoding.ASCII.GetString(file.ReadBytes(4));

                if (string.Equals(fourcc, "STOP", StringComparison.Ordinal))
                {
                    int size = file.ReadBigEndianInt32();

                    if (size != 4)
                    {
                        throw new InvalidDataException();
                    }

                    int position = file.ReadBigEndianInt32() - frmtPosition;

                    if (position != imusRawSize - mapSize - 16)
                    {
                        throw new InvalidDataException();
                    }

                    break;
                }

                switch (fourcc)
                {
                case "REGN":
                    var regn = new ImcRegnBlock();
                    regn.Read(file, frmtPosition);
                    break;

                case "TEXT":
                    var text = new ImcTextBlock();
                    text.Read(file, frmtPosition);

                    imc.Map.Add(new ImcText
                    {
                        Position = text.Position / blockAlign,
                        Text     = text.Text
                    });
                    break;

                case "JUMP":
                    var jump = new ImcJumpBlock();
                    jump.Read(file, frmtPosition);

                    imc.Map.Add(new ImcJump
                    {
                        Position    = jump.Position / blockAlign,
                        Destination = jump.Destination / blockAlign,
                        HookId      = jump.HookId,
                        Delay       = jump.Delay
                    });
                    break;

                default:
                    throw new NotSupportedException("Unknown block " + fourcc);
                }
            }
        }
示例#8
0
        public void Save(string fileName)
        {
            FileStream filestream = null;

            try
            {
                filestream = new FileStream(fileName, FileMode.Create, FileAccess.Write);

                using (BinaryWriter file = new BinaryWriter(filestream))
                {
                    filestream = null;

                    int mapSize;
                    var blocks = this.BuildMapBlocks(out mapSize);

                    file.Write(Encoding.ASCII.GetBytes("MCMP"));

                    file.WriteBigEndian((short)(this.Entries.Count + 1));

                    file.Write((byte)0);
                    file.WriteBigEndian(mapSize + 24);
                    file.WriteBigEndian(mapSize + 24);

                    foreach (var entry in this.Entries)
                    {
                        file.Write(entry.Codec);
                        file.WriteBigEndian(entry.RawSize);
                        file.WriteBigEndian(entry.CompressedSize);
                    }

                    file.WriteBigEndian((short)(this.Codecs.Count * 5));

                    foreach (var codec in this.Codecs)
                    {
                        file.Write(Encoding.ASCII.GetBytes(codec));
                        file.Write((byte)0);
                    }

                    file.Write(Encoding.ASCII.GetBytes("iMUS"));
                    file.Write(this.DataRawSize + mapSize + 16);

                    ImcFile.WriteMap(this, file, blocks, mapSize);

                    file.Write(Encoding.ASCII.GetBytes("DATA"));
                    file.WriteBigEndian(this.DataRawSize);

                    foreach (var entry in this.Entries)
                    {
                        file.Write(entry.Data);
                    }

                    this.FileName = fileName;
                }
            }
            finally
            {
                if (filestream != null)
                {
                    filestream.Dispose();
                }
            }
        }