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(); } } }
private void CreateStream(bool async) { _disposing = false; Func <bool> func = () => { var resetEvent = new ManualResetEvent(false); bool success = InitializeConnection(); if (success) { _bufferThread = new Thread(BufferProc); _bufferThread.Start(resetEvent); success = resetEvent.WaitOne(); if (success) { _decoder = new DmoMp3Decoder(new ReadBlockStream(_buffer.ToStream()), false); } } EventHandler <ConnectionEstablishedEventArgs> handler = this.ConnectionEstablished; if (handler != null && async) { handler(this, new ConnectionEstablishedEventArgs(_address, success)); } return(success); }; if (async) { ThreadPool.QueueUserWorkItem(o => func()); } else { func(); } }
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(); } }