/// <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); }
protected virtual void Dispose(bool disposing) { lock (_bufferLock) { if (_frame != null) { _frame.FreeBuffers(); _frame = null; } if (_stream != null) { _stream.Dispose(); _stream = null; } } }
/// <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; } } }
/// <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.IsClosed()) _stream.Dispose(); _disposed = true; } } }
/// <summary> /// Creates a new instance of the <see cref="FlacFrame"/> class based on the specified <paramref name="stream"/> and some basic stream information. /// </summary> /// <param name="stream">The stream which contains the flac frame.</param> /// <param name="streamInfo">Some basic information about the flac stream.</param> /// <returns>A new instance of the <see cref="FlacFrame"/> class.</returns> public static FlacFrame FromStream(Stream stream, FlacMetadataStreamInfo streamInfo) { FlacFrame frame = new FlacFrame(stream, streamInfo); return frame; //return frame.HasError ? null : frame; }
/// <summary> /// Creates a new instance of the <see cref="FlacFrame"/> class based on the specified <paramref name="stream"/>. /// </summary> /// <param name="stream">The stream which contains the flac frame.</param> /// <returns>A new instance of the <see cref="FlacFrame"/> class.</returns> public static FlacFrame FromStream(Stream stream) { FlacFrame frame = new FlacFrame(stream); return frame; //return frame.HasError ? null : frame; }