Пример #1
0
 private void ProcessVolumeSlowPath(Span <float> outputBuffer, ReadOnlySpan <float> inputBuffer)
 {
     for (int i = 0; i < outputBuffer.Length; i++)
     {
         outputBuffer[i] = FloatingPointHelper.MultiplyRoundUp(inputBuffer[i], Volume);
     }
 }
Пример #2
0
 private void ProcessMixSlowPath(Span <float> outputMix, ReadOnlySpan <float> inputMix)
 {
     for (int i = 0; i < inputMix.Length; i++)
     {
         outputMix[i] += FloatingPointHelper.MultiplyRoundUp(inputMix[i], Volume);
     }
 }
Пример #3
0
        private void ProcessVolumeRamp(Span <float> outputBuffer, ReadOnlySpan <float> inputBuffer, int sampleCount)
        {
            float ramp = (Volume1 - Volume0) / sampleCount;

            float volume = Volume0;

            for (int i = 0; i < sampleCount; i++)
            {
                outputBuffer[i] = FloatingPointHelper.MultiplyRoundUp(inputBuffer[i], volume);
                volume         += ramp;
            }
        }
Пример #4
0
        private float ProcessMixRamp(Span <float> outputBuffer, ReadOnlySpan <float> inputBuffer, int sampleCount)
        {
            float ramp   = (Volume1 - Volume0) / sampleCount;
            float volume = Volume0;
            float state  = 0;

            for (int i = 0; i < sampleCount; i++)
            {
                state = FloatingPointHelper.MultiplyRoundUp(inputBuffer[i], volume);

                outputBuffer[i] += state;
                volume          += ramp;
            }

            return(state);
        }
Пример #5
0
        private void ProcessVolumeSse41(Span <float> outputBuffer, ReadOnlySpan <float> inputBuffer)
        {
            Vector128 <float> volumeVec = Vector128.Create(Volume);

            ReadOnlySpan <Vector128 <float> > inputVec  = MemoryMarshal.Cast <float, Vector128 <float> >(inputBuffer);
            Span <Vector128 <float> >         outputVec = MemoryMarshal.Cast <float, Vector128 <float> >(outputBuffer);

            int sisdStart = inputVec.Length * 4;

            for (int i = 0; i < inputVec.Length; i++)
            {
                outputVec[i] = Sse41.Ceiling(Sse.Multiply(inputVec[i], volumeVec));
            }

            for (int i = sisdStart; i < inputBuffer.Length; i++)
            {
                outputBuffer[i] = FloatingPointHelper.MultiplyRoundUp(inputBuffer[i], Volume);
            }
        }
Пример #6
0
        private void ProcessMixAdvSimd(Span <float> outputMix, ReadOnlySpan <float> inputMix)
        {
            Vector128 <float> volumeVec = Vector128.Create(Volume);

            ReadOnlySpan <Vector128 <float> > inputVec  = MemoryMarshal.Cast <float, Vector128 <float> >(inputMix);
            Span <Vector128 <float> >         outputVec = MemoryMarshal.Cast <float, Vector128 <float> >(outputMix);

            int sisdStart = inputVec.Length * 4;

            for (int i = 0; i < inputVec.Length; i++)
            {
                outputVec[i] = AdvSimd.Add(outputVec[i], AdvSimd.Ceiling(AdvSimd.Multiply(inputVec[i], volumeVec)));
            }

            for (int i = sisdStart; i < inputMix.Length; i++)
            {
                outputMix[i] += FloatingPointHelper.MultiplyRoundUp(inputMix[i], Volume);
            }
        }