DirectSound

今天把试了下DirectSound,说实话,用起来还没有PlaySound()方便。但功能却要强得多。

要使用这个组件,首先要用DirectSoundCreate8创建一个LPDIRECTSOUND8对象;

	LPDIRECTSOUND8 m_sound;
	HRESULT hr;

	hr = DirectSoundCreate8(NULL, &m_sound, NULL);
	if (FAILED(hr))
	{
		return FALSE;
	}

然后跟之前所说的DirectInput一样要设置协议。

	hr = m_sound->SetCooperativeLevel(m_hwnd, DSSCL_NORMAL);

	if (FAILED(hr))
	{
		return FALSE;
	}

有了协议之后就只需要创建一个缓冲区来缓冲我们的wav文件,不过很多书上说什么主缓冲区和次缓冲区。龙儿我也不管那么多了。我就创一个缓冲区。

不过在之前要知道怎么读取wav文件。龙儿提供一个完整的读取wav文件的函数

BYTE* Dsound::LoadWaveFile(LPSTR filename, DWORD* length)
{
	HMMIO file = mmioOpenA(filename, NULL, MMIO_READ);

	if (file == NULL)
	{
		return NULL;
	}

	char ch[4];
	mmioSeek(file, 8L, SEEK_SET);
	mmioRead(file, ch, 4L);

	if (ch[0] != 'W' || ch[1] != 'A' || ch[2] != 'V' || ch[3] != 'E')
	{
		mmioClose(file, 0);
		return NULL;
	}

	
	mmioSeek(file, 20L, SEEK_SET);
	mmioRead(file, HPSTR(&m_fmt), sizeof(WAVEFORMATEX));

	DWORD len;
	mmioSeek(file, 40L, SEEK_SET);
	mmioRead(file, (char*)&len, sizeof(DWORD));
	(*length) = len;

	BYTE* data;
	data = new BYTE[len];
	mmioSeek(file, 44L, SEEK_SET);
	mmioRead(file, (char*)data, LONG(len));

	mmioClose(file, 0);
	return data;
}

其中m_fmt是一个WAVEFORMATEX结构体,将会在接下来的创建缓冲区的时候用到。

创建缓冲区说白了就是真充两个结构体。一个DSBUFFERDESC,还有一个WAVEFORMATEX已经在文件中读取到了。简单吧。。。

	DSBUFFERDESC desc;
	ZeroMemory(&desc, sizeof(desc));
	desc.dwSize = sizeof(desc);
	desc.dwFlags = DSBCAPS_CTRLFREQUENCY | DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME | DSBCAPS_STATIC;
	desc.dwBufferBytes = length;
	desc.lpwfxFormat = &m_fmt;
	hr = m_sound->CreateSoundBuffer(&desc, &lpbuffer, NULL);
	if (FAILED(hr))
	{
		return FALSE;
	}

缓冲区创建后,就只剩锁定你所创建的缓冲区然后把你从wav文件中读取出来的数据写入缓冲区就行了。

	LPVOID lpvPtr;
	DWORD dwByte;

	lpbuffer->Lock(0, 0, &lpvPtr, &dwByte, NULL, NULL, DSBLOCK_ENTIREBUFFER);
	memcpy(lpvPtr, m_data, dwByte);
	lpbuffer->Unlock(lpvPtr, dwByte, NULL, 0);

终于万事俱备,只欠东风了。就差一个play了。

	lpbuffer->SetCurrentPosition(0);
	lpbuffer->Play(0, 0, DSBPLAY_LOOPING);

然后就听一下音乐享受一下自己的成果吧。

龙儿顺便提供一个这几讲的源码吧。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Visual Studio中集成DirectSound,您可以按照以下步骤操作: 1. 首先,确保您已经安装了DirectX SDK。您可以从Microsoft官方网站下载并安装最新版本的DirectX SDK。 2. 打开Visual Studio,并创建一个新的项目或打开现有的项目。 3. 在项目中添加对DirectSound库的引用。右键单击项目,选择“属性”选项。在属性窗口中,选择“配置属性”>“链接器”>“输入”。在“附加依赖项”字段中,添加"d3dx9.lib"和"dsound.lib"。 4. 在代码中包含DirectSound的头文件。在您的源代码文件中添加以下代码行: ```cpp #include <dsound.h> ``` 5. 初始化DirectSound接口。您可以使用以下代码行初始化DirectSound接口: ```cpp LPDIRECTSOUND8 pDSound; DirectSoundCreate8(NULL, &pDSound, NULL); ``` 6. 设置DirectSound协作级别。您可以使用以下代码行设置协作级别: ```cpp pDSound->SetCooperativeLevel(hwnd, DSSCL_PRIORITY); ``` 这里的`hwnd`是您的窗口句柄。 7. 创建并设置主要的音频缓冲区。您可以使用以下代码行创建主要音频缓冲区: ```cpp DSBUFFERDESC dsbd; ZeroMemory(&dsbd, sizeof(DSBUFFERDESC)); dsbd.dwSize = sizeof(DSBUFFERDESC); dsbd.dwFlags = DSBCAPS_PRIMARYBUFFER; pDSound->CreateSoundBuffer(&dsbd, &pPrimaryBuffer, NULL); ``` 8. 配置主要音频缓冲区的格式。您可以使用以下代码行配置主要音频缓冲区的格式: ```cpp WAVEFORMATEX format; ZeroMemory(&format, sizeof(WAVEFORMATEX)); format.wFormatTag = WAVE_FORMAT_PCM; format.nChannels = 2; format.nSamplesPerSec = 44100; format.wBitsPerSample = 16; format.nBlockAlign = format.nChannels * (format.wBitsPerSample / 8); format.nAvgBytesPerSec = format.nSamplesPerSec * format.nBlockAlign; pPrimaryBuffer->SetFormat(&format); ``` 9. 创建并设置次要的音频缓冲区。您可以使用以下代码行创建次要音频缓冲区: ```cpp DSBUFFERDESC dsbd; ZeroMemory(&dsbd, sizeof(DSBUFFERDESC)); dsbd.dwSize = sizeof(DSBUFFERDESC); dsbd.dwFlags = DSBCAPS_CTRLVOLUME | DSBCAPS_GLOBALFOCUS; dsbd.dwBufferBytes = bufferSize; dsbd.lpwfxFormat = &format; pDSound->CreateSoundBuffer(&dsbd, &pSecondaryBuffer, NULL); ``` 10. 您可以使用其他DirectSound接口函数来配置、播放和控制音频缓冲区。 这些步骤涵盖了在Visual Studio中集成DirectSound的基本过程。根据您的具体需求,您可能需要进一步了解DirectSound的其他功能和接口。注意,DirectSound在Windows 8及更高版本中已被标记为“过时”,推荐使用新的音频API,如XAudio2。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值