public SoundEditor(EngineDescription buildInfo, string cacheLocation, TagEntry tag, ICacheFile cache, IStreamManager streamManager) { InitializeComponent(); _buildInfo = buildInfo; _cacheLocation = cacheLocation; _tag = tag; _cache = cache; _streamManager = streamManager; var viewModel = new ViewModel(); DataContext = viewModel; viewModel.TagName = _tag.TagFileName; viewModel.Sound = _sound; if (!_cache.ResourceMetaLoader.SupportsSounds) { IsEnabled = false; MetroMessageBox.Show("Unsupported", "Assembly doesn't support sounds on this build of Halo yet."); return; } using (var reader = _streamManager.OpenRead()) { _soundResourceGestalt = _cache.LoadSoundResourceGestaltData(reader); _sound = _cache.ResourceMetaLoader.LoadSoundMeta(_tag.RawTag, reader); var resourceTable = _cache.Resources.LoadResourceTable(reader); _soundResource = resourceTable.Resources.First(r => r.Index == _sound.ResourceIndex); _resourcePages = new [] { _soundResource.Location.PrimaryPage, _soundResource.Location.SecondaryPage, _soundResource.Location.TertiaryPage, }; viewModel.ResourcePages = new ObservableCollection <ResourcePage>(_resourcePages.ToList()); } var playback = _soundResourceGestalt.SoundPlaybacks[_sound.PlaybackIndex]; var soundPermutations = new ISoundPermutation[playback.EncodedPermutationCount]; for (var i = 0; i < playback.EncodedPermutationCount; i++) { var permutation = _soundResourceGestalt.SoundPermutations[i + playback.FirstPermutationIndex]; soundPermutations[i] = permutation; viewModel.Permutations.Add(new ViewModel.ViewPermutation { Name = _cache.StringIDs.GetString(permutation.SoundName), Index = i, SoundPermutation = permutation }); } }
private byte[] ExtractRawPerm(ISoundPermutation permutation) { var data = ExtractRaw(); var permutationData = new List <byte>(); var memoryStream = new MemoryStream(data); var stream = new EndianStream(memoryStream, Endian.BigEndian); for (var i = permutation.PermutationChunkIndex; i < permutation.ChunkCount + permutation.PermutationChunkIndex; i++) { var permutationChunk = _soundResourceGestalt.SoundPermutationChunks[i]; stream.SeekTo(permutationChunk.Offset); permutationData.AddRange(stream.ReadBlock(permutationChunk.Size)); } return(permutationData.ToArray()); }