public override int Read(float[] buffer, int offset, int count) { lock (lockObject) { if (_seekRequested) { _soundTouch.Clear(); _seekRequested = false; } var samplesRead = 0; var endOfSource = false; while (samplesRead < count) { if (_soundTouch.NumberOfSamples() == 0) { var readFromSource = _sampleSource.Read(_sourceReadBuffer, 0, _sourceReadBuffer.Length); if (_sampleSource.Position >= _sampleSource.Length) { return(samplesRead); } if (readFromSource == 0) { endOfSource = true; _soundTouch.Flush(); return(0); } _soundTouch.PutSamples(_sourceReadBuffer, readFromSource / _sampleSource.WaveFormat.Channels); } var desiredSampleFrames = (count - samplesRead) / _sampleSource.WaveFormat.Channels; var received = _soundTouch.ReceiveSamples(_soundTouchReadBuffer, desiredSampleFrames) * _sampleSource.WaveFormat.Channels; for (int n = 0; n < received; n++) { buffer[offset + samplesRead++] = _soundTouchReadBuffer[n]; } if (received == 0 && endOfSource) { break; } } return(samplesRead); } }
public override int Read(byte[] buffer, int offset, int count) { lock (lockObject) { try { var floatbuffer = new float[buffer.Length / 4]; while (_soundTouch.NumberOfSamples() < count) { var bytesRead = _waveSource.Read(_bytebuffer, offset, _bytebuffer.Length); if (bytesRead == 0) { if (_endReached == false) { _endReached = true; _soundTouch.Flush(); } break; } Buffer.BlockCopy(_bytebuffer, 0, floatbuffer, 0, bytesRead); _soundTouch.PutSamples(floatbuffer, (uint)(bytesRead / 8)); } var numberOfSamples = (int)_soundTouch.ReceiveSamples(floatbuffer, (uint)(count / 8)); Buffer.BlockCopy(floatbuffer, 0, buffer, offset, numberOfSamples * 8); return(numberOfSamples * 8); } catch { return(0); } } }