36 lines
943 B
C#
36 lines
943 B
C#
namespace ytLive.Services.Audio;
|
|
|
|
/// <summary>
|
|
/// Computes the smoothed mic level (0..1) from captured samples. Pure —
|
|
/// unit-tested; the <see cref="AudioMixer"/> only feeds it and forwards the
|
|
/// result. RMS-based so it tracks perceived loudness, smoothed so the meter
|
|
/// does not flicker.
|
|
/// </summary>
|
|
public sealed class AudioLevelMeter
|
|
{
|
|
private const float Smoothing = 0.2f;
|
|
private float _level;
|
|
|
|
public float Level => _level;
|
|
|
|
public float Push(AudioSample sample)
|
|
{
|
|
if (sample.Samples.Length == 0)
|
|
return _level;
|
|
|
|
double sumSquares = 0;
|
|
var count = 0;
|
|
foreach (var value in sample.Samples)
|
|
{
|
|
sumSquares += value * value;
|
|
count++;
|
|
}
|
|
|
|
var rms = (float)Math.Sqrt(sumSquares / count);
|
|
_level = _level * (1 - Smoothing) + rms * Smoothing;
|
|
return _level;
|
|
}
|
|
|
|
public void Reset() => _level = 0;
|
|
}
|