更快的替代windows.h的Beep()

时间:2013-04-13 19:57:06

标签: c++ windows beep

我正在从事个人项目。我想通过一个旧的火腿无线电传输一些数据。

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

我用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哔哔声()”,在底部,五个“20ms哔哔声()”: a

正如你所看到的,我得到的是50ms的哔哔声,当我想要100ms的哔哔声,然后是10ms的哔哔声,然后是100ms的暂停,当我想要20ms的哔哔声时,停止75ms。

对于Windows,是否有比Beep()更快更准确的内容? (与linux一起工作的东西会更好,因为最终的应用程序应该在覆盆子pi上工作)

我会用3ms的声音获得更高的可用带宽(...... 41字节/秒......这对我的应用来说已经足够了)

编译器:g ++(mingw)

Os:七个64位

1 个答案:

答案 0 :(得分:2)

一种方法(因为你想要定位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;
}