52 lines
1.5 KiB
C#
52 lines
1.5 KiB
C#
using NAudio.Wave;
|
|
|
|
namespace Elementary.Audio;
|
|
|
|
public class VolumeAdjustedWaveStream : WaveStream
|
|
{
|
|
private readonly WaveStream _waveStream;
|
|
private readonly float _volume;
|
|
|
|
public VolumeAdjustedWaveStream(WaveStream waveStream, float volume)
|
|
{
|
|
_waveStream = waveStream;
|
|
_volume = volume;
|
|
}
|
|
|
|
public override WaveFormat WaveFormat => _waveStream.WaveFormat;
|
|
|
|
public override long Length => _waveStream.Length;
|
|
|
|
public override long Position
|
|
{
|
|
get => _waveStream.Position;
|
|
set => _waveStream.Position = value;
|
|
}
|
|
|
|
public override int Read(byte[] buffer, int offset, int count)
|
|
{
|
|
var read = _waveStream.Read(buffer, offset, count);
|
|
try
|
|
{
|
|
for (var i = 0; i < read; i += 2) // 2 bytes per sample
|
|
{
|
|
var sample = (short) ((buffer[offset + i + 1] << 8) | buffer[offset + i]); // convert two bytes to one short (little endian)
|
|
sample = (short) (sample * _volume); // <- anything between 0.0 and 1.0
|
|
buffer[offset + i] = (byte) (sample & 0xFF); // split the short into two bytes
|
|
buffer[offset + i + 1] = (byte) (sample >> 8); // see above
|
|
}
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Console.WriteLine(e);
|
|
}
|
|
|
|
return read;
|
|
}
|
|
|
|
protected override void Dispose(bool disposing)
|
|
{
|
|
// _waveStream.Dispose();
|
|
// base.Dispose(disposing);
|
|
}
|
|
} |