/// <summary> /// Reads bytes from this wave stream /// </summary> /// <param name="destBuffer">The destination buffer</param> /// <param name="offset">Offset into the destination buffer</param> /// <param name="numBytes">Number of bytes read</param> /// <returns>Number of bytes read.</returns> public int Read(byte[] destBuffer, int offset, int numBytes) { int sourceBytesRequired = numBytes * 2; sourceBuffer = BufferHelpers.Ensure(sourceBuffer, sourceBytesRequired); int sourceBytesRead = sourceProvider.Read(sourceBuffer, 0, sourceBytesRequired); WaveBuffer sourceWaveBuffer = new WaveBuffer(sourceBuffer); WaveBuffer destWaveBuffer = new WaveBuffer(destBuffer); int sourceSamples = sourceBytesRead / 4; int destOffset = offset / 2; for (int sample = 0; sample < sourceSamples; sample++) { // adjust volume float sample32 = sourceWaveBuffer.FloatBuffer[sample] * volume; // clip if (sample32 > 1.0f) { sample32 = 1.0f; } if (sample32 < -1.0f) { sample32 = -1.0f; } destWaveBuffer.ShortBuffer[destOffset++] = (short)(sample32 * 32767); } return(sourceSamples * 2); }
/// <summary> /// Reads bytes from this WaveProvider /// </summary> public int Read(byte[] buffer, int offset, int count) { int sourceBytesRequired = count * 2; this.sourceBuffer = BufferHelpers.Ensure(this.sourceBuffer, sourceBytesRequired); WaveBuffer sourceWaveBuffer = new WaveBuffer(sourceBuffer); WaveBuffer destWaveBuffer = new WaveBuffer(buffer); int sourceBytesRead = sourceProvider.Read(sourceBuffer, 0, sourceBytesRequired); int samplesRead = sourceBytesRead / 2; int destOffset = offset / 2; for (int sample = 0; sample < samplesRead; sample += 2) { short left = sourceWaveBuffer.ShortBuffer[sample]; short right = sourceWaveBuffer.ShortBuffer[sample + 1]; float outSample = (left * LeftVolume) + (right * RightVolume); // hard limiting if (outSample > Int16.MaxValue) { outSample = Int16.MaxValue; } if (outSample < Int16.MinValue) { outSample = Int16.MinValue; } destWaveBuffer.ShortBuffer[destOffset++] = (short)outSample; } return(sourceBytesRead / 2); }
/// <summary> /// Implements the Read method of IWaveProvider by delegating to the abstract /// Read method taking a short array /// </summary> public int Read(byte[] buffer, int offset, int count) { WaveBuffer waveBuffer = new WaveBuffer(buffer); int samplesRequired = count / 2; int samplesRead = Read(waveBuffer.ShortBuffer, offset / 2, samplesRequired); return samplesRead * 2; }
/// <summary> /// Implements the Read method of IWaveProvider by delegating to the abstract /// Read method taking a float array /// </summary> public int Read(byte[] buffer, int offset, int count) { WaveBuffer waveBuffer = new WaveBuffer(buffer); int samplesRequired = count / 4; int samplesRead = Read(waveBuffer.FloatBuffer, offset / 4, samplesRequired); return samplesRead * 4; }
/// <summary> /// Implements the Read method of IWaveProvider by delegating to the abstract /// Read method taking a short array /// </summary> public int Read(byte[] buffer, int offset, int count) { WaveBuffer waveBuffer = new WaveBuffer(buffer); int samplesRequired = count / 2; int samplesRead = Read(waveBuffer.ShortBuffer, offset / 2, samplesRequired); return(samplesRead * 2); }
/// <summary> /// Implements the Read method of IWaveProvider by delegating to the abstract /// Read method taking a float array /// </summary> public int Read(byte[] buffer, int offset, int count) { WaveBuffer waveBuffer = new WaveBuffer(buffer); int samplesRequired = count / 4; int samplesRead = Read(waveBuffer.FloatBuffer, offset / 4, samplesRequired); return(samplesRead * 4); }
/// <summary> /// Reads bytes from this wave stream /// </summary> /// <param name="destBuffer">The destination buffer</param> /// <param name="offset">Offset into the destination buffer</param> /// <param name="numBytes">Number of bytes read</param> /// <returns>Number of bytes read.</returns> public override int Read(byte[] destBuffer, int offset, int numBytes) { lock (lockObject) { int bytesWritten = 0; WaveBuffer destWaveBuffer = new WaveBuffer(destBuffer); // 1. fill with silence if (position < 0) { bytesWritten = (int)Math.Min(numBytes, 0 - position); for (int n = 0; n < bytesWritten; n++) { destBuffer[n + offset] = 0; } } if (bytesWritten < numBytes) { this.sampleProvider.LoadNextChunk(sourceStream, (numBytes - bytesWritten) / 8); float left, right; int outIndex = (offset / 4) + bytesWritten / 4; while (this.sampleProvider.GetNextSample(out left, out right) && bytesWritten < numBytes) { // implement better panning laws. left = (pan <= 0) ? left : (left * (1 - pan) / 2.0f); right = (pan >= 0) ? right : (right * (pan + 1) / 2.0f); left *= volume; right *= volume; destWaveBuffer.FloatBuffer[outIndex++] = left; destWaveBuffer.FloatBuffer[outIndex++] = right; bytesWritten += 8; if (Sample != null) { RaiseSample(left, right); } } } // 3. Fill out with zeroes if (PadWithZeroes && bytesWritten < numBytes) { Array.Clear(destBuffer, offset + bytesWritten, numBytes - bytesWritten); bytesWritten = numBytes; } position += bytesWritten; return(bytesWritten); } }
/// <summary> /// Reads bytes from this wave stream /// </summary> /// <param name="destBuffer">The destination buffer</param> /// <param name="offset">Offset into the destination buffer</param> /// <param name="numBytes">Number of bytes read</param> /// <returns>Number of bytes read.</returns> public int Read(byte[] destBuffer, int offset, int numBytes) { int sourceBytesRequired = numBytes / 2; sourceBuffer = BufferHelpers.Ensure(sourceBuffer, sourceBytesRequired); int sourceBytesRead = sourceProvider.Read(sourceBuffer, offset, sourceBytesRequired); WaveBuffer sourceWaveBuffer = new WaveBuffer(sourceBuffer); WaveBuffer destWaveBuffer = new WaveBuffer(destBuffer); int sourceSamples = sourceBytesRead / 2; int destOffset = offset / 4; for (int sample = 0; sample < sourceSamples; sample++) { destWaveBuffer.FloatBuffer[destOffset++] = (sourceWaveBuffer.ShortBuffer[sample] / 32768f) * volume; } return sourceSamples * 4; }
/// <summary> /// Reads bytes from this WaveProvider /// </summary> public int Read(byte[] buffer, int offset, int count) { int sourceBytesRequired = count / 2; this.sourceBuffer = BufferHelpers.Ensure(this.sourceBuffer, sourceBytesRequired); WaveBuffer sourceWaveBuffer = new WaveBuffer(sourceBuffer); WaveBuffer destWaveBuffer = new WaveBuffer(buffer); int sourceBytesRead = sourceProvider.Read(sourceBuffer, 0, sourceBytesRequired); int samplesRead = sourceBytesRead / 2; int destOffset = offset / 2; for (int sample = 0; sample < samplesRead; sample++) { short sampleVal = sourceWaveBuffer.ShortBuffer[sample]; destWaveBuffer.ShortBuffer[destOffset++] = (short)(LeftVolume * sampleVal); destWaveBuffer.ShortBuffer[destOffset++] = (short)(RightVolume * sampleVal); } return samplesRead * 4; }
/// <summary> /// Reads bytes from this wave stream /// </summary> /// <param name="destBuffer">The destination buffer</param> /// <param name="offset">Offset into the destination buffer</param> /// <param name="numBytes">Number of bytes read</param> /// <returns>Number of bytes read.</returns> public int Read(byte[] destBuffer, int offset, int numBytes) { int sourceBytesRequired = numBytes / 2; sourceBuffer = BufferHelpers.Ensure(sourceBuffer, sourceBytesRequired); int sourceBytesRead = sourceProvider.Read(sourceBuffer, offset, sourceBytesRequired); WaveBuffer sourceWaveBuffer = new WaveBuffer(sourceBuffer); WaveBuffer destWaveBuffer = new WaveBuffer(destBuffer); int sourceSamples = sourceBytesRead / 2; int destOffset = offset / 4; for (int sample = 0; sample < sourceSamples; sample++) { destWaveBuffer.FloatBuffer[destOffset++] = (sourceWaveBuffer.ShortBuffer[sample] / 32768f) * volume; } return(sourceSamples * 4); }
/// <summary> /// Reads bytes from this WaveProvider /// </summary> public int Read(byte[] buffer, int offset, int count) { int sourceBytesRequired = count / 2; this.sourceBuffer = BufferHelpers.Ensure(this.sourceBuffer, sourceBytesRequired); WaveBuffer sourceWaveBuffer = new WaveBuffer(sourceBuffer); WaveBuffer destWaveBuffer = new WaveBuffer(buffer); int sourceBytesRead = sourceProvider.Read(sourceBuffer, 0, sourceBytesRequired); int samplesRead = sourceBytesRead / 2; int destOffset = offset / 2; for (int sample = 0; sample < samplesRead; sample++) { short sampleVal = sourceWaveBuffer.ShortBuffer[sample]; destWaveBuffer.ShortBuffer[destOffset++] = (short)(LeftVolume * sampleVal); destWaveBuffer.ShortBuffer[destOffset++] = (short)(RightVolume * sampleVal); } return(samplesRead * 4); }
/// <summary> /// Reads bytes from this WaveProvider /// </summary> public int Read(byte[] buffer, int offset, int count) { int sourceBytesRequired = count * 2; this.sourceBuffer = BufferHelpers.Ensure(this.sourceBuffer, sourceBytesRequired); WaveBuffer sourceWaveBuffer = new WaveBuffer(sourceBuffer); WaveBuffer destWaveBuffer = new WaveBuffer(buffer); int sourceBytesRead = sourceProvider.Read(sourceBuffer, 0, sourceBytesRequired); int samplesRead = sourceBytesRead / 2; int destOffset = offset / 2; for (int sample = 0; sample < samplesRead; sample+=2) { short left = sourceWaveBuffer.ShortBuffer[sample]; short right = sourceWaveBuffer.ShortBuffer[sample+1]; float outSample = (left * LeftVolume) + (right * RightVolume); // hard limiting if (outSample > Int16.MaxValue) outSample = Int16.MaxValue; if (outSample < Int16.MinValue) outSample = Int16.MinValue; destWaveBuffer.ShortBuffer[destOffset++] = (short)outSample; } return sourceBytesRead / 2; }
/// <summary> /// Reads bytes from this wave stream /// </summary> /// <param name="destBuffer">The destination buffer</param> /// <param name="offset">Offset into the destination buffer</param> /// <param name="numBytes">Number of bytes read</param> /// <returns>Number of bytes read.</returns> public int Read(byte[] destBuffer, int offset, int numBytes) { int sourceBytesRequired = numBytes * 2; sourceBuffer = BufferHelpers.Ensure(sourceBuffer, sourceBytesRequired); int sourceBytesRead = sourceProvider.Read(sourceBuffer, 0, sourceBytesRequired); WaveBuffer sourceWaveBuffer = new WaveBuffer(sourceBuffer); WaveBuffer destWaveBuffer = new WaveBuffer(destBuffer); int sourceSamples = sourceBytesRead / 4; int destOffset = offset / 2; for (int sample = 0; sample < sourceSamples; sample++) { // adjust volume float sample32 = sourceWaveBuffer.FloatBuffer[sample] * volume; // clip if (sample32 > 1.0f) sample32 = 1.0f; if (sample32 < -1.0f) sample32 = -1.0f; destWaveBuffer.ShortBuffer[destOffset++] = (short)(sample32 * 32767); } return sourceSamples * 2; }
/// <summary> /// Reads bytes from this wave stream /// </summary> /// <param name="destBuffer">The destination buffer</param> /// <param name="offset">Offset into the destination buffer</param> /// <param name="numBytes">Number of bytes read</param> /// <returns>Number of bytes read.</returns> public override int Read(byte[] destBuffer, int offset, int numBytes) { lock (lockObject) { int bytesWritten = 0; WaveBuffer destWaveBuffer = new WaveBuffer(destBuffer); // 1. fill with silence if (position < 0) { bytesWritten = (int) Math.Min(numBytes, 0 - position); for (int n = 0; n < bytesWritten; n++) destBuffer[n + offset] = 0; } if (bytesWritten < numBytes) { this.sampleProvider.LoadNextChunk(sourceStream, (numBytes - bytesWritten)/8); float left, right; int outIndex = (offset/4) + bytesWritten/4; while (this.sampleProvider.GetNextSample(out left, out right) && bytesWritten < numBytes) { // implement better panning laws. left = (pan <= 0) ? left : (left*(1 - pan)/2.0f); right = (pan >= 0) ? right : (right*(pan + 1)/2.0f); left *= volume; right *= volume; destWaveBuffer.FloatBuffer[outIndex++] = left; destWaveBuffer.FloatBuffer[outIndex++] = right; bytesWritten += 8; if (Sample != null) RaiseSample(left, right); } } // 3. Fill out with zeroes if (PadWithZeroes && bytesWritten < numBytes) { Array.Clear(destBuffer, offset + bytesWritten, numBytes - bytesWritten); bytesWritten = numBytes; } position += bytesWritten; return bytesWritten; } }