|
|
#include "StdAfx.h"
#include ".\game.h"
#include <mmsystem.h>
#include <mmreg.h>
#include <dsound.h>
CGame::CGame(void):
m_pDevice(NULL),
m_pD3D(NULL),
m_pSound(NULL)
{
}
CGame::~CGame(void)
{
SAFE_RELEASE(m_pSound);
SAFE_RELEASE(m_pDevice);
SAFE_RELEASE(m_pD3D);
CoUninitialize();
}
BOOL CALLBACK CGame: SEnumProc(LPGUID lpGUID, LPCTSTR lpszDesc, LPCTSTR lpszDrvName, LPVOID lpContext)
{
HWND hCombo = (HWND)lpContext;
LPGUID lpTemp = NULL;
if (lpGUID != NULL)
{
if (NULL == (lpTemp = (LPGUID)malloc(sizeof(GUID))))
{
return (TRUE);
}
memcpy(lpTemp,lpGUID,sizeof(GUID));
}
ComboBox_AddString(hCombo,lpszDesc);
ComboBox_SetItemData(hCombo,ComboBox_FindString(hCombo,0,lpszDesc),lpTemp);
free(lpTemp);
return (TRUE);
}
bool CGame::Init( HINSTANCE hInstance, HWND hWnd )
{
// COM初始化
CoInitialize(NULL);
if(FAILED(_InitD3D(hWnd)))
return false;
if (FAILED(DirectSoundEnumerate((LPDSENUMCALLBACK)DSEnumProc,(VOID*)&hWnd)))//此处有问题
{
EndDialog(hWnd,TRUE);
return (TRUE);
}
if (FAILED(DirectSoundCreate8(NULL,&m_pSound,NULL)))
return false;
m_pSound->SetCooperativeLevel(hWnd,DSSCL_PRIORITY);
LPDIRECTSOUNDBUFFER pSoundBuffer;
DSBUFFERDESC dsdesc;
memset(&dsdesc,0,sizeof(dsdesc));
dsdesc.dwSize = sizeof(dsdesc);
dsdesc.dwFlags = DSBCAPS_PRIMARYBUFFER;
dsdesc.dwBufferBytes = 0;
dsdesc.lpwfxFormat = NULL;
if (FAILED(m_pSound->CreateSoundBuffer(&dsdesc,&pSoundBuffer,NULL)))
return false;
WAVEFORMATEX pwfmt;
memset(&pwfmt,0,sizeof(pwfmt));
pwfmt.wFormatTag = WAVE_FORMAT_PCM;
pwfmt.nChannels = 2;
pwfmt.nSamplesPerSec = 44100;
pwfmt.wBitsPerSample = 16;
pwfmt.nBlockAlign = pwfmt.wBitsPerSample/8 * pwfmt.nChannels;
pwfmt.nAvgBytesPerSec = pwfmt.nSamplesPerSec * pwfmt.nBlockAlign;
pSoundBuffer->SetFormat(&pwfmt);
SAFE_RELEASE(pSoundBuffer);
HMMIO hmmio;
if (FAILED(hmmio = mmioOpen("tomorrow will be better.wav",NULL,MMIO_ALLOCBUF|MMIO_READ)))
return false;
MMCKINFO ckRiff;
ckRiff.fccType = mmioFOURCC('W','A','V','E');
MMRESULT mmresult;
mmresult = mmioDescend(hmmio,&ckRiff,NULL,MMIO_FINDRIFF);
if (mmresult != MMSYSERR_NOERROR) return false;
MMCKINFO ckInfo;
ckInfo.ckid = mmioFOURCC('f','m','t',' ');
mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
if (mmresult != MMSYSERR_NOERROR) return false;
WAVEFORMATEX swfmt;
if (mmioRead(hmmio,(HPSTR)&swfmt,sizeof(swfmt)) == -1) return false;
mmresult = mmioAscend(hmmio,&ckInfo,0);
ckInfo.ckid = mmioFOURCC('d','a','t','a');
mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
if (mmresult != MMSYSERR_NOERROR) return false;
DWORD size;
size = ckInfo.cksize;
mmioClose(hmmio,0);
LPDIRECTSOUNDBUFFER pSBuffer;
DSBUFFERDESC dsdesc1;
memset(&dsdesc1,0,sizeof(dsdesc1));
dsdesc1.dwSize = sizeof(dsdesc1);
dsdesc1.dwFlags = DSBCAPS_STATIC|DSBCAPS_CTRLPAN|DSBCAPS_CTRLVOLUME|DSBCAPS_GLOBALFOCUS;
dsdesc1.dwBufferBytes = size;
dsdesc1.lpwfxFormat = &swfmt;
if (FAILED(m_pSound->CreateSoundBuffer(&dsdesc1,&pSBuffer,NULL)))
return false;
LPVOID pAudio;
DWORD bytesAudio;
if (FAILED(pSBuffer->Lock(0,size,&pAudio,&bytesAudio,NULL,NULL,NULL))) return false;
if (mmioRead(hmmio,(HPSTR)pAudio,bytesAudio) == -1) return false;//此处有问题
if (FAILED(pSBuffer->Unlock(pAudio,bytesAudio,NULL,NULL))) return false;
mmioClose(hmmio,0);
pSBuffer-> lay(0,0,1);
//pSBuffer->Stop();
//pSBuffer->SetVolume(0);
//pSBuffer->SetPan(0);
return true;
}
HRESULT CGame::_InitD3D(HWND hWnd)
{
// COM interface
if( NULL == ( m_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
return E_FAIL;
// current display mode
D3DDISPLAYMODE d3ddm;
if( FAILED(m_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm)))
return E_FAIL;
RECT rect;
GetClientRect(hWnd, &rect);
ZeroMemory(&m_d3dpp, sizeof(m_d3dpp));
m_d3dpp.Windowed = TRUE/*FALSE*/;
m_d3dpp.BackBufferCount = 1;
m_d3dpp.BackBufferFormat = d3ddm.Format;
m_d3dpp.BackBufferWidth = rect.right - rect.left;
m_d3dpp.BackBufferHeight = rect.bottom - rect.top;
//m_d3dpp.BackBufferWidth = d3ddm.Width;
//m_d3dpp.BackBufferHeight = d3ddm.Height;
m_d3dpp.hDeviceWindow = hWnd;
m_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
m_d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
m_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
m_d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
m_d3dpp.EnableAutoDepthStencil = TRUE;
// Create D3D Device
if( FAILED( m_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&m_d3dpp, &m_pDevice ) ) )
{
return E_FAIL;
}
return S_OK;
}
void CGame::Update(float fElapsedTime)
{
}
void CGame::Render(float fElapsedTime)
{
// 在每次渲染前判断是否发生设备丢失
HRESULT hr;
// 后备缓冲区须与窗口大小一致才能正确获得D3DERR_DEVICENOTRESET
// 否则检测系统协调层级只能获得D3DERR_DEVICELOST
if( m_bDeviceLost == true )
{
Sleep( 100 ); // 100 milliseconds
// 检查系统协调层级,系统可以根据函数返回值判断设备丢失时采取的措施
if( FAILED( hr = m_pDevice->TestCooperativeLevel() ) )
{
if( hr == D3DERR_DEVICELOST )
return;
// 设备丢失能够被自动重置,这时候返回进行再次尝试
if( hr == D3DERR_DEVICENOTRESET )
{
// 清空内存资源
InvalidateDeviceObjects();
// 调用Reset函数重置设备
hr = m_pDevice->Reset( &m_d3dpp );
if( FAILED(hr ) )
return;
// 重新设置内存资源里的数据
RestoreDeviceObjects();
return;
}
}
m_bDeviceLost = false;
}
m_pDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
m_pDevice->SetRenderState(D3DRS_LIGHTING,TRUE);
m_pDevice->BeginScene();
m_pDevice->EndScene();
hr = m_pDevice->Present( NULL, NULL, NULL, NULL );
if( hr == D3DERR_DEVICELOST )
m_bDeviceLost = true;
}
void CGame::InvalidateDeviceObjects(void)
{
}
void CGame::RestoreDeviceObjects(void)
{
}
有两处问题,求教大家!
if (FAILED(DirectSoundEnumerate((LPDSENUMCALLBACK)DSEnumProc,(VOID*)&hWnd)))//此处有问题
{
EndDialog(hWnd,TRUE);
return (TRUE);
}
if (mmioRead(hmmio,(HPSTR)pAudio,bytesAudio) == -1) return false;//此处有问题
第一处报错:
e:\C++\Direct\Direct Sound\MechWarrior\Game.cpp(52): error C2440: “类型转换” : 无法从“overloaded-function”转换为“LPDSENUMCALLBACKA”
第二处报错:
干脆就Init不成功,窗口根本就不显示,注销后Init成功并显示窗口!
请教大牛! |
|