private void BufferProc(object o) { var resetEvent = o as EventWaitHandle; try { if (_stream == null || _stream.CanRead == false) { throw new Exception("Mp3WebStream not initialized"); } byte[] buffer = null; int read; Mp3Format format, prevFormat; Mp3Frame frame; read = ReadRawDataFromFrame(ref buffer, out frame); format = new Mp3Format(frame.SampleRate, frame.ChannelCount, frame.FrameLength, frame.BitRate); _buffer = new FixedSizeBuffer <byte>(format.BytesPerSecond * 2); do { _buffer.Write(buffer, 0, read); read = ReadRawDataFromFrame(ref buffer, out frame); prevFormat = format; format = new Mp3Format(frame.SampleRate, frame.ChannelCount, frame.FrameLength, frame.BitRate); } while (_buffer.Buffered < _buffer.Length / 10 || !format.Equals(prevFormat)); if (resetEvent != null) { resetEvent.Set(); } do { Debug.WriteLine("Buffering"); if (_buffer.Buffered >= _buffer.Length * 0.85 && !_disposing) { Thread.Sleep(250); } else { _buffer.Write(buffer, 0, read); read = ReadRawDataFromFrame(ref buffer, out frame); } } while (!_disposing); } finally { if (resetEvent != null) { resetEvent.Set(); } } }
private void ParseForMp3Frames(Stream stream, bool enableSeeking) { Mp3Frame frame = null; long offsetOfFirstFrame = 0; stream = new BufferedStream(stream); if (enableSeeking) { while (ID3v2.SkipTag(stream)) { /* skip all id3 tags (see https://github.com/filoe/cscore/issues/63) * there are some files with multiple id3v2 tags * not sure whether this is according to the id3 specification but we have to handle it anyway * as long as the SkipTag method returns true, another id3 tag has been found */ } } while (frame == null) { if (enableSeeking && stream.IsEndOfStream()) { break; } if (enableSeeking) { offsetOfFirstFrame = stream.Position; } frame = Mp3Frame.FromStream(stream); } if (frame == null) { throw new Exception("Could not find any MP3-Frames in the stream."); } if (enableSeeking) { XingHeader xingHeader = XingHeader.FromFrame(frame); if (xingHeader != null) { offsetOfFirstFrame = stream.Position; } } _inputFormat = new Mp3Format(frame.SampleRate, frame.ChannelCount, frame.FrameLength, frame.BitRate); //Prescan stream if (enableSeeking) { _frameInfoCollection = new FrameInfoCollection(); while (_frameInfoCollection.AddFromMp3Stream(stream)) { } stream.Position = offsetOfFirstFrame; } }