Beispiel #1
0
        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);
        }
Beispiel #2
0
        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]
                };
            }));
        }