c++ - windows.h 的 Beep() 的更快替代品

标签 c++ windows beep

我正在做一个个人项目。我想用一台旧的业余 radio 通过空中传输一些数据。

我的第一份申请草稿是这样的:

我用 4 个“信号”构造一个字节:

  • 5000hz 表示“00”

  • 6khz 表示“01”

  • 7khz 表示“10”

  • 8khz 表示“11”

  • 9khz 同前一个意思

然后我将这 4 个位合并在一起,然后从下一个开始。

解调效果很好,应该足够快,但我在声音生成方面遇到了问题……它很慢……

这是我的调试代码:

#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
Beep( 5000, 100 );
Beep( 6000, 100 );
Beep( 7000, 100 );
Beep( 8000, 100 );
Beep( 9000, 100 );
return 0;
}

我期待 5 声蜂鸣声,靠得很近,每次 100 毫秒,但这是我得到的(在顶部,五个“100ms Beeps()”,在底部,五个“20ms Beeps()”): a

如您所见,当我想要 100 毫秒的蜂鸣声时,我得到的是 50 毫秒的蜂鸣声和 75 毫秒的暂停,而当我想要 20 毫秒的蜂鸣声时,我得到的是 10 毫秒的蜂鸣声和 100 毫秒的暂停。

有没有比 Beep() for Windows 更快更准确的东西? (也适用于 linux 的东西会更好,因为最终的应用程序应该可以在树莓派上运行)

我将获得更高的可用带宽和 3 毫秒的声音(...... 41 字节/秒...... 这对我的应用程序来说绰绰有余)

编译器:g++ (mingw)

操作系统:7 个 64 位

最佳答案

一种方法(这很合适,因为您也想以 Linux 为目标)是生成一个 WAV 文件,然后播放它。 (有一些简单的方法可以在 Windows 和 Linux 上生成 play WAV 文件。)

您可以使用库生成 WAV 文件,也可以自己创建,这两种方法都非常简单。有很多examples在网络上。

如果你自己做:

/* WAV header, 44 bytes */
struct wav_header {
    uint32_t riff packed;
    uint32_t len packed;
    uint32_t wave packed;
    uint32_t fmt packed;
    uint32_t flen packed;
    uint16_t one packed;
    uint16_t chan packed;
    uint32_t hz packed;
    uint32_t bpsec packed;
    uint16_t bpsmp packed;
    uint16_t bitpsmp packed;
    uint32_t dat packed;
    uint32_t dlen packed;
};

初始化:

void wav_header(wav_header *p, uint32_t dlen)
{
    memcpy(p->riff, "RIFF", 4);
    p->len = dlen + 44;
    memcpy(p->wave, "WAVE", 4);
    memcpy(p->fmt, "fmt ", 4);
    p->flen = 0x10;
    p->one = 1;
    p->chan = 1;
    p->hz = 22050;
    p->bpsec = hz;
    p->bpsmp = 1;
    p->bitpsmp = 8;
    memcpy(p->dat, "data", 4);
    p->dlen = dlen;
}

关于c++ - windows.h 的 Beep() 的更快替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15992253/

相关文章:

c++ - 十六进制字节值到 DWORD (ascii) 格式

c++ - 是否可以通过指向另一个不相关的子对象的指针来获取指向一个子对象的指针?

c++ - const string 丢弃限定符

php - 提示音 新用户来了

c# - 打开/关闭音乐按钮 Console.Beep

c++ - 编译时结合 fno-rtti lib 和 rtti lib?

python - Cython 导入工作一次 - 然后给出 gcc.bat 错误

c++ - Qt <winInet.h> 在构建时输出许多 C4430 和 C2146 错误

windows - 如何在使用 TASKKILL/f/t/im explorer.exe 时保持批处理文件运行?

vb.net - e.Handled 在 VB.net 2010 中不起作用