可编程地通过扬声器C ++制作和播放声音

时间:2009-09-20 18:03:13

标签: c++ winapi native

我正在用原生vc ++制作游戏(不是.Net)

我正在寻找一种通过真实扬声器(非内置)播放噪音(可能是8位或其他)的方法。我知道PlaySound,但我不想让我的EXE变大。我想编制声音。

是否有api方式(有点像Beep())但是通过真实的扬声器播放?

由于

4 个答案:

答案 0 :(得分:11)

您提到您了解PlaySound。其中一个标志(SND_MEMORY)将允许您播放已加载到内存中的WAVE,即您自己创建的缓冲区。只要缓冲区具有适当的WAVE标题,无论你放在哪里都应该播放扬声器。

标头是一个44字节的块,相当直接

struct WaveHeader
{
    DWORD chunkID;       // 0x46464952 "RIFF" in little endian
    DWORD chunkSize;     // 4 + (8 + subChunk1Size) + (8 + subChunk2Size)
    DWORD format;        // 0x45564157 "WAVE" in little endian

    DWORD subChunk1ID;   // 0x20746d66 "fmt " in little endian
    DWORD subChunk1Size; // 16 for PCM
    WORD  audioFormat;   // 1 for PCM, 3 fot EEE floating point , 7 for μ-law
    WORD  numChannels;   // 1 for mono, 2 for stereo
    DWORD sampleRate;    // 8000, 22050, 44100, etc...
    DWORD byteRate;      // sampleRate * numChannels * bitsPerSample/8
    WORD  blockAlign;    // numChannels * bitsPerSample/8
    WORD  bitsPerSample; // number of bits (8 for 8 bits, etc...)

    DWORD subChunk2ID;   // 0x61746164 "data" in little endian
    DWORD subChunk2Size; // numSamples * numChannels * bitsPerSample/8 (this is the actual data size in bytes)
};

您可以使用类似于以下内容的方式设置缓冲区:

char *myBuffer = new char[sizeof(WaveHeader) + myDataSize];

WaveHeader *header = (WaveHeader*)myBuffer;
// fill out the header...

char *data = myBuffer + sizeof(WaveHeader); //jumps to beginning of data
// fill out waveform data...

所以你使用它:

PlaySound(myBuffer, NULL, SND_MEMORY | SND_ASYNC);

我假设您将在应用程序的生命周期中使用生成的声音。如果不是,请注意SND_ASYNC标志。也就是说,在调用PlaySound(当它仍在使用中)时,不要直接释放缓冲区。

MSDN PlaySound Docs
A page with more detail on the WAV headerOLD - 现在不工作)

DirectX还支持从内存缓冲区播放音频,并且是一个功能更强大的API,但它可能对您需要做的事情有些过分:)

答案 1 :(得分:1)

虽然Windows上有几种可能性,但最简单的一种是sndPlaySound():

  • 包括mmsystem.h
  • 指向winmm.lib
  • 的链接
  • ::sndPlaySound("sound.wav", SND_ASYNC|SND_NODEFAULT);
  • 停止播放:::sndPlaySound(NULL, NULL);

当然还有其他方式,如mci和直接声音,如果你能更清楚地看到你需要的东西,可能会更好地满足你的需求。

答案 2 :(得分:0)

我发现了这个: http://www.xtremevbtalk.com/showthread.php?p=829281 它可能会对你有所帮助

答案 3 :(得分:0)

我对另一个问题的回答可能会有所帮助,请查看here

我讲的是一个易于使用的opensource api(The Synthesis Toolkit),它有读/写wav文件的类,并且易于使用的包装类可以实时输出到不同的驱动程序(wdm,asio,jack, ...)

Imho它比winapi功能更容易使用