📄 sound3d.c
字号:
static ULONG WINAPI IDirectSound3DBufferImpl_Release(LPDIRECTSOUND3DBUFFER iface){ IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface; ULONG ref = InterlockedDecrement(&(This->ref)); TRACE("(%p) ref was %ld\n", This, ref + 1); if (!ref) { This->dsb->ds3db = NULL; IDirectSoundBuffer_Release((LPDIRECTSOUNDBUFFER8)This->dsb); HeapFree(GetProcessHeap(), 0, This); TRACE("(%p) released\n", This); } return ref;}/* IDirectSound3DBuffer methods */static HRESULT WINAPI IDirectSound3DBufferImpl_GetAllParameters( LPDIRECTSOUND3DBUFFER iface, LPDS3DBUFFER lpDs3dBuffer){ IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface; TRACE("(%p,%p)\n",This,lpDs3dBuffer); if (lpDs3dBuffer == NULL) { WARN("invalid parameter: lpDs3dBuffer == NULL\n"); return DSERR_INVALIDPARAM; } if (lpDs3dBuffer->dwSize < sizeof(*lpDs3dBuffer)) { WARN("invalid parameter: lpDs3dBuffer->dwSize = %ld < %d\n",lpDs3dBuffer->dwSize, sizeof(*lpDs3dBuffer)); return DSERR_INVALIDPARAM; } TRACE("returning: all parameters\n"); *lpDs3dBuffer = This->dsb->ds3db_ds3db; return DS_OK;}static HRESULT WINAPI IDirectSound3DBufferImpl_GetConeAngles( LPDIRECTSOUND3DBUFFER iface, LPDWORD lpdwInsideConeAngle, LPDWORD lpdwOutsideConeAngle){ IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface; TRACE("returning: Inside Cone Angle = %ld degrees; Outside Cone Angle = %ld degrees\n", This->dsb->ds3db_ds3db.dwInsideConeAngle, This->dsb->ds3db_ds3db.dwOutsideConeAngle); *lpdwInsideConeAngle = This->dsb->ds3db_ds3db.dwInsideConeAngle; *lpdwOutsideConeAngle = This->dsb->ds3db_ds3db.dwOutsideConeAngle; return DS_OK;}static HRESULT WINAPI IDirectSound3DBufferImpl_GetConeOrientation( LPDIRECTSOUND3DBUFFER iface, LPD3DVECTOR lpvConeOrientation){ IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface; TRACE("returning: Cone Orientation vector = (%f,%f,%f)\n", This->dsb->ds3db_ds3db.vConeOrientation.x, This->dsb->ds3db_ds3db.vConeOrientation.y, This->dsb->ds3db_ds3db.vConeOrientation.z); *lpvConeOrientation = This->dsb->ds3db_ds3db.vConeOrientation; return DS_OK;}static HRESULT WINAPI IDirectSound3DBufferImpl_GetConeOutsideVolume( LPDIRECTSOUND3DBUFFER iface, LPLONG lplConeOutsideVolume){ IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface; TRACE("returning: Cone Outside Volume = %ld\n", This->dsb->ds3db_ds3db.lConeOutsideVolume); *lplConeOutsideVolume = This->dsb->ds3db_ds3db.lConeOutsideVolume; return DS_OK;}static HRESULT WINAPI IDirectSound3DBufferImpl_GetMaxDistance( LPDIRECTSOUND3DBUFFER iface, LPD3DVALUE lpfMaxDistance){ IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface; TRACE("returning: Max Distance = %f\n", This->dsb->ds3db_ds3db.flMaxDistance); *lpfMaxDistance = This->dsb->ds3db_ds3db.flMaxDistance; return DS_OK;}static HRESULT WINAPI IDirectSound3DBufferImpl_GetMinDistance( LPDIRECTSOUND3DBUFFER iface, LPD3DVALUE lpfMinDistance){ IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface; TRACE("returning: Min Distance = %f\n", This->dsb->ds3db_ds3db.flMinDistance); *lpfMinDistance = This->dsb->ds3db_ds3db.flMinDistance; return DS_OK;}static HRESULT WINAPI IDirectSound3DBufferImpl_GetMode( LPDIRECTSOUND3DBUFFER iface, LPDWORD lpdwMode){ IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface; TRACE("returning: Mode = %ld\n", This->dsb->ds3db_ds3db.dwMode); *lpdwMode = This->dsb->ds3db_ds3db.dwMode; return DS_OK;}static HRESULT WINAPI IDirectSound3DBufferImpl_GetPosition( LPDIRECTSOUND3DBUFFER iface, LPD3DVECTOR lpvPosition){ IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface; TRACE("returning: Position vector = (%f,%f,%f)\n", This->dsb->ds3db_ds3db.vPosition.x, This->dsb->ds3db_ds3db.vPosition.y, This->dsb->ds3db_ds3db.vPosition.z); *lpvPosition = This->dsb->ds3db_ds3db.vPosition; return DS_OK;}static HRESULT WINAPI IDirectSound3DBufferImpl_GetVelocity( LPDIRECTSOUND3DBUFFER iface, LPD3DVECTOR lpvVelocity){ IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface; TRACE("returning: Velocity vector = (%f,%f,%f)\n", This->dsb->ds3db_ds3db.vVelocity.x, This->dsb->ds3db_ds3db.vVelocity.y, This->dsb->ds3db_ds3db.vVelocity.z); *lpvVelocity = This->dsb->ds3db_ds3db.vVelocity; return DS_OK;}static HRESULT WINAPI IDirectSound3DBufferImpl_SetAllParameters( LPDIRECTSOUND3DBUFFER iface, LPCDS3DBUFFER lpcDs3dBuffer, DWORD dwApply){ IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface; DWORD status = DSERR_INVALIDPARAM; TRACE("(%p,%p,%lx)\n",iface,lpcDs3dBuffer,dwApply); if (lpcDs3dBuffer == NULL) { WARN("invalid parameter: lpcDs3dBuffer == NULL\n"); return status; } if (lpcDs3dBuffer->dwSize != sizeof(DS3DBUFFER)) { WARN("invalid parameter: lpcDs3dBuffer->dwSize = %ld != %d\n", lpcDs3dBuffer->dwSize, sizeof(DS3DBUFFER)); return status; } TRACE("setting: all parameters; dwApply = %ld\n", dwApply); This->dsb->ds3db_ds3db = *lpcDs3dBuffer; if (dwApply == DS3D_IMMEDIATE) { DSOUND_Mix3DBuffer(This->dsb); } This->dsb->ds3db_need_recalc = TRUE; status = DS_OK; return status;}static HRESULT WINAPI IDirectSound3DBufferImpl_SetConeAngles( LPDIRECTSOUND3DBUFFER iface, DWORD dwInsideConeAngle, DWORD dwOutsideConeAngle, DWORD dwApply){ IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface; TRACE("setting: Inside Cone Angle = %ld; Outside Cone Angle = %ld; dwApply = %ld\n", dwInsideConeAngle, dwOutsideConeAngle, dwApply); This->dsb->ds3db_ds3db.dwInsideConeAngle = dwInsideConeAngle; This->dsb->ds3db_ds3db.dwOutsideConeAngle = dwOutsideConeAngle; if (dwApply == DS3D_IMMEDIATE) { DSOUND_Mix3DBuffer(This->dsb); } This->dsb->ds3db_need_recalc = TRUE; return DS_OK;}static HRESULT WINAPI IDirectSound3DBufferImpl_SetConeOrientation( LPDIRECTSOUND3DBUFFER iface, D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply){ IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface; TRACE("setting: Cone Orientation vector = (%f,%f,%f); dwApply = %ld\n", x, y, z, dwApply); This->dsb->ds3db_ds3db.vConeOrientation.x = x; This->dsb->ds3db_ds3db.vConeOrientation.y = y; This->dsb->ds3db_ds3db.vConeOrientation.z = z; if (dwApply == DS3D_IMMEDIATE) { This->dsb->ds3db_need_recalc = FALSE; DSOUND_Mix3DBuffer(This->dsb); } This->dsb->ds3db_need_recalc = TRUE; return DS_OK;}static HRESULT WINAPI IDirectSound3DBufferImpl_SetConeOutsideVolume( LPDIRECTSOUND3DBUFFER iface, LONG lConeOutsideVolume, DWORD dwApply){ IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface; TRACE("setting: ConeOutsideVolume = %ld; dwApply = %ld\n", lConeOutsideVolume, dwApply); This->dsb->ds3db_ds3db.lConeOutsideVolume = lConeOutsideVolume; if (dwApply == DS3D_IMMEDIATE) { This->dsb->ds3db_need_recalc = FALSE; DSOUND_Mix3DBuffer(This->dsb); } This->dsb->ds3db_need_recalc = TRUE; return DS_OK;}static HRESULT WINAPI IDirectSound3DBufferImpl_SetMaxDistance( LPDIRECTSOUND3DBUFFER iface, D3DVALUE fMaxDistance, DWORD dwApply){ IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface; TRACE("setting: MaxDistance = %f; dwApply = %ld\n", fMaxDistance, dwApply); This->dsb->ds3db_ds3db.flMaxDistance = fMaxDistance; if (dwApply == DS3D_IMMEDIATE) { This->dsb->ds3db_need_recalc = FALSE; DSOUND_Mix3DBuffer(This->dsb); } This->dsb->ds3db_need_recalc = TRUE; return DS_OK;}static HRESULT WINAPI IDirectSound3DBufferImpl_SetMinDistance( LPDIRECTSOUND3DBUFFER iface, D3DVALUE fMinDistance, DWORD dwApply){ IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface; TRACE("setting: MinDistance = %f; dwApply = %ld\n", fMinDistance, dwApply); This->dsb->ds3db_ds3db.flMinDistance = fMinDistance; if (dwApply == DS3D_IMMEDIATE) { This->dsb->ds3db_need_recalc = FALSE; DSOUND_Mix3DBuffer(This->dsb); } This->dsb->ds3db_need_recalc = TRUE; return DS_OK;}static HRESULT WINAPI IDirectSound3DBufferImpl_SetMode( LPDIRECTSOUND3DBUFFER iface, DWORD dwMode, DWORD dwApply){ IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface; TRACE("setting: Mode = %ld; dwApply = %ld\n", dwMode, dwApply); This->dsb->ds3db_ds3db.dwMode = dwMode; if (dwApply == DS3D_IMMEDIATE) { This->dsb->ds3db_need_recalc = FALSE; DSOUND_Mix3DBuffer(This->dsb); } This->dsb->ds3db_need_recalc = TRUE; return DS_OK;}static HRESULT WINAPI IDirectSound3DBufferImpl_SetPosition( LPDIRECTSOUND3DBUFFER iface, D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply){ IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface; TRACE("setting: Position vector = (%f,%f,%f); dwApply = %ld\n", x, y, z, dwApply); This->dsb->ds3db_ds3db.vPosition.x = x; This->dsb->ds3db_ds3db.vPosition.y = y; This->dsb->ds3db_ds3db.vPosition.z = z; if (dwApply == DS3D_IMMEDIATE) { This->dsb->ds3db_need_recalc = FALSE; DSOUND_Mix3DBuffer(This->dsb); } This->dsb->ds3db_need_recalc = TRUE; return DS_OK;}static HRESULT WINAPI IDirectSound3DBufferImpl_SetVelocity( LPDIRECTSOUND3DBUFFER iface, D3DVALUE x, D3DVALUE y, D3DVALUE z, DWORD dwApply){ IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface; TRACE("setting: Velocity vector = (%f,%f,%f); dwApply = %ld\n", x, y, z, dwApply); This->dsb->ds3db_ds3db.vVelocity.x = x; This->dsb->ds3db_ds3db.vVelocity.y = y; This->dsb->ds3db_ds3db.vVelocity.z = z; if (dwApply == DS3D_IMMEDIATE) { This->dsb->ds3db_need_recalc = FALSE; DSOUND_Mix3DBuffer(This->dsb); } This->dsb->ds3db_need_recalc = TRUE; return DS_OK;}static const IDirectSound3DBufferVtbl ds3dbvt ={ /* IUnknown methods */ IDirectSound3DBufferImpl_QueryInterface, IDirectSound3DBufferImpl_AddRef, IDirectSound3DBufferImpl_Release, /* IDirectSound3DBuffer methods */ IDirectSound3DBufferImpl_GetAllParameters, IDirectSound3DBufferImpl_GetConeAngles, IDirectSound3DBufferImpl_GetConeOrientation, IDirectSound3DBufferImpl_GetConeOutsideVolume, IDirectSound3DBufferImpl_GetMaxDistance, IDirectSound3DBufferImpl_GetMinDistance, IDirectSound3DBufferImpl_GetMode, IDirectSound3DBufferImpl_GetPosition, IDirectSound3DBufferImpl_GetVelocity, IDirectSound3DBufferImpl_SetAllParameters, IDirectSound3DBufferImpl_SetConeAngles, IDirectSound3DBufferImpl_SetConeOrientation, IDirectSound3DBufferImpl_SetConeOutsideVolume, IDirectSound3DBufferImpl_SetMaxDistance, IDirectSound3DBufferImpl_SetMinDistance, IDirectSound3DBufferImpl_SetMode, IDirectSound3DBufferImpl_SetPosition, IDirectSound3DBufferImpl_SetVelocity,};HRESULT WINAPI IDirectSound3DBufferImpl_Create( IDirectSoundBufferImpl *dsb, IDirectSound3DBufferImpl **pds3db){ IDirectSound3DBufferImpl *ds3db; TRACE("(%p,%p)\n",dsb,pds3db); ds3db = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*ds3db)); if (ds3db == NULL) { WARN("out of memory\n"); *pds3db = 0; return DSERR_OUTOFMEMORY; } ds3db->ref = 0; ds3db->dsb = dsb; ds3db->lpVtbl = &ds3dbvt; ds3db->dsb->ds3db_ds3db.dwSize = sizeof(DS3DBUFFER); ds3db->dsb->ds3db_ds3db.vPosition.x = 0.0; ds3db->dsb->ds3db_ds3db.vPosition.y = 0.0; ds3db->dsb->ds3db_ds3db.vPosition.z = 0.0; ds3db->dsb->ds3db_ds3db.vVelocity.x = 0.0; ds3db->dsb->ds3db_ds3db.vVelocity.y = 0.0; ds3db->dsb->ds3db_ds3db.vVelocity.z = 0.0; ds3db->dsb->ds3db_ds3db.dwInsideConeAngle = DS3D_DEFAULTCONEANGLE; ds3db->dsb->ds3db_ds3db.dwOutsideConeAngle = DS3D_DEFAULTCONEANGLE; ds3db->dsb->ds3db_ds3db.vConeOrientation.x = 0.0; ds3db->dsb->ds3db_ds3db.vConeOrientation.y = 0.0; ds3db->dsb->ds3db_ds3db.vConeOrientation.z = 0.0; ds3db->dsb->ds3db_ds3db.lConeOutsideVolume = DS3D_DEFAULTCONEOUTSIDEVOLUME; ds3db->dsb->ds3db_ds3db.flMinDistance = DS3D_DEFAULTMINDISTANCE; ds3db->dsb->ds3db_ds3db.flMaxDistance = DS3D_DEFAULTMAXDISTANCE; ds3db->dsb->ds3db_ds3db.dwMode = DS3DMODE_NORMAL; ds3db->dsb->ds3db_need_recalc = TRUE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -