📅  最后修改于: 2023-12-03 15:08:35.069000             🧑  作者: Mango
在 C++ 中播放声音可以有多种方法,下面介绍其中的两种。
Windows API中提供了直接播放 WAVE 文件的方法。以下是一段简单的示例代码:
// 包含 Windows API 的头文件
#include <Windows.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm.lib") // 链接 Winmm 库
int main()
{
// 打开 WAVE 文件
HWAVEOUT device;
WAVEFORMATEX format;
MMRESULT result = waveOutOpen(&device, WAVE_MAPPER, &format, 0, 0, CALLBACK_NULL);
if (result != MMSYSERR_NOERROR) {
return -1;
}
// 播放 WAVE 文件
result = waveOutWrite(device, &waveHeader, sizeof(waveHeader));
if (result != MMSYSERR_NOERROR) {
return -1;
}
// 关闭设备
waveOutClose(device);
return 0;
}
使用第三方库可以更加方便地播放各种格式的声音文件。其中比较常用的库有 OpenAL 和 FMOD。以下是以 OpenAL 为例的示例代码:
// 包含 OpenAL 的头文件
#include <AL/al.h>
#include <AL/alc.h>
int main()
{
// 初始化 OpenAL 上下文
ALCdevice* device = alcOpenDevice(NULL);
ALCcontext* context = alcCreateContext(device, NULL);
alcMakeContextCurrent(context);
// 创建音源和缓冲区
ALuint source, buffer;
alGenSources(1, &source);
alGenBuffers(1, &buffer);
// 加载声音文件并将数据缓存到缓冲区
// ...
// 绑定缓冲区到音源
alSourcei(source, AL_BUFFER, buffer);
// 播放音源
alSourcePlay(source);
// 等待音源播放完毕
ALint state;
do {
alGetSourcei(source, AL_SOURCE_STATE, &state);
} while (state != AL_STOPPED);
// 删除资源并关闭 OpenAL 上下文
alDeleteSources(1, &source);
alDeleteBuffers(1, &buffer);
alcMakeContextCurrent(NULL);
alcDestroyContext(context);
alcCloseDevice(device);
return 0;
}
以上是在 C++ 中播放声音的两种方法,可以根据需要选择适合的方法。