using NAudio.CoreAudioApi; using NAudio.CoreAudioApi.Interfaces; using Serilog; using System; namespace WorkIndicator.Audio; internal class AudioSession : IAudioSessionEventsHandler { private readonly ILogger _logger; private readonly AudioSessionControl _audioSessionControl; public string Id { get; } public string FriendlyName { get; } public delegate void AudioSessionChangedDelegate(string id, AudioSessionState state); public event AudioSessionChangedDelegate AudioSessionChanged; public AudioSession(AudioSessionControl audioSessionControl, string friendlyName) { _logger = Log.ForContext(); _audioSessionControl = audioSessionControl; Id = audioSessionControl.GetSessionIdentifier; FriendlyName = friendlyName; audioSessionControl.RegisterEventClient(this); } public AudioSessionState State => _audioSessionControl.State; void IAudioSessionEventsHandler.OnVolumeChanged(float volume, bool isMuted) { _logger.Information("OnVolumeChanged: {name} {volume} {isMuted}", FriendlyName, volume, isMuted); } void IAudioSessionEventsHandler.OnDisplayNameChanged(string displayName) { _logger.Information("OnDisplayNameChanged: {name}", displayName); } void IAudioSessionEventsHandler.OnIconPathChanged(string iconPath) { _logger.Information("OnIconPathChanged: {path}", iconPath); } void IAudioSessionEventsHandler.OnChannelVolumeChanged(uint channelCount, IntPtr newVolumes, uint channelIndex) { _logger.Information("OnChannelVolumeChanged: {channelCount} {newVolumes} {channelIndex}", channelCount, newVolumes, channelIndex); } void IAudioSessionEventsHandler.OnGroupingParamChanged(ref Guid groupingId) { _logger.Information("OnGroupingParamChanged: {groupingId}", groupingId); } void IAudioSessionEventsHandler.OnStateChanged(AudioSessionState state) { _logger.Information("OnStateChanged: {state}", state); AudioSessionChanged?.Invoke(Id, state); } void IAudioSessionEventsHandler.OnSessionDisconnected(AudioSessionDisconnectReason disconnectReason) { _logger.Information("OnSessionDisconnected: {disconnectReason}", disconnectReason); } }