我有一个用户与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();
}
}
Run Code Online (Sandbox Code Playgroud)
线程本身:
bool mMakeTone = false;
private void ProduceTone(){
while(this.Visibility == Visibility.Visible){
if(mMakeTone ){
Console.Beep();
}
else{
Thread.Sleep(10);
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后在按下按钮的持续时间内,将mMakeTone布尔值翻转为true,直到设备本身指定的时间.
我怀疑它只是对上面的Console.Beep()行的快速更改,但我不确定它会是什么.
Mic*_*key 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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8403 次 |
| 最近记录: |