mirror of
https://github.com/reactos/reactos.git
synced 2025-07-27 15:11:41 +00:00
[DSOUND_NEW]
- Add more parameter checks - Implement a few more functions for the primary sound buffer svn path=/trunk/; revision=45530
This commit is contained in:
parent
d1a6561178
commit
05051294e4
3 changed files with 157 additions and 25 deletions
|
@ -121,6 +121,12 @@ IDirectSound8_fnCreateSoundBuffer(
|
||||||
return DSERR_INVALIDPARAM;
|
return DSERR_INVALIDPARAM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (lpcDSBufferDesc->dwBufferBytes != 0)
|
||||||
|
{
|
||||||
|
/* buffer size must be zero for primary sound buffer */
|
||||||
|
return DSERR_INVALIDPARAM;
|
||||||
|
}
|
||||||
|
|
||||||
if (This->PrimaryBuffer)
|
if (This->PrimaryBuffer)
|
||||||
{
|
{
|
||||||
/* primary buffer already exists */
|
/* primary buffer already exists */
|
||||||
|
@ -129,7 +135,7 @@ IDirectSound8_fnCreateSoundBuffer(
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
hResult = NewPrimarySoundBuffer((LPLPDIRECTSOUNDBUFFER8)lplpDirectSoundBuffer, This->Filter, This->dwLevel);
|
hResult = NewPrimarySoundBuffer((LPLPDIRECTSOUNDBUFFER8)lplpDirectSoundBuffer, This->Filter, This->dwLevel, lpcDSBufferDesc->dwFlags);
|
||||||
if (SUCCEEDED(hResult))
|
if (SUCCEEDED(hResult))
|
||||||
{
|
{
|
||||||
/* store primary buffer */
|
/* store primary buffer */
|
||||||
|
@ -145,9 +151,15 @@ IDirectSound8_fnCreateSoundBuffer(
|
||||||
return DSERR_INVALIDPARAM;
|
return DSERR_INVALIDPARAM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (lpcDSBufferDesc->dwBufferBytes < DSBSIZE_MIN || lpcDSBufferDesc->dwBufferBytes > DSBSIZE_MAX)
|
||||||
|
{
|
||||||
|
/* buffer size must be within bounds for secondary sound buffer*/
|
||||||
|
return DSERR_INVALIDPARAM;
|
||||||
|
}
|
||||||
|
|
||||||
if (!This->PrimaryBuffer)
|
if (!This->PrimaryBuffer)
|
||||||
{
|
{
|
||||||
hResult = NewPrimarySoundBuffer((LPLPDIRECTSOUNDBUFFER8)lplpDirectSoundBuffer, This->Filter, This->dwLevel);
|
hResult = NewPrimarySoundBuffer((LPLPDIRECTSOUNDBUFFER8)lplpDirectSoundBuffer, This->Filter, This->dwLevel, lpcDSBufferDesc->dwFlags);
|
||||||
if (SUCCEEDED(hResult))
|
if (SUCCEEDED(hResult))
|
||||||
{
|
{
|
||||||
/* store primary buffer */
|
/* store primary buffer */
|
||||||
|
|
|
@ -201,7 +201,8 @@ HRESULT
|
||||||
NewPrimarySoundBuffer(
|
NewPrimarySoundBuffer(
|
||||||
LPDIRECTSOUNDBUFFER8 *OutBuffer,
|
LPDIRECTSOUNDBUFFER8 *OutBuffer,
|
||||||
LPFILTERINFO Filter,
|
LPFILTERINFO Filter,
|
||||||
DWORD dwLevel);
|
DWORD dwLevel,
|
||||||
|
DWORD dwFlags);
|
||||||
|
|
||||||
HRESULT
|
HRESULT
|
||||||
PrimaryDirectSoundBuffer_SetFormat(
|
PrimaryDirectSoundBuffer_SetFormat(
|
||||||
|
|
|
@ -17,6 +17,10 @@ typedef struct
|
||||||
|
|
||||||
LPFILTERINFO Filter;
|
LPFILTERINFO Filter;
|
||||||
DWORD dwLevel;
|
DWORD dwLevel;
|
||||||
|
DWORD dwFlags;
|
||||||
|
DWORD dwFrequency;
|
||||||
|
LONG Volume;
|
||||||
|
LONG VolumePan;
|
||||||
WAVEFORMATEX Format;
|
WAVEFORMATEX Format;
|
||||||
HANDLE hPin;
|
HANDLE hPin;
|
||||||
CRITICAL_SECTION Lock;
|
CRITICAL_SECTION Lock;
|
||||||
|
@ -94,8 +98,27 @@ PrimaryDirectSoundBuffer8Impl_fnGetCaps(
|
||||||
LPDIRECTSOUNDBUFFER8 iface,
|
LPDIRECTSOUNDBUFFER8 iface,
|
||||||
LPDSBCAPS pDSBufferCaps)
|
LPDSBCAPS pDSBufferCaps)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED
|
LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
|
||||||
return DSERR_INVALIDPARAM;
|
|
||||||
|
if (!pDSBufferCaps)
|
||||||
|
{
|
||||||
|
/* invalid parameter */
|
||||||
|
return DSERR_INVALIDPARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pDSBufferCaps->dwSize < sizeof(DSBCAPS))
|
||||||
|
{
|
||||||
|
/* invalid buffer size */
|
||||||
|
return DSERR_INVALIDPARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get buffer details */
|
||||||
|
pDSBufferCaps->dwUnlockTransferRate = 0;
|
||||||
|
pDSBufferCaps->dwPlayCpuOverhead = 0;
|
||||||
|
pDSBufferCaps->dwSize = 0; //FIXME
|
||||||
|
pDSBufferCaps->dwFlags = This->dwFlags;
|
||||||
|
|
||||||
|
return DS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT
|
HRESULT
|
||||||
|
@ -105,7 +128,21 @@ PrimaryDirectSoundBuffer8Impl_fnGetCurrentPosition(
|
||||||
LPDWORD pdwCurrentPlayCursor,
|
LPDWORD pdwCurrentPlayCursor,
|
||||||
LPDWORD pdwCurrentWriteCursor)
|
LPDWORD pdwCurrentWriteCursor)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED
|
LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
|
||||||
|
|
||||||
|
if (This->dwLevel < DSSCL_PRIORITY)
|
||||||
|
{
|
||||||
|
/* needs priority level */
|
||||||
|
return DSERR_PRIOLEVELNEEDED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pdwCurrentPlayCursor && !pdwCurrentWriteCursor)
|
||||||
|
{
|
||||||
|
/* all parameters are null */
|
||||||
|
return DSERR_INVALIDPARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
UNIMPLEMENTED;
|
||||||
return DSERR_INVALIDPARAM;
|
return DSERR_INVALIDPARAM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -160,8 +197,18 @@ PrimaryDirectSoundBuffer8Impl_fnGetVolume(
|
||||||
LPDIRECTSOUNDBUFFER8 iface,
|
LPDIRECTSOUNDBUFFER8 iface,
|
||||||
LPLONG plVolume)
|
LPLONG plVolume)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED
|
LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
|
||||||
return DSERR_INVALIDPARAM;
|
|
||||||
|
if (!plVolume)
|
||||||
|
{
|
||||||
|
/* invalid parameter */
|
||||||
|
return DSERR_INVALIDPARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get volume */
|
||||||
|
*plVolume = This->Volume;
|
||||||
|
|
||||||
|
return DS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT
|
HRESULT
|
||||||
|
@ -170,8 +217,18 @@ PrimaryDirectSoundBuffer8Impl_fnGetPan(
|
||||||
LPDIRECTSOUNDBUFFER8 iface,
|
LPDIRECTSOUNDBUFFER8 iface,
|
||||||
LPLONG plPan)
|
LPLONG plPan)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED
|
LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
|
||||||
return DSERR_INVALIDPARAM;
|
|
||||||
|
if (!plPan)
|
||||||
|
{
|
||||||
|
/* invalid parameter */
|
||||||
|
return DSERR_INVALIDPARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get frequency */
|
||||||
|
*plPan = This->VolumePan;
|
||||||
|
|
||||||
|
return DS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT
|
HRESULT
|
||||||
|
@ -180,8 +237,18 @@ PrimaryDirectSoundBuffer8Impl_fnGetFrequency(
|
||||||
LPDIRECTSOUNDBUFFER8 iface,
|
LPDIRECTSOUNDBUFFER8 iface,
|
||||||
LPDWORD pdwFrequency)
|
LPDWORD pdwFrequency)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED
|
LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
|
||||||
return DSERR_INVALIDPARAM;
|
|
||||||
|
if (!pdwFrequency)
|
||||||
|
{
|
||||||
|
/* invalid parameter */
|
||||||
|
return DSERR_INVALIDPARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get frequency */
|
||||||
|
*pdwFrequency = This->dwFrequency;
|
||||||
|
|
||||||
|
return DS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT
|
HRESULT
|
||||||
|
@ -190,8 +257,22 @@ PrimaryDirectSoundBuffer8Impl_fnGetStatus(
|
||||||
LPDIRECTSOUNDBUFFER8 iface,
|
LPDIRECTSOUNDBUFFER8 iface,
|
||||||
LPDWORD pdwStatus)
|
LPDWORD pdwStatus)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED
|
LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
|
||||||
return DSERR_INVALIDPARAM;
|
|
||||||
|
if (!pdwStatus)
|
||||||
|
{
|
||||||
|
/* invalid parameter */
|
||||||
|
return DSERR_INVALIDPARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
*pdwStatus = 0;
|
||||||
|
if (This->State == KSSTATE_RUN || This->State == KSSTATE_ACQUIRE)
|
||||||
|
{
|
||||||
|
/* buffer is playing */
|
||||||
|
*pdwStatus |= DSBSTATUS_PLAYING | DSBSTATUS_LOOPING;
|
||||||
|
}
|
||||||
|
|
||||||
|
return DS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT
|
HRESULT
|
||||||
|
@ -201,8 +282,8 @@ PrimaryDirectSoundBuffer8Impl_fnInitialize(
|
||||||
LPDIRECTSOUND pDirectSound,
|
LPDIRECTSOUND pDirectSound,
|
||||||
LPCDSBUFFERDESC pcDSBufferDesc)
|
LPCDSBUFFERDESC pcDSBufferDesc)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED
|
/* RTFM */
|
||||||
return DSERR_INVALIDPARAM;
|
return DSERR_ALREADYINITIALIZED;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT
|
HRESULT
|
||||||
|
@ -303,8 +384,20 @@ PrimaryDirectSoundBuffer8Impl_fnSetVolume(
|
||||||
LPDIRECTSOUNDBUFFER8 iface,
|
LPDIRECTSOUNDBUFFER8 iface,
|
||||||
LONG lVolume)
|
LONG lVolume)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED
|
LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
|
||||||
return DSERR_INVALIDPARAM;
|
|
||||||
|
if (lVolume < DSBVOLUME_MIN || lVolume > DSBVOLUME_MAX)
|
||||||
|
{
|
||||||
|
/* invalid parameter */
|
||||||
|
return DSERR_INVALIDPARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: call volume node */
|
||||||
|
|
||||||
|
/* Store volume */
|
||||||
|
This->Volume = lVolume;
|
||||||
|
|
||||||
|
return DS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT
|
HRESULT
|
||||||
|
@ -313,8 +406,20 @@ PrimaryDirectSoundBuffer8Impl_fnSetPan(
|
||||||
LPDIRECTSOUNDBUFFER8 iface,
|
LPDIRECTSOUNDBUFFER8 iface,
|
||||||
LONG lPan)
|
LONG lPan)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED
|
LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
|
||||||
return DSERR_INVALIDPARAM;
|
|
||||||
|
if (lPan < DSBPAN_LEFT || lPan > DSBPAN_RIGHT)
|
||||||
|
{
|
||||||
|
/* invalid parameter */
|
||||||
|
return DSERR_INVALIDPARAM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: call volume node */
|
||||||
|
|
||||||
|
/* Store volume pan */
|
||||||
|
This->VolumePan = lPan;
|
||||||
|
|
||||||
|
return DS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT
|
HRESULT
|
||||||
|
@ -323,8 +428,16 @@ PrimaryDirectSoundBuffer8Impl_fnSetFrequency(
|
||||||
LPDIRECTSOUNDBUFFER8 iface,
|
LPDIRECTSOUNDBUFFER8 iface,
|
||||||
DWORD dwFrequency)
|
DWORD dwFrequency)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED
|
LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
|
||||||
return DSERR_INVALIDPARAM;
|
|
||||||
|
if (This->dwLevel < DSSCL_PRIORITY)
|
||||||
|
{
|
||||||
|
/* needs priority level */
|
||||||
|
return DSERR_PRIOLEVELNEEDED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* invalid request */
|
||||||
|
return DSERR_CONTROLUNAVAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT
|
HRESULT
|
||||||
|
@ -374,8 +487,6 @@ PrimaryDirectSoundBuffer8Impl_fnUnlock(
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
HRESULT
|
HRESULT
|
||||||
WINAPI
|
WINAPI
|
||||||
PrimaryDirectSoundBuffer8Impl_fnRestore(
|
PrimaryDirectSoundBuffer8Impl_fnRestore(
|
||||||
|
@ -593,7 +704,10 @@ PrimaryDirectSoundBuffer_SetFormat(
|
||||||
Result = OpenPin(This->Filter->hFilter, PinId, (LPWAVEFORMATEX)pcfxFormat, &This->hPin, bLooped);
|
Result = OpenPin(This->Filter->hFilter, PinId, (LPWAVEFORMATEX)pcfxFormat, &This->hPin, bLooped);
|
||||||
DPRINT("PinId %u Result %u\n", PinId, Result);
|
DPRINT("PinId %u Result %u\n", PinId, Result);
|
||||||
if (Result == ERROR_SUCCESS)
|
if (Result == ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
This->dwFrequency = pcfxFormat->nSamplesPerSec;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
This->hPin = NULL;
|
This->hPin = NULL;
|
||||||
DeviceId++;
|
DeviceId++;
|
||||||
|
@ -635,7 +749,8 @@ HRESULT
|
||||||
NewPrimarySoundBuffer(
|
NewPrimarySoundBuffer(
|
||||||
LPDIRECTSOUNDBUFFER8 *OutBuffer,
|
LPDIRECTSOUNDBUFFER8 *OutBuffer,
|
||||||
LPFILTERINFO Filter,
|
LPFILTERINFO Filter,
|
||||||
DWORD dwLevel)
|
DWORD dwLevel,
|
||||||
|
DWORD dwFlags)
|
||||||
{
|
{
|
||||||
LPCDirectSoundBuffer This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CDirectSoundBuffer));
|
LPCDirectSoundBuffer This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CDirectSoundBuffer));
|
||||||
|
|
||||||
|
@ -649,6 +764,10 @@ NewPrimarySoundBuffer(
|
||||||
This->lpVtbl = &vt_DirectSoundBuffer8;
|
This->lpVtbl = &vt_DirectSoundBuffer8;
|
||||||
This->Filter = Filter;
|
This->Filter = Filter;
|
||||||
This->dwLevel = dwLevel;
|
This->dwLevel = dwLevel;
|
||||||
|
This->dwFlags = dwFlags;
|
||||||
|
This->dwFrequency = 0;
|
||||||
|
This->Volume = DSBVOLUME_MAX;
|
||||||
|
This->VolumePan = DSBPAN_CENTER;
|
||||||
This->hPin = NULL;
|
This->hPin = NULL;
|
||||||
|
|
||||||
InitializeCriticalSection(&This->Lock);
|
InitializeCriticalSection(&This->Lock);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue