这是一个简单的使用DirectSound实现播放、暂停和停止功能的示例代码:
#include <Windows.h>
#include <dsound.h>
#pragma comment(lib, "dsound.lib")
#pragma comment(lib, "dxguid.lib")
LPDIRECTSOUND8 g_pDS = NULL;
LPDIRECTSOUNDBUFFER g_pDSBuffer = NULL;
bool InitializeDirectSound(HWND hWnd)
{
if (FAILED(DirectSoundCreate8(NULL, &g_pDS, NULL)))
return false;
if (FAILED(g_pDS->SetCooperativeLevel(hWnd, DSSCL_PRIORITY)))
return false;
WAVEFORMATEX waveFormat;
waveFormat.wFormatTag = WAVE_FORMAT_PCM;
waveFormat.nChannels = 2;
waveFormat.nSamplesPerSec = 44100;
waveFormat.wBitsPerSample = 16;
waveFormat.nBlockAlign = (waveFormat.nChannels * waveFormat.wBitsPerSample) / 8;
waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign;
waveFormat.cbSize = 0;
DSBUFFERDESC dsbd;
ZeroMemory(&dsbd, sizeof(DSBUFFERDESC));
dsbd.dwSize = sizeof(DSBUFFERDESC);
dsbd.dwFlags = DSBCAPS_PRIMARYBUFFER | DSBCAPS_CTRLVOLUME;
if (FAILED(g_pDS->CreateSoundBuffer(&dsbd, &g_pDSBuffer, NULL)))
return false;
if (FAILED(g_pDSBuffer->SetVolume(DSBVOLUME_MAX))) // 设置最大音量
return false;
dsbd.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS | DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLPAN;
dsbd.dwBufferBytes = waveFormat.nAvgBytesPerSec * 5; // 5秒缓冲区
dsbd.lpwfxFormat = &waveFormat;
if (FAILED(g_pDS->CreateSoundBuffer(&dsbd, &g_pDSBuffer, NULL)))
return false;
return true;
}
bool LoadWaveFile(const char* filename)
{
FILE* file;
fopen_s(&file, filename, "rb");
if (!file)
return false;
fseek(file, 0, SEEK_END);
int fileSize = ftell(file);
fseek(file, 0, SEEK_SET);
BYTE* waveData = new BYTE[fileSize];
if (!waveData)
{
fclose(file);
return false;
}
fread(waveData, sizeof(BYTE), fileSize, file);
fclose(file);
void* buffer1;
DWORD bufferSize1;
void* buffer2;
DWORD bufferSize2;
if (FAILED(g_pDSBuffer->Lock(0, fileSize, &buffer1, &bufferSize1, &buffer2, &bufferSize2,
DSBLOCK_ENTIREBUFFER)))
{
delete[] waveData;
return false;
}
memcpy(buffer1, waveData, bufferSize1);
memcpy(buffer2, waveData + bufferSize1 / sizeof(BYTE), bufferSize2);
g_pDSBuffer->Unlock(buffer1, bufferSize1, buffer2, bufferSize2);
delete[] waveData;
return true;
}
void PlaySound()
{
g_pDSBuffer->Play(0UL , 0UL , DSBPLAY_LOOPING);
}
void PauseSound()
{
g_pDSBuffer->Stop();
}
void StopSound()
{
g_pDSBuffer->Stop();
g_pDSBuffer->SetCurrentPosition(0L); // 设置播放位置为开头
}
void ReleaseDirectSound()
{
if (g_pDSBuffer)
{
g_pDSBuffer->Release();
g_pDSBuffer = NULL;
}
if (g_pDS)
{
g_pDS->Release();
g_pDS = NULL;
}
}
// 示例用法
int main()
{
HWND hWnd = GetConsoleWindow(); // 获取控制台窗口句柄
InitializeDirectSound(hWnd); // 初始化DirectSound
if (LoadWaveFile("sound.wav")) // 加载音频文件
{
PlaySound(); // 播放音频
Sleep(5000); // 延时5秒
PauseSound(); // 暂停播放
Sleep(2000); // 延时2秒
PlaySound(); // 继续播放
Sleep(3000); // 延时3秒
StopSound(); // 停止播放
}
ReleaseDirectSound(); // 释放资源
return 0;
}
请注意,这只是一个简单的示例代码,并没有处理错误和异常情况。在实际开发中,还需要添加错误检查和适当的异常处理。<br/><br/><br/><p style="color:#CCCCCC;font-size:12px;">内容由零声教学AI助手提供,问题来源于学员提问</p> |