我试过了,但我就是做不到。我已经试过了:
#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
cout << '\a' << flush;
return 0;
}
我也尝试过使用这个:http://www.johnath.com/beep/,但就是不发出蜂鸣声。
(如果我在终端上运行$ speaker-test -t sine -f 500 -l 2 2>&1
,它会发出蜂鸣声,但我想用c++发出蜂鸣声,以研究低级声音编程)
我希望能够控制频率和持续时间。
发布于 2016-11-06 05:35:53
除非您从控制台登录,否则cout
不会引用系统控制台。您需要打开/dev/console
并将\a
发送到那里。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
int s = open ("/dev/console", O_WRONLY);
if (s < 0)
perror ("unable to open console");
else
{
if (write (s, "\a", 1) != 1)
perror ("unable to beep");
}
}
发布于 2016-11-06 05:56:44
这取决于您使用的终端仿真器。例如,KDE的Konsole在所有AFAICT中都不支持带有蜂鸣器的蜂鸣声。首先,检查echo -e \\a
在您的shell中是否正常工作。如果不这样做,您的C++代码也将无法工作。您可以使用xterm
-它确实支持这一点。
但是,即使在xterm
中,如果您没有加载pcspkr
(或snd_pcsp
)内核模块,它也可能无法工作。当发行版默认将其列入黑名单时,通常会出现这种情况。在这种情况下,您的赌注是寻找一个终端,它使用您的声卡发出蜂鸣声,而不是PC扬声器AKA蜂鸣器。
发布于 2016-11-07 12:34:34
你问的是“低级声音生成”,通常,最低级别的声音生成包括构造一个波形,并以适当的格式将其传递给音频设备。当然,它是从你的声卡而不是电脑扬声器里发出的。我能给出的最好的建议是阅读与pulse音频相关的API,alsa,甚至内核声音驱动程序。上一次我使用这个(~1996),它基本上意味着分配一个样本数组,然后计算放入其中的值,该值近似于具有适当频率和振幅的正弦波,然后将该缓冲区写入输出设备。甚至可能有一些调用ioctl
来设置设备上的参数(采样率、立体声与单声道、比特率等)。如果您的音频设备支持midi命令,则以某种形式发送这些命令可能会更容易一些,这些格式更接近于“使用此乐器长时间演奏这些音符”。
你可能会发现这些文章很有帮助:
https://stackoverflow.com/questions/40443410
复制相似问题