public long Retrieve(float[][] output, long samples)
        {
            for (int i = 0; i < output.Length; i++)
            {
                if (output[i].Length < samples)
                {
                    throw new Exception("Invalid output buffer: Channel " + i + " does not have enough space for " + samples + " samples");
                }
            }

            long totalSamples = output.Length * samples;

            if (totalSamples > _outputBuffer.Length)
            {
                _outputBuffer = new float[totalSamples];
            }

            long actualSamples = RubberBandNativeMethods.RubberBandStretcher_Retrieve(_rbs, _outputBuffer, new IntPtr(samples), output.Length).ToInt64();

            for (int i = 0; i < output.Length; i++)
            {
                Array.Copy(_outputBuffer, i * samples, output[i], 0, actualSamples);
            }

            return(actualSamples);
        }