ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

primary.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.