如何在 Windows x64 上访问 PC 扬声器(也称为芯片 8254)并从中播放声音

问题描述 投票:0回答:2

--- 详情 ---

在我的计算机上,我连接了一个 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 扬声器驱动程序。根据系统要求,一切似乎都是正确的,但当我尝试运行安装程序时,它显示一条错误,指出我的设备不满足最低系统要求。

我尝试了我力所能及的一切,但我无法独自解决问题。编写驱动程序需要我目前缺乏的专业知识,这是一个复杂的过程,我目前无法承担。

有谁知道这个问题的解决办法吗?

windows audio 64-bit driver speaker
2个回答
1
投票

使用

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 扬声器后备驱动程序。


0
投票

今年夏天,我的朋友收到了适用于他的设备的 Microsoft 签名驱动程序。您可以像以前一样使用一切。

但是您应该使用 NtDeviceIoControl,而不是使用常规的 DeviceIoControl。所有参数与原来的旧ntddbeep.h中的相同

© www.soinside.com 2019 - 2024. All rights reserved.