70 lines
2.3 KiB
C#
70 lines
2.3 KiB
C#
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<AudioSession>();
|
|
|
|
_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);
|
|
}
|
|
} |