private void TransformWaveDataBlocks(Stream source, byte[] destination, uint startBlockIndex, uint blockCount, IWaveWriter waveWriter) { if (source == null) { throw new ArgumentNullException(nameof(source)); } if (destination == null) { throw new ArgumentNullException(nameof(destination)); } if (waveWriter == null) { throw new ArgumentNullException(nameof(waveWriter)); } var hcaInfo = HcaInfo; var startOffset = hcaInfo.DataOffset + startBlockIndex * hcaInfo.BlockSize; source.Seek(startOffset, SeekOrigin.Begin); var channels = _channels; var decodeParams = _decodeParams; var hcaBlockBuffer = GetHcaBlockBuffer(); var channelCount = hcaInfo.ChannelCount; var rvaVolume = hcaInfo.RvaVolume; var bytesPerSample = waveWriter.BytesPerSample; var volume = decodeParams.Volume; for (var l = 0; l < (int)blockCount; ++l) { source.Read(hcaBlockBuffer, 0, hcaBlockBuffer.Length); DecodeToWaveR32(hcaBlockBuffer, l + (int)startBlockIndex); for (var i = 0; i < 8; ++i) { for (var j = 0; j < 0x80; ++j) { for (var k = 0; k < channelCount; ++k) { float f; unsafe { var pWave = channels.GetPtrOfWave(k); f = pWave[i * 0x80 + j]; f = f * volume * rvaVolume; } HcaHelper.Clamp(ref f, -1f, 1f); var offset = (((l * 8 + i) * 0x80 + j) * channelCount + k) * bytesPerSample; waveWriter.DecodeToBuffer(f, destination, (uint)offset); } } } } }
private void TransformWaveDataBlocks(Stream source, byte[] destination, uint startBlockIndex, uint blockCount, IWaveWriter waveWriter) { if (source == null) { throw new ArgumentNullException(nameof(source)); } if (destination == null) { throw new ArgumentNullException(nameof(destination)); } if (waveWriter == null) { throw new ArgumentNullException(nameof(waveWriter)); } var hcaInfo = HcaInfo; var startOffset = hcaInfo.DataOffset + startBlockIndex * hcaInfo.BlockSize; source.Seek(startOffset, SeekOrigin.Begin); var channels = _channels; var decodeParams = _decodeParams; var hcaBlockBuffer = GetHcaBlockBuffer(); var channelCount = (int)hcaInfo.ChannelCount; var rvaVolume = hcaInfo.RvaVolume; var bytesPerSample = waveWriter.BytesPerSample; foreach (var l in Enumerable.Range(0, (int)blockCount)) { source.Read(hcaBlockBuffer, 0, hcaBlockBuffer.Length); DecodeToWaveR32(hcaBlockBuffer); Parallel.For(0, 8, i => { for (var j = 0; j < 0x80; ++j) { for (var k = 0; k < channelCount; ++k) { var f = channels[k].Wave[i * 0x80 + j] * decodeParams.Volume * rvaVolume; HcaHelper.Clamp(ref f, -1f, 1f); var offset = (((l * 8 + i) * 0x80 + j) * channelCount + k) * bytesPerSample; waveWriter.DecodeToBuffer(f, destination, (uint)offset); } } }); } }