Elementary/Elementary/Audio/VolumeAdjustedWaveStream.cs
2023-07-26 22:36:08 +09:00

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);
}
}