public AudioMeter(EndpointVolume.IAudioMeterInformation audioMeterInformation, SignalRatio minimumLevel, System.TimeSpan minimumDuration, System.TimeSpan Period) { AudioMeterInformation = audioMeterInformation; MinimumLevel = minimumLevel; MinimumDuration = minimumDuration; Timer = new System.Timers.Timer(Period.TotalMilliseconds) { AutoReset = true, }; Timer.Elapsed += Timer_Elapsed; // TODO: we could make this more efficient when no audio is playing by using IAudioSessionNotification and IAudioSessionEvents, so that we don't poll when no audio session is active. Timer.Start(); }
public AudioMeterEvent( string audioDeviceId, SignalRatio minimumLevel, System.TimeSpan minimumDuration, System.TimeSpan period, System.TimeSpan keepaliveInterval, System.TimeSpan keepaliveDuration, Logger logger) { MinimumLevel = minimumLevel; MinimumDuration = minimumDuration; KeepaliveInterval = keepaliveInterval; KeepaliveDuration = keepaliveDuration; Logger = logger; var deviceEnumerator = new MMDeviceAPI.MMDeviceEnumerator(); MMDeviceAPI.IMMDevice device; try { device = deviceEnumerator.GetDeviceById(audioDeviceId); } catch (System.Exception exception) { throw new System.Exception("Unable to get audio device using specified ID", exception); } IAudioMeterInformation = device.ActivateInterface <EndpointVolume.IAudioMeterInformation>(); Period = period; if (Period <= System.TimeSpan.Zero) { Period = new System.TimeSpan(minimumDuration.Ticks / 8); device.ActivateInterface <AudioClient.IAudioClient>().GetDevicePeriod(out var defaultDevicePeriod, out var minimumDevicePeriodTicks); var minimumDevicePeriod = new System.TimeSpan(minimumDevicePeriodTicks); if (Period < minimumDevicePeriod) { Period = minimumDevicePeriod; } } Logger.Log("Using minimum level: " + MinimumLevel + ", minimum duration: " + MinimumDuration + ", period: " + Period + ", keepalive interval: " + KeepaliveInterval + ", keepalive duration: " + KeepaliveDuration); }
void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs elapsedEventArgs) { AudioMeterInformation.GetPeakValue(out var peakFactor); var peakLevel = new SignalRatio { Factor = peakFactor }; if (peakLevel < MinimumLevel) { lock (CurrentDurationMutex) CurrentDuration = System.TimeSpan.Zero; } lock (CurrentDurationMutex) { CurrentDuration += System.TimeSpan.FromMilliseconds(Timer.Interval); if (CurrentDuration < MinimumDuration) { return; } } SoundDetected(this, new SoundDetectedEventArgs { PeakLevel = peakLevel }); }