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
);
268 dwBytes
= min(This
->BufferSize
- dwOffset
, dwBytes
);
270 *ppvAudioPtr1
= This
->Buffer
+ dwOffset
;
271 *pdwAudioBytes1
= dwBytes
;
273 *ppvAudioPtr2
= NULL
;
283 SecondaryDirectSoundBuffer8Impl_fnPlay(
284 LPDIRECTSOUNDBUFFER8 iface
,
290 LPCDirectSoundBuffer This
= (LPCDirectSoundBuffer
)CONTAINING_RECORD(iface
, CDirectSoundBuffer
, lpVtbl
);
292 if (dwReserved1
!= 0)
295 return DSERR_INVALIDPARAM
;
299 ASSERT(dwFlags
& DSBPLAY_LOOPING
);
302 hResult
= PrimaryDirectSoundBuffer_SetFormat(This
->PrimaryBuffer
, This
->Format
, TRUE
);
304 if (!SUCCEEDED(hResult
))
307 DPRINT1("Failed to set format Tag %u Samples %u Bytes %u nChannels %u\n", This
->Format
->wFormatTag
, This
->Format
->nSamplesPerSec
, This
->Format
->wBitsPerSample
, This
->Format
->nChannels
);
311 /* start primary buffer */
312 PrimaryDirectSoundBuffer_SetState(This
->PrimaryBuffer
, KSSTATE_RUN
);
313 /* acquire primary buffer */
314 PrimaryDirectSoundBuffer_AcquireLock(This
->PrimaryBuffer
);
315 /* HACK write buffer */
316 PrimaryDirectSoundBuffer_Write(This
->PrimaryBuffer
, This
->Buffer
, This
->BufferSize
);
317 /* release primary buffer */
318 PrimaryDirectSoundBuffer_ReleaseLock(This
->PrimaryBuffer
);
320 DPRINT("SetFormatSuccess PrimaryBuffer %p\n", This
->PrimaryBuffer
);
326 SecondaryDirectSoundBuffer8Impl_fnSetCurrentPosition(
327 LPDIRECTSOUNDBUFFER8 iface
,
330 LPCDirectSoundBuffer This
= (LPCDirectSoundBuffer
)CONTAINING_RECORD(iface
, CDirectSoundBuffer
, lpVtbl
);
332 DPRINT("Setting position %u\n", dwNewPosition
);
333 This
->Position
= dwNewPosition
;
340 SecondaryDirectSoundBuffer8Impl_fnSetFormat(
341 LPDIRECTSOUNDBUFFER8 iface
,
342 LPCWAVEFORMATEX pcfxFormat
)
344 return DSERR_INVALIDCALL
;
349 SecondaryDirectSoundBuffer8Impl_fnSetVolume(
350 LPDIRECTSOUNDBUFFER8 iface
,
354 return DSERR_INVALIDPARAM
;
359 SecondaryDirectSoundBuffer8Impl_fnSetPan(
360 LPDIRECTSOUNDBUFFER8 iface
,
364 return DSERR_INVALIDPARAM
;
369 SecondaryDirectSoundBuffer8Impl_fnSetFrequency(
370 LPDIRECTSOUNDBUFFER8 iface
,
374 return DSERR_INVALIDPARAM
;
379 SecondaryDirectSoundBuffer8Impl_fnStop(
380 LPDIRECTSOUNDBUFFER8 iface
)
382 LPCDirectSoundBuffer This
= (LPCDirectSoundBuffer
)CONTAINING_RECORD(iface
, CDirectSoundBuffer
, lpVtbl
);
384 PrimaryDirectSoundBuffer_SetState(This
->PrimaryBuffer
, KSSTATE_PAUSE
);
385 PrimaryDirectSoundBuffer_SetState(This
->PrimaryBuffer
, KSSTATE_ACQUIRE
);
386 PrimaryDirectSoundBuffer_SetState(This
->PrimaryBuffer
, KSSTATE_STOP
);
394 SecondaryDirectSoundBuffer8Impl_fnUnlock(
395 LPDIRECTSOUNDBUFFER8 iface
,
401 //DPRINT("SecondaryDirectSoundBuffer8Impl_fnUnlock pvAudioPtr1 %p dwAudioBytes1 %u pvAudioPtr2 %p dwAudioBytes2 %u Unimplemented\n");
410 SecondaryDirectSoundBuffer8Impl_fnRestore(
411 LPDIRECTSOUNDBUFFER8 iface
)
414 return DSERR_INVALIDPARAM
;
420 SecondaryDirectSoundBuffer8Impl_fnSetFX(
421 LPDIRECTSOUNDBUFFER8 iface
,
422 DWORD dwEffectsCount
,
423 LPDSEFFECTDESC pDSFXDesc
,
424 LPDWORD pdwResultCodes
)
427 return DSERR_INVALIDPARAM
;
432 SecondaryDirectSoundBuffer8Impl_fnAcquireResources(
433 LPDIRECTSOUNDBUFFER8 iface
,
435 DWORD dwEffectsCount
,
436 LPDWORD pdwResultCodes
)
439 return DSERR_INVALIDPARAM
;
444 SecondaryDirectSoundBuffer8Impl_fnGetObjectInPath(
445 LPDIRECTSOUNDBUFFER8 iface
,
448 REFGUID rguidInterface
,
452 return DSERR_INVALIDPARAM
;
455 static IDirectSoundBuffer8Vtbl vt_DirectSoundBuffer8
=
457 /* IUnknown methods */
458 SecondaryDirectSoundBuffer8Impl_fnQueryInterface
,
459 SecondaryDirectSoundBuffer8Impl_fnAddRef
,
460 SecondaryDirectSoundBuffer8Impl_fnRelease
,
461 /* IDirectSoundBuffer methods */
462 SecondaryDirectSoundBuffer8Impl_fnGetCaps
,
463 SecondaryDirectSoundBuffer8Impl_fnGetCurrentPosition
,
464 SecondaryDirectSoundBuffer8Impl_fnGetFormat
,
465 SecondaryDirectSoundBuffer8Impl_fnGetVolume
,
466 SecondaryDirectSoundBuffer8Impl_fnGetPan
,
467 SecondaryDirectSoundBuffer8Impl_fnGetFrequency
,
468 SecondaryDirectSoundBuffer8Impl_fnGetStatus
,
469 SecondaryDirectSoundBuffer8Impl_fnInitialize
,
470 SecondaryDirectSoundBuffer8Impl_fnLock
,
471 SecondaryDirectSoundBuffer8Impl_fnPlay
,
472 SecondaryDirectSoundBuffer8Impl_fnSetCurrentPosition
,
473 SecondaryDirectSoundBuffer8Impl_fnSetFormat
,
474 SecondaryDirectSoundBuffer8Impl_fnSetVolume
,
475 SecondaryDirectSoundBuffer8Impl_fnSetPan
,
476 SecondaryDirectSoundBuffer8Impl_fnSetFrequency
,
477 SecondaryDirectSoundBuffer8Impl_fnStop
,
478 SecondaryDirectSoundBuffer8Impl_fnUnlock
,
479 SecondaryDirectSoundBuffer8Impl_fnRestore
,
480 /* IDirectSoundBuffer8 methods */
481 SecondaryDirectSoundBuffer8Impl_fnSetFX
,
482 SecondaryDirectSoundBuffer8Impl_fnAcquireResources
,
483 SecondaryDirectSoundBuffer8Impl_fnGetObjectInPath
487 NewSecondarySoundBuffer(
488 LPDIRECTSOUNDBUFFER8
*OutBuffer
,
491 LPCDSBUFFERDESC lpcDSBufferDesc
,
492 LPDIRECTSOUNDBUFFER8 PrimaryBuffer
)
495 LPCDirectSoundBuffer This
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(CDirectSoundBuffer
));
499 /* not enough memory */
500 return DSERR_OUTOFMEMORY
;
503 FormatSize
= sizeof(WAVEFORMATEX
) + lpcDSBufferDesc
->lpwfxFormat
->cbSize
;
505 This
->Format
= HeapAlloc(GetProcessHeap(), 0, FormatSize
);
508 /* not enough memory */
509 HeapFree(GetProcessHeap(), 0, This
);
510 return DSERR_OUTOFMEMORY
;
514 ASSERT(lpcDSBufferDesc
->dwBufferBytes
);
516 /* allocate sound buffer */
517 This
->Buffer
= HeapAlloc(GetProcessHeap(), 0, lpcDSBufferDesc
->dwBufferBytes
);
520 /* not enough memory */
521 HeapFree(GetProcessHeap(), 0, This
->Format
);
522 HeapFree(GetProcessHeap(), 0, This
);
523 return DSERR_OUTOFMEMORY
;
528 This
->lpVtbl
= &vt_DirectSoundBuffer8
;
529 This
->Filter
= Filter
;
530 This
->dwLevel
= dwLevel
;
531 This
->State
= KSSTATE_STOP
;
534 This
->BufferSize
= lpcDSBufferDesc
->dwBufferBytes
;
535 This
->PrimaryBuffer
= PrimaryBuffer
;
537 CopyMemory(This
->Format
, lpcDSBufferDesc
->lpwfxFormat
, FormatSize
);
539 *OutBuffer
= (LPDIRECTSOUNDBUFFER8
)&This
->lpVtbl
;