@@ -18,6 +18,9 @@ typedef struct
18
18
LPFILTERINFO Filter ;
19
19
DWORD dwLevel ;
20
20
DWORD dwFlags ;
21
+ DWORD dwFrequency ;
22
+ LONG Volume ;
23
+ LONG VolumePan ;
21
24
LPWAVEFORMATEX Format ;
22
25
PUCHAR Buffer ;
23
26
DWORD BufferSize ;
@@ -139,8 +142,8 @@ HRESULT
139
142
WINAPI
140
143
SecondaryDirectSoundBuffer8Impl_fnGetFormat (
141
144
LPDIRECTSOUNDBUFFER8 iface ,
142
- LPWAVEFORMATEX pwfxFormat ,
143
- DWORD dwSizeAllocated ,
145
+ LPWAVEFORMATEX pwfxFormat ,
146
+ DWORD dwSizeAllocated ,
144
147
LPDWORD pdwSizeWritten )
145
148
{
146
149
DWORD FormatSize ;
@@ -186,8 +189,18 @@ SecondaryDirectSoundBuffer8Impl_fnGetVolume(
186
189
LPDIRECTSOUNDBUFFER8 iface ,
187
190
LPLONG plVolume )
188
191
{
189
- UNIMPLEMENTED
190
- return DSERR_INVALIDPARAM ;
192
+ LPCDirectSoundBuffer This = (LPCDirectSoundBuffer )CONTAINING_RECORD (iface , CDirectSoundBuffer , lpVtbl );
193
+
194
+ if (!plVolume )
195
+ {
196
+ /* invalid parameter */
197
+ return DSERR_INVALIDPARAM ;
198
+ }
199
+
200
+ /* get volume */
201
+ * plVolume = This -> Volume ;
202
+
203
+ return DS_OK ;
191
204
}
192
205
193
206
HRESULT
@@ -196,8 +209,18 @@ SecondaryDirectSoundBuffer8Impl_fnGetPan(
196
209
LPDIRECTSOUNDBUFFER8 iface ,
197
210
LPLONG plPan )
198
211
{
199
- UNIMPLEMENTED
200
- return DSERR_INVALIDPARAM ;
212
+ LPCDirectSoundBuffer This = (LPCDirectSoundBuffer )CONTAINING_RECORD (iface , CDirectSoundBuffer , lpVtbl );
213
+
214
+ if (!plPan )
215
+ {
216
+ /* invalid parameter */
217
+ return DSERR_INVALIDPARAM ;
218
+ }
219
+
220
+ /* get frequency */
221
+ * plPan = This -> VolumePan ;
222
+
223
+ return DS_OK ;
201
224
}
202
225
203
226
HRESULT
@@ -206,8 +229,18 @@ SecondaryDirectSoundBuffer8Impl_fnGetFrequency(
206
229
LPDIRECTSOUNDBUFFER8 iface ,
207
230
LPDWORD pdwFrequency )
208
231
{
209
- UNIMPLEMENTED
210
- return DSERR_INVALIDPARAM ;
232
+ LPCDirectSoundBuffer This = (LPCDirectSoundBuffer )CONTAINING_RECORD (iface , CDirectSoundBuffer , lpVtbl );
233
+
234
+ if (!pdwFrequency )
235
+ {
236
+ /* invalid parameter */
237
+ return DSERR_INVALIDPARAM ;
238
+ }
239
+
240
+ /* get frequency */
241
+ * pdwFrequency = This -> dwFrequency ;
242
+
243
+ return DS_OK ;
211
244
}
212
245
213
246
HRESULT
@@ -243,8 +276,8 @@ SecondaryDirectSoundBuffer8Impl_fnInitialize(
243
276
LPDIRECTSOUND pDirectSound ,
244
277
LPCDSBUFFERDESC pcDSBufferDesc )
245
278
{
246
- UNIMPLEMENTED
247
- return DSERR_INVALIDPARAM ;
279
+ /* RTFM */
280
+ return DSERR_ALREADYINITIALIZED ;
248
281
}
249
282
250
283
HRESULT
@@ -361,6 +394,7 @@ SecondaryDirectSoundBuffer8Impl_fnSetFormat(
361
394
LPDIRECTSOUNDBUFFER8 iface ,
362
395
LPCWAVEFORMATEX pcfxFormat )
363
396
{
397
+ /* RTFM */
364
398
return DSERR_INVALIDCALL ;
365
399
}
366
400
@@ -370,8 +404,19 @@ SecondaryDirectSoundBuffer8Impl_fnSetVolume(
370
404
LPDIRECTSOUNDBUFFER8 iface ,
371
405
LONG lVolume )
372
406
{
373
- UNIMPLEMENTED
374
- return DSERR_INVALIDPARAM ;
407
+ LPCDirectSoundBuffer This = (LPCDirectSoundBuffer )CONTAINING_RECORD (iface , CDirectSoundBuffer , lpVtbl );
408
+
409
+ if (lVolume < DSBVOLUME_MIN || lVolume > DSBVOLUME_MAX )
410
+ {
411
+ /* invalid parameter */
412
+ return DSERR_INVALIDPARAM ;
413
+ }
414
+
415
+
416
+ /* Store volume */
417
+ This -> Volume = lVolume ;
418
+
419
+ return DS_OK ;
375
420
}
376
421
377
422
HRESULT
@@ -380,8 +425,18 @@ SecondaryDirectSoundBuffer8Impl_fnSetPan(
380
425
LPDIRECTSOUNDBUFFER8 iface ,
381
426
LONG lPan )
382
427
{
383
- UNIMPLEMENTED
384
- return DSERR_INVALIDPARAM ;
428
+ LPCDirectSoundBuffer This = (LPCDirectSoundBuffer )CONTAINING_RECORD (iface , CDirectSoundBuffer , lpVtbl );
429
+
430
+ if (lPan < DSBPAN_LEFT || lPan > DSBPAN_RIGHT )
431
+ {
432
+ /* invalid parameter */
433
+ return DSERR_INVALIDPARAM ;
434
+ }
435
+
436
+ /* Store volume pan */
437
+ This -> VolumePan = lPan ;
438
+
439
+ return DS_OK ;
385
440
}
386
441
387
442
HRESULT
@@ -390,8 +445,29 @@ SecondaryDirectSoundBuffer8Impl_fnSetFrequency(
390
445
LPDIRECTSOUNDBUFFER8 iface ,
391
446
DWORD dwFrequency )
392
447
{
393
- UNIMPLEMENTED
394
- return DSERR_INVALIDPARAM ;
448
+ LPCDirectSoundBuffer This = (LPCDirectSoundBuffer )CONTAINING_RECORD (iface , CDirectSoundBuffer , lpVtbl );
449
+
450
+ if (dwFrequency == DSBFREQUENCY_ORIGINAL )
451
+ {
452
+ /* restore original frequency */
453
+ dwFrequency = This -> Format -> nSamplesPerSec ;
454
+ }
455
+
456
+ if (dwFrequency < DSBFREQUENCY_MIN || dwFrequency > DSBFREQUENCY_MAX )
457
+ {
458
+ /* invalid frequency */
459
+ return DSERR_INVALIDPARAM ;
460
+ }
461
+
462
+ if (dwFrequency != This -> dwFrequency )
463
+ {
464
+ /* FIXME handle frequency change */
465
+ }
466
+
467
+ /* store frequency */
468
+ This -> dwFrequency = dwFrequency ;
469
+
470
+ return DS_OK ;
395
471
}
396
472
397
473
HRESULT
@@ -549,7 +625,10 @@ NewSecondarySoundBuffer(
549
625
This -> Filter = Filter ;
550
626
This -> dwLevel = dwLevel ;
551
627
This -> dwFlags = lpcDSBufferDesc -> dwFlags ;
628
+ This -> dwFrequency = lpcDSBufferDesc -> lpwfxFormat -> nSamplesPerSec ;
552
629
This -> State = KSSTATE_STOP ;
630
+ This -> Volume = DSBVOLUME_MAX ;
631
+ This -> VolumePan = DSBPAN_CENTER ;
553
632
This -> Flags = 0 ;
554
633
This -> Position = 0 ;
555
634
This -> BufferSize = lpcDSBufferDesc -> dwBufferBytes ;
0 commit comments