/// <summary> /// Writes this instance to an output stream. /// </summary> /// <param name="output">output stream</param> public void Write(Stream output) { byte[] buffer = Reinterpret.Object(header); output.Write(buffer, 0, buffer.Length); for (int i = 0; i < blocks.Count; i++) { blocks[i].Write(output); } }
private void FlushIndex(int modOffset) { map.Position = header.IndexOffset + modOffset; writer.Write(Reinterpret.Object <IndexHeader>(index)); map.Position += index.TagTypeCount * 12; for (int i = 0; i < index.TagCount; i++) { writer.Write(Reinterpret.Object <IndexElement>(tags[i])); } }
public PCM(short channels, int sampleRate) : base("WAVE") { format = new PCMFormat(); format.ChannelCount = channels; format.SignificantBitsPerSample = 16; format.BlockAlign = (short)(format.SignificantBitsPerSample / 8 * format.ChannelCount); format.SampleRate = sampleRate; format.BytesPerSecond = format.SampleRate * format.BlockAlign; format.CompressionCode = 1; format.ExtraByteCount = 0; AddBlock("fmt ", Reinterpret.Object(format)); }
public XboxADPCM(short channels, int sampleRate) : base("WAVE") { format = new XboxAdpcmFormat(); format.ChannelCount = channels; format.BlockAlign = (short)(format.ChannelCount * 36); format.SampleRate = sampleRate; format.BytesPerSecond = (format.SampleRate * format.BlockAlign) >> 6; format.SignificantBitsPerSample = 4; format.CompressionCode = 105; format.ExtendedByteCount = 2; format.SamplesPerBlock = 64; AddBlock("fmt ", Reinterpret.Object(format)); }
private void FlushHeader() { map.Position = 0; writer.Write(Reinterpret.Object <MapHeader>(header)); }
public void WriteToMapStream(BinaryWriter writer, IList <string> strings, int magic) { int currentEnd; unchecked { magic += (int)writer.BaseStream.Position; currentEnd = MetaRootSize + magic; } // tier 0 writer.Write(playbackParameters.Count); writer.Write(currentEnd); currentEnd += playbackParameters.Count * Marshal.SizeOf(typeof(Playback)); currentEnd = Alignment.Align(currentEnd, AlignmentConstants.BlockAlignment); writer.Write(scales.Count); writer.Write(currentEnd); currentEnd += scales.Count * Marshal.SizeOf(typeof(Scale)); currentEnd = Alignment.Align(currentEnd, AlignmentConstants.BlockAlignment); writer.Write(importNames.Count); writer.Write(currentEnd); currentEnd += importNames.Count * Marshal.SizeOf(typeof(ImportName)); currentEnd = Alignment.Align(currentEnd, AlignmentConstants.BlockAlignment); writer.Write(pitchRangeParameters.Count); writer.Write(currentEnd); currentEnd += pitchRangeParameters.Count * Marshal.SizeOf(typeof(PitchRangeParametersBlock)); currentEnd = Alignment.Align(currentEnd, AlignmentConstants.BlockAlignment); writer.Write(pitchRanges.Count); writer.Write(currentEnd); currentEnd += pitchRanges.Count * Marshal.SizeOf(typeof(PitchRange)); currentEnd = Alignment.Align(currentEnd, AlignmentConstants.BlockAlignment); writer.Write(permutations.Count); writer.Write(currentEnd); currentEnd += permutations.Count * Marshal.SizeOf(typeof(Permutation)); currentEnd = Alignment.Align(currentEnd, AlignmentConstants.BlockAlignment); writer.Write(customPlaybacks.Count); writer.Write(currentEnd); currentEnd += customPlaybacks.Count * Marshal.SizeOf(typeof(CustomPlayback)); currentEnd = Alignment.Align(currentEnd, AlignmentConstants.BlockAlignment); writer.Write(runtimeFlags.Count); writer.Write(currentEnd); currentEnd += runtimeFlags.Count * Marshal.SizeOf(typeof(RuntimePermutationFlags)); currentEnd = Alignment.Align(currentEnd, AlignmentConstants.BlockAlignment); writer.Write(chunks.Count); writer.Write(currentEnd); currentEnd += chunks.Count * Marshal.SizeOf(typeof(Chunk)); currentEnd = Alignment.Align(currentEnd, AlignmentConstants.BlockAlignment); writer.Write(promotions.Count); writer.Write(currentEnd); currentEnd += promotions.Count * Marshal.SizeOf(typeof(Promotion)); currentEnd = Alignment.Align(currentEnd, AlignmentConstants.BlockAlignment); writer.Write(extraInfos.Count); writer.Write(currentEnd); currentEnd += extraInfos.Count * Marshal.SizeOf(typeof(ExtraInfo)); currentEnd = Alignment.Align(currentEnd, AlignmentConstants.BlockAlignment); // tier 1 for (int i = 0; i < playbackParameters.Count; i++) { writer.Write(Reinterpret.Object <Playback>(playbackParameters[i])); } writer.BaseStream.Position = Alignment.Align((int)writer.BaseStream.Position, AlignmentConstants.BlockAlignment); for (int i = 0; i < scales.Count; i++) { writer.Write(Reinterpret.Object <Scale>(scales[i])); } writer.BaseStream.Position = Alignment.Align((int)writer.BaseStream.Position, AlignmentConstants.BlockAlignment); for (int i = 0; i < importNames.Count; i++) { ImportName importName = new ImportName(); short index = (short)strings.IndexOf(importNames[i]); if (index >= 0) { importName.Index = index; importName.Size = (byte)importNames[i].Length; } writer.Write(Reinterpret.Object <ImportName>(importName)); } writer.BaseStream.Position = Alignment.Align((int)writer.BaseStream.Position, AlignmentConstants.BlockAlignment); for (int i = 0; i < pitchRangeParameters.Count; i++) { writer.Write(Reinterpret.Object <PitchRangeParametersBlock>(pitchRangeParameters[i])); } writer.BaseStream.Position = Alignment.Align((int)writer.BaseStream.Position, AlignmentConstants.BlockAlignment); for (int i = 0; i < pitchRanges.Count; i++) { writer.Write(Reinterpret.Object <PitchRange>(pitchRanges[i])); } writer.BaseStream.Position = Alignment.Align((int)writer.BaseStream.Position, AlignmentConstants.BlockAlignment); for (int i = 0; i < permutations.Count; i++) { writer.Write(Reinterpret.Object <Permutation>(permutations[i])); } writer.BaseStream.Position = Alignment.Align((int)writer.BaseStream.Position, AlignmentConstants.BlockAlignment); for (int i = 0; i < customPlaybacks.Count; i++) { CustomPlayback customPlayback = customPlaybacks[i]; if (customPlayback.FilterCount > 0) { customPlayback.FilterOffset = currentEnd; currentEnd += customPlayback.FilterCount * Marshal.SizeOf(typeof(CustomPlayback.Filter)); currentEnd = Alignment.Align(currentEnd, AlignmentConstants.BlockAlignment); } else { customPlayback.FilterOffset = 0; } if (customPlayback.PitchPlaybackParametersCount > 0) { customPlayback.PitchPlaybackParametersOffset = currentEnd; currentEnd += customPlayback.PitchPlaybackParametersCount * Marshal.SizeOf(typeof(CustomPlayback.PitchPlaybackParameters)); currentEnd = Alignment.Align(currentEnd, AlignmentConstants.BlockAlignment); } else { customPlayback.PitchPlaybackParametersOffset = 0; } writer.Write(Reinterpret.Object <CustomPlayback>(customPlayback)); } writer.BaseStream.Position = Alignment.Align((int)writer.BaseStream.Position, AlignmentConstants.BlockAlignment); for (int i = 0; i < runtimeFlags.Count; i++) { writer.Write(Reinterpret.Object <RuntimePermutationFlags>(runtimeFlags[i])); } writer.BaseStream.Position = Alignment.Align((int)writer.BaseStream.Position, AlignmentConstants.BlockAlignment); for (int i = 0; i < chunks.Count; i++) { writer.Write(Reinterpret.Object <Chunk>(chunks[i])); } writer.BaseStream.Position = Alignment.Align((int)writer.BaseStream.Position, AlignmentConstants.BlockAlignment); for (int i = 0; i < promotions.Count; i++) { Promotion promotion = promotions[i]; if (promotion.RuleCount > 0) { promotion.RuleOffset = currentEnd; currentEnd += promotion.RuleCount * Marshal.SizeOf(typeof(Promotion.Rule)); currentEnd = Alignment.Align(currentEnd, AlignmentConstants.BlockAlignment); } else { promotion.RuleOffset = 0; } if (promotion.TimerCount > 0) { promotion.TimerOffset = currentEnd; currentEnd += promotion.TimerCount * Marshal.SizeOf(typeof(Promotion.Timer)); currentEnd = Alignment.Align(currentEnd, AlignmentConstants.BlockAlignment); } else { promotion.TimerOffset = 0; } writer.Write(Reinterpret.Object <Promotion>(promotion)); } writer.BaseStream.Position = Alignment.Align((int)writer.BaseStream.Position, AlignmentConstants.BlockAlignment); for (int i = 0; i < extraInfos.Count; i++) { ExtraInfo extraInfo = extraInfos[i]; if (extraInfo.ResourceBlock.ResourceCount > 0) { extraInfo.ResourceBlock.ResourceOffset = currentEnd; currentEnd += extraInfo.ResourceBlock.ResourceCount * Marshal.SizeOf(typeof(ResourceBlock.Resource)); currentEnd = Alignment.Align(currentEnd, AlignmentConstants.BlockAlignment); } else { extraInfo.ResourceBlock.ResourceOffset = 0; } writer.Write(Reinterpret.Object <ExtraInfo>(extraInfo)); } writer.BaseStream.Position = Alignment.Align((int)writer.BaseStream.Position, AlignmentConstants.BlockAlignment); // tier 2 for (int i = 0; i < customPlaybacks.Count; i++) { for (int j = 0; j < customPlaybacks[i].FilterCount; j++) { writer.Write(Reinterpret.Object <CustomPlayback.Filter>(customFilters[i][j])); } writer.BaseStream.Position = Alignment.Align((int)writer.BaseStream.Position, AlignmentConstants.BlockAlignment); for (int j = 0; j < customPlaybacks[i].PitchPlaybackParametersCount; j++) { writer.Write(Reinterpret.Object <CustomPlayback.PitchPlaybackParameters>(customPitchParameters[i][j])); } writer.BaseStream.Position = Alignment.Align((int)writer.BaseStream.Position, AlignmentConstants.BlockAlignment); } for (int i = 0; i < promotions.Count; i++) { for (int j = 0; j < promotions[i].RuleCount; j++) { writer.Write(Reinterpret.Object <Promotion.Rule>(promotionRules[i][j])); } writer.BaseStream.Position = Alignment.Align((int)writer.BaseStream.Position, AlignmentConstants.BlockAlignment); for (int j = 0; j < promotions[i].TimerCount; j++) { writer.Write(Reinterpret.Object <Promotion.Timer>(promotionTimers[i][j])); } writer.BaseStream.Position = Alignment.Align((int)writer.BaseStream.Position, AlignmentConstants.BlockAlignment); } for (int i = 0; i < extraInfos.Count; i++) { for (int j = 0; j < extraInfos[i].ResourceBlock.ResourceCount; j++) { writer.Write(Reinterpret.Object <ResourceBlock.Resource>(extraInfoResources[i][j])); } writer.BaseStream.Position = Alignment.Align((int)writer.BaseStream.Position, AlignmentConstants.BlockAlignment); } }
public void WriteToDataStream(BinaryWriter writer) { int currentEnd = (int)writer.BaseStream.Position + MetaRootSize; int importNameBlockSize = 0; for (int i = 0; i < importNames.Count; i++) { importNameBlockSize += importNames[i].Length; } // tier 0 writer.Write(playbackParameters.Count); writer.Write(currentEnd); currentEnd += playbackParameters.Count * Marshal.SizeOf(typeof(Playback)); writer.Write(scales.Count); writer.Write(currentEnd); currentEnd += scales.Count * Marshal.SizeOf(typeof(Scale)); writer.Write(importNames.Count); writer.Write(currentEnd); currentEnd += importNames.Count * sizeof(byte) + importNameBlockSize; writer.Write(pitchRangeParameters.Count); writer.Write(currentEnd); currentEnd += pitchRangeParameters.Count * Marshal.SizeOf(typeof(PitchRangeParametersBlock)); writer.Write(pitchRanges.Count); writer.Write(currentEnd); currentEnd += pitchRanges.Count * Marshal.SizeOf(typeof(PitchRange)); writer.Write(permutations.Count); writer.Write(currentEnd); currentEnd += permutations.Count * Marshal.SizeOf(typeof(Permutation)); writer.Write(customPlaybacks.Count); writer.Write(currentEnd); currentEnd += customPlaybacks.Count * Marshal.SizeOf(typeof(CustomPlayback)); writer.Write(runtimeFlags.Count); writer.Write(currentEnd); currentEnd += runtimeFlags.Count * Marshal.SizeOf(typeof(RuntimePermutationFlags)); writer.Write(chunks.Count); writer.Write(currentEnd); currentEnd += chunks.Count * Marshal.SizeOf(typeof(Chunk)); writer.Write(promotions.Count); writer.Write(currentEnd); currentEnd += promotions.Count * Marshal.SizeOf(typeof(Promotion)); writer.Write(extraInfos.Count); writer.Write(currentEnd); currentEnd += extraInfos.Count * Marshal.SizeOf(typeof(ExtraInfo)); // tier 1 for (int i = 0; i < playbackParameters.Count; i++) { writer.Write(Reinterpret.Object <Playback>(playbackParameters[i])); } for (int i = 0; i < scales.Count; i++) { writer.Write(Reinterpret.Object <Scale>(scales[i])); } for (int i = 0; i < importNames.Count; i++) { writer.Write((byte)Encoding.ASCII.GetByteCount(importNames[i])); writer.Write(Encoding.ASCII.GetBytes(importNames[i])); } for (int i = 0; i < pitchRangeParameters.Count; i++) { writer.Write(Reinterpret.Object <PitchRangeParametersBlock>(pitchRangeParameters[i])); } for (int i = 0; i < pitchRanges.Count; i++) { writer.Write(Reinterpret.Object <PitchRange>(pitchRanges[i])); } for (int i = 0; i < permutations.Count; i++) { writer.Write(Reinterpret.Object <Permutation>(permutations[i])); } for (int i = 0; i < customPlaybacks.Count; i++) { CustomPlayback customPlayback = customPlaybacks[i]; if (customPlayback.FilterCount > 0) { customPlayback.FilterOffset = currentEnd; currentEnd += customPlayback.FilterCount * Marshal.SizeOf(typeof(CustomPlayback.Filter)); } else { customPlayback.FilterOffset = 0; } if (customPlayback.PitchPlaybackParametersCount > 0) { customPlayback.PitchPlaybackParametersOffset = currentEnd; currentEnd += customPlayback.PitchPlaybackParametersCount * Marshal.SizeOf(typeof(CustomPlayback.PitchPlaybackParameters)); } else { customPlayback.PitchPlaybackParametersOffset = 0; } writer.Write(Reinterpret.Object <CustomPlayback>(customPlayback)); } for (int i = 0; i < runtimeFlags.Count; i++) { writer.Write(Reinterpret.Object <RuntimePermutationFlags>(runtimeFlags[i])); } for (int i = 0; i < chunks.Count; i++) { writer.Write(Reinterpret.Object <Chunk>(chunks[i])); } for (int i = 0; i < promotions.Count; i++) { Promotion promotion = promotions[i]; if (promotion.RuleCount > 0) { promotion.RuleOffset = currentEnd; currentEnd += promotion.RuleCount * Marshal.SizeOf(typeof(Promotion.Rule)); } else { promotion.RuleOffset = 0; } if (promotion.TimerCount > 0) { promotion.TimerOffset = currentEnd; currentEnd += promotion.TimerCount * Marshal.SizeOf(typeof(Promotion.Timer)); } else { promotion.TimerOffset = 0; } writer.Write(Reinterpret.Object <Promotion>(promotion)); } for (int i = 0; i < extraInfos.Count; i++) { ExtraInfo extraInfo = extraInfos[i]; if (extraInfo.ResourceBlock.RawSize > 0) { uint encoded = Conversion.ToUInt(currentEnd) & 0x3fffffff; encoded |= Conversion.ToUInt(extraInfo.ResourceBlock.RawOffset) & 0xc0000000; extraInfo.ResourceBlock.RawOffset = Conversion.ToInt(encoded); currentEnd += extraInfo.ResourceBlock.RawSize * sizeof(byte); } else { extraInfo.ResourceBlock.RawOffset = 0; } if (extraInfo.ResourceBlock.ResourceCount > 0) { extraInfo.ResourceBlock.ResourceOffset = currentEnd; currentEnd += extraInfo.ResourceBlock.ResourceCount * Marshal.SizeOf(typeof(ResourceBlock.Resource)); } else { extraInfo.ResourceBlock.ResourceOffset = 0; } writer.Write(Reinterpret.Object <ExtraInfo>(extraInfo)); } // tier 2 for (int i = 0; i < customPlaybacks.Count; i++) { for (int j = 0; j < customPlaybacks[i].FilterCount; j++) { writer.Write(Reinterpret.Object <CustomPlayback.Filter>(customFilters[i][j])); } for (int j = 0; j < customPlaybacks[i].PitchPlaybackParametersCount; j++) { writer.Write(Reinterpret.Object <CustomPlayback.PitchPlaybackParameters>(customPitchParameters[i][j])); } } for (int i = 0; i < promotions.Count; i++) { for (int j = 0; j < promotions[i].RuleCount; j++) { writer.Write(Reinterpret.Object <Promotion.Rule>(promotionRules[i][j])); } for (int j = 0; j < promotions[i].TimerCount; j++) { writer.Write(Reinterpret.Object <Promotion.Timer>(promotionTimers[i][j])); } } for (int i = 0; i < extraInfos.Count; i++) { for (int j = 0; j < extraInfos[i].ResourceBlock.RawSize; j++) { writer.Write(extraInfoData[i][j]); } for (int j = 0; j < extraInfos[i].ResourceBlock.ResourceCount; j++) { writer.Write(Reinterpret.Object <ResourceBlock.Resource>(extraInfoResources[i][j])); } } }
internal void Write(Stream stream) { byte[] buffer = Reinterpret.Object(header); stream.Write(buffer, 0, buffer.Length); stream.Write(data, 0, header.Length); }