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); } } }
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(); }
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); }
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(); } } }