Skip to content

Commit d1a6561

Browse files
committed
[DSOUND_NEW]
- Implement getting volume, volume pan, and frequency for secondary sound buffer - Semi-stub setting volume, volume pan and frequency for secondary... svn path=/trunk/; revision=45529
1 parent a12bfcf commit d1a6561

File tree

1 file changed

+95
-16
lines changed

1 file changed

+95
-16
lines changed

reactos/dll/directx/dsound_new/secondary.c

Lines changed: 95 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ typedef struct
1818
LPFILTERINFO Filter;
1919
DWORD dwLevel;
2020
DWORD dwFlags;
21+
DWORD dwFrequency;
22+
LONG Volume;
23+
LONG VolumePan;
2124
LPWAVEFORMATEX Format;
2225
PUCHAR Buffer;
2326
DWORD BufferSize;
@@ -139,8 +142,8 @@ HRESULT
139142
WINAPI
140143
SecondaryDirectSoundBuffer8Impl_fnGetFormat(
141144
LPDIRECTSOUNDBUFFER8 iface,
142-
LPWAVEFORMATEX pwfxFormat,
143-
DWORD dwSizeAllocated,
145+
LPWAVEFORMATEX pwfxFormat,
146+
DWORD dwSizeAllocated,
144147
LPDWORD pdwSizeWritten)
145148
{
146149
DWORD FormatSize;
@@ -186,8 +189,18 @@ SecondaryDirectSoundBuffer8Impl_fnGetVolume(
186189
LPDIRECTSOUNDBUFFER8 iface,
187190
LPLONG plVolume)
188191
{
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;
191204
}
192205

193206
HRESULT
@@ -196,8 +209,18 @@ SecondaryDirectSoundBuffer8Impl_fnGetPan(
196209
LPDIRECTSOUNDBUFFER8 iface,
197210
LPLONG plPan)
198211
{
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;
201224
}
202225

203226
HRESULT
@@ -206,8 +229,18 @@ SecondaryDirectSoundBuffer8Impl_fnGetFrequency(
206229
LPDIRECTSOUNDBUFFER8 iface,
207230
LPDWORD pdwFrequency)
208231
{
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;
211244
}
212245

213246
HRESULT
@@ -243,8 +276,8 @@ SecondaryDirectSoundBuffer8Impl_fnInitialize(
243276
LPDIRECTSOUND pDirectSound,
244277
LPCDSBUFFERDESC pcDSBufferDesc)
245278
{
246-
UNIMPLEMENTED
247-
return DSERR_INVALIDPARAM;
279+
/* RTFM */
280+
return DSERR_ALREADYINITIALIZED;
248281
}
249282

250283
HRESULT
@@ -361,6 +394,7 @@ SecondaryDirectSoundBuffer8Impl_fnSetFormat(
361394
LPDIRECTSOUNDBUFFER8 iface,
362395
LPCWAVEFORMATEX pcfxFormat)
363396
{
397+
/* RTFM */
364398
return DSERR_INVALIDCALL;
365399
}
366400

@@ -370,8 +404,19 @@ SecondaryDirectSoundBuffer8Impl_fnSetVolume(
370404
LPDIRECTSOUNDBUFFER8 iface,
371405
LONG lVolume)
372406
{
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;
375420
}
376421

377422
HRESULT
@@ -380,8 +425,18 @@ SecondaryDirectSoundBuffer8Impl_fnSetPan(
380425
LPDIRECTSOUNDBUFFER8 iface,
381426
LONG lPan)
382427
{
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;
385440
}
386441

387442
HRESULT
@@ -390,8 +445,29 @@ SecondaryDirectSoundBuffer8Impl_fnSetFrequency(
390445
LPDIRECTSOUNDBUFFER8 iface,
391446
DWORD dwFrequency)
392447
{
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;
395471
}
396472

397473
HRESULT
@@ -549,7 +625,10 @@ NewSecondarySoundBuffer(
549625
This->Filter = Filter;
550626
This->dwLevel = dwLevel;
551627
This->dwFlags = lpcDSBufferDesc->dwFlags;
628+
This->dwFrequency = lpcDSBufferDesc->lpwfxFormat->nSamplesPerSec;
552629
This->State = KSSTATE_STOP;
630+
This->Volume = DSBVOLUME_MAX;
631+
This->VolumePan = DSBPAN_CENTER;
553632
This->Flags = 0;
554633
This->Position = 0;
555634
This->BufferSize = lpcDSBufferDesc->dwBufferBytes;

0 commit comments

Comments
 (0)