public XwbEntry Read(Stream source) { var reader = new BinaryReader(source); var result = new XwbEntry { Value = reader.ReadInt32(), Format = _xwbMiniWaveFormatStreamReader.Read(source), PlayRegion = _xwbRegionStreamReader.Read(source), LoopRegion = _xwbSampleRegionStreamReader.Read(source) }; return(result); }
public IEnumerable <XwbSound> Read(Stream source) { var reader = new BinaryReader(source); var sampleCount = 0; var entries = Array.Empty <XwbEntry>(); var names = Array.Empty <string>(); var dataChunk = Array.Empty <byte>(); var header = _xwbHeaderStreamReader.Read(source); for (var i = 0; i < (int)XwbSegIdx.Count; i++) { var region = header.Segments[i]; if (region.Length <= 0) { continue; } source.Position = region.Offset; var buffer = reader.ReadBytes(region.Length); using (var mem = new ReadOnlyMemoryStream(buffer)) { var memReader = new BinaryReader(mem); switch (i) { case (int)XwbSegIdx.BankData: var bank = _xwbDataStreamReader.Read(mem); sampleCount = bank.EntryCount; entries = new XwbEntry[sampleCount]; names = new string[sampleCount]; break; case (int)XwbSegIdx.EntryMetaData: for (var j = 0; j < sampleCount; j++) { entries[j] = _xwbEntryStreamReader.Read(mem); } break; case (int)XwbSegIdx.EntryNames: for (var j = 0; j < sampleCount; j++) { names[j] = memReader.ReadBytes(XwbConstants.WavebankEntrynameLength) .TakeWhile(c => c != 0).ToArray().GetString(); } break; case (int)XwbSegIdx.EntryWaveData: dataChunk = buffer; break; case (int)XwbSegIdx.SeekTables: break; default: break; } } } return(Enumerable .Range(0, sampleCount) .Select(i => { var entry = entries[i]; var data = dataChunk.AsSpan(entry.PlayRegion.Offset, entry.PlayRegion.Length).ToArray(); return new XwbSound { Data = data, Info = entry, Name = names[i] }; })); }