コード例 #1
0
 /// <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);
     }
 }
コード例 #2
0
ファイル: Halo2XboxMap.cs プロジェクト: p0lar-bear/Prometheus
        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]));
            }
        }
コード例 #3
0
 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));
 }
コード例 #4
0
ファイル: XboxADPCM.cs プロジェクト: p0lar-bear/Prometheus
 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));
 }
コード例 #5
0
ファイル: Halo2XboxMap.cs プロジェクト: p0lar-bear/Prometheus
 private void FlushHeader()
 {
     map.Position = 0;
     writer.Write(Reinterpret.Object <MapHeader>(header));
 }
コード例 #6
0
        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);
            }
        }
コード例 #7
0
        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]));
                }
            }
        }
コード例 #8
0
 internal void Write(Stream stream)
 {
     byte[] buffer = Reinterpret.Object(header);
     stream.Write(buffer, 0, buffer.Length);
     stream.Write(data, 0, header.Length);
 }