示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
 internal float GetAverageVolume()
 {
     return(VolumeQueue.Average());
 }