我有一个用户与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()行的快速更改,但我不确定它会是什么。
答案 0 :(得分:10)
Console.Beep有一个过载需要频率和持续时间,如果你想在指定的持续时间内产生声音,这是很有用的。使用BIOS扬声器打开声音然后关闭它的功能不是由Console.Beep方法或我所知道的任何其他API直接支持,而不是安装假声卡驱动程序。
一些小实验发现了以下内容:
所以......你应该能够通过创建一个新的后台线程来完成你的任务,以你选择的频率调用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);
}
答案 1 :(得分:4)
如果你有一个连续声音的波形文件,你可以使用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。
答案 2 :(得分:0)
不幸的是,如果没有一些低级别的硬件访问,我不认为你想要的是什么。
Console.Beep()方法有两个重载,你使用的没有任何参数的重载只是发出一声短促的哔声。第二个重载采用两个整数,第一个用于音调的频率,第二个用于发出音调的毫秒数。
即使您绕过.NET并转到Windows API调用,您仍然具有基本相同的Beep功能(使用频率和长度参数)。
所以你可以期待的最好,如果没有更低级别的编码,就可以做一些像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蜂鸣器都没有音量控制......
答案 3 :(得分:0)
您可以使用Console.Beep(frequency,duration);
此方法允许您选择蜂鸣声的频率和持续时间。频率范围为37-32767赫兹,持续时间以毫秒为单位测量,没有限制。
例如:
using System;
namespace beeptesthd
{
class Program
{
static void Main(string[] args)
{
Console.Beep(1000,60000);
}
}
}
在下面的示例中,哔哔声频率为1000赫兹,持续时间为60000毫秒,换句话说是1分钟。