backsurface->Lock()失败导致无法播放
qq:9611153 微信lgs9611153
时间:2009-12-11 04:58下午
问题相关:
有一个现象难以修改,(播放方案中存在多个播放器)一旦播放器在某个地方发生backsurface被锁定,所有的播放器全都调用backsurface->Lock()失败,这个播放方案没有一个播放器能够播放。
如果切换播放方案,播放器backsurface->Lock()成功。
所以问题一定发生在播放器内部,另外backsurface->Lock()具有同步特征。
使用的方式如下,原来我没有使用DDLOCK_WAIT标记,但是好像并不是唯一的原因。
锁定与解锁:
unsigned char* CDisplayHandle::LockBuffer(LPDIRECTDRAWSURFACE7 lpddsBack) { ATLASSERT (lpddsBack != NULL); if(lpddsBack == NULL) return NULL;
HRESULT ddrval; DDSURFACEDESC2 ddsd; ZeroMemory(&ddsd, sizeof(DDSURFACEDESC2)); ddsd.dwSize = sizeof(DDSURFACEDESC2); //是不是应该使用DDLOCK_SURFACEMEMORYPTR代替 DDLOCK_WRITEONLY? ddrval = lpddsBack->Lock(NULL, &ddsd, DDLOCK_NOSYSLOCK | DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL); if (FAILED(ddrval))//if (ddrval != DD_OK) { if (ddrval == DDERR_INVALIDPARAMS) { ddrval = lpddsBack->Lock(NULL, &ddsd, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, NULL); } if (ddrval == DDERR_SURFACELOST) { lpddsBack->Restore(); ddrval = lpddsBack->Lock(NULL, &ddsd, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, NULL); } } //ATLASSERT(SUCCEEDED(ddrval)); if (FAILED(ddrval))//if (ddrval != DD_OK) { CUtil::Instance()->DbgFilePrintf(L"TSClient",_T("TSPlayer: LockBuffer Backsurface Lock Failed. ddrval=0x%X."),ddrval); return NULL; }
unsigned char* pBuffer = NULL; pBuffer = (unsigned char*)ddsd.lpSurface; ATLASSERT(pBuffer != NULL); if(pBuffer == NULL)lpddsBack->Unlock(NULL);
return pBuffer; }
void CDisplayHandle::UnlockBuffer(LPDIRECTDRAWSURFACE7 lpddsBack) { ATLASSERT (lpddsBack != NULL); if(lpddsBack == NULL) return;
HRESULT ddrval; ddrval = lpddsBack->Unlock(NULL); ATLASSERT(SUCCEEDED(ddrval)); if (FAILED(ddrval))//if (ddrval != DD_OK) { CUtil::Instance()->DbgFilePrintf(L"TSClient",_T("TSPlayer: UnlockBuffer Backsurface Failed.ddrval=%d."),ddrval); return; } return; }
|