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
;
21 LPWAVEFORMATEX Format
;
29 LPDIRECTSOUNDBUFFER8 PrimaryBuffer
;
32 }CDirectSoundBuffer
, *LPCDirectSoundBuffer
;
36 SecondaryDirectSoundBuffer8Impl_fnQueryInterface(
37 LPDIRECTSOUNDBUFFER8 iface
,
42 LPCDirectSoundBuffer This
= (LPCDirectSoundBuffer
)CONTAINING_RECORD(iface
, CDirectSoundBuffer
, lpVtbl
);
44 if (IsEqualIID(riid
, &IID_IUnknown
) ||
45 IsEqualIID(riid
, &IID_IDirectSoundBuffer
) ||
46 IsEqualIID(riid
, &IID_IDirectSoundBuffer8
))
48 *ppobj
= (LPVOID
)&This
->lpVtbl
;
49 InterlockedIncrement(&This
->ref
);
53 if (SUCCEEDED(StringFromIID(riid
, &pStr
)))
55 DPRINT("No Interface for class %s\n", pStr
);
63 SecondaryDirectSoundBuffer8Impl_fnAddRef(
64 LPDIRECTSOUNDBUFFER8 iface
)
67 LPCDirectSoundBuffer This
= (LPCDirectSoundBuffer
)CONTAINING_RECORD(iface
, CDirectSoundBuffer
, lpVtbl
);
69 ref
= InterlockedIncrement(&This
->ref
);
77 SecondaryDirectSoundBuffer8Impl_fnRelease(
78 LPDIRECTSOUNDBUFFER8 iface
)
81 LPCDirectSoundBuffer This
= (LPCDirectSoundBuffer
)CONTAINING_RECORD(iface
, CDirectSoundBuffer
, lpVtbl
);
83 ref
= InterlockedDecrement(&(This
->ref
));
87 HeapFree(GetProcessHeap(), 0, This
->Buffer
);
88 HeapFree(GetProcessHeap(), 0, This
->Format
);
89 HeapFree(GetProcessHeap(), 0, This
);
97 SecondaryDirectSoundBuffer8Impl_fnGetCaps(
98 LPDIRECTSOUNDBUFFER8 iface
,
99 LPDSBCAPS pDSBufferCaps
)
101 LPCDirectSoundBuffer This
= (LPCDirectSoundBuffer
)CONTAINING_RECORD(iface
, CDirectSoundBuffer
, lpVtbl
);
105 /* invalid parameter */
106 return DSERR_INVALIDPARAM
;
109 if (pDSBufferCaps
->dwSize
< sizeof(DSBCAPS
))
111 /* invalid buffer size */
112 return DSERR_INVALIDPARAM
;
115 /* get buffer details */
116 pDSBufferCaps
->dwUnlockTransferRate
= 0;
117 pDSBufferCaps
->dwPlayCpuOverhead
= 0;
118 pDSBufferCaps
->dwSize
= This
->BufferSize
;
119 pDSBufferCaps
->dwFlags
= This
->dwFlags
;
126 SecondaryDirectSoundBuffer8Impl_fnGetCurrentPosition(
127 LPDIRECTSOUNDBUFFER8 iface
,
128 LPDWORD pdwCurrentPlayCursor
,
129 LPDWORD pdwCurrentWriteCursor
)
131 LPCDirectSoundBuffer This
= (LPCDirectSoundBuffer
)CONTAINING_RECORD(iface
, CDirectSoundBuffer
, lpVtbl
);
133 //DPRINT("SecondaryDirectSoundBuffer8Impl_fnGetCurrentPosition This %p Play %p Write %p\n", This, pdwCurrentPlayCursor, pdwCurrentWriteCursor);
135 return PrimaryDirectSoundBuffer_GetPosition(This
->PrimaryBuffer
, pdwCurrentPlayCursor
, pdwCurrentWriteCursor
);
140 SecondaryDirectSoundBuffer8Impl_fnGetFormat(
141 LPDIRECTSOUNDBUFFER8 iface
,
142 LPWAVEFORMATEX pwfxFormat
,
143 DWORD dwSizeAllocated
,
144 LPDWORD pdwSizeWritten
)
147 LPCDirectSoundBuffer This
= (LPCDirectSoundBuffer
)CONTAINING_RECORD(iface
, CDirectSoundBuffer
, lpVtbl
);
149 FormatSize
= sizeof(WAVEFORMATEX
) + This
->Format
->cbSize
;
151 if (!pwfxFormat
&& !pdwSizeWritten
)
153 /* invalid parameter */
154 return DSERR_INVALIDPARAM
;
159 /* return required format size */
160 *pdwSizeWritten
= FormatSize
;
165 if (dwSizeAllocated
>= FormatSize
)
168 CopyMemory(pwfxFormat
, This
->Format
, FormatSize
);
171 *pdwSizeWritten
= FormatSize
;
175 /* buffer too small */
179 return DSERR_INVALIDPARAM
;
185 SecondaryDirectSoundBuffer8Impl_fnGetVolume(
186 LPDIRECTSOUNDBUFFER8 iface
,
190 return DSERR_INVALIDPARAM
;
195 SecondaryDirectSoundBuffer8Impl_fnGetPan(
196 LPDIRECTSOUNDBUFFER8 iface
,
200 return DSERR_INVALIDPARAM
;
205 SecondaryDirectSoundBuffer8Impl_fnGetFrequency(
206 LPDIRECTSOUNDBUFFER8 iface
,
207 LPDWORD pdwFrequency
)
210 return DSERR_INVALIDPARAM
;
215 SecondaryDirectSoundBuffer8Impl_fnGetStatus(
216 LPDIRECTSOUNDBUFFER8 iface
,
219 LPCDirectSoundBuffer This
= (LPCDirectSoundBuffer
)CONTAINING_RECORD(iface
, CDirectSoundBuffer
, lpVtbl
);
223 /* invalid parameter */
224 return DSERR_INVALIDPARAM
;
228 if (This
->State
== KSSTATE_RUN
|| This
->State
== KSSTATE_ACQUIRE
)
230 /* buffer is playing */
231 *pdwStatus
|= DSBSTATUS_PLAYING
;
232 if (This
->Flags
& DSBPLAY_LOOPING
)
233 *pdwStatus
|= DSBSTATUS_LOOPING
;
241 SecondaryDirectSoundBuffer8Impl_fnInitialize(
242 LPDIRECTSOUNDBUFFER8 iface
,
243 LPDIRECTSOUND pDirectSound
,
244 LPCDSBUFFERDESC pcDSBufferDesc
)
247 return DSERR_INVALIDPARAM
;
252 SecondaryDirectSoundBuffer8Impl_fnLock(
253 LPDIRECTSOUNDBUFFER8 iface
,
256 LPVOID
*ppvAudioPtr1
,
257 LPDWORD pdwAudioBytes1
,
258 LPVOID
*ppvAudioPtr2
,
259 LPDWORD pdwAudioBytes2
,
262 LPCDirectSoundBuffer This
= (LPCDirectSoundBuffer
)CONTAINING_RECORD(iface
, CDirectSoundBuffer
, lpVtbl
);
264 DPRINT("This %p dwOffset %u dwBytes %u ppvAudioPtr1 %p pdwAudioBytes1 %p ppvAudioPtr2 %p pdwAudioBytes2 %p dwFlags %x This->BufferSize %u\n",
265 This
, dwOffset
, dwBytes
, ppvAudioPtr1
, pdwAudioBytes1
, ppvAudioPtr2
, pdwAudioBytes2
, dwFlags
, This
->BufferSize
);
267 if (dwFlags
== DSBLOCK_ENTIREBUFFER
)
269 *ppvAudioPtr1
= (LPVOID
)This
->Buffer
;
270 *pdwAudioBytes1
= This
->BufferSize
;
272 *ppvAudioPtr2
= NULL
;
278 else if (dwFlags
== DSBLOCK_FROMWRITECURSOR
)
281 return DSERR_UNSUPPORTED
;
285 ASSERT(dwOffset
< This
->BufferSize
);
286 ASSERT(dwBytes
<= This
->BufferSize
);
288 dwBytes
= min(This
->BufferSize
- dwOffset
, dwBytes
);
290 *ppvAudioPtr1
= This
->Buffer
+ dwOffset
;
291 *pdwAudioBytes1
= dwBytes
;
293 *ppvAudioPtr2
= NULL
;
303 SecondaryDirectSoundBuffer8Impl_fnPlay(
304 LPDIRECTSOUNDBUFFER8 iface
,
310 LPCDirectSoundBuffer This
= (LPCDirectSoundBuffer
)CONTAINING_RECORD(iface
, CDirectSoundBuffer
, lpVtbl
);
312 if (dwReserved1
!= 0)
315 return DSERR_INVALIDPARAM
;
319 ASSERT(dwFlags
& DSBPLAY_LOOPING
);
322 hResult
= PrimaryDirectSoundBuffer_SetFormat(This
->PrimaryBuffer
, This
->Format
, TRUE
);
324 if (!SUCCEEDED(hResult
))
327 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
);
331 /* start primary buffer */
332 PrimaryDirectSoundBuffer_SetState(This
->PrimaryBuffer
, KSSTATE_RUN
);
333 /* acquire primary buffer */
334 PrimaryDirectSoundBuffer_AcquireLock(This
->PrimaryBuffer
);
335 /* HACK write buffer */
336 PrimaryDirectSoundBuffer_Write(This
->PrimaryBuffer
, This
->Buffer
, This
->BufferSize
);
337 /* release primary buffer */
338 PrimaryDirectSoundBuffer_ReleaseLock(This
->PrimaryBuffer
);
340 DPRINT("SetFormatSuccess PrimaryBuffer %p\n", This
->PrimaryBuffer
);
346 SecondaryDirectSoundBuffer8Impl_fnSetCurrentPosition(
347 LPDIRECTSOUNDBUFFER8 iface
,
350 LPCDirectSoundBuffer This
= (LPCDirectSoundBuffer
)CONTAINING_RECORD(iface
, CDirectSoundBuffer
, lpVtbl
);
352 DPRINT("Setting position %u\n", dwNewPosition
);
353 This
->Position
= dwNewPosition
;
360 SecondaryDirectSoundBuffer8Impl_fnSetFormat(
361 LPDIRECTSOUNDBUFFER8 iface
,
362 LPCWAVEFORMATEX pcfxFormat
)
364 return DSERR_INVALIDCALL
;
369 SecondaryDirectSoundBuffer8Impl_fnSetVolume(
370 LPDIRECTSOUNDBUFFER8 iface
,
374 return DSERR_INVALIDPARAM
;
379 SecondaryDirectSoundBuffer8Impl_fnSetPan(
380 LPDIRECTSOUNDBUFFER8 iface
,
384 return DSERR_INVALIDPARAM
;
389 SecondaryDirectSoundBuffer8Impl_fnSetFrequency(
390 LPDIRECTSOUNDBUFFER8 iface
,
394 return DSERR_INVALIDPARAM
;
399 SecondaryDirectSoundBuffer8Impl_fnStop(
400 LPDIRECTSOUNDBUFFER8 iface
)
402 LPCDirectSoundBuffer This
= (LPCDirectSoundBuffer
)CONTAINING_RECORD(iface
, CDirectSoundBuffer
, lpVtbl
);
404 PrimaryDirectSoundBuffer_SetState(This
->PrimaryBuffer
, KSSTATE_PAUSE
);
405 PrimaryDirectSoundBuffer_SetState(This
->PrimaryBuffer
, KSSTATE_ACQUIRE
);
406 PrimaryDirectSoundBuffer_SetState(This
->PrimaryBuffer
, KSSTATE_STOP
);
414 SecondaryDirectSoundBuffer8Impl_fnUnlock(
415 LPDIRECTSOUNDBUFFER8 iface
,
421 //DPRINT("SecondaryDirectSoundBuffer8Impl_fnUnlock pvAudioPtr1 %p dwAudioBytes1 %u pvAudioPtr2 %p dwAudioBytes2 %u Unimplemented\n");
430 SecondaryDirectSoundBuffer8Impl_fnRestore(
431 LPDIRECTSOUNDBUFFER8 iface
)
434 return DSERR_INVALIDPARAM
;
440 SecondaryDirectSoundBuffer8Impl_fnSetFX(
441 LPDIRECTSOUNDBUFFER8 iface
,
442 DWORD dwEffectsCount
,
443 LPDSEFFECTDESC pDSFXDesc
,
444 LPDWORD pdwResultCodes
)
447 return DSERR_INVALIDPARAM
;
452 SecondaryDirectSoundBuffer8Impl_fnAcquireResources(
453 LPDIRECTSOUNDBUFFER8 iface
,
455 DWORD dwEffectsCount
,
456 LPDWORD pdwResultCodes
)
459 return DSERR_INVALIDPARAM
;
464 SecondaryDirectSoundBuffer8Impl_fnGetObjectInPath(
465 LPDIRECTSOUNDBUFFER8 iface
,
468 REFGUID rguidInterface
,
472 return DSERR_INVALIDPARAM
;
475 static IDirectSoundBuffer8Vtbl vt_DirectSoundBuffer8
=
477 /* IUnknown methods */
478 SecondaryDirectSoundBuffer8Impl_fnQueryInterface
,
479 SecondaryDirectSoundBuffer8Impl_fnAddRef
,
480 SecondaryDirectSoundBuffer8Impl_fnRelease
,
481 /* IDirectSoundBuffer methods */
482 SecondaryDirectSoundBuffer8Impl_fnGetCaps
,
483 SecondaryDirectSoundBuffer8Impl_fnGetCurrentPosition
,
484 SecondaryDirectSoundBuffer8Impl_fnGetFormat
,
485 SecondaryDirectSoundBuffer8Impl_fnGetVolume
,
486 SecondaryDirectSoundBuffer8Impl_fnGetPan
,
487 SecondaryDirectSoundBuffer8Impl_fnGetFrequency
,
488 SecondaryDirectSoundBuffer8Impl_fnGetStatus
,
489 SecondaryDirectSoundBuffer8Impl_fnInitialize
,
490 SecondaryDirectSoundBuffer8Impl_fnLock
,
491 SecondaryDirectSoundBuffer8Impl_fnPlay
,
492 SecondaryDirectSoundBuffer8Impl_fnSetCurrentPosition
,
493 SecondaryDirectSoundBuffer8Impl_fnSetFormat
,
494 SecondaryDirectSoundBuffer8Impl_fnSetVolume
,
495 SecondaryDirectSoundBuffer8Impl_fnSetPan
,
496 SecondaryDirectSoundBuffer8Impl_fnSetFrequency
,
497 SecondaryDirectSoundBuffer8Impl_fnStop
,
498 SecondaryDirectSoundBuffer8Impl_fnUnlock
,
499 SecondaryDirectSoundBuffer8Impl_fnRestore
,
500 /* IDirectSoundBuffer8 methods */
501 SecondaryDirectSoundBuffer8Impl_fnSetFX
,
502 SecondaryDirectSoundBuffer8Impl_fnAcquireResources
,
503 SecondaryDirectSoundBuffer8Impl_fnGetObjectInPath
507 NewSecondarySoundBuffer(
508 LPDIRECTSOUNDBUFFER8
*OutBuffer
,
511 LPCDSBUFFERDESC lpcDSBufferDesc
,
512 LPDIRECTSOUNDBUFFER8 PrimaryBuffer
)
515 LPCDirectSoundBuffer This
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(CDirectSoundBuffer
));
519 /* not enough memory */
520 return DSERR_OUTOFMEMORY
;
523 FormatSize
= sizeof(WAVEFORMATEX
) + lpcDSBufferDesc
->lpwfxFormat
->cbSize
;
525 This
->Format
= HeapAlloc(GetProcessHeap(), 0, FormatSize
);
528 /* not enough memory */
529 HeapFree(GetProcessHeap(), 0, This
);
530 return DSERR_OUTOFMEMORY
;
534 ASSERT(lpcDSBufferDesc
->dwBufferBytes
);
536 /* allocate sound buffer */
537 This
->Buffer
= HeapAlloc(GetProcessHeap(), 0, lpcDSBufferDesc
->dwBufferBytes
);
540 /* not enough memory */
541 HeapFree(GetProcessHeap(), 0, This
->Format
);
542 HeapFree(GetProcessHeap(), 0, This
);
543 return DSERR_OUTOFMEMORY
;
548 This
->lpVtbl
= &vt_DirectSoundBuffer8
;
549 This
->Filter
= Filter
;
550 This
->dwLevel
= dwLevel
;
551 This
->dwFlags
= lpcDSBufferDesc
->dwFlags
;
552 This
->State
= KSSTATE_STOP
;
555 This
->BufferSize
= lpcDSBufferDesc
->dwBufferBytes
;
556 This
->PrimaryBuffer
= PrimaryBuffer
;
558 CopyMemory(This
->Format
, lpcDSBufferDesc
->lpwfxFormat
, FormatSize
);
560 *OutBuffer
= (LPDIRECTSOUNDBUFFER8
)&This
->lpVtbl
;