确定主音频卷的更改为事件(音量更改侦听器)

RAM*_*RAM 1 c# audio wpf

我想将Windows的主音量绑定到程序中的滑块.所以我搜索并找到了一些方法GETSET掌握了音量+一些像这样的库:


编辑:

现在我有以下课程.我创建了它的一个实例,并使用propertychange事件通过Trace.WriteLine显示音量.但是,当我更改Windows音量时,它会导致无错误的错误!

public class AudioEndpointVolumeEnforcer : INotifyPropertyChanged
{
    private MMDeviceEnumerator mmDeviceEnumerator;
    private MMDevice mmDevice;
    private AudioEndpointVolume audioEndpointVolume;
    private bool _deviceIsMuted;
    private int _desiredVolume;
    private int _volumePercent;

    public AudioEndpointVolumeEnforcer()
    {
        try
        {
            mmDeviceEnumerator = new MMDeviceEnumerator();
            mmDevice = mmDeviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia);
            audioEndpointVolume = mmDevice.AudioEndpointVolume;
            audioEndpointVolume.OnVolumeNotification += data =>
            {
                VolumePercent = Convert.ToInt16(data.MasterVolume*100);
                _deviceIsMuted = data.Muted;
            };
            DesiredVolume = 65;
        }
        catch (Exception ex)
        {
            // Logging logic here
        }
    }

    public int DesiredVolume
    {
        get { return _desiredVolume; }
        private set
        {
            if (_desiredVolume == value) return;
            _desiredVolume = value;

            //NotifyOfPropertyChange();
            OnPropertyChanged("DesiredVolume");

            Enforce(_desiredVolume);
        }
    }


    public int VolumePercent
    {
        get { return _volumePercent; }
        private set
        {
            if (_volumePercent == value) return;
            _volumePercent = value;
            if (_volumePercent != _desiredVolume)
            {
                _volumePercent = _desiredVolume;
                Enforce(_volumePercent);
            }
        }
    }

    public void Enforce(int pct, bool mute = false)
    {
        var adjusted = Convert.ToInt16(audioEndpointVolume.MasterVolumeLevelScalar*100);
        if (adjusted != DesiredVolume)
        {
            audioEndpointVolume.MasterVolumeLevelScalar = pct/100f;
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}
Run Code Online (Sandbox Code Playgroud)

使用课程:

 // Inside my window cunstractor >>
 audioVolume = new AudioEndpointVolumeEnforcer();
 audioVolume.PropertyChanged += MasterAudioVolumeChanged;


 private void MasterAudioVolumeChanged(object obj, PropertyChangedEventArgs eventArgs)
 {
   Trace.WriteLine(eventArgs.PropertyName+" - "+audioVolume.DesiredVolume);
 }
Run Code Online (Sandbox Code Playgroud)

运行时错误:

......................................在此输入图像描述

"输出"面板显示Access violation错误:

The program '[18488] Audio.exe' has exited with code -1073741819 (0xc0000005) 'Access violation'
Run Code Online (Sandbox Code Playgroud)

编辑

我通过断点和跟踪测试了上面的代码.以下错误有时发生在以下部分:

audioEndpointVolume.OnVolumeNotification += data =>
{
    VolumePercent = Convert.ToInt16(data.MasterVolume*100);
    _deviceIsMuted = data.Muted;
};
Run Code Online (Sandbox Code Playgroud)

例如,有时它发生在这一行:

_deviceIsMuted = data.Muted;
Run Code Online (Sandbox Code Playgroud)

但当我进入下一步时,F11 它不会在程序内显示正常错误!它会导致波纹管错误窗口和应用程序关闭!

......................................在此输入图像描述

Access violation

小智 7

您可以使用NAudio库:

using NAudio;
using NAudio.CoreAudioApi;

private static MMDeviceEnumerator enumer = new MMDeviceEnumerator();
private MMDevice dev = enumer.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);

public void Form1_Load(object sender, EventArgs e){
    dev.AudioEndpointVolume.OnVolumeNotification += AudioEndpointVolume_OnVolumeNotification;
}

void AudioEndpointVolume_OnVolumeNotification(AudioVolumeNotificationData data)
{
    // This shows data.MasterVolume, you can do whatever you want here
    MessageBox.Show(data.MasterVolume.ToString());
}
Run Code Online (Sandbox Code Playgroud)

此示例使用WinForms项目,但您也可以在其他位置创建事件.

NAudio可以作为NuGet包安装,也可以从https://naudio.codeplex.com/安装

音量范围从0.0f到1.0f,得到0-100只需:

(int)(data.MasterVolume * 100f)
Run Code Online (Sandbox Code Playgroud)