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

时间:2009-07-28 18:21:51

标签: 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();
        }
    }

线程本身:

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

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

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

4 个答案:

答案 0 :(得分: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);
}

答案 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 AudioDirectSound

答案 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分钟。