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

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

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