安装
Install-Package NAudio
代码
using NAudio.CoreAudioApi;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Runtime.InteropServices;
namespace CgdataBase;
public class AudioController
{
private static readonly NLog.Logger _logger = NLog.LogManager.GetCurrentClassLogger();
private MMDevice? _device = null;
/// <summary>
/// 初始化设备
/// </summary>
public void MuteInit()
{
if (IsInit() == false)
{
GetMMDevice(out _);
}
}
/// <summary>
/// 判断是否已初始化
/// </summary>
/// <returns></returns>
public bool IsInit()
{
return _device != null;
}
/// <summary>
/// 判断系统是否静音
/// </summary>
/// <returns></returns>
public bool IsMuted()
{
if (GetMMDevice(out var device))
{
return device.AudioEndpointVolume.Mute;
}
return true;
}
/// <summary>
/// 获取音频设备
/// </summary>
/// <param name="device"></param>
/// <returns>返回true表示获取成功,返回false表示获取失败</returns>
private bool GetMMDevice([NotNullWhen(true)] out MMDevice? device)
{
if (_device != null)
{
device = _device;
return true;
}
var devEnum = new MMDeviceEnumerator();
var devices = devEnum.EnumerateAudioEndPoints(DataFlow.Render, DeviceState.Active);
if (devices.Count > 0)
{
try
{
_device = devEnum.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
}
catch (COMException ex)
{
_logger.Error(ex);
_device = devices?.FirstOrDefault();
}
}
device = _device;
return device != null;
}
/// <summary>
/// 设置静音
/// </summary>
public void SetMute()
{
if (GetMMDevice(out var device))
device.AudioEndpointVolume.Mute = true;
}
/// <summary>
/// 取消静音
/// </summary>
public void SetUnMute()
{
if (GetMMDevice(out var device))
device.AudioEndpointVolume.Mute = false;
}
/// <summary>
/// 设置音量大小,范围0-1
/// </summary>
/// <param name="volume"></param>
/// <exception cref="ArgumentOutOfRangeException"></exception>
public void SetVolume(float volume)
{
if (volume < 0 || volume > 1)
{
throw new ArgumentOutOfRangeException(nameof(volume), "Volume must be between 0 and 1.");
}
if (GetMMDevice(out var device))
device.AudioEndpointVolume.MasterVolumeLevelScalar = volume;
}
/// <summary>
/// 获取当前音量大小,范围0-1,如果获取失败则返回null
/// </summary>
/// <returns></returns>
public float? GetVolume()
{
if (GetMMDevice(out var device))
return device.AudioEndpointVolume.MasterVolumeLevelScalar;
return null;
}
}