@@ -17,6 +17,10 @@ typedef struct
17
17
18
18
LPFILTERINFO Filter ;
19
19
DWORD dwLevel ;
20
+ DWORD dwFlags ;
21
+ DWORD dwFrequency ;
22
+ LONG Volume ;
23
+ LONG VolumePan ;
20
24
WAVEFORMATEX Format ;
21
25
HANDLE hPin ;
22
26
CRITICAL_SECTION Lock ;
@@ -94,8 +98,27 @@ PrimaryDirectSoundBuffer8Impl_fnGetCaps(
94
98
LPDIRECTSOUNDBUFFER8 iface ,
95
99
LPDSBCAPS pDSBufferCaps )
96
100
{
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 ;
99
122
}
100
123
101
124
HRESULT
@@ -105,7 +128,21 @@ PrimaryDirectSoundBuffer8Impl_fnGetCurrentPosition(
105
128
LPDWORD pdwCurrentPlayCursor ,
106
129
LPDWORD pdwCurrentWriteCursor )
107
130
{
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 ;
109
146
return DSERR_INVALIDPARAM ;
110
147
}
111
148
@@ -160,8 +197,18 @@ PrimaryDirectSoundBuffer8Impl_fnGetVolume(
160
197
LPDIRECTSOUNDBUFFER8 iface ,
161
198
LPLONG plVolume )
162
199
{
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 ;
165
212
}
166
213
167
214
HRESULT
@@ -170,8 +217,18 @@ PrimaryDirectSoundBuffer8Impl_fnGetPan(
170
217
LPDIRECTSOUNDBUFFER8 iface ,
171
218
LPLONG plPan )
172
219
{
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 ;
175
232
}
176
233
177
234
HRESULT
@@ -180,8 +237,18 @@ PrimaryDirectSoundBuffer8Impl_fnGetFrequency(
180
237
LPDIRECTSOUNDBUFFER8 iface ,
181
238
LPDWORD pdwFrequency )
182
239
{
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 ;
185
252
}
186
253
187
254
HRESULT
@@ -190,8 +257,22 @@ PrimaryDirectSoundBuffer8Impl_fnGetStatus(
190
257
LPDIRECTSOUNDBUFFER8 iface ,
191
258
LPDWORD pdwStatus )
192
259
{
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 ;
195
276
}
196
277
197
278
HRESULT
@@ -201,8 +282,8 @@ PrimaryDirectSoundBuffer8Impl_fnInitialize(
201
282
LPDIRECTSOUND pDirectSound ,
202
283
LPCDSBUFFERDESC pcDSBufferDesc )
203
284
{
204
- UNIMPLEMENTED
205
- return DSERR_INVALIDPARAM ;
285
+ /* RTFM */
286
+ return DSERR_ALREADYINITIALIZED ;
206
287
}
207
288
208
289
HRESULT
@@ -303,8 +384,20 @@ PrimaryDirectSoundBuffer8Impl_fnSetVolume(
303
384
LPDIRECTSOUNDBUFFER8 iface ,
304
385
LONG lVolume )
305
386
{
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 ;
308
401
}
309
402
310
403
HRESULT
@@ -313,8 +406,20 @@ PrimaryDirectSoundBuffer8Impl_fnSetPan(
313
406
LPDIRECTSOUNDBUFFER8 iface ,
314
407
LONG lPan )
315
408
{
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 ;
318
423
}
319
424
320
425
HRESULT
@@ -323,8 +428,16 @@ PrimaryDirectSoundBuffer8Impl_fnSetFrequency(
323
428
LPDIRECTSOUNDBUFFER8 iface ,
324
429
DWORD dwFrequency )
325
430
{
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 ;
328
441
}
329
442
330
443
HRESULT
@@ -374,8 +487,6 @@ PrimaryDirectSoundBuffer8Impl_fnUnlock(
374
487
}
375
488
376
489
377
-
378
-
379
490
HRESULT
380
491
WINAPI
381
492
PrimaryDirectSoundBuffer8Impl_fnRestore (
@@ -593,7 +704,10 @@ PrimaryDirectSoundBuffer_SetFormat(
593
704
Result = OpenPin (This -> Filter -> hFilter , PinId , (LPWAVEFORMATEX )pcfxFormat , & This -> hPin , bLooped );
594
705
DPRINT ("PinId %u Result %u\n" , PinId , Result );
595
706
if (Result == ERROR_SUCCESS )
707
+ {
708
+ This -> dwFrequency = pcfxFormat -> nSamplesPerSec ;
596
709
break ;
710
+ }
597
711
598
712
This -> hPin = NULL ;
599
713
DeviceId ++ ;
@@ -635,7 +749,8 @@ HRESULT
635
749
NewPrimarySoundBuffer (
636
750
LPDIRECTSOUNDBUFFER8 * OutBuffer ,
637
751
LPFILTERINFO Filter ,
638
- DWORD dwLevel )
752
+ DWORD dwLevel ,
753
+ DWORD dwFlags )
639
754
{
640
755
LPCDirectSoundBuffer This = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY , sizeof (CDirectSoundBuffer ));
641
756
@@ -649,6 +764,10 @@ NewPrimarySoundBuffer(
649
764
This -> lpVtbl = & vt_DirectSoundBuffer8 ;
650
765
This -> Filter = Filter ;
651
766
This -> dwLevel = dwLevel ;
767
+ This -> dwFlags = dwFlags ;
768
+ This -> dwFrequency = 0 ;
769
+ This -> Volume = DSBVOLUME_MAX ;
770
+ This -> VolumePan = DSBPAN_CENTER ;
652
771
This -> hPin = NULL ;
653
772
654
773
InitializeCriticalSection (& This -> Lock );
0 commit comments