📜  如何在 C++ 中播放声音(1)

📅  最后修改于: 2023-12-03 15:08:35.069000             🧑  作者: Mango

如何在 C++ 中播放声音

在 C++ 中播放声音可以有多种方法,下面介绍其中的两种。

1. 使用 Windows API

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;
}
2. 使用第三方库

使用第三方库可以更加方便地播放各种格式的声音文件。其中比较常用的库有 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++ 中播放声音的两种方法,可以根据需要选择适合的方法。