Exemplo n.º 1
0
        protected void SamplesCallback(IntPtr sampleBuffer, int size)
        {
            if (size == 0)
            {
                return;
            }

            if (size > 2048)
            {
                Debug.LogError("Input buffer is larger than target size!");
            }

            SampleBuffer buffer = GetEmptyBuffer();

            //Copy samples into empty buffer.
            Marshal.Copy(sampleBuffer, buffer.GetBuffer(), 0, size);

            //Set buffer to in use.
            buffer.Consume(0, size);

            //Link the buffer.
            if (this.HeadBuffer == null)
            {
                this.HeadBuffer = buffer;
            }
            else
            {
                this.HeadBuffer.Next = buffer;
                buffer.Previous      = this.HeadBuffer;
                this.HeadBuffer      = buffer;
            }
        }
Exemplo n.º 2
0
        public bool ResampleLerpRead <T>(
            SampleProvider provider,
            NativeArray <float> input,
            SampleBuffer outputBuffer,
            ParameterData <T> parameterData,
            T rateParam)
            where T : unmanaged, Enum
        {
            var finishedSampleProvider = false;

            var outputL = outputBuffer.GetBuffer(0);
            var outputR = outputBuffer.GetBuffer(1);

            for (var i = 0; i < outputL.Length; i++)
            {
                Position += parameterData.GetFloat(rateParam, i);

                var length = input.Length / 2;

                while (Position >= length - 1)
                {
                    m_LastLeft  = input[length - 1];
                    m_LastRight = input[input.Length - 1];

                    finishedSampleProvider |= ReadSamples(provider, new NativeSlice <float>(input, 0));

                    Position -= length;
                }

                var positionFloor       = Math.Floor(Position);
                var positionFraction    = Position - positionFloor;
                var previousSampleIndex = (int)positionFloor;
                var nextSampleIndex     = previousSampleIndex + 1;

                var prevSampleL = (previousSampleIndex < 0) ? m_LastLeft : input[previousSampleIndex];
                var prevSampleR = (previousSampleIndex < 0) ? m_LastRight : input[previousSampleIndex + length];
                var sampleL     = input[nextSampleIndex];
                var sampleR     = input[nextSampleIndex + length];

                outputL[i] = (float)(prevSampleL + (sampleL - prevSampleL) * positionFraction);
                outputR[i] = (float)(prevSampleR + (sampleR - prevSampleR) * positionFraction);
            }

            return(finishedSampleProvider);
        }