/// <summary> /// Reads a sequence of bytes from the <see cref="FlacFile" /> and advances the position within the stream by the /// number of bytes read. /// </summary> /// <param name="buffer"> /// An array of bytes. When this method returns, the <paramref name="buffer" /> contains the specified /// byte array with the values between <paramref name="offset" /> and (<paramref name="offset" /> + /// <paramref name="count" /> - 1) replaced by the bytes read from the current source. /// </param> /// <param name="offset"> /// The zero-based byte offset in the <paramref name="buffer" /> at which to begin storing the data /// read from the current stream. /// </param> /// <param name="count">The maximum number of bytes to read from the current source.</param> /// <returns>The total number of bytes read into the buffer.</returns> public int Read(byte[] buffer, int offset, int count) { CheckForDisposed(); int read = 0; count -= (count % WaveFormat.BlockAlign); lock (_bufferLock) { read += GetOverflows(buffer, ref offset, count); while (read < count) { FlacFrame frame = Frame; if (frame == null) { return(read); } while (!frame.NextFrame()) { if (CanSeek) //go to next frame { if (++_frameIndex >= _scan.Frames.Count) { return(read); } _stream.Position = _scan.Frames[_frameIndex].StreamOffset; } } _frameIndex++; int bufferlength = frame.GetBuffer(ref _overflowBuffer); int bytesToCopy = Math.Min(count - read, bufferlength); Array.Copy(_overflowBuffer, 0, buffer, offset, bytesToCopy); read += bytesToCopy; offset += bytesToCopy; _overflowCount = ((bufferlength > bytesToCopy) ? (bufferlength - bytesToCopy) : 0); _overflowOffset = ((bufferlength > bytesToCopy) ? (bytesToCopy) : 0); } } #if DIAGNOSTICS _position += read; #endif return(read); }
/// <summary> /// Disposes the <see cref="FlacFile" /> instance and disposes the underlying stream. /// </summary> /// <param name="disposing"> /// True to release both managed and unmanaged resources; false to release only unmanaged /// resources. /// </param> protected virtual void Dispose(bool disposing) { lock (_bufferLock) { if (!_disposed) { if (_frame != null) { _frame.Dispose(); _frame = null; } if (_stream != null && !_stream.IsClosed() && _closeStream) { _stream.Dispose(); } _disposed = true; } } }