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

时间:2014-06-21 21:12:54

标签: c# listener volume

我的服务器正在使用第三方库控制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;
        }
    }

}

1 个答案:

答案 0 :(得分:2)

是的,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()之后转移到设计师手中。

多个Timers上的

除了:有一段时间,应用程序可以创建的Timers数量限制为,我认为16.这已经很久了创建第二个Timer是没问题的。