音量变化事件-当音量停止变化时收听

本文关键字:变化 事件 | 更新日期: 2023-09-27 18:09:36

我的服务器正在使用第三方库控制windows卷。当服务器从客户机获得通知它更改音量的消息时,它正在做它需要做的事情,没有任何问题。但是,无论何时在计算机上本地更改卷,我都要通知客户端。

我正在使用的这个库(https://workspaces.codeproject.com/ray-m/vista-core-audio-api-master-volume-control/article),有一个通知音量变化的事件。

问题是,它通知每一个小的音量变化步骤,因此,当用户改变音量时,委托被调用了很多次。例子:

如果当前音量为-23db,用户将音量调到-13db,那么委托将被调用10次!

我如何侦听用户何时开始更改音量,然后何时结束操作?

这样我就可以通过委托向客户端发送一次更新。

代码尝试:

void AudioEndpointVolume_OnVolumeNotification(AudioVolumeNotificationData data)
{
    VolumeTimer.Interval = 300;
    VolumeTimer.Stop();
    VolumeTimer.Start();
}
private void VolumeTimer_Tick(object sender, EventArgs e)
{
    VolumeTimer.Stop();
    lock (_lock)
    {
        ++_volumeCalledCounter;
        if (_volumeCalledCounter <= 1)
        {
            Console.WriteLine("Fired");
            _volumeCalledCounter = 0;
        }
    }
}

音量变化事件-当音量停止变化时收听

是的,Timer可以反复射击。因此,每次收到volumeChange通知时,都应该设置StopStart。虽然这些比Timer.Interval来得快,但不会发生其他事情。一旦他们停止来袭,Timer.Tick最终会开火。在这里您最后一次停止Timer并触发您自己的事件。

使用Timer VolumeTimer和原始来源:

defaultDevice.AudioEndpointVolume.OnVolumeNotification += new 
    AudioEndpointVolumeNotificationDelegate(
       AudioEndpointVolume_OnVolumeNotification);

void AudioEndpointVolume_OnVolumeNotification(AudioVolumeNotificationData data)
{
   VolumeTimer.Interval = 100;  // ms, test to gauge!
   VolumeTimer.Stop();
   VolumeTimer.Start();
}
private void VolumeTimer_Tick(object sender, EventArgs e)
{
   VolumeTimer.Stop();
   // whatever you want to do, when the volume no longer changes:
   yourEvent();         
}
编辑:

以上代码应该能解决原来的问题。

然而,如果用户缓慢地改变音量,但持续很长时间,您的事件不会一直触发。如果你想要强制UI更新,那么使用第二个Timer VolumeUiTimer:

就可以实现这个功能。
void AudioEndpointVolume_OnVolumeNotification(AudioVolumeNotificationData data)
{
   VolumeTimer.Interval = 100;  // ms, test to gauge!
   VolumeTimer.Stop();
   VolumeTimer.Start();
   if (!VolumeUiTimer.Enabled) 
      { VolumeUiTimer.Interval = 500; VolumeUiTimer.Start();
}
private void VolumeTimer_Tick(object sender, EventArgs e)
{  // no more changes: all timers stop, update UI
   VolumeTimer.Stop();
   VolumeUiTimer.Stop();
   // whatever you want to do, when the volume no longer changes:
   yourEvent();         
}
private void VolumeUiTimer_Tick(object sender, EventArgs e)
{  //restart timer1, stop timer2, update UI 
   VolumeTimer.Stop();
   VolumeTimer.Start();
   VolumeUiTimer.Stop();
   // whatever you want to do, when the volume no longer changes:
   yourEvent();         
}

我在这里设置Intervals只是为了演示;它们可以移动到InitializeComponent()之后,或者直接放到设计器中。

Aside在多个Timers上:曾经有一段时间,一个应用程序可以创建的Timers的数量是有限的,我想是16。这是很久以前的事了,创建第二个Timer没有问题。