public MetaData GetMetadata(uint index) { if (index >= bankData.EntryCount) { throw new ArgumentOutOfRangeException("index"); } var metadata = new MetaData(); if ((bankData.Flags & BankDataFlags.Compact) == BankDataFlags.Compact) { var entry = compactMetadata[index]; uint offset, length; entry.ComputeLocations(out offset, out length, index, header, bankData, compactMetadata); metadata.Duration = EntryCompact.GetDuration(length, bankData, FindSeekTable(index)); metadata.LoopStart = metadata.LoopLength = 0; metadata.OffsetBytes = offset; metadata.LengthBytes = length; } else { var entry = metaData[index]; metadata.Duration = entry.FlagsAndDuration.Duration; metadata.LoopStart = entry.LoopRegion.StartSample; metadata.LoopLength = entry.LoopRegion.TotalSamples; metadata.OffsetBytes = entry.PlayRegion.Offset; metadata.LengthBytes = entry.PlayRegion.Length; } return(metadata); }
public void ComputeLocations(out uint offset, out uint length, uint index, Header header, BankData data, EntryCompact[] entries) { offset = this.Offset * data.Alignment; if (index < (data.EntryCount - 1)) { length = (entries[index + 1].Offset * data.Alignment) - offset - LengthDeviation; } else { length = header.Segments[SegmentIndex.EntryWaveData].Length - offset - LengthDeviation; } }