LPFILTERINFO Filter;
DWORD dwLevel;
+ DWORD dwFlags;
+ DWORD dwFrequency;
+ LONG Volume;
+ LONG VolumePan;
LPWAVEFORMATEX Format;
PUCHAR Buffer;
DWORD BufferSize;
LPDIRECTSOUNDBUFFER8 iface,
LPDSBCAPS pDSBufferCaps)
{
- UNIMPLEMENTED
- return DSERR_INVALIDPARAM;
+ LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+ 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 = This->BufferSize;
+ pDSBufferCaps->dwFlags = This->dwFlags;
+
+ return DS_OK;
}
HRESULT
WINAPI
SecondaryDirectSoundBuffer8Impl_fnGetFormat(
LPDIRECTSOUNDBUFFER8 iface,
- LPWAVEFORMATEX pwfxFormat,
- DWORD dwSizeAllocated,
+ LPWAVEFORMATEX pwfxFormat,
+ DWORD dwSizeAllocated,
LPDWORD pdwSizeWritten)
{
DWORD FormatSize;
LPDIRECTSOUNDBUFFER8 iface,
LPLONG plVolume)
{
- UNIMPLEMENTED
- return DSERR_INVALIDPARAM;
+ LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+ if (!plVolume)
+ {
+ /* invalid parameter */
+ return DSERR_INVALIDPARAM;
+ }
+
+ /* get volume */
+ *plVolume = This->Volume;
+
+ return DS_OK;
}
HRESULT
LPDIRECTSOUNDBUFFER8 iface,
LPLONG plPan)
{
- UNIMPLEMENTED
- return DSERR_INVALIDPARAM;
+ LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+ if (!plPan)
+ {
+ /* invalid parameter */
+ return DSERR_INVALIDPARAM;
+ }
+
+ /* get frequency */
+ *plPan = This->VolumePan;
+
+ return DS_OK;
}
HRESULT
LPDIRECTSOUNDBUFFER8 iface,
LPDWORD pdwFrequency)
{
- UNIMPLEMENTED
- return DSERR_INVALIDPARAM;
+ LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+ if (!pdwFrequency)
+ {
+ /* invalid parameter */
+ return DSERR_INVALIDPARAM;
+ }
+
+ /* get frequency */
+ *pdwFrequency = This->dwFrequency;
+
+ return DS_OK;
}
HRESULT
LPDIRECTSOUND pDirectSound,
LPCDSBUFFERDESC pcDSBufferDesc)
{
- UNIMPLEMENTED
- return DSERR_INVALIDPARAM;
+ /* RTFM */
+ return DSERR_ALREADYINITIALIZED;
}
HRESULT
else
{
ASSERT(dwOffset < This->BufferSize);
- ASSERT(dwBytes < This->BufferSize);
- ASSERT(dwBytes + dwOffset <= This->BufferSize);
+ ASSERT(dwBytes <= This->BufferSize);
+
+ dwBytes = min(This->BufferSize - dwOffset, dwBytes);
*ppvAudioPtr1 = This->Buffer + dwOffset;
*pdwAudioBytes1 = dwBytes;
/* release primary buffer */
PrimaryDirectSoundBuffer_ReleaseLock(This->PrimaryBuffer);
- DPRINT1("SetFormatSuccess PrimaryBuffer %p\n", This->PrimaryBuffer);
+ DPRINT("SetFormatSuccess PrimaryBuffer %p\n", This->PrimaryBuffer);
return DS_OK;
}
LPDIRECTSOUNDBUFFER8 iface,
LPCWAVEFORMATEX pcfxFormat)
{
+ /* RTFM */
return DSERR_INVALIDCALL;
}
LPDIRECTSOUNDBUFFER8 iface,
LONG lVolume)
{
- UNIMPLEMENTED
- return DSERR_INVALIDPARAM;
+ LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+ if (lVolume < DSBVOLUME_MIN || lVolume > DSBVOLUME_MAX)
+ {
+ /* invalid parameter */
+ return DSERR_INVALIDPARAM;
+ }
+
+
+ /* Store volume */
+ This->Volume = lVolume;
+
+ return DS_OK;
}
HRESULT
LPDIRECTSOUNDBUFFER8 iface,
LONG lPan)
{
- UNIMPLEMENTED
- return DSERR_INVALIDPARAM;
+ LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+ if (lPan < DSBPAN_LEFT || lPan > DSBPAN_RIGHT)
+ {
+ /* invalid parameter */
+ return DSERR_INVALIDPARAM;
+ }
+
+ /* Store volume pan */
+ This->VolumePan = lPan;
+
+ return DS_OK;
}
HRESULT
LPDIRECTSOUNDBUFFER8 iface,
DWORD dwFrequency)
{
- UNIMPLEMENTED
- return DSERR_INVALIDPARAM;
+ LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
+
+ if (dwFrequency == DSBFREQUENCY_ORIGINAL)
+ {
+ /* restore original frequency */
+ dwFrequency = This->Format->nSamplesPerSec;
+ }
+
+ if (dwFrequency < DSBFREQUENCY_MIN || dwFrequency > DSBFREQUENCY_MAX)
+ {
+ /* invalid frequency */
+ return DSERR_INVALIDPARAM;
+ }
+
+ if (dwFrequency != This->dwFrequency)
+ {
+ /* FIXME handle frequency change */
+ }
+
+ /* store frequency */
+ This->dwFrequency = dwFrequency;
+
+ return DS_OK;
}
HRESULT
This->lpVtbl = &vt_DirectSoundBuffer8;
This->Filter = Filter;
This->dwLevel = dwLevel;
+ This->dwFlags = lpcDSBufferDesc->dwFlags;
+ This->dwFrequency = lpcDSBufferDesc->lpwfxFormat->nSamplesPerSec;
This->State = KSSTATE_STOP;
+ This->Volume = DSBVOLUME_MAX;
+ This->VolumePan = DSBPAN_CENTER;
This->Flags = 0;
This->Position = 0;
This->BufferSize = lpcDSBufferDesc->dwBufferBytes;