我想更改默认声音频率SND_BELL
\a
(当屏幕上打印 BEL 或 ^G时使用)达到更高的价值(目前默认约为750Hz).
当然这需要一个完整的编程解决方案。
问题是我不int value
明白pcspkr_event()
与 一起使用时会从给定频率转换为合适的值SND_TONE
。所以我不明白如何value=1000
渲染 750Hz 蜂鸣声。
switch (code) {
case SND_BELL: if (value) value = 1000; // changing this line would change the default beep frequency, but why 1000 does 750Hz tone????
case SND_TONE: break; // with SND_TONE the value variable is already computed, so do nothing
default: return -1;
}
因为实现了相同的函数,SND_TONE
我认为最好知道到底是谁调用了它,这样我就能找到转换频率的函数。然而,回溯并没有告诉调用它的函数名pcspkr_事件并且似乎在调用它的函数中转换仍然没有完成(ìnput_handle_event()
)。
我还找不到有关在没有操作系统的情况下如何使用扬声器的任何文档。
那么频率和value
变量的值之间的关系是什么?
答案1
PC 的蜂鸣声历史悠久。要了解它的用途,您必须知道它的来源。所有 PC 都有一个晶体(最初用于导出 CPU 的时钟和视频输出的色彩频率)。该值为 14.318 MHz(和变化)...除以 3,得到 CPU 频率(原始 PC 中为 4.77 MHz),除以 4,得到 (NTSC) 3.58 MHz 色彩载波。
然后将 4.77 除以 4 得到 1.19 MHz...再除以 65536 得到原始时钟信号 (18 Hz),再除以另一个变量值得到蜂鸣声。这是您必须编程的 int 值!
因此,14.31818 MHz / 12 = 1.193182MHz (1193182 Hz)。1193182 /1000 = 1193 将产生 1000Hz 的音调。
您引用的代码调用 PIT_TICK_RATE (参见http://lxr.free-electrons.com/source/include/linux/timex.h?v=3.2#L277),其定义如下:
* The clock frequency of the i8253/i8254 PIT */
#define PIT_TICK_RATE 1193182ul
当然,所有这些只有以 root 管理员身份才能工作......