以下是一个简单的示例代码,展示了如何使用DirectSound播放PCM原始音频数据:
#include <Windows.h>
#include <dsound.h>
// 定义音频参数
const int SAMPLE_RATE = 44100;
const int BITS_PER_SAMPLE = 16;
const int CHANNELS = 2;
int main() {
// 初始化DirectSound库
IDirectSound8* pDSound;
DirectSoundCreate8(nullptr, &pDSound, nullptr);
pDSound->Initialize(nullptr);
// 设置主音频缓冲区的格式
WAVEFORMATEX format;
ZeroMemory(&format, sizeof(WAVEFORMATEX));
format.wFormatTag = WAVE_FORMAT_PCM;
format.nChannels = CHANNELS;
format.nSamplesPerSec = SAMPLE_RATE;
format.wBitsPerSample = BITS_PER_SAMPLE;
format.nBlockAlign = (format.wBitsPerSample / 8) * format.nChannels;
format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign;
// 创建主音频缓冲区
DSBUFFERDESC desc;
ZeroMemory(&desc, sizeof(DSBUFFERDESC));
desc.dwSize = sizeof(DSBUFFERDESC);
desc.dwFlags = DSBCAPS_PRIMARYBUFFER;
IDirectSoundBuffer* pPrimaryBuffer;
pDSound->CreateSoundBuffer(&desc, &pPrimaryBuffer, nullptr);
pPrimaryBuffer->SetFormat(&format);
// 创建二级缓冲区
desc.dwFlags |= DSBCAPS_GLOBALFOCUS; // 确保缓冲区可以在后台播放
desc.dwBufferBytes = BUFFER_SIZE; // 缓冲区大小,根据实际情况设置
desc.lpwfxFormat = &format;
IDirectSoundBuffer* pBuffer;
pDSound->CreateSoundBuffer(&desc, &pBuffer, nullptr);
// 锁定缓冲区并写入PCM音频数据
void* pData1, * pData2;
DWORD dwBytes1, dwBytes2;
pBuffer->Lock(0, 0, &pData1, &dwBytes1, &pData2, &dwBytes2, 0);
// 将PCM音频数据复制到pData1和pData2所指向的内存空间中
pBuffer->Unlock(pData1, dwBytes1, pData2, dwBytes2);
// 播放音频数据
pBuffer->Play(0, 0, DSBPLAY_LOOPING); // 循环播放,可以根据需要设置其他标志
// 等待播放完成或用户输入停止命令
bool stopPlaying = false;
while (!stopPlaying) {
// 如果需要停止播放,设置stopPlaying为true,并调用Stop方法停止播放
if (GetAsyncKeyState(VK_ESCAPE)) {
stopPlaying = true;
pBuffer->Stop();
}
}
// 清理资源
pBuffer->Release();
pPrimaryBuffer->Release();
pDSound->Release();
return 0;
}
请注意,上述示例代码是一个简化版本,可能还有一些错误处理和细节未包含在内。建议在实际开发中根据需求进行适当修改和完善。<br/><br/><br/><p style="color:#CCCCCC;font-size:12px;">内容由零声教学AI助手提供,问题来源于学员提问</p> |