Exemple #1
0
        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);
                }
            }
        }