Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenprimary.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/primary.c 00005 * PURPOSE: Primary 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 LONG Volume; 00023 LONG VolumePan; 00024 WAVEFORMATEX Format; 00025 HANDLE hPin; 00026 CRITICAL_SECTION Lock; 00027 KSSTATE State; 00028 }CDirectSoundBuffer, *LPCDirectSoundBuffer; 00029 00030 HRESULT 00031 WINAPI 00032 PrimaryDirectSoundBuffer8Impl_fnQueryInterface( 00033 LPDIRECTSOUNDBUFFER8 iface, 00034 IN REFIID riid, 00035 LPVOID* ppobj) 00036 { 00037 LPOLESTR pStr; 00038 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00039 00040 if (IsEqualIID(riid, &IID_IUnknown) || 00041 IsEqualIID(riid, &IID_IDirectSoundBuffer) || 00042 IsEqualIID(riid, &IID_IDirectSoundBuffer8)) 00043 { 00044 *ppobj = (LPVOID)&This->lpVtbl; 00045 InterlockedIncrement(&This->ref); 00046 return S_OK; 00047 } 00048 00049 if (SUCCEEDED(StringFromIID(riid, &pStr))) 00050 { 00051 DPRINT("No Interface for class %s\n", pStr); 00052 CoTaskMemFree(pStr); 00053 } 00054 return E_NOINTERFACE; 00055 } 00056 00057 ULONG 00058 WINAPI 00059 PrimaryDirectSoundBuffer8Impl_fnAddRef( 00060 LPDIRECTSOUNDBUFFER8 iface) 00061 { 00062 ULONG ref; 00063 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00064 00065 ref = InterlockedIncrement(&This->ref); 00066 00067 return ref; 00068 00069 } 00070 00071 ULONG 00072 WINAPI 00073 PrimaryDirectSoundBuffer8Impl_fnRelease( 00074 LPDIRECTSOUNDBUFFER8 iface) 00075 { 00076 ULONG ref; 00077 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00078 00079 ref = InterlockedDecrement(&(This->ref)); 00080 00081 if (!ref) 00082 { 00083 if (This->hPin) 00084 { 00085 /* close pin handle */ 00086 CloseHandle(This->hPin); 00087 } 00088 /* free primary buffer */ 00089 HeapFree(GetProcessHeap(), 0, This); 00090 } 00091 00092 return ref; 00093 } 00094 00095 HRESULT 00096 WINAPI 00097 PrimaryDirectSoundBuffer8Impl_fnGetCaps( 00098 LPDIRECTSOUNDBUFFER8 iface, 00099 LPDSBCAPS pDSBufferCaps) 00100 { 00101 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00102 00103 DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetCaps\n"); 00104 00105 if (!pDSBufferCaps) 00106 { 00107 /* invalid parameter */ 00108 return DSERR_INVALIDPARAM; 00109 } 00110 00111 if (pDSBufferCaps->dwSize < sizeof(DSBCAPS)) 00112 { 00113 /* invalid buffer size */ 00114 return DSERR_INVALIDPARAM; 00115 } 00116 00117 /* get buffer details */ 00118 pDSBufferCaps->dwUnlockTransferRate = 0; 00119 pDSBufferCaps->dwPlayCpuOverhead = 0; 00120 pDSBufferCaps->dwSize = 0; //FIXME 00121 pDSBufferCaps->dwFlags = This->dwFlags; 00122 00123 return DS_OK; 00124 } 00125 00126 HRESULT 00127 WINAPI 00128 PrimaryDirectSoundBuffer8Impl_fnGetCurrentPosition( 00129 LPDIRECTSOUNDBUFFER8 iface, 00130 LPDWORD pdwCurrentPlayCursor, 00131 LPDWORD pdwCurrentWriteCursor) 00132 { 00133 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00134 00135 DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetCurrentPosition\n"); 00136 00137 if (This->dwLevel < DSSCL_PRIORITY) 00138 { 00139 /* needs priority level */ 00140 return DSERR_PRIOLEVELNEEDED; 00141 } 00142 00143 if (!pdwCurrentPlayCursor && !pdwCurrentWriteCursor) 00144 { 00145 /* all parameters are null */ 00146 return DSERR_INVALIDPARAM; 00147 } 00148 00149 UNIMPLEMENTED; 00150 return DSERR_INVALIDPARAM; 00151 } 00152 00153 HRESULT 00154 WINAPI 00155 PrimaryDirectSoundBuffer8Impl_fnGetFormat( 00156 LPDIRECTSOUNDBUFFER8 iface, 00157 LPWAVEFORMATEX pwfxFormat, 00158 DWORD dwSizeAllocated, 00159 LPDWORD pdwSizeWritten) 00160 { 00161 DWORD FormatSize; 00162 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00163 00164 DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetFormat\n"); 00165 00166 FormatSize = sizeof(WAVEFORMATEX) + This->Format.cbSize; 00167 00168 if (!pwfxFormat && !pdwSizeWritten) 00169 { 00170 /* invalid parameter */ 00171 return DSERR_INVALIDPARAM; 00172 } 00173 00174 if (!pwfxFormat) 00175 { 00176 /* return required format size */ 00177 *pdwSizeWritten = FormatSize; 00178 return DS_OK; 00179 } 00180 else 00181 { 00182 if (dwSizeAllocated >= FormatSize) 00183 { 00184 /* copy format */ 00185 CopyMemory(pwfxFormat, &This->Format, FormatSize); 00186 00187 if (pdwSizeWritten) 00188 *pdwSizeWritten = FormatSize; 00189 00190 return DS_OK; 00191 } 00192 /* buffer too small */ 00193 if (pdwSizeWritten) 00194 *pdwSizeWritten = 0; 00195 00196 return DSERR_INVALIDPARAM; 00197 } 00198 } 00199 00200 HRESULT 00201 WINAPI 00202 PrimaryDirectSoundBuffer8Impl_fnGetVolume( 00203 LPDIRECTSOUNDBUFFER8 iface, 00204 LPLONG plVolume) 00205 { 00206 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00207 00208 DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetVolume\n"); 00209 00210 if (!plVolume) 00211 { 00212 /* invalid parameter */ 00213 return DSERR_INVALIDPARAM; 00214 } 00215 00216 /* get volume */ 00217 *plVolume = This->Volume; 00218 00219 return DS_OK; 00220 } 00221 00222 HRESULT 00223 WINAPI 00224 PrimaryDirectSoundBuffer8Impl_fnGetPan( 00225 LPDIRECTSOUNDBUFFER8 iface, 00226 LPLONG plPan) 00227 { 00228 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00229 00230 DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetPan\n"); 00231 00232 if (!plPan) 00233 { 00234 /* invalid parameter */ 00235 return DSERR_INVALIDPARAM; 00236 } 00237 00238 /* get frequency */ 00239 *plPan = This->VolumePan; 00240 00241 return DS_OK; 00242 } 00243 00244 HRESULT 00245 WINAPI 00246 PrimaryDirectSoundBuffer8Impl_fnGetFrequency( 00247 LPDIRECTSOUNDBUFFER8 iface, 00248 LPDWORD pdwFrequency) 00249 { 00250 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00251 00252 DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetFrequency\n"); 00253 00254 if (!pdwFrequency) 00255 { 00256 /* invalid parameter */ 00257 return DSERR_INVALIDPARAM; 00258 } 00259 00260 /* get frequency */ 00261 *pdwFrequency = This->dwFrequency; 00262 00263 return DS_OK; 00264 } 00265 00266 HRESULT 00267 WINAPI 00268 PrimaryDirectSoundBuffer8Impl_fnGetStatus( 00269 LPDIRECTSOUNDBUFFER8 iface, 00270 LPDWORD pdwStatus) 00271 { 00272 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00273 00274 DPRINT("PrimaryDirectSoundBuffer8Impl_fnGetStatus\n"); 00275 00276 if (!pdwStatus) 00277 { 00278 /* invalid parameter */ 00279 return DSERR_INVALIDPARAM; 00280 } 00281 00282 *pdwStatus = 0; 00283 if (This->State == KSSTATE_RUN || This->State == KSSTATE_ACQUIRE) 00284 { 00285 /* buffer is playing */ 00286 *pdwStatus |= DSBSTATUS_PLAYING | DSBSTATUS_LOOPING; 00287 } 00288 00289 return DS_OK; 00290 } 00291 00292 HRESULT 00293 WINAPI 00294 PrimaryDirectSoundBuffer8Impl_fnInitialize( 00295 LPDIRECTSOUNDBUFFER8 iface, 00296 LPDIRECTSOUND pDirectSound, 00297 LPCDSBUFFERDESC pcDSBufferDesc) 00298 { 00299 /* RTFM */ 00300 return DSERR_ALREADYINITIALIZED; 00301 } 00302 00303 HRESULT 00304 WINAPI 00305 PrimaryDirectSoundBuffer8Impl_fnLock( 00306 LPDIRECTSOUNDBUFFER8 iface, 00307 DWORD dwOffset, 00308 DWORD dwBytes, 00309 LPVOID *ppvAudioPtr1, 00310 LPDWORD pdwAudioBytes1, 00311 LPVOID *ppvAudioPtr2, 00312 LPDWORD pdwAudioBytes2, 00313 DWORD dwFlags) 00314 { 00315 UNIMPLEMENTED 00316 return DSERR_INVALIDPARAM; 00317 } 00318 00319 HRESULT 00320 WINAPI 00321 PrimaryDirectSoundBuffer8Impl_fnPlay( 00322 LPDIRECTSOUNDBUFFER8 iface, 00323 DWORD dwReserved1, 00324 DWORD dwPriority, 00325 DWORD dwFlags) 00326 { 00327 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00328 00329 DPRINT("PrimaryDirectSoundBuffer8Impl_fnPlay dwFlags %x\n", dwFlags); 00330 00331 if (dwReserved1 != 0 || !(dwFlags & DSBPLAY_LOOPING)) 00332 { 00333 /* invalid parameter */ 00334 return DSERR_INVALIDPARAM; 00335 } 00336 00337 PrimaryDirectSoundBuffer_AcquireLock(iface); 00338 00339 if (This->State == KSSTATE_STOP) 00340 { 00341 PrimaryDirectSoundBuffer_SetState(iface, KSSTATE_ACQUIRE); 00342 ASSERT(This->State == KSSTATE_ACQUIRE); 00343 } 00344 00345 if (This->State == KSSTATE_ACQUIRE) 00346 { 00347 PrimaryDirectSoundBuffer_SetState(iface, KSSTATE_PAUSE); 00348 ASSERT(This->State == KSSTATE_PAUSE); 00349 } 00350 00351 if (This->State == KSSTATE_PAUSE) 00352 { 00353 PrimaryDirectSoundBuffer_SetState(iface, KSSTATE_RUN); 00354 ASSERT(This->State == KSSTATE_RUN); 00355 } 00356 00357 PrimaryDirectSoundBuffer_ReleaseLock(iface); 00358 00359 return DS_OK; 00360 } 00361 00362 HRESULT 00363 WINAPI 00364 PrimaryDirectSoundBuffer8Impl_fnSetCurrentPosition( 00365 LPDIRECTSOUNDBUFFER8 iface, 00366 DWORD dwNewPosition) 00367 { 00368 /* The position of a primary buffer can't be set */ 00369 return DSERR_INVALIDCALL; 00370 } 00371 00372 HRESULT 00373 WINAPI 00374 PrimaryDirectSoundBuffer8Impl_fnSetFormat( 00375 LPDIRECTSOUNDBUFFER8 iface, 00376 LPCWAVEFORMATEX pcfxFormat) 00377 { 00378 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00379 00380 if (This->dwLevel == DSSCL_NORMAL) 00381 { 00382 /* can't change format with this level */ 00383 return DSERR_PRIOLEVELNEEDED; 00384 } 00385 00386 ASSERT(pcfxFormat->cbSize == 0); 00387 00388 00389 DPRINT("This %p Format: Tag %x nChannels %u nSamplesPerSec %u nAvgBytesPerSec %u nBlockAlign %u wBitsPerSample %u cbSize %u\n", This, 00390 pcfxFormat->wFormatTag, pcfxFormat->nChannels, pcfxFormat->nSamplesPerSec, pcfxFormat->nAvgBytesPerSec, pcfxFormat->nBlockAlign, pcfxFormat->wBitsPerSample, pcfxFormat->cbSize); 00391 00392 CopyMemory(&This->Format, pcfxFormat, sizeof(WAVEFORMATEX)); 00393 00394 return DS_OK; 00395 } 00396 00397 HRESULT 00398 WINAPI 00399 PrimaryDirectSoundBuffer8Impl_fnSetVolume( 00400 LPDIRECTSOUNDBUFFER8 iface, 00401 LONG lVolume) 00402 { 00403 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00404 00405 if (lVolume < DSBVOLUME_MIN || lVolume > DSBVOLUME_MAX) 00406 { 00407 /* invalid parameter */ 00408 return DSERR_INVALIDPARAM; 00409 } 00410 00411 /* TODO: call volume node */ 00412 00413 /* Store volume */ 00414 This->Volume = lVolume; 00415 00416 return DS_OK; 00417 } 00418 00419 HRESULT 00420 WINAPI 00421 PrimaryDirectSoundBuffer8Impl_fnSetPan( 00422 LPDIRECTSOUNDBUFFER8 iface, 00423 LONG lPan) 00424 { 00425 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00426 00427 if (lPan < DSBPAN_LEFT || lPan > DSBPAN_RIGHT) 00428 { 00429 /* invalid parameter */ 00430 return DSERR_INVALIDPARAM; 00431 } 00432 00433 /* TODO: call volume node */ 00434 00435 /* Store volume pan */ 00436 This->VolumePan = lPan; 00437 00438 return DS_OK; 00439 } 00440 00441 HRESULT 00442 WINAPI 00443 PrimaryDirectSoundBuffer8Impl_fnSetFrequency( 00444 LPDIRECTSOUNDBUFFER8 iface, 00445 DWORD dwFrequency) 00446 { 00447 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00448 00449 if (This->dwLevel < DSSCL_PRIORITY) 00450 { 00451 /* needs priority level */ 00452 return DSERR_PRIOLEVELNEEDED; 00453 } 00454 00455 /* invalid request */ 00456 return DSERR_CONTROLUNAVAIL; 00457 } 00458 00459 HRESULT 00460 WINAPI 00461 PrimaryDirectSoundBuffer8Impl_fnStop( 00462 LPDIRECTSOUNDBUFFER8 iface) 00463 { 00464 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00465 00466 DPRINT("PrimaryDirectSoundBuffer8Impl_fnStop\n"); 00467 00468 PrimaryDirectSoundBuffer_AcquireLock(iface); 00469 00470 if (This->State == KSSTATE_RUN) 00471 { 00472 PrimaryDirectSoundBuffer_SetState(iface, KSSTATE_PAUSE); 00473 ASSERT(This->State == KSSTATE_PAUSE); 00474 } 00475 00476 if (This->State == KSSTATE_PAUSE) 00477 { 00478 PrimaryDirectSoundBuffer_SetState(iface, KSSTATE_ACQUIRE); 00479 ASSERT(This->State == KSSTATE_ACQUIRE); 00480 } 00481 00482 if (This->State == KSSTATE_ACQUIRE) 00483 { 00484 PrimaryDirectSoundBuffer_SetState(iface, KSSTATE_STOP); 00485 ASSERT(This->State == KSSTATE_STOP); 00486 } 00487 00488 PrimaryDirectSoundBuffer_ReleaseLock(iface); 00489 00490 return DS_OK; 00491 } 00492 00493 00494 HRESULT 00495 WINAPI 00496 PrimaryDirectSoundBuffer8Impl_fnUnlock( 00497 LPDIRECTSOUNDBUFFER8 iface, 00498 LPVOID pvAudioPtr1, 00499 DWORD dwAudioBytes1, 00500 LPVOID pvAudioPtr2, 00501 DWORD dwAudioBytes2) 00502 { 00503 UNIMPLEMENTED 00504 return DSERR_INVALIDPARAM; 00505 } 00506 00507 00508 HRESULT 00509 WINAPI 00510 PrimaryDirectSoundBuffer8Impl_fnRestore( 00511 LPDIRECTSOUNDBUFFER8 iface) 00512 { 00513 UNIMPLEMENTED 00514 return DSERR_INVALIDPARAM; 00515 } 00516 00517 00518 HRESULT 00519 WINAPI 00520 PrimaryDirectSoundBuffer8Impl_fnSetFX( 00521 LPDIRECTSOUNDBUFFER8 iface, 00522 DWORD dwEffectsCount, 00523 LPDSEFFECTDESC pDSFXDesc, 00524 LPDWORD pdwResultCodes) 00525 { 00526 UNIMPLEMENTED 00527 return DSERR_INVALIDPARAM; 00528 } 00529 00530 HRESULT 00531 WINAPI 00532 PrimaryDirectSoundBuffer8Impl_fnAcquireResources( 00533 LPDIRECTSOUNDBUFFER8 iface, 00534 DWORD dwFlags, 00535 DWORD dwEffectsCount, 00536 LPDWORD pdwResultCodes) 00537 { 00538 UNIMPLEMENTED 00539 return DSERR_INVALIDPARAM; 00540 } 00541 00542 HRESULT 00543 WINAPI 00544 PrimaryDirectSoundBuffer8Impl_fnGetObjectInPath( 00545 LPDIRECTSOUNDBUFFER8 iface, 00546 REFGUID rguidObject, 00547 DWORD dwIndex, 00548 REFGUID rguidInterface, 00549 LPVOID *ppObject) 00550 { 00551 UNIMPLEMENTED 00552 return DSERR_INVALIDPARAM; 00553 } 00554 00555 static IDirectSoundBuffer8Vtbl vt_DirectSoundBuffer8 = 00556 { 00557 /* IUnknown methods */ 00558 PrimaryDirectSoundBuffer8Impl_fnQueryInterface, 00559 PrimaryDirectSoundBuffer8Impl_fnAddRef, 00560 PrimaryDirectSoundBuffer8Impl_fnRelease, 00561 /* IDirectSoundBuffer methods */ 00562 PrimaryDirectSoundBuffer8Impl_fnGetCaps, 00563 PrimaryDirectSoundBuffer8Impl_fnGetCurrentPosition, 00564 PrimaryDirectSoundBuffer8Impl_fnGetFormat, 00565 PrimaryDirectSoundBuffer8Impl_fnGetVolume, 00566 PrimaryDirectSoundBuffer8Impl_fnGetPan, 00567 PrimaryDirectSoundBuffer8Impl_fnGetFrequency, 00568 PrimaryDirectSoundBuffer8Impl_fnGetStatus, 00569 PrimaryDirectSoundBuffer8Impl_fnInitialize, 00570 PrimaryDirectSoundBuffer8Impl_fnLock, 00571 PrimaryDirectSoundBuffer8Impl_fnPlay, 00572 PrimaryDirectSoundBuffer8Impl_fnSetCurrentPosition, 00573 PrimaryDirectSoundBuffer8Impl_fnSetFormat, 00574 PrimaryDirectSoundBuffer8Impl_fnSetVolume, 00575 PrimaryDirectSoundBuffer8Impl_fnSetPan, 00576 PrimaryDirectSoundBuffer8Impl_fnSetFrequency, 00577 PrimaryDirectSoundBuffer8Impl_fnStop, 00578 PrimaryDirectSoundBuffer8Impl_fnUnlock, 00579 PrimaryDirectSoundBuffer8Impl_fnRestore, 00580 /* IDirectSoundBuffer8 methods */ 00581 PrimaryDirectSoundBuffer8Impl_fnSetFX, 00582 PrimaryDirectSoundBuffer8Impl_fnAcquireResources, 00583 PrimaryDirectSoundBuffer8Impl_fnGetObjectInPath 00584 }; 00585 00586 DWORD 00587 PrimaryDirectSoundBuffer_Write( 00588 LPDIRECTSOUNDBUFFER8 iface, 00589 LPVOID Buffer, 00590 DWORD BufferSize) 00591 { 00592 KSSTREAM_HEADER Header; 00593 DWORD Result, BytesTransferred; 00594 OVERLAPPED Overlapped; 00595 00596 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00597 00598 ZeroMemory(&Overlapped, sizeof(OVERLAPPED)); 00599 Overlapped.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); 00600 00601 00602 ASSERT(This->hPin); 00603 ZeroMemory(&Header, sizeof(KSSTREAM_HEADER)); 00604 00605 Header.FrameExtent = BufferSize; 00606 Header.DataUsed = BufferSize; 00607 Header.Data = Buffer; 00608 Header.Size = sizeof(KSSTREAM_HEADER); 00609 Header.PresentationTime.Numerator = 1; 00610 Header.PresentationTime.Denominator = 1; 00611 00612 Result = DeviceIoControl(This->hPin, IOCTL_KS_WRITE_STREAM, NULL, 0, &Header, sizeof(KSSTREAM_HEADER), &BytesTransferred, &Overlapped); 00613 00614 if (Result != ERROR_SUCCESS) 00615 return 0; 00616 00617 return BytesTransferred; 00618 } 00619 00620 VOID 00621 PrimaryDirectSoundBuffer_SetState( 00622 LPDIRECTSOUNDBUFFER8 iface, 00623 KSSTATE State) 00624 { 00625 KSPROPERTY Property; 00626 DWORD Result, BytesTransferred; 00627 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00628 00629 if (This->State == State) 00630 return; 00631 00632 Property.Set = KSPROPSETID_Connection; 00633 Property.Id = KSPROPERTY_CONNECTION_STATE; 00634 Property.Flags = KSPROPERTY_TYPE_SET; 00635 00636 Result = SyncOverlappedDeviceIoControl(This->hPin, IOCTL_KS_PROPERTY, (PVOID)&Property, sizeof(KSPROPERTY), (PVOID)&State, sizeof(KSSTATE), &BytesTransferred); 00637 if (Result == ERROR_SUCCESS) 00638 { 00639 This->State = State; 00640 } 00641 } 00642 00643 HRESULT 00644 PrimaryDirectSoundBuffer_GetPosition( 00645 LPDIRECTSOUNDBUFFER8 iface, 00646 LPDWORD pdwCurrentPlayCursor, 00647 LPDWORD pdwCurrentWriteCursor) 00648 { 00649 KSAUDIO_POSITION Position; 00650 KSPROPERTY Request; 00651 DWORD Result; 00652 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00653 00654 //DPRINT("PrimaryDirectSoundBuffer_GetPosition\n"); 00655 00656 if (!This->hPin) 00657 { 00658 if (pdwCurrentPlayCursor) 00659 *pdwCurrentPlayCursor = 0; 00660 00661 if (pdwCurrentWriteCursor) 00662 *pdwCurrentWriteCursor = 0; 00663 00664 DPRINT("No Audio Pin\n"); 00665 return DS_OK; 00666 } 00667 00668 /* setup audio position property request */ 00669 Request.Id = KSPROPERTY_AUDIO_POSITION; 00670 Request.Set = KSPROPSETID_Audio; 00671 Request.Flags = KSPROPERTY_TYPE_GET; 00672 00673 00674 Result = SyncOverlappedDeviceIoControl(This->hPin, IOCTL_KS_PROPERTY, (PVOID)&Request, sizeof(KSPROPERTY), (PVOID)&Position, sizeof(KSAUDIO_POSITION), NULL); 00675 00676 if (Result != ERROR_SUCCESS) 00677 { 00678 DPRINT("GetPosition failed with %x\n", Result); 00679 return DSERR_UNSUPPORTED; 00680 } 00681 00682 //DPRINT("Play %I64u Write %I64u \n", Position.PlayOffset, Position.WriteOffset); 00683 00684 if (pdwCurrentPlayCursor) 00685 *pdwCurrentPlayCursor = (DWORD)Position.PlayOffset; 00686 00687 if (pdwCurrentWriteCursor) 00688 *pdwCurrentWriteCursor = (DWORD)Position.WriteOffset; 00689 00690 return DS_OK; 00691 } 00692 00693 HRESULT 00694 PrimaryDirectSoundBuffer_SetFormat( 00695 LPDIRECTSOUNDBUFFER8 iface, 00696 LPWAVEFORMATEX pcfxFormat, 00697 BOOL bLooped) 00698 { 00699 ULONG PinId, DeviceId = 0, Result; 00700 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00701 00702 if (This->hPin) 00703 { 00704 // FIXME 00705 // check if multiple buffers are active 00706 // in that case need mixing 00707 00708 if (SetPinFormat(This->hPin, pcfxFormat)) 00709 return DS_OK; 00710 else 00711 return DSERR_GENERIC; 00712 } 00713 00714 do 00715 { 00716 /* try all available recording pins on that filter */ 00717 PinId = GetPinIdFromFilter(This->Filter, FALSE, DeviceId); 00718 DPRINT("PinId %u DeviceId %u\n", PinId, DeviceId); 00719 00720 if (PinId == ULONG_MAX) 00721 break; 00722 00723 Result = OpenPin(This->Filter->hFilter, PinId, (LPWAVEFORMATEX)pcfxFormat, &This->hPin, bLooped); 00724 DPRINT("PinId %u Result %u\n", PinId, Result); 00725 if (Result == ERROR_SUCCESS) 00726 { 00727 This->dwFrequency = pcfxFormat->nSamplesPerSec; 00728 break; 00729 } 00730 00731 This->hPin = NULL; 00732 DeviceId++; 00733 }while(TRUE); 00734 00735 if (!This->hPin) 00736 { 00737 DPRINT("PrimaryDirectSoundBuffer8Impl_fnSetFormat failed\n"); 00738 return DSERR_INVALIDPARAM; 00739 } 00740 00741 DPRINT("PrimaryDirectSoundBuffer8Impl_fnSetFormat success\n"); 00742 return DS_OK; 00743 } 00744 00745 VOID 00746 PrimaryDirectSoundBuffer_AcquireLock( 00747 LPDIRECTSOUNDBUFFER8 iface) 00748 { 00749 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00750 00751 EnterCriticalSection(&This->Lock); 00752 00753 00754 } 00755 00756 VOID 00757 PrimaryDirectSoundBuffer_ReleaseLock( 00758 LPDIRECTSOUNDBUFFER8 iface) 00759 { 00760 LPCDirectSoundBuffer This = (LPCDirectSoundBuffer)CONTAINING_RECORD(iface, CDirectSoundBuffer, lpVtbl); 00761 00762 LeaveCriticalSection(&This->Lock); 00763 00764 } 00765 00766 00767 HRESULT 00768 NewPrimarySoundBuffer( 00769 LPDIRECTSOUNDBUFFER8 *OutBuffer, 00770 LPFILTERINFO Filter, 00771 DWORD dwLevel, 00772 DWORD dwFlags) 00773 { 00774 LPCDirectSoundBuffer This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CDirectSoundBuffer)); 00775 00776 if (!This) 00777 { 00778 /* not enough memory */ 00779 return DSERR_OUTOFMEMORY; 00780 } 00781 00782 This->ref = 1; 00783 This->lpVtbl = &vt_DirectSoundBuffer8; 00784 This->Filter = Filter; 00785 This->dwLevel = dwLevel; 00786 This->dwFlags = dwFlags; 00787 This->dwFrequency = 0; 00788 This->Volume = DSBVOLUME_MAX; 00789 This->VolumePan = DSBPAN_CENTER; 00790 This->hPin = NULL; 00791 00792 /* FIXME: determine default format for audio device */ 00793 This->Format.cbSize = sizeof(WAVEFORMATEX); 00794 This->Format.nChannels = 2; 00795 This->Format.nSamplesPerSec = 44100; 00796 This->Format.wBitsPerSample = 16; 00797 This->Format.wFormatTag = WAVE_FORMAT_PCM; 00798 This->Format.nBlockAlign = (This->Format.nChannels * This->Format.wBitsPerSample) / 8; 00799 This->Format.nAvgBytesPerSec = (This->Format.nChannels * This->Format.nSamplesPerSec * This->Format.wBitsPerSample) / 8; 00800 00801 InitializeCriticalSection(&This->Lock); 00802 00803 *OutBuffer = (LPDIRECTSOUNDBUFFER8)&This->lpVtbl; 00804 return DS_OK; 00805 } 00806 Generated on Sun May 27 2012 04:21:42 for ReactOS by
1.7.6.1
|