我用原生vc ++制作游戏(不是.Net)
我正在寻找一种通过真实扬声器(非内部)播放噪音(可能是8位或其他东西)的方法.我知道PlaySound,但我不想让我的EXE变大.我想编制声音.
有没有api方式(有点像Beep())但是通过真正的扬声器播放?
谢谢
Cor*_*oss 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)
};
Run Code Online (Sandbox Code Playgroud)
您可以使用类似于以下内容的方式设置缓冲区:
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...
Run Code Online (Sandbox Code Playgroud)
所以你使用它像:
PlaySound(myBuffer, NULL, SND_MEMORY | SND_ASYNC);
Run Code Online (Sandbox Code Playgroud)
我假设你将在你的应用程序的生命周期中使用你生成的声音.如果你不是,小心那面SND_ASYNC旗帜.也就是说,在调用PlaySound(当它仍在使用中)时,不要直接释放缓冲区.
MSDN PlaySound Docs
有关WAV标题更详细的页面(OLD - 现在不工作)
DirectX还支持从内存缓冲区播放音频,并且是一个功能更强大的API,但它可能会超出你需要做的事情:)