你提到你知道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 文档 http://msdn.microsoft.com/en-us/library/ms712879(VS.85).aspx
包含有关 WAV 标头的更多详细信息的页面 http://soundfile.sapp.org/doc/WaveFormat/ (OLD http://ccrma.stanford.edu/courses/422/projects/WaveFormat/- 现在不工作)
DirectX 还支持从内存缓冲区播放音频,并且是一个更强大的 API,但它对于您需要做的事情来说可能有点过头了:)