Files
WorkIndicator/AudioWatcher.cs

93 lines
2.9 KiB
C#

using CSCore.CoreAudioAPI;
using System;
using System.Diagnostics;
using System.Threading;
namespace WorkIndicator
{
public static class AudioWatcher
{
public delegate void MicrophoneInUseChangedDelegate(bool microphoneInUse);
private static ManualResetEvent _manualResetEvent;
private static int _activeSessionCount;
public static event MicrophoneInUseChangedDelegate MicrophoneInUseChanged;
public static void Start()
{
_manualResetEvent = new ManualResetEvent(false);
var thread = new Thread(delegate ()
{
var deviceEnumerator = new MMDeviceEnumerator();
foreach (var device in deviceEnumerator.EnumAudioEndpoints(DataFlow.Capture, DeviceState.Active))
{
var sessionManager = AudioSessionManager2.FromMMDevice(device);
var sessionEnumerator = sessionManager.GetSessionEnumerator();
sessionManager.SessionCreated += HandleAudioSessionCreated;
foreach (var audioSessionControl in sessionEnumerator)
{
HandleAudioStateChanged(audioSessionControl, new AudioSessionStateChangedEventArgs(audioSessionControl.SessionState));
audioSessionControl.StateChanged += HandleAudioStateChanged;
}
}
_manualResetEvent.WaitOne();
});
thread.SetApartmentState(ApartmentState.MTA);
thread.Start();
}
public static void Stop()
{
_manualResetEvent?.Set();
}
private static void HandleAudioSessionCreated(object sender, SessionCreatedEventArgs e)
{
HandleAudioStateChanged(null, new AudioSessionStateChangedEventArgs(e.NewSession.SessionState));
e.NewSession.StateChanged += HandleAudioStateChanged;
}
private static void HandleAudioStateChanged(object sender, AudioSessionStateChangedEventArgs e)
{
Debug.WriteLine($"{e.NewState}");
switch (e.NewState)
{
case AudioSessionState.AudioSessionStateActive:
_activeSessionCount++;
break;
case AudioSessionState.AudioSessionStateInactive:
_activeSessionCount--;
break;
case AudioSessionState.AudioSessionStateExpired:
break;
default:
throw new ArgumentOutOfRangeException();
}
if (_activeSessionCount < 0)
_activeSessionCount = 0;
Debug.WriteLine($"{_activeSessionCount}");
MicrophoneInUseChanged?.Invoke(MicrophoneInUse());
}
public static bool MicrophoneInUse()
{
return _activeSessionCount > 0;
}
}
}