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

mmr*_*mmr 3 c# beep

我有一个用户与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()是同步的,直到声音结束才返回.
  • 从单独的线程调用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);
}
Run Code Online (Sandbox Code Playgroud)