2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Configuration of network devices
4 * FILE: dll/directx/dsound_new/secondary.c
5 * PURPOSE: Secondary IDirectSoundBuffer8 implementation
7 * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
15 const IDirectSoundBuffer8Vtbl
*lpVtbl
;
20 LPWAVEFORMATEX Format
;
28 LPDIRECTSOUNDBUFFER8 PrimaryBuffer
;
31 }CDirectSoundBuffer
, *LPCDirectSoundBuffer
;
35 SecondaryDirectSoundBuffer8Impl_fnQueryInterface(
36 LPDIRECTSOUNDBUFFER8 iface
,
41 LPCDirectSoundBuffer This
= (LPCDirectSoundBuffer
)CONTAINING_RECORD(iface
, CDirectSoundBuffer
, lpVtbl
);
43 if (IsEqualIID(riid
, &IID_IUnknown
) ||
44 IsEqualIID(riid
, &IID_IDirectSoundBuffer
) ||
45 IsEqualIID(riid
, &IID_IDirectSoundBuffer8
))
47 *ppobj
= (LPVOID
)&This
->lpVtbl
;
48 InterlockedIncrement(&This
->ref
);
52 if (SUCCEEDED(StringFromIID(riid
, &pStr
)))
54 DPRINT("No Interface for class %s\n", pStr
);
62 SecondaryDirectSoundBuffer8Impl_fnAddRef(
63 LPDIRECTSOUNDBUFFER8 iface
)
66 LPCDirectSoundBuffer This
= (LPCDirectSoundBuffer
)CONTAINING_RECORD(iface
, CDirectSoundBuffer
, lpVtbl
);
68 ref
= InterlockedIncrement(&This
->ref
);
76 SecondaryDirectSoundBuffer8Impl_fnRelease(
77 LPDIRECTSOUNDBUFFER8 iface
)
80 LPCDirectSoundBuffer This
= (LPCDirectSoundBuffer
)CONTAINING_RECORD(iface
, CDirectSoundBuffer
, lpVtbl
);
82 ref
= InterlockedDecrement(&(This
->ref
));
86 HeapFree(GetProcessHeap(), 0, This
->Buffer
);
87 HeapFree(GetProcessHeap(), 0, This
->Format
);
88 HeapFree(GetProcessHeap(), 0, This
);
96 SecondaryDirectSoundBuffer8Impl_fnGetCaps(
97 LPDIRECTSOUNDBUFFER8 iface
,
98 LPDSBCAPS pDSBufferCaps
)
101 return DSERR_INVALIDPARAM
;
106 SecondaryDirectSoundBuffer8Impl_fnGetCurrentPosition(
107 LPDIRECTSOUNDBUFFER8 iface
,
108 LPDWORD pdwCurrentPlayCursor
,
109 LPDWORD pdwCurrentWriteCursor
)
111 LPCDirectSoundBuffer This
= (LPCDirectSoundBuffer
)CONTAINING_RECORD(iface
, CDirectSoundBuffer
, lpVtbl
);
113 //DPRINT("SecondaryDirectSoundBuffer8Impl_fnGetCurrentPosition This %p Play %p Write %p\n", This, pdwCurrentPlayCursor, pdwCurrentWriteCursor);
115 return PrimaryDirectSoundBuffer_GetPosition(This
->PrimaryBuffer
, pdwCurrentPlayCursor
, pdwCurrentWriteCursor
);
120 SecondaryDirectSoundBuffer8Impl_fnGetFormat(
121 LPDIRECTSOUNDBUFFER8 iface
,
122 LPWAVEFORMATEX pwfxFormat
,
123 DWORD dwSizeAllocated
,
124 LPDWORD pdwSizeWritten
)
127 LPCDirectSoundBuffer This
= (LPCDirectSoundBuffer
)CONTAINING_RECORD(iface
, CDirectSoundBuffer
, lpVtbl
);
129 FormatSize
= sizeof(WAVEFORMATEX
) + This
->Format
->cbSize
;
131 if (!pwfxFormat
&& !pdwSizeWritten
)
133 /* invalid parameter */
134 return DSERR_INVALIDPARAM
;
139 /* return required format size */
140 *pdwSizeWritten
= FormatSize
;
145 if (dwSizeAllocated
>= FormatSize
)
148 CopyMemory(pwfxFormat
, This
->Format
, FormatSize
);
151 *pdwSizeWritten
= FormatSize
;
155 /* buffer too small */
159 return DSERR_INVALIDPARAM
;
165 SecondaryDirectSoundBuffer8Impl_fnGetVolume(
166 LPDIRECTSOUNDBUFFER8 iface
,
170 return DSERR_INVALIDPARAM
;
175 SecondaryDirectSoundBuffer8Impl_fnGetPan(
176 LPDIRECTSOUNDBUFFER8 iface
,
180 return DSERR_INVALIDPARAM
;
185 SecondaryDirectSoundBuffer8Impl_fnGetFrequency(
186 LPDIRECTSOUNDBUFFER8 iface
,
187 LPDWORD pdwFrequency
)
190 return DSERR_INVALIDPARAM
;
195 SecondaryDirectSoundBuffer8Impl_fnGetStatus(
196 LPDIRECTSOUNDBUFFER8 iface
,
199 LPCDirectSoundBuffer This
= (LPCDirectSoundBuffer
)CONTAINING_RECORD(iface
, CDirectSoundBuffer
, lpVtbl
);
203 /* invalid parameter */
204 return DSERR_INVALIDPARAM
;
208 if (This
->State
== KSSTATE_RUN
|| This
->State
== KSSTATE_ACQUIRE
)
210 /* buffer is playing */
211 *pdwStatus
|= DSBSTATUS_PLAYING
;
212 if (This
->Flags
& DSBPLAY_LOOPING
)
213 *pdwStatus
|= DSBSTATUS_LOOPING
;
221 SecondaryDirectSoundBuffer8Impl_fnInitialize(
222 LPDIRECTSOUNDBUFFER8 iface
,
223 LPDIRECTSOUND pDirectSound
,
224 LPCDSBUFFERDESC pcDSBufferDesc
)
227 return DSERR_INVALIDPARAM
;
232 SecondaryDirectSoundBuffer8Impl_fnLock(
233 LPDIRECTSOUNDBUFFER8 iface
,
236 LPVOID
*ppvAudioPtr1
,
237 LPDWORD pdwAudioBytes1
,
238 LPVOID
*ppvAudioPtr2
,
239 LPDWORD pdwAudioBytes2
,
242 LPCDirectSoundBuffer This
= (LPCDirectSoundBuffer
)CONTAINING_RECORD(iface
, CDirectSoundBuffer
, lpVtbl
);
244 DPRINT("This %p dwOffset %u dwBytes %u ppvAudioPtr1 %p pdwAudioBytes1 %p ppvAudioPtr2 %p pdwAudioBytes2 %p dwFlags %x This->BufferSize %u\n",
245 This
, dwOffset
, dwBytes
, ppvAudioPtr1
, pdwAudioBytes1
, ppvAudioPtr2
, pdwAudioBytes2
, dwFlags
, This
->BufferSize
);
247 if (dwFlags
== DSBLOCK_ENTIREBUFFER
)
249 *ppvAudioPtr1
= (LPVOID
)This
->Buffer
;
250 *pdwAudioBytes1
= This
->BufferSize
;
252 *ppvAudioPtr2
= NULL
;
258 else if (dwFlags
& DSBLOCK_FROMWRITECURSOR
)
261 return DSERR_UNSUPPORTED
;
265 ASSERT(dwOffset
< This
->BufferSize
);
266 ASSERT(dwBytes
< This
->BufferSize
);
267 ASSERT(dwBytes
+ dwOffset
<= This
->BufferSize
);
269 *ppvAudioPtr1
= This
->Buffer
+ dwOffset
;
270 *pdwAudioBytes1
= dwBytes
;
272 *ppvAudioPtr2
= NULL
;
282 SecondaryDirectSoundBuffer8Impl_fnPlay(
283 LPDIRECTSOUNDBUFFER8 iface
,
289 LPCDirectSoundBuffer This
= (LPCDirectSoundBuffer
)CONTAINING_RECORD(iface
, CDirectSoundBuffer
, lpVtbl
);
291 if (dwReserved1
!= 0)
294 return DSERR_INVALIDPARAM
;
297 DPRINT("SecondaryDirectSoundBuffer8Impl_fnPlay dwPriority %x dwFlags %x\n", dwPriority
, dwFlags
);
298 hResult
= PrimaryDirectSoundBuffer_SetFormat(This
->PrimaryBuffer
, This
->Format
, (dwFlags
& DSBPLAY_LOOPING
));
300 DPRINT("Result %x\n", hResult
);
301 if (!SUCCEEDED(hResult
))
307 PrimaryDirectSoundBuffer_SetState(This
->PrimaryBuffer
, KSSTATE_RUN
);
310 PrimaryDirectSoundBuffer_AcquireLock(This
->PrimaryBuffer
);
312 PrimaryDirectSoundBuffer_Write(This
->PrimaryBuffer
, This
->Buffer
, This
->BufferSize
);
314 PrimaryDirectSoundBuffer_ReleaseLock(This
->PrimaryBuffer
);
321 SecondaryDirectSoundBuffer8Impl_fnSetCurrentPosition(
322 LPDIRECTSOUNDBUFFER8 iface
,
325 LPCDirectSoundBuffer This
= (LPCDirectSoundBuffer
)CONTAINING_RECORD(iface
, CDirectSoundBuffer
, lpVtbl
);
327 DPRINT("Setting position %u\n", dwNewPosition
);
328 This
->Position
= dwNewPosition
;
335 SecondaryDirectSoundBuffer8Impl_fnSetFormat(
336 LPDIRECTSOUNDBUFFER8 iface
,
337 LPCWAVEFORMATEX pcfxFormat
)
339 return DSERR_INVALIDCALL
;
344 SecondaryDirectSoundBuffer8Impl_fnSetVolume(
345 LPDIRECTSOUNDBUFFER8 iface
,
349 return DSERR_INVALIDPARAM
;
354 SecondaryDirectSoundBuffer8Impl_fnSetPan(
355 LPDIRECTSOUNDBUFFER8 iface
,
359 return DSERR_INVALIDPARAM
;
364 SecondaryDirectSoundBuffer8Impl_fnSetFrequency(
365 LPDIRECTSOUNDBUFFER8 iface
,
369 return DSERR_INVALIDPARAM
;
374 SecondaryDirectSoundBuffer8Impl_fnStop(
375 LPDIRECTSOUNDBUFFER8 iface
)
377 LPCDirectSoundBuffer This
= (LPCDirectSoundBuffer
)CONTAINING_RECORD(iface
, CDirectSoundBuffer
, lpVtbl
);
379 PrimaryDirectSoundBuffer_SetState(This
->PrimaryBuffer
, KSSTATE_PAUSE
);
380 PrimaryDirectSoundBuffer_SetState(This
->PrimaryBuffer
, KSSTATE_ACQUIRE
);
381 PrimaryDirectSoundBuffer_SetState(This
->PrimaryBuffer
, KSSTATE_STOP
);
389 SecondaryDirectSoundBuffer8Impl_fnUnlock(
390 LPDIRECTSOUNDBUFFER8 iface
,
396 //DPRINT("SecondaryDirectSoundBuffer8Impl_fnUnlock pvAudioPtr1 %p dwAudioBytes1 %u pvAudioPtr2 %p dwAudioBytes2 %u Unimplemented\n");
405 SecondaryDirectSoundBuffer8Impl_fnRestore(
406 LPDIRECTSOUNDBUFFER8 iface
)
409 return DSERR_INVALIDPARAM
;
415 SecondaryDirectSoundBuffer8Impl_fnSetFX(
416 LPDIRECTSOUNDBUFFER8 iface
,
417 DWORD dwEffectsCount
,
418 LPDSEFFECTDESC pDSFXDesc
,
419 LPDWORD pdwResultCodes
)
422 return DSERR_INVALIDPARAM
;
427 SecondaryDirectSoundBuffer8Impl_fnAcquireResources(
428 LPDIRECTSOUNDBUFFER8 iface
,
430 DWORD dwEffectsCount
,
431 LPDWORD pdwResultCodes
)
434 return DSERR_INVALIDPARAM
;
439 SecondaryDirectSoundBuffer8Impl_fnGetObjectInPath(
440 LPDIRECTSOUNDBUFFER8 iface
,
443 REFGUID rguidInterface
,
447 return DSERR_INVALIDPARAM
;
450 static IDirectSoundBuffer8Vtbl vt_DirectSoundBuffer8
=
452 /* IUnknown methods */
453 SecondaryDirectSoundBuffer8Impl_fnQueryInterface
,
454 SecondaryDirectSoundBuffer8Impl_fnAddRef
,
455 SecondaryDirectSoundBuffer8Impl_fnRelease
,
456 /* IDirectSoundBuffer methods */
457 SecondaryDirectSoundBuffer8Impl_fnGetCaps
,
458 SecondaryDirectSoundBuffer8Impl_fnGetCurrentPosition
,
459 SecondaryDirectSoundBuffer8Impl_fnGetFormat
,
460 SecondaryDirectSoundBuffer8Impl_fnGetVolume
,
461 SecondaryDirectSoundBuffer8Impl_fnGetPan
,
462 SecondaryDirectSoundBuffer8Impl_fnGetFrequency
,
463 SecondaryDirectSoundBuffer8Impl_fnGetStatus
,
464 SecondaryDirectSoundBuffer8Impl_fnInitialize
,
465 SecondaryDirectSoundBuffer8Impl_fnLock
,
466 SecondaryDirectSoundBuffer8Impl_fnPlay
,
467 SecondaryDirectSoundBuffer8Impl_fnSetCurrentPosition
,
468 SecondaryDirectSoundBuffer8Impl_fnSetFormat
,
469 SecondaryDirectSoundBuffer8Impl_fnSetVolume
,
470 SecondaryDirectSoundBuffer8Impl_fnSetPan
,
471 SecondaryDirectSoundBuffer8Impl_fnSetFrequency
,
472 SecondaryDirectSoundBuffer8Impl_fnStop
,
473 SecondaryDirectSoundBuffer8Impl_fnUnlock
,
474 SecondaryDirectSoundBuffer8Impl_fnRestore
,
475 /* IDirectSoundBuffer8 methods */
476 SecondaryDirectSoundBuffer8Impl_fnSetFX
,
477 SecondaryDirectSoundBuffer8Impl_fnAcquireResources
,
478 SecondaryDirectSoundBuffer8Impl_fnGetObjectInPath
482 NewSecondarySoundBuffer(
483 LPDIRECTSOUNDBUFFER8
*OutBuffer
,
486 LPCDSBUFFERDESC lpcDSBufferDesc
,
487 LPDIRECTSOUNDBUFFER8 PrimaryBuffer
)
490 LPCDirectSoundBuffer This
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(CDirectSoundBuffer
));
494 /* not enough memory */
495 return DSERR_OUTOFMEMORY
;
498 FormatSize
= sizeof(WAVEFORMATEX
) + lpcDSBufferDesc
->lpwfxFormat
->cbSize
;
500 This
->Format
= HeapAlloc(GetProcessHeap(), 0, FormatSize
);
503 /* not enough memory */
504 HeapFree(GetProcessHeap(), 0, This
);
505 return DSERR_OUTOFMEMORY
;
509 ASSERT(lpcDSBufferDesc
->dwBufferBytes
);
511 /* allocate sound buffer */
512 This
->Buffer
= HeapAlloc(GetProcessHeap(), 0, lpcDSBufferDesc
->dwBufferBytes
);
515 /* not enough memory */
516 HeapFree(GetProcessHeap(), 0, This
->Format
);
517 HeapFree(GetProcessHeap(), 0, This
);
518 return DSERR_OUTOFMEMORY
;
523 This
->lpVtbl
= &vt_DirectSoundBuffer8
;
524 This
->Filter
= Filter
;
525 This
->dwLevel
= dwLevel
;
526 This
->State
= KSSTATE_STOP
;
529 This
->BufferSize
= lpcDSBufferDesc
->dwBufferBytes
;
530 This
->PrimaryBuffer
= PrimaryBuffer
;
532 CopyMemory(This
->Format
, lpcDSBufferDesc
->lpwfxFormat
, FormatSize
);
534 *OutBuffer
= (LPDIRECTSOUNDBUFFER8
)&This
->lpVtbl
;