Пример #1
0
 public ISound Decode(VagChunk chunk)
 {
     return(new Sound
     {
         Samples = _vagSplitter.Split(chunk)
     });
 }
Пример #2
0
        private IEnumerable <ISample> SplitInternal(VagChunk chunk)
        {
            if (chunk.Channels == 1)
            {
                var length       = (int)(chunk.Length ?? chunk.Data.Length);
                var totalSamples = length * 28 / 16;
                var output       = new float[totalSamples];
                _vagDecrypter.Decrypt(chunk.Data, output, length, new VagState());

                yield return(new Sample
                {
                    Data = output
                });
            }
            else
            {
                var interleave = chunk.Interleave;
                var interval   = interleave * chunk.Channels;
                var buffer     = new float[interleave * 28 / 16];
                var length     = chunk.Length ?? chunk.Data.Length;

                for (var channel = 0; channel < chunk.Channels; channel++)
                {
                    var output = new List <float>();
                    var state  = new VagState();
                    var offset = channel * interleave;
                    while (offset < length)
                    {
                        _vagDecrypter.Decrypt(chunk.Data.AsSpan(offset), buffer, interleave, state);
                        offset += interval;
                        output.AddRange(buffer);
                    }

                    yield return(new Sample
                    {
                        Data = output
                    });
                }
            }
        }
Пример #3
0
 public IList <ISample> Split(VagChunk chunk)
 {
     return(SplitInternal(chunk).AsParallel().ToList());
 }