[英]Determine changes of master audio volume as an event (volume change listener)
[英]Volume change event - listen when volume stopped changing
我的服务器正在使用第三方库控制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通知时,都应该Stop
并Start
它。 尽管它们比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
也没有问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.