private bool SpikeDetected(double soundLimitMultiplier) { var hear = false; var level = _sndDevice.AudioMeterInformation.MasterPeakValue * 100; if (VolumeQueue.Count() == MaxVolumeQueueLength && level > 1) { var avgVol = GetAverageVolume(); hear = level / avgVol >= soundLimitMultiplier; } // Keep a running queue of the last X sounds as a reference point VolumeQueue.Add(level); return(hear); }
public async Task <bool> Listen(int millisecondsToListen, double soundLimitMultiplier, CancellationToken cancellationToken) { VolumeQueue.Clear(); var stopwatch = new Stopwatch(); var sndDevEnum = new MMDeviceEnumerator(); _sndDevice = sndDevEnum.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia); stopwatch.Start(); while (stopwatch.ElapsedMilliseconds <= millisecondsToListen) { await Task.Delay(TickRate, cancellationToken); if (SpikeDetected(soundLimitMultiplier)) { return(true); } } return(false); }
internal float GetAverageVolume() { return(VolumeQueue.Average()); }