Skip to content

Commit 0505129

Browse files
committed
[DSOUND_NEW]
- Add more parameter checks - Implement a few more functions for the primary sound buffer svn path=/trunk/; revision=45530
1 parent d1a6561 commit 0505129

File tree

3 files changed

+157
-25
lines changed

3 files changed

+157
-25
lines changed

reactos/dll/directx/dsound_new/directsound.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,12 @@ IDirectSound8_fnCreateSoundBuffer(
121121
return DSERR_INVALIDPARAM;
122122
}
123123

124+
if (lpcDSBufferDesc->dwBufferBytes != 0)
125+
{
126+
/* buffer size must be zero for primary sound buffer */
127+
return DSERR_INVALIDPARAM;
128+
}
129+
124130
if (This->PrimaryBuffer)
125131
{
126132
/* primary buffer already exists */
@@ -129,7 +135,7 @@ IDirectSound8_fnCreateSoundBuffer(
129135
return S_OK;
130136
}
131137

132-
hResult = NewPrimarySoundBuffer((LPLPDIRECTSOUNDBUFFER8)lplpDirectSoundBuffer, This->Filter, This->dwLevel);
138+
hResult = NewPrimarySoundBuffer((LPLPDIRECTSOUNDBUFFER8)lplpDirectSoundBuffer, This->Filter, This->dwLevel, lpcDSBufferDesc->dwFlags);
133139
if (SUCCEEDED(hResult))
134140
{
135141
/* store primary buffer */
@@ -145,9 +151,15 @@ IDirectSound8_fnCreateSoundBuffer(
145151
return DSERR_INVALIDPARAM;
146152
}
147153

154+
if (lpcDSBufferDesc->dwBufferBytes < DSBSIZE_MIN || lpcDSBufferDesc->dwBufferBytes > DSBSIZE_MAX)
155+
{
156+
/* buffer size must be within bounds for secondary sound buffer*/
157+
return DSERR_INVALIDPARAM;
158+
}
159+
148160
if (!This->PrimaryBuffer)
149161
{
150-
hResult = NewPrimarySoundBuffer((LPLPDIRECTSOUNDBUFFER8)lplpDirectSoundBuffer, This->Filter, This->dwLevel);
162+
hResult = NewPrimarySoundBuffer((LPLPDIRECTSOUNDBUFFER8)lplpDirectSoundBuffer, This->Filter, This->dwLevel, lpcDSBufferDesc->dwFlags);
151163
if (SUCCEEDED(hResult))
152164
{
153165
/* store primary buffer */

reactos/dll/directx/dsound_new/precomp.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,8 @@ HRESULT
201201
NewPrimarySoundBuffer(
202202
LPDIRECTSOUNDBUFFER8 *OutBuffer,
203203
LPFILTERINFO Filter,
204-
DWORD dwLevel);
204+
DWORD dwLevel,
205+
DWORD dwFlags);
205206

206207
HRESULT
207208
PrimaryDirectSoundBuffer_SetFormat(

reactos/dll/directx/dsound_new/primary.c

Lines changed: 141 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ typedef struct
1717

1818
LPFILTERINFO Filter;
1919
DWORD dwLevel;
20+
DWORD dwFlags;
21+
DWORD dwFrequency;
22+
LONG Volume;
23+
LONG VolumePan;
2024
WAVEFORMATEX Format;
2125
HANDLE hPin;
2226
CRITICAL_SECTION Lock;
@@ -94,8 +98,27 @@ PrimaryDirectSoundBuffer8Impl_fnGetCaps(
9498
LPDIRECTSOUNDBUFFER8 iface,
9599
LPDSBCAPS pDSBufferCaps)
96100
{
97-
UNIMPLEMENTED
98-
return DSERR_INVALIDPARAM;
101+
LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
102+
103+
if (!pDSBufferCaps)
104+
{
105+
/* invalid parameter */
106+
return DSERR_INVALIDPARAM;
107+
}
108+
109+
if (pDSBufferCaps->dwSize < sizeof(DSBCAPS))
110+
{
111+
/* invalid buffer size */
112+
return DSERR_INVALIDPARAM;
113+
}
114+
115+
/* get buffer details */
116+
pDSBufferCaps->dwUnlockTransferRate = 0;
117+
pDSBufferCaps->dwPlayCpuOverhead = 0;
118+
pDSBufferCaps->dwSize = 0; //FIXME
119+
pDSBufferCaps->dwFlags = This->dwFlags;
120+
121+
return DS_OK;
99122
}
100123

101124
HRESULT
@@ -105,7 +128,21 @@ PrimaryDirectSoundBuffer8Impl_fnGetCurrentPosition(
105128
LPDWORD pdwCurrentPlayCursor,
106129
LPDWORD pdwCurrentWriteCursor)
107130
{
108-
UNIMPLEMENTED
131+
LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
132+
133+
if (This->dwLevel < DSSCL_PRIORITY)
134+
{
135+
/* needs priority level */
136+
return DSERR_PRIOLEVELNEEDED;
137+
}
138+
139+
if (!pdwCurrentPlayCursor && !pdwCurrentWriteCursor)
140+
{
141+
/* all parameters are null */
142+
return DSERR_INVALIDPARAM;
143+
}
144+
145+
UNIMPLEMENTED;
109146
return DSERR_INVALIDPARAM;
110147
}
111148

@@ -160,8 +197,18 @@ PrimaryDirectSoundBuffer8Impl_fnGetVolume(
160197
LPDIRECTSOUNDBUFFER8 iface,
161198
LPLONG plVolume)
162199
{
163-
UNIMPLEMENTED
164-
return DSERR_INVALIDPARAM;
200+
LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
201+
202+
if (!plVolume)
203+
{
204+
/* invalid parameter */
205+
return DSERR_INVALIDPARAM;
206+
}
207+
208+
/* get volume */
209+
*plVolume = This->Volume;
210+
211+
return DS_OK;
165212
}
166213

167214
HRESULT
@@ -170,8 +217,18 @@ PrimaryDirectSoundBuffer8Impl_fnGetPan(
170217
LPDIRECTSOUNDBUFFER8 iface,
171218
LPLONG plPan)
172219
{
173-
UNIMPLEMENTED
174-
return DSERR_INVALIDPARAM;
220+
LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
221+
222+
if (!plPan)
223+
{
224+
/* invalid parameter */
225+
return DSERR_INVALIDPARAM;
226+
}
227+
228+
/* get frequency */
229+
*plPan = This->VolumePan;
230+
231+
return DS_OK;
175232
}
176233

177234
HRESULT
@@ -180,8 +237,18 @@ PrimaryDirectSoundBuffer8Impl_fnGetFrequency(
180237
LPDIRECTSOUNDBUFFER8 iface,
181238
LPDWORD pdwFrequency)
182239
{
183-
UNIMPLEMENTED
184-
return DSERR_INVALIDPARAM;
240+
LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
241+
242+
if (!pdwFrequency)
243+
{
244+
/* invalid parameter */
245+
return DSERR_INVALIDPARAM;
246+
}
247+
248+
/* get frequency */
249+
*pdwFrequency = This->dwFrequency;
250+
251+
return DS_OK;
185252
}
186253

187254
HRESULT
@@ -190,8 +257,22 @@ PrimaryDirectSoundBuffer8Impl_fnGetStatus(
190257
LPDIRECTSOUNDBUFFER8 iface,
191258
LPDWORD pdwStatus)
192259
{
193-
UNIMPLEMENTED
194-
return DSERR_INVALIDPARAM;
260+
LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
261+
262+
if (!pdwStatus)
263+
{
264+
/* invalid parameter */
265+
return DSERR_INVALIDPARAM;
266+
}
267+
268+
*pdwStatus = 0;
269+
if (This->State == KSSTATE_RUN || This->State == KSSTATE_ACQUIRE)
270+
{
271+
/* buffer is playing */
272+
*pdwStatus |= DSBSTATUS_PLAYING | DSBSTATUS_LOOPING;
273+
}
274+
275+
return DS_OK;
195276
}
196277

197278
HRESULT
@@ -201,8 +282,8 @@ PrimaryDirectSoundBuffer8Impl_fnInitialize(
201282
LPDIRECTSOUND pDirectSound,
202283
LPCDSBUFFERDESC pcDSBufferDesc)
203284
{
204-
UNIMPLEMENTED
205-
return DSERR_INVALIDPARAM;
285+
/* RTFM */
286+
return DSERR_ALREADYINITIALIZED;
206287
}
207288

208289
HRESULT
@@ -303,8 +384,20 @@ PrimaryDirectSoundBuffer8Impl_fnSetVolume(
303384
LPDIRECTSOUNDBUFFER8 iface,
304385
LONG lVolume)
305386
{
306-
UNIMPLEMENTED
307-
return DSERR_INVALIDPARAM;
387+
LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
388+
389+
if (lVolume < DSBVOLUME_MIN || lVolume > DSBVOLUME_MAX)
390+
{
391+
/* invalid parameter */
392+
return DSERR_INVALIDPARAM;
393+
}
394+
395+
/* TODO: call volume node */
396+
397+
/* Store volume */
398+
This->Volume = lVolume;
399+
400+
return DS_OK;
308401
}
309402

310403
HRESULT
@@ -313,8 +406,20 @@ PrimaryDirectSoundBuffer8Impl_fnSetPan(
313406
LPDIRECTSOUNDBUFFER8 iface,
314407
LONG lPan)
315408
{
316-
UNIMPLEMENTED
317-
return DSERR_INVALIDPARAM;
409+
LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
410+
411+
if (lPan < DSBPAN_LEFT || lPan > DSBPAN_RIGHT)
412+
{
413+
/* invalid parameter */
414+
return DSERR_INVALIDPARAM;
415+
}
416+
417+
/* TODO: call volume node */
418+
419+
/* Store volume pan */
420+
This->VolumePan = lPan;
421+
422+
return DS_OK;
318423
}
319424

320425
HRESULT
@@ -323,8 +428,16 @@ PrimaryDirectSoundBuffer8Impl_fnSetFrequency(
323428
LPDIRECTSOUNDBUFFER8 iface,
324429
DWORD dwFrequency)
325430
{
326-
UNIMPLEMENTED
327-
return DSERR_INVALIDPARAM;
431+
LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl);
432+
433+
if (This->dwLevel < DSSCL_PRIORITY)
434+
{
435+
/* needs priority level */
436+
return DSERR_PRIOLEVELNEEDED;
437+
}
438+
439+
/* invalid request */
440+
return DSERR_CONTROLUNAVAIL;
328441
}
329442

330443
HRESULT
@@ -374,8 +487,6 @@ PrimaryDirectSoundBuffer8Impl_fnUnlock(
374487
}
375488

376489

377-
378-
379490
HRESULT
380491
WINAPI
381492
PrimaryDirectSoundBuffer8Impl_fnRestore(
@@ -593,7 +704,10 @@ PrimaryDirectSoundBuffer_SetFormat(
593704
Result = OpenPin(This->Filter->hFilter, PinId, (LPWAVEFORMATEX)pcfxFormat, &This->hPin, bLooped);
594705
DPRINT("PinId %u Result %u\n", PinId, Result);
595706
if (Result == ERROR_SUCCESS)
707+
{
708+
This->dwFrequency = pcfxFormat->nSamplesPerSec;
596709
break;
710+
}
597711

598712
This->hPin = NULL;
599713
DeviceId++;
@@ -635,7 +749,8 @@ HRESULT
635749
NewPrimarySoundBuffer(
636750
LPDIRECTSOUNDBUFFER8 *OutBuffer,
637751
LPFILTERINFO Filter,
638-
DWORD dwLevel)
752+
DWORD dwLevel,
753+
DWORD dwFlags)
639754
{
640755
LPCDirectSoundBuffer This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CDirectSoundBuffer));
641756

@@ -649,6 +764,10 @@ NewPrimarySoundBuffer(
649764
This->lpVtbl = &vt_DirectSoundBuffer8;
650765
This->Filter = Filter;
651766
This->dwLevel = dwLevel;
767+
This->dwFlags = dwFlags;
768+
This->dwFrequency = 0;
769+
This->Volume = DSBVOLUME_MAX;
770+
This->VolumePan = DSBPAN_CENTER;
652771
This->hPin = NULL;
653772

654773
InitializeCriticalSection(&This->Lock);

0 commit comments

Comments
 (0)