/// <summary> /// Overridden Read function that returns samples processed with SoundTouch. Returns data in same format as /// WaveChannel32 i.e. stereo float samples. /// </summary> /// <param name="buffer">Buffer where to return sample data</param> /// <param name="offset">Offset from beginning of the buffer</param> /// <param name="count">Number of bytes to return</param> /// <returns>Number of bytes copied to buffer</returns> public override int Read(byte[] buffer, int offset, int count) { try { // Iterate until enough samples available for output: // - read samples from input stream // - put samples to SoundStretch processor while (st.NumSamples() < count) { int nbytes = inputStr.Read(bytebuffer, 0, bytebuffer.Length); if (nbytes == 0) { // end of stream. flush final samples from SoundTouch buffers to output if (endReached == false) { endReached = true; // do only once to avoid continuous flushing st.Flush(); } break; } // binary copy data from "byte[]" to "float[]" buffer Buffer.BlockCopy(bytebuffer, 0, floatbuffer, 0, nbytes); st.PutSamples(floatbuffer, (uint)(nbytes / 8)); } // ensure that buffer is large enough to receive desired amount of data out if (floatbuffer.Length < count / 4) { floatbuffer = new float[count / 4]; } // get processed output samples from SoundTouch int numsamples = (int)st.ReceiveSamples(floatbuffer, (uint)(count / 8)); // binary copy data from "float[]" to "byte[]" buffer Buffer.BlockCopy(floatbuffer, 0, buffer, offset, numsamples * 8); return(numsamples * 8); // number of bytes } catch (Exception exp) { StatusMessage.Write("exception in WaveStreamProcessor.Read: " + exp.Message); return(0); } }