--- 详情 ---
在我的计算机上,我连接了一个 PC 扬声器,无论有没有实用程序,我都可以在 Linux Ubuntu 上轻松使用它。但是,Windows 会拦截对 PC 扬声器 的调用并模拟默认音频设备上的芯片声音。
P.S: 我知道在Windows 7 x32以上的版本中,API已经被重写,并且已经删除了对该芯片的支持,但我仍然想做。也许有人有必要的驱动程序或知道其他方法。
--- 尝试 ---
我尝试使用
rundll32.exe kernel32.dll,Beep
通过命令行调用声音,但操作系统将声音重定向到我的扬声器。
我也尝试过
powershell -c
[Console]::Beep()
即使传递参数,但声音仍然在外部音频设备(在我的例子中是扬声器)上播放。
接下来,我尝试直接访问设备端口,但是只有具有内核级管理员权限(例如驱动程序)才能访问端口0x40-0x43,并且端口0x61似乎是相同的,因为当我尝试时为了访问它,编译器抛出了 segmentation failure 错误。
我搜索驱动程序并找到 2014 年的 PC 扬声器驱动程序。根据系统要求,一切似乎都是正确的,但当我尝试运行安装程序时,它显示一条错误,指出我的设备不满足最低系统要求。
我尝试了我力所能及的一切,但我无法独自解决问题。编写驱动程序需要我目前缺乏的专业知识,这是一个复杂的过程,我目前无法承担。
有谁知道这个问题的解决办法吗?
使用
KERNEL32.Beep
API,请参阅 https://learn.microsoft.com/en-us/windows/win32/api/utilapiset/nf-utilapiset-beep
这需要频率和持续时间参数,从而揭示了经典 IBM PC 平台上 8254 扬声器控制寄存器可以完成的大部分操作。这些参数在 Windows 9x 上被忽略。在基于 NT 的 Windows 上,这使用预安装的
BEEP.SYS
设备驱动程序。
如果您想通过直接在紧密循环中修改 GPIO 门位来输出 1 位音频,请使用
WinMM.PlaySound
函数(需要与 .WAV
文件格式相同的数据),或者更直接的 WinMM.waveOutWrite
函数(需要其他帮助程序调用来设置每个样本位数等内容)。如果安装的话,这会使用更好的声音硬件,并且可能没有 PC 扬声器后备驱动程序。
今年夏天,我的朋友收到了适用于他的设备的 Microsoft 签名驱动程序。您可以像以前一样使用一切。
但是您应该使用 NtDeviceIoControl,而不是使用常规的 DeviceIoControl。所有参数与原来的旧ntddbeep.h中的相同