Exemplo n.º 1
0
        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);
                        }
                    }
                });
            }
        }
Exemplo n.º 2
0
        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);
                        }
                    }
                }
            }
        }