Exemplo n.º 1
0
 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();
 }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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
            });
        }