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)); _decoder = new DmoMp3Decoder(new ReadBlockStream(_buffer.ToStream()), false); if (resetEvent != null) { resetEvent.Set(); } do { 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(); } } }
public void FixedBufferCanAdjustReadOffsetOnOverwrite() { int dataLength = 100; int bufferLength = 30; int readOffset = 10; int writeInitial = 10; int readInitial = 5; FixedSizeBuffer <int> fixedSizeBuffer = new FixedSizeBuffer <int>(bufferLength); var numbers = Enumerable.Range(0, dataLength).ToArray(); var readData = new int[numbers.Length + readOffset]; fixedSizeBuffer.Write(Enumerable.Range(5000, writeInitial).ToArray(), 0, writeInitial); fixedSizeBuffer.Read(readData, 0, readInitial); Array.Clear(readData, 0, readData.Length); int written = fixedSizeBuffer.Write(numbers, 0, numbers.Length); Assert.AreEqual(numbers.Length, written); Assert.AreEqual(fixedSizeBuffer.Buffered, bufferLength); int read = fixedSizeBuffer.Read(readData, readOffset, readData.Length); Assert.AreEqual(read, bufferLength); Assert.AreEqual(fixedSizeBuffer.Buffered, 0); Array.Copy(readData, readOffset, readData, 0, dataLength); Array.Copy(numbers, dataLength - bufferLength, numbers, 0, bufferLength); for (int i = 0; i < bufferLength; i++) { Assert.AreEqual(readData[i], numbers[i]); } }
private void BufferProc(object o) { byte[] byteBuffer = new byte[WaveFormat.BytesPerSecond / 2]; do { if (_buffer.Buffered >= _buffer.Length * 0.85 && !_disposing) { Thread.Sleep(50); continue; } lock (_lockObject) { int bytesToRead = Math.Min(byteBuffer.Length, _buffer.Length - _buffer.Buffered); int read = base.Read(byteBuffer, 0, bytesToRead); if (read > 0) { _buffer.Write(byteBuffer, 0, read); _eofCounter = 0; } else { _eofCounter++; } } } while (!_disposing); }
/// <summary> /// Adds new data to the internal buffer. /// </summary> /// <param name="buffer">A byte-array which contains the data.</param> /// <param name="offset">Zero-based offset in the <paramref name="buffer"/> (specified in bytes).</param> /// <param name="count">Number of bytes to add to the internal buffer.</param> /// <returns>Number of added bytes.</returns> public int Write(byte[] buffer, int offset, int count) { lock (_bufferlock) { return(_buffer.Write(buffer, offset, count)); } }
public void FixedBufferCanReadWrite() { int length = 100; int readOffset = 10; FixedSizeBuffer <int> fixedSizeBuffer = new FixedSizeBuffer <int>(length); var numbers = Enumerable.Range(0, length).ToArray(); var readData = new int[numbers.Length + readOffset]; int written = fixedSizeBuffer.Write(numbers, 0, numbers.Length); Assert.AreEqual(numbers.Length, written); Assert.AreEqual(fixedSizeBuffer.Buffered, numbers.Length); fixedSizeBuffer.Read(readData, readOffset, length); Assert.AreEqual(fixedSizeBuffer.Buffered, 0); Array.Copy(readData, readOffset, readData, 0, length); for (int i = 0; i < length; i++) { Assert.AreEqual(readData[i], numbers[i]); } }
private void BufferProc(object o) { if (_stream == null || _stream.CanRead == false) { throw new Exception("Mp3WebStream not initialized"); } MP3Frame frame = GetNextFrame(_stream); int channels = frame.ChannelMode == MP3ChannelMode.Stereo ? 2 : 1; AcmConverter converter = new AcmConverter(new MP3Format(frame.SampleRate, frame.ChannelCount, frame.FrameLength, frame.BitRate)); _waveFormat = converter.DestinationFormat; byte[] buffer = new byte[16384 * 4]; _buffer = new FixedSizeBuffer <byte>(converter.DestinationFormat.BytesPerSecond * 10); ManualResetEvent resetEvent = o as ManualResetEvent; resetEvent.Set(); do { if (_buffer.Buffered >= _buffer.Length * 0.85 && !_disposing) { Thread.Sleep(250); continue; } try { frame = GetNextFrame(_stream); //_frameBuffer is set in GetNextFrame int count = converter.Convert(_frameBuffer, frame.FrameLength, buffer, 0); if (count > 0) { int written = _buffer.Write(buffer, 0, count); } } catch (MmException) { _disposing = true; ThreadPool.QueueUserWorkItem((c) => { while (_bufferThread.ThreadState != System.Threading.ThreadState.Stopped) { ; } CreateStream(false); }); } catch (WebException) { InitializeConnection(); } catch (IOException) { InitializeConnection(); } } while (!_disposing); if (converter != null) { converter.Dispose(); } }
private void BufferProc(object o) { if (_stream == null || _stream.CanRead == false) throw new Exception("Mp3WebStream not initialized"); MP3Frame frame = GetNextFrame(_stream); int channels = frame.ChannelMode == MP3ChannelMode.Stereo ? 2 : 1; AcmConverter converter = new AcmConverter(new MP3Format(frame.SampleRate, frame.ChannelCount, frame.FrameLength, frame.BitRate)); _waveFormat = converter.DestinationFormat; byte[] buffer = new byte[16384 * 4]; _buffer = new FixedSizeBuffer<byte>(converter.DestinationFormat.BytesPerSecond * 10); ManualResetEvent resetEvent = o as ManualResetEvent; resetEvent.Set(); do { if (_buffer.Buffered >= _buffer.Length * 0.85 && !_disposing) { Thread.Sleep(250); continue; } try { frame = GetNextFrame(_stream); //_frameBuffer is set in GetNextFrame int count = converter.Convert(_frameBuffer, frame.FrameLength, buffer, 0); if (count > 0) { int written = _buffer.Write(buffer, 0, count); } } catch (MmException) { _disposing = true; ThreadPool.QueueUserWorkItem((c) => { while (_bufferThread.ThreadState != System.Threading.ThreadState.Stopped) ; CreateStream(false); }); } catch (WebException) { InitializeConnection(); } catch (IOException) { InitializeConnection(); } } while (!_disposing); if (converter != null) converter.Dispose(); }
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(); } }