求DirectSound播放 wave 文件的简单代码,该如何解决

求DirectSound播放 wave 文件的简单代码
我自己查SDK写的总有问题。
最好不要用CWaveFile,CSound,CSoundManager等类。
如果一定要用,请给我定义和实现类的代码。
哪位高手帮我。我的邮箱tancent@sina.com.
或贴出来大家讨论下。

------解决方案--------------------
void CMainFrame::OnPlayerDirectsound()
{
// TODO: Add your command handler code here
LPVOID lpPtr1;//指针1;
LPVOID lpPtr2;//指针2;
HRESULT hResult;
DWORD dwLen1,dwLen2;
LPVOID m_pMemory;//内存指针;
LPWAVEFORMATEX m_pFormat;//LPWAVEFORMATEX变量;
LPVOID m_pData;//指向语音数据块的指针;
DWORD m_dwSize;//WAVE文件中语音数据块的长度;
CFile File;//Cfile对象;
DWORD dwSize;//存放WAV文件长度;
//打开sound.wav文件;
if (!File.Open ( "sound.wav ", CFile::modeRead |CFile::shareDenyNone))
return;
dwSize = File.Seek (0, CFile::end);//获取WAVE文件长度;
TRACE( "Total wave file length=%d\n ",dwSize);
File.Seek (0, CFile::begin);//定位到打开的WAVE文件头;
//为m_pMemory分配内存,类型为LPVOID,用来存放WAVE文件中的数据;
m_pMemory = GlobalAlloc (GMEM_FIXED, dwSize);
if (File.ReadHuge (m_pMemory, dwSize) != dwSize)//读取文件中的数据;
{
File.Close ();
return;
}
File.Close ();
LPDWORD pdw,pdwEnd;
DWORD dwRiff,dwType,dwLength;

// if (m_pFormat) //格式块指针
m_pFormat = NULL;
// if (m_pData) //数据块指针,类型:LPBYTE
m_pData = NULL;
// if (m_dwSize) //数据长度,类型:DWORD
m_dwSize = 0;
pdw = (DWORD *) m_pMemory;
dwRiff = *pdw++;
dwLength = *pdw++;
dwType = *pdw++;
if (dwRiff != mmioFOURCC ( 'R ', 'I ', 'F ', 'F '))
return ;//判断文件头是否为 "RIFF "字符;
if (dwType != mmioFOURCC ( 'W ', 'A ', 'V ', 'E '))
return ;//判断文件格式是否为 "WAVE ";
//寻找格式块,数据块位置及数据长度
pdwEnd = (DWORD *)((BYTE *) m_pMemory+dwLength -4);
bool m_bend=false;
while ((pdw < pdwEnd)&&(!m_bend))
//pdw文件没有指到文件末尾并且没有获取到声音数据时继续;
{
dwType = *pdw++;
dwLength = *pdw++;
switch (dwType)
{
case mmioFOURCC( 'f ', 'm ', 't ', ' ')://如果为 "fmt "标志;
if (!m_pFormat)//获取LPWAVEFORMATEX结构数据;
{


if (dwLength < sizeof (WAVEFORMAT))
return ;
m_pFormat = (LPWAVEFORMATEX) pdw;

TRACE( "SamplesPerSec=%d\n ",m_pFormat-> nSamplesPerSec);
TRACE( "AvgBytesPerSec=%d\n ",m_pFormat-> nAvgBytesPerSec);
}
break;
case mmioFOURCC( 'd ', 'a ', 't ', 'a ')://如果为 "data "标志;
if (!m_pData || !m_dwSize)
{
m_pData = (LPBYTE) pdw;//得到指向声音数据块的指针;
m_dwSize = dwLength;//获取声音数据块的长度;
if (m_pFormat)
m_bend=TRUE;
TRACE( "声音数据块的长度=%d\n ",dwLength);
}
break;
}
pdw = (DWORD *)((BYTE *) pdw + ((dwLength + 1)&~1));//修改pdw指针,继续循环;
}
DSBUFFERDESC BufferDesc;//定义DSUBUFFERDESC结构对象;
memset (&BufferDesc, 0, sizeof (BufferDesc));
BufferDesc.lpwfxFormat = (LPWAVEFORMATEX)m_pFormat;
BufferDesc.dwSize = sizeof (DSBUFFERDESC);
BufferDesc.dwBufferBytes = m_dwSize;
BufferDesc.dwFlags = 0;
HRESULT hRes;
LPDIRECTSOUND m_lpDirectSound;
hRes = ::DirectSoundCreate(0, &m_lpDirectSound, 0);//创建DirectSound对象;
if( hRes != DS_OK )
return;
m_lpDirectSound-> SetCooperativeLevel(this-> GetSafeHwnd(), DSSCL_NORMAL);
//设置声音设备优先级别为 "NORMAL ";
//创建声音数据缓冲;
LPDIRECTSOUNDBUFFER m_pDSoundBuffer;
if (m_lpDirectSound-> CreateSoundBuffer (&BufferDesc, &m_pDSoundBuffer, 0) == DS_OK)
//载入声音数据,这里使用两个指针lpPtr1,lpPtr2来指向DirectSoundBuffer缓冲区的数据,这是为了处理大型WAVE文件而设计的。dwLen1,dwLen2分别对应这两个指针所指向的缓冲区的长度。