c++ - 哔声不起作用(Linux)
Posted
技术标签:
【中文标题】c++ - 哔声不起作用(Linux)【英文标题】:c++ - beep not working (linux) 【发布时间】:2016-11-05 21:29:33 【问题描述】:我想发出哔哔声,但我根本发不出来。我已经试过了:
#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++哔哔声学习低级声音编程)
而且我希望能够控制频率和持续时间。
【问题讨论】:
为了听到哔声,您需要将终端设置为允许听到哔声(在许多环境中默认禁用)。浏览终端的菜单和/或设置对话框。不过,声音编程与\a
哔声无关。
您使用的是哪个终端模拟器?例如,KDE 的 Konsole 根本不支持哔声。首先检查echo -e \\a
在你的shell 中是否有效。否则,您的 C++ 代码也将无法工作。
@Ruslan Dunno 关于你的,但 my KDE 的 Konsole 可以,我刚刚测试了它。当然它只是通过 KDE 本周使用的任何声音系统播放一个声音文件,但你可以选择一个听起来像哔哔声的声音文件。
@n.m.也许他们在 KDE 4.14 之后实现了它。我目前使用的是 KDE4,无法检查 KF5。我记得至少有一个关于无法使用蜂鸣器的错误报告。
@Ruslan 我正在使用 5,但我很确定“配置通知”菜单从早期就存在。
【参考方案1】:
除非您从控制台登录,否则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");
【讨论】:
发生了什么?你收到错误了吗?也许您的主板没有连接扬声器,因此无法发出蜂鸣声。 @BrunoCorrêaZimmermann 那么很可能您的机箱没有扬声器或主板的扬声器连接器未连接。您必须命令声卡发出哔哔声。【参考方案2】:这取决于您使用的终端模拟器。例如,KDE 的 Konsole 根本不支持用蜂鸣器发出哔哔声 AFAICT。首先检查echo -e \\a
是否在您的shell 中工作。如果没有,您的 C++ 代码也将无法工作。你可以使用xterm
——它确实支持这个。
但即使在xterm
中,如果您没有加载pcspkr
(或snd_pcsp
)内核模块,它也可能无法工作。当发行版默认将其列入黑名单时,通常会出现这种情况。在这种情况下,您的赌注是寻找使用您的声卡发出哔哔声的终端,而不是 PC 扬声器 AKA 蜂鸣器。
【讨论】:
【参考方案3】:您询问的是“低级声音生成”,通常,最低级别的声音生成将涉及构建波形并将其以适当的格式传递给音频设备。当然,它来自您的声卡而不是 PC 扬声器。我能给出的最好建议是阅读与脉冲音频、alsa 甚至内核声音驱动程序相关的 API。上次我玩这个(约 1996 年)时,它基本上意味着分配一个样本数组,然后计算要放在那里的值,该值近似于具有适当频率和幅度的正弦波,然后将该缓冲区写入输出设备。甚至可能有人调用ioctl
来设置设备上的参数(采样率、立体声与单声道、比特率等)。如果您的音频设备支持 MIDI 命令,则以更接近“使用此乐器长时间演奏这些音符”的某种形式发送这些命令可能会更容易。
您可能会发现这些文章很有帮助:
https://jan.newmarch.name/LinuxSound/ http://www.linuxjournal.com/article/6735【讨论】:
【参考方案4】:您是否在您的应用程序中尝试过系统调用?
system("echo -e '\a'");
【讨论】:
以上是关于c++ - 哔声不起作用(Linux)的主要内容,如果未能解决你的问题,请参考以下文章