C#:产生连续音,直到被打断

我有一个用户与C#WPF程序一起交互的设备。 当用户按下设备上的按钮时,该程序必须发出哔声,指定的时间长度或用户按下按钮的时间,以较短者为准。 可用于产生蜂鸣声/音调的唯一扬声器是计算机BIOS扬声器; 我们不能假设其他发言者在附近(并且假设不会有任何其他发言者实际上是安全的)。

如何在必要的持续时间内产生连续的音调?

到目前为止,我发出了许多哔哔声,但不是连续的音调。

首先,启动一个线程:

private void UserControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) { if(this.Visibility == Visibility.Visible){ mBeepThread = new Thread(new ThreadStart(ProduceTone)); mBeepThread.Name = "Beep Thread"; mBeepThread.Start(); } } 

线程本身:

  bool mMakeTone = false; private void ProduceTone(){ while(this.Visibility == Visibility.Visible){ if(mMakeTone ){ Console.Beep(); } else{ Thread.Sleep(10); } } } 

然后在按下按钮的持续时间内将mMakeTone布尔值翻转为true,直到设备本身指定的时间。

我怀疑它只是对上面的Console.Beep()行的快速更改,但我不确定它会是什么。

Console.Beep有一个过载需要频率和持续时间,如果你想在指定的持续时间内产生声音,这是很有用的。 使用BIOS扬声器打开声音然后关闭它的function不是由Console.Beep方法或我所知道的任何其他API直接支持,而不是安装假声卡驱动程序。

一些实验发现了以下内容:

  • Console.Beep()是同步的,直到声音结束才返回。
  • 从单独的线程调用Console.Beep()会中断当前正在进行的操作。

所以…你应该能够通过创建一个新的后台线程来完成你的任务,以你选择的频率调用Console.Beep()并持续很长时间。 要稍后终止声音,您可以在主线程上以任何频率和非常非零持续时间(例如1)调用Console.Beep()以终止从后台线程播放的声音。 你不应该在合理的持续时间内让声音在后台线程上播放,因为线程会一直存在,直到声音通常停止播放并且你不希望很多背景线程堆积在你身上。

 private void button1_Click(object sender, EventArgs e) { // Starts beep on background thread Thread beepThread = new Thread(new ThreadStart(PlayBeep)); beepThread.IsBackground = true; beepThread.Start(); } private void button2_Click(object sender, EventArgs e) { // Terminates beep from main thread Console.Beep(1000, 1); } private void PlayBeep() { // Play 1000 Hz for 5 seconds Console.Beep(1000, 5000); } 

如果你有一个连续声音的波形文件,你可以使用SoundPlayer:

 SoundPlayer player = new SoundPlayer(); player.SoundLocation = @"C:\Program Files\MyApp\sound.wav"; player.PlayLooping(); ... // Later, when you know it's time to stop the sound: player.Stop(); 

我不知道你是否能听到开始和停止的声音。

如果这对您不起作用,您可能需要降级到Win32调用。 您可能想要查看Multimedia Audio或DirectSound 。

不幸的是,如果没有一些低级硬件访问,我不认为你想要的是什么。

Console.Beep()方法有两个重载,你使用的没有任何参数的重载只是发出一声短促的哔声。 第二个过载采用两个整数,第一个用于音调的频率,第二个用于发出音调的毫秒数。

即使您绕过.NET并转到Windows API调用,您仍然具有基本相同的Beepfunction(具有频率和长度参数)。

因此,如果没有更低级别的编码,你可以期望的最好的事情是做一些像声音500毫秒音调的事情,并最终得到一系列中断的半秒哔哔声。

 bool mMakeTone = false; private void ProduceTone(){ while(this.Visibility == Visibility.Visible){ if(mMakeTone ){ Console.Beep(800, 500); // 800 Hz tone for half a second } else{ Thread.Sleep(10); } } } 

由于现在大多数PC蜂鸣器都没有音量控制,所以准备好在测试期间让自己疯狂……

您可以使用Console.Beep(frequency,duration); 此方法允许您选择蜂鸣声的频率和持续时间。 频率范围为37-32767赫兹,持续时间以毫秒为单位测量,没有限制。 例如:

 using System; namespace beeptesthd { class Program { static void Main(string[] args) { Console.Beep(1000,60000); } } } 

在下面的示例中,蜂鸣声频率是1000赫兹,其持续时间是60000毫秒,换句话说是1分钟。