我试着按,但我就是不能。我已经试过了:
#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++发出哔哔声来学习低级声音编程)
我希望能够控制频率和持续时间
除非您从控制台登录,否则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");
}
}
这取决于您使用的终端模拟器。例如,KDE的控制台根本不支持蜂鸣器发出蜂鸣声。首先检查echo -e \a
在您的shell中是否有效。如果没有,您的c++代码也将无法工作。你可以使用xterm
-它支持这个
但即使在xterm
中,如果你没有pcspkr
(或snd_pcsp
)内核模块加载,它也可能无法工作。这通常是发行版默认将其列入黑名单的情况。在这种情况下,您的押注是寻找一个终端使用您的声卡发出蜂鸣声,而不是PC扬声器AKA蜂鸣器。
你问的是"低水平的声音产生",通常情况下,最低水平的声音产生将涉及构建一个波形,并将其以适当的格式传递给音频设备。当然,它是从你的声卡而不是PC扬声器发出的。我能给出的最好建议是仔细阅读与脉冲音频、sa甚至内核声音驱动程序相关的api。上次我玩这个(~1996),它基本上意味着分配一个样本数组,然后计算值,把近似的正弦波与适当的频率和幅度,然后写入缓冲区到输出设备。甚至可能有一些调用ioctl
来设置设备上的参数(采样率,立体声vs单声道,比特率等)。如果你的音频设备支持midi命令,它可能更容易发送那些在某种形式,更接近于"播放这些音符这么长时间使用这个乐器"。
你可能会发现这些文章很有帮助:
- https://jan.newmarch.name/LinuxSound/
- http://www.linuxjournal.com/article/6735
您在应用程序中尝试过系统调用吗?
system("echo -e 'a'");