Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygensecondary.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS Configuration of network devices 00004 * FILE: dll/directx/dsound_new/secondary.c 00005 * PURPOSE: Secondary IDirectSoundBuffer8 implementation 00006 * 00007 * PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org) 00008 */ 00009 00010 00011 #include "precomp.h" 00012 00013 typedef struct 00014 { 00015 const IDirectSoundBuffer8Vtbl *lpVtbl; 00016 LONG ref; 00017 00018 LPFILTERINFO Filter; 00019 DWORD dwLevel; 00020 DWORD dwFlags; 00021 DWORD dwFrequency; 00022 DWORD BufferPosition; 00023 LONG Volume; 00024 LONG VolumePan; 00025 LPWAVEFORMATEX Format; 00026 PUCHAR Buffer; 00027 DWORD BufferSize; 00028 KSSTATE State; 00029 DWORD Flags; 00030 DWORD Position; 00031 DWORD PlayPosition; 00032 00033 LPDIRECTSOUNDBUFFER8 PrimaryBuffer; 00034 00035 00036 }CDirectSoundBuffer, *LPCDirectSoundBuffer; 00037 00038 HRESULT 00039 WINAPI 00040 SecondaryDirectSoundBuffer8Impl_fnQueryInterface( 00041 LPDIRECTSOUNDBUFFER8 iface, 00042 IN REFIID riid, 00043 LPVOID* ppobj) 00044 { 00045 LPOLESTR pStr; 00046 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00047 00048 if (IsEqualIID(riid, &IID_IUnknown) || 00049 IsEqualIID(riid, &IID_IDirectSoundBuffer) || 00050 IsEqualIID(riid, &IID_IDirectSoundBuffer8)) 00051 { 00052 *ppobj = (LPVOID)&This->lpVtbl; 00053 InterlockedIncrement(&This->ref); 00054 return S_OK; 00055 } 00056 00057 if (SUCCEEDED(StringFromIID(riid, &pStr))) 00058 { 00059 DPRINT("No Interface for class %s\n", pStr); 00060 CoTaskMemFree(pStr); 00061 } 00062 return E_NOINTERFACE; 00063 } 00064 00065 ULONG 00066 WINAPI 00067 SecondaryDirectSoundBuffer8Impl_fnAddRef( 00068 LPDIRECTSOUNDBUFFER8 iface) 00069 { 00070 ULONG ref; 00071 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00072 00073 ref = InterlockedIncrement(&This->ref); 00074 00075 return ref; 00076 00077 } 00078 00079 ULONG 00080 WINAPI 00081 SecondaryDirectSoundBuffer8Impl_fnRelease( 00082 LPDIRECTSOUNDBUFFER8 iface) 00083 { 00084 ULONG ref; 00085 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00086 00087 ref = InterlockedDecrement(&(This->ref)); 00088 00089 if (!ref) 00090 { 00091 HeapFree(GetProcessHeap(), 0, This->Buffer); 00092 HeapFree(GetProcessHeap(), 0, This->Format); 00093 HeapFree(GetProcessHeap(), 0, This); 00094 } 00095 00096 return ref; 00097 } 00098 00099 HRESULT 00100 WINAPI 00101 SecondaryDirectSoundBuffer8Impl_fnGetCaps( 00102 LPDIRECTSOUNDBUFFER8 iface, 00103 LPDSBCAPS pDSBufferCaps) 00104 { 00105 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00106 00107 if (!pDSBufferCaps) 00108 { 00109 /* invalid parameter */ 00110 return DSERR_INVALIDPARAM; 00111 } 00112 00113 if (pDSBufferCaps->dwSize < sizeof(DSBCAPS)) 00114 { 00115 /* invalid buffer size */ 00116 return DSERR_INVALIDPARAM; 00117 } 00118 00119 /* get buffer details */ 00120 pDSBufferCaps->dwUnlockTransferRate = 0; 00121 pDSBufferCaps->dwPlayCpuOverhead = 0; 00122 pDSBufferCaps->dwSize = This->BufferSize; 00123 pDSBufferCaps->dwFlags = This->dwFlags; 00124 00125 return DS_OK; 00126 } 00127 00128 HRESULT 00129 WINAPI 00130 SecondaryDirectSoundBuffer8Impl_fnGetCurrentPosition( 00131 LPDIRECTSOUNDBUFFER8 iface, 00132 LPDWORD pdwCurrentPlayCursor, 00133 LPDWORD pdwCurrentWriteCursor) 00134 { 00135 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00136 00137 //DPRINT("SecondaryDirectSoundBuffer8Impl_fnGetCurrentPosition This %p Play %p Write %p\n", This, pdwCurrentPlayCursor, pdwCurrentWriteCursor); 00138 00139 if (pdwCurrentWriteCursor) 00140 { 00141 *pdwCurrentWriteCursor = This->BufferPosition; 00142 } 00143 00144 return PrimaryDirectSoundBuffer_GetPosition(This->PrimaryBuffer, pdwCurrentPlayCursor, NULL); 00145 } 00146 00147 HRESULT 00148 WINAPI 00149 SecondaryDirectSoundBuffer8Impl_fnGetFormat( 00150 LPDIRECTSOUNDBUFFER8 iface, 00151 LPWAVEFORMATEX pwfxFormat, 00152 DWORD dwSizeAllocated, 00153 LPDWORD pdwSizeWritten) 00154 { 00155 DWORD FormatSize; 00156 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00157 00158 FormatSize = sizeof(WAVEFORMATEX) + This->Format->cbSize; 00159 00160 if (!pwfxFormat && !pdwSizeWritten) 00161 { 00162 /* invalid parameter */ 00163 return DSERR_INVALIDPARAM; 00164 } 00165 00166 if (!pwfxFormat) 00167 { 00168 /* return required format size */ 00169 *pdwSizeWritten = FormatSize; 00170 return DS_OK; 00171 } 00172 else 00173 { 00174 if (dwSizeAllocated >= FormatSize) 00175 { 00176 /* copy format */ 00177 CopyMemory(pwfxFormat, This->Format, FormatSize); 00178 00179 if (pdwSizeWritten) 00180 *pdwSizeWritten = FormatSize; 00181 00182 return DS_OK; 00183 } 00184 /* buffer too small */ 00185 if (pdwSizeWritten) 00186 *pdwSizeWritten = 0; 00187 00188 return DSERR_INVALIDPARAM; 00189 } 00190 } 00191 00192 HRESULT 00193 WINAPI 00194 SecondaryDirectSoundBuffer8Impl_fnGetVolume( 00195 LPDIRECTSOUNDBUFFER8 iface, 00196 LPLONG plVolume) 00197 { 00198 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00199 00200 if (!plVolume) 00201 { 00202 /* invalid parameter */ 00203 return DSERR_INVALIDPARAM; 00204 } 00205 00206 /* get volume */ 00207 *plVolume = This->Volume; 00208 00209 return DS_OK; 00210 } 00211 00212 HRESULT 00213 WINAPI 00214 SecondaryDirectSoundBuffer8Impl_fnGetPan( 00215 LPDIRECTSOUNDBUFFER8 iface, 00216 LPLONG plPan) 00217 { 00218 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00219 00220 if (!plPan) 00221 { 00222 /* invalid parameter */ 00223 return DSERR_INVALIDPARAM; 00224 } 00225 00226 /* get frequency */ 00227 *plPan = This->VolumePan; 00228 00229 return DS_OK; 00230 } 00231 00232 HRESULT 00233 WINAPI 00234 SecondaryDirectSoundBuffer8Impl_fnGetFrequency( 00235 LPDIRECTSOUNDBUFFER8 iface, 00236 LPDWORD pdwFrequency) 00237 { 00238 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00239 00240 if (!pdwFrequency) 00241 { 00242 /* invalid parameter */ 00243 return DSERR_INVALIDPARAM; 00244 } 00245 00246 /* get frequency */ 00247 *pdwFrequency = This->dwFrequency; 00248 00249 return DS_OK; 00250 } 00251 00252 HRESULT 00253 WINAPI 00254 SecondaryDirectSoundBuffer8Impl_fnGetStatus( 00255 LPDIRECTSOUNDBUFFER8 iface, 00256 LPDWORD pdwStatus) 00257 { 00258 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00259 00260 if (!pdwStatus) 00261 { 00262 /* invalid parameter */ 00263 return DSERR_INVALIDPARAM; 00264 } 00265 00266 *pdwStatus = 0; 00267 if (This->State == KSSTATE_RUN || This->State == KSSTATE_ACQUIRE) 00268 { 00269 /* buffer is playing */ 00270 *pdwStatus |= DSBSTATUS_PLAYING; 00271 if (This->Flags & DSBPLAY_LOOPING) 00272 *pdwStatus |= DSBSTATUS_LOOPING; 00273 } 00274 00275 return DS_OK; 00276 } 00277 00278 HRESULT 00279 WINAPI 00280 SecondaryDirectSoundBuffer8Impl_fnInitialize( 00281 LPDIRECTSOUNDBUFFER8 iface, 00282 LPDIRECTSOUND pDirectSound, 00283 LPCDSBUFFERDESC pcDSBufferDesc) 00284 { 00285 /* RTFM */ 00286 return DSERR_ALREADYINITIALIZED; 00287 } 00288 00289 HRESULT 00290 WINAPI 00291 SecondaryDirectSoundBuffer8Impl_fnLock( 00292 LPDIRECTSOUNDBUFFER8 iface, 00293 DWORD dwOffset, 00294 DWORD dwBytes, 00295 LPVOID *ppvAudioPtr1, 00296 LPDWORD pdwAudioBytes1, 00297 LPVOID *ppvAudioPtr2, 00298 LPDWORD pdwAudioBytes2, 00299 DWORD dwFlags) 00300 { 00301 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00302 00303 DPRINT("This %p dwOffset %u dwBytes %u ppvAudioPtr1 %p pdwAudioBytes1 %p ppvAudioPtr2 %p pdwAudioBytes2 %p dwFlags %x This->BufferSize %u\n", 00304 This, dwOffset, dwBytes, ppvAudioPtr1, pdwAudioBytes1, ppvAudioPtr2, pdwAudioBytes2, dwFlags, This->BufferSize); 00305 00306 if (dwFlags == DSBLOCK_ENTIREBUFFER) 00307 { 00308 *ppvAudioPtr1 = (LPVOID)This->Buffer; 00309 *pdwAudioBytes1 = This->BufferSize; 00310 if (ppvAudioPtr2) 00311 *ppvAudioPtr2 = NULL; 00312 if (pdwAudioBytes2) 00313 *pdwAudioBytes2 = 0; 00314 00315 return DS_OK; 00316 } 00317 else if (dwFlags == DSBLOCK_FROMWRITECURSOR) 00318 { 00319 UNIMPLEMENTED 00320 return DSERR_UNSUPPORTED; 00321 } 00322 else 00323 { 00324 ASSERT(dwOffset < This->BufferSize); 00325 ASSERT(dwBytes <= This->BufferSize); 00326 00327 dwBytes = min(This->BufferSize - dwOffset, dwBytes); 00328 00329 *ppvAudioPtr1 = This->Buffer + dwOffset; 00330 *pdwAudioBytes1 = dwBytes; 00331 00332 This->BufferPosition = dwOffset + dwBytes; 00333 00334 if (This->BufferPosition == This->BufferSize) 00335 This->BufferPosition = 0; 00336 00337 if (ppvAudioPtr2) 00338 *ppvAudioPtr2 = NULL; 00339 if (pdwAudioBytes2) 00340 *pdwAudioBytes2 = 0; 00341 00342 return DS_OK; 00343 } 00344 } 00345 00346 HRESULT 00347 WINAPI 00348 SecondaryDirectSoundBuffer8Impl_fnPlay( 00349 LPDIRECTSOUNDBUFFER8 iface, 00350 DWORD dwReserved1, 00351 DWORD dwPriority, 00352 DWORD dwFlags) 00353 { 00354 HRESULT hResult; 00355 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00356 00357 if (dwReserved1 != 0) 00358 { 00359 /* must be zero */ 00360 return DSERR_INVALIDPARAM; 00361 } 00362 00363 /* sanity check */ 00364 ASSERT(dwFlags & DSBPLAY_LOOPING); 00365 00366 00367 if (This->State == KSSTATE_RUN) 00368 { 00369 /* sound buffer is already playing */ 00370 return DS_OK; 00371 } 00372 00373 /* set dataformat */ 00374 hResult = PrimaryDirectSoundBuffer_SetFormat(This->PrimaryBuffer, This->Format, TRUE); 00375 00376 if (!SUCCEEDED(hResult)) 00377 { 00378 /* failed */ 00379 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); 00380 return hResult; 00381 } 00382 00383 /* start primary buffer */ 00384 PrimaryDirectSoundBuffer_SetState(This->PrimaryBuffer, KSSTATE_RUN); 00385 /* acquire primary buffer */ 00386 PrimaryDirectSoundBuffer_AcquireLock(This->PrimaryBuffer); 00387 /* HACK write buffer */ 00388 PrimaryDirectSoundBuffer_Write(This->PrimaryBuffer, This->Buffer, This->BufferSize); 00389 /* release primary buffer */ 00390 PrimaryDirectSoundBuffer_ReleaseLock(This->PrimaryBuffer); 00391 00392 DPRINT("SetFormatSuccess PrimaryBuffer %p\n", This->PrimaryBuffer); 00393 This->State = KSSTATE_RUN; 00394 00395 return DS_OK; 00396 } 00397 00398 HRESULT 00399 WINAPI 00400 SecondaryDirectSoundBuffer8Impl_fnSetCurrentPosition( 00401 LPDIRECTSOUNDBUFFER8 iface, 00402 DWORD dwNewPosition) 00403 { 00404 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00405 00406 DPRINT("Setting position %u\n", dwNewPosition); 00407 This->Position = dwNewPosition; 00408 00409 return DS_OK; 00410 } 00411 00412 HRESULT 00413 WINAPI 00414 SecondaryDirectSoundBuffer8Impl_fnSetFormat( 00415 LPDIRECTSOUNDBUFFER8 iface, 00416 LPCWAVEFORMATEX pcfxFormat) 00417 { 00418 /* RTFM */ 00419 return DSERR_INVALIDCALL; 00420 } 00421 00422 HRESULT 00423 WINAPI 00424 SecondaryDirectSoundBuffer8Impl_fnSetVolume( 00425 LPDIRECTSOUNDBUFFER8 iface, 00426 LONG lVolume) 00427 { 00428 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00429 00430 if (lVolume < DSBVOLUME_MIN || lVolume > DSBVOLUME_MAX) 00431 { 00432 /* invalid parameter */ 00433 return DSERR_INVALIDPARAM; 00434 } 00435 00436 00437 /* Store volume */ 00438 This->Volume = lVolume; 00439 00440 return DS_OK; 00441 } 00442 00443 HRESULT 00444 WINAPI 00445 SecondaryDirectSoundBuffer8Impl_fnSetPan( 00446 LPDIRECTSOUNDBUFFER8 iface, 00447 LONG lPan) 00448 { 00449 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00450 00451 if (lPan < DSBPAN_LEFT || lPan > DSBPAN_RIGHT) 00452 { 00453 /* invalid parameter */ 00454 return DSERR_INVALIDPARAM; 00455 } 00456 00457 /* Store volume pan */ 00458 This->VolumePan = lPan; 00459 00460 return DS_OK; 00461 } 00462 00463 HRESULT 00464 WINAPI 00465 SecondaryDirectSoundBuffer8Impl_fnSetFrequency( 00466 LPDIRECTSOUNDBUFFER8 iface, 00467 DWORD dwFrequency) 00468 { 00469 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00470 00471 if (dwFrequency == DSBFREQUENCY_ORIGINAL) 00472 { 00473 /* restore original frequency */ 00474 dwFrequency = This->Format->nSamplesPerSec; 00475 } 00476 00477 if (dwFrequency < DSBFREQUENCY_MIN || dwFrequency > DSBFREQUENCY_MAX) 00478 { 00479 /* invalid frequency */ 00480 return DSERR_INVALIDPARAM; 00481 } 00482 00483 if (dwFrequency != This->dwFrequency) 00484 { 00485 /* FIXME handle frequency change */ 00486 } 00487 00488 /* store frequency */ 00489 This->dwFrequency = dwFrequency; 00490 00491 return DS_OK; 00492 } 00493 00494 HRESULT 00495 WINAPI 00496 SecondaryDirectSoundBuffer8Impl_fnStop( 00497 LPDIRECTSOUNDBUFFER8 iface) 00498 { 00499 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00500 00501 PrimaryDirectSoundBuffer_SetState(This->PrimaryBuffer, KSSTATE_PAUSE); 00502 PrimaryDirectSoundBuffer_SetState(This->PrimaryBuffer, KSSTATE_ACQUIRE); 00503 PrimaryDirectSoundBuffer_SetState(This->PrimaryBuffer, KSSTATE_STOP); 00504 00505 DPRINT("SecondaryDirectSoundBuffer8Impl_fnStop\n"); 00506 00507 00508 /* set state to stop */ 00509 This->State = KSSTATE_STOP; 00510 This->BufferPosition = 0; 00511 00512 return DS_OK; 00513 } 00514 00515 00516 HRESULT 00517 WINAPI 00518 SecondaryDirectSoundBuffer8Impl_fnUnlock( 00519 LPDIRECTSOUNDBUFFER8 iface, 00520 LPVOID pvAudioPtr1, 00521 DWORD dwAudioBytes1, 00522 LPVOID pvAudioPtr2, 00523 DWORD dwAudioBytes2) 00524 { 00525 //DPRINT("SecondaryDirectSoundBuffer8Impl_fnUnlock pvAudioPtr1 %p dwAudioBytes1 %u pvAudioPtr2 %p dwAudioBytes2 %u Unimplemented\n"); 00526 return DS_OK; 00527 } 00528 00529 00530 00531 00532 HRESULT 00533 WINAPI 00534 SecondaryDirectSoundBuffer8Impl_fnRestore( 00535 LPDIRECTSOUNDBUFFER8 iface) 00536 { 00537 UNIMPLEMENTED 00538 return DSERR_INVALIDPARAM; 00539 } 00540 00541 00542 HRESULT 00543 WINAPI 00544 SecondaryDirectSoundBuffer8Impl_fnSetFX( 00545 LPDIRECTSOUNDBUFFER8 iface, 00546 DWORD dwEffectsCount, 00547 LPDSEFFECTDESC pDSFXDesc, 00548 LPDWORD pdwResultCodes) 00549 { 00550 UNIMPLEMENTED 00551 return DSERR_INVALIDPARAM; 00552 } 00553 00554 HRESULT 00555 WINAPI 00556 SecondaryDirectSoundBuffer8Impl_fnAcquireResources( 00557 LPDIRECTSOUNDBUFFER8 iface, 00558 DWORD dwFlags, 00559 DWORD dwEffectsCount, 00560 LPDWORD pdwResultCodes) 00561 { 00562 UNIMPLEMENTED 00563 return DSERR_INVALIDPARAM; 00564 } 00565 00566 HRESULT 00567 WINAPI 00568 SecondaryDirectSoundBuffer8Impl_fnGetObjectInPath( 00569 LPDIRECTSOUNDBUFFER8 iface, 00570 REFGUID rguidObject, 00571 DWORD dwIndex, 00572 REFGUID rguidInterface, 00573 LPVOID *ppObject) 00574 { 00575 UNIMPLEMENTED 00576 return DSERR_INVALIDPARAM; 00577 } 00578 00579 static IDirectSoundBuffer8Vtbl vt_DirectSoundBuffer8 = 00580 { 00581 /* IUnknown methods */ 00582 SecondaryDirectSoundBuffer8Impl_fnQueryInterface, 00583 SecondaryDirectSoundBuffer8Impl_fnAddRef, 00584 SecondaryDirectSoundBuffer8Impl_fnRelease, 00585 /* IDirectSoundBuffer methods */ 00586 SecondaryDirectSoundBuffer8Impl_fnGetCaps, 00587 SecondaryDirectSoundBuffer8Impl_fnGetCurrentPosition, 00588 SecondaryDirectSoundBuffer8Impl_fnGetFormat, 00589 SecondaryDirectSoundBuffer8Impl_fnGetVolume, 00590 SecondaryDirectSoundBuffer8Impl_fnGetPan, 00591 SecondaryDirectSoundBuffer8Impl_fnGetFrequency, 00592 SecondaryDirectSoundBuffer8Impl_fnGetStatus, 00593 SecondaryDirectSoundBuffer8Impl_fnInitialize, 00594 SecondaryDirectSoundBuffer8Impl_fnLock, 00595 SecondaryDirectSoundBuffer8Impl_fnPlay, 00596 SecondaryDirectSoundBuffer8Impl_fnSetCurrentPosition, 00597 SecondaryDirectSoundBuffer8Impl_fnSetFormat, 00598 SecondaryDirectSoundBuffer8Impl_fnSetVolume, 00599 SecondaryDirectSoundBuffer8Impl_fnSetPan, 00600 SecondaryDirectSoundBuffer8Impl_fnSetFrequency, 00601 SecondaryDirectSoundBuffer8Impl_fnStop, 00602 SecondaryDirectSoundBuffer8Impl_fnUnlock, 00603 SecondaryDirectSoundBuffer8Impl_fnRestore, 00604 /* IDirectSoundBuffer8 methods */ 00605 SecondaryDirectSoundBuffer8Impl_fnSetFX, 00606 SecondaryDirectSoundBuffer8Impl_fnAcquireResources, 00607 SecondaryDirectSoundBuffer8Impl_fnGetObjectInPath 00608 }; 00609 00610 HRESULT 00611 NewSecondarySoundBuffer( 00612 LPDIRECTSOUNDBUFFER8 *OutBuffer, 00613 LPFILTERINFO Filter, 00614 DWORD dwLevel, 00615 LPCDSBUFFERDESC lpcDSBufferDesc, 00616 LPDIRECTSOUNDBUFFER8 PrimaryBuffer) 00617 { 00618 ULONG FormatSize; 00619 LPCDirectSoundBuffer This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CDirectSoundBuffer)); 00620 00621 if (!This) 00622 { 00623 /* not enough memory */ 00624 return DSERR_OUTOFMEMORY; 00625 } 00626 00627 FormatSize = sizeof(WAVEFORMATEX) + lpcDSBufferDesc->lpwfxFormat->cbSize; 00628 00629 This->Format = HeapAlloc(GetProcessHeap(), 0, FormatSize); 00630 if (!This->Format) 00631 { 00632 /* not enough memory */ 00633 HeapFree(GetProcessHeap(), 0, This); 00634 return DSERR_OUTOFMEMORY; 00635 } 00636 00637 /* sanity check */ 00638 ASSERT(lpcDSBufferDesc->dwBufferBytes); 00639 00640 /* allocate sound buffer */ 00641 This->Buffer = HeapAlloc(GetProcessHeap(), 0, lpcDSBufferDesc->dwBufferBytes); 00642 if (!This->Buffer) 00643 { 00644 /* not enough memory */ 00645 HeapFree(GetProcessHeap(), 0, This->Format); 00646 HeapFree(GetProcessHeap(), 0, This); 00647 return DSERR_OUTOFMEMORY; 00648 } 00649 00650 /* fill buffer with silence */ 00651 FillMemory(This->Buffer, lpcDSBufferDesc->dwBufferBytes, lpcDSBufferDesc->lpwfxFormat->wBitsPerSample == 8 ? 0x80 : 0); 00652 00653 This->ref = 1; 00654 This->lpVtbl = &vt_DirectSoundBuffer8; 00655 This->Filter = Filter; 00656 This->dwLevel = dwLevel; 00657 This->dwFlags = lpcDSBufferDesc->dwFlags; 00658 This->dwFrequency = lpcDSBufferDesc->lpwfxFormat->nSamplesPerSec; 00659 This->State = KSSTATE_STOP; 00660 This->Volume = DSBVOLUME_MAX; 00661 This->VolumePan = DSBPAN_CENTER; 00662 This->Flags = 0; 00663 This->Position = 0; 00664 This->BufferSize = lpcDSBufferDesc->dwBufferBytes; 00665 This->PrimaryBuffer = PrimaryBuffer; 00666 00667 CopyMemory(This->Format, lpcDSBufferDesc->lpwfxFormat, FormatSize); 00668 00669 *OutBuffer = (LPDIRECTSOUNDBUFFER8)&This->lpVtbl; 00670 return DS_OK; 00671 } 00672 Generated on Sat May 26 2012 04:20:17 for ReactOS by
1.7.6.1
|