Пример #1
0
        public RingBufferStatus Fetch(out float[] newSamples, uint numFrames, long startRead, int channel = 0)
        {
            newSamples = new float[0];
            if (numFrames == 0)
            {
                return(RingBufferStatus.OK);
            }

            newSamples = new float[numFrames];

            startRead = Math.Max(0, startRead);

            long endRead = startRead + numFrames;

            long startRead0 = startRead;

            RingBufferStatus status = ClipTimeBounds(ref startRead, ref endRead);

            if (status != RingBufferStatus.OK)
            {
                return(status);
            }
            if (startRead == endRead)
            {
                return(RingBufferStatus.OK);
            }


            int destStartArrayIndexOffset = Math.Max((int)0, (int)((startRead - startRead0)));

            var buffers        = _bufferPtrs;
            int srcByteOffset0 = FrameOffset(startRead);
            int srcByteOffset1 = FrameOffset(endRead);
            int numBytes;

            if (srcByteOffset0 < srcByteOffset1)
            {
                numBytes = srcByteOffset1 - srcByteOffset0;
                FetchFloat(ref newSamples, destStartArrayIndexOffset, buffers, srcByteOffset0, numBytes, channel);
            }
            else
            {
                numBytes = (int)_capacityBytes - srcByteOffset0;
                int numSamples = numBytes / (int)_bytesPerFrame;
                FetchFloat(ref newSamples, destStartArrayIndexOffset, buffers, srcByteOffset0, numBytes, channel);
                FetchFloat(ref newSamples, destStartArrayIndexOffset + numSamples, buffers, 0, srcByteOffset1, channel);
                numBytes += srcByteOffset1; //Is this right??? Should this be one line up?
            }

            return(RingBufferStatus.OK);
        }
Пример #2
0
        protected RingBufferStatus ClipTimeBounds(ref long startRead, ref long endRead)
        {
            long startTime = 0;
            long endTime   = 0;

            RingBufferStatus status = GetTimeBounds(ref startTime, ref endTime);

            if (status != RingBufferStatus.OK)
            {
                return(status);
            }

            if (startRead > endTime || endRead < startTime)
            {
                endRead = startRead;
                return(RingBufferStatus.OK);
            }

            startRead = Math.Max(startRead, startTime);
            endRead   = Math.Min(endRead, endTime);
            endRead   = Math.Max(endRead, startRead);

            return(RingBufferStatus.OK); // success
        }
Пример #3
0
        public RingBufferStatus Fetch(AudioBuffers audioBuffers, uint numFrames, long startRead, int[] channels = null)
        {
            if (numFrames == 0)
            {
                return(RingBufferStatus.OK);
            }

            startRead = Math.Max(0, startRead);

            long endRead = startRead + (int)numFrames;

            long startRead0 = startRead;
            long endRead0   = endRead;

            RingBufferStatus status = ClipTimeBounds(ref startRead, ref endRead);

            if (status != RingBufferStatus.OK)
            {
                return(status);
            }
            if (startRead == endRead)
            {
                ZeroABL(audioBuffers, 0, (int)(numFrames * _bytesPerFrame));
                return(RingBufferStatus.OK);
            }

            int byteSize = (int)((endRead - startRead) * _bytesPerFrame);

            int destStartByteOffset = Math.Max((int)0, (int)((startRead - startRead0) * _bytesPerFrame));

            if (destStartByteOffset > 0)
            {
                ZeroABL(audioBuffers, 0, Math.Min((int)(numFrames * _bytesPerFrame), destStartByteOffset));
            }

            int destEndSize = Math.Max((int)0, (int)(endRead0 - endRead));

            if (destEndSize > 0)
            {
                ZeroABL(audioBuffers, destStartByteOffset + byteSize, destEndSize * (int)_bytesPerFrame);
            }

            var buffers = _bufferPtrs;
            int offset0 = FrameOffset(startRead);
            int offset1 = FrameOffset(endRead);
            int numBytes;

            if (offset0 < offset1)
            {
                numBytes = offset1 - offset0;
                FetchABL(audioBuffers, destStartByteOffset, buffers, offset0, numBytes);
            }
            else
            {
                numBytes = (int)_capacityBytes - offset0;
                FetchABL(audioBuffers, destStartByteOffset, buffers, offset0, numBytes);
                FetchABL(audioBuffers, destStartByteOffset + numBytes, buffers, 0, offset1);
                numBytes += offset1;
            }

            int         nchannels = audioBuffers.Count;
            AudioBuffer dest;

            for (int i = 0; i < nchannels; i++)
            {
                dest = audioBuffers[i];
                dest.DataByteSize = numBytes;
            }

            return(RingBufferStatus.OK);
        }