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); }
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 }
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); }