<directory name="dplayx">
<xi:include href="dplayx/dplayx.rbuild" />
</directory>
- <directory name="dsound">
- <xi:include href="dsound/dsound.rbuild" />
+ <directory name="dsound_new">
+ <xi:include href="dsound_new/dsound.rbuild" />
</directory>
<directory name="dxdiagn">
<xi:include href="dxdiagn/dxdiagn.rbuild" />
+++ /dev/null
-/* DirectSound
- *
- * Copyright 1998 Marcus Meissner
- * Copyright 1998 Rob Riggs
- * Copyright 2000-2002 TransGaming Technologies, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#include <stdarg.h>
-
-#define NONAMELESSSTRUCT
-#define NONAMELESSUNION
-#include "windef.h"
-#include "winbase.h"
-#include "winuser.h"
-#include "mmsystem.h"
-#include "winternl.h"
-#include "wine/debug.h"
-#include "dsound.h"
-#include "dsdriver.h"
-#include "dsound_private.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(dsound);
-
-static HRESULT SecondaryBufferImpl_Destroy(SecondaryBufferImpl *pdsb);
-
-/*******************************************************************************
- * IDirectSoundNotify
- */
-
-struct IDirectSoundNotifyImpl
-{
- /* IUnknown fields */
- const IDirectSoundNotifyVtbl *lpVtbl;
- LONG ref;
- IDirectSoundBufferImpl* dsb;
-};
-
-static HRESULT IDirectSoundNotifyImpl_Create(IDirectSoundBufferImpl *dsb,
- IDirectSoundNotifyImpl **pdsn);
-static HRESULT IDirectSoundNotifyImpl_Destroy(IDirectSoundNotifyImpl *pdsn);
-
-static HRESULT WINAPI IDirectSoundNotifyImpl_QueryInterface(
- LPDIRECTSOUNDNOTIFY iface,REFIID riid,LPVOID *ppobj
-) {
- IDirectSoundNotifyImpl *This = (IDirectSoundNotifyImpl *)iface;
- TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
-
- if (This->dsb == NULL) {
- WARN("invalid parameter\n");
- return E_INVALIDARG;
- }
-
- return IDirectSoundBuffer_QueryInterface((LPDIRECTSOUNDBUFFER)This->dsb, riid, ppobj);
-}
-
-static ULONG WINAPI IDirectSoundNotifyImpl_AddRef(LPDIRECTSOUNDNOTIFY iface)
-{
- IDirectSoundNotifyImpl *This = (IDirectSoundNotifyImpl *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
-}
-
-static ULONG WINAPI IDirectSoundNotifyImpl_Release(LPDIRECTSOUNDNOTIFY iface)
-{
- IDirectSoundNotifyImpl *This = (IDirectSoundNotifyImpl *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref + 1);
-
- if (!ref) {
- IDirectSoundBuffer_Release((LPDIRECTSOUNDBUFFER)This->dsb);
- This->dsb->notify = NULL;
- HeapFree(GetProcessHeap(), 0, This);
- TRACE("(%p) released\n", This);
- }
- return ref;
-}
-
-static HRESULT WINAPI IDirectSoundNotifyImpl_SetNotificationPositions(
- LPDIRECTSOUNDNOTIFY iface,DWORD howmuch,LPCDSBPOSITIONNOTIFY notify
-) {
- IDirectSoundNotifyImpl *This = (IDirectSoundNotifyImpl *)iface;
- TRACE("(%p,0x%08x,%p)\n",This,howmuch,notify);
-
- if (howmuch > 0 && notify == NULL) {
- WARN("invalid parameter: notify == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (TRACE_ON(dsound)) {
- unsigned int i;
- for (i=0;i<howmuch;i++)
- TRACE("notify at %d to %p\n",
- notify[i].dwOffset,notify[i].hEventNotify);
- }
-
- if (This->dsb->hwnotify) {
- HRESULT hres;
- hres = IDsDriverNotify_SetNotificationPositions(This->dsb->hwnotify, howmuch, notify);
- if (hres != DS_OK)
- WARN("IDsDriverNotify_SetNotificationPositions failed\n");
- return hres;
- } else if (howmuch > 0) {
- /* Make an internal copy of the caller-supplied array.
- * Replace the existing copy if one is already present. */
- HeapFree(GetProcessHeap(), 0, This->dsb->notifies);
- This->dsb->notifies = HeapAlloc(GetProcessHeap(), 0,
- howmuch * sizeof(DSBPOSITIONNOTIFY));
-
- if (This->dsb->notifies == NULL) {
- WARN("out of memory\n");
- return DSERR_OUTOFMEMORY;
- }
- CopyMemory(This->dsb->notifies, notify, howmuch * sizeof(DSBPOSITIONNOTIFY));
- This->dsb->nrofnotifies = howmuch;
- } else {
- HeapFree(GetProcessHeap(), 0, This->dsb->notifies);
- This->dsb->notifies = NULL;
- This->dsb->nrofnotifies = 0;
- }
-
- return S_OK;
-}
-
-static const IDirectSoundNotifyVtbl dsnvt =
-{
- IDirectSoundNotifyImpl_QueryInterface,
- IDirectSoundNotifyImpl_AddRef,
- IDirectSoundNotifyImpl_Release,
- IDirectSoundNotifyImpl_SetNotificationPositions,
-};
-
-static HRESULT IDirectSoundNotifyImpl_Create(
- IDirectSoundBufferImpl * dsb,
- IDirectSoundNotifyImpl **pdsn)
-{
- IDirectSoundNotifyImpl * dsn;
- TRACE("(%p,%p)\n",dsb,pdsn);
-
- dsn = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*dsn));
-
- if (dsn == NULL) {
- WARN("out of memory\n");
- return DSERR_OUTOFMEMORY;
- }
-
- dsn->ref = 0;
- dsn->lpVtbl = &dsnvt;
- dsn->dsb = dsb;
- dsb->notify = dsn;
- IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER)dsb);
-
- *pdsn = dsn;
- return DS_OK;
-}
-
-static HRESULT IDirectSoundNotifyImpl_Destroy(
- IDirectSoundNotifyImpl *pdsn)
-{
- TRACE("(%p)\n",pdsn);
-
- while (IDirectSoundNotifyImpl_Release((LPDIRECTSOUNDNOTIFY)pdsn) > 0);
-
- return DS_OK;
-}
-
-/*******************************************************************************
- * IDirectSoundBuffer
- */
-
-static HRESULT WINAPI IDirectSoundBufferImpl_SetFormat(
- LPDIRECTSOUNDBUFFER8 iface,LPCWAVEFORMATEX wfex
-) {
- IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface;
-
- TRACE("(%p,%p)\n",This,wfex);
- /* This method is not available on secondary buffers */
- WARN("invalid call\n");
- return DSERR_INVALIDCALL;
-}
-
-static HRESULT WINAPI IDirectSoundBufferImpl_SetVolume(
- LPDIRECTSOUNDBUFFER8 iface,LONG vol
-) {
- IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface;
- LONG oldVol;
- HRESULT hres = DS_OK;
-
- TRACE("(%p,%d)\n",This,vol);
-
- if (!(This->dsbd.dwFlags & DSBCAPS_CTRLVOLUME)) {
- WARN("control unavailable: This->dsbd.dwFlags = 0x%08x\n", This->dsbd.dwFlags);
- return DSERR_CONTROLUNAVAIL;
- }
-
- if ((vol > DSBVOLUME_MAX) || (vol < DSBVOLUME_MIN)) {
- WARN("invalid parameter: vol = %d\n", vol);
- return DSERR_INVALIDPARAM;
- }
-
- /* **** */
- RtlAcquireResourceExclusive(&This->lock, TRUE);
-
- if (This->dsbd.dwFlags & DSBCAPS_CTRL3D) {
- oldVol = This->ds3db_lVolume;
- This->ds3db_lVolume = vol;
- if (vol != oldVol)
- /* recalc 3d volume, which in turn recalcs the pans */
- DSOUND_Calc3DBuffer(This);
- } else {
- oldVol = This->volpan.lVolume;
- This->volpan.lVolume = vol;
- if (vol != oldVol)
- DSOUND_RecalcVolPan(&(This->volpan));
- }
-
- if (vol != oldVol) {
- if (This->hwbuf) {
- hres = IDsDriverBuffer_SetVolumePan(This->hwbuf, &(This->volpan));
- if (hres != DS_OK)
- WARN("IDsDriverBuffer_SetVolumePan failed\n");
- }
- }
-
- RtlReleaseResource(&This->lock);
- /* **** */
-
- return hres;
-}
-
-static HRESULT WINAPI IDirectSoundBufferImpl_GetVolume(
- LPDIRECTSOUNDBUFFER8 iface,LPLONG vol
-) {
- IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface;
- TRACE("(%p,%p)\n",This,vol);
-
- if (!(This->dsbd.dwFlags & DSBCAPS_CTRLVOLUME)) {
- WARN("control unavailable\n");
- return DSERR_CONTROLUNAVAIL;
- }
-
- if (vol == NULL) {
- WARN("invalid parameter: vol == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- *vol = This->volpan.lVolume;
-
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSoundBufferImpl_SetFrequency(
- LPDIRECTSOUNDBUFFER8 iface,DWORD freq
-) {
- IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface;
- DWORD oldFreq;
-
- TRACE("(%p,%d)\n",This,freq);
-
- if (!(This->dsbd.dwFlags & DSBCAPS_CTRLFREQUENCY)) {
- WARN("control unavailable\n");
- return DSERR_CONTROLUNAVAIL;
- }
-
- if (freq == DSBFREQUENCY_ORIGINAL)
- freq = This->pwfx->nSamplesPerSec;
-
- if ((freq < DSBFREQUENCY_MIN) || (freq > DSBFREQUENCY_MAX)) {
- WARN("invalid parameter: freq = %d\n", freq);
- return DSERR_INVALIDPARAM;
- }
-
- /* **** */
- RtlAcquireResourceExclusive(&This->lock, TRUE);
-
- oldFreq = This->freq;
- This->freq = freq;
- if (freq != oldFreq) {
- This->freqAdjust = ((DWORD64)This->freq << DSOUND_FREQSHIFT) / This->device->pwfx->nSamplesPerSec;
- This->nAvgBytesPerSec = freq * This->pwfx->nBlockAlign;
- DSOUND_RecalcFormat(This);
- DSOUND_MixToTemporary(This, 0, This->buflen, FALSE);
- }
-
- RtlReleaseResource(&This->lock);
- /* **** */
-
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSoundBufferImpl_Play(
- LPDIRECTSOUNDBUFFER8 iface,DWORD reserved1,DWORD reserved2,DWORD flags
-) {
- HRESULT hres = DS_OK;
- IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface;
- TRACE("(%p,%08x,%08x,%08x)\n",This,reserved1,reserved2,flags);
-
- /* **** */
- RtlAcquireResourceExclusive(&This->lock, TRUE);
-
- This->playflags = flags;
- if (This->state == STATE_STOPPED && !This->hwbuf) {
- This->leadin = TRUE;
- This->state = STATE_STARTING;
- } else if (This->state == STATE_STOPPING)
- This->state = STATE_PLAYING;
- if (This->hwbuf) {
- hres = IDsDriverBuffer_Play(This->hwbuf, 0, 0, This->playflags);
- if (hres != DS_OK)
- WARN("IDsDriverBuffer_Play failed\n");
- else
- This->state = STATE_PLAYING;
- }
-
- RtlReleaseResource(&This->lock);
- /* **** */
-
- return hres;
-}
-
-static HRESULT WINAPI IDirectSoundBufferImpl_Stop(LPDIRECTSOUNDBUFFER8 iface)
-{
- HRESULT hres = DS_OK;
- IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface;
- TRACE("(%p)\n",This);
-
- /* **** */
- RtlAcquireResourceExclusive(&This->lock, TRUE);
-
- if (This->state == STATE_PLAYING)
- This->state = STATE_STOPPING;
- else if (This->state == STATE_STARTING)
- {
- This->state = STATE_STOPPED;
- DSOUND_CheckEvent(This, 0, 0);
- }
- if (This->hwbuf) {
- hres = IDsDriverBuffer_Stop(This->hwbuf);
- if (hres != DS_OK)
- WARN("IDsDriverBuffer_Stop failed\n");
- else
- This->state = STATE_STOPPED;
- }
-
- RtlReleaseResource(&This->lock);
- /* **** */
-
- return hres;
-}
-
-static ULONG WINAPI IDirectSoundBufferImpl_AddRef(LPDIRECTSOUNDBUFFER8 iface)
-{
- IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
-}
-
-static ULONG WINAPI IDirectSoundBufferImpl_Release(LPDIRECTSOUNDBUFFER8 iface)
-{
- IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref + 1);
-
- if (!ref) {
- DirectSoundDevice_RemoveBuffer(This->device, This);
- RtlDeleteResource(&This->lock);
-
- if (This->hwbuf)
- IDsDriverBuffer_Release(This->hwbuf);
- if (!This->hwbuf || (This->device->drvdesc.dwFlags & DSDDESC_USESYSTEMMEMORY)) {
- This->buffer->ref--;
- list_remove(&This->entry);
- if (This->buffer->ref==0) {
- HeapFree(GetProcessHeap(),0,This->buffer->memory);
- HeapFree(GetProcessHeap(),0,This->buffer);
- }
- }
-
- HeapFree(GetProcessHeap(), 0, This->tmp_buffer);
- HeapFree(GetProcessHeap(), 0, This->notifies);
- HeapFree(GetProcessHeap(), 0, This->pwfx);
- HeapFree(GetProcessHeap(), 0, This);
-
- TRACE("(%p) released\n", This);
- }
- return ref;
-}
-
-static HRESULT WINAPI IDirectSoundBufferImpl_GetCurrentPosition(
- LPDIRECTSOUNDBUFFER8 iface,LPDWORD playpos,LPDWORD writepos
-) {
- HRESULT hres;
- IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface;
- TRACE("(%p,%p,%p)\n",This,playpos,writepos);
-
- RtlAcquireResourceShared(&This->lock, TRUE);
- if (This->hwbuf) {
- hres=IDsDriverBuffer_GetPosition(This->hwbuf,playpos,writepos);
- if (hres != DS_OK) {
- WARN("IDsDriverBuffer_GetPosition failed\n");
- return hres;
- }
- } else {
- DWORD pos = This->sec_mixpos;
-
- /* sanity */
- if (pos >= This->buflen){
- FIXME("Bad play position. playpos: %d, buflen: %d\n", pos, This->buflen);
- pos %= This->buflen;
- }
-
- if (playpos)
- *playpos = pos;
- if (writepos)
- *writepos = pos;
- }
- if (writepos && This->state != STATE_STOPPED && (!This->hwbuf || !(This->device->drvdesc.dwFlags & DSDDESC_DONTNEEDWRITELEAD))) {
- /* apply the documented 10ms lead to writepos */
- *writepos += This->writelead;
- *writepos %= This->buflen;
- }
- RtlReleaseResource(&This->lock);
-
- TRACE("playpos = %d, writepos = %d, buflen=%d (%p, time=%d)\n",
- playpos?*playpos:-1, writepos?*writepos:-1, This->buflen, This, GetTickCount());
-
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSoundBufferImpl_GetStatus(
- LPDIRECTSOUNDBUFFER8 iface,LPDWORD status
-) {
- IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface;
- TRACE("(%p,%p), thread is %04x\n",This,status,GetCurrentThreadId());
-
- if (status == NULL) {
- WARN("invalid parameter: status = NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- *status = 0;
- RtlAcquireResourceShared(&This->lock, TRUE);
- if ((This->state == STATE_STARTING) || (This->state == STATE_PLAYING)) {
- *status |= DSBSTATUS_PLAYING;
- if (This->playflags & DSBPLAY_LOOPING)
- *status |= DSBSTATUS_LOOPING;
- }
- RtlReleaseResource(&This->lock);
-
- TRACE("status=%x\n", *status);
- return DS_OK;
-}
-
-
-static HRESULT WINAPI IDirectSoundBufferImpl_GetFormat(
- LPDIRECTSOUNDBUFFER8 iface,
- LPWAVEFORMATEX lpwf,
- DWORD wfsize,
- LPDWORD wfwritten)
-{
- DWORD size;
- IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface;
- TRACE("(%p,%p,%d,%p)\n",This,lpwf,wfsize,wfwritten);
-
- size = sizeof(WAVEFORMATEX) + This->pwfx->cbSize;
-
- if (lpwf) { /* NULL is valid */
- if (wfsize >= size) {
- CopyMemory(lpwf,This->pwfx,size);
- if (wfwritten)
- *wfwritten = size;
- } else {
- WARN("invalid parameter: wfsize too small\n");
- CopyMemory(lpwf,This->pwfx,wfsize);
- if (wfwritten)
- *wfwritten = wfsize;
- return DSERR_INVALIDPARAM;
- }
- } else {
- if (wfwritten)
- *wfwritten = sizeof(WAVEFORMATEX) + This->pwfx->cbSize;
- else {
- WARN("invalid parameter: wfwritten == NULL\n");
- return DSERR_INVALIDPARAM;
- }
- }
-
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSoundBufferImpl_Lock(
- LPDIRECTSOUNDBUFFER8 iface,DWORD writecursor,DWORD writebytes,LPVOID *lplpaudioptr1,LPDWORD audiobytes1,LPVOID *lplpaudioptr2,LPDWORD audiobytes2,DWORD flags
-) {
- HRESULT hres = DS_OK;
- IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface;
-
- TRACE("(%p,%d,%d,%p,%p,%p,%p,0x%08x) at %d\n",
- This,
- writecursor,
- writebytes,
- lplpaudioptr1,
- audiobytes1,
- lplpaudioptr2,
- audiobytes2,
- flags,
- GetTickCount()
- );
-
- if (!audiobytes1)
- return DSERR_INVALIDPARAM;
-
- /* when this flag is set, writecursor is meaningless and must be calculated */
- if (flags & DSBLOCK_FROMWRITECURSOR) {
- /* GetCurrentPosition does too much magic to duplicate here */
- hres = IDirectSoundBufferImpl_GetCurrentPosition(iface, NULL, &writecursor);
- if (hres != DS_OK) {
- WARN("IDirectSoundBufferImpl_GetCurrentPosition failed\n");
- return hres;
- }
- }
-
- /* when this flag is set, writebytes is meaningless and must be set */
- if (flags & DSBLOCK_ENTIREBUFFER)
- writebytes = This->buflen;
-
- if (writecursor >= This->buflen) {
- WARN("Invalid parameter, writecursor: %u >= buflen: %u\n",
- writecursor, This->buflen);
- return DSERR_INVALIDPARAM;
- }
-
- if (writebytes > This->buflen) {
- WARN("Invalid parameter, writebytes: %u > buflen: %u\n",
- writebytes, This->buflen);
- return DSERR_INVALIDPARAM;
- }
-
- /* **** */
- RtlAcquireResourceShared(&This->lock, TRUE);
-
- if (!(This->device->drvdesc.dwFlags & DSDDESC_DONTNEEDSECONDARYLOCK) && This->hwbuf) {
- hres = IDsDriverBuffer_Lock(This->hwbuf,
- lplpaudioptr1, audiobytes1,
- lplpaudioptr2, audiobytes2,
- writecursor, writebytes,
- 0);
- if (hres != DS_OK) {
- WARN("IDsDriverBuffer_Lock failed\n");
- RtlReleaseResource(&This->lock);
- return hres;
- }
- } else {
- if (writecursor+writebytes <= This->buflen) {
- *(LPBYTE*)lplpaudioptr1 = This->buffer->memory+writecursor;
- if (This->sec_mixpos >= writecursor && This->sec_mixpos < writecursor + writebytes && This->state == STATE_PLAYING)
- WARN("Overwriting mixing position, case 1\n");
- *audiobytes1 = writebytes;
- if (lplpaudioptr2)
- *(LPBYTE*)lplpaudioptr2 = NULL;
- if (audiobytes2)
- *audiobytes2 = 0;
- TRACE("Locked %p(%i bytes) and %p(%i bytes) writecursor=%d\n",
- *(LPBYTE*)lplpaudioptr1, *audiobytes1, lplpaudioptr2 ? *(LPBYTE*)lplpaudioptr2 : NULL, audiobytes2 ? *audiobytes2: 0, writecursor);
- TRACE("->%d.0\n",writebytes);
- } else {
- DWORD remainder = writebytes + writecursor - This->buflen;
- *(LPBYTE*)lplpaudioptr1 = This->buffer->memory+writecursor;
- *audiobytes1 = This->buflen-writecursor;
- if (This->sec_mixpos >= writecursor && This->sec_mixpos < writecursor + writebytes && This->state == STATE_PLAYING)
- WARN("Overwriting mixing position, case 2\n");
- if (lplpaudioptr2)
- *(LPBYTE*)lplpaudioptr2 = This->buffer->memory;
- if (audiobytes2)
- *audiobytes2 = writebytes-(This->buflen-writecursor);
- if (audiobytes2 && This->sec_mixpos < remainder && This->state == STATE_PLAYING)
- WARN("Overwriting mixing position, case 3\n");
- TRACE("Locked %p(%i bytes) and %p(%i bytes) writecursor=%d\n", *(LPBYTE*)lplpaudioptr1, *audiobytes1, lplpaudioptr2 ? *(LPBYTE*)lplpaudioptr2 : NULL, audiobytes2 ? *audiobytes2: 0, writecursor);
- }
- }
-
- RtlReleaseResource(&This->lock);
- /* **** */
-
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSoundBufferImpl_SetCurrentPosition(
- LPDIRECTSOUNDBUFFER8 iface,DWORD newpos
-) {
- HRESULT hres = DS_OK;
- IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface;
- DWORD oldpos;
- TRACE("(%p,%d)\n",This,newpos);
-
- /* **** */
- RtlAcquireResourceExclusive(&This->lock, TRUE);
-
- oldpos = This->sec_mixpos;
-
- /* start mixing from this new location instead */
- newpos %= This->buflen;
- newpos -= newpos%This->pwfx->nBlockAlign;
- This->sec_mixpos = newpos;
-
- /* at this point, do not attempt to reset buffers, mess with primary mix position,
- or anything like that to reduce latancy. The data already prebuffered cannot be changed */
-
- /* position HW buffer if applicable, else just start mixing from new location instead */
- if (This->hwbuf) {
- hres = IDsDriverBuffer_SetPosition(This->hwbuf, This->buf_mixpos);
- if (hres != DS_OK)
- WARN("IDsDriverBuffer_SetPosition failed\n");
- }
- else if (oldpos != newpos)
- /* FIXME: Perhaps add a call to DSOUND_MixToTemporary here? Not sure it's needed */
- This->buf_mixpos = DSOUND_secpos_to_bufpos(This, newpos, 0, NULL);
-
- RtlReleaseResource(&This->lock);
- /* **** */
-
- return hres;
-}
-
-static HRESULT WINAPI IDirectSoundBufferImpl_SetPan(
- LPDIRECTSOUNDBUFFER8 iface,LONG pan
-) {
- HRESULT hres = DS_OK;
- IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface;
-
- TRACE("(%p,%d)\n",This,pan);
-
- if ((pan > DSBPAN_RIGHT) || (pan < DSBPAN_LEFT)) {
- WARN("invalid parameter: pan = %d\n", pan);
- return DSERR_INVALIDPARAM;
- }
-
- /* You cannot use both pan and 3D controls */
- if (!(This->dsbd.dwFlags & DSBCAPS_CTRLPAN) ||
- (This->dsbd.dwFlags & DSBCAPS_CTRL3D)) {
- WARN("control unavailable\n");
- return DSERR_CONTROLUNAVAIL;
- }
-
- /* **** */
- RtlAcquireResourceExclusive(&This->lock, TRUE);
-
- if (This->volpan.lPan != pan) {
- This->volpan.lPan = pan;
- DSOUND_RecalcVolPan(&(This->volpan));
-
- if (This->hwbuf) {
- hres = IDsDriverBuffer_SetVolumePan(This->hwbuf, &(This->volpan));
- if (hres != DS_OK)
- WARN("IDsDriverBuffer_SetVolumePan failed\n");
- }
- }
-
- RtlReleaseResource(&This->lock);
- /* **** */
-
- return hres;
-}
-
-static HRESULT WINAPI IDirectSoundBufferImpl_GetPan(
- LPDIRECTSOUNDBUFFER8 iface,LPLONG pan
-) {
- IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface;
- TRACE("(%p,%p)\n",This,pan);
-
- if (!(This->dsbd.dwFlags & DSBCAPS_CTRLPAN)) {
- WARN("control unavailable\n");
- return DSERR_CONTROLUNAVAIL;
- }
-
- if (pan == NULL) {
- WARN("invalid parameter: pan = NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- *pan = This->volpan.lPan;
-
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSoundBufferImpl_Unlock(
- LPDIRECTSOUNDBUFFER8 iface,LPVOID p1,DWORD x1,LPVOID p2,DWORD x2
-) {
- IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface, *iter;
- HRESULT hres = DS_OK;
-
- TRACE("(%p,%p,%d,%p,%d)\n", This,p1,x1,p2,x2);
-
- /* **** */
- RtlAcquireResourceShared(&This->lock, TRUE);
-
- if (!(This->device->drvdesc.dwFlags & DSDDESC_DONTNEEDSECONDARYLOCK) && This->hwbuf) {
- hres = IDsDriverBuffer_Unlock(This->hwbuf, p1, x1, p2, x2);
- if (hres != DS_OK)
- WARN("IDsDriverBuffer_Unlock failed\n");
- }
-
- RtlReleaseResource(&This->lock);
- /* **** */
-
- if (!p2)
- x2 = 0;
-
- if (!This->hwbuf && (x1 || x2))
- {
- RtlAcquireResourceShared(&This->device->buffer_list_lock, TRUE);
- LIST_FOR_EACH_ENTRY(iter, &This->buffer->buffers, IDirectSoundBufferImpl, entry )
- {
- RtlAcquireResourceShared(&iter->lock, TRUE);
- if (x1)
- {
- if(x1 + (DWORD_PTR)p1 - (DWORD_PTR)iter->buffer->memory > iter->buflen)
- hres = DSERR_INVALIDPARAM;
- else
- DSOUND_MixToTemporary(iter, (DWORD_PTR)p1 - (DWORD_PTR)iter->buffer->memory, x1, FALSE);
- }
- if (x2)
- DSOUND_MixToTemporary(iter, 0, x2, FALSE);
- RtlReleaseResource(&iter->lock);
- }
- RtlReleaseResource(&This->device->buffer_list_lock);
- }
-
- return hres;
-}
-
-static HRESULT WINAPI IDirectSoundBufferImpl_Restore(
- LPDIRECTSOUNDBUFFER8 iface
-) {
- IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface;
- FIXME("(%p):stub\n",This);
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSoundBufferImpl_GetFrequency(
- LPDIRECTSOUNDBUFFER8 iface,LPDWORD freq
-) {
- IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface;
- TRACE("(%p,%p)\n",This,freq);
-
- if (freq == NULL) {
- WARN("invalid parameter: freq = NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- *freq = This->freq;
- TRACE("-> %d\n", *freq);
-
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSoundBufferImpl_SetFX(
- LPDIRECTSOUNDBUFFER8 iface,DWORD dwEffectsCount,LPDSEFFECTDESC pDSFXDesc,LPDWORD pdwResultCodes
-) {
- IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface;
- DWORD u;
-
- FIXME("(%p,%u,%p,%p): stub\n",This,dwEffectsCount,pDSFXDesc,pdwResultCodes);
-
- if (pdwResultCodes)
- for (u=0; u<dwEffectsCount; u++) pdwResultCodes[u] = DSFXR_UNKNOWN;
-
- WARN("control unavailable\n");
- return DSERR_CONTROLUNAVAIL;
-}
-
-static HRESULT WINAPI IDirectSoundBufferImpl_AcquireResources(
- LPDIRECTSOUNDBUFFER8 iface,DWORD dwFlags,DWORD dwEffectsCount,LPDWORD pdwResultCodes
-) {
- IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface;
- DWORD u;
-
- FIXME("(%p,%08u,%u,%p): stub\n",This,dwFlags,dwEffectsCount,pdwResultCodes);
-
- if (pdwResultCodes)
- for (u=0; u<dwEffectsCount; u++) pdwResultCodes[u] = DSFXR_UNKNOWN;
-
- WARN("control unavailable\n");
- return DSERR_CONTROLUNAVAIL;
-}
-
-static HRESULT WINAPI IDirectSoundBufferImpl_GetObjectInPath(
- LPDIRECTSOUNDBUFFER8 iface,REFGUID rguidObject,DWORD dwIndex,REFGUID rguidInterface,LPVOID* ppObject
-) {
- IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface;
-
- FIXME("(%p,%s,%u,%s,%p): stub\n",This,debugstr_guid(rguidObject),dwIndex,debugstr_guid(rguidInterface),ppObject);
-
- WARN("control unavailable\n");
- return DSERR_CONTROLUNAVAIL;
-}
-
-static HRESULT WINAPI IDirectSoundBufferImpl_Initialize(
- LPDIRECTSOUNDBUFFER8 iface,LPDIRECTSOUND dsound,LPCDSBUFFERDESC dbsd
-) {
- IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface;
- WARN("(%p) already initialized\n", This);
- return DSERR_ALREADYINITIALIZED;
-}
-
-static HRESULT WINAPI IDirectSoundBufferImpl_GetCaps(
- LPDIRECTSOUNDBUFFER8 iface,LPDSBCAPS caps
-) {
- IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface;
- TRACE("(%p)->(%p)\n",This,caps);
-
- if (caps == NULL) {
- WARN("invalid parameter: caps == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (caps->dwSize < sizeof(*caps)) {
- WARN("invalid parameter: caps->dwSize = %d\n",caps->dwSize);
- return DSERR_INVALIDPARAM;
- }
-
- caps->dwFlags = This->dsbd.dwFlags;
- if (This->hwbuf) caps->dwFlags |= DSBCAPS_LOCHARDWARE;
- else caps->dwFlags |= DSBCAPS_LOCSOFTWARE;
-
- caps->dwBufferBytes = This->buflen;
-
- /* According to windows, this is zero*/
- caps->dwUnlockTransferRate = 0;
- caps->dwPlayCpuOverhead = 0;
-
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSoundBufferImpl_QueryInterface(
- LPDIRECTSOUNDBUFFER8 iface,REFIID riid,LPVOID *ppobj
-) {
- IDirectSoundBufferImpl *This = (IDirectSoundBufferImpl *)iface;
-
- TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
-
- if (ppobj == NULL) {
- WARN("invalid parameter\n");
- return E_INVALIDARG;
- }
-
- *ppobj = NULL; /* assume failure */
-
- if ( IsEqualGUID(riid, &IID_IUnknown) ||
- IsEqualGUID(riid, &IID_IDirectSoundBuffer) ||
- IsEqualGUID(riid, &IID_IDirectSoundBuffer8) ) {
- if (!This->secondary)
- SecondaryBufferImpl_Create(This, &(This->secondary));
- if (This->secondary) {
- IDirectSoundBuffer8_AddRef((LPDIRECTSOUNDBUFFER8)This->secondary);
- *ppobj = This->secondary;
- return S_OK;
- }
- WARN("IID_IDirectSoundBuffer\n");
- return E_NOINTERFACE;
- }
-
- if ( IsEqualGUID( &IID_IDirectSoundNotify, riid ) ) {
- if (!This->notify)
- IDirectSoundNotifyImpl_Create(This, &(This->notify));
- if (This->notify) {
- IDirectSoundNotify_AddRef((LPDIRECTSOUNDNOTIFY)This->notify);
- *ppobj = This->notify;
- return S_OK;
- }
- WARN("IID_IDirectSoundNotify\n");
- return E_NOINTERFACE;
- }
-
- if ( IsEqualGUID( &IID_IDirectSound3DBuffer, riid ) ) {
- if (!This->ds3db)
- IDirectSound3DBufferImpl_Create(This, &(This->ds3db));
- if (This->ds3db) {
- IDirectSound3DBuffer_AddRef((LPDIRECTSOUND3DBUFFER)This->ds3db);
- *ppobj = This->ds3db;
- return S_OK;
- }
- WARN("IID_IDirectSound3DBuffer\n");
- return E_NOINTERFACE;
- }
-
- if ( IsEqualGUID( &IID_IDirectSound3DListener, riid ) ) {
- ERR("app requested IDirectSound3DListener on secondary buffer\n");
- return E_NOINTERFACE;
- }
-
- if ( IsEqualGUID( &IID_IKsPropertySet, riid ) ) {
- if (!This->iks)
- IKsBufferPropertySetImpl_Create(This, &(This->iks));
- if (This->iks) {
- IKsPropertySet_AddRef((LPKSPROPERTYSET)This->iks);
- *ppobj = This->iks;
- return S_OK;
- }
- WARN("IID_IKsPropertySet\n");
- return E_NOINTERFACE;
- }
-
- FIXME( "Unknown IID %s\n", debugstr_guid( riid ) );
-
- return E_NOINTERFACE;
-}
-
-static const IDirectSoundBuffer8Vtbl dsbvt =
-{
- IDirectSoundBufferImpl_QueryInterface,
- IDirectSoundBufferImpl_AddRef,
- IDirectSoundBufferImpl_Release,
- IDirectSoundBufferImpl_GetCaps,
- IDirectSoundBufferImpl_GetCurrentPosition,
- IDirectSoundBufferImpl_GetFormat,
- IDirectSoundBufferImpl_GetVolume,
- IDirectSoundBufferImpl_GetPan,
- IDirectSoundBufferImpl_GetFrequency,
- IDirectSoundBufferImpl_GetStatus,
- IDirectSoundBufferImpl_Initialize,
- IDirectSoundBufferImpl_Lock,
- IDirectSoundBufferImpl_Play,
- IDirectSoundBufferImpl_SetCurrentPosition,
- IDirectSoundBufferImpl_SetFormat,
- IDirectSoundBufferImpl_SetVolume,
- IDirectSoundBufferImpl_SetPan,
- IDirectSoundBufferImpl_SetFrequency,
- IDirectSoundBufferImpl_Stop,
- IDirectSoundBufferImpl_Unlock,
- IDirectSoundBufferImpl_Restore,
- IDirectSoundBufferImpl_SetFX,
- IDirectSoundBufferImpl_AcquireResources,
- IDirectSoundBufferImpl_GetObjectInPath
-};
-
-HRESULT IDirectSoundBufferImpl_Create(
- DirectSoundDevice * device,
- IDirectSoundBufferImpl **pdsb,
- LPCDSBUFFERDESC dsbd)
-{
- IDirectSoundBufferImpl *dsb;
- LPWAVEFORMATEX wfex = dsbd->lpwfxFormat;
- HRESULT err = DS_OK;
- DWORD capf = 0;
- int use_hw, alloc_size, cp_size;
- TRACE("(%p,%p,%p)\n",device,pdsb,dsbd);
-
- if (dsbd->dwBufferBytes < DSBSIZE_MIN || dsbd->dwBufferBytes > DSBSIZE_MAX) {
- WARN("invalid parameter: dsbd->dwBufferBytes = %d\n", dsbd->dwBufferBytes);
- *pdsb = NULL;
- return DSERR_INVALIDPARAM; /* FIXME: which error? */
- }
-
- dsb = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*dsb));
-
- if (dsb == 0) {
- WARN("out of memory\n");
- *pdsb = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- TRACE("Created buffer at %p\n", dsb);
-
- dsb->ref = 0;
- dsb->secondary = 0;
- dsb->device = device;
- dsb->lpVtbl = &dsbvt;
- dsb->iks = NULL;
-
- /* size depends on version */
- CopyMemory(&dsb->dsbd, dsbd, dsbd->dwSize);
-
- /* variable sized struct so calculate size based on format */
- if (wfex->wFormatTag == WAVE_FORMAT_PCM) {
- alloc_size = sizeof(WAVEFORMATEX);
- cp_size = sizeof(PCMWAVEFORMAT);
- } else
- alloc_size = cp_size = sizeof(WAVEFORMATEX) + wfex->cbSize;
-
- dsb->pwfx = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,alloc_size);
- if (dsb->pwfx == NULL) {
- WARN("out of memory\n");
- HeapFree(GetProcessHeap(),0,dsb);
- *pdsb = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- CopyMemory(dsb->pwfx, wfex, cp_size);
-
- if (dsbd->dwBufferBytes % dsbd->lpwfxFormat->nBlockAlign)
- dsb->buflen = dsbd->dwBufferBytes +
- (dsbd->lpwfxFormat->nBlockAlign -
- (dsbd->dwBufferBytes % dsbd->lpwfxFormat->nBlockAlign));
- else
- dsb->buflen = dsbd->dwBufferBytes;
-
- dsb->freq = dsbd->lpwfxFormat->nSamplesPerSec;
- dsb->notify = NULL;
- dsb->notifies = NULL;
- dsb->nrofnotifies = 0;
- dsb->hwnotify = 0;
-
- /* Check necessary hardware mixing capabilities */
- if (wfex->nChannels==2) capf |= DSCAPS_SECONDARYSTEREO;
- else capf |= DSCAPS_SECONDARYMONO;
- if (wfex->wBitsPerSample==16) capf |= DSCAPS_SECONDARY16BIT;
- else capf |= DSCAPS_SECONDARY8BIT;
-
- use_hw = !!(dsbd->dwFlags & DSBCAPS_LOCHARDWARE);
- TRACE("use_hw = %d, capf = 0x%08x, device->drvcaps.dwFlags = 0x%08x\n", use_hw, capf, device->drvcaps.dwFlags);
- if (use_hw && ((device->drvcaps.dwFlags & capf) != capf || !device->driver))
- {
- if (device->driver)
- WARN("Format not supported for hardware buffer\n");
- HeapFree(GetProcessHeap(),0,dsb->pwfx);
- HeapFree(GetProcessHeap(),0,dsb);
- *pdsb = NULL;
- if ((device->drvcaps.dwFlags & capf) != capf)
- return DSERR_BADFORMAT;
- return DSERR_GENERIC;
- }
-
- /* FIXME: check hardware sample rate mixing capabilities */
- /* FIXME: check app hints for software/hardware buffer (STATIC, LOCHARDWARE, etc) */
- /* FIXME: check whether any hardware buffers are left */
- /* FIXME: handle DSDHEAP_CREATEHEAP for hardware buffers */
-
- /* Allocate an empty buffer */
- dsb->buffer = HeapAlloc(GetProcessHeap(),0,sizeof(*(dsb->buffer)));
- if (dsb->buffer == NULL) {
- WARN("out of memory\n");
- HeapFree(GetProcessHeap(),0,dsb->pwfx);
- HeapFree(GetProcessHeap(),0,dsb);
- *pdsb = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- /* Allocate system memory for buffer if applicable */
- if ((device->drvdesc.dwFlags & DSDDESC_USESYSTEMMEMORY) || !use_hw) {
- dsb->buffer->memory = HeapAlloc(GetProcessHeap(),0,dsb->buflen);
- if (dsb->buffer->memory == NULL) {
- WARN("out of memory\n");
- HeapFree(GetProcessHeap(),0,dsb->pwfx);
- HeapFree(GetProcessHeap(),0,dsb->buffer);
- HeapFree(GetProcessHeap(),0,dsb);
- *pdsb = NULL;
- return DSERR_OUTOFMEMORY;
- }
- }
-
- /* Allocate the hardware buffer */
- if (use_hw) {
- err = IDsDriver_CreateSoundBuffer(device->driver,wfex,dsbd->dwFlags,0,
- &(dsb->buflen),&(dsb->buffer->memory),
- (LPVOID*)&(dsb->hwbuf));
- if (FAILED(err))
- {
- WARN("Failed to create hardware secondary buffer: %08x\n", err);
- if (device->drvdesc.dwFlags & DSDDESC_USESYSTEMMEMORY)
- HeapFree(GetProcessHeap(),0,dsb->buffer->memory);
- HeapFree(GetProcessHeap(),0,dsb->buffer);
- HeapFree(GetProcessHeap(),0,dsb->pwfx);
- HeapFree(GetProcessHeap(),0,dsb);
- *pdsb = NULL;
- return DSERR_GENERIC;
- }
- }
-
- dsb->buffer->ref = 1;
- list_init(&dsb->buffer->buffers);
- list_add_head(&dsb->buffer->buffers, &dsb->entry);
- FillMemory(dsb->buffer->memory, dsb->buflen, dsbd->lpwfxFormat->wBitsPerSample == 8 ? 128 : 0);
-
- /* It's not necessary to initialize values to zero since */
- /* we allocated this structure with HEAP_ZERO_MEMORY... */
- dsb->buf_mixpos = dsb->sec_mixpos = 0;
- dsb->state = STATE_STOPPED;
-
- dsb->freqAdjust = ((DWORD64)dsb->freq << DSOUND_FREQSHIFT) / device->pwfx->nSamplesPerSec;
- dsb->nAvgBytesPerSec = dsb->freq *
- dsbd->lpwfxFormat->nBlockAlign;
-
- /* calculate fragment size and write lead */
- DSOUND_RecalcFormat(dsb);
-
- if (dsb->dsbd.dwFlags & DSBCAPS_CTRL3D) {
- dsb->ds3db_ds3db.dwSize = sizeof(DS3DBUFFER);
- dsb->ds3db_ds3db.vPosition.x = 0.0;
- dsb->ds3db_ds3db.vPosition.y = 0.0;
- dsb->ds3db_ds3db.vPosition.z = 0.0;
- dsb->ds3db_ds3db.vVelocity.x = 0.0;
- dsb->ds3db_ds3db.vVelocity.y = 0.0;
- dsb->ds3db_ds3db.vVelocity.z = 0.0;
- dsb->ds3db_ds3db.dwInsideConeAngle = DS3D_DEFAULTCONEANGLE;
- dsb->ds3db_ds3db.dwOutsideConeAngle = DS3D_DEFAULTCONEANGLE;
- dsb->ds3db_ds3db.vConeOrientation.x = 0.0;
- dsb->ds3db_ds3db.vConeOrientation.y = 0.0;
- dsb->ds3db_ds3db.vConeOrientation.z = 0.0;
- dsb->ds3db_ds3db.lConeOutsideVolume = DS3D_DEFAULTCONEOUTSIDEVOLUME;
- dsb->ds3db_ds3db.flMinDistance = DS3D_DEFAULTMINDISTANCE;
- dsb->ds3db_ds3db.flMaxDistance = DS3D_DEFAULTMAXDISTANCE;
- dsb->ds3db_ds3db.dwMode = DS3DMODE_NORMAL;
-
- dsb->ds3db_need_recalc = FALSE;
- DSOUND_Calc3DBuffer(dsb);
- } else
- DSOUND_RecalcVolPan(&(dsb->volpan));
-
- RtlInitializeResource(&dsb->lock);
-
- /* register buffer if not primary */
- if (!(dsbd->dwFlags & DSBCAPS_PRIMARYBUFFER)) {
- err = DirectSoundDevice_AddBuffer(device, dsb);
- if (err != DS_OK) {
- HeapFree(GetProcessHeap(),0,dsb->buffer->memory);
- HeapFree(GetProcessHeap(),0,dsb->buffer);
- RtlDeleteResource(&dsb->lock);
- HeapFree(GetProcessHeap(),0,dsb->pwfx);
- HeapFree(GetProcessHeap(),0,dsb);
- dsb = NULL;
- }
- }
-
- *pdsb = dsb;
- return err;
-}
-
-HRESULT IDirectSoundBufferImpl_Destroy(
- IDirectSoundBufferImpl *pdsb)
-{
- TRACE("(%p)\n",pdsb);
-
- /* This keeps the *_Destroy functions from possibly deleting
- * this object until it is ready to be deleted */
- IDirectSoundBufferImpl_AddRef((LPDIRECTSOUNDBUFFER8)pdsb);
-
- if (pdsb->iks) {
- WARN("iks not NULL\n");
- IKsBufferPropertySetImpl_Destroy(pdsb->iks);
- pdsb->iks = NULL;
- }
-
- if (pdsb->ds3db) {
- WARN("ds3db not NULL\n");
- IDirectSound3DBufferImpl_Destroy(pdsb->ds3db);
- pdsb->ds3db = NULL;
- }
-
- if (pdsb->notify) {
- WARN("notify not NULL\n");
- IDirectSoundNotifyImpl_Destroy(pdsb->notify);
- pdsb->notify = NULL;
- }
-
- if (pdsb->secondary) {
- WARN("dsb not NULL\n");
- SecondaryBufferImpl_Destroy(pdsb->secondary);
- pdsb->secondary = NULL;
- }
-
- while (IDirectSoundBuffer8_Release((LPDIRECTSOUNDBUFFER8)pdsb) > 0);
-
- return S_OK;
-}
-
-HRESULT IDirectSoundBufferImpl_Duplicate(
- DirectSoundDevice *device,
- IDirectSoundBufferImpl **ppdsb,
- IDirectSoundBufferImpl *pdsb)
-{
- IDirectSoundBufferImpl *dsb;
- HRESULT hres = DS_OK;
- int size;
- TRACE("(%p,%p,%p)\n", device, pdsb, pdsb);
-
- dsb = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*dsb));
-
- if (dsb == NULL) {
- WARN("out of memory\n");
- *ppdsb = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- CopyMemory(dsb, pdsb, sizeof(IDirectSoundBufferImpl));
-
- if (pdsb->hwbuf) {
- TRACE("duplicating hardware buffer\n");
-
- hres = IDsDriver_DuplicateSoundBuffer(device->driver, pdsb->hwbuf,
- (LPVOID *)&dsb->hwbuf);
- if (FAILED(hres)) {
- WARN("IDsDriver_DuplicateSoundBuffer failed (%08x)\n", hres);
- HeapFree(GetProcessHeap(),0,dsb);
- *ppdsb = NULL;
- return hres;
- }
- }
-
- dsb->buffer->ref++;
- list_add_head(&dsb->buffer->buffers, &dsb->entry);
- dsb->ref = 0;
- dsb->state = STATE_STOPPED;
- dsb->buf_mixpos = dsb->sec_mixpos = 0;
- dsb->device = device;
- dsb->ds3db = NULL;
- dsb->iks = NULL; /* FIXME? */
- dsb->secondary = NULL;
- dsb->tmp_buffer = NULL;
- DSOUND_RecalcFormat(dsb);
- DSOUND_MixToTemporary(dsb, 0, dsb->buflen, FALSE);
-
- /* variable sized struct so calculate size based on format */
- size = sizeof(WAVEFORMATEX) + pdsb->pwfx->cbSize;
-
- dsb->pwfx = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,size);
- if (dsb->pwfx == NULL) {
- WARN("out of memory\n");
- HeapFree(GetProcessHeap(),0,dsb->buffer);
- HeapFree(GetProcessHeap(),0,dsb);
- *ppdsb = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- CopyMemory(dsb->pwfx, pdsb->pwfx, size);
-
- RtlInitializeResource(&dsb->lock);
-
- /* register buffer */
- hres = DirectSoundDevice_AddBuffer(device, dsb);
- if (hres != DS_OK) {
- RtlDeleteResource(&dsb->lock);
- HeapFree(GetProcessHeap(),0,dsb->tmp_buffer);
- HeapFree(GetProcessHeap(),0,dsb->buffer);
- HeapFree(GetProcessHeap(),0,dsb->pwfx);
- HeapFree(GetProcessHeap(),0,dsb);
- *ppdsb = 0;
- }
-
- *ppdsb = dsb;
- return hres;
-}
-
-/*******************************************************************************
- * SecondaryBuffer
- */
-
-static HRESULT WINAPI SecondaryBufferImpl_QueryInterface(
- LPDIRECTSOUNDBUFFER8 iface,REFIID riid,LPVOID *ppobj)
-{
- SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
- TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
-
- return IDirectSoundBufferImpl_QueryInterface((LPDIRECTSOUNDBUFFER8)This->dsb,riid,ppobj);
-}
-
-static ULONG WINAPI SecondaryBufferImpl_AddRef(LPDIRECTSOUNDBUFFER8 iface)
-{
- SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
-}
-
-static ULONG WINAPI SecondaryBufferImpl_Release(LPDIRECTSOUNDBUFFER8 iface)
-{
- SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
- ULONG ref;
- TRACE("(%p)\n", This);
- ref = InterlockedDecrement(&(This->ref));
- TRACE("ref was %d\n", ref + 1);
-
- if (!ref) {
- This->dsb->secondary = NULL;
- IDirectSoundBuffer_Release((LPDIRECTSOUNDBUFFER8)This->dsb);
- HeapFree(GetProcessHeap(), 0, This);
- TRACE("(%p) released\n", This);
- }
- return ref;
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_GetCaps(
- LPDIRECTSOUNDBUFFER8 iface,LPDSBCAPS caps)
-{
- SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
- TRACE("(%p)->(%p)\n",This,caps);
-
- return IDirectSoundBufferImpl_GetCaps((LPDIRECTSOUNDBUFFER8)This->dsb,caps);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_GetCurrentPosition(
- LPDIRECTSOUNDBUFFER8 iface,LPDWORD playpos,LPDWORD writepos)
-{
- SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
- TRACE("(%p,%p,%p)\n",This,playpos,writepos);
-
- return IDirectSoundBufferImpl_GetCurrentPosition((LPDIRECTSOUNDBUFFER8)This->dsb,playpos,writepos);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_GetFormat(
- LPDIRECTSOUNDBUFFER8 iface,LPWAVEFORMATEX lpwf,DWORD wfsize,LPDWORD wfwritten)
-{
- SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
- TRACE("(%p,%p,%d,%p)\n",This,lpwf,wfsize,wfwritten);
-
- return IDirectSoundBufferImpl_GetFormat((LPDIRECTSOUNDBUFFER8)This->dsb,lpwf,wfsize,wfwritten);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_GetVolume(
- LPDIRECTSOUNDBUFFER8 iface,LPLONG vol)
-{
- SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
- TRACE("(%p,%p)\n",This,vol);
-
- return IDirectSoundBufferImpl_GetVolume((LPDIRECTSOUNDBUFFER8)This->dsb,vol);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_GetPan(
- LPDIRECTSOUNDBUFFER8 iface,LPLONG pan)
-{
- SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
- TRACE("(%p,%p)\n",This,pan);
-
- return IDirectSoundBufferImpl_GetPan((LPDIRECTSOUNDBUFFER8)This->dsb,pan);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_GetFrequency(
- LPDIRECTSOUNDBUFFER8 iface,LPDWORD freq)
-{
- SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
- TRACE("(%p,%p)\n",This,freq);
-
- return IDirectSoundBufferImpl_GetFrequency((LPDIRECTSOUNDBUFFER8)This->dsb,freq);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_GetStatus(
- LPDIRECTSOUNDBUFFER8 iface,LPDWORD status)
-{
- SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
- TRACE("(%p,%p)\n",This,status);
-
- return IDirectSoundBufferImpl_GetStatus((LPDIRECTSOUNDBUFFER8)This->dsb,status);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_Initialize(
- LPDIRECTSOUNDBUFFER8 iface,LPDIRECTSOUND dsound,LPCDSBUFFERDESC dbsd)
-{
- SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
- TRACE("(%p,%p,%p)\n",This,dsound,dbsd);
-
- return IDirectSoundBufferImpl_Initialize((LPDIRECTSOUNDBUFFER8)This->dsb,dsound,dbsd);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_Lock(
- LPDIRECTSOUNDBUFFER8 iface,
- DWORD writecursor,
- DWORD writebytes,
- LPVOID *lplpaudioptr1,
- LPDWORD audiobytes1,
- LPVOID *lplpaudioptr2,
- LPDWORD audiobytes2,
- DWORD dwFlags)
-{
- SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
- TRACE("(%p,%d,%d,%p,%p,%p,%p,0x%08x)\n",
- This,writecursor,writebytes,lplpaudioptr1,audiobytes1,lplpaudioptr2,audiobytes2,dwFlags);
-
- return IDirectSoundBufferImpl_Lock((LPDIRECTSOUNDBUFFER8)This->dsb,
- writecursor,writebytes,lplpaudioptr1,audiobytes1,lplpaudioptr2,audiobytes2,dwFlags);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_Play(
- LPDIRECTSOUNDBUFFER8 iface,DWORD reserved1,DWORD reserved2,DWORD flags)
-{
- SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
- TRACE("(%p,%08x,%08x,%08x)\n",This,reserved1,reserved2,flags);
-
- return IDirectSoundBufferImpl_Play((LPDIRECTSOUNDBUFFER8)This->dsb,reserved1,reserved2,flags);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_SetCurrentPosition(
- LPDIRECTSOUNDBUFFER8 iface,DWORD newpos)
-{
- SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
- TRACE("(%p,%d)\n",This,newpos);
-
- return IDirectSoundBufferImpl_SetCurrentPosition((LPDIRECTSOUNDBUFFER8)This->dsb,newpos);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_SetFormat(
- LPDIRECTSOUNDBUFFER8 iface,LPCWAVEFORMATEX wfex)
-{
- SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
- TRACE("(%p,%p)\n",This,wfex);
-
- return IDirectSoundBufferImpl_SetFormat((LPDIRECTSOUNDBUFFER8)This->dsb,wfex);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_SetVolume(
- LPDIRECTSOUNDBUFFER8 iface,LONG vol)
-{
- SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
- TRACE("(%p,%d)\n",This,vol);
-
- return IDirectSoundBufferImpl_SetVolume((LPDIRECTSOUNDBUFFER8)This->dsb,vol);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_SetPan(
- LPDIRECTSOUNDBUFFER8 iface,LONG pan)
-{
- SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
- TRACE("(%p,%d)\n",This,pan);
-
- return IDirectSoundBufferImpl_SetPan((LPDIRECTSOUNDBUFFER8)This->dsb,pan);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_SetFrequency(
- LPDIRECTSOUNDBUFFER8 iface,DWORD freq)
-{
- SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
- TRACE("(%p,%d)\n",This,freq);
-
- return IDirectSoundBufferImpl_SetFrequency((LPDIRECTSOUNDBUFFER8)This->dsb,freq);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_Stop(LPDIRECTSOUNDBUFFER8 iface)
-{
- SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
- TRACE("(%p)\n",This);
-
- return IDirectSoundBufferImpl_Stop((LPDIRECTSOUNDBUFFER8)This->dsb);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_Unlock(
- LPDIRECTSOUNDBUFFER8 iface,
- LPVOID lpvAudioPtr1,
- DWORD dwAudioBytes1,
- LPVOID lpvAudioPtr2,
- DWORD dwAudioBytes2)
-{
- SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
- TRACE("(%p,%p,%d,%p,%d)\n",
- This, lpvAudioPtr1, dwAudioBytes1, lpvAudioPtr2, dwAudioBytes2);
-
- return IDirectSoundBufferImpl_Unlock((LPDIRECTSOUNDBUFFER8)This->dsb,
- lpvAudioPtr1,dwAudioBytes1,lpvAudioPtr2,dwAudioBytes2);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_Restore(
- LPDIRECTSOUNDBUFFER8 iface)
-{
- SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
- TRACE("(%p)\n",This);
-
- return IDirectSoundBufferImpl_Restore((LPDIRECTSOUNDBUFFER8)This->dsb);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_SetFX(
- LPDIRECTSOUNDBUFFER8 iface,DWORD dwEffectsCount,LPDSEFFECTDESC pDSFXDesc,LPDWORD pdwResultCodes)
-{
- SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
- TRACE("(%p,%u,%p,%p)\n",This,dwEffectsCount,pDSFXDesc,pdwResultCodes);
-
- return IDirectSoundBufferImpl_SetFX((LPDIRECTSOUNDBUFFER8)This->dsb,dwEffectsCount,pDSFXDesc,pdwResultCodes);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_AcquireResources(
- LPDIRECTSOUNDBUFFER8 iface,DWORD dwFlags,DWORD dwEffectsCount,LPDWORD pdwResultCodes)
-{
- SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
- TRACE("(%p,%08u,%u,%p)\n",This,dwFlags,dwEffectsCount,pdwResultCodes);
-
- return IDirectSoundBufferImpl_AcquireResources((LPDIRECTSOUNDBUFFER8)This->dsb,dwFlags,dwEffectsCount,pdwResultCodes);
-}
-
-static HRESULT WINAPI SecondaryBufferImpl_GetObjectInPath(
- LPDIRECTSOUNDBUFFER8 iface,REFGUID rguidObject,DWORD dwIndex,REFGUID rguidInterface,LPVOID* ppObject)
-{
- SecondaryBufferImpl *This = (SecondaryBufferImpl *)iface;
- TRACE("(%p,%s,%u,%s,%p)\n",This,debugstr_guid(rguidObject),dwIndex,debugstr_guid(rguidInterface),ppObject);
-
- return IDirectSoundBufferImpl_GetObjectInPath((LPDIRECTSOUNDBUFFER8)This->dsb,rguidObject,dwIndex,rguidInterface,ppObject);
-}
-
-static const IDirectSoundBuffer8Vtbl sbvt =
-{
- SecondaryBufferImpl_QueryInterface,
- SecondaryBufferImpl_AddRef,
- SecondaryBufferImpl_Release,
- SecondaryBufferImpl_GetCaps,
- SecondaryBufferImpl_GetCurrentPosition,
- SecondaryBufferImpl_GetFormat,
- SecondaryBufferImpl_GetVolume,
- SecondaryBufferImpl_GetPan,
- SecondaryBufferImpl_GetFrequency,
- SecondaryBufferImpl_GetStatus,
- SecondaryBufferImpl_Initialize,
- SecondaryBufferImpl_Lock,
- SecondaryBufferImpl_Play,
- SecondaryBufferImpl_SetCurrentPosition,
- SecondaryBufferImpl_SetFormat,
- SecondaryBufferImpl_SetVolume,
- SecondaryBufferImpl_SetPan,
- SecondaryBufferImpl_SetFrequency,
- SecondaryBufferImpl_Stop,
- SecondaryBufferImpl_Unlock,
- SecondaryBufferImpl_Restore,
- SecondaryBufferImpl_SetFX,
- SecondaryBufferImpl_AcquireResources,
- SecondaryBufferImpl_GetObjectInPath
-};
-
-HRESULT SecondaryBufferImpl_Create(
- IDirectSoundBufferImpl *dsb,
- SecondaryBufferImpl **psb)
-{
- SecondaryBufferImpl *sb;
- TRACE("(%p,%p)\n",dsb,psb);
-
- sb = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*sb));
-
- if (sb == 0) {
- WARN("out of memory\n");
- *psb = NULL;
- return DSERR_OUTOFMEMORY;
- }
- sb->ref = 0;
- sb->dsb = dsb;
- sb->lpVtbl = &sbvt;
-
- IDirectSoundBuffer8_AddRef((LPDIRECTSOUNDBUFFER8)dsb);
- *psb = sb;
- return S_OK;
-}
-
-static HRESULT SecondaryBufferImpl_Destroy(
- SecondaryBufferImpl *pdsb)
-{
- TRACE("(%p)\n",pdsb);
-
- while (SecondaryBufferImpl_Release((LPDIRECTSOUNDBUFFER8)pdsb) > 0);
-
- return S_OK;
-}
+++ /dev/null
-/* DirectSoundCapture
- *
- * Copyright 1998 Marcus Meissner
- * Copyright 1998 Rob Riggs
- * Copyright 2000-2001 TransGaming Technologies, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-/*
- * TODO:
- * Implement FX support.
- * Implement both IDirectSoundCaptureBuffer and IDirectSoundCaptureBuffer8
- * Make DirectSoundCaptureCreate and DirectSoundCaptureCreate8 behave differently
- */
-
-#include <stdarg.h>
-
-#define NONAMELESSSTRUCT
-#define NONAMELESSUNION
-#include "windef.h"
-#include "winbase.h"
-#include "winuser.h"
-#include "mmsystem.h"
-#include "mmddk.h"
-#include "winternl.h"
-#include "winnls.h"
-#include "wine/debug.h"
-#include "dsound.h"
-#include "dsdriver.h"
-#include "dsound_private.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(dsound);
-
-/*****************************************************************************
- * IDirectSoundCapture implementation structure
- */
-struct IDirectSoundCaptureImpl
-{
- /* IUnknown fields */
- const IDirectSoundCaptureVtbl *lpVtbl;
- LONG ref;
-
- DirectSoundCaptureDevice *device;
-};
-
-static HRESULT IDirectSoundCaptureImpl_Create(LPDIRECTSOUNDCAPTURE8 * ppds);
-
-
-/*****************************************************************************
- * IDirectSoundCaptureNotify implementation structure
- */
-struct IDirectSoundCaptureNotifyImpl
-{
- /* IUnknown fields */
- const IDirectSoundNotifyVtbl *lpVtbl;
- LONG ref;
- IDirectSoundCaptureBufferImpl* dscb;
-};
-
-static HRESULT IDirectSoundCaptureNotifyImpl_Create(IDirectSoundCaptureBufferImpl *dscb,
- IDirectSoundCaptureNotifyImpl ** pdscn);
-
-
-DirectSoundCaptureDevice * DSOUND_capture[MAXWAVEDRIVERS];
-
-static HRESULT DirectSoundCaptureDevice_Create(DirectSoundCaptureDevice ** ppDevice);
-
-static const char * const captureStateString[] = {
- "STATE_STOPPED",
- "STATE_STARTING",
- "STATE_CAPTURING",
- "STATE_STOPPING"
-};
-
-HRESULT DSOUND_CaptureCreate(
- REFIID riid,
- LPDIRECTSOUNDCAPTURE *ppDSC)
-{
- LPDIRECTSOUNDCAPTURE pDSC;
- HRESULT hr;
- TRACE("(%s, %p)\n", debugstr_guid(riid), ppDSC);
-
- if (!IsEqualIID(riid, &IID_IUnknown) &&
- !IsEqualIID(riid, &IID_IDirectSoundCapture)) {
- *ppDSC = 0;
- return E_NOINTERFACE;
- }
-
- /* Get dsound configuration */
- setup_dsound_options();
-
- hr = IDirectSoundCaptureImpl_Create(&pDSC);
- if (hr == DS_OK) {
- IDirectSoundCapture_AddRef(pDSC);
- *ppDSC = pDSC;
- } else {
- WARN("IDirectSoundCaptureImpl_Create failed\n");
- *ppDSC = 0;
- }
-
- return hr;
-}
-
-HRESULT DSOUND_CaptureCreate8(
- REFIID riid,
- LPDIRECTSOUNDCAPTURE8 *ppDSC8)
-{
- LPDIRECTSOUNDCAPTURE8 pDSC8;
- HRESULT hr;
- TRACE("(%s, %p)\n", debugstr_guid(riid), ppDSC8);
-
- if (!IsEqualIID(riid, &IID_IUnknown) &&
- !IsEqualIID(riid, &IID_IDirectSoundCapture8)) {
- *ppDSC8 = 0;
- return E_NOINTERFACE;
- }
-
- /* Get dsound configuration */
- setup_dsound_options();
-
- hr = IDirectSoundCaptureImpl_Create(&pDSC8);
- if (hr == DS_OK) {
- IDirectSoundCapture_AddRef(pDSC8);
- *ppDSC8 = pDSC8;
- } else {
- WARN("IDirectSoundCaptureImpl_Create failed\n");
- *ppDSC8 = 0;
- }
-
- return hr;
-}
-
-/***************************************************************************
- * DirectSoundCaptureCreate [DSOUND.6]
- *
- * Create and initialize a DirectSoundCapture interface.
- *
- * PARAMS
- * lpcGUID [I] Address of the GUID that identifies the sound capture device.
- * lplpDSC [O] Address of a variable to receive the interface pointer.
- * pUnkOuter [I] Must be NULL.
- *
- * RETURNS
- * Success: DS_OK
- * Failure: DSERR_NOAGGREGATION, DSERR_ALLOCATED, DSERR_INVALIDPARAM,
- * DSERR_OUTOFMEMORY
- *
- * NOTES
- * lpcGUID must be one of the values returned from DirectSoundCaptureEnumerate
- * or NULL for the default device or DSDEVID_DefaultCapture or
- * DSDEVID_DefaultVoiceCapture.
- *
- * DSERR_ALLOCATED is returned for sound devices that do not support full duplex.
- */
-HRESULT WINAPI DirectSoundCaptureCreate(
- LPCGUID lpcGUID,
- LPDIRECTSOUNDCAPTURE *ppDSC,
- LPUNKNOWN pUnkOuter)
-{
- HRESULT hr;
- LPDIRECTSOUNDCAPTURE pDSC;
- TRACE("(%s,%p,%p)\n", debugstr_guid(lpcGUID), ppDSC, pUnkOuter);
-
- if (ppDSC == NULL) {
- WARN("invalid parameter: ppDSC == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (pUnkOuter) {
- WARN("invalid parameter: pUnkOuter != NULL\n");
- *ppDSC = NULL;
- return DSERR_NOAGGREGATION;
- }
-
- hr = DSOUND_CaptureCreate(&IID_IDirectSoundCapture, &pDSC);
- if (hr == DS_OK) {
- hr = IDirectSoundCapture_Initialize(pDSC, lpcGUID);
- if (hr != DS_OK) {
- IDirectSoundCapture_Release(pDSC);
- pDSC = 0;
- }
- }
-
- *ppDSC = pDSC;
-
- return hr;
-}
-
-/***************************************************************************
- * DirectSoundCaptureCreate8 [DSOUND.12]
- *
- * Create and initialize a DirectSoundCapture interface.
- *
- * PARAMS
- * lpcGUID [I] Address of the GUID that identifies the sound capture device.
- * lplpDSC [O] Address of a variable to receive the interface pointer.
- * pUnkOuter [I] Must be NULL.
- *
- * RETURNS
- * Success: DS_OK
- * Failure: DSERR_NOAGGREGATION, DSERR_ALLOCATED, DSERR_INVALIDPARAM,
- * DSERR_OUTOFMEMORY
- *
- * NOTES
- * lpcGUID must be one of the values returned from DirectSoundCaptureEnumerate
- * or NULL for the default device or DSDEVID_DefaultCapture or
- * DSDEVID_DefaultVoiceCapture.
- *
- * DSERR_ALLOCATED is returned for sound devices that do not support full duplex.
- */
-HRESULT WINAPI DirectSoundCaptureCreate8(
- LPCGUID lpcGUID,
- LPDIRECTSOUNDCAPTURE8 *ppDSC8,
- LPUNKNOWN pUnkOuter)
-{
- HRESULT hr;
- LPDIRECTSOUNDCAPTURE8 pDSC8;
- TRACE("(%s,%p,%p)\n", debugstr_guid(lpcGUID), ppDSC8, pUnkOuter);
-
- if (ppDSC8 == NULL) {
- WARN("invalid parameter: ppDSC8 == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (pUnkOuter) {
- WARN("invalid parameter: pUnkOuter != NULL\n");
- *ppDSC8 = NULL;
- return DSERR_NOAGGREGATION;
- }
-
- hr = DSOUND_CaptureCreate8(&IID_IDirectSoundCapture8, &pDSC8);
- if (hr == DS_OK) {
- hr = IDirectSoundCapture_Initialize(pDSC8, lpcGUID);
- if (hr != DS_OK) {
- IDirectSoundCapture_Release(pDSC8);
- pDSC8 = 0;
- }
- }
-
- *ppDSC8 = pDSC8;
-
- return hr;
-}
-
-/***************************************************************************
- * DirectSoundCaptureEnumerateA [DSOUND.7]
- *
- * Enumerate all DirectSound drivers installed in the system.
- *
- * PARAMS
- * lpDSEnumCallback [I] Address of callback function.
- * lpContext [I] Address of user defined context passed to callback function.
- *
- * RETURNS
- * Success: DS_OK
- * Failure: DSERR_INVALIDPARAM
- */
-HRESULT WINAPI
-DirectSoundCaptureEnumerateA(
- LPDSENUMCALLBACKA lpDSEnumCallback,
- LPVOID lpContext)
-{
- unsigned devs, wid;
- DSDRIVERDESC desc;
- GUID guid;
- int err;
-
- TRACE("(%p,%p)\n", lpDSEnumCallback, lpContext );
-
- if (lpDSEnumCallback == NULL) {
- WARN("invalid parameter: lpDSEnumCallback == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- devs = waveInGetNumDevs();
- if (devs > 0) {
- if (GetDeviceID(&DSDEVID_DefaultCapture, &guid) == DS_OK) {
- for (wid = 0; wid < devs; ++wid) {
- if (IsEqualGUID( &guid, &DSOUND_capture_guids[wid] ) ) {
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- TRACE("calling lpDSEnumCallback(NULL,\"%s\",\"%s\",%p)\n",
- "Primary Sound Capture Driver",desc.szDrvname,lpContext);
- if (lpDSEnumCallback(NULL, "Primary Sound Capture Driver", desc.szDrvname, lpContext) == FALSE)
- return DS_OK;
- }
- }
- }
- }
- }
-
- for (wid = 0; wid < devs; ++wid) {
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- TRACE("calling lpDSEnumCallback(%s,\"%s\",\"%s\",%p)\n",
- debugstr_guid(&DSOUND_capture_guids[wid]),desc.szDesc,desc.szDrvname,lpContext);
- if (lpDSEnumCallback(&DSOUND_capture_guids[wid], desc.szDesc, desc.szDrvname, lpContext) == FALSE)
- return DS_OK;
- }
- }
-
- return DS_OK;
-}
-
-/***************************************************************************
- * DirectSoundCaptureEnumerateW [DSOUND.8]
- *
- * Enumerate all DirectSound drivers installed in the system.
- *
- * PARAMS
- * lpDSEnumCallback [I] Address of callback function.
- * lpContext [I] Address of user defined context passed to callback function.
- *
- * RETURNS
- * Success: DS_OK
- * Failure: DSERR_INVALIDPARAM
- */
-HRESULT WINAPI
-DirectSoundCaptureEnumerateW(
- LPDSENUMCALLBACKW lpDSEnumCallback,
- LPVOID lpContext)
-{
- unsigned devs, wid;
- DSDRIVERDESC desc;
- GUID guid;
- int err;
- WCHAR wDesc[MAXPNAMELEN];
- WCHAR wName[MAXPNAMELEN];
-
- TRACE("(%p,%p)\n", lpDSEnumCallback, lpContext );
-
- if (lpDSEnumCallback == NULL) {
- WARN("invalid parameter: lpDSEnumCallback == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- devs = waveInGetNumDevs();
- if (devs > 0) {
- if (GetDeviceID(&DSDEVID_DefaultCapture, &guid) == DS_OK) {
- for (wid = 0; wid < devs; ++wid) {
- if (IsEqualGUID( &guid, &DSOUND_capture_guids[wid] ) ) {
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- TRACE("calling lpDSEnumCallback(NULL,\"%s\",\"%s\",%p)\n",
- "Primary Sound Capture Driver",desc.szDrvname,lpContext);
- MultiByteToWideChar( CP_ACP, 0, "Primary Sound Capture Driver", -1,
- wDesc, sizeof(wDesc)/sizeof(WCHAR) );
- MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1,
- wName, sizeof(wName)/sizeof(WCHAR) );
- if (lpDSEnumCallback(NULL, wDesc, wName, lpContext) == FALSE)
- return DS_OK;
- }
- }
- }
- }
- }
-
- for (wid = 0; wid < devs; ++wid) {
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- TRACE("calling lpDSEnumCallback(%s,\"%s\",\"%s\",%p)\n",
- debugstr_guid(&DSOUND_capture_guids[wid]),desc.szDesc,desc.szDrvname,lpContext);
- MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1,
- wDesc, sizeof(wDesc)/sizeof(WCHAR) );
- MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1,
- wName, sizeof(wName)/sizeof(WCHAR) );
- if (lpDSEnumCallback(&DSOUND_capture_guids[wid], wDesc, wName, lpContext) == FALSE)
- return DS_OK;
- }
- }
-
- return DS_OK;
-}
-
-static void capture_CheckNotify(IDirectSoundCaptureBufferImpl *This, DWORD from, DWORD len)
-{
- int i;
- for (i = 0; i < This->nrofnotifies; ++i) {
- LPDSBPOSITIONNOTIFY event = This->notifies + i;
- DWORD offset = event->dwOffset;
- TRACE("checking %d, position %d, event = %p\n", i, offset, event->hEventNotify);
-
- if (offset == DSBPN_OFFSETSTOP) {
- if (!from && !len) {
- SetEvent(event->hEventNotify);
- TRACE("signalled event %p (%d)\n", event->hEventNotify, i);
- return;
- }
- else return;
- }
-
- if (offset >= from && offset < (from + len))
- {
- TRACE("signalled event %p (%d)\n", event->hEventNotify, i);
- SetEvent(event->hEventNotify);
- }
- }
-}
-
-static void CALLBACK
-DSOUND_capture_callback(HWAVEIN hwi, UINT msg, DWORD_PTR dwUser, DWORD_PTR dw1,
- DWORD_PTR dw2)
-{
- DirectSoundCaptureDevice * This = (DirectSoundCaptureDevice*)dwUser;
- IDirectSoundCaptureBufferImpl * Moi = This->capture_buffer;
- TRACE("(%p,%08x(%s),%08lx,%08lx,%08lx) entering at %d\n",hwi,msg,
- msg == MM_WIM_OPEN ? "MM_WIM_OPEN" : msg == MM_WIM_CLOSE ? "MM_WIM_CLOSE" :
- msg == MM_WIM_DATA ? "MM_WIM_DATA" : "UNKNOWN",dwUser,dw1,dw2,GetTickCount());
-
- if (msg == MM_WIM_DATA) {
- EnterCriticalSection( &(This->lock) );
- TRACE("DirectSoundCapture msg=MM_WIM_DATA, old This->state=%s, old This->index=%d\n",
- captureStateString[This->state],This->index);
- if (This->state != STATE_STOPPED) {
- int index = This->index;
- if (This->state == STATE_STARTING)
- This->state = STATE_CAPTURING;
- capture_CheckNotify(Moi, (DWORD_PTR)This->pwave[index].lpData - (DWORD_PTR)This->buffer, This->pwave[index].dwBufferLength);
- This->index = (This->index + 1) % This->nrofpwaves;
- if ( (This->index == 0) && !(This->capture_buffer->flags & DSCBSTART_LOOPING) ) {
- TRACE("end of buffer\n");
- This->state = STATE_STOPPED;
- capture_CheckNotify(Moi, 0, 0);
- } else {
- if (This->state == STATE_CAPTURING) {
- waveInUnprepareHeader(hwi, &(This->pwave[index]), sizeof(WAVEHDR));
- waveInPrepareHeader(hwi, &(This->pwave[index]), sizeof(WAVEHDR));
- waveInAddBuffer(hwi, &(This->pwave[index]), sizeof(WAVEHDR));
- } else if (This->state == STATE_STOPPING) {
- TRACE("stopping\n");
- This->state = STATE_STOPPED;
- }
- }
- }
- TRACE("DirectSoundCapture new This->state=%s, new This->index=%d\n",
- captureStateString[This->state],This->index);
- LeaveCriticalSection( &(This->lock) );
- }
-
- TRACE("completed\n");
-}
-
-/***************************************************************************
- * IDirectSoundCaptureImpl
- */
-static HRESULT WINAPI
-IDirectSoundCaptureImpl_QueryInterface(
- LPDIRECTSOUNDCAPTURE iface,
- REFIID riid,
- LPVOID* ppobj )
-{
- IDirectSoundCaptureImpl *This = (IDirectSoundCaptureImpl *)iface;
- TRACE( "(%p,%s,%p)\n", This, debugstr_guid(riid), ppobj );
-
- if (ppobj == NULL) {
- WARN("invalid parameter\n");
- return E_INVALIDARG;
- }
-
- *ppobj = NULL;
-
- if (IsEqualIID(riid, &IID_IUnknown)) {
- IDirectSoundCapture_AddRef((LPDIRECTSOUNDCAPTURE)This);
- *ppobj = This;
- return DS_OK;
- } else if (IsEqualIID(riid, &IID_IDirectSoundCapture)) {
- IDirectSoundCapture_AddRef((LPDIRECTSOUNDCAPTURE)This);
- *ppobj = This;
- return DS_OK;
- }
-
- WARN("unsupported riid: %s\n", debugstr_guid(riid));
- return E_NOINTERFACE;
-}
-
-static ULONG WINAPI
-IDirectSoundCaptureImpl_AddRef( LPDIRECTSOUNDCAPTURE iface )
-{
- IDirectSoundCaptureImpl *This = (IDirectSoundCaptureImpl *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
-}
-
-static ULONG WINAPI
-IDirectSoundCaptureImpl_Release( LPDIRECTSOUNDCAPTURE iface )
-{
- IDirectSoundCaptureImpl *This = (IDirectSoundCaptureImpl *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref + 1);
-
- if (!ref) {
- if (This->device)
- DirectSoundCaptureDevice_Release(This->device);
-
- HeapFree( GetProcessHeap(), 0, This );
- TRACE("(%p) released\n", This);
- }
- return ref;
-}
-
-HRESULT WINAPI IDirectSoundCaptureImpl_CreateCaptureBuffer(
- LPDIRECTSOUNDCAPTURE iface,
- LPCDSCBUFFERDESC lpcDSCBufferDesc,
- LPDIRECTSOUNDCAPTUREBUFFER* lplpDSCaptureBuffer,
- LPUNKNOWN pUnk )
-{
- HRESULT hr;
- IDirectSoundCaptureImpl *This = (IDirectSoundCaptureImpl *)iface;
-
- TRACE( "(%p,%p,%p,%p)\n",iface,lpcDSCBufferDesc,lplpDSCaptureBuffer,pUnk);
-
- if (lpcDSCBufferDesc == NULL) {
- WARN("invalid parameter: lpcDSCBufferDesc == NULL)\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (lplpDSCaptureBuffer == NULL) {
- WARN("invalid parameter: lplpDSCaptureBuffer == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (pUnk != NULL) {
- WARN("invalid parameter: pUnk != NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- /* FIXME: We can only have one buffer so what do we do here? */
- if (This->device->capture_buffer) {
- WARN("lnvalid parameter: already has buffer\n");
- return DSERR_INVALIDPARAM; /* DSERR_GENERIC ? */
- }
-
- hr = IDirectSoundCaptureBufferImpl_Create(This->device,
- (IDirectSoundCaptureBufferImpl **)lplpDSCaptureBuffer, lpcDSCBufferDesc);
-
- if (hr != DS_OK)
- WARN("IDirectSoundCaptureBufferImpl_Create failed\n");
-
- return hr;
-}
-
-HRESULT WINAPI IDirectSoundCaptureImpl_GetCaps(
- LPDIRECTSOUNDCAPTURE iface,
- LPDSCCAPS lpDSCCaps )
-{
- IDirectSoundCaptureImpl *This = (IDirectSoundCaptureImpl *)iface;
- TRACE("(%p,%p)\n",This,lpDSCCaps);
-
- if (This->device == NULL) {
- WARN("not initialized\n");
- return DSERR_UNINITIALIZED;
- }
-
- if (lpDSCCaps== NULL) {
- WARN("invalid parameter: lpDSCCaps== NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (lpDSCCaps->dwSize < sizeof(*lpDSCCaps)) {
- WARN("invalid parameter: lpDSCCaps->dwSize = %d\n", lpDSCCaps->dwSize);
- return DSERR_INVALIDPARAM;
- }
-
- lpDSCCaps->dwFlags = This->device->drvcaps.dwFlags;
- lpDSCCaps->dwFormats = This->device->drvcaps.dwFormats;
- lpDSCCaps->dwChannels = This->device->drvcaps.dwChannels;
-
- TRACE("(flags=0x%08x,format=0x%08x,channels=%d)\n",lpDSCCaps->dwFlags,
- lpDSCCaps->dwFormats, lpDSCCaps->dwChannels);
-
- return DS_OK;
-}
-
-HRESULT WINAPI IDirectSoundCaptureImpl_Initialize(
- LPDIRECTSOUNDCAPTURE iface,
- LPCGUID lpcGUID )
-{
- IDirectSoundCaptureImpl *This = (IDirectSoundCaptureImpl *)iface;
- TRACE("(%p,%s)\n", This, debugstr_guid(lpcGUID));
-
- if (This->device != NULL) {
- WARN("already initialized\n");
- return DSERR_ALREADYINITIALIZED;
- }
- return DirectSoundCaptureDevice_Initialize(&This->device, lpcGUID);
-}
-
-static const IDirectSoundCaptureVtbl dscvt =
-{
- /* IUnknown methods */
- IDirectSoundCaptureImpl_QueryInterface,
- IDirectSoundCaptureImpl_AddRef,
- IDirectSoundCaptureImpl_Release,
-
- /* IDirectSoundCapture methods */
- IDirectSoundCaptureImpl_CreateCaptureBuffer,
- IDirectSoundCaptureImpl_GetCaps,
- IDirectSoundCaptureImpl_Initialize
-};
-
-static HRESULT IDirectSoundCaptureImpl_Create(
- LPDIRECTSOUNDCAPTURE8 * ppDSC)
-{
- IDirectSoundCaptureImpl *pDSC;
- TRACE("(%p)\n", ppDSC);
-
- /* Allocate memory */
- pDSC = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectSoundCaptureImpl));
- if (pDSC == NULL) {
- WARN("out of memory\n");
- *ppDSC = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- pDSC->lpVtbl = &dscvt;
- pDSC->ref = 0;
- pDSC->device = NULL;
-
- *ppDSC = (LPDIRECTSOUNDCAPTURE8)pDSC;
-
- return DS_OK;
-}
-
-/*******************************************************************************
- * IDirectSoundCaptureNotify
- */
-static HRESULT WINAPI IDirectSoundCaptureNotifyImpl_QueryInterface(
- LPDIRECTSOUNDNOTIFY iface,
- REFIID riid,
- LPVOID *ppobj)
-{
- IDirectSoundCaptureNotifyImpl *This = (IDirectSoundCaptureNotifyImpl *)iface;
- TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
-
- if (This->dscb == NULL) {
- WARN("invalid parameter\n");
- return E_INVALIDARG;
- }
-
- return IDirectSoundCaptureBuffer_QueryInterface((LPDIRECTSOUNDCAPTUREBUFFER)This->dscb, riid, ppobj);
-}
-
-static ULONG WINAPI IDirectSoundCaptureNotifyImpl_AddRef(LPDIRECTSOUNDNOTIFY iface)
-{
- IDirectSoundCaptureNotifyImpl *This = (IDirectSoundCaptureNotifyImpl *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
-}
-
-static ULONG WINAPI IDirectSoundCaptureNotifyImpl_Release(LPDIRECTSOUNDNOTIFY iface)
-{
- IDirectSoundCaptureNotifyImpl *This = (IDirectSoundCaptureNotifyImpl *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref + 1);
-
- if (!ref) {
- if (This->dscb->hwnotify)
- IDsDriverNotify_Release(This->dscb->hwnotify);
- This->dscb->notify=NULL;
- IDirectSoundCaptureBuffer_Release((LPDIRECTSOUNDCAPTUREBUFFER)This->dscb);
- HeapFree(GetProcessHeap(),0,This);
- TRACE("(%p) released\n", This);
- }
- return ref;
-}
-
-static HRESULT WINAPI IDirectSoundCaptureNotifyImpl_SetNotificationPositions(
- LPDIRECTSOUNDNOTIFY iface,
- DWORD howmuch,
- LPCDSBPOSITIONNOTIFY notify)
-{
- IDirectSoundCaptureNotifyImpl *This = (IDirectSoundCaptureNotifyImpl *)iface;
- TRACE("(%p,0x%08x,%p)\n",This,howmuch,notify);
-
- if (howmuch > 0 && notify == NULL) {
- WARN("invalid parameter: notify == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (TRACE_ON(dsound)) {
- unsigned int i;
- for (i=0;i<howmuch;i++)
- TRACE("notify at %d to %p\n",
- notify[i].dwOffset,notify[i].hEventNotify);
- }
-
- if (This->dscb->hwnotify) {
- HRESULT hres;
- hres = IDsDriverNotify_SetNotificationPositions(This->dscb->hwnotify, howmuch, notify);
- if (hres != DS_OK)
- WARN("IDsDriverNotify_SetNotificationPositions failed\n");
- return hres;
- } else if (howmuch > 0) {
- /* Make an internal copy of the caller-supplied array.
- * Replace the existing copy if one is already present. */
- if (This->dscb->notifies)
- This->dscb->notifies = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
- This->dscb->notifies, howmuch * sizeof(DSBPOSITIONNOTIFY));
- else
- This->dscb->notifies = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
- howmuch * sizeof(DSBPOSITIONNOTIFY));
-
- if (This->dscb->notifies == NULL) {
- WARN("out of memory\n");
- return DSERR_OUTOFMEMORY;
- }
- CopyMemory(This->dscb->notifies, notify, howmuch * sizeof(DSBPOSITIONNOTIFY));
- This->dscb->nrofnotifies = howmuch;
- } else {
- HeapFree(GetProcessHeap(), 0, This->dscb->notifies);
- This->dscb->notifies = NULL;
- This->dscb->nrofnotifies = 0;
- }
-
- return S_OK;
-}
-
-static const IDirectSoundNotifyVtbl dscnvt =
-{
- IDirectSoundCaptureNotifyImpl_QueryInterface,
- IDirectSoundCaptureNotifyImpl_AddRef,
- IDirectSoundCaptureNotifyImpl_Release,
- IDirectSoundCaptureNotifyImpl_SetNotificationPositions,
-};
-
-static HRESULT IDirectSoundCaptureNotifyImpl_Create(
- IDirectSoundCaptureBufferImpl *dscb,
- IDirectSoundCaptureNotifyImpl **pdscn)
-{
- IDirectSoundCaptureNotifyImpl * dscn;
- TRACE("(%p,%p)\n",dscb,pdscn);
-
- dscn = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*dscn));
-
- if (dscn == NULL) {
- WARN("out of memory\n");
- return DSERR_OUTOFMEMORY;
- }
-
- dscn->ref = 0;
- dscn->lpVtbl = &dscnvt;
- dscn->dscb = dscb;
- dscb->notify = dscn;
- IDirectSoundCaptureBuffer_AddRef((LPDIRECTSOUNDCAPTUREBUFFER)dscb);
-
- *pdscn = dscn;
- return DS_OK;
-}
-
-/*******************************************************************************
- * IDirectSoundCaptureBuffer
- */
-static HRESULT WINAPI
-IDirectSoundCaptureBufferImpl_QueryInterface(
- LPDIRECTSOUNDCAPTUREBUFFER8 iface,
- REFIID riid,
- LPVOID* ppobj )
-{
- IDirectSoundCaptureBufferImpl *This = (IDirectSoundCaptureBufferImpl *)iface;
- HRESULT hres;
- TRACE( "(%p,%s,%p)\n", This, debugstr_guid(riid), ppobj );
-
- if (ppobj == NULL) {
- WARN("invalid parameter\n");
- return E_INVALIDARG;
- }
-
- *ppobj = NULL;
-
- if ( IsEqualGUID( &IID_IDirectSoundNotify, riid ) ) {
- if (!This->notify)
- hres = IDirectSoundCaptureNotifyImpl_Create(This, &This->notify);
- if (This->notify) {
- IDirectSoundNotify_AddRef((LPDIRECTSOUNDNOTIFY)This->notify);
- if (This->device->hwbuf && !This->hwnotify) {
- hres = IDsCaptureDriverBuffer_QueryInterface(This->device->hwbuf,
- &IID_IDsDriverNotify, (LPVOID*)&(This->hwnotify));
- if (hres != DS_OK) {
- WARN("IDsCaptureDriverBuffer_QueryInterface failed\n");
- IDirectSoundNotify_Release((LPDIRECTSOUNDNOTIFY)This->notify);
- *ppobj = 0;
- return hres;
- }
- }
-
- *ppobj = This->notify;
- return DS_OK;
- }
-
- WARN("IID_IDirectSoundNotify\n");
- return E_FAIL;
- }
-
- if ( IsEqualGUID( &IID_IDirectSoundCaptureBuffer, riid ) ||
- IsEqualGUID( &IID_IDirectSoundCaptureBuffer8, riid ) ) {
- IDirectSoundCaptureBuffer8_AddRef(iface);
- *ppobj = This;
- return NO_ERROR;
- }
-
- FIXME("(%p,%s,%p) unsupported GUID\n", This, debugstr_guid(riid), ppobj);
- return E_NOINTERFACE;
-}
-
-static ULONG WINAPI
-IDirectSoundCaptureBufferImpl_AddRef( LPDIRECTSOUNDCAPTUREBUFFER8 iface )
-{
- IDirectSoundCaptureBufferImpl *This = (IDirectSoundCaptureBufferImpl *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
-}
-
-static ULONG WINAPI
-IDirectSoundCaptureBufferImpl_Release( LPDIRECTSOUNDCAPTUREBUFFER8 iface )
-{
- IDirectSoundCaptureBufferImpl *This = (IDirectSoundCaptureBufferImpl *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref + 1);
-
- if (!ref) {
- TRACE("deleting object\n");
- if (This->device->state == STATE_CAPTURING)
- This->device->state = STATE_STOPPING;
-
- HeapFree(GetProcessHeap(),0, This->pdscbd);
-
- if (This->device->hwi) {
- waveInReset(This->device->hwi);
- waveInClose(This->device->hwi);
- HeapFree(GetProcessHeap(),0, This->device->pwave);
- This->device->pwave = 0;
- This->device->hwi = 0;
- }
-
- if (This->device->hwbuf)
- IDsCaptureDriverBuffer_Release(This->device->hwbuf);
-
- /* remove from DirectSoundCaptureDevice */
- This->device->capture_buffer = NULL;
-
- if (This->notify)
- IDirectSoundNotify_Release((LPDIRECTSOUNDNOTIFY)This->notify);
-
- /* If driver manages its own buffer, IDsCaptureDriverBuffer_Release
- should have freed the buffer. Prevent freeing it again in
- IDirectSoundCaptureBufferImpl_Create */
- if (!(This->device->drvdesc.dwFlags & DSDDESC_USESYSTEMMEMORY))
- This->device->buffer = NULL;
-
- HeapFree(GetProcessHeap(), 0, This->notifies);
- HeapFree( GetProcessHeap(), 0, This );
- TRACE("(%p) released\n", This);
- }
- return ref;
-}
-
-static HRESULT WINAPI
-IDirectSoundCaptureBufferImpl_GetCaps(
- LPDIRECTSOUNDCAPTUREBUFFER8 iface,
- LPDSCBCAPS lpDSCBCaps )
-{
- IDirectSoundCaptureBufferImpl *This = (IDirectSoundCaptureBufferImpl *)iface;
- TRACE( "(%p,%p)\n", This, lpDSCBCaps );
-
- if (lpDSCBCaps == NULL) {
- WARN("invalid parameter: lpDSCBCaps == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (lpDSCBCaps->dwSize < sizeof(DSCBCAPS)) {
- WARN("invalid parameter: lpDSCBCaps->dwSize = %d\n", lpDSCBCaps->dwSize);
- return DSERR_INVALIDPARAM;
- }
-
- if (This->device == NULL) {
- WARN("invalid parameter: This->device == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- lpDSCBCaps->dwSize = sizeof(DSCBCAPS);
- lpDSCBCaps->dwFlags = This->flags;
- lpDSCBCaps->dwBufferBytes = This->pdscbd->dwBufferBytes;
- lpDSCBCaps->dwReserved = 0;
-
- TRACE("returning DS_OK\n");
- return DS_OK;
-}
-
-static HRESULT WINAPI
-IDirectSoundCaptureBufferImpl_GetCurrentPosition(
- LPDIRECTSOUNDCAPTUREBUFFER8 iface,
- LPDWORD lpdwCapturePosition,
- LPDWORD lpdwReadPosition )
-{
- IDirectSoundCaptureBufferImpl *This = (IDirectSoundCaptureBufferImpl *)iface;
- HRESULT hres = DS_OK;
- TRACE( "(%p,%p,%p)\n", This, lpdwCapturePosition, lpdwReadPosition );
-
- if (This->device == NULL) {
- WARN("invalid parameter: This->device == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (This->device->driver) {
- hres = IDsCaptureDriverBuffer_GetPosition(This->device->hwbuf, lpdwCapturePosition, lpdwReadPosition );
- if (hres != DS_OK)
- WARN("IDsCaptureDriverBuffer_GetPosition failed\n");
- } else if (This->device->hwi) {
- DWORD pos;
-
- EnterCriticalSection(&This->device->lock);
- pos = (DWORD_PTR)This->device->pwave[This->device->index].lpData - (DWORD_PTR)This->device->buffer;
- if (lpdwCapturePosition)
- *lpdwCapturePosition = (This->device->pwave[This->device->index].dwBufferLength + pos) % This->device->buflen;
- if (lpdwReadPosition)
- *lpdwReadPosition = pos;
- LeaveCriticalSection(&This->device->lock);
-
- } else {
- WARN("no driver\n");
- hres = DSERR_NODRIVER;
- }
-
- TRACE("cappos=%d readpos=%d\n", (lpdwCapturePosition?*lpdwCapturePosition:-1), (lpdwReadPosition?*lpdwReadPosition:-1));
- TRACE("returning %08x\n", hres);
- return hres;
-}
-
-static HRESULT WINAPI
-IDirectSoundCaptureBufferImpl_GetFormat(
- LPDIRECTSOUNDCAPTUREBUFFER8 iface,
- LPWAVEFORMATEX lpwfxFormat,
- DWORD dwSizeAllocated,
- LPDWORD lpdwSizeWritten )
-{
- IDirectSoundCaptureBufferImpl *This = (IDirectSoundCaptureBufferImpl *)iface;
- HRESULT hres = DS_OK;
- TRACE( "(%p,%p,0x%08x,%p)\n", This, lpwfxFormat, dwSizeAllocated,
- lpdwSizeWritten );
-
- if (This->device == NULL) {
- WARN("invalid parameter: This->device == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (dwSizeAllocated > (sizeof(WAVEFORMATEX) + This->device->pwfx->cbSize))
- dwSizeAllocated = sizeof(WAVEFORMATEX) + This->device->pwfx->cbSize;
-
- if (lpwfxFormat) { /* NULL is valid (just want size) */
- CopyMemory(lpwfxFormat, This->device->pwfx, dwSizeAllocated);
- if (lpdwSizeWritten)
- *lpdwSizeWritten = dwSizeAllocated;
- } else {
- if (lpdwSizeWritten)
- *lpdwSizeWritten = sizeof(WAVEFORMATEX) + This->device->pwfx->cbSize;
- else {
- TRACE("invalid parameter: lpdwSizeWritten = NULL\n");
- hres = DSERR_INVALIDPARAM;
- }
- }
-
- TRACE("returning %08x\n", hres);
- return hres;
-}
-
-static HRESULT WINAPI
-IDirectSoundCaptureBufferImpl_GetStatus(
- LPDIRECTSOUNDCAPTUREBUFFER8 iface,
- LPDWORD lpdwStatus )
-{
- IDirectSoundCaptureBufferImpl *This = (IDirectSoundCaptureBufferImpl *)iface;
- TRACE( "(%p, %p), thread is %04x\n", This, lpdwStatus, GetCurrentThreadId() );
-
- if (This->device == NULL) {
- WARN("invalid parameter: This->device == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (lpdwStatus == NULL) {
- WARN("invalid parameter: lpdwStatus == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- *lpdwStatus = 0;
- EnterCriticalSection(&(This->device->lock));
-
- TRACE("old This->device->state=%s, old lpdwStatus=%08x\n",
- captureStateString[This->device->state],*lpdwStatus);
- if ((This->device->state == STATE_STARTING) ||
- (This->device->state == STATE_CAPTURING)) {
- *lpdwStatus |= DSCBSTATUS_CAPTURING;
- if (This->flags & DSCBSTART_LOOPING)
- *lpdwStatus |= DSCBSTATUS_LOOPING;
- }
- TRACE("new This->device->state=%s, new lpdwStatus=%08x\n",
- captureStateString[This->device->state],*lpdwStatus);
- LeaveCriticalSection(&(This->device->lock));
-
- TRACE("status=%x\n", *lpdwStatus);
- TRACE("returning DS_OK\n");
- return DS_OK;
-}
-
-static HRESULT WINAPI
-IDirectSoundCaptureBufferImpl_Initialize(
- LPDIRECTSOUNDCAPTUREBUFFER8 iface,
- LPDIRECTSOUNDCAPTURE lpDSC,
- LPCDSCBUFFERDESC lpcDSCBDesc )
-{
- IDirectSoundCaptureBufferImpl *This = (IDirectSoundCaptureBufferImpl *)iface;
-
- FIXME( "(%p,%p,%p): stub\n", This, lpDSC, lpcDSCBDesc );
-
- return DS_OK;
-}
-
-static HRESULT WINAPI
-IDirectSoundCaptureBufferImpl_Lock(
- LPDIRECTSOUNDCAPTUREBUFFER8 iface,
- DWORD dwReadCusor,
- DWORD dwReadBytes,
- LPVOID* lplpvAudioPtr1,
- LPDWORD lpdwAudioBytes1,
- LPVOID* lplpvAudioPtr2,
- LPDWORD lpdwAudioBytes2,
- DWORD dwFlags )
-{
- HRESULT hres = DS_OK;
- IDirectSoundCaptureBufferImpl *This = (IDirectSoundCaptureBufferImpl *)iface;
- TRACE( "(%p,%08u,%08u,%p,%p,%p,%p,0x%08x) at %d\n", This, dwReadCusor,
- dwReadBytes, lplpvAudioPtr1, lpdwAudioBytes1, lplpvAudioPtr2,
- lpdwAudioBytes2, dwFlags, GetTickCount() );
-
- if (This->device == NULL) {
- WARN("invalid parameter: This->device == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (lplpvAudioPtr1 == NULL) {
- WARN("invalid parameter: lplpvAudioPtr1 == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (lpdwAudioBytes1 == NULL) {
- WARN("invalid parameter: lpdwAudioBytes1 == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- EnterCriticalSection(&(This->device->lock));
-
- if (This->device->driver) {
- hres = IDsCaptureDriverBuffer_Lock(This->device->hwbuf, lplpvAudioPtr1,
- lpdwAudioBytes1, lplpvAudioPtr2,
- lpdwAudioBytes2, dwReadCusor,
- dwReadBytes, dwFlags);
- if (hres != DS_OK)
- WARN("IDsCaptureDriverBuffer_Lock failed\n");
- } else if (This->device->hwi) {
- *lplpvAudioPtr1 = This->device->buffer + dwReadCusor;
- if ( (dwReadCusor + dwReadBytes) > This->device->buflen) {
- *lpdwAudioBytes1 = This->device->buflen - dwReadCusor;
- if (lplpvAudioPtr2)
- *lplpvAudioPtr2 = This->device->buffer;
- if (lpdwAudioBytes2)
- *lpdwAudioBytes2 = dwReadBytes - *lpdwAudioBytes1;
- } else {
- *lpdwAudioBytes1 = dwReadBytes;
- if (lplpvAudioPtr2)
- *lplpvAudioPtr2 = 0;
- if (lpdwAudioBytes2)
- *lpdwAudioBytes2 = 0;
- }
- } else {
- TRACE("invalid call\n");
- hres = DSERR_INVALIDCALL; /* DSERR_NODRIVER ? */
- }
-
- LeaveCriticalSection(&(This->device->lock));
-
- TRACE("returning %08x\n", hres);
- return hres;
-}
-
-static HRESULT WINAPI
-IDirectSoundCaptureBufferImpl_Start(
- LPDIRECTSOUNDCAPTUREBUFFER8 iface,
- DWORD dwFlags )
-{
- HRESULT hres = DS_OK;
- IDirectSoundCaptureBufferImpl *This = (IDirectSoundCaptureBufferImpl *)iface;
- TRACE( "(%p,0x%08x)\n", This, dwFlags );
-
- if (This->device == NULL) {
- WARN("invalid parameter: This->device == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if ( (This->device->driver == 0) && (This->device->hwi == 0) ) {
- WARN("no driver\n");
- return DSERR_NODRIVER;
- }
-
- EnterCriticalSection(&(This->device->lock));
-
- This->flags = dwFlags;
- TRACE("old This->state=%s\n",captureStateString[This->device->state]);
- if (This->device->state == STATE_STOPPED)
- This->device->state = STATE_STARTING;
- else if (This->device->state == STATE_STOPPING)
- This->device->state = STATE_CAPTURING;
- TRACE("new This->device->state=%s\n",captureStateString[This->device->state]);
-
- LeaveCriticalSection(&(This->device->lock));
-
- if (This->device->driver) {
- hres = IDsCaptureDriverBuffer_Start(This->device->hwbuf, dwFlags);
- if (hres != DS_OK)
- WARN("IDsCaptureDriverBuffer_Start failed\n");
- } else if (This->device->hwi) {
- DirectSoundCaptureDevice *device = This->device;
-
- if (device->buffer) {
- int c;
- DWORD blocksize = DSOUND_fraglen(device->pwfx->nSamplesPerSec, device->pwfx->nBlockAlign);
- device->nrofpwaves = device->buflen / blocksize + !!(device->buflen % blocksize);
- TRACE("nrofpwaves=%d\n", device->nrofpwaves);
-
- /* prepare headers */
- if (device->pwave)
- device->pwave = HeapReAlloc(GetProcessHeap(), 0,device->pwave, device->nrofpwaves*sizeof(WAVEHDR));
- else
- device->pwave = HeapAlloc(GetProcessHeap(), 0, device->nrofpwaves*sizeof(WAVEHDR));
-
- for (c = 0; c < device->nrofpwaves; ++c) {
- device->pwave[c].lpData = (char *)device->buffer + c * blocksize;
- if (c + 1 == device->nrofpwaves)
- device->pwave[c].dwBufferLength = device->buflen - c * blocksize;
- else
- device->pwave[c].dwBufferLength = blocksize;
- device->pwave[c].dwBytesRecorded = 0;
- device->pwave[c].dwUser = (DWORD_PTR)device;
- device->pwave[c].dwFlags = 0;
- device->pwave[c].dwLoops = 0;
- hres = mmErr(waveInPrepareHeader(device->hwi, &(device->pwave[c]),sizeof(WAVEHDR)));
- if (hres != DS_OK) {
- WARN("waveInPrepareHeader failed\n");
- while (c--)
- waveInUnprepareHeader(device->hwi, &(device->pwave[c]),sizeof(WAVEHDR));
- break;
- }
-
- hres = mmErr(waveInAddBuffer(device->hwi, &(device->pwave[c]), sizeof(WAVEHDR)));
- if (hres != DS_OK) {
- WARN("waveInAddBuffer failed\n");
- while (c--)
- waveInUnprepareHeader(device->hwi, &(device->pwave[c]),sizeof(WAVEHDR));
- break;
- }
- }
-
- FillMemory(device->buffer, device->buflen, (device->pwfx->wBitsPerSample == 8) ? 128 : 0);
- }
-
- device->index = 0;
-
- if (hres == DS_OK) {
- /* start filling the first buffer */
- hres = mmErr(waveInStart(device->hwi));
- if (hres != DS_OK)
- WARN("waveInStart failed\n");
- }
-
- if (hres != DS_OK) {
- WARN("calling waveInClose because of error\n");
- waveInClose(device->hwi);
- device->hwi = 0;
- }
- } else {
- WARN("no driver\n");
- hres = DSERR_NODRIVER;
- }
-
- TRACE("returning %08x\n", hres);
- return hres;
-}
-
-static HRESULT WINAPI
-IDirectSoundCaptureBufferImpl_Stop( LPDIRECTSOUNDCAPTUREBUFFER8 iface )
-{
- HRESULT hres = DS_OK;
- IDirectSoundCaptureBufferImpl *This = (IDirectSoundCaptureBufferImpl *)iface;
- TRACE( "(%p)\n", This );
-
- if (This->device == NULL) {
- WARN("invalid parameter: This->device == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- EnterCriticalSection(&(This->device->lock));
-
- TRACE("old This->device->state=%s\n",captureStateString[This->device->state]);
- if (This->device->state == STATE_CAPTURING)
- This->device->state = STATE_STOPPING;
- else if (This->device->state == STATE_STARTING)
- This->device->state = STATE_STOPPED;
- TRACE("new This->device->state=%s\n",captureStateString[This->device->state]);
-
- LeaveCriticalSection(&(This->device->lock));
-
- if (This->device->driver) {
- hres = IDsCaptureDriverBuffer_Stop(This->device->hwbuf);
- if (hres != DS_OK)
- WARN("IDsCaptureDriverBuffer_Stop() failed\n");
- } else if (This->device->hwi) {
- hres = mmErr(waveInReset(This->device->hwi));
- if (hres != DS_OK)
- WARN("waveInReset() failed\n");
- } else {
- WARN("no driver\n");
- hres = DSERR_NODRIVER;
- }
-
- TRACE("returning %08x\n", hres);
- return hres;
-}
-
-static HRESULT WINAPI
-IDirectSoundCaptureBufferImpl_Unlock(
- LPDIRECTSOUNDCAPTUREBUFFER8 iface,
- LPVOID lpvAudioPtr1,
- DWORD dwAudioBytes1,
- LPVOID lpvAudioPtr2,
- DWORD dwAudioBytes2 )
-{
- HRESULT hres = DS_OK;
- IDirectSoundCaptureBufferImpl *This = (IDirectSoundCaptureBufferImpl *)iface;
- TRACE( "(%p,%p,%08u,%p,%08u)\n", This, lpvAudioPtr1, dwAudioBytes1,
- lpvAudioPtr2, dwAudioBytes2 );
-
- if (lpvAudioPtr1 == NULL) {
- WARN("invalid parameter: lpvAudioPtr1 == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (This->device->driver) {
- hres = IDsCaptureDriverBuffer_Unlock(This->device->hwbuf, lpvAudioPtr1,
- dwAudioBytes1, lpvAudioPtr2, dwAudioBytes2);
- if (hres != DS_OK)
- WARN("IDsCaptureDriverBuffer_Unlock failed\n");
- } else if (!This->device->hwi) {
- WARN("invalid call\n");
- hres = DSERR_INVALIDCALL;
- }
-
- TRACE("returning %08x\n", hres);
- return hres;
-}
-
-static HRESULT WINAPI
-IDirectSoundCaptureBufferImpl_GetObjectInPath(
- LPDIRECTSOUNDCAPTUREBUFFER8 iface,
- REFGUID rguidObject,
- DWORD dwIndex,
- REFGUID rguidInterface,
- LPVOID* ppObject )
-{
- IDirectSoundCaptureBufferImpl *This = (IDirectSoundCaptureBufferImpl *)iface;
-
- FIXME( "(%p,%s,%u,%s,%p): stub\n", This, debugstr_guid(rguidObject),
- dwIndex, debugstr_guid(rguidInterface), ppObject );
-
- return DS_OK;
-}
-
-static HRESULT WINAPI
-IDirectSoundCaptureBufferImpl_GetFXStatus(
- LPDIRECTSOUNDCAPTUREBUFFER8 iface,
- DWORD dwFXCount,
- LPDWORD pdwFXStatus )
-{
- IDirectSoundCaptureBufferImpl *This = (IDirectSoundCaptureBufferImpl *)iface;
-
- FIXME( "(%p,%u,%p): stub\n", This, dwFXCount, pdwFXStatus );
-
- return DS_OK;
-}
-
-static const IDirectSoundCaptureBuffer8Vtbl dscbvt =
-{
- /* IUnknown methods */
- IDirectSoundCaptureBufferImpl_QueryInterface,
- IDirectSoundCaptureBufferImpl_AddRef,
- IDirectSoundCaptureBufferImpl_Release,
-
- /* IDirectSoundCaptureBuffer methods */
- IDirectSoundCaptureBufferImpl_GetCaps,
- IDirectSoundCaptureBufferImpl_GetCurrentPosition,
- IDirectSoundCaptureBufferImpl_GetFormat,
- IDirectSoundCaptureBufferImpl_GetStatus,
- IDirectSoundCaptureBufferImpl_Initialize,
- IDirectSoundCaptureBufferImpl_Lock,
- IDirectSoundCaptureBufferImpl_Start,
- IDirectSoundCaptureBufferImpl_Stop,
- IDirectSoundCaptureBufferImpl_Unlock,
-
- /* IDirectSoundCaptureBuffer methods */
- IDirectSoundCaptureBufferImpl_GetObjectInPath,
- IDirectSoundCaptureBufferImpl_GetFXStatus
-};
-
-HRESULT IDirectSoundCaptureBufferImpl_Create(
- DirectSoundCaptureDevice *device,
- IDirectSoundCaptureBufferImpl ** ppobj,
- LPCDSCBUFFERDESC lpcDSCBufferDesc)
-{
- LPWAVEFORMATEX wfex;
- TRACE( "(%p,%p,%p)\n", device, ppobj, lpcDSCBufferDesc);
-
- if (ppobj == NULL) {
- WARN("invalid parameter: ppobj == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (!device) {
- WARN("not initialized\n");
- *ppobj = NULL;
- return DSERR_UNINITIALIZED;
- }
-
- if (lpcDSCBufferDesc == NULL) {
- WARN("invalid parameter: lpcDSCBufferDesc == NULL\n");
- *ppobj = NULL;
- return DSERR_INVALIDPARAM;
- }
-
- if ( ((lpcDSCBufferDesc->dwSize != sizeof(DSCBUFFERDESC)) &&
- (lpcDSCBufferDesc->dwSize != sizeof(DSCBUFFERDESC1))) ||
- (lpcDSCBufferDesc->dwBufferBytes == 0) ||
- (lpcDSCBufferDesc->lpwfxFormat == NULL) ) {
- WARN("invalid lpcDSCBufferDesc\n");
- *ppobj = NULL;
- return DSERR_INVALIDPARAM;
- }
-
- wfex = lpcDSCBufferDesc->lpwfxFormat;
-
- if (wfex) {
- TRACE("(formattag=0x%04x,chans=%d,samplerate=%d,"
- "bytespersec=%d,blockalign=%d,bitspersamp=%d,cbSize=%d)\n",
- wfex->wFormatTag, wfex->nChannels, wfex->nSamplesPerSec,
- wfex->nAvgBytesPerSec, wfex->nBlockAlign,
- wfex->wBitsPerSample, wfex->cbSize);
-
- if (wfex->wFormatTag == WAVE_FORMAT_PCM) {
- device->pwfx = HeapAlloc(GetProcessHeap(),0,sizeof(WAVEFORMATEX));
- *device->pwfx = *wfex;
- device->pwfx->cbSize = 0;
- } else {
- device->pwfx = HeapAlloc(GetProcessHeap(),0,sizeof(WAVEFORMATEX)+wfex->cbSize);
- CopyMemory(device->pwfx, wfex, sizeof(WAVEFORMATEX)+wfex->cbSize);
- }
- } else {
- WARN("lpcDSCBufferDesc->lpwfxFormat == 0\n");
- *ppobj = NULL;
- return DSERR_INVALIDPARAM; /* FIXME: DSERR_BADFORMAT ? */
- }
-
- *ppobj = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,
- sizeof(IDirectSoundCaptureBufferImpl));
-
- if ( *ppobj == NULL ) {
- WARN("out of memory\n");
- *ppobj = NULL;
- return DSERR_OUTOFMEMORY;
- } else {
- HRESULT err = DS_OK;
- LPBYTE newbuf;
- DWORD buflen;
- IDirectSoundCaptureBufferImpl *This = *ppobj;
-
- This->ref = 1;
- This->device = device;
- This->device->capture_buffer = This;
- This->notify = NULL;
- This->nrofnotifies = 0;
- This->hwnotify = NULL;
-
- This->pdscbd = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,
- lpcDSCBufferDesc->dwSize);
- if (This->pdscbd)
- CopyMemory(This->pdscbd, lpcDSCBufferDesc, lpcDSCBufferDesc->dwSize);
- else {
- WARN("no memory\n");
- This->device->capture_buffer = 0;
- HeapFree( GetProcessHeap(), 0, This );
- *ppobj = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- This->lpVtbl = &dscbvt;
-
- if (device->driver) {
- if (This->device->drvdesc.dwFlags & DSDDESC_DOMMSYSTEMOPEN)
- FIXME("DSDDESC_DOMMSYSTEMOPEN not supported\n");
-
- if (This->device->drvdesc.dwFlags & DSDDESC_USESYSTEMMEMORY) {
- /* allocate buffer from system memory */
- buflen = lpcDSCBufferDesc->dwBufferBytes;
- TRACE("desired buflen=%d, old buffer=%p\n", buflen, device->buffer);
- if (device->buffer)
- newbuf = HeapReAlloc(GetProcessHeap(),0,device->buffer,buflen);
- else
- newbuf = HeapAlloc(GetProcessHeap(),0,buflen);
-
- if (newbuf == NULL) {
- WARN("failed to allocate capture buffer\n");
- err = DSERR_OUTOFMEMORY;
- /* but the old buffer might still exist and must be re-prepared */
- } else {
- device->buffer = newbuf;
- device->buflen = buflen;
- }
- } else {
- /* let driver allocate memory */
- device->buflen = lpcDSCBufferDesc->dwBufferBytes;
- /* FIXME: */
- HeapFree( GetProcessHeap(), 0, device->buffer);
- device->buffer = NULL;
- }
-
- err = IDsCaptureDriver_CreateCaptureBuffer(device->driver,
- device->pwfx,0,0,&(device->buflen),&(device->buffer),(LPVOID*)&(device->hwbuf));
- if (err != DS_OK) {
- WARN("IDsCaptureDriver_CreateCaptureBuffer failed\n");
- This->device->capture_buffer = 0;
- HeapFree( GetProcessHeap(), 0, This );
- *ppobj = NULL;
- return err;
- }
- } else {
- DWORD flags = CALLBACK_FUNCTION;
- err = mmErr(waveInOpen(&(device->hwi),
- device->drvdesc.dnDevNode, device->pwfx,
- (DWORD_PTR)DSOUND_capture_callback, (DWORD_PTR)device, flags));
- if (err != DS_OK) {
- WARN("waveInOpen failed\n");
- This->device->capture_buffer = 0;
- HeapFree( GetProcessHeap(), 0, This );
- *ppobj = NULL;
- return err;
- }
-
- buflen = lpcDSCBufferDesc->dwBufferBytes;
- TRACE("desired buflen=%d, old buffer=%p\n", buflen, device->buffer);
- if (device->buffer)
- newbuf = HeapReAlloc(GetProcessHeap(),0,device->buffer,buflen);
- else
- newbuf = HeapAlloc(GetProcessHeap(),0,buflen);
- if (newbuf == NULL) {
- WARN("failed to allocate capture buffer\n");
- err = DSERR_OUTOFMEMORY;
- /* but the old buffer might still exist and must be re-prepared */
- } else {
- device->buffer = newbuf;
- device->buflen = buflen;
- }
- }
- }
-
- TRACE("returning DS_OK\n");
- return DS_OK;
-}
-
-/*******************************************************************************
- * DirectSoundCaptureDevice
- */
-HRESULT DirectSoundCaptureDevice_Initialize(
- DirectSoundCaptureDevice ** ppDevice,
- LPCGUID lpcGUID)
-{
- HRESULT err = DSERR_INVALIDPARAM;
- unsigned wid, widn;
- BOOLEAN found = FALSE;
- GUID devGUID;
- DirectSoundCaptureDevice *device = *ppDevice;
- TRACE("(%p, %s)\n", ppDevice, debugstr_guid(lpcGUID));
-
- /* Default device? */
- if ( !lpcGUID || IsEqualGUID(lpcGUID, &GUID_NULL) )
- lpcGUID = &DSDEVID_DefaultCapture;
-
- if (GetDeviceID(lpcGUID, &devGUID) != DS_OK) {
- WARN("invalid parameter: lpcGUID\n");
- return DSERR_INVALIDPARAM;
- }
-
- widn = waveInGetNumDevs();
- if (!widn) {
- WARN("no audio devices found\n");
- return DSERR_NODRIVER;
- }
-
- /* enumerate WINMM audio devices and find the one we want */
- for (wid=0; wid<widn; wid++) {
- if (IsEqualGUID( &devGUID, &DSOUND_capture_guids[wid]) ) {
- found = TRUE;
- break;
- }
- }
-
- if (found == FALSE) {
- WARN("No device found matching given ID!\n");
- return DSERR_NODRIVER;
- }
-
- if (DSOUND_capture[wid]) {
- WARN("already in use\n");
- return DSERR_ALLOCATED;
- }
-
- err = DirectSoundCaptureDevice_Create(&(device));
- if (err != DS_OK) {
- WARN("DirectSoundCaptureDevice_Create failed\n");
- return err;
- }
-
- *ppDevice = device;
- device->guid = devGUID;
-
- /* Disable the direct sound driver to force emulation if requested. */
- device->driver = NULL;
- if (ds_hw_accel != DS_HW_ACCEL_EMULATION)
- {
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDIFACE,(DWORD_PTR)&device->driver,0));
- if ( (err != DS_OK) && (err != DSERR_UNSUPPORTED) ) {
- WARN("waveInMessage failed; err=%x\n",err);
- return err;
- }
- }
- err = DS_OK;
-
- /* Get driver description */
- if (device->driver) {
- TRACE("using DirectSound driver\n");
- err = IDsCaptureDriver_GetDriverDesc(device->driver, &(device->drvdesc));
- if (err != DS_OK) {
- WARN("IDsCaptureDriver_GetDriverDesc failed\n");
- return err;
- }
- } else {
- TRACE("using WINMM\n");
- /* if no DirectSound interface available, use WINMM API instead */
- device->drvdesc.dwFlags = DSDDESC_DOMMSYSTEMOPEN |
- DSDDESC_DOMMSYSTEMSETFORMAT;
- }
-
- device->drvdesc.dnDevNode = wid;
-
- /* open the DirectSound driver if available */
- if (device->driver && (err == DS_OK))
- err = IDsCaptureDriver_Open(device->driver);
-
- if (err == DS_OK) {
- *ppDevice = device;
-
- /* the driver is now open, so it's now allowed to call GetCaps */
- if (device->driver) {
- device->drvcaps.dwSize = sizeof(device->drvcaps);
- err = IDsCaptureDriver_GetCaps(device->driver,&(device->drvcaps));
- if (err != DS_OK) {
- WARN("IDsCaptureDriver_GetCaps failed\n");
- return err;
- }
- } else /*if (device->hwi)*/ {
- WAVEINCAPSA wic;
- err = mmErr(waveInGetDevCapsA((UINT)device->drvdesc.dnDevNode, &wic, sizeof(wic)));
-
- if (err == DS_OK) {
- device->drvcaps.dwFlags = 0;
- lstrcpynA(device->drvdesc.szDrvname, wic.szPname,
- sizeof(device->drvdesc.szDrvname));
-
- device->drvcaps.dwFlags |= DSCCAPS_EMULDRIVER;
- device->drvcaps.dwFormats = wic.dwFormats;
- device->drvcaps.dwChannels = wic.wChannels;
- }
- }
- }
-
- return err;
-}
-
-static HRESULT DirectSoundCaptureDevice_Create(
- DirectSoundCaptureDevice ** ppDevice)
-{
- DirectSoundCaptureDevice * device;
- TRACE("(%p)\n", ppDevice);
-
- /* Allocate memory */
- device = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DirectSoundCaptureDevice));
-
- if (device == NULL) {
- WARN("out of memory\n");
- return DSERR_OUTOFMEMORY;
- }
-
- device->ref = 1;
- device->state = STATE_STOPPED;
-
- InitializeCriticalSection( &(device->lock) );
- device->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": DirectSoundCaptureDevice.lock");
-
- *ppDevice = device;
-
- return DS_OK;
-}
-
-ULONG DirectSoundCaptureDevice_Release(
- DirectSoundCaptureDevice * device)
-{
- ULONG ref = InterlockedDecrement(&(device->ref));
- TRACE("(%p) ref was %d\n", device, ref + 1);
-
- if (!ref) {
- TRACE("deleting object\n");
- if (device->capture_buffer)
- IDirectSoundCaptureBufferImpl_Release(
- (LPDIRECTSOUNDCAPTUREBUFFER8) device->capture_buffer);
-
- if (device->driver) {
- IDsCaptureDriver_Close(device->driver);
- IDsCaptureDriver_Release(device->driver);
- }
-
- HeapFree(GetProcessHeap(), 0, device->pwfx);
- device->lock.DebugInfo->Spare[0] = 0;
- DeleteCriticalSection( &(device->lock) );
- DSOUND_capture[device->drvdesc.dnDevNode] = NULL;
- HeapFree(GetProcessHeap(), 0, device);
- TRACE("(%p) released\n", device);
- }
- return ref;
-}
+++ /dev/null
-/* DirectSound
- *
- * Copyright 1998 Marcus Meissner
- * Copyright 1998 Rob Riggs
- * Copyright 2000-2002 TransGaming Technologies, Inc.
- * Copyright 2004 Robert Reif
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#include <stdarg.h>
-#include <stdio.h>
-
-#define NONAMELESSSTRUCT
-#define NONAMELESSUNION
-#include "windef.h"
-#include "winbase.h"
-#include "winuser.h"
-#include "mmsystem.h"
-#include "winternl.h"
-#include "mmddk.h"
-#include "wingdi.h"
-#include "mmreg.h"
-#include "ks.h"
-#include "ksmedia.h"
-#include "wine/debug.h"
-#include "dsound.h"
-#include "dsdriver.h"
-#include "dsound_private.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(dsound);
-
-/*****************************************************************************
- * IDirectSound COM components
- */
-struct IDirectSound_IUnknown {
- const IUnknownVtbl *lpVtbl;
- LONG ref;
- LPDIRECTSOUND8 pds;
-};
-
-static HRESULT IDirectSound_IUnknown_Create(LPDIRECTSOUND8 pds, LPUNKNOWN * ppunk);
-
-struct IDirectSound_IDirectSound {
- const IDirectSoundVtbl *lpVtbl;
- LONG ref;
- LPDIRECTSOUND8 pds;
-};
-
-static HRESULT IDirectSound_IDirectSound_Create(LPDIRECTSOUND8 pds, LPDIRECTSOUND * ppds);
-
-/*****************************************************************************
- * IDirectSound8 COM components
- */
-struct IDirectSound8_IUnknown {
- const IUnknownVtbl *lpVtbl;
- LONG ref;
- LPDIRECTSOUND8 pds;
-};
-
-static HRESULT IDirectSound8_IUnknown_Create(LPDIRECTSOUND8 pds, LPUNKNOWN * ppunk);
-static ULONG WINAPI IDirectSound8_IUnknown_AddRef(LPUNKNOWN iface);
-
-struct IDirectSound8_IDirectSound {
- const IDirectSoundVtbl *lpVtbl;
- LONG ref;
- LPDIRECTSOUND8 pds;
-};
-
-static HRESULT IDirectSound8_IDirectSound_Create(LPDIRECTSOUND8 pds, LPDIRECTSOUND * ppds);
-static ULONG WINAPI IDirectSound8_IDirectSound_AddRef(LPDIRECTSOUND iface);
-
-struct IDirectSound8_IDirectSound8 {
- const IDirectSound8Vtbl *lpVtbl;
- LONG ref;
- LPDIRECTSOUND8 pds;
-};
-
-static HRESULT IDirectSound8_IDirectSound8_Create(LPDIRECTSOUND8 pds, LPDIRECTSOUND8 * ppds);
-static ULONG WINAPI IDirectSound8_IDirectSound8_AddRef(LPDIRECTSOUND8 iface);
-
-/*****************************************************************************
- * IDirectSound implementation structure
- */
-struct IDirectSoundImpl
-{
- LONG ref;
-
- DirectSoundDevice *device;
- LPUNKNOWN pUnknown;
- LPDIRECTSOUND pDS;
- LPDIRECTSOUND8 pDS8;
-};
-
-static HRESULT IDirectSoundImpl_Create(LPDIRECTSOUND8 * ppds);
-
-static ULONG WINAPI IDirectSound_IUnknown_AddRef(LPUNKNOWN iface);
-static ULONG WINAPI IDirectSound_IDirectSound_AddRef(LPDIRECTSOUND iface);
-
-static HRESULT DirectSoundDevice_VerifyCertification(DirectSoundDevice * device, LPDWORD pdwCertified);
-
-const char * dumpCooperativeLevel(DWORD level)
-{
- static char unknown[32];
-#define LE(x) case x: return #x
- switch (level) {
- LE(DSSCL_NORMAL);
- LE(DSSCL_PRIORITY);
- LE(DSSCL_EXCLUSIVE);
- LE(DSSCL_WRITEPRIMARY);
- }
-#undef LE
- sprintf(unknown, "Unknown(%08x)", (UINT)level);
- return unknown;
-}
-
-static void _dump_DSCAPS(DWORD xmask) {
- struct {
- DWORD mask;
- const char *name;
- } flags[] = {
-#define FE(x) { x, #x },
- FE(DSCAPS_PRIMARYMONO)
- FE(DSCAPS_PRIMARYSTEREO)
- FE(DSCAPS_PRIMARY8BIT)
- FE(DSCAPS_PRIMARY16BIT)
- FE(DSCAPS_CONTINUOUSRATE)
- FE(DSCAPS_EMULDRIVER)
- FE(DSCAPS_CERTIFIED)
- FE(DSCAPS_SECONDARYMONO)
- FE(DSCAPS_SECONDARYSTEREO)
- FE(DSCAPS_SECONDARY8BIT)
- FE(DSCAPS_SECONDARY16BIT)
-#undef FE
- };
- unsigned int i;
-
- for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
- if ((flags[i].mask & xmask) == flags[i].mask)
- TRACE("%s ",flags[i].name);
-}
-
-static void _dump_DSBCAPS(DWORD xmask) {
- struct {
- DWORD mask;
- const char *name;
- } flags[] = {
-#define FE(x) { x, #x },
- FE(DSBCAPS_PRIMARYBUFFER)
- FE(DSBCAPS_STATIC)
- FE(DSBCAPS_LOCHARDWARE)
- FE(DSBCAPS_LOCSOFTWARE)
- FE(DSBCAPS_CTRL3D)
- FE(DSBCAPS_CTRLFREQUENCY)
- FE(DSBCAPS_CTRLPAN)
- FE(DSBCAPS_CTRLVOLUME)
- FE(DSBCAPS_CTRLPOSITIONNOTIFY)
- FE(DSBCAPS_STICKYFOCUS)
- FE(DSBCAPS_GLOBALFOCUS)
- FE(DSBCAPS_GETCURRENTPOSITION2)
- FE(DSBCAPS_MUTE3DATMAXDISTANCE)
-#undef FE
- };
- unsigned int i;
-
- for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
- if ((flags[i].mask & xmask) == flags[i].mask)
- TRACE("%s ",flags[i].name);
-}
-
-/*******************************************************************************
- * IDirectSoundImpl_DirectSound
- */
-static HRESULT DSOUND_QueryInterface(
- LPDIRECTSOUND8 iface,
- REFIID riid,
- LPVOID * ppobj)
-{
- IDirectSoundImpl *This = (IDirectSoundImpl *)iface;
- TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
-
- if (ppobj == NULL) {
- WARN("invalid parameter\n");
- return E_INVALIDARG;
- }
-
- if (IsEqualIID(riid, &IID_IUnknown)) {
- if (!This->pUnknown) {
- IDirectSound_IUnknown_Create(iface, &This->pUnknown);
- if (!This->pUnknown) {
- WARN("IDirectSound_IUnknown_Create() failed\n");
- *ppobj = NULL;
- return E_NOINTERFACE;
- }
- }
- IDirectSound_IUnknown_AddRef(This->pUnknown);
- *ppobj = This->pUnknown;
- return S_OK;
- } else if (IsEqualIID(riid, &IID_IDirectSound)) {
- if (!This->pDS) {
- IDirectSound_IDirectSound_Create(iface, &This->pDS);
- if (!This->pDS) {
- WARN("IDirectSound_IDirectSound_Create() failed\n");
- *ppobj = NULL;
- return E_NOINTERFACE;
- }
- }
- IDirectSound_IDirectSound_AddRef(This->pDS);
- *ppobj = This->pDS;
- return S_OK;
- }
-
- *ppobj = NULL;
- WARN("Unknown IID %s\n",debugstr_guid(riid));
- return E_NOINTERFACE;
-}
-
-static HRESULT DSOUND_QueryInterface8(
- LPDIRECTSOUND8 iface,
- REFIID riid,
- LPVOID * ppobj)
-{
- IDirectSoundImpl *This = (IDirectSoundImpl *)iface;
- TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
-
- if (ppobj == NULL) {
- WARN("invalid parameter\n");
- return E_INVALIDARG;
- }
-
- if (IsEqualIID(riid, &IID_IUnknown)) {
- if (!This->pUnknown) {
- IDirectSound8_IUnknown_Create(iface, &This->pUnknown);
- if (!This->pUnknown) {
- WARN("IDirectSound8_IUnknown_Create() failed\n");
- *ppobj = NULL;
- return E_NOINTERFACE;
- }
- }
- IDirectSound8_IUnknown_AddRef(This->pUnknown);
- *ppobj = This->pUnknown;
- return S_OK;
- } else if (IsEqualIID(riid, &IID_IDirectSound)) {
- if (!This->pDS) {
- IDirectSound8_IDirectSound_Create(iface, &This->pDS);
- if (!This->pDS) {
- WARN("IDirectSound8_IDirectSound_Create() failed\n");
- *ppobj = NULL;
- return E_NOINTERFACE;
- }
- }
- IDirectSound8_IDirectSound_AddRef(This->pDS);
- *ppobj = This->pDS;
- return S_OK;
- } else if (IsEqualIID(riid, &IID_IDirectSound8)) {
- if (!This->pDS8) {
- IDirectSound8_IDirectSound8_Create(iface, &This->pDS8);
- if (!This->pDS8) {
- WARN("IDirectSound8_IDirectSound8_Create() failed\n");
- *ppobj = NULL;
- return E_NOINTERFACE;
- }
- }
- IDirectSound8_IDirectSound8_AddRef(This->pDS8);
- *ppobj = This->pDS8;
- return S_OK;
- }
-
- *ppobj = NULL;
- WARN("Unknown IID %s\n",debugstr_guid(riid));
- return E_NOINTERFACE;
-}
-
-static ULONG IDirectSoundImpl_AddRef(
- LPDIRECTSOUND8 iface)
-{
- IDirectSoundImpl *This = (IDirectSoundImpl *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
-}
-
-static ULONG IDirectSoundImpl_Release(
- LPDIRECTSOUND8 iface)
-{
- IDirectSoundImpl *This = (IDirectSoundImpl *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref + 1);
-
- if (!ref) {
- if (This->device)
- DirectSoundDevice_Release(This->device);
- HeapFree(GetProcessHeap(),0,This);
- TRACE("(%p) released\n", This);
- }
- return ref;
-}
-
-static HRESULT IDirectSoundImpl_Create(
- LPDIRECTSOUND8 * ppDS)
-{
- IDirectSoundImpl* pDS;
- TRACE("(%p)\n",ppDS);
-
- /* Allocate memory */
- pDS = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectSoundImpl));
- if (pDS == NULL) {
- WARN("out of memory\n");
- *ppDS = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- pDS->ref = 0;
- pDS->device = NULL;
-
- *ppDS = (LPDIRECTSOUND8)pDS;
-
- return DS_OK;
-}
-
-/*******************************************************************************
- * IDirectSound_IUnknown
- */
-static HRESULT WINAPI IDirectSound_IUnknown_QueryInterface(
- LPUNKNOWN iface,
- REFIID riid,
- LPVOID * ppobj)
-{
- IDirectSound_IUnknown *This = (IDirectSound_IUnknown *)iface;
- TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
- return DSOUND_QueryInterface(This->pds, riid, ppobj);
-}
-
-static ULONG WINAPI IDirectSound_IUnknown_AddRef(
- LPUNKNOWN iface)
-{
- IDirectSound_IUnknown *This = (IDirectSound_IUnknown *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
-}
-
-static ULONG WINAPI IDirectSound_IUnknown_Release(
- LPUNKNOWN iface)
-{
- IDirectSound_IUnknown *This = (IDirectSound_IUnknown *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref + 1);
- if (!ref) {
- ((IDirectSoundImpl*)This->pds)->pUnknown = NULL;
- IDirectSoundImpl_Release(This->pds);
- HeapFree(GetProcessHeap(), 0, This);
- TRACE("(%p) released\n", This);
- }
- return ref;
-}
-
-static const IUnknownVtbl DirectSound_Unknown_Vtbl =
-{
- IDirectSound_IUnknown_QueryInterface,
- IDirectSound_IUnknown_AddRef,
- IDirectSound_IUnknown_Release
-};
-
-static HRESULT IDirectSound_IUnknown_Create(
- LPDIRECTSOUND8 pds,
- LPUNKNOWN * ppunk)
-{
- IDirectSound_IUnknown * pdsunk;
- TRACE("(%p,%p)\n",pds,ppunk);
-
- if (ppunk == NULL) {
- ERR("invalid parameter: ppunk == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (pds == NULL) {
- ERR("invalid parameter: pds == NULL\n");
- *ppunk = NULL;
- return DSERR_INVALIDPARAM;
- }
-
- pdsunk = HeapAlloc(GetProcessHeap(),0,sizeof(*pdsunk));
- if (pdsunk == NULL) {
- WARN("out of memory\n");
- *ppunk = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- pdsunk->lpVtbl = &DirectSound_Unknown_Vtbl;
- pdsunk->ref = 0;
- pdsunk->pds = pds;
-
- IDirectSoundImpl_AddRef(pds);
- *ppunk = (LPUNKNOWN)pdsunk;
-
- return DS_OK;
-}
-
-/*******************************************************************************
- * IDirectSound_IDirectSound
- */
-static HRESULT WINAPI IDirectSound_IDirectSound_QueryInterface(
- LPDIRECTSOUND iface,
- REFIID riid,
- LPVOID * ppobj)
-{
- IDirectSound_IDirectSound *This = (IDirectSound_IDirectSound *)iface;
- TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
- return DSOUND_QueryInterface(This->pds, riid, ppobj);
-}
-
-static ULONG WINAPI IDirectSound_IDirectSound_AddRef(
- LPDIRECTSOUND iface)
-{
- IDirectSound_IDirectSound *This = (IDirectSound_IDirectSound *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
-}
-
-static ULONG WINAPI IDirectSound_IDirectSound_Release(
- LPDIRECTSOUND iface)
-{
- IDirectSound_IDirectSound *This = (IDirectSound_IDirectSound *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref + 1);
- if (!ref) {
- ((IDirectSoundImpl*)This->pds)->pDS = NULL;
- IDirectSoundImpl_Release(This->pds);
- HeapFree(GetProcessHeap(), 0, This);
- TRACE("(%p) released\n", This);
- }
- return ref;
-}
-
-static HRESULT WINAPI IDirectSound_IDirectSound_CreateSoundBuffer(
- LPDIRECTSOUND iface,
- LPCDSBUFFERDESC dsbd,
- LPLPDIRECTSOUNDBUFFER ppdsb,
- LPUNKNOWN lpunk)
-{
- IDirectSound_IDirectSound *This = (IDirectSound_IDirectSound *)iface;
- TRACE("(%p,%p,%p,%p)\n",This,dsbd,ppdsb,lpunk);
- return DirectSoundDevice_CreateSoundBuffer(((IDirectSoundImpl *)This->pds)->device,dsbd,ppdsb,lpunk,FALSE);
-}
-
-static HRESULT WINAPI IDirectSound_IDirectSound_GetCaps(
- LPDIRECTSOUND iface,
- LPDSCAPS lpDSCaps)
-{
- IDirectSound_IDirectSound *This = (IDirectSound_IDirectSound *)iface;
- TRACE("(%p,%p)\n",This,lpDSCaps);
- return DirectSoundDevice_GetCaps(((IDirectSoundImpl *)This->pds)->device, lpDSCaps);
-}
-
-static HRESULT WINAPI IDirectSound_IDirectSound_DuplicateSoundBuffer(
- LPDIRECTSOUND iface,
- LPDIRECTSOUNDBUFFER psb,
- LPLPDIRECTSOUNDBUFFER ppdsb)
-{
- IDirectSound_IDirectSound *This = (IDirectSound_IDirectSound *)iface;
- TRACE("(%p,%p,%p)\n",This,psb,ppdsb);
- return DirectSoundDevice_DuplicateSoundBuffer(((IDirectSoundImpl *)This->pds)->device,psb,ppdsb);
-}
-
-static HRESULT WINAPI IDirectSound_IDirectSound_SetCooperativeLevel(
- LPDIRECTSOUND iface,
- HWND hwnd,
- DWORD level)
-{
- IDirectSound_IDirectSound *This = (IDirectSound_IDirectSound *)iface;
- TRACE("(%p,%p,%s)\n",This,hwnd,dumpCooperativeLevel(level));
- return DirectSoundDevice_SetCooperativeLevel(((IDirectSoundImpl *)This->pds)->device, hwnd, level);
-}
-
-static HRESULT WINAPI IDirectSound_IDirectSound_Compact(
- LPDIRECTSOUND iface)
-{
- IDirectSound_IDirectSound *This = (IDirectSound_IDirectSound *)iface;
- TRACE("(%p)\n", This);
- return DirectSoundDevice_Compact(((IDirectSoundImpl *)This->pds)->device);
-}
-
-static HRESULT WINAPI IDirectSound_IDirectSound_GetSpeakerConfig(
- LPDIRECTSOUND iface,
- LPDWORD lpdwSpeakerConfig)
-{
- IDirectSound_IDirectSound *This = (IDirectSound_IDirectSound *)iface;
- TRACE("(%p, %p)\n", This, lpdwSpeakerConfig);
- return DirectSoundDevice_GetSpeakerConfig(((IDirectSoundImpl *)This->pds)->device,lpdwSpeakerConfig);
-}
-
-static HRESULT WINAPI IDirectSound_IDirectSound_SetSpeakerConfig(
- LPDIRECTSOUND iface,
- DWORD config)
-{
- IDirectSound_IDirectSound *This = (IDirectSound_IDirectSound *)iface;
- TRACE("(%p,0x%08x)\n",This,config);
- return DirectSoundDevice_SetSpeakerConfig(((IDirectSoundImpl *)This->pds)->device,config);
-}
-
-static HRESULT WINAPI IDirectSound_IDirectSound_Initialize(
- LPDIRECTSOUND iface,
- LPCGUID lpcGuid)
-{
- IDirectSound_IDirectSound *This = (IDirectSound_IDirectSound *)iface;
- TRACE("(%p, %s)\n", This, debugstr_guid(lpcGuid));
- return DirectSoundDevice_Initialize(&((IDirectSoundImpl *)This->pds)->device,lpcGuid);
-}
-
-static const IDirectSoundVtbl DirectSound_DirectSound_Vtbl =
-{
- IDirectSound_IDirectSound_QueryInterface,
- IDirectSound_IDirectSound_AddRef,
- IDirectSound_IDirectSound_Release,
- IDirectSound_IDirectSound_CreateSoundBuffer,
- IDirectSound_IDirectSound_GetCaps,
- IDirectSound_IDirectSound_DuplicateSoundBuffer,
- IDirectSound_IDirectSound_SetCooperativeLevel,
- IDirectSound_IDirectSound_Compact,
- IDirectSound_IDirectSound_GetSpeakerConfig,
- IDirectSound_IDirectSound_SetSpeakerConfig,
- IDirectSound_IDirectSound_Initialize
-};
-
-static HRESULT IDirectSound_IDirectSound_Create(
- LPDIRECTSOUND8 pds,
- LPDIRECTSOUND * ppds)
-{
- IDirectSound_IDirectSound * pdsds;
- TRACE("(%p,%p)\n",pds,ppds);
-
- if (ppds == NULL) {
- ERR("invalid parameter: ppds == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (pds == NULL) {
- ERR("invalid parameter: pds == NULL\n");
- *ppds = NULL;
- return DSERR_INVALIDPARAM;
- }
-
- pdsds = HeapAlloc(GetProcessHeap(),0,sizeof(*pdsds));
- if (pdsds == NULL) {
- WARN("out of memory\n");
- *ppds = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- pdsds->lpVtbl = &DirectSound_DirectSound_Vtbl;
- pdsds->ref = 0;
- pdsds->pds = pds;
-
- IDirectSoundImpl_AddRef(pds);
- *ppds = (LPDIRECTSOUND)pdsds;
-
- return DS_OK;
-}
-
-/*******************************************************************************
- * IDirectSound8_IUnknown
- */
-static HRESULT WINAPI IDirectSound8_IUnknown_QueryInterface(
- LPUNKNOWN iface,
- REFIID riid,
- LPVOID * ppobj)
-{
- IDirectSound_IUnknown *This = (IDirectSound_IUnknown *)iface;
- TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
- return DSOUND_QueryInterface8(This->pds, riid, ppobj);
-}
-
-static ULONG WINAPI IDirectSound8_IUnknown_AddRef(
- LPUNKNOWN iface)
-{
- IDirectSound_IUnknown *This = (IDirectSound_IUnknown *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
-}
-
-static ULONG WINAPI IDirectSound8_IUnknown_Release(
- LPUNKNOWN iface)
-{
- IDirectSound_IUnknown *This = (IDirectSound_IUnknown *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref + 1);
- if (!ref) {
- ((IDirectSoundImpl*)This->pds)->pUnknown = NULL;
- IDirectSoundImpl_Release(This->pds);
- HeapFree(GetProcessHeap(), 0, This);
- TRACE("(%p) released\n", This);
- }
- return ref;
-}
-
-static const IUnknownVtbl DirectSound8_Unknown_Vtbl =
-{
- IDirectSound8_IUnknown_QueryInterface,
- IDirectSound8_IUnknown_AddRef,
- IDirectSound8_IUnknown_Release
-};
-
-static HRESULT IDirectSound8_IUnknown_Create(
- LPDIRECTSOUND8 pds,
- LPUNKNOWN * ppunk)
-{
- IDirectSound8_IUnknown * pdsunk;
- TRACE("(%p,%p)\n",pds,ppunk);
-
- if (ppunk == NULL) {
- ERR("invalid parameter: ppunk == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (pds == NULL) {
- ERR("invalid parameter: pds == NULL\n");
- *ppunk = NULL;
- return DSERR_INVALIDPARAM;
- }
-
- pdsunk = HeapAlloc(GetProcessHeap(),0,sizeof(*pdsunk));
- if (pdsunk == NULL) {
- WARN("out of memory\n");
- *ppunk = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- pdsunk->lpVtbl = &DirectSound8_Unknown_Vtbl;
- pdsunk->ref = 0;
- pdsunk->pds = pds;
-
- IDirectSoundImpl_AddRef(pds);
- *ppunk = (LPUNKNOWN)pdsunk;
-
- return DS_OK;
-}
-
-/*******************************************************************************
- * IDirectSound8_IDirectSound
- */
-static HRESULT WINAPI IDirectSound8_IDirectSound_QueryInterface(
- LPDIRECTSOUND iface,
- REFIID riid,
- LPVOID * ppobj)
-{
- IDirectSound8_IDirectSound *This = (IDirectSound8_IDirectSound *)iface;
- TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
- return DSOUND_QueryInterface8(This->pds, riid, ppobj);
-}
-
-static ULONG WINAPI IDirectSound8_IDirectSound_AddRef(
- LPDIRECTSOUND iface)
-{
- IDirectSound8_IDirectSound *This = (IDirectSound8_IDirectSound *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
-}
-
-static ULONG WINAPI IDirectSound8_IDirectSound_Release(
- LPDIRECTSOUND iface)
-{
- IDirectSound8_IDirectSound *This = (IDirectSound8_IDirectSound *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref + 1);
- if (!ref) {
- ((IDirectSoundImpl*)This->pds)->pDS = NULL;
- IDirectSoundImpl_Release(This->pds);
- HeapFree(GetProcessHeap(), 0, This);
- TRACE("(%p) released\n", This);
- }
- return ref;
-}
-
-static HRESULT WINAPI IDirectSound8_IDirectSound_CreateSoundBuffer(
- LPDIRECTSOUND iface,
- LPCDSBUFFERDESC dsbd,
- LPLPDIRECTSOUNDBUFFER ppdsb,
- LPUNKNOWN lpunk)
-{
- IDirectSound8_IDirectSound *This = (IDirectSound8_IDirectSound *)iface;
- TRACE("(%p,%p,%p,%p)\n",This,dsbd,ppdsb,lpunk);
- return DirectSoundDevice_CreateSoundBuffer(((IDirectSoundImpl *)This->pds)->device,dsbd,ppdsb,lpunk,TRUE);
-}
-
-static HRESULT WINAPI IDirectSound8_IDirectSound_GetCaps(
- LPDIRECTSOUND iface,
- LPDSCAPS lpDSCaps)
-{
- IDirectSound8_IDirectSound *This = (IDirectSound8_IDirectSound *)iface;
- TRACE("(%p,%p)\n",This,lpDSCaps);
- return DirectSoundDevice_GetCaps(((IDirectSoundImpl *)This->pds)->device, lpDSCaps);
-}
-
-static HRESULT WINAPI IDirectSound8_IDirectSound_DuplicateSoundBuffer(
- LPDIRECTSOUND iface,
- LPDIRECTSOUNDBUFFER psb,
- LPLPDIRECTSOUNDBUFFER ppdsb)
-{
- IDirectSound8_IDirectSound *This = (IDirectSound8_IDirectSound *)iface;
- TRACE("(%p,%p,%p)\n",This,psb,ppdsb);
- return DirectSoundDevice_DuplicateSoundBuffer(((IDirectSoundImpl *)This->pds)->device,psb,ppdsb);
-}
-
-static HRESULT WINAPI IDirectSound8_IDirectSound_SetCooperativeLevel(
- LPDIRECTSOUND iface,
- HWND hwnd,
- DWORD level)
-{
- IDirectSound8_IDirectSound *This = (IDirectSound8_IDirectSound *)iface;
- TRACE("(%p,%p,%s)\n",This,hwnd,dumpCooperativeLevel(level));
- return DirectSoundDevice_SetCooperativeLevel(((IDirectSoundImpl *)This->pds)->device, hwnd, level);
-}
-
-static HRESULT WINAPI IDirectSound8_IDirectSound_Compact(
- LPDIRECTSOUND iface)
-{
- IDirectSound8_IDirectSound *This = (IDirectSound8_IDirectSound *)iface;
- TRACE("(%p)\n", This);
- return DirectSoundDevice_Compact(((IDirectSoundImpl *)This->pds)->device);
-}
-
-static HRESULT WINAPI IDirectSound8_IDirectSound_GetSpeakerConfig(
- LPDIRECTSOUND iface,
- LPDWORD lpdwSpeakerConfig)
-{
- IDirectSound8_IDirectSound *This = (IDirectSound8_IDirectSound *)iface;
- TRACE("(%p, %p)\n", This, lpdwSpeakerConfig);
- return DirectSoundDevice_GetSpeakerConfig(((IDirectSoundImpl *)This->pds)->device,lpdwSpeakerConfig);
-}
-
-static HRESULT WINAPI IDirectSound8_IDirectSound_SetSpeakerConfig(
- LPDIRECTSOUND iface,
- DWORD config)
-{
- IDirectSound8_IDirectSound *This = (IDirectSound8_IDirectSound *)iface;
- TRACE("(%p,0x%08x)\n",This,config);
- return DirectSoundDevice_SetSpeakerConfig(((IDirectSoundImpl *)This->pds)->device,config);
-}
-
-static HRESULT WINAPI IDirectSound8_IDirectSound_Initialize(
- LPDIRECTSOUND iface,
- LPCGUID lpcGuid)
-{
- IDirectSound8_IDirectSound *This = (IDirectSound8_IDirectSound *)iface;
- TRACE("(%p, %s)\n", This, debugstr_guid(lpcGuid));
- return DirectSoundDevice_Initialize(&((IDirectSoundImpl *)This->pds)->device,lpcGuid);
-}
-
-static const IDirectSoundVtbl DirectSound8_DirectSound_Vtbl =
-{
- IDirectSound8_IDirectSound_QueryInterface,
- IDirectSound8_IDirectSound_AddRef,
- IDirectSound8_IDirectSound_Release,
- IDirectSound8_IDirectSound_CreateSoundBuffer,
- IDirectSound8_IDirectSound_GetCaps,
- IDirectSound8_IDirectSound_DuplicateSoundBuffer,
- IDirectSound8_IDirectSound_SetCooperativeLevel,
- IDirectSound8_IDirectSound_Compact,
- IDirectSound8_IDirectSound_GetSpeakerConfig,
- IDirectSound8_IDirectSound_SetSpeakerConfig,
- IDirectSound8_IDirectSound_Initialize
-};
-
-static HRESULT IDirectSound8_IDirectSound_Create(
- LPDIRECTSOUND8 pds,
- LPDIRECTSOUND * ppds)
-{
- IDirectSound8_IDirectSound * pdsds;
- TRACE("(%p,%p)\n",pds,ppds);
-
- if (ppds == NULL) {
- ERR("invalid parameter: ppds == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (pds == NULL) {
- ERR("invalid parameter: pds == NULL\n");
- *ppds = NULL;
- return DSERR_INVALIDPARAM;
- }
-
- pdsds = HeapAlloc(GetProcessHeap(),0,sizeof(*pdsds));
- if (pdsds == NULL) {
- WARN("out of memory\n");
- *ppds = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- pdsds->lpVtbl = &DirectSound8_DirectSound_Vtbl;
- pdsds->ref = 0;
- pdsds->pds = pds;
-
- IDirectSoundImpl_AddRef(pds);
- *ppds = (LPDIRECTSOUND)pdsds;
-
- return DS_OK;
-}
-
-/*******************************************************************************
- * IDirectSound8_IDirectSound8
- */
-static HRESULT WINAPI IDirectSound8_IDirectSound8_QueryInterface(
- LPDIRECTSOUND8 iface,
- REFIID riid,
- LPVOID * ppobj)
-{
- IDirectSound8_IDirectSound8 *This = (IDirectSound8_IDirectSound8 *)iface;
- TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
- return DSOUND_QueryInterface8(This->pds, riid, ppobj);
-}
-
-static ULONG WINAPI IDirectSound8_IDirectSound8_AddRef(
- LPDIRECTSOUND8 iface)
-{
- IDirectSound8_IDirectSound8 *This = (IDirectSound8_IDirectSound8 *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
-}
-
-static ULONG WINAPI IDirectSound8_IDirectSound8_Release(
- LPDIRECTSOUND8 iface)
-{
- IDirectSound8_IDirectSound8 *This = (IDirectSound8_IDirectSound8 *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref + 1);
- if (!ref) {
- ((IDirectSoundImpl*)This->pds)->pDS8 = NULL;
- IDirectSoundImpl_Release(This->pds);
- HeapFree(GetProcessHeap(), 0, This);
- TRACE("(%p) released\n", This);
- }
- return ref;
-}
-
-static HRESULT WINAPI IDirectSound8_IDirectSound8_CreateSoundBuffer(
- LPDIRECTSOUND8 iface,
- LPCDSBUFFERDESC dsbd,
- LPLPDIRECTSOUNDBUFFER ppdsb,
- LPUNKNOWN lpunk)
-{
- IDirectSound8_IDirectSound8 *This = (IDirectSound8_IDirectSound8 *)iface;
- TRACE("(%p,%p,%p,%p)\n",This,dsbd,ppdsb,lpunk);
- return DirectSoundDevice_CreateSoundBuffer(((IDirectSoundImpl *)This->pds)->device,dsbd,ppdsb,lpunk,TRUE);
-}
-
-static HRESULT WINAPI IDirectSound8_IDirectSound8_GetCaps(
- LPDIRECTSOUND8 iface,
- LPDSCAPS lpDSCaps)
-{
- IDirectSound8_IDirectSound *This = (IDirectSound8_IDirectSound *)iface;
- TRACE("(%p,%p)\n",This,lpDSCaps);
- return DirectSoundDevice_GetCaps(((IDirectSoundImpl *)This->pds)->device, lpDSCaps);
-}
-
-static HRESULT WINAPI IDirectSound8_IDirectSound8_DuplicateSoundBuffer(
- LPDIRECTSOUND8 iface,
- LPDIRECTSOUNDBUFFER psb,
- LPLPDIRECTSOUNDBUFFER ppdsb)
-{
- IDirectSound8_IDirectSound8 *This = (IDirectSound8_IDirectSound8 *)iface;
- TRACE("(%p,%p,%p)\n",This,psb,ppdsb);
- return DirectSoundDevice_DuplicateSoundBuffer(((IDirectSoundImpl *)This->pds)->device,psb,ppdsb);
-}
-
-static HRESULT WINAPI IDirectSound8_IDirectSound8_SetCooperativeLevel(
- LPDIRECTSOUND8 iface,
- HWND hwnd,
- DWORD level)
-{
- IDirectSound8_IDirectSound8 *This = (IDirectSound8_IDirectSound8 *)iface;
- TRACE("(%p,%p,%s)\n",This,hwnd,dumpCooperativeLevel(level));
- return DirectSoundDevice_SetCooperativeLevel(((IDirectSoundImpl *)This->pds)->device, hwnd, level);
-}
-
-static HRESULT WINAPI IDirectSound8_IDirectSound8_Compact(
- LPDIRECTSOUND8 iface)
-{
- IDirectSound8_IDirectSound8 *This = (IDirectSound8_IDirectSound8 *)iface;
- TRACE("(%p)\n", This);
- return DirectSoundDevice_Compact(((IDirectSoundImpl *)This->pds)->device);
-}
-
-static HRESULT WINAPI IDirectSound8_IDirectSound8_GetSpeakerConfig(
- LPDIRECTSOUND8 iface,
- LPDWORD lpdwSpeakerConfig)
-{
- IDirectSound8_IDirectSound8 *This = (IDirectSound8_IDirectSound8 *)iface;
- TRACE("(%p, %p)\n", This, lpdwSpeakerConfig);
- return DirectSoundDevice_GetSpeakerConfig(((IDirectSoundImpl *)This->pds)->device,lpdwSpeakerConfig);
-}
-
-static HRESULT WINAPI IDirectSound8_IDirectSound8_SetSpeakerConfig(
- LPDIRECTSOUND8 iface,
- DWORD config)
-{
- IDirectSound8_IDirectSound8 *This = (IDirectSound8_IDirectSound8 *)iface;
- TRACE("(%p,0x%08x)\n",This,config);
- return DirectSoundDevice_SetSpeakerConfig(((IDirectSoundImpl *)This->pds)->device,config);
-}
-
-static HRESULT WINAPI IDirectSound8_IDirectSound8_Initialize(
- LPDIRECTSOUND8 iface,
- LPCGUID lpcGuid)
-{
- IDirectSound8_IDirectSound8 *This = (IDirectSound8_IDirectSound8 *)iface;
- TRACE("(%p, %s)\n", This, debugstr_guid(lpcGuid));
- return DirectSoundDevice_Initialize(&((IDirectSoundImpl *)This->pds)->device,lpcGuid);
-}
-
-static HRESULT WINAPI IDirectSound8_IDirectSound8_VerifyCertification(
- LPDIRECTSOUND8 iface,
- LPDWORD pdwCertified)
-{
- IDirectSound8_IDirectSound8 *This = (IDirectSound8_IDirectSound8 *)iface;
- TRACE("(%p, %p)\n", This, pdwCertified);
- return DirectSoundDevice_VerifyCertification(((IDirectSoundImpl *)This->pds)->device,pdwCertified);
-}
-
-static const IDirectSound8Vtbl DirectSound8_DirectSound8_Vtbl =
-{
- IDirectSound8_IDirectSound8_QueryInterface,
- IDirectSound8_IDirectSound8_AddRef,
- IDirectSound8_IDirectSound8_Release,
- IDirectSound8_IDirectSound8_CreateSoundBuffer,
- IDirectSound8_IDirectSound8_GetCaps,
- IDirectSound8_IDirectSound8_DuplicateSoundBuffer,
- IDirectSound8_IDirectSound8_SetCooperativeLevel,
- IDirectSound8_IDirectSound8_Compact,
- IDirectSound8_IDirectSound8_GetSpeakerConfig,
- IDirectSound8_IDirectSound8_SetSpeakerConfig,
- IDirectSound8_IDirectSound8_Initialize,
- IDirectSound8_IDirectSound8_VerifyCertification
-};
-
-static HRESULT IDirectSound8_IDirectSound8_Create(
- LPDIRECTSOUND8 pds,
- LPDIRECTSOUND8 * ppds)
-{
- IDirectSound8_IDirectSound8 * pdsds;
- TRACE("(%p,%p)\n",pds,ppds);
-
- if (ppds == NULL) {
- ERR("invalid parameter: ppds == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (pds == NULL) {
- ERR("invalid parameter: pds == NULL\n");
- *ppds = NULL;
- return DSERR_INVALIDPARAM;
- }
-
- pdsds = HeapAlloc(GetProcessHeap(),0,sizeof(*pdsds));
- if (pdsds == NULL) {
- WARN("out of memory\n");
- *ppds = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- pdsds->lpVtbl = &DirectSound8_DirectSound8_Vtbl;
- pdsds->ref = 0;
- pdsds->pds = pds;
-
- IDirectSoundImpl_AddRef(pds);
- *ppds = (LPDIRECTSOUND8)pdsds;
-
- return DS_OK;
-}
-
-HRESULT DSOUND_Create(
- REFIID riid,
- LPDIRECTSOUND *ppDS)
-{
- LPDIRECTSOUND8 pDS;
- HRESULT hr;
- TRACE("(%s, %p)\n", debugstr_guid(riid), ppDS);
-
- if (!IsEqualIID(riid, &IID_IUnknown) &&
- !IsEqualIID(riid, &IID_IDirectSound)) {
- *ppDS = 0;
- return E_NOINTERFACE;
- }
-
- /* Get dsound configuration */
- setup_dsound_options();
-
- hr = IDirectSoundImpl_Create(&pDS);
- if (hr == DS_OK) {
- hr = IDirectSound_IDirectSound_Create(pDS, ppDS);
- if (*ppDS)
- IDirectSound_IDirectSound_AddRef(*ppDS);
- else {
- WARN("IDirectSound_IDirectSound_Create failed\n");
- IDirectSound8_Release(pDS);
- }
- } else {
- WARN("IDirectSoundImpl_Create failed\n");
- *ppDS = 0;
- }
-
- return hr;
-}
-
-/*******************************************************************************
- * DirectSoundCreate (DSOUND.1)
- *
- * Creates and initializes a DirectSound interface.
- *
- * PARAMS
- * lpcGUID [I] Address of the GUID that identifies the sound device.
- * ppDS [O] Address of a variable to receive the interface pointer.
- * pUnkOuter [I] Must be NULL.
- *
- * RETURNS
- * Success: DS_OK
- * Failure: DSERR_ALLOCATED, DSERR_INVALIDPARAM, DSERR_NOAGGREGATION,
- * DSERR_NODRIVER, DSERR_OUTOFMEMORY
- */
-HRESULT WINAPI DirectSoundCreate(
- LPCGUID lpcGUID,
- LPDIRECTSOUND *ppDS,
- IUnknown *pUnkOuter)
-{
- HRESULT hr;
- LPDIRECTSOUND pDS;
-
- TRACE("(%s,%p,%p)\n",debugstr_guid(lpcGUID),ppDS,pUnkOuter);
-
- if (ppDS == NULL) {
- WARN("invalid parameter: ppDS == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (pUnkOuter != NULL) {
- WARN("invalid parameter: pUnkOuter != NULL\n");
- *ppDS = 0;
- return DSERR_INVALIDPARAM;
- }
-
- hr = DSOUND_Create(&IID_IDirectSound, &pDS);
- if (hr == DS_OK) {
- hr = IDirectSound_Initialize(pDS, lpcGUID);
- if (hr != DS_OK) {
- if (hr != DSERR_ALREADYINITIALIZED) {
- IDirectSound_Release(pDS);
- pDS = 0;
- } else
- hr = DS_OK;
- }
- }
-
- *ppDS = pDS;
-
- return hr;
-}
-
-HRESULT DSOUND_Create8(
- REFIID riid,
- LPDIRECTSOUND8 *ppDS)
-{
- LPDIRECTSOUND8 pDS;
- HRESULT hr;
- TRACE("(%s, %p)\n", debugstr_guid(riid), ppDS);
-
- if (!IsEqualIID(riid, &IID_IUnknown) &&
- !IsEqualIID(riid, &IID_IDirectSound) &&
- !IsEqualIID(riid, &IID_IDirectSound8)) {
- *ppDS = 0;
- return E_NOINTERFACE;
- }
-
- /* Get dsound configuration */
- setup_dsound_options();
-
- hr = IDirectSoundImpl_Create(&pDS);
- if (hr == DS_OK) {
- hr = IDirectSound8_IDirectSound8_Create(pDS, ppDS);
- if (*ppDS)
- IDirectSound8_IDirectSound8_AddRef(*ppDS);
- else {
- WARN("IDirectSound8_IDirectSound8_Create failed\n");
- IDirectSound8_Release(pDS);
- }
- } else {
- WARN("IDirectSoundImpl_Create failed\n");
- *ppDS = 0;
- }
-
- return hr;
-}
-
-/*******************************************************************************
- * DirectSoundCreate8 (DSOUND.11)
- *
- * Creates and initializes a DirectSound8 interface.
- *
- * PARAMS
- * lpcGUID [I] Address of the GUID that identifies the sound device.
- * ppDS [O] Address of a variable to receive the interface pointer.
- * pUnkOuter [I] Must be NULL.
- *
- * RETURNS
- * Success: DS_OK
- * Failure: DSERR_ALLOCATED, DSERR_INVALIDPARAM, DSERR_NOAGGREGATION,
- * DSERR_NODRIVER, DSERR_OUTOFMEMORY
- */
-HRESULT WINAPI DirectSoundCreate8(
- LPCGUID lpcGUID,
- LPDIRECTSOUND8 *ppDS,
- IUnknown *pUnkOuter)
-{
- HRESULT hr;
- LPDIRECTSOUND8 pDS;
-
- TRACE("(%s,%p,%p)\n",debugstr_guid(lpcGUID),ppDS,pUnkOuter);
-
- if (ppDS == NULL) {
- WARN("invalid parameter: ppDS == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (pUnkOuter != NULL) {
- WARN("invalid parameter: pUnkOuter != NULL\n");
- *ppDS = 0;
- return DSERR_INVALIDPARAM;
- }
-
- hr = DSOUND_Create8(&IID_IDirectSound8, &pDS);
- if (hr == DS_OK) {
- hr = IDirectSound8_Initialize(pDS, lpcGUID);
- if (hr != DS_OK) {
- if (hr != DSERR_ALREADYINITIALIZED) {
- IDirectSound8_Release(pDS);
- pDS = 0;
- } else
- hr = DS_OK;
- }
- }
-
- *ppDS = pDS;
-
- return hr;
-}
-
-/*******************************************************************************
- * DirectSoundDevice
- */
-static HRESULT DirectSoundDevice_Create(DirectSoundDevice ** ppDevice)
-{
- DirectSoundDevice * device;
- TRACE("(%p)\n", ppDevice);
-
- /* Allocate memory */
- device = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(DirectSoundDevice));
- if (device == NULL) {
- WARN("out of memory\n");
- return DSERR_OUTOFMEMORY;
- }
-
- device->ref = 1;
- device->priolevel = DSSCL_NORMAL;
- device->state = STATE_STOPPED;
- device->speaker_config = DSSPEAKER_STEREO | (DSSPEAKER_GEOMETRY_NARROW << 16);
-
- /* 3D listener initial parameters */
- device->ds3dl.dwSize = sizeof(DS3DLISTENER);
- device->ds3dl.vPosition.x = 0.0;
- device->ds3dl.vPosition.y = 0.0;
- device->ds3dl.vPosition.z = 0.0;
- device->ds3dl.vVelocity.x = 0.0;
- device->ds3dl.vVelocity.y = 0.0;
- device->ds3dl.vVelocity.z = 0.0;
- device->ds3dl.vOrientFront.x = 0.0;
- device->ds3dl.vOrientFront.y = 0.0;
- device->ds3dl.vOrientFront.z = 1.0;
- device->ds3dl.vOrientTop.x = 0.0;
- device->ds3dl.vOrientTop.y = 1.0;
- device->ds3dl.vOrientTop.z = 0.0;
- device->ds3dl.flDistanceFactor = DS3D_DEFAULTDISTANCEFACTOR;
- device->ds3dl.flRolloffFactor = DS3D_DEFAULTROLLOFFFACTOR;
- device->ds3dl.flDopplerFactor = DS3D_DEFAULTDOPPLERFACTOR;
-
- device->prebuf = ds_snd_queue_max;
- device->guid = GUID_NULL;
-
- /* Set default wave format (may need it for waveOutOpen) */
- device->pwfx = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(WAVEFORMATEX));
- if (device->pwfx == NULL) {
- WARN("out of memory\n");
- HeapFree(GetProcessHeap(),0,device);
- return DSERR_OUTOFMEMORY;
- }
-
- /* We rely on the sound driver to return the actual sound format of
- * the device if it does not support 22050x8x2 and is given the
- * WAVE_DIRECTSOUND flag.
- */
- device->pwfx->wFormatTag = WAVE_FORMAT_PCM;
- device->pwfx->nSamplesPerSec = ds_default_sample_rate;
- device->pwfx->wBitsPerSample = ds_default_bits_per_sample;
- device->pwfx->nChannels = 2;
- device->pwfx->nBlockAlign = device->pwfx->wBitsPerSample * device->pwfx->nChannels / 8;
- device->pwfx->nAvgBytesPerSec = device->pwfx->nSamplesPerSec * device->pwfx->nBlockAlign;
- device->pwfx->cbSize = 0;
-
- InitializeCriticalSection(&(device->mixlock));
- device->mixlock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": DirectSoundDevice.mixlock");
-
- RtlInitializeResource(&(device->buffer_list_lock));
-
- *ppDevice = device;
-
- return DS_OK;
-}
-
-static ULONG DirectSoundDevice_AddRef(DirectSoundDevice * device)
-{
- ULONG ref = InterlockedIncrement(&(device->ref));
- TRACE("(%p) ref was %d\n", device, ref - 1);
- return ref;
-}
-
-ULONG DirectSoundDevice_Release(DirectSoundDevice * device)
-{
- HRESULT hr;
- ULONG ref = InterlockedDecrement(&(device->ref));
- TRACE("(%p) ref was %u\n", device, ref + 1);
- if (!ref) {
- int i;
- timeKillEvent(device->timerID);
- timeEndPeriod(DS_TIME_RES);
-
- /* The kill event should have allowed the timer process to expire
- * but try to grab the lock just in case. Can't hold lock because
- * IDirectSoundBufferImpl_Destroy also grabs the lock */
- RtlAcquireResourceShared(&(device->buffer_list_lock), TRUE);
- RtlReleaseResource(&(device->buffer_list_lock));
-
- /* It is allowed to release this object even when buffers are playing */
- if (device->buffers) {
- WARN("%d secondary buffers not released\n", device->nrofbuffers);
- for( i=0;i<device->nrofbuffers;i++)
- IDirectSoundBufferImpl_Destroy(device->buffers[i]);
- }
-
- if (device->primary) {
- WARN("primary buffer not released\n");
- IDirectSoundBuffer8_Release((LPDIRECTSOUNDBUFFER8)device->primary);
- }
-
- hr = DSOUND_PrimaryDestroy(device);
- if (hr != DS_OK)
- WARN("DSOUND_PrimaryDestroy failed\n");
-
- if (device->driver)
- IDsDriver_Close(device->driver);
-
- if (device->drvdesc.dwFlags & DSDDESC_DOMMSYSTEMOPEN)
- waveOutClose(device->hwo);
-
- if (device->driver)
- IDsDriver_Release(device->driver);
-
- DSOUND_renderer[device->drvdesc.dnDevNode] = NULL;
-
- HeapFree(GetProcessHeap(), 0, device->tmp_buffer);
- HeapFree(GetProcessHeap(), 0, device->mix_buffer);
- if (device->drvdesc.dwFlags & DSDDESC_USESYSTEMMEMORY)
- HeapFree(GetProcessHeap(), 0, device->buffer);
- RtlDeleteResource(&device->buffer_list_lock);
- device->mixlock.DebugInfo->Spare[0] = 0;
- DeleteCriticalSection(&device->mixlock);
- HeapFree(GetProcessHeap(),0,device);
- TRACE("(%p) released\n", device);
- }
- return ref;
-}
-
-HRESULT DirectSoundDevice_GetCaps(
- DirectSoundDevice * device,
- LPDSCAPS lpDSCaps)
-{
- TRACE("(%p,%p)\n",device,lpDSCaps);
-
- if (device == NULL) {
- WARN("not initialized\n");
- return DSERR_UNINITIALIZED;
- }
-
- if (lpDSCaps == NULL) {
- WARN("invalid parameter: lpDSCaps = NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- /* check if there is enough room */
- if (lpDSCaps->dwSize < sizeof(*lpDSCaps)) {
- WARN("invalid parameter: lpDSCaps->dwSize = %d\n", lpDSCaps->dwSize);
- return DSERR_INVALIDPARAM;
- }
-
- lpDSCaps->dwFlags = device->drvcaps.dwFlags;
- if (TRACE_ON(dsound)) {
- TRACE("(flags=0x%08x:\n",lpDSCaps->dwFlags);
- _dump_DSCAPS(lpDSCaps->dwFlags);
- TRACE(")\n");
- }
- lpDSCaps->dwMinSecondarySampleRate = device->drvcaps.dwMinSecondarySampleRate;
- lpDSCaps->dwMaxSecondarySampleRate = device->drvcaps.dwMaxSecondarySampleRate;
- lpDSCaps->dwPrimaryBuffers = device->drvcaps.dwPrimaryBuffers;
- lpDSCaps->dwMaxHwMixingAllBuffers = device->drvcaps.dwMaxHwMixingAllBuffers;
- lpDSCaps->dwMaxHwMixingStaticBuffers = device->drvcaps.dwMaxHwMixingStaticBuffers;
- lpDSCaps->dwMaxHwMixingStreamingBuffers = device->drvcaps.dwMaxHwMixingStreamingBuffers;
- lpDSCaps->dwFreeHwMixingAllBuffers = device->drvcaps.dwFreeHwMixingAllBuffers;
- lpDSCaps->dwFreeHwMixingStaticBuffers = device->drvcaps.dwFreeHwMixingStaticBuffers;
- lpDSCaps->dwFreeHwMixingStreamingBuffers = device->drvcaps.dwFreeHwMixingStreamingBuffers;
- lpDSCaps->dwMaxHw3DAllBuffers = device->drvcaps.dwMaxHw3DAllBuffers;
- lpDSCaps->dwMaxHw3DStaticBuffers = device->drvcaps.dwMaxHw3DStaticBuffers;
- lpDSCaps->dwMaxHw3DStreamingBuffers = device->drvcaps.dwMaxHw3DStreamingBuffers;
- lpDSCaps->dwFreeHw3DAllBuffers = device->drvcaps.dwFreeHw3DAllBuffers;
- lpDSCaps->dwFreeHw3DStaticBuffers = device->drvcaps.dwFreeHw3DStaticBuffers;
- lpDSCaps->dwFreeHw3DStreamingBuffers = device->drvcaps.dwFreeHw3DStreamingBuffers;
- lpDSCaps->dwTotalHwMemBytes = device->drvcaps.dwTotalHwMemBytes;
- lpDSCaps->dwFreeHwMemBytes = device->drvcaps.dwFreeHwMemBytes;
- lpDSCaps->dwMaxContigFreeHwMemBytes = device->drvcaps.dwMaxContigFreeHwMemBytes;
-
- /* driver doesn't have these */
- lpDSCaps->dwUnlockTransferRateHwBuffers = 4096; /* But we have none... */
- lpDSCaps->dwPlayCpuOverheadSwBuffers = 1; /* 1% */
-
- return DS_OK;
-}
-
-HRESULT DirectSoundDevice_Initialize(DirectSoundDevice ** ppDevice, LPCGUID lpcGUID)
-{
- HRESULT hr = DS_OK;
- unsigned wod, wodn;
- BOOLEAN found = FALSE;
- GUID devGUID;
- DirectSoundDevice * device = *ppDevice;
- TRACE("(%p,%s)\n",ppDevice,debugstr_guid(lpcGUID));
-
- if (*ppDevice != NULL) {
- WARN("already initialized\n");
- return DSERR_ALREADYINITIALIZED;
- }
-
- /* Default device? */
- if (!lpcGUID || IsEqualGUID(lpcGUID, &GUID_NULL))
- lpcGUID = &DSDEVID_DefaultPlayback;
-
- if (GetDeviceID(lpcGUID, &devGUID) != DS_OK) {
- WARN("invalid parameter: lpcGUID\n");
- return DSERR_INVALIDPARAM;
- }
-
- /* Enumerate WINMM audio devices and find the one we want */
- wodn = waveOutGetNumDevs();
- if (!wodn) {
- WARN("no driver\n");
- return DSERR_NODRIVER;
- }
-
- for (wod=0; wod<wodn; wod++) {
- if (IsEqualGUID( &devGUID, &DSOUND_renderer_guids[wod])) {
- found = TRUE;
- break;
- }
- }
-
- if (found == FALSE) {
- WARN("No device found matching given ID!\n");
- return DSERR_NODRIVER;
- }
-
- if (DSOUND_renderer[wod]) {
- if (IsEqualGUID(&devGUID, &DSOUND_renderer[wod]->guid)) {
- device = DSOUND_renderer[wod];
- DirectSoundDevice_AddRef(device);
- *ppDevice = device;
- return DS_OK;
- } else {
- ERR("device GUID doesn't match\n");
- hr = DSERR_GENERIC;
- return hr;
- }
- } else {
- hr = DirectSoundDevice_Create(&device);
- if (hr != DS_OK) {
- WARN("DirectSoundDevice_Create failed\n");
- return hr;
- }
- }
-
- *ppDevice = device;
- device->guid = devGUID;
- device->driver = NULL;
-
- device->drvdesc.dnDevNode = wod;
- hr = DSOUND_ReopenDevice(device, FALSE);
- if (FAILED(hr))
- {
- WARN("DSOUND_ReopenDevice failed: %08x\n", hr);
- return hr;
- }
-
- if (device->driver) {
- /* the driver is now open, so it's now allowed to call GetCaps */
- hr = IDsDriver_GetCaps(device->driver,&(device->drvcaps));
- if (hr != DS_OK) {
- WARN("IDsDriver_GetCaps failed\n");
- return hr;
- }
- } else {
- WAVEOUTCAPSA woc;
- hr = mmErr(waveOutGetDevCapsA(device->drvdesc.dnDevNode, &woc, sizeof(woc)));
- if (hr != DS_OK) {
- WARN("waveOutGetDevCaps failed\n");
- return hr;
- }
- ZeroMemory(&device->drvcaps, sizeof(device->drvcaps));
- if ((woc.dwFormats & WAVE_FORMAT_1M08) ||
- (woc.dwFormats & WAVE_FORMAT_2M08) ||
- (woc.dwFormats & WAVE_FORMAT_4M08) ||
- (woc.dwFormats & WAVE_FORMAT_48M08) ||
- (woc.dwFormats & WAVE_FORMAT_96M08)) {
- device->drvcaps.dwFlags |= DSCAPS_PRIMARY8BIT;
- device->drvcaps.dwFlags |= DSCAPS_PRIMARYMONO;
- }
- if ((woc.dwFormats & WAVE_FORMAT_1M16) ||
- (woc.dwFormats & WAVE_FORMAT_2M16) ||
- (woc.dwFormats & WAVE_FORMAT_4M16) ||
- (woc.dwFormats & WAVE_FORMAT_48M16) ||
- (woc.dwFormats & WAVE_FORMAT_96M16)) {
- device->drvcaps.dwFlags |= DSCAPS_PRIMARY16BIT;
- device->drvcaps.dwFlags |= DSCAPS_PRIMARYMONO;
- }
- if ((woc.dwFormats & WAVE_FORMAT_1S08) ||
- (woc.dwFormats & WAVE_FORMAT_2S08) ||
- (woc.dwFormats & WAVE_FORMAT_4S08) ||
- (woc.dwFormats & WAVE_FORMAT_48S08) ||
- (woc.dwFormats & WAVE_FORMAT_96S08)) {
- device->drvcaps.dwFlags |= DSCAPS_PRIMARY8BIT;
- device->drvcaps.dwFlags |= DSCAPS_PRIMARYSTEREO;
- }
- if ((woc.dwFormats & WAVE_FORMAT_1S16) ||
- (woc.dwFormats & WAVE_FORMAT_2S16) ||
- (woc.dwFormats & WAVE_FORMAT_4S16) ||
- (woc.dwFormats & WAVE_FORMAT_48S16) ||
- (woc.dwFormats & WAVE_FORMAT_96S16)) {
- device->drvcaps.dwFlags |= DSCAPS_PRIMARY16BIT;
- device->drvcaps.dwFlags |= DSCAPS_PRIMARYSTEREO;
- }
- if (ds_emuldriver)
- device->drvcaps.dwFlags |= DSCAPS_EMULDRIVER;
- device->drvcaps.dwMinSecondarySampleRate = DSBFREQUENCY_MIN;
- device->drvcaps.dwMaxSecondarySampleRate = DSBFREQUENCY_MAX;
- ZeroMemory(&device->volpan, sizeof(device->volpan));
- }
-
- hr = DSOUND_PrimaryCreate(device);
- if (hr == DS_OK) {
- UINT triggertime = DS_TIME_DEL, res = DS_TIME_RES, id;
- TIMECAPS time;
-
- DSOUND_renderer[device->drvdesc.dnDevNode] = device;
- timeGetDevCaps(&time, sizeof(TIMECAPS));
- TRACE("Minimum timer resolution: %u, max timer: %u\n", time.wPeriodMin, time.wPeriodMax);
- if (triggertime < time.wPeriodMin)
- triggertime = time.wPeriodMin;
- if (res < time.wPeriodMin)
- res = time.wPeriodMin;
- if (timeBeginPeriod(res) == TIMERR_NOCANDO)
- WARN("Could not set minimum resolution, don't expect sound\n");
- id = timeSetEvent(triggertime, res, DSOUND_timer, (DWORD_PTR)device, TIME_PERIODIC | TIME_KILL_SYNCHRONOUS);
- if (!id)
- {
- WARN("Timer not created! Retrying without TIME_KILL_SYNCHRONOUS\n");
- id = timeSetEvent(triggertime, res, DSOUND_timer, (DWORD_PTR)device, TIME_PERIODIC);
- if (!id) ERR("Could not create timer, sound playback will not occur\n");
- }
- DSOUND_renderer[device->drvdesc.dnDevNode]->timerID = id;
- } else {
- WARN("DSOUND_PrimaryCreate failed\n");
- }
-
- return hr;
-}
-
-HRESULT DirectSoundDevice_CreateSoundBuffer(
- DirectSoundDevice * device,
- LPCDSBUFFERDESC dsbd,
- LPLPDIRECTSOUNDBUFFER ppdsb,
- LPUNKNOWN lpunk,
- BOOL from8)
-{
- HRESULT hres = DS_OK;
- TRACE("(%p,%p,%p,%p)\n",device,dsbd,ppdsb,lpunk);
-
- if (device == NULL) {
- WARN("not initialized\n");
- return DSERR_UNINITIALIZED;
- }
-
- if (dsbd == NULL) {
- WARN("invalid parameter: dsbd == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (dsbd->dwSize != sizeof(DSBUFFERDESC) &&
- dsbd->dwSize != sizeof(DSBUFFERDESC1)) {
- WARN("invalid parameter: dsbd\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (ppdsb == NULL) {
- WARN("invalid parameter: ppdsb == NULL\n");
- return DSERR_INVALIDPARAM;
- }
- *ppdsb = NULL;
-
- if (TRACE_ON(dsound)) {
- TRACE("(structsize=%d)\n",dsbd->dwSize);
- TRACE("(flags=0x%08x:\n",dsbd->dwFlags);
- _dump_DSBCAPS(dsbd->dwFlags);
- TRACE(")\n");
- TRACE("(bufferbytes=%d)\n",dsbd->dwBufferBytes);
- TRACE("(lpwfxFormat=%p)\n",dsbd->lpwfxFormat);
- }
-
- if (dsbd->dwFlags & DSBCAPS_PRIMARYBUFFER) {
- if (dsbd->lpwfxFormat != NULL) {
- WARN("invalid parameter: dsbd->lpwfxFormat must be NULL for "
- "primary buffer\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (device->primary) {
- WARN("Primary Buffer already created\n");
- IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER8)(device->primary));
- *ppdsb = (LPDIRECTSOUNDBUFFER)(device->primary);
- } else {
- device->dsbd = *dsbd;
- device->dsbd.dwFlags &= ~(DSBCAPS_LOCHARDWARE | DSBCAPS_LOCSOFTWARE);
- if (device->hwbuf)
- device->dsbd.dwFlags |= DSBCAPS_LOCHARDWARE;
- else device->dsbd.dwFlags |= DSBCAPS_LOCSOFTWARE;
- hres = PrimaryBufferImpl_Create(device, &(device->primary), &(device->dsbd));
- if (device->primary) {
- IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER8)(device->primary));
- *ppdsb = (LPDIRECTSOUNDBUFFER)(device->primary);
- } else
- WARN("PrimaryBufferImpl_Create failed\n");
- }
- } else {
- IDirectSoundBufferImpl * dsb;
- WAVEFORMATEXTENSIBLE *pwfxe;
-
- if (dsbd->lpwfxFormat == NULL) {
- WARN("invalid parameter: dsbd->lpwfxFormat can't be NULL for "
- "secondary buffer\n");
- return DSERR_INVALIDPARAM;
- }
- pwfxe = (WAVEFORMATEXTENSIBLE*)dsbd->lpwfxFormat;
-
- if (pwfxe->Format.wBitsPerSample != 16 && pwfxe->Format.wBitsPerSample != 8 && pwfxe->Format.wFormatTag != WAVE_FORMAT_EXTENSIBLE)
- {
- WARN("wBitsPerSample=%d needs a WAVEFORMATEXTENSIBLE\n", dsbd->lpwfxFormat->wBitsPerSample);
- return DSERR_CONTROLUNAVAIL;
- }
- if (pwfxe->Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE)
- {
- if (pwfxe->Format.cbSize < (sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)))
- {
- WARN("Too small a cbSize %u\n", pwfxe->Format.cbSize);
- return DSERR_INVALIDPARAM;
- }
-
- if (pwfxe->Format.cbSize > (sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX)))
- {
- WARN("Too big a cbSize %u\n", pwfxe->Format.cbSize);
- return DSERR_CONTROLUNAVAIL;
- }
-
- if (!IsEqualGUID(&pwfxe->SubFormat, &KSDATAFORMAT_SUBTYPE_PCM))
- {
- if (!IsEqualGUID(&pwfxe->SubFormat, &GUID_NULL))
- FIXME("SubFormat %s not supported right now.\n", debugstr_guid(&pwfxe->SubFormat));
- return DSERR_INVALIDPARAM;
- }
- if (pwfxe->Samples.wValidBitsPerSample > dsbd->lpwfxFormat->wBitsPerSample)
- {
- WARN("Samples.wValidBitsPerSample(%d) > Format.wBitsPerSample (%d)\n", pwfxe->Samples.wValidBitsPerSample, pwfxe->Format.wBitsPerSample);
- return DSERR_INVALIDPARAM;
- }
- if (pwfxe->Samples.wValidBitsPerSample && pwfxe->Samples.wValidBitsPerSample < dsbd->lpwfxFormat->wBitsPerSample)
- {
- FIXME("Non-packed formats not supported right now: %d/%d\n", pwfxe->Samples.wValidBitsPerSample, dsbd->lpwfxFormat->wBitsPerSample);
- return DSERR_CONTROLUNAVAIL;
- }
- }
-
- TRACE("(formattag=0x%04x,chans=%d,samplerate=%d,"
- "bytespersec=%d,blockalign=%d,bitspersamp=%d,cbSize=%d)\n",
- dsbd->lpwfxFormat->wFormatTag, dsbd->lpwfxFormat->nChannels,
- dsbd->lpwfxFormat->nSamplesPerSec,
- dsbd->lpwfxFormat->nAvgBytesPerSec,
- dsbd->lpwfxFormat->nBlockAlign,
- dsbd->lpwfxFormat->wBitsPerSample, dsbd->lpwfxFormat->cbSize);
-
- if (from8 && (dsbd->dwFlags & DSBCAPS_CTRL3D) && (dsbd->lpwfxFormat->nChannels != 1)) {
- WARN("invalid parameter: 3D buffer format must be mono\n");
- return DSERR_INVALIDPARAM;
- }
-
- hres = IDirectSoundBufferImpl_Create(device, &dsb, dsbd);
- if (dsb) {
- hres = SecondaryBufferImpl_Create(dsb, (SecondaryBufferImpl**)ppdsb);
- if (*ppdsb) {
- dsb->secondary = (SecondaryBufferImpl*)*ppdsb;
- IDirectSoundBuffer_AddRef(*ppdsb);
- } else
- WARN("SecondaryBufferImpl_Create failed\n");
- } else
- WARN("IDirectSoundBufferImpl_Create failed\n");
- }
-
- return hres;
-}
-
-HRESULT DirectSoundDevice_DuplicateSoundBuffer(
- DirectSoundDevice * device,
- LPDIRECTSOUNDBUFFER psb,
- LPLPDIRECTSOUNDBUFFER ppdsb)
-{
- HRESULT hres = DS_OK;
- IDirectSoundBufferImpl* dsb;
- TRACE("(%p,%p,%p)\n",device,psb,ppdsb);
-
- if (device == NULL) {
- WARN("not initialized\n");
- return DSERR_UNINITIALIZED;
- }
-
- if (psb == NULL) {
- WARN("invalid parameter: psb == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (ppdsb == NULL) {
- WARN("invalid parameter: ppdsb == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- /* make sure we have a secondary buffer */
- if ((PrimaryBufferImpl *)psb == device->primary) {
- WARN("trying to duplicate primary buffer\n");
- *ppdsb = NULL;
- return DSERR_INVALIDCALL;
- }
-
- /* duplicate the actual buffer implementation */
- hres = IDirectSoundBufferImpl_Duplicate(device, &dsb,
- ((SecondaryBufferImpl *)psb)->dsb);
-
- if (hres == DS_OK) {
- /* create a new secondary buffer using the new implementation */
- hres = SecondaryBufferImpl_Create(dsb, (SecondaryBufferImpl**)ppdsb);
- if (*ppdsb) {
- dsb->secondary = (SecondaryBufferImpl*)*ppdsb;
- IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER8)*ppdsb);
- } else {
- WARN("SecondaryBufferImpl_Create failed\n");
- IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER8)dsb);
- IDirectSoundBuffer_Release((LPDIRECTSOUNDBUFFER8)dsb);
- }
- }
-
- return hres;
-}
-
-HRESULT DirectSoundDevice_SetCooperativeLevel(
- DirectSoundDevice * device,
- HWND hwnd,
- DWORD level)
-{
- TRACE("(%p,%p,%s)\n",device,hwnd,dumpCooperativeLevel(level));
-
- if (device == NULL) {
- WARN("not initialized\n");
- return DSERR_UNINITIALIZED;
- }
-
- if (level==DSSCL_PRIORITY || level==DSSCL_EXCLUSIVE) {
- WARN("level=%s not fully supported\n",
- level==DSSCL_PRIORITY ? "DSSCL_PRIORITY" : "DSSCL_EXCLUSIVE");
- }
-
- device->priolevel = level;
- return DS_OK;
-}
-
-HRESULT DirectSoundDevice_Compact(
- DirectSoundDevice * device)
-{
- TRACE("(%p)\n", device);
-
- if (device == NULL) {
- WARN("not initialized\n");
- return DSERR_UNINITIALIZED;
- }
-
- if (device->priolevel < DSSCL_PRIORITY) {
- WARN("incorrect priority level\n");
- return DSERR_PRIOLEVELNEEDED;
- }
-
- return DS_OK;
-}
-
-HRESULT DirectSoundDevice_GetSpeakerConfig(
- DirectSoundDevice * device,
- LPDWORD lpdwSpeakerConfig)
-{
- TRACE("(%p, %p)\n", device, lpdwSpeakerConfig);
-
- if (device == NULL) {
- WARN("not initialized\n");
- return DSERR_UNINITIALIZED;
- }
-
- if (lpdwSpeakerConfig == NULL) {
- WARN("invalid parameter: lpdwSpeakerConfig == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- WARN("not fully functional\n");
- *lpdwSpeakerConfig = device->speaker_config;
- return DS_OK;
-}
-
-HRESULT DirectSoundDevice_SetSpeakerConfig(
- DirectSoundDevice * device,
- DWORD config)
-{
- TRACE("(%p,0x%08x)\n",device,config);
-
- if (device == NULL) {
- WARN("not initialized\n");
- return DSERR_UNINITIALIZED;
- }
-
- device->speaker_config = config;
- WARN("not fully functional\n");
- return DS_OK;
-}
-
-static HRESULT DirectSoundDevice_VerifyCertification(
- DirectSoundDevice * device,
- LPDWORD pdwCertified)
-{
- TRACE("(%p, %p)\n",device,pdwCertified);
-
- if (device == NULL) {
- WARN("not initialized\n");
- return DSERR_UNINITIALIZED;
- }
-
- if (device->drvcaps.dwFlags & DSCAPS_CERTIFIED)
- *pdwCertified = DS_CERTIFIED;
- else
- *pdwCertified = DS_UNCERTIFIED;
-
- return DS_OK;
-}
-
-/*
- * Add secondary buffer to buffer list.
- * Gets exclusive access to buffer for writing.
- */
-HRESULT DirectSoundDevice_AddBuffer(
- DirectSoundDevice * device,
- IDirectSoundBufferImpl * pDSB)
-{
- IDirectSoundBufferImpl **newbuffers;
- HRESULT hr = DS_OK;
-
- TRACE("(%p, %p)\n", device, pDSB);
-
- RtlAcquireResourceExclusive(&(device->buffer_list_lock), TRUE);
-
- if (device->buffers)
- newbuffers = HeapReAlloc(GetProcessHeap(),0,device->buffers,sizeof(IDirectSoundBufferImpl*)*(device->nrofbuffers+1));
- else
- newbuffers = HeapAlloc(GetProcessHeap(),0,sizeof(IDirectSoundBufferImpl*)*(device->nrofbuffers+1));
-
- if (newbuffers) {
- device->buffers = newbuffers;
- device->buffers[device->nrofbuffers] = pDSB;
- device->nrofbuffers++;
- TRACE("buffer count is now %d\n", device->nrofbuffers);
- } else {
- ERR("out of memory for buffer list! Current buffer count is %d\n", device->nrofbuffers);
- hr = DSERR_OUTOFMEMORY;
- }
-
- RtlReleaseResource(&(device->buffer_list_lock));
-
- return hr;
-}
-
-/*
- * Remove secondary buffer from buffer list.
- * Gets exclusive access to buffer for writing.
- */
-HRESULT DirectSoundDevice_RemoveBuffer(
- DirectSoundDevice * device,
- IDirectSoundBufferImpl * pDSB)
-{
- int i;
- HRESULT hr = DS_OK;
-
- TRACE("(%p, %p)\n", device, pDSB);
-
- RtlAcquireResourceExclusive(&(device->buffer_list_lock), TRUE);
-
- for (i = 0; i < device->nrofbuffers; i++)
- if (device->buffers[i] == pDSB)
- break;
-
- if (i < device->nrofbuffers) {
- /* Put the last buffer of the list in the (now empty) position */
- device->buffers[i] = device->buffers[device->nrofbuffers - 1];
- device->nrofbuffers--;
- device->buffers = HeapReAlloc(GetProcessHeap(),0,device->buffers,sizeof(LPDIRECTSOUNDBUFFER8)*device->nrofbuffers);
- TRACE("buffer count is now %d\n", device->nrofbuffers);
- }
-
- if (device->nrofbuffers == 0) {
- HeapFree(GetProcessHeap(),0,device->buffers);
- device->buffers = NULL;
- }
-
- RtlReleaseResource(&(device->buffer_list_lock));
-
- return hr;
-}
+++ /dev/null
-<?xml version="1.0"?>
-<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
-<module name="dsound" type="win32dll" baseaddress="${BASEADDRESS_DSOUND}" installbase="system32" installname="dsound.dll" crt="msvcrt">
- <autoregister infsection="OleControlDlls" type="DllRegisterServer" />
- <importlibrary definition="dsound.spec" />
- <include base="dsound">.</include>
- <include base="ReactOS">include/reactos/wine</include>
- <define name="_WINE" />
- <library>wine</library>
- <library>uuid</library>
- <library>ntdll</library>
- <library>user32</library>
- <library>advapi32</library>
- <library>ole32</library>
- <library>winmm</library>
- <library>dxguid</library>
- <file>version.rc</file>
- <file>buffer.c</file>
- <file>capture.c</file>
- <file>dsound.c</file>
- <file>dsound_convert.c</file>
- <file>dsound_main.c</file>
- <file>duplex.c</file>
- <file>mixer.c</file>
- <file>primary.c</file>
- <file>propset.c</file>
- <file>regsvr.c</file>
- <file>sound3d.c</file>
-</module>
+++ /dev/null
-1 stdcall DirectSoundCreate(ptr ptr ptr)
-2 stdcall DirectSoundEnumerateA(ptr ptr)
-3 stdcall DirectSoundEnumerateW(ptr ptr)
-6 stdcall DirectSoundCaptureCreate(ptr ptr ptr)
-7 stdcall DirectSoundCaptureEnumerateA(ptr ptr)
-8 stdcall DirectSoundCaptureEnumerateW(ptr ptr)
-9 stdcall GetDeviceID(ptr ptr)
-10 stdcall DirectSoundFullDuplexCreate(ptr ptr ptr ptr long long ptr ptr ptr ptr)
-11 stdcall DirectSoundCreate8(ptr ptr ptr)
-12 stdcall DirectSoundCaptureCreate8(ptr ptr ptr)
-@ stdcall -private DllCanUnloadNow()
-@ stdcall -private DllGetClassObject(ptr ptr ptr)
-@ stdcall -private DllRegisterServer()
-@ stdcall -private DllUnregisterServer()
+++ /dev/null
-/* DirectSound format conversion and mixing routines
- *
- * Copyright 2007 Maarten Lankhorst
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-/* 8 bits is unsigned, the rest is signed.
- * First I tried to reuse existing stuff from alsa-lib, after that
- * didn't work, I gave up and just went for individual hacks.
- *
- * 24 bit is expensive to do, due to unaligned access.
- * In dlls/winex11.drv/dib_convert.c convert_888_to_0888_asis there is a way
- * around it, but I'm happy current code works, maybe something for later.
- *
- * The ^ 0x80 flips the signed bit, this is the conversion from
- * signed (-128.. 0.. 127) to unsigned (0...255)
- * This is only temporary: All 8 bit data should be converted to signed.
- * then when fed to the sound card, it should be converted to unsigned again.
- *
- * Sound is LITTLE endian
- */
-
-#include "config.h"
-
-#include <stdarg.h>
-
-#define NONAMELESSSTRUCT
-#define NONAMELESSUNION
-#include "windef.h"
-#include "winbase.h"
-#include "mmsystem.h"
-#include "winternl.h"
-#include "wine/debug.h"
-#include "dsound.h"
-#include "dsdriver.h"
-#include "dsound_private.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(dsound);
-
-#ifdef WORDS_BIGENDIAN
-#define le16(x) RtlUshortByteSwap((x))
-#define le32(x) RtlUlongByteSwap((x))
-#else
-#define le16(x) (x)
-#define le32(x) (x)
-#endif
-
-static inline void src_advance(const void **src, UINT stride, INT *count, UINT *freqAcc, UINT adj)
-{
- *freqAcc += adj;
- if (*freqAcc >= (1 << DSOUND_FREQSHIFT))
- {
- ULONG adv = (*freqAcc >> DSOUND_FREQSHIFT);
- *freqAcc &= (1 << DSOUND_FREQSHIFT) - 1;
- *(const char **)src += adv * stride;
- *count -= adv;
- }
-}
-
-static void convert_8_to_8 (const void *src, void *dst, UINT src_stride,
- UINT dst_stride, INT count, UINT freqAcc, UINT adj)
-{
- while (count > 0)
- {
- *(BYTE *)dst = *(const BYTE *)src;
-
- dst = (char *)dst + dst_stride;
- src_advance(&src, src_stride, &count, &freqAcc, adj);
- }
-}
-
-static void convert_8_to_16 (const void *src, void *dst, UINT src_stride,
- UINT dst_stride, INT count, UINT freqAcc, UINT adj)
-{
- while (count > 0)
- {
- WORD dest = *(const BYTE *)src, *dest16 = dst;
- *dest16 = le16(dest * 257 - 32768);
-
- dst = (char *)dst + dst_stride;
- src_advance(&src, src_stride, &count, &freqAcc, adj);
- }
-}
-
-static void convert_8_to_24 (const void *src, void *dst, UINT src_stride,
- UINT dst_stride, INT count, UINT freqAcc, UINT adj)
-{
- while (count > 0)
- {
- BYTE dest = *(const BYTE *)src;
- BYTE *dest24 = dst;
- dest24[0] = dest;
- dest24[1] = dest;
- dest24[2] = dest - 0x80;
-
- dst = (char *)dst + dst_stride;
- src_advance(&src, src_stride, &count, &freqAcc, adj);
- }
-}
-
-static void convert_8_to_32 (const void *src, void *dst, UINT src_stride,
- UINT dst_stride, INT count, UINT freqAcc, UINT adj)
-{
- while (count > 0)
- {
- DWORD dest = *(const BYTE *)src, *dest32 = dst;
- *dest32 = le32(dest * 16843009 - 2147483648U);
-
- dst = (char *)dst + dst_stride;
- src_advance(&src, src_stride, &count, &freqAcc, adj);
- }
-}
-
-static void convert_16_to_8 (const void *src, void *dst, UINT src_stride,
- UINT dst_stride, INT count, UINT freqAcc, UINT adj)
-{
- while (count > 0)
- {
- BYTE *dst8 = dst;
- *dst8 = (le16(*(const WORD *)src)) / 256;
- *dst8 -= 0x80;
-
- dst = (char *)dst + dst_stride;
- src_advance(&src, src_stride, &count, &freqAcc, adj);
- }
-}
-
-static void convert_16_to_16 (const void *src, void *dst, UINT src_stride,
- UINT dst_stride, INT count, UINT freqAcc, UINT adj)
-{
- while (count > 0)
- {
- *(WORD *)dst = *(const WORD *)src;
-
- dst = (char *)dst + dst_stride;
- src_advance(&src, src_stride, &count, &freqAcc, adj);
- }
-}
-
-static void convert_16_to_24 (const void *src, void *dst, UINT src_stride,
- UINT dst_stride, INT count, UINT freqAcc, UINT adj)
-{
- while (count > 0)
- {
- WORD dest = le16(*(const WORD *)src);
- BYTE *dest24 = dst;
-
- dest24[0] = dest / 256;
- dest24[1] = dest;
- dest24[2] = dest / 256;
-
- dst = (char *)dst + dst_stride;
- src_advance(&src, src_stride, &count, &freqAcc, adj);
- }
-}
-
-static void convert_16_to_32 (const void *src, void *dst, UINT src_stride,
- UINT dst_stride, INT count, UINT freqAcc, UINT adj)
-{
- while (count > 0)
- {
- DWORD dest = *(const WORD *)src, *dest32 = dst;
- *dest32 = dest * 65537;
-
- dst = (char *)dst + dst_stride;
- src_advance(&src, src_stride, &count, &freqAcc, adj);
- }
-}
-
-static void convert_24_to_8 (const void *src, void *dst, UINT src_stride,
- UINT dst_stride, INT count, UINT freqAcc, UINT adj)
-{
- while (count > 0)
- {
- BYTE *dst8 = dst;
- *dst8 = ((const BYTE *)src)[2];
-
- dst = (char *)dst + dst_stride;
- src_advance(&src, src_stride, &count, &freqAcc, adj);
- }
-}
-
-static void convert_24_to_16 (const void *src, void *dst, UINT src_stride,
- UINT dst_stride, INT count, UINT freqAcc, UINT adj)
-{
- while (count > 0)
- {
- WORD *dest16 = dst;
- const BYTE *source = src;
- *dest16 = le16(source[2] * 256 + source[1]);
-
- dst = (char *)dst + dst_stride;
- src_advance(&src, src_stride, &count, &freqAcc, adj);
- }
-}
-
-static void convert_24_to_24 (const void *src, void *dst, UINT src_stride,
- UINT dst_stride, INT count, UINT freqAcc, UINT adj)
-{
- while (count > 0)
- {
- BYTE *dest24 = dst;
- const BYTE *src24 = src;
-
- dest24[0] = src24[0];
- dest24[1] = src24[1];
- dest24[2] = src24[2];
-
- dst = (char *)dst + dst_stride;
- src_advance(&src, src_stride, &count, &freqAcc, adj);
- }
-}
-
-static void convert_24_to_32 (const void *src, void *dst, UINT src_stride,
- UINT dst_stride, INT count, UINT freqAcc, UINT adj)
-{
- while (count > 0)
- {
- DWORD *dest32 = dst;
- const BYTE *source = src;
- *dest32 = le32(source[2] * 16777217 + source[1] * 65536 + source[0] * 256);
-
- dst = (char *)dst + dst_stride;
- src_advance(&src, src_stride, &count, &freqAcc, adj);
- }
-}
-
-static void convert_32_to_8 (const void *src, void *dst, UINT src_stride,
- UINT dst_stride, INT count, UINT freqAcc, UINT adj)
-{
- while (count > 0)
- {
- BYTE *dst8 = dst;
- *dst8 = (le32(*(const DWORD *)src) / 16777216);
- *dst8 -= 0x80;
-
- dst = (char *)dst + dst_stride;
- src_advance(&src, src_stride, &count, &freqAcc, adj);
- }
-}
-
-static void convert_32_to_16 (const void *src, void *dst, UINT src_stride,
- UINT dst_stride, INT count, UINT freqAcc, UINT adj)
-{
- while (count > 0)
- {
- WORD *dest16 = dst;
- *dest16 = le16(le32(*(const DWORD *)src) / 65536);
-
- dst = (char *)dst + dst_stride;
- src_advance(&src, src_stride, &count, &freqAcc, adj);
- }
-}
-
-static void convert_32_to_24 (const void *src, void *dst, UINT src_stride,
- UINT dst_stride, INT count, UINT freqAcc, UINT adj)
-{
- while (count > 0)
- {
- DWORD dest = le32(*(const DWORD *)src);
- BYTE *dest24 = dst;
-
- dest24[0] = dest / 256;
- dest24[1] = dest / 65536;
- dest24[2] = dest / 16777216;
-
- dst = (char *)dst + dst_stride;
- src_advance(&src, src_stride, &count, &freqAcc, adj);
- }
-}
-
-static void convert_32_to_32 (const void *src, void *dst, UINT src_stride,
- UINT dst_stride, INT count, UINT freqAcc, UINT adj)
-{
- while (count > 0)
- {
- DWORD *dest = dst;
- *dest = *(const DWORD *)src;
-
- dst = (char *)dst + dst_stride;
- src_advance(&src, src_stride, &count, &freqAcc, adj);
- }
-}
-
-const bitsconvertfunc convertbpp[4][4] = {
- { convert_8_to_8, convert_8_to_16, convert_8_to_24, convert_8_to_32 },
- { convert_16_to_8, convert_16_to_16, convert_16_to_24, convert_16_to_32 },
- { convert_24_to_8, convert_24_to_16, convert_24_to_24, convert_24_to_32 },
- { convert_32_to_8, convert_32_to_16, convert_32_to_24, convert_32_to_32 },
-};
-
-static void mix8(signed char *src, INT *dst, unsigned len)
-{
- TRACE("%p - %p %d\n", src, dst, len);
- while (len--)
- /* 8-bit WAV is unsigned, it's here converted to signed, normalize function will convert it back again */
- *(dst++) += (signed char)((BYTE)*(src++) - (BYTE)0x80);
-}
-
-static void mix16(SHORT *src, INT *dst, unsigned len)
-{
- TRACE("%p - %p %d\n", src, dst, len);
- len /= 2;
- while (len--)
- {
- *dst += le16(*src);
- ++dst; ++src;
- }
-}
-
-static void mix24(BYTE *src, INT *dst, unsigned len)
-{
- TRACE("%p - %p %d\n", src, dst, len);
- len /= 3;
- while (len--)
- {
- DWORD field;
- field = ((DWORD)src[2] << 16) + ((DWORD)src[1] << 8) + (DWORD)src[0];
- if (src[2] & 0x80)
- field |= 0xFF000000U;
- *(dst++) += field;
- ++src;
- }
-}
-
-static void mix32(INT *src, LONGLONG *dst, unsigned len)
-{
- TRACE("%p - %p %d\n", src, dst, len);
- len /= 4;
- while (len--)
- *(dst++) += le32(*(src++));
-}
-
-const mixfunc mixfunctions[4] = {
- (mixfunc)mix8,
- (mixfunc)mix16,
- (mixfunc)mix24,
- (mixfunc)mix32
-};
-
-static void norm8(INT *src, signed char *dst, unsigned len)
-{
- TRACE("%p - %p %d\n", src, dst, len);
- while (len--)
- {
- *dst = (*src) + 0x80;
- if (*src < -0x80)
- *dst = 0;
- else if (*src > 0x7f)
- *dst = 0xff;
- ++dst;
- ++src;
- }
-}
-
-static void norm16(INT *src, SHORT *dst, unsigned len)
-{
- TRACE("%p - %p %d\n", src, dst, len);
- len /= 2;
- while (len--)
- {
- *dst = le16(*src);
- if (*src <= -0x8000)
- *dst = le16(0x8000);
- else if (*src > 0x7fff)
- *dst = le16(0x7fff);
- ++dst;
- ++src;
- }
-}
-
-static void norm24(INT *src, BYTE *dst, unsigned len)
-{
- TRACE("%p - %p %d\n", src, dst, len);
- len /= 3;
- while (len--)
- {
- if (*src <= -0x800000)
- {
- dst[0] = 0;
- dst[1] = 0;
- dst[2] = 0x80;
- }
- else if (*src > 0x7fffff)
- {
- dst[0] = 0xff;
- dst[1] = 0xff;
- dst[2] = 0x7f;
- }
- else
- {
- dst[0] = *src;
- dst[1] = *src >> 8;
- dst[2] = *src >> 16;
- }
- ++dst;
- ++src;
- }
-}
-
-static void norm32(LONGLONG *src, INT *dst, unsigned len)
-{
- TRACE("%p - %p %d\n", src, dst, len);
- len /= 4;
- while (len--)
- {
- *dst = le32(*src);
- if (*src <= -(LONGLONG)0x80000000)
- *dst = le32(0x80000000);
- else if (*src > 0x7fffffff)
- *dst = le32(0x7fffffff);
- ++dst;
- ++src;
- }
-}
-
-const normfunc normfunctions[4] = {
- (normfunc)norm8,
- (normfunc)norm16,
- (normfunc)norm24,
- (normfunc)norm32,
-};
+++ /dev/null
-/* DirectSound
- *
- * Copyright 1998 Marcus Meissner
- * Copyright 1998 Rob Riggs
- * Copyright 2000-2002 TransGaming Technologies, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- *
- * Most thread locking is complete. There may be a few race
- * conditions still lurking.
- *
- * TODO:
- * Implement SetCooperativeLevel properly (need to address focus issues)
- * Implement DirectSound3DBuffers (stubs in place)
- * Use hardware 3D support if available
- * Add critical section locking inside Release and AddRef methods
- * Handle static buffers - put those in hardware, non-static not in hardware
- * Hardware DuplicateSoundBuffer
- * Proper volume calculation for 3d buffers
- * Remove DS_HEL_FRAGS and use mixer fragment length for it
- */
-
-#include <stdarg.h>
-
-#define COBJMACROS
-#define NONAMELESSSTRUCT
-#define NONAMELESSUNION
-#include "windef.h"
-#include "winbase.h"
-#include "winuser.h"
-#include "winnls.h"
-#include "winreg.h"
-#include "mmsystem.h"
-#include "winternl.h"
-#include "mmddk.h"
-#include "wine/debug.h"
-#include "dsound.h"
-#include "dsconf.h"
-#include "ks.h"
-#include "initguid.h"
-#include "ksmedia.h"
-#include "dsdriver.h"
-
-#include "dsound_private.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(dsound);
-
-DirectSoundDevice* DSOUND_renderer[MAXWAVEDRIVERS];
-GUID DSOUND_renderer_guids[MAXWAVEDRIVERS];
-GUID DSOUND_capture_guids[MAXWAVEDRIVERS];
-
-HRESULT mmErr(UINT err)
-{
- switch(err) {
- case MMSYSERR_NOERROR:
- return DS_OK;
- case MMSYSERR_ALLOCATED:
- return DSERR_ALLOCATED;
- case MMSYSERR_ERROR:
- case MMSYSERR_INVALHANDLE:
- case WAVERR_STILLPLAYING:
- return DSERR_GENERIC; /* FIXME */
- case MMSYSERR_NODRIVER:
- return DSERR_NODRIVER;
- case MMSYSERR_NOMEM:
- return DSERR_OUTOFMEMORY;
- case MMSYSERR_INVALPARAM:
- case WAVERR_BADFORMAT:
- case WAVERR_UNPREPARED:
- return DSERR_INVALIDPARAM;
- case MMSYSERR_NOTSUPPORTED:
- return DSERR_UNSUPPORTED;
- default:
- FIXME("Unknown MMSYS error %d\n",err);
- return DSERR_GENERIC;
- }
-}
-
-/* All default settings, you most likely don't want to touch these, see wiki on UsefulRegistryKeys */
-int ds_emuldriver = 0;
-int ds_hel_buflen = 32768 * 2;
-int ds_snd_queue_max = 10;
-int ds_snd_queue_min = 6;
-int ds_snd_shadow_maxsize = 2;
-int ds_hw_accel = DS_HW_ACCEL_FULL;
-int ds_default_sample_rate = 44100;
-int ds_default_bits_per_sample = 16;
-static int ds_default_playback;
-static int ds_default_capture;
-
-/*
- * Get a config key from either the app-specific or the default config
- */
-
-static inline DWORD get_config_key( HKEY defkey, HKEY appkey, const char *name,
- char *buffer, DWORD size )
-{
- if (appkey && !RegQueryValueExA( appkey, name, 0, NULL, (LPBYTE)buffer, &size )) return 0;
- if (defkey && !RegQueryValueExA( defkey, name, 0, NULL, (LPBYTE)buffer, &size )) return 0;
- return ERROR_FILE_NOT_FOUND;
-}
-
-
-/*
- * Setup the dsound options.
- */
-
-void setup_dsound_options(void)
-{
- char buffer[MAX_PATH+16];
- HKEY hkey, appkey = 0;
- DWORD len;
-
- buffer[MAX_PATH]='\0';
-
- /* @@ Wine registry key: HKCU\Software\Wine\DirectSound */
- if (RegOpenKeyA( HKEY_CURRENT_USER, "Software\\Wine\\DirectSound", &hkey )) hkey = 0;
-
- len = GetModuleFileNameA( 0, buffer, MAX_PATH );
- if (len && len < MAX_PATH)
- {
- HKEY tmpkey;
- /* @@ Wine registry key: HKCU\Software\Wine\AppDefaults\app.exe\DirectSound */
- if (!RegOpenKeyA( HKEY_CURRENT_USER, "Software\\Wine\\AppDefaults", &tmpkey ))
- {
- char *p, *appname = buffer;
- if ((p = strrchr( appname, '/' ))) appname = p + 1;
- if ((p = strrchr( appname, '\\' ))) appname = p + 1;
- strcat( appname, "\\DirectSound" );
- TRACE("appname = [%s]\n", appname);
- if (RegOpenKeyA( tmpkey, appname, &appkey )) appkey = 0;
- RegCloseKey( tmpkey );
- }
- }
-
- /* get options */
-
- if (!get_config_key( hkey, appkey, "EmulDriver", buffer, MAX_PATH ))
- ds_emuldriver = strcmp(buffer, "N");
-
- if (!get_config_key( hkey, appkey, "HelBuflen", buffer, MAX_PATH ))
- ds_hel_buflen = atoi(buffer);
-
- if (!get_config_key( hkey, appkey, "SndQueueMax", buffer, MAX_PATH ))
- ds_snd_queue_max = atoi(buffer);
-
- if (!get_config_key( hkey, appkey, "SndQueueMin", buffer, MAX_PATH ))
- ds_snd_queue_min = atoi(buffer);
-
- if (!get_config_key( hkey, appkey, "HardwareAcceleration", buffer, MAX_PATH )) {
- if (strcmp(buffer, "Full") == 0)
- ds_hw_accel = DS_HW_ACCEL_FULL;
- else if (strcmp(buffer, "Standard") == 0)
- ds_hw_accel = DS_HW_ACCEL_STANDARD;
- else if (strcmp(buffer, "Basic") == 0)
- ds_hw_accel = DS_HW_ACCEL_BASIC;
- else if (strcmp(buffer, "Emulation") == 0)
- ds_hw_accel = DS_HW_ACCEL_EMULATION;
- }
-
- if (!get_config_key( hkey, appkey, "DefaultPlayback", buffer, MAX_PATH ))
- ds_default_playback = atoi(buffer);
-
- if (!get_config_key( hkey, appkey, "MaxShadowSize", buffer, MAX_PATH ))
- ds_snd_shadow_maxsize = atoi(buffer);
-
- if (!get_config_key( hkey, appkey, "DefaultCapture", buffer, MAX_PATH ))
- ds_default_capture = atoi(buffer);
-
- if (!get_config_key( hkey, appkey, "DefaultSampleRate", buffer, MAX_PATH ))
- ds_default_sample_rate = atoi(buffer);
-
- if (!get_config_key( hkey, appkey, "DefaultBitsPerSample", buffer, MAX_PATH ))
- ds_default_bits_per_sample = atoi(buffer);
-
- if (appkey) RegCloseKey( appkey );
- if (hkey) RegCloseKey( hkey );
-
- TRACE("ds_emuldriver = %d\n", ds_emuldriver);
- TRACE("ds_hel_buflen = %d\n", ds_hel_buflen);
- TRACE("ds_snd_queue_max = %d\n", ds_snd_queue_max);
- TRACE("ds_snd_queue_min = %d\n", ds_snd_queue_min);
- TRACE("ds_hw_accel = %s\n",
- ds_hw_accel==DS_HW_ACCEL_FULL ? "Full" :
- ds_hw_accel==DS_HW_ACCEL_STANDARD ? "Standard" :
- ds_hw_accel==DS_HW_ACCEL_BASIC ? "Basic" :
- ds_hw_accel==DS_HW_ACCEL_EMULATION ? "Emulation" :
- "Unknown");
- TRACE("ds_default_playback = %d\n", ds_default_playback);
- TRACE("ds_default_capture = %d\n", ds_default_playback);
- TRACE("ds_default_sample_rate = %d\n", ds_default_sample_rate);
- TRACE("ds_default_bits_per_sample = %d\n", ds_default_bits_per_sample);
- TRACE("ds_snd_shadow_maxsize = %d\n", ds_snd_shadow_maxsize);
-}
-
-static const char * get_device_id(LPCGUID pGuid)
-{
- if (IsEqualGUID(&DSDEVID_DefaultPlayback, pGuid))
- return "DSDEVID_DefaultPlayback";
- else if (IsEqualGUID(&DSDEVID_DefaultVoicePlayback, pGuid))
- return "DSDEVID_DefaultVoicePlayback";
- else if (IsEqualGUID(&DSDEVID_DefaultCapture, pGuid))
- return "DSDEVID_DefaultCapture";
- else if (IsEqualGUID(&DSDEVID_DefaultVoiceCapture, pGuid))
- return "DSDEVID_DefaultVoiceCapture";
- return debugstr_guid(pGuid);
-}
-
-/***************************************************************************
- * GetDeviceID [DSOUND.9]
- *
- * Retrieves unique identifier of default device specified
- *
- * PARAMS
- * pGuidSrc [I] Address of device GUID.
- * pGuidDest [O] Address to receive unique device GUID.
- *
- * RETURNS
- * Success: DS_OK
- * Failure: DSERR_INVALIDPARAM
- *
- * NOTES
- * pGuidSrc is a valid device GUID or DSDEVID_DefaultPlayback,
- * DSDEVID_DefaultCapture, DSDEVID_DefaultVoicePlayback, or
- * DSDEVID_DefaultVoiceCapture.
- * Returns pGuidSrc if pGuidSrc is a valid device or the device
- * GUID for the specified constants.
- */
-HRESULT WINAPI GetDeviceID(LPCGUID pGuidSrc, LPGUID pGuidDest)
-{
- TRACE("(%s,%p)\n", get_device_id(pGuidSrc),pGuidDest);
-
- if ( pGuidSrc == NULL) {
- WARN("invalid parameter: pGuidSrc == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if ( pGuidDest == NULL ) {
- WARN("invalid parameter: pGuidDest == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if ( IsEqualGUID( &DSDEVID_DefaultPlayback, pGuidSrc ) ||
- IsEqualGUID( &DSDEVID_DefaultVoicePlayback, pGuidSrc ) ) {
- *pGuidDest = DSOUND_renderer_guids[ds_default_playback];
- TRACE("returns %s\n", get_device_id(pGuidDest));
- return DS_OK;
- }
-
- if ( IsEqualGUID( &DSDEVID_DefaultCapture, pGuidSrc ) ||
- IsEqualGUID( &DSDEVID_DefaultVoiceCapture, pGuidSrc ) ) {
- *pGuidDest = DSOUND_capture_guids[ds_default_capture];
- TRACE("returns %s\n", get_device_id(pGuidDest));
- return DS_OK;
- }
-
- *pGuidDest = *pGuidSrc;
- TRACE("returns %s\n", get_device_id(pGuidDest));
-
- return DS_OK;
-}
-
-
-/***************************************************************************
- * DirectSoundEnumerateA [DSOUND.2]
- *
- * Enumerate all DirectSound drivers installed in the system
- *
- * PARAMS
- * lpDSEnumCallback [I] Address of callback function.
- * lpContext [I] Address of user defined context passed to callback function.
- *
- * RETURNS
- * Success: DS_OK
- * Failure: DSERR_INVALIDPARAM
- */
-HRESULT WINAPI DirectSoundEnumerateA(
- LPDSENUMCALLBACKA lpDSEnumCallback,
- LPVOID lpContext)
-{
- unsigned devs, wod;
- DSDRIVERDESC desc;
- GUID guid;
- int err;
-
- TRACE("lpDSEnumCallback = %p, lpContext = %p\n",
- lpDSEnumCallback, lpContext);
-
- if (lpDSEnumCallback == NULL) {
- WARN("invalid parameter: lpDSEnumCallback == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- devs = waveOutGetNumDevs();
- if (devs > 0) {
- if (GetDeviceID(&DSDEVID_DefaultPlayback, &guid) == DS_OK) {
- for (wod = 0; wod < devs; ++wod) {
- if (IsEqualGUID( &guid, &DSOUND_renderer_guids[wod]) ) {
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- TRACE("calling lpDSEnumCallback(NULL,\"%s\",\"%s\",%p)\n",
- "Primary Sound Driver","",lpContext);
- if (lpDSEnumCallback(NULL, "Primary Sound Driver", "", lpContext) == FALSE)
- return DS_OK;
- }
- }
- }
- }
- }
-
- for (wod = 0; wod < devs; ++wod) {
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- TRACE("calling lpDSEnumCallback(%s,\"%s\",\"%s\",%p)\n",
- debugstr_guid(&DSOUND_renderer_guids[wod]),desc.szDesc,desc.szDrvname,lpContext);
- if (lpDSEnumCallback(&DSOUND_renderer_guids[wod], desc.szDesc, desc.szDrvname, lpContext) == FALSE)
- return DS_OK;
- }
- }
- return DS_OK;
-}
-
-/***************************************************************************
- * DirectSoundEnumerateW [DSOUND.3]
- *
- * Enumerate all DirectSound drivers installed in the system
- *
- * PARAMS
- * lpDSEnumCallback [I] Address of callback function.
- * lpContext [I] Address of user defined context passed to callback function.
- *
- * RETURNS
- * Success: DS_OK
- * Failure: DSERR_INVALIDPARAM
- */
-HRESULT WINAPI DirectSoundEnumerateW(
- LPDSENUMCALLBACKW lpDSEnumCallback,
- LPVOID lpContext )
-{
- unsigned devs, wod;
- DSDRIVERDESC desc;
- GUID guid;
- int err;
- WCHAR wDesc[MAXPNAMELEN];
- WCHAR wName[MAXPNAMELEN];
-
- TRACE("lpDSEnumCallback = %p, lpContext = %p\n",
- lpDSEnumCallback, lpContext);
-
- if (lpDSEnumCallback == NULL) {
- WARN("invalid parameter: lpDSEnumCallback == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- devs = waveOutGetNumDevs();
- if (devs > 0) {
- if (GetDeviceID(&DSDEVID_DefaultPlayback, &guid) == DS_OK) {
- static const WCHAR empty[] = { 0 };
- for (wod = 0; wod < devs; ++wod) {
- if (IsEqualGUID( &guid, &DSOUND_renderer_guids[wod] ) ) {
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- TRACE("calling lpDSEnumCallback(NULL,\"%s\",\"%s\",%p)\n",
- "Primary Sound Driver",desc.szDrvname,lpContext);
- MultiByteToWideChar( CP_ACP, 0, "Primary Sound Driver", -1,
- wDesc, sizeof(wDesc)/sizeof(WCHAR) );
- if (lpDSEnumCallback(NULL, wDesc, empty, lpContext) == FALSE)
- return DS_OK;
- }
- }
- }
- }
- }
-
- for (wod = 0; wod < devs; ++wod) {
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- TRACE("calling lpDSEnumCallback(%s,\"%s\",\"%s\",%p)\n",
- debugstr_guid(&DSOUND_renderer_guids[wod]),desc.szDesc,desc.szDrvname,lpContext);
- MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1,
- wDesc, sizeof(wDesc)/sizeof(WCHAR) );
- MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1,
- wName, sizeof(wName)/sizeof(WCHAR) );
- if (lpDSEnumCallback(&DSOUND_renderer_guids[wod], wDesc, wName, lpContext) == FALSE)
- return DS_OK;
- }
- }
- return DS_OK;
-}
-
-/*******************************************************************************
- * DirectSound ClassFactory
- */
-
-typedef HRESULT (*FnCreateInstance)(REFIID riid, LPVOID *ppobj);
-
-typedef struct {
- const IClassFactoryVtbl *lpVtbl;
- LONG ref;
- REFCLSID rclsid;
- FnCreateInstance pfnCreateInstance;
-} IClassFactoryImpl;
-
-static HRESULT WINAPI
-DSCF_QueryInterface(LPCLASSFACTORY iface, REFIID riid, LPVOID *ppobj)
-{
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- TRACE("(%p, %s, %p)\n", This, debugstr_guid(riid), ppobj);
- if (ppobj == NULL)
- return E_POINTER;
- if (IsEqualIID(riid, &IID_IUnknown) ||
- IsEqualIID(riid, &IID_IClassFactory))
- {
- *ppobj = iface;
- IUnknown_AddRef(iface);
- return S_OK;
- }
- *ppobj = NULL;
- return E_NOINTERFACE;
-}
-
-static ULONG WINAPI DSCF_AddRef(LPCLASSFACTORY iface)
-{
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
-}
-
-static ULONG WINAPI DSCF_Release(LPCLASSFACTORY iface)
-{
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref + 1);
- /* static class, won't be freed */
- return ref;
-}
-
-static HRESULT WINAPI DSCF_CreateInstance(
- LPCLASSFACTORY iface,
- LPUNKNOWN pOuter,
- REFIID riid,
- LPVOID *ppobj)
-{
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- TRACE("(%p, %p, %s, %p)\n", This, pOuter, debugstr_guid(riid), ppobj);
-
- if (pOuter)
- return CLASS_E_NOAGGREGATION;
-
- if (ppobj == NULL) {
- WARN("invalid parameter\n");
- return DSERR_INVALIDPARAM;
- }
- *ppobj = NULL;
- return This->pfnCreateInstance(riid, ppobj);
-}
-
-static HRESULT WINAPI DSCF_LockServer(LPCLASSFACTORY iface, BOOL dolock)
-{
- IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
- FIXME("(%p, %d) stub!\n", This, dolock);
- return S_OK;
-}
-
-static const IClassFactoryVtbl DSCF_Vtbl = {
- DSCF_QueryInterface,
- DSCF_AddRef,
- DSCF_Release,
- DSCF_CreateInstance,
- DSCF_LockServer
-};
-
-static IClassFactoryImpl DSOUND_CF[] = {
- { &DSCF_Vtbl, 1, &CLSID_DirectSound, (FnCreateInstance)DSOUND_Create },
- { &DSCF_Vtbl, 1, &CLSID_DirectSound8, (FnCreateInstance)DSOUND_Create8 },
- { &DSCF_Vtbl, 1, &CLSID_DirectSoundCapture, (FnCreateInstance)DSOUND_CaptureCreate },
- { &DSCF_Vtbl, 1, &CLSID_DirectSoundCapture8, (FnCreateInstance)DSOUND_CaptureCreate8 },
- { &DSCF_Vtbl, 1, &CLSID_DirectSoundFullDuplex, (FnCreateInstance)DSOUND_FullDuplexCreate },
- { &DSCF_Vtbl, 1, &CLSID_DirectSoundPrivate, (FnCreateInstance)IKsPrivatePropertySetImpl_Create },
- { NULL, 0, NULL, NULL }
-};
-
-/*******************************************************************************
- * DllGetClassObject [DSOUND.@]
- * Retrieves class object from a DLL object
- *
- * NOTES
- * Docs say returns STDAPI
- *
- * PARAMS
- * rclsid [I] CLSID for the class object
- * riid [I] Reference to identifier of interface for class object
- * ppv [O] Address of variable to receive interface pointer for riid
- *
- * RETURNS
- * Success: S_OK
- * Failure: CLASS_E_CLASSNOTAVAILABLE, E_OUTOFMEMORY, E_INVALIDARG,
- * E_UNEXPECTED
- */
-HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
-{
- int i = 0;
- TRACE("(%s, %s, %p)\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
-
- if (ppv == NULL) {
- WARN("invalid parameter\n");
- return E_INVALIDARG;
- }
-
- *ppv = NULL;
-
- if (!IsEqualIID(riid, &IID_IClassFactory) &&
- !IsEqualIID(riid, &IID_IUnknown)) {
- WARN("no interface for %s\n", debugstr_guid(riid));
- return E_NOINTERFACE;
- }
-
- while (NULL != DSOUND_CF[i].rclsid) {
- if (IsEqualGUID(rclsid, DSOUND_CF[i].rclsid)) {
- DSCF_AddRef((IClassFactory*) &DSOUND_CF[i]);
- *ppv = &DSOUND_CF[i];
- return S_OK;
- }
- i++;
- }
-
- WARN("(%s, %s, %p): no class found.\n", debugstr_guid(rclsid),
- debugstr_guid(riid), ppv);
- return CLASS_E_CLASSNOTAVAILABLE;
-}
-
-
-/*******************************************************************************
- * DllCanUnloadNow [DSOUND.4]
- * Determines whether the DLL is in use.
- *
- * RETURNS
- * Success: S_OK
- * Failure: S_FALSE
- */
-HRESULT WINAPI DllCanUnloadNow(void)
-{
- FIXME("(void): stub\n");
- return S_FALSE;
-}
-
-#define INIT_GUID(guid, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
- guid.Data1 = l; guid.Data2 = w1; guid.Data3 = w2; \
- guid.Data4[0] = b1; guid.Data4[1] = b2; guid.Data4[2] = b3; \
- guid.Data4[3] = b4; guid.Data4[4] = b5; guid.Data4[5] = b6; \
- guid.Data4[6] = b7; guid.Data4[7] = b8;
-
-/***********************************************************************
- * DllMain (DSOUND.init)
- */
-BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved)
-{
- int i;
- TRACE("(%p %d %p)\n", hInstDLL, fdwReason, lpvReserved);
-
- switch (fdwReason) {
- case DLL_PROCESS_ATTACH:
- TRACE("DLL_PROCESS_ATTACH\n");
- for (i = 0; i < MAXWAVEDRIVERS; i++) {
- DSOUND_renderer[i] = NULL;
- DSOUND_capture[i] = NULL;
- INIT_GUID(DSOUND_renderer_guids[i], 0xbd6dd71a, 0x3deb, 0x11d1, 0xb1, 0x71, 0x00, 0xc0, 0x4f, 0xc2, 0x00, 0x00 + i);
- INIT_GUID(DSOUND_capture_guids[i], 0xbd6dd71b, 0x3deb, 0x11d1, 0xb1, 0x71, 0x00, 0xc0, 0x4f, 0xc2, 0x00, 0x00 + i);
- }
- DisableThreadLibraryCalls(hInstDLL);
- /* Increase refcount on dsound by 1 */
- GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCWSTR)hInstDLL, &hInstDLL);
- break;
- case DLL_PROCESS_DETACH:
- TRACE("DLL_PROCESS_DETACH\n");
- break;
- default:
- TRACE("UNKNOWN REASON\n");
- break;
- }
- return TRUE;
-}
+++ /dev/null
-/* DirectSound
- *
- * Copyright 1998 Marcus Meissner
- * Copyright 1998 Rob Riggs
- * Copyright 2000-2001 TransGaming Technologies, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-/* Linux does not support better timing than 10ms */
-#define DS_TIME_RES 2 /* Resolution of multimedia timer */
-#define DS_TIME_DEL 10 /* Delay of multimedia timer callback, and duration of HEL fragment */
-
-#include "wine/list.h"
-
-/* direct sound hardware acceleration levels */
-#define DS_HW_ACCEL_FULL 0 /* default on Windows 98 */
-#define DS_HW_ACCEL_STANDARD 1 /* default on Windows 2000 */
-#define DS_HW_ACCEL_BASIC 2
-#define DS_HW_ACCEL_EMULATION 3
-
-extern int ds_emuldriver;
-extern int ds_hel_buflen;
-extern int ds_snd_queue_max;
-extern int ds_snd_queue_min;
-extern int ds_snd_shadow_maxsize;
-extern int ds_hw_accel;
-extern int ds_default_sample_rate;
-extern int ds_default_bits_per_sample;
-
-/*****************************************************************************
- * Predeclare the interface implementation structures
- */
-typedef struct IDirectSoundImpl IDirectSoundImpl;
-typedef struct IDirectSound_IUnknown IDirectSound_IUnknown;
-typedef struct IDirectSound_IDirectSound IDirectSound_IDirectSound;
-typedef struct IDirectSound8_IUnknown IDirectSound8_IUnknown;
-typedef struct IDirectSound8_IDirectSound IDirectSound8_IDirectSound;
-typedef struct IDirectSound8_IDirectSound8 IDirectSound8_IDirectSound8;
-typedef struct IDirectSoundBufferImpl IDirectSoundBufferImpl;
-typedef struct IDirectSoundCaptureImpl IDirectSoundCaptureImpl;
-typedef struct IDirectSoundCaptureBufferImpl IDirectSoundCaptureBufferImpl;
-typedef struct IDirectSoundFullDuplexImpl IDirectSoundFullDuplexImpl;
-typedef struct IDirectSoundFullDuplex_IUnknown IDirectSoundFullDuplex_IUnknown;
-typedef struct IDirectSoundFullDuplex_IDirectSound IDirectSoundFullDuplex_IDirectSound;
-typedef struct IDirectSoundFullDuplex_IDirectSound8 IDirectSoundFullDuplex_IDirectSound8;
-typedef struct IDirectSoundFullDuplex_IDirectSoundCapture IDirectSoundFullDuplex_IDirectSoundCapture;
-typedef struct IDirectSoundNotifyImpl IDirectSoundNotifyImpl;
-typedef struct IDirectSoundCaptureNotifyImpl IDirectSoundCaptureNotifyImpl;
-typedef struct IDirectSound3DListenerImpl IDirectSound3DListenerImpl;
-typedef struct IDirectSound3DBufferImpl IDirectSound3DBufferImpl;
-typedef struct IKsBufferPropertySetImpl IKsBufferPropertySetImpl;
-typedef struct IKsPrivatePropertySetImpl IKsPrivatePropertySetImpl;
-typedef struct PrimaryBufferImpl PrimaryBufferImpl;
-typedef struct SecondaryBufferImpl SecondaryBufferImpl;
-typedef struct DirectSoundDevice DirectSoundDevice;
-typedef struct DirectSoundCaptureDevice DirectSoundCaptureDevice;
-
-/* dsound_convert.h */
-typedef void (*bitsconvertfunc)(const void *, void *, UINT, UINT, INT, UINT, UINT);
-extern const bitsconvertfunc convertbpp[4][4];
-typedef void (*mixfunc)(const void *, void *, unsigned);
-extern const mixfunc mixfunctions[4];
-typedef void (*normfunc)(const void *, void *, unsigned);
-extern const normfunc normfunctions[4];
-
-/*****************************************************************************
- * IDirectSoundDevice implementation structure
- */
-struct DirectSoundDevice
-{
- LONG ref;
-
- GUID guid;
- PIDSDRIVER driver;
- DSDRIVERDESC drvdesc;
- DSDRIVERCAPS drvcaps;
- DWORD priolevel;
- PWAVEFORMATEX pwfx;
- HWAVEOUT hwo;
- LPWAVEHDR pwave;
- UINT timerID, pwplay, pwqueue, prebuf, helfrags;
- DWORD fraglen;
- PIDSDRIVERBUFFER hwbuf;
- LPBYTE buffer;
- DWORD writelead, buflen, state, playpos, mixpos;
- int nrofbuffers;
- IDirectSoundBufferImpl** buffers;
- RTL_RWLOCK buffer_list_lock;
- CRITICAL_SECTION mixlock;
- PrimaryBufferImpl* primary;
- DSBUFFERDESC dsbd;
- DWORD speaker_config;
- LPBYTE tmp_buffer, mix_buffer;
- DWORD tmp_buffer_len, mix_buffer_len;
-
- DSVOLUMEPAN volpan;
-
- mixfunc mixfunction;
- normfunc normfunction;
-
- /* DirectSound3DListener fields */
- IDirectSound3DListenerImpl* listener;
- DS3DLISTENER ds3dl;
- BOOL ds3dl_need_recalc;
-};
-
-/* reference counted buffer memory for duplicated buffer memory */
-typedef struct BufferMemory
-{
- LONG ref;
- LPBYTE memory;
- struct list buffers;
-} BufferMemory;
-
-ULONG DirectSoundDevice_Release(DirectSoundDevice * device);
-HRESULT DirectSoundDevice_Initialize(
- DirectSoundDevice ** ppDevice,
- LPCGUID lpcGUID);
-HRESULT DirectSoundDevice_AddBuffer(
- DirectSoundDevice * device,
- IDirectSoundBufferImpl * pDSB);
-HRESULT DirectSoundDevice_RemoveBuffer(
- DirectSoundDevice * device,
- IDirectSoundBufferImpl * pDSB);
-HRESULT DirectSoundDevice_GetCaps(DirectSoundDevice * device, LPDSCAPS lpDSCaps);
-HRESULT DirectSoundDevice_CreateSoundBuffer(
- DirectSoundDevice * device,
- LPCDSBUFFERDESC dsbd,
- LPLPDIRECTSOUNDBUFFER ppdsb,
- LPUNKNOWN lpunk,
- BOOL from8);
-HRESULT DirectSoundDevice_DuplicateSoundBuffer(
- DirectSoundDevice * device,
- LPDIRECTSOUNDBUFFER psb,
- LPLPDIRECTSOUNDBUFFER ppdsb);
-HRESULT DirectSoundDevice_SetCooperativeLevel(
- DirectSoundDevice * devcie,
- HWND hwnd,
- DWORD level);
-HRESULT DirectSoundDevice_Compact(DirectSoundDevice * device);
-HRESULT DirectSoundDevice_GetSpeakerConfig(
- DirectSoundDevice * device,
- LPDWORD lpdwSpeakerConfig);
-HRESULT DirectSoundDevice_SetSpeakerConfig(
- DirectSoundDevice * device,
- DWORD config);
-
-/*****************************************************************************
- * IDirectSoundBuffer implementation structure
- */
-struct IDirectSoundBufferImpl
-{
- /* FIXME: document */
- /* IUnknown fields */
- const IDirectSoundBuffer8Vtbl *lpVtbl;
- LONG ref;
- /* IDirectSoundBufferImpl fields */
- SecondaryBufferImpl* secondary;
- DirectSoundDevice* device;
- RTL_RWLOCK lock;
- PIDSDRIVERBUFFER hwbuf;
- PWAVEFORMATEX pwfx;
- BufferMemory* buffer;
- LPBYTE tmp_buffer;
- DWORD playflags,state,leadin;
- DWORD writelead,buflen;
- DWORD nAvgBytesPerSec;
- DWORD freq, tmp_buffer_len, max_buffer_len;
- DSVOLUMEPAN volpan;
- DSBUFFERDESC dsbd;
- /* used for frequency conversion (PerfectPitch) */
- ULONG freqneeded, freqAdjust, freqAcc, freqAccNext, resampleinmixer;
- /* used for mixing */
- DWORD primary_mixpos, buf_mixpos, sec_mixpos;
-
- /* IDirectSoundNotifyImpl fields */
- IDirectSoundNotifyImpl* notify;
- LPDSBPOSITIONNOTIFY notifies;
- int nrofnotifies;
- PIDSDRIVERNOTIFY hwnotify;
-
- /* DirectSound3DBuffer fields */
- IDirectSound3DBufferImpl* ds3db;
- DS3DBUFFER ds3db_ds3db;
- LONG ds3db_lVolume;
- BOOL ds3db_need_recalc;
-
- /* IKsPropertySet fields */
- IKsBufferPropertySetImpl* iks;
- bitsconvertfunc convert;
- struct list entry;
-};
-
-HRESULT IDirectSoundBufferImpl_Create(
- DirectSoundDevice *device,
- IDirectSoundBufferImpl **ppdsb,
- LPCDSBUFFERDESC dsbd);
-HRESULT IDirectSoundBufferImpl_Destroy(
- IDirectSoundBufferImpl *pdsb);
-HRESULT IDirectSoundBufferImpl_Duplicate(
- DirectSoundDevice *device,
- IDirectSoundBufferImpl **ppdsb,
- IDirectSoundBufferImpl *pdsb);
-
-/*****************************************************************************
- * SecondaryBuffer implementation structure
- */
-struct SecondaryBufferImpl
-{
- const IDirectSoundBuffer8Vtbl *lpVtbl;
- LONG ref;
- IDirectSoundBufferImpl* dsb;
-};
-
-HRESULT SecondaryBufferImpl_Create(
- IDirectSoundBufferImpl *dsb,
- SecondaryBufferImpl **pdsb);
-
-/*****************************************************************************
- * PrimaryBuffer implementation structure
- */
-struct PrimaryBufferImpl
-{
- const IDirectSoundBufferVtbl *lpVtbl;
- LONG ref;
- DirectSoundDevice* device;
-};
-
-HRESULT PrimaryBufferImpl_Create(
- DirectSoundDevice * device,
- PrimaryBufferImpl **ppdsb,
- LPCDSBUFFERDESC dsbd);
-
-/*****************************************************************************
- * DirectSoundCaptureDevice implementation structure
- */
-struct DirectSoundCaptureDevice
-{
- /* IDirectSoundCaptureImpl fields */
- GUID guid;
- LONG ref;
-
- /* DirectSound driver stuff */
- PIDSCDRIVER driver;
- DSDRIVERDESC drvdesc;
- DSCDRIVERCAPS drvcaps;
- PIDSCDRIVERBUFFER hwbuf;
-
- /* wave driver info */
- HWAVEIN hwi;
-
- /* more stuff */
- LPBYTE buffer;
- DWORD buflen;
-
- PWAVEFORMATEX pwfx;
-
- IDirectSoundCaptureBufferImpl* capture_buffer;
- DWORD state;
- LPWAVEHDR pwave;
- int nrofpwaves;
- int index;
- CRITICAL_SECTION lock;
-};
-
-HRESULT DirectSoundCaptureDevice_Initialize(
- DirectSoundCaptureDevice ** ppDevice,
- LPCGUID lpcGUID);
-ULONG DirectSoundCaptureDevice_Release(
- DirectSoundCaptureDevice * device);
-
-/*****************************************************************************
- * IDirectSoundCaptureBuffer implementation structure
- */
-struct IDirectSoundCaptureBufferImpl
-{
- /* IUnknown fields */
- const IDirectSoundCaptureBuffer8Vtbl *lpVtbl;
- LONG ref;
-
- /* IDirectSoundCaptureBufferImpl fields */
- DirectSoundCaptureDevice* device;
- /* FIXME: don't need this */
- LPDSCBUFFERDESC pdscbd;
- DWORD flags;
-
- /* IDirectSoundCaptureNotifyImpl fields */
- IDirectSoundCaptureNotifyImpl* notify;
- LPDSBPOSITIONNOTIFY notifies;
- int nrofnotifies;
- PIDSDRIVERNOTIFY hwnotify;
-};
-
-HRESULT IDirectSoundCaptureBufferImpl_Create(
- DirectSoundCaptureDevice *device,
- IDirectSoundCaptureBufferImpl ** ppobj,
- LPCDSCBUFFERDESC lpcDSCBufferDesc);
-
-/*****************************************************************************
- * IDirectSoundFullDuplex implementation structure
- */
-struct IDirectSoundFullDuplexImpl
-{
- /* IUnknown fields */
- const IDirectSoundFullDuplexVtbl *lpVtbl;
- LONG ref;
-
- /* IDirectSoundFullDuplexImpl fields */
- DirectSoundDevice *renderer_device;
- DirectSoundCaptureDevice *capture_device;
-
- LPUNKNOWN pUnknown;
- LPDIRECTSOUND pDS;
- LPDIRECTSOUND8 pDS8;
- LPDIRECTSOUNDCAPTURE pDSC;
-};
-
-/*****************************************************************************
- * IDirectSoundFullDuplex COM components
- */
-struct IDirectSoundFullDuplex_IUnknown {
- const IUnknownVtbl *lpVtbl;
- LONG ref;
- IDirectSoundFullDuplexImpl *pdsfd;
-};
-
-struct IDirectSoundFullDuplex_IDirectSound {
- const IDirectSoundVtbl *lpVtbl;
- LONG ref;
- IDirectSoundFullDuplexImpl *pdsfd;
-};
-
-struct IDirectSoundFullDuplex_IDirectSound8 {
- const IDirectSound8Vtbl *lpVtbl;
- LONG ref;
- IDirectSoundFullDuplexImpl *pdsfd;
-};
-
-struct IDirectSoundFullDuplex_IDirectSoundCapture {
- const IDirectSoundCaptureVtbl *lpVtbl;
- LONG ref;
- IDirectSoundFullDuplexImpl *pdsfd;
-};
-
-/*****************************************************************************
- * IDirectSound3DListener implementation structure
- */
-struct IDirectSound3DListenerImpl
-{
- /* IUnknown fields */
- const IDirectSound3DListenerVtbl *lpVtbl;
- LONG ref;
- /* IDirectSound3DListenerImpl fields */
- DirectSoundDevice* device;
-};
-
-HRESULT IDirectSound3DListenerImpl_Create(
- DirectSoundDevice *device,
- IDirectSound3DListenerImpl **pdsl);
-
-/*****************************************************************************
- * IKsBufferPropertySet implementation structure
- */
-struct IKsBufferPropertySetImpl
-{
- /* IUnknown fields */
- const IKsPropertySetVtbl *lpVtbl;
- LONG ref;
- /* IKsPropertySetImpl fields */
- IDirectSoundBufferImpl* dsb;
-};
-
-HRESULT IKsBufferPropertySetImpl_Create(
- IDirectSoundBufferImpl *dsb,
- IKsBufferPropertySetImpl **piks);
-HRESULT IKsBufferPropertySetImpl_Destroy(
- IKsBufferPropertySetImpl *piks);
-
-/*****************************************************************************
- * IKsPrivatePropertySet implementation structure
- */
-struct IKsPrivatePropertySetImpl
-{
- /* IUnknown fields */
- const IKsPropertySetVtbl *lpVtbl;
- LONG ref;
-};
-
-HRESULT IKsPrivatePropertySetImpl_Create(
- REFIID riid,
- IKsPrivatePropertySetImpl **piks);
-
-/*****************************************************************************
- * IDirectSound3DBuffer implementation structure
- */
-struct IDirectSound3DBufferImpl
-{
- /* IUnknown fields */
- const IDirectSound3DBufferVtbl *lpVtbl;
- LONG ref;
- /* IDirectSound3DBufferImpl fields */
- IDirectSoundBufferImpl* dsb;
-};
-
-HRESULT IDirectSound3DBufferImpl_Create(
- IDirectSoundBufferImpl *dsb,
- IDirectSound3DBufferImpl **pds3db);
-HRESULT IDirectSound3DBufferImpl_Destroy(
- IDirectSound3DBufferImpl *pds3db);
-
-/*******************************************************************************
- */
-
-/* dsound.c */
-
-HRESULT DSOUND_Create(REFIID riid, LPDIRECTSOUND *ppDS);
-HRESULT DSOUND_Create8(REFIID riid, LPDIRECTSOUND8 *ppDS);
-
-/* primary.c */
-
-DWORD DSOUND_fraglen(DWORD nSamplesPerSec, DWORD nBlockAlign);
-HRESULT DSOUND_PrimaryCreate(DirectSoundDevice *device);
-HRESULT DSOUND_PrimaryDestroy(DirectSoundDevice *device);
-HRESULT DSOUND_PrimaryPlay(DirectSoundDevice *device);
-HRESULT DSOUND_PrimaryStop(DirectSoundDevice *device);
-HRESULT DSOUND_PrimaryGetPosition(DirectSoundDevice *device, LPDWORD playpos, LPDWORD writepos);
-HRESULT DSOUND_PrimarySetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX wfex, BOOL forced);
-HRESULT DSOUND_ReopenDevice(DirectSoundDevice *device, BOOL forcewave);
-
-/* duplex.c */
-
-HRESULT DSOUND_FullDuplexCreate(REFIID riid, LPDIRECTSOUNDFULLDUPLEX* ppDSFD);
-
-/* mixer.c */
-DWORD DSOUND_bufpos_to_mixpos(const DirectSoundDevice* device, DWORD pos);
-void DSOUND_CheckEvent(const IDirectSoundBufferImpl *dsb, DWORD playpos, int len);
-void DSOUND_RecalcVolPan(PDSVOLUMEPAN volpan);
-void DSOUND_AmpFactorToVolPan(PDSVOLUMEPAN volpan);
-void DSOUND_RecalcFormat(IDirectSoundBufferImpl *dsb);
-void DSOUND_MixToTemporary(const IDirectSoundBufferImpl *dsb, DWORD writepos, DWORD mixlen, BOOL inmixer);
-DWORD DSOUND_secpos_to_bufpos(const IDirectSoundBufferImpl *dsb, DWORD secpos, DWORD secmixpos, DWORD* overshot);
-
-void CALLBACK DSOUND_timer(UINT timerID, UINT msg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2);
-void CALLBACK DSOUND_callback(HWAVEOUT hwo, UINT msg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2);
-
-/* sound3d.c */
-
-void DSOUND_Calc3DBuffer(IDirectSoundBufferImpl *dsb);
-
-/* capture.c */
-
-HRESULT DSOUND_CaptureCreate(REFIID riid, LPDIRECTSOUNDCAPTURE *ppDSC);
-HRESULT DSOUND_CaptureCreate8(REFIID riid, LPDIRECTSOUNDCAPTURE8 *ppDSC8);
-HRESULT WINAPI IDirectSoundCaptureImpl_CreateCaptureBuffer(
- LPDIRECTSOUNDCAPTURE iface,
- LPCDSCBUFFERDESC lpcDSCBufferDesc,
- LPDIRECTSOUNDCAPTUREBUFFER* lplpDSCaptureBuffer,
- LPUNKNOWN pUnk);
-HRESULT WINAPI IDirectSoundCaptureImpl_GetCaps(
- LPDIRECTSOUNDCAPTURE iface,
- LPDSCCAPS lpDSCCaps);
-HRESULT WINAPI IDirectSoundCaptureImpl_Initialize(
- LPDIRECTSOUNDCAPTURE iface,
- LPCGUID lpcGUID);
-
-#define STATE_STOPPED 0
-#define STATE_STARTING 1
-#define STATE_PLAYING 2
-#define STATE_CAPTURING 2
-#define STATE_STOPPING 3
-
-#define DSOUND_FREQSHIFT (20)
-
-extern DirectSoundDevice* DSOUND_renderer[MAXWAVEDRIVERS];
-extern GUID DSOUND_renderer_guids[MAXWAVEDRIVERS];
-
-extern DirectSoundCaptureDevice * DSOUND_capture[MAXWAVEDRIVERS];
-extern GUID DSOUND_capture_guids[MAXWAVEDRIVERS];
-
-HRESULT mmErr(UINT err);
-void setup_dsound_options(void);
-const char * dumpCooperativeLevel(DWORD level);
+++ /dev/null
-/* DirectSoundFullDuplex
- *
- * Copyright 1998 Marcus Meissner
- * Copyright 1998 Rob Riggs
- * Copyright 2000-2001 TransGaming Technologies, Inc.
- * Copyright 2005 Robert Reif
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#include <stdarg.h>
-
-#define NONAMELESSSTRUCT
-#define NONAMELESSUNION
-#include "windef.h"
-#include "winbase.h"
-#include "winuser.h"
-#include "mmsystem.h"
-#include "mmddk.h"
-#include "winternl.h"
-#include "wine/debug.h"
-#include "dsound.h"
-#include "dsdriver.h"
-#include "dsound_private.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(dsound);
-
-/*******************************************************************************
- * IUnknown
- */
-static HRESULT WINAPI IDirectSoundFullDuplex_IUnknown_QueryInterface(
- LPUNKNOWN iface,
- REFIID riid,
- LPVOID * ppobj)
-{
- IDirectSoundFullDuplex_IUnknown *This = (IDirectSoundFullDuplex_IUnknown *)iface;
- TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
- return IDirectSoundFullDuplex_QueryInterface((LPDIRECTSOUNDFULLDUPLEX)This->pdsfd, riid, ppobj);
-}
-
-static ULONG WINAPI IDirectSoundFullDuplex_IUnknown_AddRef(
- LPUNKNOWN iface)
-{
- IDirectSoundFullDuplex_IUnknown *This = (IDirectSoundFullDuplex_IUnknown *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
-}
-
-static ULONG WINAPI IDirectSoundFullDuplex_IUnknown_Release(
- LPUNKNOWN iface)
-{
- IDirectSoundFullDuplex_IUnknown *This = (IDirectSoundFullDuplex_IUnknown *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref + 1);
- if (!ref) {
- IDirectSound_Release(This->pdsfd->pUnknown);
- HeapFree(GetProcessHeap(), 0, This);
- TRACE("(%p) released\n", This);
- }
- return ref;
-}
-
-static const IUnknownVtbl DirectSoundFullDuplex_Unknown_Vtbl =
-{
- IDirectSoundFullDuplex_IUnknown_QueryInterface,
- IDirectSoundFullDuplex_IUnknown_AddRef,
- IDirectSoundFullDuplex_IUnknown_Release
-};
-
-static HRESULT IDirectSoundFullDuplex_IUnknown_Create(
- LPDIRECTSOUNDFULLDUPLEX pdsfd,
- LPUNKNOWN * ppunk)
-{
- IDirectSoundFullDuplex_IUnknown * pdsfdunk;
- TRACE("(%p,%p)\n",pdsfd,ppunk);
-
- if (pdsfd == NULL) {
- ERR("invalid parameter: pdsfd == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (ppunk == NULL) {
- ERR("invalid parameter: ppunk == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- pdsfdunk = HeapAlloc(GetProcessHeap(),0,sizeof(*pdsfdunk));
- if (pdsfdunk == NULL) {
- WARN("out of memory\n");
- *ppunk = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- pdsfdunk->lpVtbl = &DirectSoundFullDuplex_Unknown_Vtbl;
- pdsfdunk->ref = 0;
- pdsfdunk->pdsfd = (IDirectSoundFullDuplexImpl *)pdsfd;
-
- *ppunk = (LPUNKNOWN)pdsfdunk;
-
- return DS_OK;
-}
-
-/*******************************************************************************
- * IDirectSoundFullDuplex_IDirectSound
- */
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSound_QueryInterface(
- LPDIRECTSOUND iface,
- REFIID riid,
- LPVOID * ppobj)
-{
- IDirectSoundFullDuplex_IDirectSound *This = (IDirectSoundFullDuplex_IDirectSound *)iface;
- TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
- return IDirectSoundFullDuplex_QueryInterface((LPDIRECTSOUNDFULLDUPLEX)This->pdsfd, riid, ppobj);
-}
-
-static ULONG WINAPI IDirectSoundFullDuplex_IDirectSound_AddRef(
- LPDIRECTSOUND iface)
-{
- IDirectSoundFullDuplex_IDirectSound *This = (IDirectSoundFullDuplex_IDirectSound *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
-}
-
-static ULONG WINAPI IDirectSoundFullDuplex_IDirectSound_Release(
- LPDIRECTSOUND iface)
-{
- IDirectSoundFullDuplex_IDirectSound *This = (IDirectSoundFullDuplex_IDirectSound *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref + 1);
- if (!ref) {
- IDirectSound_Release(This->pdsfd->pDS);
- HeapFree(GetProcessHeap(), 0, This);
- TRACE("(%p) released\n", This);
- }
- return ref;
-}
-
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSound_CreateSoundBuffer(
- LPDIRECTSOUND iface,
- LPCDSBUFFERDESC dsbd,
- LPLPDIRECTSOUNDBUFFER ppdsb,
- LPUNKNOWN lpunk)
-{
- IDirectSoundFullDuplex_IDirectSound *This = (IDirectSoundFullDuplex_IDirectSound *)iface;
- TRACE("(%p,%p,%p,%p)\n",This,dsbd,ppdsb,lpunk);
- return DirectSoundDevice_CreateSoundBuffer(This->pdsfd->renderer_device,dsbd,ppdsb,lpunk,FALSE);
-}
-
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSound_GetCaps(
- LPDIRECTSOUND iface,
- LPDSCAPS lpDSCaps)
-{
- IDirectSoundFullDuplex_IDirectSound *This = (IDirectSoundFullDuplex_IDirectSound *)iface;
- TRACE("(%p,%p)\n",This,lpDSCaps);
- return DirectSoundDevice_GetCaps(This->pdsfd->renderer_device, lpDSCaps);
-}
-
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSound_DuplicateSoundBuffer(
- LPDIRECTSOUND iface,
- LPDIRECTSOUNDBUFFER psb,
- LPLPDIRECTSOUNDBUFFER ppdsb)
-{
- IDirectSoundFullDuplex_IDirectSound *This = (IDirectSoundFullDuplex_IDirectSound *)iface;
- TRACE("(%p,%p,%p)\n",This,psb,ppdsb);
- return DirectSoundDevice_DuplicateSoundBuffer(This->pdsfd->renderer_device,psb,ppdsb);
-}
-
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSound_SetCooperativeLevel(
- LPDIRECTSOUND iface,
- HWND hwnd,
- DWORD level)
-{
- IDirectSoundFullDuplex_IDirectSound *This = (IDirectSoundFullDuplex_IDirectSound *)iface;
- TRACE("(%p,%p,%s)\n",This,hwnd,dumpCooperativeLevel(level));
- return DirectSoundDevice_SetCooperativeLevel(This->pdsfd->renderer_device,hwnd,level);
-}
-
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSound_Compact(
- LPDIRECTSOUND iface)
-{
- IDirectSoundFullDuplex_IDirectSound *This = (IDirectSoundFullDuplex_IDirectSound *)iface;
- TRACE("(%p)\n", This);
- return DirectSoundDevice_Compact(This->pdsfd->renderer_device);
-}
-
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSound_GetSpeakerConfig(
- LPDIRECTSOUND iface,
- LPDWORD lpdwSpeakerConfig)
-{
- IDirectSoundFullDuplex_IDirectSound *This = (IDirectSoundFullDuplex_IDirectSound *)iface;
- TRACE("(%p, %p)\n", This, lpdwSpeakerConfig);
- return DirectSoundDevice_GetSpeakerConfig(This->pdsfd->renderer_device,lpdwSpeakerConfig);
-}
-
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSound_SetSpeakerConfig(
- LPDIRECTSOUND iface,
- DWORD config)
-{
- IDirectSoundFullDuplex_IDirectSound *This = (IDirectSoundFullDuplex_IDirectSound *)iface;
- TRACE("(%p,0x%08x)\n",This,config);
- return DirectSoundDevice_SetSpeakerConfig(This->pdsfd->renderer_device,config);
-}
-
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSound_Initialize(
- LPDIRECTSOUND iface,
- LPCGUID lpcGuid)
-{
- IDirectSoundFullDuplex_IDirectSound *This = (IDirectSoundFullDuplex_IDirectSound *)iface;
- TRACE("(%p, %s)\n", This, debugstr_guid(lpcGuid));
- return DirectSoundDevice_Initialize(&This->pdsfd->renderer_device,lpcGuid);
-}
-
-static const IDirectSoundVtbl DirectSoundFullDuplex_DirectSound_Vtbl =
-{
- IDirectSoundFullDuplex_IDirectSound_QueryInterface,
- IDirectSoundFullDuplex_IDirectSound_AddRef,
- IDirectSoundFullDuplex_IDirectSound_Release,
- IDirectSoundFullDuplex_IDirectSound_CreateSoundBuffer,
- IDirectSoundFullDuplex_IDirectSound_GetCaps,
- IDirectSoundFullDuplex_IDirectSound_DuplicateSoundBuffer,
- IDirectSoundFullDuplex_IDirectSound_SetCooperativeLevel,
- IDirectSoundFullDuplex_IDirectSound_Compact,
- IDirectSoundFullDuplex_IDirectSound_GetSpeakerConfig,
- IDirectSoundFullDuplex_IDirectSound_SetSpeakerConfig,
- IDirectSoundFullDuplex_IDirectSound_Initialize
-};
-
-static HRESULT IDirectSoundFullDuplex_IDirectSound_Create(
- LPDIRECTSOUNDFULLDUPLEX pdsfd,
- LPDIRECTSOUND * ppds)
-{
- IDirectSoundFullDuplex_IDirectSound * pdsfdds;
- TRACE("(%p,%p)\n",pdsfd,ppds);
-
- if (pdsfd == NULL) {
- ERR("invalid parameter: pdsfd == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (ppds == NULL) {
- ERR("invalid parameter: ppds == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (((IDirectSoundFullDuplexImpl*)pdsfd)->renderer_device == NULL) {
- WARN("not initialized\n");
- *ppds = NULL;
- return DSERR_UNINITIALIZED;
- }
-
- pdsfdds = HeapAlloc(GetProcessHeap(),0,sizeof(*pdsfdds));
- if (pdsfdds == NULL) {
- WARN("out of memory\n");
- *ppds = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- pdsfdds->lpVtbl = &DirectSoundFullDuplex_DirectSound_Vtbl;
- pdsfdds->ref = 0;
- pdsfdds->pdsfd = (IDirectSoundFullDuplexImpl *)pdsfd;
-
- *ppds = (LPDIRECTSOUND)pdsfdds;
-
- return DS_OK;
-}
-
-/*******************************************************************************
- * IDirectSoundFullDuplex_IDirectSound8
- */
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSound8_QueryInterface(
- LPDIRECTSOUND8 iface,
- REFIID riid,
- LPVOID * ppobj)
-{
- IDirectSoundFullDuplex_IDirectSound8 *This = (IDirectSoundFullDuplex_IDirectSound8 *)iface;
- TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
- return IDirectSoundFullDuplex_QueryInterface((LPDIRECTSOUNDFULLDUPLEX)This->pdsfd, riid, ppobj);
-}
-
-static ULONG WINAPI IDirectSoundFullDuplex_IDirectSound8_AddRef(
- LPDIRECTSOUND8 iface)
-{
- IDirectSoundFullDuplex_IDirectSound8 *This = (IDirectSoundFullDuplex_IDirectSound8 *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
-}
-
-static ULONG WINAPI IDirectSoundFullDuplex_IDirectSound8_Release(
- LPDIRECTSOUND8 iface)
-{
- IDirectSoundFullDuplex_IDirectSound8 *This = (IDirectSoundFullDuplex_IDirectSound8 *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref + 1);
- if (!ref) {
- IDirectSound_Release(This->pdsfd->pDS8);
- HeapFree(GetProcessHeap(), 0, This);
- TRACE("(%p) released\n", This);
- }
- return ref;
-}
-
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSound8_CreateSoundBuffer(
- LPDIRECTSOUND8 iface,
- LPCDSBUFFERDESC dsbd,
- LPLPDIRECTSOUNDBUFFER ppdsb,
- LPUNKNOWN lpunk)
-{
- IDirectSoundFullDuplex_IDirectSound8 *This = (IDirectSoundFullDuplex_IDirectSound8 *)iface;
- TRACE("(%p,%p,%p,%p)\n",This,dsbd,ppdsb,lpunk);
- return DirectSoundDevice_CreateSoundBuffer(This->pdsfd->renderer_device,dsbd,ppdsb,lpunk,TRUE);
-}
-
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSound8_GetCaps(
- LPDIRECTSOUND8 iface,
- LPDSCAPS lpDSCaps)
-{
- IDirectSoundFullDuplex_IDirectSound8 *This = (IDirectSoundFullDuplex_IDirectSound8 *)iface;
- TRACE("(%p,%p)\n",This,lpDSCaps);
- return DirectSoundDevice_GetCaps(This->pdsfd->renderer_device, lpDSCaps);
-}
-
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSound8_DuplicateSoundBuffer(
- LPDIRECTSOUND8 iface,
- LPDIRECTSOUNDBUFFER psb,
- LPLPDIRECTSOUNDBUFFER ppdsb)
-{
- IDirectSoundFullDuplex_IDirectSound8 *This = (IDirectSoundFullDuplex_IDirectSound8 *)iface;
- TRACE("(%p,%p,%p)\n",This,psb,ppdsb);
- return DirectSoundDevice_DuplicateSoundBuffer(This->pdsfd->renderer_device,psb,ppdsb);
-}
-
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSound8_SetCooperativeLevel(
- LPDIRECTSOUND8 iface,
- HWND hwnd,
- DWORD level)
-{
- IDirectSoundFullDuplex_IDirectSound8 *This = (IDirectSoundFullDuplex_IDirectSound8 *)iface;
- TRACE("(%p,%p,%s)\n",This,hwnd,dumpCooperativeLevel(level));
- return DirectSoundDevice_SetCooperativeLevel(This->pdsfd->renderer_device,hwnd,level);
-}
-
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSound8_Compact(
- LPDIRECTSOUND8 iface)
-{
- IDirectSoundFullDuplex_IDirectSound8 *This = (IDirectSoundFullDuplex_IDirectSound8 *)iface;
- TRACE("(%p)\n", This);
- return DirectSoundDevice_Compact(This->pdsfd->renderer_device);
-}
-
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSound8_GetSpeakerConfig(
- LPDIRECTSOUND8 iface,
- LPDWORD lpdwSpeakerConfig)
-{
- IDirectSoundFullDuplex_IDirectSound8 *This = (IDirectSoundFullDuplex_IDirectSound8 *)iface;
- TRACE("(%p, %p)\n", This, lpdwSpeakerConfig);
- return DirectSoundDevice_GetSpeakerConfig(This->pdsfd->renderer_device,lpdwSpeakerConfig);
-}
-
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSound8_SetSpeakerConfig(
- LPDIRECTSOUND8 iface,
- DWORD config)
-{
- IDirectSoundFullDuplex_IDirectSound8 *This = (IDirectSoundFullDuplex_IDirectSound8 *)iface;
- TRACE("(%p,0x%08x)\n",This,config);
- return DirectSoundDevice_SetSpeakerConfig(This->pdsfd->renderer_device,config);
-}
-
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSound8_Initialize(
- LPDIRECTSOUND8 iface,
- LPCGUID lpcGuid)
-{
- IDirectSoundFullDuplex_IDirectSound8 *This = (IDirectSoundFullDuplex_IDirectSound8 *)iface;
- TRACE("(%p, %s)\n", This, debugstr_guid(lpcGuid));
- return DirectSoundDevice_Initialize(&This->pdsfd->renderer_device,lpcGuid);
-}
-
-static const IDirectSound8Vtbl DirectSoundFullDuplex_DirectSound8_Vtbl =
-{
- IDirectSoundFullDuplex_IDirectSound8_QueryInterface,
- IDirectSoundFullDuplex_IDirectSound8_AddRef,
- IDirectSoundFullDuplex_IDirectSound8_Release,
- IDirectSoundFullDuplex_IDirectSound8_CreateSoundBuffer,
- IDirectSoundFullDuplex_IDirectSound8_GetCaps,
- IDirectSoundFullDuplex_IDirectSound8_DuplicateSoundBuffer,
- IDirectSoundFullDuplex_IDirectSound8_SetCooperativeLevel,
- IDirectSoundFullDuplex_IDirectSound8_Compact,
- IDirectSoundFullDuplex_IDirectSound8_GetSpeakerConfig,
- IDirectSoundFullDuplex_IDirectSound8_SetSpeakerConfig,
- IDirectSoundFullDuplex_IDirectSound8_Initialize
-};
-
-static HRESULT IDirectSoundFullDuplex_IDirectSound8_Create(
- LPDIRECTSOUNDFULLDUPLEX pdsfd,
- LPDIRECTSOUND8 * ppds8)
-{
- IDirectSoundFullDuplex_IDirectSound8 * pdsfdds8;
- TRACE("(%p,%p)\n",pdsfd,ppds8);
-
- if (pdsfd == NULL) {
- ERR("invalid parameter: pdsfd == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (ppds8 == NULL) {
- ERR("invalid parameter: ppds8 == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (((IDirectSoundFullDuplexImpl*)pdsfd)->renderer_device == NULL) {
- WARN("not initialized\n");
- *ppds8 = NULL;
- return DSERR_UNINITIALIZED;
- }
-
- pdsfdds8 = HeapAlloc(GetProcessHeap(),0,sizeof(*pdsfdds8));
- if (pdsfdds8 == NULL) {
- WARN("out of memory\n");
- *ppds8 = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- pdsfdds8->lpVtbl = &DirectSoundFullDuplex_DirectSound8_Vtbl;
- pdsfdds8->ref = 0;
- pdsfdds8->pdsfd = (IDirectSoundFullDuplexImpl *)pdsfd;
-
- *ppds8 = (LPDIRECTSOUND8)pdsfdds8;
-
- return DS_OK;
-}
-
-/*******************************************************************************
- * IDirectSoundFullDuplex_IDirectSoundCapture
- */
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSoundCapture_QueryInterface(
- LPDIRECTSOUNDCAPTURE iface,
- REFIID riid,
- LPVOID * ppobj)
-{
- IDirectSoundFullDuplex_IDirectSoundCapture *This = (IDirectSoundFullDuplex_IDirectSoundCapture *)iface;
- TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
- return IDirectSoundFullDuplex_QueryInterface((LPDIRECTSOUNDFULLDUPLEX)This->pdsfd, riid, ppobj);
-}
-
-static ULONG WINAPI IDirectSoundFullDuplex_IDirectSoundCapture_AddRef(
- LPDIRECTSOUNDCAPTURE iface)
-{
- IDirectSoundFullDuplex_IDirectSoundCapture *This = (IDirectSoundFullDuplex_IDirectSoundCapture *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
-}
-
-static ULONG WINAPI IDirectSoundFullDuplex_IDirectSoundCapture_Release(
- LPDIRECTSOUNDCAPTURE iface)
-{
- IDirectSoundFullDuplex_IDirectSoundCapture *This = (IDirectSoundFullDuplex_IDirectSoundCapture *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref + 1);
- if (!ref) {
- IDirectSoundCapture_Release(This->pdsfd->pDSC);
- HeapFree(GetProcessHeap(), 0, This);
- TRACE("(%p) released\n", This);
- }
- return ref;
-}
-
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSoundCapture_CreateCaptureBuffer(
- LPDIRECTSOUNDCAPTURE iface,
- LPCDSCBUFFERDESC lpcDSCBufferDesc,
- LPDIRECTSOUNDCAPTUREBUFFER* lplpDSCaptureBuffer,
- LPUNKNOWN pUnk)
-{
- IDirectSoundFullDuplex_IDirectSoundCapture *This = (IDirectSoundFullDuplex_IDirectSoundCapture *)iface;
- TRACE("(%p,%p,%p,%p)\n",This,lpcDSCBufferDesc,lplpDSCaptureBuffer,pUnk);
- return IDirectSoundCaptureImpl_CreateCaptureBuffer(This->pdsfd->pDSC,lpcDSCBufferDesc,lplpDSCaptureBuffer,pUnk);
-}
-
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSoundCapture_GetCaps(
- LPDIRECTSOUNDCAPTURE iface,
- LPDSCCAPS lpDSCCaps)
-{
- IDirectSoundFullDuplex_IDirectSoundCapture *This = (IDirectSoundFullDuplex_IDirectSoundCapture *)iface;
- TRACE("(%p,%p)\n",This,lpDSCCaps);
- return IDirectSoundCaptureImpl_GetCaps(This->pdsfd->pDSC, lpDSCCaps);
-}
-
-static HRESULT WINAPI IDirectSoundFullDuplex_IDirectSoundCapture_Initialize(
- LPDIRECTSOUNDCAPTURE iface,
- LPCGUID lpcGUID)
-{
- IDirectSoundFullDuplex_IDirectSoundCapture *This = (IDirectSoundFullDuplex_IDirectSoundCapture *)iface;
- TRACE("(%p, %s)\n", This, debugstr_guid(lpcGUID));
- return IDirectSoundCaptureImpl_Initialize(This->pdsfd->pDSC,lpcGUID);
-}
-
-static const IDirectSoundCaptureVtbl DirectSoundFullDuplex_DirectSoundCapture_Vtbl =
-{
- IDirectSoundFullDuplex_IDirectSoundCapture_QueryInterface,
- IDirectSoundFullDuplex_IDirectSoundCapture_AddRef,
- IDirectSoundFullDuplex_IDirectSoundCapture_Release,
- IDirectSoundFullDuplex_IDirectSoundCapture_CreateCaptureBuffer,
- IDirectSoundFullDuplex_IDirectSoundCapture_GetCaps,
- IDirectSoundFullDuplex_IDirectSoundCapture_Initialize
-};
-
-static HRESULT IDirectSoundFullDuplex_IDirectSoundCapture_Create(
- LPDIRECTSOUNDFULLDUPLEX pdsfd,
- LPDIRECTSOUNDCAPTURE8 * ppdsc8)
-{
- IDirectSoundFullDuplex_IDirectSoundCapture * pdsfddsc;
- TRACE("(%p,%p)\n",pdsfd,ppdsc8);
-
- if (pdsfd == NULL) {
- ERR("invalid parameter: pdsfd == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (ppdsc8 == NULL) {
- ERR("invalid parameter: ppdsc8 == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (((IDirectSoundFullDuplexImpl*)pdsfd)->capture_device == NULL) {
- WARN("not initialized\n");
- *ppdsc8 = NULL;
- return DSERR_UNINITIALIZED;
- }
-
- pdsfddsc = HeapAlloc(GetProcessHeap(),0,sizeof(*pdsfddsc));
- if (pdsfddsc == NULL) {
- WARN("out of memory\n");
- *ppdsc8 = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- pdsfddsc->lpVtbl = &DirectSoundFullDuplex_DirectSoundCapture_Vtbl;
- pdsfddsc->ref = 0;
- pdsfddsc->pdsfd = (IDirectSoundFullDuplexImpl *)pdsfd;
-
- *ppdsc8 = (LPDIRECTSOUNDCAPTURE)pdsfddsc;
-
- return DS_OK;
-}
-
-/***************************************************************************
- * IDirectSoundFullDuplexImpl
- */
-static ULONG WINAPI
-IDirectSoundFullDuplexImpl_AddRef( LPDIRECTSOUNDFULLDUPLEX iface )
-{
- IDirectSoundFullDuplexImpl *This = (IDirectSoundFullDuplexImpl *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
-}
-
-static HRESULT WINAPI
-IDirectSoundFullDuplexImpl_QueryInterface(
- LPDIRECTSOUNDFULLDUPLEX iface,
- REFIID riid,
- LPVOID* ppobj )
-{
- IDirectSoundFullDuplexImpl *This = (IDirectSoundFullDuplexImpl *)iface;
- TRACE( "(%p,%s,%p)\n", This, debugstr_guid(riid), ppobj );
-
- if (ppobj == NULL) {
- WARN("invalid parameter\n");
- return E_INVALIDARG;
- }
-
- *ppobj = NULL;
-
- if (IsEqualIID(riid, &IID_IUnknown)) {
- if (!This->pUnknown) {
- IDirectSoundFullDuplex_IUnknown_Create(iface, &This->pUnknown);
- if (!This->pUnknown) {
- WARN("IDirectSoundFullDuplex_IUnknown_Create() failed\n");
- *ppobj = NULL;
- return E_NOINTERFACE;
- }
- }
- IDirectSoundFullDuplex_IUnknown_AddRef(This->pUnknown);
- *ppobj = This->pUnknown;
- return S_OK;
- } else if (IsEqualIID(riid, &IID_IDirectSoundFullDuplex)) {
- IDirectSoundFullDuplexImpl_AddRef(iface);
- *ppobj = This;
- return S_OK;
- } else if (IsEqualIID(riid, &IID_IDirectSound)) {
- if (!This->pDS) {
- IDirectSoundFullDuplex_IDirectSound_Create(iface, &This->pDS);
- if (!This->pDS) {
- WARN("IDirectSoundFullDuplex_IDirectSound_Create() failed\n");
- *ppobj = NULL;
- return E_NOINTERFACE;
- }
- }
- IDirectSoundFullDuplex_IDirectSound_AddRef(This->pDS);
- *ppobj = This->pDS;
- return S_OK;
- } else if (IsEqualIID(riid, &IID_IDirectSound8)) {
- if (!This->pDS8) {
- IDirectSoundFullDuplex_IDirectSound8_Create(iface, &This->pDS8);
- if (!This->pDS8) {
- WARN("IDirectSoundFullDuplex_IDirectSound8_Create() failed\n");
- *ppobj = NULL;
- return E_NOINTERFACE;
- }
- }
- IDirectSoundFullDuplex_IDirectSound8_AddRef(This->pDS8);
- *ppobj = This->pDS8;
- return S_OK;
- } else if (IsEqualIID(riid, &IID_IDirectSoundCapture)) {
- if (!This->pDSC) {
- IDirectSoundFullDuplex_IDirectSoundCapture_Create(iface, &This->pDSC);
- if (!This->pDSC) {
- WARN("IDirectSoundFullDuplex_IDirectSoundCapture_Create() failed\n");
- *ppobj = NULL;
- return E_NOINTERFACE;
- }
- }
- IDirectSoundFullDuplex_IDirectSoundCapture_AddRef(This->pDSC);
- *ppobj = This->pDSC;
- return S_OK;
- }
-
- return E_NOINTERFACE;
-}
-
-static ULONG WINAPI
-IDirectSoundFullDuplexImpl_Release( LPDIRECTSOUNDFULLDUPLEX iface )
-{
- IDirectSoundFullDuplexImpl *This = (IDirectSoundFullDuplexImpl *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
-
- if (!ref) {
- if (This->capture_device)
- DirectSoundCaptureDevice_Release(This->capture_device);
- if (This->renderer_device)
- DirectSoundDevice_Release(This->renderer_device);
- HeapFree( GetProcessHeap(), 0, This );
- TRACE("(%p) released\n", This);
- }
- return ref;
-}
-
-static HRESULT WINAPI
-IDirectSoundFullDuplexImpl_Initialize(
- LPDIRECTSOUNDFULLDUPLEX iface,
- LPCGUID pCaptureGuid,
- LPCGUID pRendererGuid,
- LPCDSCBUFFERDESC lpDscBufferDesc,
- LPCDSBUFFERDESC lpDsBufferDesc,
- HWND hWnd,
- DWORD dwLevel,
- LPLPDIRECTSOUNDCAPTUREBUFFER8 lplpDirectSoundCaptureBuffer8,
- LPLPDIRECTSOUNDBUFFER8 lplpDirectSoundBuffer8 )
-{
- HRESULT hr;
- IDirectSoundFullDuplexImpl *This = (IDirectSoundFullDuplexImpl *)iface;
- IDirectSoundBufferImpl * dsb;
-
- TRACE("(%p,%s,%s,%p,%p,%p,%x,%p,%p)\n", This,
- debugstr_guid(pCaptureGuid), debugstr_guid(pRendererGuid),
- lpDscBufferDesc, lpDsBufferDesc, hWnd, dwLevel,
- lplpDirectSoundCaptureBuffer8, lplpDirectSoundBuffer8);
-
- if (This->renderer_device != NULL || This->capture_device != NULL) {
- WARN("already initialized\n");
- *lplpDirectSoundCaptureBuffer8 = NULL;
- *lplpDirectSoundBuffer8 = NULL;
- return DSERR_ALREADYINITIALIZED;
- }
-
- hr = DirectSoundDevice_Initialize(&This->renderer_device, pRendererGuid);
- if (hr != DS_OK) {
- WARN("DirectSoundDevice_Initialize() failed\n");
- *lplpDirectSoundCaptureBuffer8 = NULL;
- *lplpDirectSoundBuffer8 = NULL;
- return hr;
- }
-
- if (dwLevel==DSSCL_PRIORITY || dwLevel==DSSCL_EXCLUSIVE) {
- WARN("level=%s not fully supported\n",
- dwLevel==DSSCL_PRIORITY ? "DSSCL_PRIORITY" : "DSSCL_EXCLUSIVE");
- }
- This->renderer_device->priolevel = dwLevel;
-
- hr = DSOUND_PrimarySetFormat(This->renderer_device, lpDsBufferDesc->lpwfxFormat, dwLevel == DSSCL_EXCLUSIVE);
- if (hr != DS_OK) {
- WARN("DSOUND_PrimarySetFormat() failed\n");
- *lplpDirectSoundCaptureBuffer8 = NULL;
- *lplpDirectSoundBuffer8 = NULL;
- return hr;
- }
- hr = IDirectSoundBufferImpl_Create(This->renderer_device, &dsb, lpDsBufferDesc);
- if (hr != DS_OK) {
- WARN("IDirectSoundBufferImpl_Create() failed\n");
- *lplpDirectSoundCaptureBuffer8 = NULL;
- *lplpDirectSoundBuffer8 = NULL;
- return hr;
- }
-
- hr = SecondaryBufferImpl_Create(dsb, (SecondaryBufferImpl **)lplpDirectSoundBuffer8);
- if (hr != DS_OK) {
- WARN("SecondaryBufferImpl_Create() failed\n");
- *lplpDirectSoundCaptureBuffer8 = NULL;
- *lplpDirectSoundBuffer8 = NULL;
- return hr;
- }
- IDirectSoundBuffer8_AddRef(*lplpDirectSoundBuffer8);
-
- hr = DirectSoundCaptureDevice_Initialize(&This->capture_device, pCaptureGuid);
- if (hr != DS_OK) {
- WARN("DirectSoundCaptureDevice_Initialize() failed\n");
- *lplpDirectSoundCaptureBuffer8 = NULL;
- *lplpDirectSoundBuffer8 = NULL;
- return hr;
- }
-
- hr = IDirectSoundCaptureBufferImpl_Create(This->capture_device,
- (IDirectSoundCaptureBufferImpl **)lplpDirectSoundCaptureBuffer8,
- lpDscBufferDesc);
- if (hr != DS_OK) {
- WARN("IDirectSoundCaptureBufferImpl_Create() failed\n");
- *lplpDirectSoundCaptureBuffer8 = NULL;
- *lplpDirectSoundBuffer8 = NULL;
- return hr;
- }
-
- return hr;
-}
-
-static const IDirectSoundFullDuplexVtbl dsfdvt =
-{
- /* IUnknown methods */
- IDirectSoundFullDuplexImpl_QueryInterface,
- IDirectSoundFullDuplexImpl_AddRef,
- IDirectSoundFullDuplexImpl_Release,
-
- /* IDirectSoundFullDuplex methods */
- IDirectSoundFullDuplexImpl_Initialize
-};
-
-HRESULT DSOUND_FullDuplexCreate(
- REFIID riid,
- LPDIRECTSOUNDFULLDUPLEX* ppDSFD)
-{
- IDirectSoundFullDuplexImpl *This = NULL;
- TRACE("(%s, %p)\n", debugstr_guid(riid), ppDSFD);
-
- if (ppDSFD == NULL) {
- WARN("invalid parameter: ppDSFD == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (!IsEqualIID(riid, &IID_IUnknown) &&
- !IsEqualIID(riid, &IID_IDirectSoundFullDuplex)) {
- *ppDSFD = 0;
- return E_NOINTERFACE;
- }
-
- /* Get dsound configuration */
- setup_dsound_options();
-
- This = HeapAlloc(GetProcessHeap(),
- HEAP_ZERO_MEMORY, sizeof(IDirectSoundFullDuplexImpl));
-
- if (This == NULL) {
- WARN("out of memory\n");
- *ppDSFD = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- This->lpVtbl = &dsfdvt;
- This->ref = 1;
- This->capture_device = NULL;
- This->renderer_device = NULL;
-
- *ppDSFD = (LPDIRECTSOUNDFULLDUPLEX)This;
-
- return DS_OK;
-}
-
-/***************************************************************************
- * DirectSoundFullDuplexCreate [DSOUND.10]
- *
- * Create and initialize a DirectSoundFullDuplex interface.
- *
- * PARAMS
- * pcGuidCaptureDevice [I] Address of sound capture device GUID.
- * pcGuidRenderDevice [I] Address of sound render device GUID.
- * pcDSCBufferDesc [I] Address of capture buffer description.
- * pcDSBufferDesc [I] Address of render buffer description.
- * hWnd [I] Handle to application window.
- * dwLevel [I] Cooperative level.
- * ppDSFD [O] Address where full duplex interface returned.
- * ppDSCBuffer8 [0] Address where capture buffer interface returned.
- * ppDSBuffer8 [0] Address where render buffer interface returned.
- * pUnkOuter [I] Must be NULL.
- *
- * RETURNS
- * Success: DS_OK
- * Failure: DSERR_NOAGGREGATION, DSERR_ALLOCATED, DSERR_INVALIDPARAM,
- * DSERR_OUTOFMEMORY DSERR_INVALIDCALL DSERR_NODRIVER
- */
-HRESULT WINAPI
-DirectSoundFullDuplexCreate(
- LPCGUID pcGuidCaptureDevice,
- LPCGUID pcGuidRenderDevice,
- LPCDSCBUFFERDESC pcDSCBufferDesc,
- LPCDSBUFFERDESC pcDSBufferDesc,
- HWND hWnd,
- DWORD dwLevel,
- LPDIRECTSOUNDFULLDUPLEX *ppDSFD,
- LPDIRECTSOUNDCAPTUREBUFFER8 *ppDSCBuffer8,
- LPDIRECTSOUNDBUFFER8 *ppDSBuffer8,
- LPUNKNOWN pUnkOuter)
-{
- HRESULT hres;
- IDirectSoundFullDuplexImpl *This = NULL;
- TRACE("(%s,%s,%p,%p,%p,%x,%p,%p,%p,%p)\n",
- debugstr_guid(pcGuidCaptureDevice), debugstr_guid(pcGuidRenderDevice),
- pcDSCBufferDesc, pcDSBufferDesc, hWnd, dwLevel, ppDSFD, ppDSCBuffer8,
- ppDSBuffer8, pUnkOuter);
-
- if (pUnkOuter) {
- WARN("pUnkOuter != 0\n");
- *ppDSFD = NULL;
- return DSERR_NOAGGREGATION;
- }
-
- if (pcDSCBufferDesc == NULL) {
- WARN("invalid parameter: pcDSCBufferDesc == NULL\n");
- *ppDSFD = NULL;
- return DSERR_INVALIDPARAM;
- }
-
- if (pcDSBufferDesc == NULL) {
- WARN("invalid parameter: pcDSBufferDesc == NULL\n");
- *ppDSFD = NULL;
- return DSERR_INVALIDPARAM;
- }
-
- if (ppDSFD == NULL) {
- WARN("invalid parameter: ppDSFD == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (ppDSCBuffer8 == NULL) {
- WARN("invalid parameter: ppDSCBuffer8 == NULL\n");
- *ppDSFD = NULL;
- return DSERR_INVALIDPARAM;
- }
-
- if (ppDSBuffer8 == NULL) {
- WARN("invalid parameter: ppDSBuffer8 == NULL\n");
- *ppDSFD = NULL;
- return DSERR_INVALIDPARAM;
- }
-
- /* Get dsound configuration */
- setup_dsound_options();
-
- This = HeapAlloc(GetProcessHeap(),
- HEAP_ZERO_MEMORY, sizeof(IDirectSoundFullDuplexImpl));
-
- if (This == NULL) {
- WARN("out of memory\n");
- *ppDSFD = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- This->lpVtbl = &dsfdvt;
- This->ref = 1;
- This->capture_device = NULL;
- This->renderer_device = NULL;
-
- hres = IDirectSoundFullDuplexImpl_Initialize((LPDIRECTSOUNDFULLDUPLEX)This,
- pcGuidCaptureDevice,
- pcGuidRenderDevice,
- pcDSCBufferDesc,
- pcDSBufferDesc,
- hWnd, dwLevel, ppDSCBuffer8,
- ppDSBuffer8);
- if (hres != DS_OK) {
- HeapFree(GetProcessHeap(), 0, This);
- WARN("IDirectSoundFullDuplexImpl_Initialize failed\n");
- *ppDSFD = NULL;
- } else
- *ppDSFD = (LPDIRECTSOUNDFULLDUPLEX)This;
-
- return hres;
-}
+++ /dev/null
-/* DirectSound
- *
- * Copyright 1998 Marcus Meissner
- * Copyright 1998 Rob Riggs
- * Copyright 2000-2002 TransGaming Technologies, Inc.
- * Copyright 2007 Peter Dons Tychsen
- * Copyright 2007 Maarten Lankhorst
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#include <assert.h>
-#include <stdarg.h>
-#include <math.h> /* Insomnia - pow() function */
-
-#define NONAMELESSSTRUCT
-#define NONAMELESSUNION
-#include "windef.h"
-#include "winbase.h"
-#include "mmsystem.h"
-#include "winternl.h"
-#include "wine/debug.h"
-#include "dsound.h"
-#include "dsdriver.h"
-#include "dsound_private.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(dsound);
-
-void DSOUND_RecalcVolPan(PDSVOLUMEPAN volpan)
-{
- double temp;
- TRACE("(%p)\n",volpan);
-
- TRACE("Vol=%d Pan=%d\n", volpan->lVolume, volpan->lPan);
- /* the AmpFactors are expressed in 16.16 fixed point */
- volpan->dwVolAmpFactor = (ULONG) (pow(2.0, volpan->lVolume / 600.0) * 0xffff);
- /* FIXME: dwPan{Left|Right}AmpFactor */
-
- /* FIXME: use calculated vol and pan ampfactors */
- temp = (double) (volpan->lVolume - (volpan->lPan > 0 ? volpan->lPan : 0));
- volpan->dwTotalLeftAmpFactor = (ULONG) (pow(2.0, temp / 600.0) * 0xffff);
- temp = (double) (volpan->lVolume + (volpan->lPan < 0 ? volpan->lPan : 0));
- volpan->dwTotalRightAmpFactor = (ULONG) (pow(2.0, temp / 600.0) * 0xffff);
-
- TRACE("left = %x, right = %x\n", volpan->dwTotalLeftAmpFactor, volpan->dwTotalRightAmpFactor);
-}
-
-void DSOUND_AmpFactorToVolPan(PDSVOLUMEPAN volpan)
-{
- double left,right;
- TRACE("(%p)\n",volpan);
-
- TRACE("left=%x, right=%x\n",volpan->dwTotalLeftAmpFactor,volpan->dwTotalRightAmpFactor);
- if (volpan->dwTotalLeftAmpFactor==0)
- left=-10000;
- else
- left=600 * log(((double)volpan->dwTotalLeftAmpFactor) / 0xffff) / log(2);
- if (volpan->dwTotalRightAmpFactor==0)
- right=-10000;
- else
- right=600 * log(((double)volpan->dwTotalRightAmpFactor) / 0xffff) / log(2);
- if (left<right)
- {
- volpan->lVolume=right;
- volpan->dwVolAmpFactor=volpan->dwTotalRightAmpFactor;
- }
- else
- {
- volpan->lVolume=left;
- volpan->dwVolAmpFactor=volpan->dwTotalLeftAmpFactor;
- }
- if (volpan->lVolume < -10000)
- volpan->lVolume=-10000;
- volpan->lPan=right-left;
- if (volpan->lPan < -10000)
- volpan->lPan=-10000;
-
- TRACE("Vol=%d Pan=%d\n", volpan->lVolume, volpan->lPan);
-}
-
-/** Convert a primary buffer position to a pointer position for device->mix_buffer
- * device: DirectSoundDevice for which to calculate
- * pos: Primary buffer position to converts
- * Returns: Offset for mix_buffer
- */
-DWORD DSOUND_bufpos_to_mixpos(const DirectSoundDevice* device, DWORD pos)
-{
- DWORD ret = pos * 32 / device->pwfx->wBitsPerSample;
- if (device->pwfx->wBitsPerSample == 32)
- ret *= 2;
- return ret;
-}
-
-/* NOTE: Not all secpos have to always be mapped to a bufpos, other way around is always the case
- * DWORD64 is used here because a single DWORD wouldn't be big enough to fit the freqAcc for big buffers
- */
-/** This function converts a 'native' sample pointer to a resampled pointer that fits for primary
- * secmixpos is used to decide which freqAcc is needed
- * overshot tells what the 'actual' secpos is now (optional)
- */
-DWORD DSOUND_secpos_to_bufpos(const IDirectSoundBufferImpl *dsb, DWORD secpos, DWORD secmixpos, DWORD* overshot)
-{
- DWORD64 framelen = secpos / dsb->pwfx->nBlockAlign;
- DWORD64 freqAdjust = dsb->freqAdjust;
- DWORD64 acc, freqAcc;
-
- if (secpos < secmixpos)
- freqAcc = dsb->freqAccNext;
- else freqAcc = dsb->freqAcc;
- acc = (framelen << DSOUND_FREQSHIFT) + (freqAdjust - 1 - freqAcc);
- acc /= freqAdjust;
- if (overshot)
- {
- DWORD64 oshot = acc * freqAdjust + freqAcc;
- assert(oshot >= framelen << DSOUND_FREQSHIFT);
- oshot -= framelen << DSOUND_FREQSHIFT;
- *overshot = (DWORD)oshot;
- assert(*overshot < dsb->freqAdjust);
- }
- return (DWORD)acc * dsb->device->pwfx->nBlockAlign;
-}
-
-/** Convert a resampled pointer that fits for primary to a 'native' sample pointer
- * freqAccNext is used here rather than freqAcc: In case the app wants to fill up to
- * the play position it won't overwrite it
- */
-static DWORD DSOUND_bufpos_to_secpos(const IDirectSoundBufferImpl *dsb, DWORD bufpos)
-{
- DWORD oAdv = dsb->device->pwfx->nBlockAlign, iAdv = dsb->pwfx->nBlockAlign, pos;
- DWORD64 framelen;
- DWORD64 acc;
-
- framelen = bufpos/oAdv;
- acc = framelen * (DWORD64)dsb->freqAdjust + (DWORD64)dsb->freqAccNext;
- acc = acc >> DSOUND_FREQSHIFT;
- pos = (DWORD)acc * iAdv;
- if (pos >= dsb->buflen)
- /* Because of differences between freqAcc and freqAccNext, this might happen */
- pos = dsb->buflen - iAdv;
- TRACE("Converted %d/%d to %d/%d\n", bufpos, dsb->tmp_buffer_len, pos, dsb->buflen);
- return pos;
-}
-
-/**
- * Move freqAccNext to freqAcc, and find new values for buffer length and freqAccNext
- */
-static void DSOUND_RecalcFreqAcc(IDirectSoundBufferImpl *dsb)
-{
- if (!dsb->freqneeded) return;
- dsb->freqAcc = dsb->freqAccNext;
- dsb->tmp_buffer_len = DSOUND_secpos_to_bufpos(dsb, dsb->buflen, 0, &dsb->freqAccNext);
- TRACE("New freqadjust: %04x, new buflen: %d\n", dsb->freqAccNext, dsb->tmp_buffer_len);
-}
-
-/**
- * Recalculate the size for temporary buffer, and new writelead
- * Should be called when one of the following things occur:
- * - Primary buffer format is changed
- * - This buffer format (frequency) is changed
- *
- * After this, DSOUND_MixToTemporary(dsb, 0, dsb->buflen) should
- * be called to refill the temporary buffer with data.
- */
-void DSOUND_RecalcFormat(IDirectSoundBufferImpl *dsb)
-{
- BOOL needremix = TRUE, needresample = (dsb->freq != dsb->device->pwfx->nSamplesPerSec);
- DWORD bAlign = dsb->pwfx->nBlockAlign, pAlign = dsb->device->pwfx->nBlockAlign;
-
- TRACE("(%p)\n",dsb);
-
- /* calculate the 10ms write lead */
- dsb->writelead = (dsb->freq / 100) * dsb->pwfx->nBlockAlign;
-
- if ((dsb->pwfx->wBitsPerSample == dsb->device->pwfx->wBitsPerSample) &&
- (dsb->pwfx->nChannels == dsb->device->pwfx->nChannels) && !needresample)
- needremix = FALSE;
- HeapFree(GetProcessHeap(), 0, dsb->tmp_buffer);
- dsb->tmp_buffer = NULL;
- dsb->max_buffer_len = dsb->freqAcc = dsb->freqAccNext = 0;
- dsb->freqneeded = needresample;
-
- dsb->convert = convertbpp[dsb->pwfx->wBitsPerSample/8 - 1][dsb->device->pwfx->wBitsPerSample/8 - 1];
-
- dsb->resampleinmixer = FALSE;
-
- if (needremix)
- {
- if (needresample)
- DSOUND_RecalcFreqAcc(dsb);
- else
- dsb->tmp_buffer_len = dsb->buflen / bAlign * pAlign;
- dsb->max_buffer_len = dsb->tmp_buffer_len;
- if ((dsb->max_buffer_len <= dsb->device->buflen || dsb->max_buffer_len < ds_snd_shadow_maxsize * 1024 * 1024) && ds_snd_shadow_maxsize >= 0)
- dsb->tmp_buffer = HeapAlloc(GetProcessHeap(), 0, dsb->max_buffer_len);
- if (dsb->tmp_buffer)
- FillMemory(dsb->tmp_buffer, dsb->tmp_buffer_len, dsb->device->pwfx->wBitsPerSample == 8 ? 128 : 0);
- else
- dsb->resampleinmixer = TRUE;
- }
- else dsb->max_buffer_len = dsb->tmp_buffer_len = dsb->buflen;
- dsb->buf_mixpos = DSOUND_secpos_to_bufpos(dsb, dsb->sec_mixpos, 0, NULL);
-}
-
-/**
- * Check for application callback requests for when the play position
- * reaches certain points.
- *
- * The offsets that will be triggered will be those between the recorded
- * "last played" position for the buffer (i.e. dsb->playpos) and "len" bytes
- * beyond that position.
- */
-void DSOUND_CheckEvent(const IDirectSoundBufferImpl *dsb, DWORD playpos, int len)
-{
- int i;
- DWORD offset;
- LPDSBPOSITIONNOTIFY event;
- TRACE("(%p,%d)\n",dsb,len);
-
- if (dsb->nrofnotifies == 0)
- return;
-
- TRACE("(%p) buflen = %d, playpos = %d, len = %d\n",
- dsb, dsb->buflen, playpos, len);
- for (i = 0; i < dsb->nrofnotifies ; i++) {
- event = dsb->notifies + i;
- offset = event->dwOffset;
- TRACE("checking %d, position %d, event = %p\n",
- i, offset, event->hEventNotify);
- /* DSBPN_OFFSETSTOP has to be the last element. So this is */
- /* OK. [Inside DirectX, p274] */
- /* Windows does not seem to enforce this, and some apps rely */
- /* on that, so we can't stop there. */
- /* */
- /* This also means we can't sort the entries by offset, */
- /* because DSBPN_OFFSETSTOP == -1 */
- if (offset == DSBPN_OFFSETSTOP) {
- if (dsb->state == STATE_STOPPED) {
- SetEvent(event->hEventNotify);
- TRACE("signalled event %p (%d)\n", event->hEventNotify, i);
- }
- continue;
- }
- if ((playpos + len) >= dsb->buflen) {
- if ((offset < ((playpos + len) % dsb->buflen)) ||
- (offset >= playpos)) {
- TRACE("signalled event %p (%d)\n", event->hEventNotify, i);
- SetEvent(event->hEventNotify);
- }
- } else {
- if ((offset >= playpos) && (offset < (playpos + len))) {
- TRACE("signalled event %p (%d)\n", event->hEventNotify, i);
- SetEvent(event->hEventNotify);
- }
- }
- }
-}
-
-/**
- * Copy a single frame from the given input buffer to the given output buffer.
- * Translate 8 <-> 16 bits and mono <-> stereo
- */
-static inline void cp_fields(const IDirectSoundBufferImpl *dsb, const BYTE *ibuf, BYTE *obuf,
- UINT istride, UINT ostride, UINT count, UINT freqAcc, UINT adj)
-{
- DirectSoundDevice *device = dsb->device;
- INT istep = dsb->pwfx->wBitsPerSample / 8, ostep = device->pwfx->wBitsPerSample / 8;
-
- if (device->pwfx->nChannels == dsb->pwfx->nChannels) {
- dsb->convert(ibuf, obuf, istride, ostride, count, freqAcc, adj);
- if (device->pwfx->nChannels == 2)
- dsb->convert(ibuf + istep, obuf + ostep, istride, ostride, count, freqAcc, adj);
- }
-
- if (device->pwfx->nChannels == 1 && dsb->pwfx->nChannels == 2)
- {
- dsb->convert(ibuf, obuf, istride, ostride, count, freqAcc, adj);
- }
-
- if (device->pwfx->nChannels == 2 && dsb->pwfx->nChannels == 1)
- {
- dsb->convert(ibuf, obuf, istride, ostride, count, freqAcc, adj);
- dsb->convert(ibuf, obuf + ostep, istride, ostride, count, freqAcc, adj);
- }
-}
-
-/**
- * Calculate the distance between two buffer offsets, taking wraparound
- * into account.
- */
-static inline DWORD DSOUND_BufPtrDiff(DWORD buflen, DWORD ptr1, DWORD ptr2)
-{
-/* If these asserts fail, the problem is not here, but in the underlying code */
- assert(ptr1 < buflen);
- assert(ptr2 < buflen);
- if (ptr1 >= ptr2) {
- return ptr1 - ptr2;
- } else {
- return buflen + ptr1 - ptr2;
- }
-}
-/**
- * Mix at most the given amount of data into the allocated temporary buffer
- * of the given secondary buffer, starting from the dsb's first currently
- * unsampled frame (writepos), translating frequency (pitch), stereo/mono
- * and bits-per-sample so that it is ideal for the primary buffer.
- * Doesn't perform any mixing - this is a straight copy/convert operation.
- *
- * dsb = the secondary buffer
- * writepos = Starting position of changed buffer
- * len = number of bytes to resample from writepos
- *
- * NOTE: writepos + len <= buflen. When called by mixer, MixOne makes sure of this.
- */
-void DSOUND_MixToTemporary(const IDirectSoundBufferImpl *dsb, DWORD writepos, DWORD len, BOOL inmixer)
-{
- INT size;
- BYTE *ibp, *obp, *obp_begin;
- INT iAdvance = dsb->pwfx->nBlockAlign;
- INT oAdvance = dsb->device->pwfx->nBlockAlign;
- DWORD freqAcc, target_writepos = 0, overshot, maxlen;
-
- /* We resample only when needed */
- if ((dsb->tmp_buffer && inmixer) || (!dsb->tmp_buffer && !inmixer) || dsb->resampleinmixer != inmixer)
- return;
-
- assert(writepos + len <= dsb->buflen);
- if (inmixer && writepos + len < dsb->buflen)
- len += dsb->pwfx->nBlockAlign;
-
- maxlen = DSOUND_secpos_to_bufpos(dsb, len, 0, NULL);
-
- ibp = dsb->buffer->memory + writepos;
- if (!inmixer)
- obp_begin = dsb->tmp_buffer;
- else if (dsb->device->tmp_buffer_len < maxlen || !dsb->device->tmp_buffer)
- {
- dsb->device->tmp_buffer_len = maxlen;
- if (dsb->device->tmp_buffer)
- dsb->device->tmp_buffer = HeapReAlloc(GetProcessHeap(), 0, dsb->device->tmp_buffer, maxlen);
- else
- dsb->device->tmp_buffer = HeapAlloc(GetProcessHeap(), 0, maxlen);
- obp_begin = dsb->device->tmp_buffer;
- }
- else
- obp_begin = dsb->device->tmp_buffer;
-
- TRACE("(%p, %p)\n", dsb, ibp);
- size = len / iAdvance;
-
- /* Check for same sample rate */
- if (dsb->freq == dsb->device->pwfx->nSamplesPerSec) {
- TRACE("(%p) Same sample rate %d = primary %d\n", dsb,
- dsb->freq, dsb->device->pwfx->nSamplesPerSec);
- obp = obp_begin;
- if (!inmixer)
- obp += writepos/iAdvance*oAdvance;
-
- cp_fields(dsb, ibp, obp, iAdvance, oAdvance, size, 0, 1 << DSOUND_FREQSHIFT);
- return;
- }
-
- /* Mix in different sample rates */
- TRACE("(%p) Adjusting frequency: %d -> %d\n", dsb, dsb->freq, dsb->device->pwfx->nSamplesPerSec);
-
- target_writepos = DSOUND_secpos_to_bufpos(dsb, writepos, dsb->sec_mixpos, &freqAcc);
- overshot = freqAcc >> DSOUND_FREQSHIFT;
- if (overshot)
- {
- if (overshot >= size)
- return;
- size -= overshot;
- writepos += overshot * iAdvance;
- if (writepos >= dsb->buflen)
- return;
- ibp = dsb->buffer->memory + writepos;
- freqAcc &= (1 << DSOUND_FREQSHIFT) - 1;
- TRACE("Overshot: %d, freqAcc: %04x\n", overshot, freqAcc);
- }
-
- if (!inmixer)
- obp = obp_begin + target_writepos;
- else obp = obp_begin;
-
- /* FIXME: Small problem here when we're overwriting buf_mixpos, it then STILL uses old freqAcc, not sure if it matters or not */
- cp_fields(dsb, ibp, obp, iAdvance, oAdvance, size, freqAcc, dsb->freqAdjust);
-}
-
-/** Apply volume to the given soundbuffer from (primary) position writepos and length len
- * Returns: NULL if no volume needs to be applied
- * or else a memory handle that holds 'len' volume adjusted buffer */
-static LPBYTE DSOUND_MixerVol(const IDirectSoundBufferImpl *dsb, INT len)
-{
- INT i;
- BYTE *bpc;
- INT16 *bps, *mems;
- DWORD vLeft, vRight;
- INT nChannels = dsb->device->pwfx->nChannels;
- LPBYTE mem = (dsb->tmp_buffer ? dsb->tmp_buffer : dsb->buffer->memory) + dsb->buf_mixpos;
-
- if (dsb->resampleinmixer)
- mem = dsb->device->tmp_buffer;
-
- TRACE("(%p,%d)\n",dsb,len);
- TRACE("left = %x, right = %x\n", dsb->volpan.dwTotalLeftAmpFactor,
- dsb->volpan.dwTotalRightAmpFactor);
-
- if ((!(dsb->dsbd.dwFlags & DSBCAPS_CTRLPAN) || (dsb->volpan.lPan == 0)) &&
- (!(dsb->dsbd.dwFlags & DSBCAPS_CTRLVOLUME) || (dsb->volpan.lVolume == 0)) &&
- !(dsb->dsbd.dwFlags & DSBCAPS_CTRL3D))
- return NULL; /* Nothing to do */
-
- if (nChannels != 1 && nChannels != 2)
- {
- FIXME("There is no support for %d channels\n", nChannels);
- return NULL;
- }
-
- if (dsb->device->pwfx->wBitsPerSample != 8 && dsb->device->pwfx->wBitsPerSample != 16)
- {
- FIXME("There is no support for %d bpp\n", dsb->device->pwfx->wBitsPerSample);
- return NULL;
- }
-
- if (dsb->device->tmp_buffer_len < len || !dsb->device->tmp_buffer)
- {
- /* If we just resampled in DSOUND_MixToTemporary, we shouldn't need to resize here */
- assert(!dsb->resampleinmixer);
- dsb->device->tmp_buffer_len = len;
- if (dsb->device->tmp_buffer)
- dsb->device->tmp_buffer = HeapReAlloc(GetProcessHeap(), 0, dsb->device->tmp_buffer, len);
- else
- dsb->device->tmp_buffer = HeapAlloc(GetProcessHeap(), 0, len);
- }
-
- bpc = dsb->device->tmp_buffer;
- bps = (INT16 *)bpc;
- mems = (INT16 *)mem;
- vLeft = dsb->volpan.dwTotalLeftAmpFactor;
- if (nChannels > 1)
- vRight = dsb->volpan.dwTotalRightAmpFactor;
- else
- vRight = vLeft;
-
- switch (dsb->device->pwfx->wBitsPerSample) {
- case 8:
- /* 8-bit WAV is unsigned, but we need to operate */
- /* on signed data for this to work properly */
- for (i = 0; i < len-1; i+=2) {
- *(bpc++) = (((*(mem++) - 128) * vLeft) >> 16) + 128;
- *(bpc++) = (((*(mem++) - 128) * vRight) >> 16) + 128;
- }
- if (len % 2 == 1 && nChannels == 1)
- *(bpc++) = (((*(mem++) - 128) * vLeft) >> 16) + 128;
- break;
- case 16:
- /* 16-bit WAV is signed -- much better */
- for (i = 0; i < len-3; i += 4) {
- *(bps++) = (*(mems++) * vLeft) >> 16;
- *(bps++) = (*(mems++) * vRight) >> 16;
- }
- if (len % 4 == 2 && nChannels == 1)
- *(bps++) = ((INT)*(mems++) * vLeft) >> 16;
- break;
- }
- return dsb->device->tmp_buffer;
-}
-
-/**
- * Mix (at most) the given number of bytes into the given position of the
- * device buffer, from the secondary buffer "dsb" (starting at the current
- * mix position for that buffer).
- *
- * Returns the number of bytes actually mixed into the device buffer. This
- * will match fraglen unless the end of the secondary buffer is reached
- * (and it is not looping).
- *
- * dsb = the secondary buffer to mix from
- * writepos = position (offset) in device buffer to write at
- * fraglen = number of bytes to mix
- */
-static DWORD DSOUND_MixInBuffer(IDirectSoundBufferImpl *dsb, DWORD writepos, DWORD fraglen)
-{
- INT len = fraglen, ilen;
- BYTE *ibuf = (dsb->tmp_buffer ? dsb->tmp_buffer : dsb->buffer->memory) + dsb->buf_mixpos, *volbuf;
- DWORD oldpos, mixbufpos;
-
- TRACE("buf_mixpos=%d/%d sec_mixpos=%d/%d\n", dsb->buf_mixpos, dsb->tmp_buffer_len, dsb->sec_mixpos, dsb->buflen);
- TRACE("(%p,%d,%d)\n",dsb,writepos,fraglen);
-
- assert(dsb->buf_mixpos + len <= dsb->tmp_buffer_len);
-
- if (len % dsb->device->pwfx->nBlockAlign) {
- INT nBlockAlign = dsb->device->pwfx->nBlockAlign;
- ERR("length not a multiple of block size, len = %d, block size = %d\n", len, nBlockAlign);
- len -= len % nBlockAlign; /* data alignment */
- }
-
- /* Resample buffer to temporary buffer specifically allocated for this purpose, if needed */
- DSOUND_MixToTemporary(dsb, dsb->sec_mixpos, DSOUND_bufpos_to_secpos(dsb, dsb->buf_mixpos+len) - dsb->sec_mixpos, TRUE);
- if (dsb->resampleinmixer)
- ibuf = dsb->device->tmp_buffer;
-
- /* Apply volume if needed */
- volbuf = DSOUND_MixerVol(dsb, len);
- if (volbuf)
- ibuf = volbuf;
-
- mixbufpos = DSOUND_bufpos_to_mixpos(dsb->device, writepos);
- /* Now mix the temporary buffer into the devices main buffer */
- if ((writepos + len) <= dsb->device->buflen)
- dsb->device->mixfunction(ibuf, dsb->device->mix_buffer + mixbufpos, len);
- else
- {
- DWORD todo = dsb->device->buflen - writepos;
- dsb->device->mixfunction(ibuf, dsb->device->mix_buffer + mixbufpos, todo);
- dsb->device->mixfunction(ibuf + todo, dsb->device->mix_buffer, len - todo);
- }
-
- oldpos = dsb->sec_mixpos;
- dsb->buf_mixpos += len;
-
- if (dsb->buf_mixpos >= dsb->tmp_buffer_len) {
- if (dsb->buf_mixpos > dsb->tmp_buffer_len)
- ERR("Mixpos (%u) past buflen (%u), capping...\n", dsb->buf_mixpos, dsb->tmp_buffer_len);
- if (dsb->playflags & DSBPLAY_LOOPING) {
- dsb->buf_mixpos -= dsb->tmp_buffer_len;
- } else if (dsb->buf_mixpos >= dsb->tmp_buffer_len) {
- dsb->buf_mixpos = dsb->sec_mixpos = 0;
- dsb->state = STATE_STOPPED;
- }
- DSOUND_RecalcFreqAcc(dsb);
- }
-
- dsb->sec_mixpos = DSOUND_bufpos_to_secpos(dsb, dsb->buf_mixpos);
- ilen = DSOUND_BufPtrDiff(dsb->buflen, dsb->sec_mixpos, oldpos);
- /* check for notification positions */
- if (dsb->dsbd.dwFlags & DSBCAPS_CTRLPOSITIONNOTIFY &&
- dsb->state != STATE_STARTING) {
- DSOUND_CheckEvent(dsb, oldpos, ilen);
- }
-
- /* increase mix position */
- dsb->primary_mixpos += len;
- if (dsb->primary_mixpos >= dsb->device->buflen)
- dsb->primary_mixpos -= dsb->device->buflen;
- return len;
-}
-
-/**
- * Mix some frames from the given secondary buffer "dsb" into the device
- * primary buffer.
- *
- * dsb = the secondary buffer
- * playpos = the current play position in the device buffer (primary buffer)
- * writepos = the current safe-to-write position in the device buffer
- * mixlen = the maximum number of bytes in the primary buffer to mix, from the
- * current writepos.
- *
- * Returns: the number of bytes beyond the writepos that were mixed.
- */
-static DWORD DSOUND_MixOne(IDirectSoundBufferImpl *dsb, DWORD writepos, DWORD mixlen)
-{
- /* The buffer's primary_mixpos may be before or after the device
- * buffer's mixpos, but both must be ahead of writepos. */
- DWORD primary_done;
-
- TRACE("(%p,%d,%d)\n",dsb,writepos,mixlen);
- TRACE("writepos=%d, buf_mixpos=%d, primary_mixpos=%d, mixlen=%d\n", writepos, dsb->buf_mixpos, dsb->primary_mixpos, mixlen);
- TRACE("looping=%d, leadin=%d, buflen=%d\n", dsb->playflags, dsb->leadin, dsb->tmp_buffer_len);
-
- /* If leading in, only mix about 20 ms, and 'skip' mixing the rest, for more fluid pointer advancement */
- if (dsb->leadin && dsb->state == STATE_STARTING)
- {
- if (mixlen > 2 * dsb->device->fraglen)
- {
- dsb->primary_mixpos += mixlen - 2 * dsb->device->fraglen;
- dsb->primary_mixpos %= dsb->device->buflen;
- }
- }
- dsb->leadin = FALSE;
-
- /* calculate how much pre-buffering has already been done for this buffer */
- primary_done = DSOUND_BufPtrDiff(dsb->device->buflen, dsb->primary_mixpos, writepos);
-
- /* sanity */
- if(mixlen < primary_done)
- {
- /* Should *NEVER* happen */
- ERR("Fatal error. Under/Overflow? primary_done=%d, mixpos=%d/%d (%d/%d), primary_mixpos=%d, writepos=%d, mixlen=%d\n", primary_done,dsb->buf_mixpos,dsb->tmp_buffer_len,dsb->sec_mixpos, dsb->buflen, dsb->primary_mixpos, writepos, mixlen);
- return 0;
- }
-
- /* take into account already mixed data */
- mixlen -= primary_done;
-
- TRACE("primary_done=%d, mixlen (primary) = %i\n", primary_done, mixlen);
-
- if (!mixlen)
- return primary_done;
-
- /* First try to mix to the end of the buffer if possible
- * Theoretically it would allow for better optimization
- */
- if (mixlen + dsb->buf_mixpos >= dsb->tmp_buffer_len)
- {
- DWORD newmixed, mixfirst = dsb->tmp_buffer_len - dsb->buf_mixpos;
- newmixed = DSOUND_MixInBuffer(dsb, dsb->primary_mixpos, mixfirst);
- mixlen -= newmixed;
-
- if (dsb->playflags & DSBPLAY_LOOPING)
- while (newmixed && mixlen)
- {
- mixfirst = (dsb->tmp_buffer_len < mixlen ? dsb->tmp_buffer_len : mixlen);
- newmixed = DSOUND_MixInBuffer(dsb, dsb->primary_mixpos, mixfirst);
- mixlen -= newmixed;
- }
- }
- else DSOUND_MixInBuffer(dsb, dsb->primary_mixpos, mixlen);
-
- /* re-calculate the primary done */
- primary_done = DSOUND_BufPtrDiff(dsb->device->buflen, dsb->primary_mixpos, writepos);
-
- TRACE("new primary_mixpos=%d, total mixed data=%d\n", dsb->primary_mixpos, primary_done);
-
- /* Report back the total prebuffered amount for this buffer */
- return primary_done;
-}
-
-/**
- * For a DirectSoundDevice, go through all the currently playing buffers and
- * mix them in to the device buffer.
- *
- * writepos = the current safe-to-write position in the primary buffer
- * mixlen = the maximum amount to mix into the primary buffer
- * (beyond the current writepos)
- * mustlock = Do we have to fight for lock because we otherwise risk an underrun?
- * recover = true if the sound device may have been reset and the write
- * position in the device buffer changed
- * all_stopped = reports back if all buffers have stopped
- *
- * Returns: the length beyond the writepos that was mixed to.
- */
-
-static DWORD DSOUND_MixToPrimary(const DirectSoundDevice *device, DWORD writepos, DWORD mixlen, BOOL mustlock, BOOL recover, BOOL *all_stopped)
-{
- INT i, len;
- DWORD minlen = 0;
- IDirectSoundBufferImpl *dsb;
- BOOL gotall = TRUE;
-
- /* unless we find a running buffer, all have stopped */
- *all_stopped = TRUE;
-
- TRACE("(%d,%d,%d)\n", writepos, mixlen, recover);
- for (i = 0; i < device->nrofbuffers; i++) {
- dsb = device->buffers[i];
-
- TRACE("MixToPrimary for %p, state=%d\n", dsb, dsb->state);
-
- if (dsb->buflen && dsb->state && !dsb->hwbuf) {
- TRACE("Checking %p, mixlen=%d\n", dsb, mixlen);
- if (!RtlAcquireResourceShared(&dsb->lock, mustlock))
- {
- gotall = FALSE;
- continue;
- }
- /* if buffer is stopping it is stopped now */
- if (dsb->state == STATE_STOPPING) {
- dsb->state = STATE_STOPPED;
- DSOUND_CheckEvent(dsb, 0, 0);
- } else if (dsb->state != STATE_STOPPED) {
-
- /* if recovering, reset the mix position */
- if ((dsb->state == STATE_STARTING) || recover) {
- dsb->primary_mixpos = writepos;
- }
-
- /* if the buffer was starting, it must be playing now */
- if (dsb->state == STATE_STARTING)
- dsb->state = STATE_PLAYING;
-
- /* mix next buffer into the main buffer */
- len = DSOUND_MixOne(dsb, writepos, mixlen);
-
- if (!minlen) minlen = len;
-
- /* record the minimum length mixed from all buffers */
- /* we only want to return the length which *all* buffers have mixed */
- else if (len) minlen = (len < minlen) ? len : minlen;
-
- *all_stopped = FALSE;
- }
- RtlReleaseResource(&dsb->lock);
- }
- }
-
- TRACE("Mixed at least %d from all buffers\n", minlen);
- if (!gotall) return 0;
- return minlen;
-}
-
-/**
- * Add buffers to the emulated wave device system.
- *
- * device = The current dsound playback device
- * force = If TRUE, the function will buffer up as many frags as possible,
- * even though and will ignore the actual state of the primary buffer.
- *
- * Returns: None
- */
-
-static void DSOUND_WaveQueue(DirectSoundDevice *device, BOOL force)
-{
- DWORD prebuf_frags, wave_writepos, wave_fragpos, i;
- TRACE("(%p)\n", device);
-
- /* calculate the current wave frag position */
- wave_fragpos = (device->pwplay + device->pwqueue) % device->helfrags;
-
- /* calculate the current wave write position */
- wave_writepos = wave_fragpos * device->fraglen;
-
- TRACE("wave_fragpos = %i, wave_writepos = %i, pwqueue = %i, prebuf = %i\n",
- wave_fragpos, wave_writepos, device->pwqueue, device->prebuf);
-
- if (!force)
- {
- /* check remaining prebuffered frags */
- prebuf_frags = device->mixpos / device->fraglen;
- if (prebuf_frags == device->helfrags)
- --prebuf_frags;
- TRACE("wave_fragpos = %d, mixpos_frags = %d\n", wave_fragpos, prebuf_frags);
- if (prebuf_frags < wave_fragpos)
- prebuf_frags += device->helfrags;
- prebuf_frags -= wave_fragpos;
- TRACE("wanted prebuf_frags = %d\n", prebuf_frags);
- }
- else
- /* buffer the maximum amount of frags */
- prebuf_frags = device->prebuf;
-
- /* limit to the queue we have left */
- if ((prebuf_frags + device->pwqueue) > device->prebuf)
- prebuf_frags = device->prebuf - device->pwqueue;
-
- TRACE("prebuf_frags = %i\n", prebuf_frags);
-
- /* adjust queue */
- device->pwqueue += prebuf_frags;
-
- /* get out of CS when calling the wave system */
- LeaveCriticalSection(&(device->mixlock));
- /* **** */
-
- /* queue up the new buffers */
- for(i=0; i<prebuf_frags; i++){
- TRACE("queueing wave buffer %i\n", wave_fragpos);
- waveOutWrite(device->hwo, &device->pwave[wave_fragpos], sizeof(WAVEHDR));
- wave_fragpos++;
- wave_fragpos %= device->helfrags;
- }
-
- /* **** */
- EnterCriticalSection(&(device->mixlock));
-
- TRACE("queue now = %i\n", device->pwqueue);
-}
-
-/**
- * Perform mixing for a Direct Sound device. That is, go through all the
- * secondary buffers (the sound bites currently playing) and mix them in
- * to the primary buffer (the device buffer).
- */
-static void DSOUND_PerformMix(DirectSoundDevice *device)
-{
- TRACE("(%p)\n", device);
-
- /* **** */
- EnterCriticalSection(&(device->mixlock));
-
- if (device->priolevel != DSSCL_WRITEPRIMARY) {
- BOOL recover = FALSE, all_stopped = FALSE;
- DWORD playpos, writepos, writelead, maxq, frag, prebuff_max, prebuff_left, size1, size2, mixplaypos, mixplaypos2;
- LPVOID buf1, buf2;
- BOOL lock = (device->hwbuf && !(device->drvdesc.dwFlags & DSDDESC_DONTNEEDPRIMARYLOCK));
- BOOL mustlock = FALSE;
- int nfiller;
-
- /* the sound of silence */
- nfiller = device->pwfx->wBitsPerSample == 8 ? 128 : 0;
-
- /* get the position in the primary buffer */
- if (DSOUND_PrimaryGetPosition(device, &playpos, &writepos) != 0){
- LeaveCriticalSection(&(device->mixlock));
- return;
- }
-
- TRACE("primary playpos=%d, writepos=%d, clrpos=%d, mixpos=%d, buflen=%d\n",
- playpos,writepos,device->playpos,device->mixpos,device->buflen);
- assert(device->playpos < device->buflen);
-
- mixplaypos = DSOUND_bufpos_to_mixpos(device, device->playpos);
- mixplaypos2 = DSOUND_bufpos_to_mixpos(device, playpos);
-
- /* calc maximum prebuff */
- prebuff_max = (device->prebuf * device->fraglen);
- if (!device->hwbuf && playpos + prebuff_max >= device->helfrags * device->fraglen)
- prebuff_max += device->buflen - device->helfrags * device->fraglen;
-
- /* check how close we are to an underrun. It occurs when the writepos overtakes the mixpos */
- prebuff_left = DSOUND_BufPtrDiff(device->buflen, device->mixpos, playpos);
- writelead = DSOUND_BufPtrDiff(device->buflen, writepos, playpos);
-
- /* check for underrun. underrun occurs when the write position passes the mix position
- * also wipe out just-played sound data */
- if((prebuff_left > prebuff_max) || (device->state == STATE_STOPPED) || (device->state == STATE_STARTING)){
- if (device->state == STATE_STOPPING || device->state == STATE_PLAYING)
- WARN("Probable buffer underrun\n");
- else TRACE("Buffer starting or buffer underrun\n");
-
- /* recover mixing for all buffers */
- recover = TRUE;
-
- /* reset mix position to write position */
- device->mixpos = writepos;
-
- ZeroMemory(device->mix_buffer, device->mix_buffer_len);
- ZeroMemory(device->buffer, device->buflen);
- } else if (playpos < device->playpos) {
- buf1 = device->buffer + device->playpos;
- buf2 = device->buffer;
- size1 = device->buflen - device->playpos;
- size2 = playpos;
- FillMemory(device->mix_buffer + mixplaypos, device->mix_buffer_len - mixplaypos, 0);
- FillMemory(device->mix_buffer, mixplaypos2, 0);
- if (lock)
- IDsDriverBuffer_Lock(device->hwbuf, &buf1, &size1, &buf2, &size2, device->playpos, size1+size2, 0);
- FillMemory(buf1, size1, nfiller);
- if (playpos && (!buf2 || !size2))
- FIXME("%d: (%d, %d)=>(%d, %d) There should be an additional buffer here!!\n", __LINE__, device->playpos, device->mixpos, playpos, writepos);
- FillMemory(buf2, size2, nfiller);
- if (lock)
- IDsDriverBuffer_Unlock(device->hwbuf, buf1, size1, buf2, size2);
- } else {
- buf1 = device->buffer + device->playpos;
- buf2 = NULL;
- size1 = playpos - device->playpos;
- size2 = 0;
- FillMemory(device->mix_buffer + mixplaypos, mixplaypos2 - mixplaypos, 0);
- if (lock)
- IDsDriverBuffer_Lock(device->hwbuf, &buf1, &size1, &buf2, &size2, device->playpos, size1+size2, 0);
- FillMemory(buf1, size1, nfiller);
- if (buf2 && size2)
- {
- FIXME("%d: There should be no additional buffer here!!\n", __LINE__);
- FillMemory(buf2, size2, nfiller);
- }
- if (lock)
- IDsDriverBuffer_Unlock(device->hwbuf, buf1, size1, buf2, size2);
- }
- device->playpos = playpos;
-
- /* find the maximum we can prebuffer from current write position */
- maxq = (writelead < prebuff_max) ? (prebuff_max - writelead) : 0;
-
- TRACE("prebuff_left = %d, prebuff_max = %dx%d=%d, writelead=%d\n",
- prebuff_left, device->prebuf, device->fraglen, prebuff_max, writelead);
-
- /* Do we risk an 'underrun' if we don't advance pointer? */
- if (writelead/device->fraglen <= ds_snd_queue_min || recover)
- mustlock = TRUE;
-
- if (lock)
- IDsDriverBuffer_Lock(device->hwbuf, &buf1, &size1, &buf2, &size2, writepos, maxq, 0);
-
- /* do the mixing */
- frag = DSOUND_MixToPrimary(device, writepos, maxq, mustlock, recover, &all_stopped);
-
- if (frag + writepos > device->buflen)
- {
- DWORD todo = device->buflen - writepos;
- device->normfunction(device->mix_buffer + DSOUND_bufpos_to_mixpos(device, writepos), device->buffer + writepos, todo);
- device->normfunction(device->mix_buffer, device->buffer, frag - todo);
- }
- else
- device->normfunction(device->mix_buffer + DSOUND_bufpos_to_mixpos(device, writepos), device->buffer + writepos, frag);
-
- /* update the mix position, taking wrap-around into account */
- device->mixpos = writepos + frag;
- device->mixpos %= device->buflen;
-
- if (lock)
- {
- DWORD frag2 = (frag > size1 ? frag - size1 : 0);
- frag -= frag2;
- if (frag2 > size2)
- {
- FIXME("Buffering too much! (%d, %d, %d, %d)\n", maxq, frag, size2, frag2 - size2);
- frag2 = size2;
- }
- IDsDriverBuffer_Unlock(device->hwbuf, buf1, frag, buf2, frag2);
- }
-
- /* update prebuff left */
- prebuff_left = DSOUND_BufPtrDiff(device->buflen, device->mixpos, playpos);
-
- /* check if have a whole fragment */
- if (prebuff_left >= device->fraglen){
-
- /* update the wave queue if using wave system */
- if (!device->hwbuf)
- DSOUND_WaveQueue(device, FALSE);
-
- /* buffers are full. start playing if applicable */
- if(device->state == STATE_STARTING){
- TRACE("started primary buffer\n");
- if(DSOUND_PrimaryPlay(device) != DS_OK){
- WARN("DSOUND_PrimaryPlay failed\n");
- }
- else{
- /* we are playing now */
- device->state = STATE_PLAYING;
- }
- }
-
- /* buffers are full. start stopping if applicable */
- if(device->state == STATE_STOPPED){
- TRACE("restarting primary buffer\n");
- if(DSOUND_PrimaryPlay(device) != DS_OK){
- WARN("DSOUND_PrimaryPlay failed\n");
- }
- else{
- /* start stopping again. as soon as there is no more data, it will stop */
- device->state = STATE_STOPPING;
- }
- }
- }
-
- /* if device was stopping, its for sure stopped when all buffers have stopped */
- else if((all_stopped == TRUE) && (device->state == STATE_STOPPING)){
- TRACE("All buffers have stopped. Stopping primary buffer\n");
- device->state = STATE_STOPPED;
-
- /* stop the primary buffer now */
- DSOUND_PrimaryStop(device);
- }
-
- } else {
-
- /* update the wave queue if using wave system */
- if (!device->hwbuf)
- DSOUND_WaveQueue(device, TRUE);
- else
- /* Keep alsa happy, which needs GetPosition called once every 10 ms */
- IDsDriverBuffer_GetPosition(device->hwbuf, NULL, NULL);
-
- /* in the DSSCL_WRITEPRIMARY mode, the app is totally in charge... */
- if (device->state == STATE_STARTING) {
- if (DSOUND_PrimaryPlay(device) != DS_OK)
- WARN("DSOUND_PrimaryPlay failed\n");
- else
- device->state = STATE_PLAYING;
- }
- else if (device->state == STATE_STOPPING) {
- if (DSOUND_PrimaryStop(device) != DS_OK)
- WARN("DSOUND_PrimaryStop failed\n");
- else
- device->state = STATE_STOPPED;
- }
- }
-
- LeaveCriticalSection(&(device->mixlock));
- /* **** */
-}
-
-void CALLBACK DSOUND_timer(UINT timerID, UINT msg, DWORD_PTR dwUser,
- DWORD_PTR dw1, DWORD_PTR dw2)
-{
- DirectSoundDevice * device = (DirectSoundDevice*)dwUser;
- DWORD start_time = GetTickCount();
- DWORD end_time;
- TRACE("(%d,%d,0x%lx,0x%lx,0x%lx)\n",timerID,msg,dwUser,dw1,dw2);
- TRACE("entering at %d\n", start_time);
-
- if (DSOUND_renderer[device->drvdesc.dnDevNode] != device) {
- ERR("dsound died without killing us?\n");
- timeKillEvent(timerID);
- timeEndPeriod(DS_TIME_RES);
- return;
- }
-
- RtlAcquireResourceShared(&(device->buffer_list_lock), TRUE);
-
- if (device->ref)
- DSOUND_PerformMix(device);
-
- RtlReleaseResource(&(device->buffer_list_lock));
-
- end_time = GetTickCount();
- TRACE("completed processing at %d, duration = %d\n", end_time, end_time - start_time);
-}
-
-void CALLBACK DSOUND_callback(HWAVEOUT hwo, UINT msg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
-{
- DirectSoundDevice * device = (DirectSoundDevice*)dwUser;
- TRACE("(%p,%x,%lx,%lx,%lx)\n",hwo,msg,dwUser,dw1,dw2);
- TRACE("entering at %d, msg=%08x(%s)\n", GetTickCount(), msg,
- msg==MM_WOM_DONE ? "MM_WOM_DONE" : msg==MM_WOM_CLOSE ? "MM_WOM_CLOSE" :
- msg==MM_WOM_OPEN ? "MM_WOM_OPEN" : "UNKNOWN");
-
- /* check if packet completed from wave driver */
- if (msg == MM_WOM_DONE) {
-
- /* **** */
- EnterCriticalSection(&(device->mixlock));
-
- TRACE("done playing primary pos=%d\n", device->pwplay * device->fraglen);
-
- /* update playpos */
- device->pwplay++;
- device->pwplay %= device->helfrags;
-
- /* sanity */
- if(device->pwqueue == 0){
- ERR("Wave queue corrupted!\n");
- }
-
- /* update queue */
- device->pwqueue--;
-
- LeaveCriticalSection(&(device->mixlock));
- /* **** */
- }
- TRACE("completed\n");
-}
+++ /dev/null
-/* DirectSound
- *
- * Copyright 1998 Marcus Meissner
- * Copyright 1998 Rob Riggs
- * Copyright 2000-2002 TransGaming Technologies, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#include <stdarg.h>
-
-#define NONAMELESSSTRUCT
-#define NONAMELESSUNION
-#include "windef.h"
-#include "winbase.h"
-#include "winuser.h"
-#include "mmsystem.h"
-#include "winternl.h"
-#include "mmddk.h"
-#include "wine/debug.h"
-#include "dsound.h"
-#include "dsdriver.h"
-#include "dsound_private.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(dsound);
-
-/** Calculate how long a fragment length of about 10 ms should be in frames
- *
- * nSamplesPerSec: Frequency rate in samples per second
- * nBlockAlign: Size of a single blockalign
- *
- * Returns:
- * Size in bytes of a single fragment
- */
-DWORD DSOUND_fraglen(DWORD nSamplesPerSec, DWORD nBlockAlign)
-{
- /* Given a timer delay of 10ms, the fragment size is approximately:
- * fraglen = (nSamplesPerSec * 10 / 1000) * nBlockAlign
- * ==> fraglen = (nSamplesPerSec / 100) * nBlockSize
- *
- * ALSA uses buffers that are powers of 2. Because of this, fraglen
- * is rounded up to the nearest power of 2:
- */
-
- if (nSamplesPerSec <= 12800)
- return 128 * nBlockAlign;
-
- if (nSamplesPerSec <= 25600)
- return 256 * nBlockAlign;
-
- if (nSamplesPerSec <= 51200)
- return 512 * nBlockAlign;
-
- return 1024 * nBlockAlign;
-}
-
-static void DSOUND_RecalcPrimary(DirectSoundDevice *device)
-{
- TRACE("(%p)\n", device);
-
- device->fraglen = DSOUND_fraglen(device->pwfx->nSamplesPerSec, device->pwfx->nBlockAlign);
- device->helfrags = device->buflen / device->fraglen;
- TRACE("fraglen=%d helfrags=%d\n", device->fraglen, device->helfrags);
-
- if (device->hwbuf && device->drvdesc.dwFlags & DSDDESC_DONTNEEDWRITELEAD)
- device->writelead = 0;
- else
- /* calculate the 10ms write lead */
- device->writelead = (device->pwfx->nSamplesPerSec / 100) * device->pwfx->nBlockAlign;
-}
-
-HRESULT DSOUND_ReopenDevice(DirectSoundDevice *device, BOOL forcewave)
-{
- HRESULT hres = DS_OK;
- TRACE("(%p, %d)\n", device, forcewave);
-
- if (device->driver)
- {
- IDsDriver_Close(device->driver);
- if (device->drvdesc.dwFlags & DSDDESC_DOMMSYSTEMOPEN)
- waveOutClose(device->hwo);
- IDsDriver_Release(device->driver);
- device->driver = NULL;
- device->buffer = NULL;
- device->hwo = 0;
- }
- else if (device->drvdesc.dwFlags & DSDDESC_DOMMSYSTEMOPEN)
- waveOutClose(device->hwo);
-
- /* DRV_QUERYDSOUNDIFACE is a "Wine extension" to get the DSound interface */
- if (ds_hw_accel != DS_HW_ACCEL_EMULATION && !forcewave)
- waveOutMessage((HWAVEOUT)device->drvdesc.dnDevNode, DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&device->driver, 0);
-
- /* Get driver description */
- if (device->driver) {
- DWORD wod = device->drvdesc.dnDevNode;
- hres = IDsDriver_GetDriverDesc(device->driver,&(device->drvdesc));
- device->drvdesc.dnDevNode = wod;
- if (FAILED(hres)) {
- WARN("IDsDriver_GetDriverDesc failed: %08x\n", hres);
- IDsDriver_Release(device->driver);
- device->driver = NULL;
- }
- }
-
- /* if no DirectSound interface available, use WINMM API instead */
- if (!device->driver)
- device->drvdesc.dwFlags = DSDDESC_DOMMSYSTEMOPEN | DSDDESC_DOMMSYSTEMSETFORMAT;
-
- if (device->drvdesc.dwFlags & DSDDESC_DOMMSYSTEMOPEN)
- {
- DWORD flags = CALLBACK_FUNCTION;
-
- if (device->driver)
- flags |= WAVE_DIRECTSOUND;
-
- hres = mmErr(waveOutOpen(&(device->hwo), device->drvdesc.dnDevNode, device->pwfx, (DWORD_PTR)DSOUND_callback, (DWORD_PTR)device, flags));
- if (FAILED(hres)) {
- WARN("waveOutOpen failed\n");
- if (device->driver)
- {
- IDsDriver_Release(device->driver);
- device->driver = NULL;
- }
- return hres;
- }
- }
-
- if (device->driver)
- hres = IDsDriver_Open(device->driver);
-
- return hres;
-}
-
-static HRESULT DSOUND_PrimaryOpen(DirectSoundDevice *device)
-{
- DWORD buflen;
- HRESULT err = DS_OK;
- TRACE("(%p)\n", device);
-
- /* on original windows, the buffer it set to a fixed size, no matter what the settings are.
- on windows this size is always fixed (tested on win-xp) */
- if (!device->buflen)
- device->buflen = ds_hel_buflen;
- buflen = device->buflen;
- buflen -= buflen % device->pwfx->nBlockAlign;
- device->buflen = buflen;
-
- if (device->driver)
- {
- err = IDsDriver_CreateSoundBuffer(device->driver,device->pwfx,
- DSBCAPS_PRIMARYBUFFER,0,
- &(device->buflen),&(device->buffer),
- (LPVOID*)&(device->hwbuf));
-
- if (err != DS_OK) {
- WARN("IDsDriver_CreateSoundBuffer failed (%08x), falling back to waveout\n", err);
- err = DSOUND_ReopenDevice(device, TRUE);
- if (FAILED(err))
- {
- WARN("Falling back to waveout failed too! Giving up\n");
- return err;
- }
- }
- if (device->hwbuf)
- IDsDriverBuffer_SetVolumePan(device->hwbuf, &device->volpan);
-
- DSOUND_RecalcPrimary(device);
- device->prebuf = ds_snd_queue_max;
- if (device->helfrags < ds_snd_queue_min)
- {
- WARN("Too little sound buffer to be effective (%d/%d) falling back to waveout\n", device->buflen, ds_snd_queue_min * device->fraglen);
- device->buflen = buflen;
- IDsDriverBuffer_Release(device->hwbuf);
- device->hwbuf = NULL;
- err = DSOUND_ReopenDevice(device, TRUE);
- if (FAILED(err))
- {
- WARN("Falling back to waveout failed too! Giving up\n");
- return err;
- }
- }
- else if (device->helfrags < ds_snd_queue_max)
- device->prebuf = device->helfrags;
- }
-
- device->mix_buffer_len = DSOUND_bufpos_to_mixpos(device, device->buflen);
- device->mix_buffer = HeapAlloc(GetProcessHeap(), 0, device->mix_buffer_len);
- if (!device->mix_buffer)
- {
- if (device->hwbuf)
- IDsDriverBuffer_Release(device->hwbuf);
- device->hwbuf = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- if (device->state == STATE_PLAYING) device->state = STATE_STARTING;
- else if (device->state == STATE_STOPPING) device->state = STATE_STOPPED;
-
- /* are we using waveOut stuff? */
- if (!device->driver) {
- LPBYTE newbuf;
- LPWAVEHDR headers = NULL;
- DWORD overshot;
- unsigned int c;
-
- /* Start in pause mode, to allow buffers to get filled */
- waveOutPause(device->hwo);
-
- TRACE("desired buflen=%d, old buffer=%p\n", buflen, device->buffer);
-
- /* reallocate emulated primary buffer */
- if (device->buffer)
- newbuf = HeapReAlloc(GetProcessHeap(),0,device->buffer, buflen);
- else
- newbuf = HeapAlloc(GetProcessHeap(),0, buflen);
-
- if (!newbuf) {
- ERR("failed to allocate primary buffer\n");
- return DSERR_OUTOFMEMORY;
- /* but the old buffer might still exist and must be re-prepared */
- }
-
- DSOUND_RecalcPrimary(device);
- if (device->pwave)
- headers = HeapReAlloc(GetProcessHeap(),0,device->pwave, device->helfrags * sizeof(WAVEHDR));
- else
- headers = HeapAlloc(GetProcessHeap(),0,device->helfrags * sizeof(WAVEHDR));
-
- if (!headers) {
- ERR("failed to allocate wave headers\n");
- HeapFree(GetProcessHeap(), 0, newbuf);
- DSOUND_RecalcPrimary(device);
- return DSERR_OUTOFMEMORY;
- }
-
- device->buffer = newbuf;
- device->pwave = headers;
-
- /* prepare fragment headers */
- for (c=0; c<device->helfrags; c++) {
- device->pwave[c].lpData = (char*)device->buffer + c*device->fraglen;
- device->pwave[c].dwBufferLength = device->fraglen;
- device->pwave[c].dwUser = (DWORD_PTR)device;
- device->pwave[c].dwFlags = 0;
- device->pwave[c].dwLoops = 0;
- err = mmErr(waveOutPrepareHeader(device->hwo,&device->pwave[c],sizeof(WAVEHDR)));
- if (err != DS_OK) {
- while (c--)
- waveOutUnprepareHeader(device->hwo,&device->pwave[c],sizeof(WAVEHDR));
- break;
- }
- }
-
- overshot = device->buflen % device->fraglen;
- /* sanity */
- if(overshot)
- {
- overshot -= overshot % device->pwfx->nBlockAlign;
- device->pwave[device->helfrags - 1].dwBufferLength += overshot;
- }
-
- TRACE("fraglen=%d, overshot=%d\n", device->fraglen, overshot);
- }
- device->mixfunction = mixfunctions[device->pwfx->wBitsPerSample/8 - 1];
- device->normfunction = normfunctions[device->pwfx->wBitsPerSample/8 - 1];
- FillMemory(device->buffer, device->buflen, (device->pwfx->wBitsPerSample == 8) ? 128 : 0);
- FillMemory(device->mix_buffer, device->mix_buffer_len, 0);
- device->pwplay = device->pwqueue = device->playpos = device->mixpos = 0;
- return err;
-}
-
-
-static void DSOUND_PrimaryClose(DirectSoundDevice *device)
-{
- TRACE("(%p)\n", device);
-
- /* are we using waveOut stuff? */
- if (!device->hwbuf) {
- unsigned c;
-
- /* get out of CS when calling the wave system */
- LeaveCriticalSection(&(device->mixlock));
- /* **** */
- device->pwqueue = (DWORD)-1; /* resetting queues */
- waveOutReset(device->hwo);
- for (c=0; c<device->helfrags; c++)
- waveOutUnprepareHeader(device->hwo, &device->pwave[c], sizeof(WAVEHDR));
- /* **** */
- EnterCriticalSection(&(device->mixlock));
-
- /* clear the queue */
- device->pwqueue = 0;
- } else {
- ULONG ref = IDsDriverBuffer_Release(device->hwbuf);
- if (!ref)
- device->hwbuf = 0;
- else
- ERR("Still %d references on primary buffer, refcount leak?\n", ref);
- }
-}
-
-HRESULT DSOUND_PrimaryCreate(DirectSoundDevice *device)
-{
- HRESULT err = DS_OK;
- TRACE("(%p)\n", device);
-
- device->buflen = ds_hel_buflen;
- err = DSOUND_PrimaryOpen(device);
-
- if (err != DS_OK) {
- WARN("DSOUND_PrimaryOpen failed\n");
- return err;
- }
-
- device->state = STATE_STOPPED;
- return DS_OK;
-}
-
-HRESULT DSOUND_PrimaryDestroy(DirectSoundDevice *device)
-{
- TRACE("(%p)\n", device);
-
- /* **** */
- EnterCriticalSection(&(device->mixlock));
-
- DSOUND_PrimaryClose(device);
- if (device->driver) {
- if (device->hwbuf) {
- if (IDsDriverBuffer_Release(device->hwbuf) == 0)
- device->hwbuf = 0;
- }
- } else
- HeapFree(GetProcessHeap(),0,device->pwave);
- HeapFree(GetProcessHeap(),0,device->pwfx);
- device->pwfx=NULL;
-
- LeaveCriticalSection(&(device->mixlock));
- /* **** */
-
- return DS_OK;
-}
-
-HRESULT DSOUND_PrimaryPlay(DirectSoundDevice *device)
-{
- HRESULT err = DS_OK;
- TRACE("(%p)\n", device);
-
- if (device->hwbuf) {
- err = IDsDriverBuffer_Play(device->hwbuf, 0, 0, DSBPLAY_LOOPING);
- if (err != DS_OK)
- WARN("IDsDriverBuffer_Play failed\n");
- } else {
- err = mmErr(waveOutRestart(device->hwo));
- if (err != DS_OK)
- WARN("waveOutRestart failed\n");
- }
-
- return err;
-}
-
-HRESULT DSOUND_PrimaryStop(DirectSoundDevice *device)
-{
- HRESULT err = DS_OK;
- TRACE("(%p)\n", device);
-
- if (device->hwbuf) {
- err = IDsDriverBuffer_Stop(device->hwbuf);
- if (err == DSERR_BUFFERLOST) {
- DSOUND_PrimaryClose(device);
- err = DSOUND_ReopenDevice(device, FALSE);
- if (FAILED(err))
- ERR("DSOUND_ReopenDevice failed\n");
- else
- {
- err = DSOUND_PrimaryOpen(device);
- if (FAILED(err))
- WARN("DSOUND_PrimaryOpen failed\n");
- }
- } else if (err != DS_OK) {
- WARN("IDsDriverBuffer_Stop failed\n");
- }
- } else {
-
- /* don't call the wave system with the lock set */
- LeaveCriticalSection(&(device->mixlock));
- /* **** */
-
- err = mmErr(waveOutPause(device->hwo));
-
- /* **** */
- EnterCriticalSection(&(device->mixlock));
-
- if (err != DS_OK)
- WARN("waveOutPause failed\n");
- }
-
- return err;
-}
-
-HRESULT DSOUND_PrimaryGetPosition(DirectSoundDevice *device, LPDWORD playpos, LPDWORD writepos)
-{
- TRACE("(%p,%p,%p)\n", device, playpos, writepos);
-
- if (device->hwbuf) {
- HRESULT err=IDsDriverBuffer_GetPosition(device->hwbuf,playpos,writepos);
- if (err != S_OK) {
- WARN("IDsDriverBuffer_GetPosition failed\n");
- return err;
- }
- } else {
- TRACE("pwplay=%i, pwqueue=%i\n", device->pwplay, device->pwqueue);
-
- /* check if playpos was requested */
- if (playpos)
- /* use the cached play position */
- *playpos = device->pwplay * device->fraglen;
-
- /* check if writepos was requested */
- if (writepos)
- /* the writepos is the first non-queued position */
- *writepos = ((device->pwplay + device->pwqueue) % device->helfrags) * device->fraglen;
- }
- TRACE("playpos = %d, writepos = %d (%p, time=%d)\n", playpos?*playpos:-1, writepos?*writepos:-1, device, GetTickCount());
- return DS_OK;
-}
-
-HRESULT DSOUND_PrimarySetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX wfex, BOOL forced)
-{
- HRESULT err = DSERR_BUFFERLOST;
- int i, alloc_size, cp_size;
- DWORD nSamplesPerSec, bpp, chans;
- TRACE("(%p,%p)\n", device, wfex);
-
- if (device->priolevel == DSSCL_NORMAL) {
- WARN("failed priority check!\n");
- return DSERR_PRIOLEVELNEEDED;
- }
-
- /* Let's be pedantic! */
- if (wfex == NULL) {
- WARN("invalid parameter: wfex==NULL!\n");
- return DSERR_INVALIDPARAM;
- }
- TRACE("(formattag=0x%04x,chans=%d,samplerate=%d,"
- "bytespersec=%d,blockalign=%d,bitspersamp=%d,cbSize=%d)\n",
- wfex->wFormatTag, wfex->nChannels, wfex->nSamplesPerSec,
- wfex->nAvgBytesPerSec, wfex->nBlockAlign,
- wfex->wBitsPerSample, wfex->cbSize);
-
- /* **** */
- RtlAcquireResourceExclusive(&(device->buffer_list_lock), TRUE);
- EnterCriticalSection(&(device->mixlock));
-
- if (wfex->wFormatTag == WAVE_FORMAT_PCM) {
- alloc_size = sizeof(WAVEFORMATEX);
- cp_size = sizeof(PCMWAVEFORMAT);
- } else
- alloc_size = cp_size = sizeof(WAVEFORMATEX) + wfex->cbSize;
-
- device->pwfx = HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,device->pwfx,alloc_size);
-
- nSamplesPerSec = device->pwfx->nSamplesPerSec;
- bpp = device->pwfx->wBitsPerSample;
- chans = device->pwfx->nChannels;
-
- CopyMemory(device->pwfx, wfex, cp_size);
-
- if (!(device->drvdesc.dwFlags & DSDDESC_DOMMSYSTEMSETFORMAT) && device->hwbuf) {
- err = IDsDriverBuffer_SetFormat(device->hwbuf, device->pwfx);
-
- /* On bad format, try to re-create, big chance it will work then, only do this if we <HAVE> to */
- if (forced && (device->pwfx->nSamplesPerSec/100 != wfex->nSamplesPerSec/100 || err == DSERR_BADFORMAT))
- {
- err = DSERR_BUFFERLOST;
- CopyMemory(device->pwfx, wfex, cp_size);
- }
-
- if (err != DSERR_BUFFERLOST && FAILED(err)) {
- WARN("IDsDriverBuffer_SetFormat failed\n");
- if (!forced)
- err = DS_OK;
- goto done;
- }
-
- if (err == S_FALSE)
- {
- /* ALSA specific: S_FALSE tells that recreation was successful,
- * but size and location may be changed, and buffer has to be restarted
- * I put it here, so if frequency doesn't match the error will be changed to DSERR_BUFFERLOST
- * and the entire re-initialization will occur anyway
- */
- IDsDriverBuffer_Lock(device->hwbuf, (LPVOID *)&device->buffer, &device->buflen, NULL, NULL, 0, 0, DSBLOCK_ENTIREBUFFER);
- IDsDriverBuffer_Unlock(device->hwbuf, device->buffer, 0, NULL, 0);
-
- if (device->state == STATE_PLAYING) device->state = STATE_STARTING;
- else if (device->state == STATE_STOPPING) device->state = STATE_STOPPED;
- device->pwplay = device->pwqueue = device->playpos = device->mixpos = 0;
- err = DS_OK;
- }
- DSOUND_RecalcPrimary(device);
- }
-
- if (err == DSERR_BUFFERLOST)
- {
- DSOUND_PrimaryClose(device);
-
- err = DSOUND_ReopenDevice(device, FALSE);
- if (FAILED(err))
- {
- WARN("DSOUND_ReopenDevice failed: %08x\n", err);
- goto done;
- }
- err = DSOUND_PrimaryOpen(device);
- if (err != DS_OK) {
- WARN("DSOUND_PrimaryOpen failed\n");
- goto done;
- }
-
- if (wfex->nSamplesPerSec/100 != device->pwfx->nSamplesPerSec/100 && forced && device->buffer)
- {
- DSOUND_PrimaryClose(device);
- device->pwfx->nSamplesPerSec = wfex->nSamplesPerSec;
- err = DSOUND_ReopenDevice(device, TRUE);
- if (FAILED(err))
- WARN("DSOUND_ReopenDevice(2) failed: %08x\n", err);
- else if (FAILED((err = DSOUND_PrimaryOpen(device))))
- WARN("DSOUND_PrimaryOpen(2) failed: %08x\n", err);
- }
- }
-
- device->mix_buffer_len = DSOUND_bufpos_to_mixpos(device, device->buflen);
- device->mix_buffer = HeapReAlloc(GetProcessHeap(), 0, device->mix_buffer, device->mix_buffer_len);
- FillMemory(device->mix_buffer, device->mix_buffer_len, 0);
- device->mixfunction = mixfunctions[device->pwfx->wBitsPerSample/8 - 1];
- device->normfunction = normfunctions[device->pwfx->wBitsPerSample/8 - 1];
-
- if (nSamplesPerSec != device->pwfx->nSamplesPerSec || bpp != device->pwfx->wBitsPerSample || chans != device->pwfx->nChannels) {
- IDirectSoundBufferImpl** dsb = device->buffers;
- for (i = 0; i < device->nrofbuffers; i++, dsb++) {
- /* **** */
- RtlAcquireResourceExclusive(&(*dsb)->lock, TRUE);
-
- (*dsb)->freqAdjust = ((DWORD64)(*dsb)->freq << DSOUND_FREQSHIFT) / device->pwfx->nSamplesPerSec;
- DSOUND_RecalcFormat((*dsb));
- DSOUND_MixToTemporary((*dsb), 0, (*dsb)->buflen, FALSE);
- (*dsb)->primary_mixpos = 0;
-
- RtlReleaseResource(&(*dsb)->lock);
- /* **** */
- }
- }
-
-done:
- LeaveCriticalSection(&(device->mixlock));
- RtlReleaseResource(&(device->buffer_list_lock));
- /* **** */
-
- return err;
-}
-
-/*******************************************************************************
- * PrimaryBuffer
- */
-/* This sets this format for the <em>Primary Buffer Only</em> */
-/* See file:///cdrom/sdk52/docs/worddoc/dsound.doc page 120 */
-static HRESULT WINAPI PrimaryBufferImpl_SetFormat(
- LPDIRECTSOUNDBUFFER iface,
- LPCWAVEFORMATEX wfex)
-{
- DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
- TRACE("(%p,%p)\n", iface, wfex);
- return DSOUND_PrimarySetFormat(device, wfex, device->priolevel == DSSCL_WRITEPRIMARY);
-}
-
-static HRESULT WINAPI PrimaryBufferImpl_SetVolume(
- LPDIRECTSOUNDBUFFER iface,LONG vol
-) {
- DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
- DWORD ampfactors;
- HRESULT hres = DS_OK;
- TRACE("(%p,%d)\n", iface, vol);
-
- if (!(device->dsbd.dwFlags & DSBCAPS_CTRLVOLUME)) {
- WARN("control unavailable\n");
- return DSERR_CONTROLUNAVAIL;
- }
-
- if ((vol > DSBVOLUME_MAX) || (vol < DSBVOLUME_MIN)) {
- WARN("invalid parameter: vol = %d\n", vol);
- return DSERR_INVALIDPARAM;
- }
-
- /* **** */
- EnterCriticalSection(&(device->mixlock));
-
- waveOutGetVolume(device->hwo, &factors);
- device->volpan.dwTotalLeftAmpFactor=ampfactors & 0xffff;
- device->volpan.dwTotalRightAmpFactor=ampfactors >> 16;
- DSOUND_AmpFactorToVolPan(&device->volpan);
- if (vol != device->volpan.lVolume) {
- device->volpan.lVolume=vol;
- DSOUND_RecalcVolPan(&device->volpan);
- if (device->hwbuf) {
- hres = IDsDriverBuffer_SetVolumePan(device->hwbuf, &device->volpan);
- if (hres != DS_OK)
- WARN("IDsDriverBuffer_SetVolumePan failed\n");
- } else {
- ampfactors = (device->volpan.dwTotalLeftAmpFactor & 0xffff) | (device->volpan.dwTotalRightAmpFactor << 16);
- waveOutSetVolume(device->hwo, ampfactors);
- }
- }
-
- LeaveCriticalSection(&(device->mixlock));
- /* **** */
-
- return hres;
-}
-
-static HRESULT WINAPI PrimaryBufferImpl_GetVolume(
- LPDIRECTSOUNDBUFFER iface,LPLONG vol
-) {
- DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
- DWORD ampfactors;
- TRACE("(%p,%p)\n", iface, vol);
-
- if (!(device->dsbd.dwFlags & DSBCAPS_CTRLVOLUME)) {
- WARN("control unavailable\n");
- return DSERR_CONTROLUNAVAIL;
- }
-
- if (vol == NULL) {
- WARN("invalid parameter: vol = NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (!device->hwbuf)
- {
- waveOutGetVolume(device->hwo, &factors);
- device->volpan.dwTotalLeftAmpFactor=ampfactors & 0xffff;
- device->volpan.dwTotalRightAmpFactor=ampfactors >> 16;
- DSOUND_AmpFactorToVolPan(&device->volpan);
- }
- *vol = device->volpan.lVolume;
- return DS_OK;
-}
-
-static HRESULT WINAPI PrimaryBufferImpl_SetFrequency(
- LPDIRECTSOUNDBUFFER iface,DWORD freq
-) {
- PrimaryBufferImpl *This = (PrimaryBufferImpl *)iface;
- TRACE("(%p,%d)\n",This,freq);
-
- /* You cannot set the frequency of the primary buffer */
- WARN("control unavailable\n");
- return DSERR_CONTROLUNAVAIL;
-}
-
-static HRESULT WINAPI PrimaryBufferImpl_Play(
- LPDIRECTSOUNDBUFFER iface,DWORD reserved1,DWORD reserved2,DWORD flags
-) {
- DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
- TRACE("(%p,%08x,%08x,%08x)\n", iface, reserved1, reserved2, flags);
-
- if (!(flags & DSBPLAY_LOOPING)) {
- WARN("invalid parameter: flags = %08x\n", flags);
- return DSERR_INVALIDPARAM;
- }
-
- /* **** */
- EnterCriticalSection(&(device->mixlock));
-
- if (device->state == STATE_STOPPED)
- device->state = STATE_STARTING;
- else if (device->state == STATE_STOPPING)
- device->state = STATE_PLAYING;
-
- LeaveCriticalSection(&(device->mixlock));
- /* **** */
-
- return DS_OK;
-}
-
-static HRESULT WINAPI PrimaryBufferImpl_Stop(LPDIRECTSOUNDBUFFER iface)
-{
- DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
- TRACE("(%p)\n", iface);
-
- /* **** */
- EnterCriticalSection(&(device->mixlock));
-
- if (device->state == STATE_PLAYING)
- device->state = STATE_STOPPING;
- else if (device->state == STATE_STARTING)
- device->state = STATE_STOPPED;
-
- LeaveCriticalSection(&(device->mixlock));
- /* **** */
-
- return DS_OK;
-}
-
-static ULONG WINAPI PrimaryBufferImpl_AddRef(LPDIRECTSOUNDBUFFER iface)
-{
- PrimaryBufferImpl *This = (PrimaryBufferImpl *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
-}
-
-static ULONG WINAPI PrimaryBufferImpl_Release(LPDIRECTSOUNDBUFFER iface)
-{
- PrimaryBufferImpl *This = (PrimaryBufferImpl *)iface;
- DWORD ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref + 1);
-
- if (!ref) {
- This->device->primary = NULL;
- HeapFree(GetProcessHeap(), 0, This);
- TRACE("(%p) released\n", This);
- }
- return ref;
-}
-
-static HRESULT WINAPI PrimaryBufferImpl_GetCurrentPosition(
- LPDIRECTSOUNDBUFFER iface,LPDWORD playpos,LPDWORD writepos
-) {
- HRESULT hres;
- DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
- TRACE("(%p,%p,%p)\n", iface, playpos, writepos);
-
- /* **** */
- EnterCriticalSection(&(device->mixlock));
-
- hres = DSOUND_PrimaryGetPosition(device, playpos, writepos);
- if (hres != DS_OK) {
- WARN("DSOUND_PrimaryGetPosition failed\n");
- LeaveCriticalSection(&(device->mixlock));
- return hres;
- }
- if (writepos) {
- if (device->state != STATE_STOPPED)
- /* apply the documented 10ms lead to writepos */
- *writepos += device->writelead;
- while (*writepos >= device->buflen) *writepos -= device->buflen;
- }
-
- LeaveCriticalSection(&(device->mixlock));
- /* **** */
-
- TRACE("playpos = %d, writepos = %d (%p, time=%d)\n", playpos?*playpos:0, writepos?*writepos:0, device, GetTickCount());
- return DS_OK;
-}
-
-static HRESULT WINAPI PrimaryBufferImpl_GetStatus(
- LPDIRECTSOUNDBUFFER iface,LPDWORD status
-) {
- DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
- TRACE("(%p,%p)\n", iface, status);
-
- if (status == NULL) {
- WARN("invalid parameter: status == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- *status = 0;
- if ((device->state == STATE_STARTING) ||
- (device->state == STATE_PLAYING))
- *status |= DSBSTATUS_PLAYING | DSBSTATUS_LOOPING;
-
- TRACE("status=%x\n", *status);
- return DS_OK;
-}
-
-
-static HRESULT WINAPI PrimaryBufferImpl_GetFormat(
- LPDIRECTSOUNDBUFFER iface,
- LPWAVEFORMATEX lpwf,
- DWORD wfsize,
- LPDWORD wfwritten)
-{
- DWORD size;
- DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
- TRACE("(%p,%p,%d,%p)\n", iface, lpwf, wfsize, wfwritten);
-
- size = sizeof(WAVEFORMATEX) + device->pwfx->cbSize;
-
- if (lpwf) { /* NULL is valid */
- if (wfsize >= size) {
- CopyMemory(lpwf,device->pwfx,size);
- if (wfwritten)
- *wfwritten = size;
- } else {
- WARN("invalid parameter: wfsize too small\n");
- if (wfwritten)
- *wfwritten = 0;
- return DSERR_INVALIDPARAM;
- }
- } else {
- if (wfwritten)
- *wfwritten = sizeof(WAVEFORMATEX) + device->pwfx->cbSize;
- else {
- WARN("invalid parameter: wfwritten == NULL\n");
- return DSERR_INVALIDPARAM;
- }
- }
-
- return DS_OK;
-}
-
-static HRESULT WINAPI PrimaryBufferImpl_Lock(
- LPDIRECTSOUNDBUFFER iface,DWORD writecursor,DWORD writebytes,LPVOID *lplpaudioptr1,LPDWORD audiobytes1,LPVOID *lplpaudioptr2,LPDWORD audiobytes2,DWORD flags
-) {
- HRESULT hres;
- DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
- TRACE("(%p,%d,%d,%p,%p,%p,%p,0x%08x) at %d\n",
- iface,
- writecursor,
- writebytes,
- lplpaudioptr1,
- audiobytes1,
- lplpaudioptr2,
- audiobytes2,
- flags,
- GetTickCount()
- );
-
- if (!audiobytes1)
- return DSERR_INVALIDPARAM;
-
- if (device->priolevel != DSSCL_WRITEPRIMARY) {
- WARN("failed priority check!\n");
- return DSERR_PRIOLEVELNEEDED;
- }
-
- /* when this flag is set, writecursor is meaningless and must be calculated */
- if (flags & DSBLOCK_FROMWRITECURSOR) {
- /* GetCurrentPosition does too much magic to duplicate here */
- hres = IDirectSoundBuffer_GetCurrentPosition(iface, NULL, &writecursor);
- if (hres != DS_OK) {
- WARN("IDirectSoundBuffer_GetCurrentPosition failed\n");
- return hres;
- }
- }
-
- /* when this flag is set, writebytes is meaningless and must be set */
- if (flags & DSBLOCK_ENTIREBUFFER)
- writebytes = device->buflen;
-
- if (writecursor >= device->buflen) {
- WARN("Invalid parameter, writecursor: %u >= buflen: %u\n",
- writecursor, device->buflen);
- return DSERR_INVALIDPARAM;
- }
-
- if (writebytes > device->buflen) {
- WARN("Invalid parameter, writebytes: %u > buflen: %u\n",
- writebytes, device->buflen);
- return DSERR_INVALIDPARAM;
- }
-
- if (!(device->drvdesc.dwFlags & DSDDESC_DONTNEEDPRIMARYLOCK) && device->hwbuf) {
- hres = IDsDriverBuffer_Lock(device->hwbuf,
- lplpaudioptr1, audiobytes1,
- lplpaudioptr2, audiobytes2,
- writecursor, writebytes,
- 0);
- if (hres != DS_OK) {
- WARN("IDsDriverBuffer_Lock failed\n");
- return hres;
- }
- } else {
- if (writecursor+writebytes <= device->buflen) {
- *(LPBYTE*)lplpaudioptr1 = device->buffer+writecursor;
- *audiobytes1 = writebytes;
- if (lplpaudioptr2)
- *(LPBYTE*)lplpaudioptr2 = NULL;
- if (audiobytes2)
- *audiobytes2 = 0;
- TRACE("->%d.0\n",writebytes);
- } else {
- *(LPBYTE*)lplpaudioptr1 = device->buffer+writecursor;
- *audiobytes1 = device->buflen-writecursor;
- if (lplpaudioptr2)
- *(LPBYTE*)lplpaudioptr2 = device->buffer;
- if (audiobytes2)
- *audiobytes2 = writebytes-(device->buflen-writecursor);
- TRACE("->%d.%d\n",*audiobytes1,audiobytes2?*audiobytes2:0);
- }
- }
- return DS_OK;
-}
-
-static HRESULT WINAPI PrimaryBufferImpl_SetCurrentPosition(
- LPDIRECTSOUNDBUFFER iface,DWORD newpos
-) {
- PrimaryBufferImpl *This = (PrimaryBufferImpl *)iface;
- TRACE("(%p,%d)\n",This,newpos);
-
- /* You cannot set the position of the primary buffer */
- WARN("invalid call\n");
- return DSERR_INVALIDCALL;
-}
-
-static HRESULT WINAPI PrimaryBufferImpl_SetPan(
- LPDIRECTSOUNDBUFFER iface,LONG pan
-) {
- DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
- DWORD ampfactors;
- HRESULT hres = DS_OK;
- TRACE("(%p,%d)\n", iface, pan);
-
- if (!(device->dsbd.dwFlags & DSBCAPS_CTRLPAN)) {
- WARN("control unavailable\n");
- return DSERR_CONTROLUNAVAIL;
- }
-
- if ((pan > DSBPAN_RIGHT) || (pan < DSBPAN_LEFT)) {
- WARN("invalid parameter: pan = %d\n", pan);
- return DSERR_INVALIDPARAM;
- }
-
- /* **** */
- EnterCriticalSection(&(device->mixlock));
-
- if (!device->hwbuf)
- {
- waveOutGetVolume(device->hwo, &factors);
- device->volpan.dwTotalLeftAmpFactor=ampfactors & 0xffff;
- device->volpan.dwTotalRightAmpFactor=ampfactors >> 16;
- DSOUND_AmpFactorToVolPan(&device->volpan);
- }
- if (pan != device->volpan.lPan) {
- device->volpan.lPan=pan;
- DSOUND_RecalcVolPan(&device->volpan);
- if (device->hwbuf) {
- hres = IDsDriverBuffer_SetVolumePan(device->hwbuf, &device->volpan);
- if (hres != DS_OK)
- WARN("IDsDriverBuffer_SetVolumePan failed\n");
- } else {
- ampfactors = (device->volpan.dwTotalLeftAmpFactor & 0xffff) | (device->volpan.dwTotalRightAmpFactor << 16);
- waveOutSetVolume(device->hwo, ampfactors);
- }
- }
-
- LeaveCriticalSection(&(device->mixlock));
- /* **** */
-
- return hres;
-}
-
-static HRESULT WINAPI PrimaryBufferImpl_GetPan(
- LPDIRECTSOUNDBUFFER iface,LPLONG pan
-) {
- DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
- DWORD ampfactors;
- TRACE("(%p,%p)\n", iface, pan);
-
- if (!(device->dsbd.dwFlags & DSBCAPS_CTRLPAN)) {
- WARN("control unavailable\n");
- return DSERR_CONTROLUNAVAIL;
- }
-
- if (pan == NULL) {
- WARN("invalid parameter: pan == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (!device->hwbuf)
- {
- waveOutGetVolume(device->hwo, &factors);
- device->volpan.dwTotalLeftAmpFactor=ampfactors & 0xffff;
- device->volpan.dwTotalRightAmpFactor=ampfactors >> 16;
- DSOUND_AmpFactorToVolPan(&device->volpan);
- }
- *pan = device->volpan.lPan;
- return DS_OK;
-}
-
-static HRESULT WINAPI PrimaryBufferImpl_Unlock(
- LPDIRECTSOUNDBUFFER iface,LPVOID p1,DWORD x1,LPVOID p2,DWORD x2
-) {
- DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
- TRACE("(%p,%p,%d,%p,%d)\n", iface, p1, x1, p2, x2);
-
- if (device->priolevel != DSSCL_WRITEPRIMARY) {
- WARN("failed priority check!\n");
- return DSERR_PRIOLEVELNEEDED;
- }
-
- if (!(device->drvdesc.dwFlags & DSDDESC_DONTNEEDPRIMARYLOCK) && device->hwbuf) {
- HRESULT hres;
-
- if ((char *)p1 - (char *)device->buffer + x1 > device->buflen)
- hres = DSERR_INVALIDPARAM;
- else
- hres = IDsDriverBuffer_Unlock(device->hwbuf, p1, x1, p2, x2);
-
- if (hres != DS_OK) {
- WARN("IDsDriverBuffer_Unlock failed\n");
- return hres;
- }
- }
-
- return DS_OK;
-}
-
-static HRESULT WINAPI PrimaryBufferImpl_Restore(
- LPDIRECTSOUNDBUFFER iface
-) {
- PrimaryBufferImpl *This = (PrimaryBufferImpl *)iface;
- FIXME("(%p):stub\n",This);
- return DS_OK;
-}
-
-static HRESULT WINAPI PrimaryBufferImpl_GetFrequency(
- LPDIRECTSOUNDBUFFER iface,LPDWORD freq
-) {
- DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
- TRACE("(%p,%p)\n", iface, freq);
-
- if (freq == NULL) {
- WARN("invalid parameter: freq == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (!(device->dsbd.dwFlags & DSBCAPS_CTRLFREQUENCY)) {
- WARN("control unavailable\n");
- return DSERR_CONTROLUNAVAIL;
- }
-
- *freq = device->pwfx->nSamplesPerSec;
- TRACE("-> %d\n", *freq);
-
- return DS_OK;
-}
-
-static HRESULT WINAPI PrimaryBufferImpl_Initialize(
- LPDIRECTSOUNDBUFFER iface,LPDIRECTSOUND dsound,LPCDSBUFFERDESC dbsd
-) {
- PrimaryBufferImpl *This = (PrimaryBufferImpl *)iface;
- WARN("(%p) already initialized\n", This);
- return DSERR_ALREADYINITIALIZED;
-}
-
-static HRESULT WINAPI PrimaryBufferImpl_GetCaps(
- LPDIRECTSOUNDBUFFER iface,LPDSBCAPS caps
-) {
- DirectSoundDevice *device = ((PrimaryBufferImpl *)iface)->device;
- TRACE("(%p,%p)\n", iface, caps);
-
- if (caps == NULL) {
- WARN("invalid parameter: caps == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (caps->dwSize < sizeof(*caps)) {
- WARN("invalid parameter: caps->dwSize = %d\n", caps->dwSize);
- return DSERR_INVALIDPARAM;
- }
-
- caps->dwFlags = device->dsbd.dwFlags;
- caps->dwBufferBytes = device->buflen;
-
- /* Windows reports these as zero */
- caps->dwUnlockTransferRate = 0;
- caps->dwPlayCpuOverhead = 0;
-
- return DS_OK;
-}
-
-static HRESULT WINAPI PrimaryBufferImpl_QueryInterface(
- LPDIRECTSOUNDBUFFER iface,REFIID riid,LPVOID *ppobj
-) {
- PrimaryBufferImpl *This = (PrimaryBufferImpl *)iface;
- DirectSoundDevice *device = This->device;
- TRACE("(%p,%s,%p)\n", iface, debugstr_guid(riid), ppobj);
-
- if (ppobj == NULL) {
- WARN("invalid parameter\n");
- return E_INVALIDARG;
- }
-
- *ppobj = NULL; /* assume failure */
-
- if ( IsEqualGUID(riid, &IID_IUnknown) ||
- IsEqualGUID(riid, &IID_IDirectSoundBuffer) ) {
- IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER)This);
- *ppobj = This;
- return S_OK;
- }
-
- /* DirectSoundBuffer and DirectSoundBuffer8 are different and */
- /* a primary buffer can't have a DirectSoundBuffer8 interface */
- if ( IsEqualGUID( &IID_IDirectSoundBuffer8, riid ) ) {
- WARN("app requested DirectSoundBuffer8 on primary buffer\n");
- return E_NOINTERFACE;
- }
-
- if ( IsEqualGUID( &IID_IDirectSoundNotify, riid ) ) {
- ERR("app requested IDirectSoundNotify on primary buffer\n");
- /* FIXME: should we support this? */
- return E_NOINTERFACE;
- }
-
- if ( IsEqualGUID( &IID_IDirectSound3DBuffer, riid ) ) {
- ERR("app requested IDirectSound3DBuffer on primary buffer\n");
- return E_NOINTERFACE;
- }
-
- if ( IsEqualGUID( &IID_IDirectSound3DListener, riid ) ) {
- if (!device->listener)
- IDirectSound3DListenerImpl_Create(device, &device->listener);
- if (device->listener) {
- *ppobj = device->listener;
- IDirectSound3DListener_AddRef((LPDIRECTSOUND3DLISTENER)*ppobj);
- return S_OK;
- }
-
- WARN("IID_IDirectSound3DListener failed\n");
- return E_NOINTERFACE;
- }
-
- if ( IsEqualGUID( &IID_IKsPropertySet, riid ) ) {
- FIXME("app requested IKsPropertySet on primary buffer\n");
- return E_NOINTERFACE;
- }
-
- FIXME( "Unknown IID %s\n", debugstr_guid( riid ) );
- return E_NOINTERFACE;
-}
-
-static const IDirectSoundBufferVtbl dspbvt =
-{
- PrimaryBufferImpl_QueryInterface,
- PrimaryBufferImpl_AddRef,
- PrimaryBufferImpl_Release,
- PrimaryBufferImpl_GetCaps,
- PrimaryBufferImpl_GetCurrentPosition,
- PrimaryBufferImpl_GetFormat,
- PrimaryBufferImpl_GetVolume,
- PrimaryBufferImpl_GetPan,
- PrimaryBufferImpl_GetFrequency,
- PrimaryBufferImpl_GetStatus,
- PrimaryBufferImpl_Initialize,
- PrimaryBufferImpl_Lock,
- PrimaryBufferImpl_Play,
- PrimaryBufferImpl_SetCurrentPosition,
- PrimaryBufferImpl_SetFormat,
- PrimaryBufferImpl_SetVolume,
- PrimaryBufferImpl_SetPan,
- PrimaryBufferImpl_SetFrequency,
- PrimaryBufferImpl_Stop,
- PrimaryBufferImpl_Unlock,
- PrimaryBufferImpl_Restore
-};
-
-HRESULT PrimaryBufferImpl_Create(
- DirectSoundDevice * device,
- PrimaryBufferImpl ** ppdsb,
- LPCDSBUFFERDESC dsbd)
-{
- PrimaryBufferImpl *dsb;
- TRACE("%p,%p,%p)\n",device,ppdsb,dsbd);
-
- if (dsbd->lpwfxFormat) {
- WARN("invalid parameter: dsbd->lpwfxFormat != NULL\n");
- *ppdsb = NULL;
- return DSERR_INVALIDPARAM;
- }
-
- dsb = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*dsb));
-
- if (dsb == NULL) {
- WARN("out of memory\n");
- *ppdsb = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- dsb->ref = 0;
- dsb->device = device;
- dsb->lpVtbl = &dspbvt;
-
- device->dsbd = *dsbd;
-
- TRACE("Created primary buffer at %p\n", dsb);
- TRACE("(formattag=0x%04x,chans=%d,samplerate=%d,"
- "bytespersec=%d,blockalign=%d,bitspersamp=%d,cbSize=%d)\n",
- device->pwfx->wFormatTag, device->pwfx->nChannels,
- device->pwfx->nSamplesPerSec, device->pwfx->nAvgBytesPerSec,
- device->pwfx->nBlockAlign, device->pwfx->wBitsPerSample,
- device->pwfx->cbSize);
-
- *ppdsb = dsb;
- return S_OK;
-}
+++ /dev/null
-/* DirectSound
- *
- * Copyright 1998 Marcus Meissner
- * Copyright 1998 Rob Riggs
- * Copyright 2000-2002 TransGaming Technologies, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#define COBJMACROS
-#include <stdarg.h>
-
-#include "windef.h"
-#include "winbase.h"
-#include "winuser.h"
-#include "mmsystem.h"
-#include "winternl.h"
-#include "winnls.h"
-#include "vfwmsgs.h"
-#include "mmddk.h"
-#include "wine/debug.h"
-#include "dsound.h"
-#include "dsdriver.h"
-#include "dsound_private.h"
-#include "dsconf.h"
-
-#ifdef NONAMELESSSTRUCT
-# define S(x) (x).s
-#else
-# define S(x) (x)
-#endif
-
-WINE_DEFAULT_DEBUG_CHANNEL(dsound);
-
-
-/*******************************************************************************
- * IKsBufferPropertySet
- */
-
-/* IUnknown methods */
-static HRESULT WINAPI IKsBufferPropertySetImpl_QueryInterface(
- LPKSPROPERTYSET iface,
- REFIID riid,
- LPVOID *ppobj )
-{
- IKsBufferPropertySetImpl *This = (IKsBufferPropertySetImpl *)iface;
- TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
-
- return IDirectSoundBuffer_QueryInterface((LPDIRECTSOUNDBUFFER8)This->dsb, riid, ppobj);
-}
-
-static ULONG WINAPI IKsBufferPropertySetImpl_AddRef(LPKSPROPERTYSET iface)
-{
- IKsBufferPropertySetImpl *This = (IKsBufferPropertySetImpl *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
-}
-
-static ULONG WINAPI IKsBufferPropertySetImpl_Release(LPKSPROPERTYSET iface)
-{
- IKsBufferPropertySetImpl *This = (IKsBufferPropertySetImpl *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref + 1);
-
- if (!ref) {
- This->dsb->iks = 0;
- IDirectSoundBuffer_Release((LPDIRECTSOUND3DBUFFER)This->dsb);
- HeapFree(GetProcessHeap(), 0, This);
- TRACE("(%p) released\n", This);
- }
- return ref;
-}
-
-static HRESULT WINAPI IKsBufferPropertySetImpl_Get(
- LPKSPROPERTYSET iface,
- REFGUID guidPropSet,
- ULONG dwPropID,
- LPVOID pInstanceData,
- ULONG cbInstanceData,
- LPVOID pPropData,
- ULONG cbPropData,
- PULONG pcbReturned )
-{
- IKsBufferPropertySetImpl *This = (IKsBufferPropertySetImpl *)iface;
- PIDSDRIVERPROPERTYSET ps;
- TRACE("(iface=%p,guidPropSet=%s,dwPropID=%d,pInstanceData=%p,cbInstanceData=%d,pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
- This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData,pcbReturned);
-
- if (This->dsb->hwbuf) {
- IDsDriver_QueryInterface(This->dsb->hwbuf, &IID_IDsDriverPropertySet, (void **)&ps);
-
- if (ps) {
- DSPROPERTY prop;
- HRESULT hres;
-
- S(prop).Set = *guidPropSet;
- S(prop).Id = dwPropID;
- S(prop).Flags = 0; /* unused */
- S(prop).InstanceId = (ULONG_PTR)This->dsb->device;
-
- hres = IDsDriverPropertySet_Get(ps, &prop, pInstanceData, cbInstanceData, pPropData, cbPropData, pcbReturned);
-
- IDsDriverPropertySet_Release(ps);
-
- return hres;
- }
- }
-
- return E_PROP_ID_UNSUPPORTED;
-}
-
-static HRESULT WINAPI IKsBufferPropertySetImpl_Set(
- LPKSPROPERTYSET iface,
- REFGUID guidPropSet,
- ULONG dwPropID,
- LPVOID pInstanceData,
- ULONG cbInstanceData,
- LPVOID pPropData,
- ULONG cbPropData )
-{
- IKsBufferPropertySetImpl *This = (IKsBufferPropertySetImpl *)iface;
- PIDSDRIVERPROPERTYSET ps;
- TRACE("(%p,%s,%d,%p,%d,%p,%d)\n",This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData);
-
- if (This->dsb->hwbuf) {
- IDsDriver_QueryInterface(This->dsb->hwbuf, &IID_IDsDriverPropertySet, (void **)&ps);
-
- if (ps) {
- DSPROPERTY prop;
- HRESULT hres;
-
- S(prop).Set = *guidPropSet;
- S(prop).Id = dwPropID;
- S(prop).Flags = 0; /* unused */
- S(prop).InstanceId = (ULONG_PTR)This->dsb->device;
- hres = IDsDriverPropertySet_Set(ps,&prop,pInstanceData,cbInstanceData,pPropData,cbPropData);
-
- IDsDriverPropertySet_Release(ps);
-
- return hres;
- }
- }
-
- return E_PROP_ID_UNSUPPORTED;
-}
-
-static HRESULT WINAPI IKsBufferPropertySetImpl_QuerySupport(
- LPKSPROPERTYSET iface,
- REFGUID guidPropSet,
- ULONG dwPropID,
- PULONG pTypeSupport )
-{
- IKsBufferPropertySetImpl *This = (IKsBufferPropertySetImpl *)iface;
- PIDSDRIVERPROPERTYSET ps;
- TRACE("(%p,%s,%d,%p)\n",This,debugstr_guid(guidPropSet),dwPropID,pTypeSupport);
-
- if (This->dsb->hwbuf) {
- IDsDriver_QueryInterface(This->dsb->hwbuf, &IID_IDsDriverPropertySet, (void **)&ps);
-
- if (ps) {
- HRESULT hres;
-
- hres = IDsDriverPropertySet_QuerySupport(ps,guidPropSet, dwPropID,pTypeSupport);
-
- IDsDriverPropertySet_Release(ps);
-
- return hres;
- }
- }
-
- return E_PROP_ID_UNSUPPORTED;
-}
-
-static const IKsPropertySetVtbl iksbvt = {
- IKsBufferPropertySetImpl_QueryInterface,
- IKsBufferPropertySetImpl_AddRef,
- IKsBufferPropertySetImpl_Release,
- IKsBufferPropertySetImpl_Get,
- IKsBufferPropertySetImpl_Set,
- IKsBufferPropertySetImpl_QuerySupport
-};
-
-HRESULT IKsBufferPropertySetImpl_Create(
- IDirectSoundBufferImpl *dsb,
- IKsBufferPropertySetImpl **piks)
-{
- IKsBufferPropertySetImpl *iks;
- TRACE("(%p,%p)\n",dsb,piks);
- *piks = NULL;
-
- iks = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*iks));
- if (iks == 0) {
- WARN("out of memory\n");
- *piks = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- iks->ref = 0;
- iks->dsb = dsb;
- dsb->iks = iks;
- iks->lpVtbl = &iksbvt;
-
- IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER)dsb);
-
- *piks = iks;
- return S_OK;
-}
-
-HRESULT IKsBufferPropertySetImpl_Destroy(
- IKsBufferPropertySetImpl *piks)
-{
- TRACE("(%p)\n",piks);
-
- while (IKsBufferPropertySetImpl_Release((LPKSPROPERTYSET)piks) > 0);
-
- return S_OK;
-}
-
-/*******************************************************************************
- * IKsPrivatePropertySet
- */
-
-/* IUnknown methods */
-static HRESULT WINAPI IKsPrivatePropertySetImpl_QueryInterface(
- LPKSPROPERTYSET iface,
- REFIID riid,
- LPVOID *ppobj )
-{
- IKsPrivatePropertySetImpl *This = (IKsPrivatePropertySetImpl *)iface;
- TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
-
- if (IsEqualIID(riid, &IID_IUnknown) ||
- IsEqualIID(riid, &IID_IKsPropertySet)) {
- *ppobj = iface;
- IUnknown_AddRef(iface);
- return S_OK;
- }
- *ppobj = NULL;
- return E_NOINTERFACE;
-}
-
-static ULONG WINAPI IKsPrivatePropertySetImpl_AddRef(LPKSPROPERTYSET iface)
-{
- IKsPrivatePropertySetImpl *This = (IKsPrivatePropertySetImpl *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
-}
-
-static ULONG WINAPI IKsPrivatePropertySetImpl_Release(LPKSPROPERTYSET iface)
-{
- IKsPrivatePropertySetImpl *This = (IKsPrivatePropertySetImpl *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref + 1);
-
- if (!ref) {
- HeapFree(GetProcessHeap(), 0, This);
- TRACE("(%p) released\n", This);
- }
- return ref;
-}
-
-static HRESULT DSPROPERTY_WaveDeviceMappingA(
- LPVOID pPropData,
- ULONG cbPropData,
- PULONG pcbReturned )
-{
- HRESULT hr = DSERR_INVALIDPARAM;
- PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A_DATA ppd;
- TRACE("(pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
- pPropData,cbPropData,pcbReturned);
-
- ppd = pPropData;
-
- if (!ppd) {
- WARN("invalid parameter: pPropData\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) {
- ULONG wod;
- unsigned int wodn;
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
- wodn = waveOutGetNumDevs();
- for (wod = 0; wod < wodn; wod++) {
- WAVEOUTCAPSA capsA;
- MMRESULT res;
- res = waveOutGetDevCapsA(wod, &capsA, sizeof(capsA));
- if (res == MMSYSERR_NOERROR) {
- if (lstrcmpA(capsA.szPname, ppd->DeviceName) == 0) {
- ppd->DeviceId = DSOUND_renderer_guids[wod];
- hr = DS_OK;
- TRACE("found %s for %s\n", debugstr_guid(&ppd->DeviceId),
- ppd->DeviceName);
- break;
- }
- }
- }
- } else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
- ULONG wid;
- unsigned int widn;
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
- widn = waveInGetNumDevs();
- for (wid = 0; wid < widn; wid++) {
- WAVEINCAPSA capsA;
- MMRESULT res;
- res = waveInGetDevCapsA(wid, &capsA, sizeof(capsA));
- if (res == MMSYSERR_NOERROR) {
- if (lstrcmpA(capsA.szPname, ppd->DeviceName) == 0) {
- ppd->DeviceId = DSOUND_capture_guids[wid];
- TRACE("found %s for %s\n", debugstr_guid(&ppd->DeviceId),
- ppd->DeviceName);
- hr = DS_OK;
- break;
- }
- }
- }
- }
-
- if (pcbReturned)
- *pcbReturned = cbPropData;
-
- return hr;
-}
-
-static HRESULT DSPROPERTY_WaveDeviceMappingW(
- LPVOID pPropData,
- ULONG cbPropData,
- PULONG pcbReturned )
-{
- HRESULT hr = DSERR_INVALIDPARAM;
- PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W_DATA ppd;
- TRACE("(pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
- pPropData,cbPropData,pcbReturned);
-
- ppd = pPropData;
-
- if (!ppd) {
- WARN("invalid parameter: pPropData\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) {
- ULONG wod;
- unsigned int wodn;
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
- wodn = waveOutGetNumDevs();
- for (wod = 0; wod < wodn; wod++) {
- WAVEOUTCAPSW capsW;
- MMRESULT res;
- res = waveOutGetDevCapsW(wod, &capsW, sizeof(capsW));
- if (res == MMSYSERR_NOERROR) {
- if (lstrcmpW(capsW.szPname, ppd->DeviceName) == 0) {
- ppd->DeviceId = DSOUND_renderer_guids[wod];
- hr = DS_OK;
- TRACE("found %s for %s\n", debugstr_guid(&ppd->DeviceId),
- debugstr_w(ppd->DeviceName));
- break;
- }
- }
- }
- } else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
- ULONG wid;
- unsigned int widn;
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
- widn = waveInGetNumDevs();
- for (wid = 0; wid < widn; wid++) {
- WAVEINCAPSW capsW;
- MMRESULT res;
- res = waveInGetDevCapsW(wid, &capsW, sizeof(capsW));
- if (res == MMSYSERR_NOERROR) {
- if (lstrcmpW(capsW.szPname, ppd->DeviceName) == 0) {
- ppd->DeviceId = DSOUND_capture_guids[wid];
- hr = DS_OK;
- TRACE("found %s for %s\n", debugstr_guid(&ppd->DeviceId),
- debugstr_w(ppd->DeviceName));
- break;
- }
- }
- }
- }
-
- if (pcbReturned)
- *pcbReturned = cbPropData;
-
- return hr;
-}
-
-static HRESULT DSPROPERTY_Description1(
- LPVOID pPropData,
- ULONG cbPropData,
- PULONG pcbReturned )
-{
- HRESULT err;
- GUID guid, dev_guid;
- PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA ppd;
- TRACE("(pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
- pPropData,cbPropData,pcbReturned);
-
- ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA) pPropData;
-
- if (!ppd) {
- WARN("invalid parameter: pPropData\n");
- return DSERR_INVALIDPARAM;
- }
-
- TRACE("DeviceId=%s\n",debugstr_guid(&ppd->DeviceId));
- if ( IsEqualGUID( &ppd->DeviceId , &GUID_NULL) ) {
- /* default device of type specified by ppd->DataFlow */
- if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
- } else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) {
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
- } else {
- TRACE("DataFlow=Unknown(%d)\n", ppd->DataFlow);
- }
- FIXME("(pPropData=%p,cbPropData=%d,pcbReturned=%p) GUID_NULL not implemented!\n",
- pPropData,cbPropData,pcbReturned);
- return E_PROP_ID_UNSUPPORTED;
- }
-
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
- GetDeviceID(&ppd->DeviceId, &dev_guid);
-
- if ( IsEqualGUID( &ppd->DeviceId, &DSDEVID_DefaultPlayback) ||
- IsEqualGUID( &ppd->DeviceId, &DSDEVID_DefaultVoicePlayback) ) {
- ULONG wod;
- unsigned int wodn;
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
- wodn = waveOutGetNumDevs();
- for (wod = 0; wod < wodn; wod++) {
- if (IsEqualGUID( &dev_guid, &DSOUND_renderer_guids[wod] ) ) {
- DSDRIVERDESC desc;
- ppd->WaveDeviceId = wod;
- ppd->Devnode = wod;
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- PIDSDRIVER drv = NULL;
- lstrcpynA(ppd->DescriptionA, desc.szDesc, sizeof(ppd->DescriptionA));
- lstrcpynA(ppd->ModuleA, desc.szDrvname, sizeof(ppd->ModuleA));
- MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, ppd->DescriptionW, sizeof(ppd->DescriptionW)/sizeof(WCHAR) );
- MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, ppd->ModuleW, sizeof(ppd->ModuleW)/sizeof(WCHAR) );
- err = mmErr(waveOutMessage(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
- if (err == DS_OK && drv)
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
- break;
- } else {
- WARN("waveOutMessage(DRV_QUERYDSOUNDDESC) failed\n");
- return E_PROP_ID_UNSUPPORTED;
- }
- }
- }
- } else if ( IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) ||
- IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoiceCapture) ) {
- ULONG wid;
- unsigned int widn;
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
- widn = waveInGetNumDevs();
- for (wid = 0; wid < widn; wid++) {
- if (IsEqualGUID( &dev_guid, &guid) ) {
- DSDRIVERDESC desc;
- ppd->WaveDeviceId = wid;
- ppd->Devnode = wid;
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- PIDSCDRIVER drv;
- lstrcpynA(ppd->DescriptionA, desc.szDesc, sizeof(ppd->DescriptionA));
- lstrcpynA(ppd->ModuleA, desc.szDrvname, sizeof(ppd->ModuleA));
- MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, ppd->DescriptionW, sizeof(ppd->DescriptionW)/sizeof(WCHAR) );
- MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, ppd->ModuleW, sizeof(ppd->ModuleW)/sizeof(WCHAR) );
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDIFACE,(DWORD_PTR)&drv,0));
- if (err == DS_OK && drv)
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
- break;
- } else {
- WARN("waveInMessage(DRV_QUERYDSOUNDDESC) failed\n");
- return E_PROP_ID_UNSUPPORTED;
- }
- }
- }
- } else {
- BOOL found = FALSE;
- ULONG wod;
- unsigned int wodn;
- /* given specific device so try the render devices first */
- wodn = waveOutGetNumDevs();
- for (wod = 0; wod < wodn; wod++) {
- if (IsEqualGUID( &ppd->DeviceId, &DSOUND_renderer_guids[wod] ) ) {
- DSDRIVERDESC desc;
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
- ppd->WaveDeviceId = wod;
- ppd->Devnode = wod;
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- PIDSDRIVER drv = NULL;
- lstrcpynA(ppd->DescriptionA, desc.szDesc, sizeof(ppd->DescriptionA));
- lstrcpynA(ppd->ModuleA, desc.szDrvname, sizeof(ppd->ModuleA));
- MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, ppd->DescriptionW, sizeof(ppd->DescriptionW)/sizeof(WCHAR) );
- MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, ppd->ModuleW, sizeof(ppd->ModuleW)/sizeof(WCHAR) );
- err = mmErr(waveOutMessage(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
- if (err == DS_OK && drv)
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
- found = TRUE;
- break;
- } else {
- WARN("waveOutMessage(DRV_QUERYDSOUNDDESC) failed\n");
- return E_PROP_ID_UNSUPPORTED;
- }
- }
- }
-
- if (found == FALSE) {
- ULONG wid;
- unsigned int widn;
- /* given specific device so try the capture devices next */
- widn = waveInGetNumDevs();
- for (wid = 0; wid < widn; wid++) {
- if (IsEqualGUID( &ppd->DeviceId, &DSOUND_capture_guids[wid] ) ) {
- DSDRIVERDESC desc;
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
- ppd->WaveDeviceId = wid;
- ppd->Devnode = wid;
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- PIDSDRIVER drv = NULL;
- lstrcpynA(ppd->DescriptionA, desc.szDesc, sizeof(ppd->DescriptionA));
- lstrcpynA(ppd->ModuleA, desc.szDrvname, sizeof(ppd->ModuleA));
- MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, ppd->DescriptionW, sizeof(ppd->DescriptionW)/sizeof(WCHAR) );
- MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, ppd->ModuleW, sizeof(ppd->ModuleW)/sizeof(WCHAR) );
- err = mmErr(waveInMessage(UlongToHandle(wid), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
- if (err == DS_OK && drv)
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
- found = TRUE;
- break;
- } else {
- WARN("waveInMessage(DRV_QUERYDSOUNDDESC) failed\n");
- return E_PROP_ID_UNSUPPORTED;
- }
- }
- }
-
- if (found == FALSE) {
- WARN("device not found\n");
- return E_PROP_ID_UNSUPPORTED;
- }
- }
- }
-
- if (pcbReturned) {
- *pcbReturned = cbPropData;
- TRACE("*pcbReturned=%d\n", *pcbReturned);
- }
-
- return S_OK;
-}
-
-static HRESULT DSPROPERTY_DescriptionA(
- LPVOID pPropData,
- ULONG cbPropData,
- PULONG pcbReturned )
-{
- PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA ppd = pPropData;
- HRESULT err;
- GUID dev_guid;
- TRACE("(pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
- pPropData,cbPropData,pcbReturned);
-
- TRACE("DeviceId=%s\n",debugstr_guid(&ppd->DeviceId));
- if ( IsEqualGUID( &ppd->DeviceId , &GUID_NULL) ) {
- /* default device of type specified by ppd->DataFlow */
- if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
- } else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) {
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
- } else {
- TRACE("DataFlow=Unknown(%d)\n", ppd->DataFlow);
- }
- FIXME("(pPropData=%p,cbPropData=%d,pcbReturned=%p) GUID_NULL not implemented!\n",
- pPropData,cbPropData,pcbReturned);
- return E_PROP_ID_UNSUPPORTED;
- }
-
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
- GetDeviceID(&ppd->DeviceId, &dev_guid);
-
- if ( IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultPlayback) ||
- IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoicePlayback) ) {
- ULONG wod;
- unsigned int wodn;
- if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultPlayback) )
- TRACE("DSDEVID_DefaultPlayback\n");
- else
- TRACE("DSDEVID_DefaultVoicePlayback\n");
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
- wodn = waveOutGetNumDevs();
- for (wod = 0; wod < wodn; wod++) {
- if (IsEqualGUID( &dev_guid, &DSOUND_renderer_guids[wod] ) ) {
- DSDRIVERDESC desc;
- ppd->WaveDeviceId = wod;
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- PIDSDRIVER drv = NULL;
- /* FIXME: this is a memory leak */
- CHAR * szDescription = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDesc) + 1);
- CHAR * szModule = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDrvname) + 1);
- CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
-
- if (szDescription && szModule && szInterface) {
- strcpy(szDescription, desc.szDesc);
- strcpy(szModule, desc.szDrvname);
- strcpy(szInterface, "Interface");
-
- ppd->Description = szDescription;
- ppd->Module = szModule;
- ppd->Interface = szInterface;
- err = mmErr(waveOutMessage(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
- if (err == DS_OK && drv)
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
- break;
- } else {
- WARN("no memory\n");
- HeapFree(GetProcessHeap(), 0, szDescription);
- HeapFree(GetProcessHeap(), 0, szModule);
- HeapFree(GetProcessHeap(), 0, szInterface);
- return E_OUTOFMEMORY;
- }
- } else {
- WARN("waveOutMessage(DRV_QUERYDSOUNDDESC) failed\n");
- return E_PROP_ID_UNSUPPORTED;
- }
- }
- }
- } else if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) ||
- IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoiceCapture) ) {
- ULONG wid;
- unsigned int widn;
- if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) )
- TRACE("DSDEVID_DefaultCapture\n");
- else
- TRACE("DSDEVID_DefaultVoiceCapture\n");
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
- widn = waveInGetNumDevs();
- for (wid = 0; wid < widn; wid++) {
- if (IsEqualGUID( &dev_guid, &DSOUND_capture_guids[wid] ) ) {
- DSDRIVERDESC desc;
- ppd->WaveDeviceId = wid;
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- PIDSCDRIVER drv;
- /* FIXME: this is a memory leak */
- CHAR * szDescription = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDesc) + 1);
- CHAR * szModule = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDrvname) + 1);
- CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
-
- if (szDescription && szModule && szInterface) {
- strcpy(szDescription, desc.szDesc);
- strcpy(szModule, desc.szDrvname);
- strcpy(szInterface, "Interface");
-
- ppd->Description = szDescription;
- ppd->Module = szModule;
- ppd->Interface = szInterface;
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDIFACE,(DWORD_PTR)&drv,0));
- if (err == DS_OK && drv)
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
- break;
- } else {
- WARN("no memory\n");
- HeapFree(GetProcessHeap(), 0, szDescription);
- HeapFree(GetProcessHeap(), 0, szModule);
- HeapFree(GetProcessHeap(), 0, szInterface);
- return E_OUTOFMEMORY;
- }
- } else {
- WARN("waveInMessage(DRV_QUERYDSOUNDDESC) failed\n");
- return E_PROP_ID_UNSUPPORTED;
- }
- }
- }
- } else {
- BOOL found = FALSE;
- ULONG wod;
- unsigned int wodn;
- /* given specific device so try the render devices first */
- TRACE("Checking renderer devices\n");
- wodn = waveOutGetNumDevs();
- for (wod = 0; wod < wodn; wod++) {
- if (IsEqualGUID( &ppd->DeviceId, &DSOUND_renderer_guids[wod] ) ) {
- DSDRIVERDESC desc;
- TRACE("DSOUND_renderer_guids[%d]\n", wod);
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
- ppd->WaveDeviceId = wod;
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- PIDSDRIVER drv = NULL;
- /* FIXME: this is a memory leak */
- CHAR * szDescription = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDesc) + 1);
- CHAR * szModule = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDrvname) + 1);
- CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
-
- if (szDescription && szModule && szInterface) {
- strcpy(szDescription, desc.szDesc);
- strcpy(szModule, desc.szDrvname);
- strcpy(szInterface, "Interface");
-
- ppd->Description = szDescription;
- ppd->Module = szModule;
- ppd->Interface = szInterface;
- err = mmErr(waveOutMessage(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
- if (err == DS_OK && drv)
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
- found = TRUE;
- break;
- } else {
- WARN("no memory\n");
- HeapFree(GetProcessHeap(), 0, szDescription);
- HeapFree(GetProcessHeap(), 0, szModule);
- HeapFree(GetProcessHeap(), 0, szInterface);
- return E_OUTOFMEMORY;
- }
- } else {
- WARN("waveOutMessage(DRV_QUERYDSOUNDDESC) failed\n");
- return E_PROP_ID_UNSUPPORTED;
- }
- }
- }
-
- if (found == FALSE) {
- ULONG wid;
- unsigned int widn;
- TRACE("Checking capture devices\n");
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
- widn = waveInGetNumDevs();
- for (wid = 0; wid < widn; wid++) {
- if (IsEqualGUID( &ppd->DeviceId, &DSOUND_capture_guids[wid] ) ) {
- DSDRIVERDESC desc;
- TRACE("DSOUND_capture_guids[%d]\n", wid);
- ppd->WaveDeviceId = wid;
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- PIDSCDRIVER drv;
- /* FIXME: this is a memory leak */
- CHAR * szDescription = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDesc) + 1);
- CHAR * szModule = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDrvname) + 1);
- CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
-
- if (szDescription && szModule && szInterface) {
- strcpy(szDescription, desc.szDesc);
- strcpy(szModule, desc.szDrvname);
- strcpy(szInterface, "Interface");
-
- ppd->Description = szDescription;
- ppd->Module = szModule;
- ppd->Interface = szInterface;
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDIFACE,(DWORD_PTR)&drv,0));
- if (err == DS_OK && drv)
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
- found = TRUE;
- break;
- } else {
- WARN("no memory\n");
- HeapFree(GetProcessHeap(), 0, szDescription);
- HeapFree(GetProcessHeap(), 0, szModule);
- HeapFree(GetProcessHeap(), 0, szInterface);
- return E_OUTOFMEMORY;
- }
- } else {
- WARN("waveInMessage(DRV_QUERYDSOUNDDESC) failed\n");
- return E_PROP_ID_UNSUPPORTED;
- }
- }
- }
- }
-
- if (found == FALSE) {
- WARN("device not found\n");
- return E_PROP_ID_UNSUPPORTED;
- }
- }
-
- if (pcbReturned) {
- *pcbReturned = cbPropData;
- TRACE("*pcbReturned=%d\n", *pcbReturned);
- }
-
- return S_OK;
-}
-
-static HRESULT DSPROPERTY_DescriptionW(
- LPVOID pPropData,
- ULONG cbPropData,
- PULONG pcbReturned )
-{
- PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA ppd = pPropData;
- HRESULT err;
- GUID dev_guid;
- TRACE("pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
- pPropData,cbPropData,pcbReturned);
-
- TRACE("DeviceId=%s\n",debugstr_guid(&ppd->DeviceId));
- if ( IsEqualGUID( &ppd->DeviceId , &GUID_NULL) ) {
- /* default device of type specified by ppd->DataFlow */
- if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
- } else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) {
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
- } else {
- TRACE("DataFlow=Unknown(%d)\n", ppd->DataFlow);
- }
- FIXME("(pPropData=%p,cbPropData=%d,pcbReturned=%p) GUID_NULL not implemented!\n",
- pPropData,cbPropData,pcbReturned);
- return E_PROP_ID_UNSUPPORTED;
- }
-
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
- GetDeviceID(&ppd->DeviceId, &dev_guid);
-
- if ( IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultPlayback) ||
- IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoicePlayback) ) {
- ULONG wod;
- unsigned int wodn;
- if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultPlayback) )
- TRACE("DSDEVID_DefaultPlayback\n");
- else
- TRACE("DSDEVID_DefaultVoicePlayback\n");
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
- wodn = waveOutGetNumDevs();
- for (wod = 0; wod < wodn; wod++) {
- if (IsEqualGUID( &dev_guid, &DSOUND_renderer_guids[wod] ) ) {
- DSDRIVERDESC desc;
- TRACE("DSOUND_renderer_guids[%d]\n", wod);
- ppd->WaveDeviceId = wod;
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- PIDSDRIVER drv = NULL;
- /* FIXME: this is a memory leak */
- WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
- WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
- WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
-
- if (wDescription && wModule && wInterface) {
- MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
- MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, wModule, 0x100 );
- MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
-
- ppd->Description = wDescription;
- ppd->Module = wModule;
- ppd->Interface = wInterface;
- err = mmErr(waveOutMessage(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
- if (err == DS_OK && drv)
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
- break;
- } else {
- WARN("no memory\n");
- HeapFree(GetProcessHeap(), 0, wDescription);
- HeapFree(GetProcessHeap(), 0, wModule);
- HeapFree(GetProcessHeap(), 0, wInterface);
- return E_OUTOFMEMORY;
- }
- } else {
- WARN("waveOutMessage(DRV_QUERYDSOUNDDESC) failed\n");
- return E_PROP_ID_UNSUPPORTED;
- }
- }
- }
- } else if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) ||
- IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoiceCapture) ) {
- ULONG wid;
- unsigned int widn;
- if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture))
- TRACE("DSDEVID_DefaultCapture\n");
- else
- TRACE("DSDEVID_DefaultVoiceCapture\n");
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
- widn = waveInGetNumDevs();
- for (wid = 0; wid < widn; wid++) {
- if (IsEqualGUID( &dev_guid, &DSOUND_capture_guids[wid] ) ) {
- DSDRIVERDESC desc;
- ppd->WaveDeviceId = wid;
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- PIDSCDRIVER drv;
- /* FIXME: this is a memory leak */
- WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
- WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
- WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
-
- if (wDescription && wModule && wInterface) {
- MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
- MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, wModule, 0x100 );
- MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
-
- ppd->Description = wDescription;
- ppd->Module = wModule;
- ppd->Interface = wInterface;
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDIFACE,(DWORD_PTR)&drv,0));
- if (err == DS_OK && drv)
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
- break;
- } else {
- WARN("no memory\n");
- HeapFree(GetProcessHeap(), 0, wDescription);
- HeapFree(GetProcessHeap(), 0, wModule);
- HeapFree(GetProcessHeap(), 0, wInterface);
- return E_OUTOFMEMORY;
- }
- } else {
- WARN("waveInMessage(DRV_QUERYDSOUNDDESC) failed\n");
- return E_PROP_ID_UNSUPPORTED;
- }
- }
- }
- } else {
- BOOL found = FALSE;
- ULONG wod;
- unsigned int wodn;
- TRACE("Checking renderer devices\n");
- /* given specific device so try the render devices first */
- wodn = waveOutGetNumDevs();
- for (wod = 0; wod < wodn; wod++) {
- if (IsEqualGUID( &ppd->DeviceId, &DSOUND_renderer_guids[wod] ) ) {
- DSDRIVERDESC desc;
- TRACE("DSOUND_renderer_guids[%d]\n", wod);
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
- ppd->WaveDeviceId = wod;
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- PIDSDRIVER drv = NULL;
- /* FIXME: this is a memory leak */
- WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
- WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
- WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
-
- if (wDescription && wModule && wInterface) {
- MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
- MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, wModule, 0x100 );
- MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
-
- ppd->Description = wDescription;
- ppd->Module = wModule;
- ppd->Interface = wInterface;
- err = mmErr(waveOutMessage(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
- if (err == DS_OK && drv)
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
- found = TRUE;
- break;
- } else {
- WARN("no memory\n");
- HeapFree(GetProcessHeap(), 0, wDescription);
- HeapFree(GetProcessHeap(), 0, wModule);
- HeapFree(GetProcessHeap(), 0, wInterface);
- return E_OUTOFMEMORY;
- }
- } else {
- WARN("waveOutMessage(DRV_QUERYDSOUNDDESC) failed\n");
- return E_PROP_ID_UNSUPPORTED;
- }
- }
- }
-
- if (found == FALSE) {
- ULONG wid;
- unsigned int widn;
- TRACE("Checking capture devices\n");
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
- widn = waveInGetNumDevs();
- for (wid = 0; wid < widn; wid++) {
- if (IsEqualGUID( &dev_guid, &DSOUND_capture_guids[wid] ) ) {
- DSDRIVERDESC desc;
- TRACE("DSOUND_capture_guids[%d]\n", wid);
- ppd->WaveDeviceId = wid;
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- PIDSCDRIVER drv;
- /* FIXME: this is a memory leak */
- WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
- WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
- WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
-
- if (wDescription && wModule && wInterface) {
- MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
- MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, wModule, 0x100 );
- MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
-
- ppd->Description = wDescription;
- ppd->Module = wModule;
- ppd->Interface = wInterface;
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDIFACE,(DWORD_PTR)&drv,0));
- if (err == DS_OK && drv)
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
- found = TRUE;
- break;
- } else {
- WARN("no memory\n");
- HeapFree(GetProcessHeap(), 0, wDescription);
- HeapFree(GetProcessHeap(), 0, wModule);
- HeapFree(GetProcessHeap(), 0, wInterface);
- return E_OUTOFMEMORY;
- }
- } else {
- WARN("waveInMessage(DRV_QUERYDSOUNDDESC) failed\n");
- return E_PROP_ID_UNSUPPORTED;
- }
- }
- }
- }
-
- if (found == FALSE) {
- WARN("device not found\n");
- return E_PROP_ID_UNSUPPORTED;
- }
- }
-
- if (pcbReturned) {
- *pcbReturned = cbPropData;
- TRACE("*pcbReturned=%d\n", *pcbReturned);
- }
-
- return S_OK;
-}
-
-static HRESULT DSPROPERTY_Enumerate1(
- LPVOID pPropData,
- ULONG cbPropData,
- PULONG pcbReturned )
-{
- PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1_DATA ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1_DATA) pPropData;
- HRESULT err;
- TRACE("(pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
- pPropData,cbPropData,pcbReturned);
-
- if (ppd) {
- if (ppd->Callback) {
- unsigned devs, wod, wid;
- DSDRIVERDESC desc;
- DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA data;
-
- devs = waveOutGetNumDevs();
- for (wod = 0; wod < devs; ++wod) {
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- PIDSCDRIVER drv;
- ZeroMemory(&data, sizeof(data));
- data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
- data.WaveDeviceId = wod;
- data.DeviceId = DSOUND_renderer_guids[wod];
- lstrcpynA(data.DescriptionA, desc.szDesc, sizeof(data.DescriptionA));
- lstrcpynA(data.ModuleA, desc.szDrvname, sizeof(data.ModuleA));
-
- MultiByteToWideChar( CP_ACP, 0, data.DescriptionA, -1, data.DescriptionW, sizeof(data.DescriptionW)/sizeof(WCHAR) );
- MultiByteToWideChar( CP_ACP, 0, data.ModuleA, -1, data.ModuleW, sizeof(data.ModuleW)/sizeof(WCHAR) );
-
- data.Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
- err = mmErr(waveOutMessage(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
- if (err == DS_OK && drv)
- data.Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-
- TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
- (ppd->Callback)(&data, ppd->Context);
- }
- }
-
- devs = waveInGetNumDevs();
- for (wid = 0; wid < devs; ++wid) {
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- PIDSCDRIVER drv;
- ZeroMemory(&data, sizeof(data));
- data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
- data.WaveDeviceId = wid;
- data.DeviceId = DSOUND_capture_guids[wid];
- lstrcpynA(data.DescriptionA, desc.szDesc, sizeof(data.DescriptionA));
- lstrcpynA(data.ModuleA, desc.szDrvname, sizeof(data.ModuleA));
-
- MultiByteToWideChar( CP_ACP, 0, data.DescriptionA, -1, data.DescriptionW, sizeof(data.DescriptionW)/sizeof(WCHAR) );
- MultiByteToWideChar( CP_ACP, 0, data.ModuleA, -1, data.ModuleW, sizeof(data.ModuleW)/sizeof(WCHAR) );
-
- data.Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
- err = mmErr(waveInMessage(UlongToHandle(wid), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
- if (err == DS_OK && drv)
- data.Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-
- TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
- (ppd->Callback)(&data, ppd->Context);
- }
- }
-
- return S_OK;
- }
- }
-
- if (pcbReturned) {
- *pcbReturned = 0;
- FIXME("*pcbReturned=%d\n", *pcbReturned);
- }
-
- return E_PROP_ID_UNSUPPORTED;
-}
-
-static HRESULT DSPROPERTY_EnumerateA(
- LPVOID pPropData,
- ULONG cbPropData,
- PULONG pcbReturned )
-{
- PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA ppd = pPropData;
- HRESULT err;
- TRACE("(pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
- pPropData,cbPropData,pcbReturned);
-
- if (ppd) {
- if (ppd->Callback) {
- unsigned devs, wod, wid;
- DSDRIVERDESC desc;
- DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA data;
-
- devs = waveOutGetNumDevs();
- for (wod = 0; wod < devs; ++wod) {
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- DWORD size;
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDEVICEINTERFACESIZE,(DWORD_PTR)&size,0));
- if (err == DS_OK) {
- WCHAR * nameW = HeapAlloc(GetProcessHeap(),0,size);
- if (nameW) {
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDEVICEINTERFACE,(DWORD_PTR)nameW,size));
- if (err == DS_OK) {
- CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,size/sizeof(WCHAR));
- if (szInterface) {
- PIDSCDRIVER drv;
- ZeroMemory(&data, sizeof(data));
- data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
- data.WaveDeviceId = wod;
- data.DeviceId = DSOUND_renderer_guids[wod];
- data.Description = desc.szDesc;
- data.Module = desc.szDrvname;
- WideCharToMultiByte( CP_ACP, 0, nameW, size/sizeof(WCHAR), szInterface, size/sizeof(WCHAR), NULL, NULL );
- data.Interface = szInterface;
-
- data.Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
- err = mmErr(waveOutMessage(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
- if (err == DS_OK && drv)
- data.Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-
- TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
- (ppd->Callback)(&data, ppd->Context);
- }
- HeapFree(GetProcessHeap(),0,szInterface);
- }
- }
- HeapFree(GetProcessHeap(),0,nameW);
- }
- }
- }
-
- devs = waveInGetNumDevs();
- for (wid = 0; wid < devs; ++wid) {
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- DWORD size;
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDEVICEINTERFACESIZE,(DWORD_PTR)&size,0));
- if (err == DS_OK) {
- WCHAR * nameW = HeapAlloc(GetProcessHeap(),0,size);
- if (nameW) {
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDEVICEINTERFACE,(DWORD_PTR)nameW,size));
- if (err == DS_OK) {
- CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,size/sizeof(WCHAR));
- if (szInterface) {
- PIDSCDRIVER drv;
- ZeroMemory(&data, sizeof(data));
- data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
- data.WaveDeviceId = wid;
- data.DeviceId = DSOUND_capture_guids[wid];
- data.Description = desc.szDesc;
- data.Module = desc.szDrvname;
- WideCharToMultiByte( CP_ACP, 0, nameW, size/sizeof(WCHAR), szInterface, size/sizeof(WCHAR), NULL, NULL );
- data.Interface = szInterface;
-
- data.Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
- err = mmErr(waveInMessage(UlongToHandle(wid), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
- if (err == DS_OK && drv)
- data.Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-
- TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
- (ppd->Callback)(&data, ppd->Context);
- }
- HeapFree(GetProcessHeap(),0,szInterface);
- }
- }
- HeapFree(GetProcessHeap(),0,nameW);
- }
- }
- }
-
- return S_OK;
- }
- }
-
- if (pcbReturned) {
- *pcbReturned = 0;
- FIXME("*pcbReturned=%d\n", *pcbReturned);
- }
-
- return E_PROP_ID_UNSUPPORTED;
-}
-
-static HRESULT DSPROPERTY_EnumerateW(
- LPVOID pPropData,
- ULONG cbPropData,
- PULONG pcbReturned )
-{
- PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA ppd = pPropData;
- HRESULT err;
- TRACE("(pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
- pPropData,cbPropData,pcbReturned);
-
- if (ppd) {
- if (ppd->Callback) {
- unsigned devs, wod, wid;
- DSDRIVERDESC desc;
- DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data;
-
- devs = waveOutGetNumDevs();
- for (wod = 0; wod < devs; ++wod) {
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
- WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
- if (wDescription && wModule) {
- DWORD size;
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDEVICEINTERFACESIZE, (DWORD_PTR)&size, 0));
- if (err == DS_OK) {
- WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,size);
- if (wInterface) {
- err = mmErr(waveOutMessage(UlongToHandle(wod), DRV_QUERYDEVICEINTERFACE, (DWORD_PTR)wInterface, size));
- if (err == DS_OK) {
- PIDSCDRIVER drv;
- ZeroMemory(&data, sizeof(data));
- data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
- data.WaveDeviceId = wod;
- data.DeviceId = DSOUND_renderer_guids[wod];
-
- MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
- MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, wModule, 0x100 );
-
- data.Description = wDescription;
- data.Module = wModule;
- data.Interface = wInterface;
-
- data.Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
- err = mmErr(waveOutMessage(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
- if (err == DS_OK && drv)
- data.Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-
- TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
- (ppd->Callback)(&data, ppd->Context);
- }
- }
- HeapFree(GetProcessHeap(),0,wInterface);
- }
- }
- HeapFree(GetProcessHeap(),0,wDescription);
- HeapFree(GetProcessHeap(),0,wModule);
- }
- }
-
- devs = waveInGetNumDevs();
- for (wid = 0; wid < devs; ++wid) {
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
- WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
- if (wDescription && wModule) {
- DWORD size;
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDEVICEINTERFACESIZE, (DWORD_PTR)&size, 0));
- if (err == DS_OK) {
- WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,size);
- if (wInterface) {
- err = mmErr(waveInMessage(UlongToHandle(wid), DRV_QUERYDEVICEINTERFACE, (DWORD_PTR)wInterface, size));
- if (err == DS_OK) {
- PIDSCDRIVER drv;
- ZeroMemory(&data, sizeof(data));
- data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
- data.WaveDeviceId = wid;
- data.DeviceId = DSOUND_capture_guids[wid];
-
- MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
- MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, wModule, 0x100 );
-
- data.Description = wDescription;
- data.Module = wModule;
- data.Interface = wInterface;
- data.Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
- err = mmErr(waveInMessage(UlongToHandle(wid), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
- if (err == DS_OK && drv)
- data.Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-
- TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
- (ppd->Callback)(&data, ppd->Context);
- }
- }
- HeapFree(GetProcessHeap(),0,wInterface);
- }
- }
- HeapFree(GetProcessHeap(),0,wDescription);
- HeapFree(GetProcessHeap(),0,wModule);
- }
- }
-
- return S_OK;
- }
- }
-
- if (pcbReturned) {
- *pcbReturned = 0;
- FIXME("*pcbReturned=%d\n", *pcbReturned);
- }
-
- return E_PROP_ID_UNSUPPORTED;
-}
-
-static HRESULT WINAPI IKsPrivatePropertySetImpl_Get(
- LPKSPROPERTYSET iface,
- REFGUID guidPropSet,
- ULONG dwPropID,
- LPVOID pInstanceData,
- ULONG cbInstanceData,
- LPVOID pPropData,
- ULONG cbPropData,
- PULONG pcbReturned )
-{
- IKsPrivatePropertySetImpl *This = (IKsPrivatePropertySetImpl *)iface;
- TRACE("(iface=%p,guidPropSet=%s,dwPropID=%d,pInstanceData=%p,cbInstanceData=%d,pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
- This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData,pcbReturned);
-
- if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice, guidPropSet) ) {
- switch (dwPropID) {
- case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A:
- return DSPROPERTY_WaveDeviceMappingA(pPropData,cbPropData,pcbReturned);
- case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1:
- return DSPROPERTY_Description1(pPropData,cbPropData,pcbReturned);
- case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1:
- return DSPROPERTY_Enumerate1(pPropData,cbPropData,pcbReturned);
- case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W:
- return DSPROPERTY_WaveDeviceMappingW(pPropData,cbPropData,pcbReturned);
- case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A:
- return DSPROPERTY_DescriptionA(pPropData,cbPropData,pcbReturned);
- case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W:
- return DSPROPERTY_DescriptionW(pPropData,cbPropData,pcbReturned);
- case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A:
- return DSPROPERTY_EnumerateA(pPropData,cbPropData,pcbReturned);
- case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W:
- return DSPROPERTY_EnumerateW(pPropData,cbPropData,pcbReturned);
- default:
- FIXME("unsupported ID: %d\n",dwPropID);
- break;
- }
- } else {
- FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet));
- }
-
- if (pcbReturned) {
- *pcbReturned = 0;
- FIXME("*pcbReturned=%d\n", *pcbReturned);
- }
-
- return E_PROP_ID_UNSUPPORTED;
-}
-
-static HRESULT WINAPI IKsPrivatePropertySetImpl_Set(
- LPKSPROPERTYSET iface,
- REFGUID guidPropSet,
- ULONG dwPropID,
- LPVOID pInstanceData,
- ULONG cbInstanceData,
- LPVOID pPropData,
- ULONG cbPropData )
-{
- IKsPrivatePropertySetImpl *This = (IKsPrivatePropertySetImpl *)iface;
-
- FIXME("(%p,%s,%d,%p,%d,%p,%d), stub!\n",This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData);
- return E_PROP_ID_UNSUPPORTED;
-}
-
-static HRESULT WINAPI IKsPrivatePropertySetImpl_QuerySupport(
- LPKSPROPERTYSET iface,
- REFGUID guidPropSet,
- ULONG dwPropID,
- PULONG pTypeSupport )
-{
- IKsPrivatePropertySetImpl *This = (IKsPrivatePropertySetImpl *)iface;
- TRACE("(%p,%s,%d,%p)\n",This,debugstr_guid(guidPropSet),dwPropID,pTypeSupport);
-
- if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice, guidPropSet) ) {
- switch (dwPropID) {
- case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A:
- *pTypeSupport = KSPROPERTY_SUPPORT_GET;
- return S_OK;
- case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1:
- *pTypeSupport = KSPROPERTY_SUPPORT_GET;
- return S_OK;
- case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1:
- *pTypeSupport = KSPROPERTY_SUPPORT_GET;
- return S_OK;
- case DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W:
- *pTypeSupport = KSPROPERTY_SUPPORT_GET;
- return S_OK;
- case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A:
- *pTypeSupport = KSPROPERTY_SUPPORT_GET;
- return S_OK;
- case DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W:
- *pTypeSupport = KSPROPERTY_SUPPORT_GET;
- return S_OK;
- case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A:
- *pTypeSupport = KSPROPERTY_SUPPORT_GET;
- return S_OK;
- case DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W:
- *pTypeSupport = KSPROPERTY_SUPPORT_GET;
- return S_OK;
- default:
- FIXME("unsupported ID: %d\n",dwPropID);
- break;
- }
- } else {
- FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet));
- }
-
- return E_PROP_ID_UNSUPPORTED;
-}
-
-static const IKsPropertySetVtbl ikspvt = {
- IKsPrivatePropertySetImpl_QueryInterface,
- IKsPrivatePropertySetImpl_AddRef,
- IKsPrivatePropertySetImpl_Release,
- IKsPrivatePropertySetImpl_Get,
- IKsPrivatePropertySetImpl_Set,
- IKsPrivatePropertySetImpl_QuerySupport
-};
-
-HRESULT IKsPrivatePropertySetImpl_Create(
- REFIID riid,
- IKsPrivatePropertySetImpl **piks)
-{
- IKsPrivatePropertySetImpl *iks;
- TRACE("(%s, %p)\n", debugstr_guid(riid), piks);
-
- if (!IsEqualIID(riid, &IID_IUnknown) &&
- !IsEqualIID(riid, &IID_IKsPropertySet)) {
- *piks = 0;
- return E_NOINTERFACE;
- }
-
- iks = HeapAlloc(GetProcessHeap(),0,sizeof(*iks));
- iks->ref = 1;
- iks->lpVtbl = &ikspvt;
-
- *piks = iks;
- return S_OK;
-}
+++ /dev/null
-/*
- * self-registerable dll functions for dsound.dll
- *
- * Copyright (C) 2003 John K. Hohm
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#include <stdarg.h>
-
-#define NONAMELESSSTRUCT
-#define NONAMELESSUNION
-#include "windef.h"
-#include "winbase.h"
-#include "winuser.h"
-#include "winreg.h"
-
-#include "mmsystem.h"
-#include "dsound.h"
-
-#include "wine/debug.h"
-#include "wine/unicode.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(dsound);
-
-static LSTATUS (WINAPI *pRegDeleteTreeW)(HKEY,LPCWSTR);
-static LSTATUS (WINAPI *pRegDeleteTreeA)(HKEY,LPCSTR);
-
-/*
- * Near the bottom of this file are the exported DllRegisterServer and
- * DllUnregisterServer, which make all this worthwhile.
- */
-
-/***********************************************************************
- * interface for self-registering
- */
-struct regsvr_interface
-{
- IID const *iid; /* NULL for end of list */
- LPCSTR name; /* can be NULL to omit */
- IID const *base_iid; /* can be NULL to omit */
- int num_methods; /* can be <0 to omit */
- CLSID const *ps_clsid; /* can be NULL to omit */
- CLSID const *ps_clsid32; /* can be NULL to omit */
-};
-
-static HRESULT register_interfaces(struct regsvr_interface const *list);
-static HRESULT unregister_interfaces(struct regsvr_interface const *list);
-
-struct regsvr_coclass
-{
- CLSID const *clsid; /* NULL for end of list */
- LPCSTR name; /* can be NULL to omit */
- LPCSTR ips; /* can be NULL to omit */
- LPCSTR ips32; /* can be NULL to omit */
- LPCSTR ips32_tmodel; /* can be NULL to omit */
- LPCSTR progid; /* can be NULL to omit */
- LPCSTR viprogid; /* can be NULL to omit */
- LPCSTR progid_extra; /* can be NULL to omit */
-};
-
-static HRESULT register_coclasses(struct regsvr_coclass const *list);
-static HRESULT unregister_coclasses(struct regsvr_coclass const *list);
-
-/***********************************************************************
- * static string constants
- */
-static WCHAR const interface_keyname[10] = {
- 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e', 0 };
-static WCHAR const base_ifa_keyname[14] = {
- 'B', 'a', 's', 'e', 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c',
- 'e', 0 };
-static WCHAR const num_methods_keyname[11] = {
- 'N', 'u', 'm', 'M', 'e', 't', 'h', 'o', 'd', 's', 0 };
-static WCHAR const ps_clsid_keyname[15] = {
- 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's',
- 'i', 'd', 0 };
-static WCHAR const ps_clsid32_keyname[17] = {
- 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's',
- 'i', 'd', '3', '2', 0 };
-static WCHAR const clsid_keyname[6] = {
- 'C', 'L', 'S', 'I', 'D', 0 };
-static WCHAR const curver_keyname[7] = {
- 'C', 'u', 'r', 'V', 'e', 'r', 0 };
-static WCHAR const ips_keyname[13] = {
- 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r',
- 0 };
-static WCHAR const ips32_keyname[15] = {
- 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r',
- '3', '2', 0 };
-static WCHAR const progid_keyname[7] = {
- 'P', 'r', 'o', 'g', 'I', 'D', 0 };
-static WCHAR const viprogid_keyname[25] = {
- 'V', 'e', 'r', 's', 'i', 'o', 'n', 'I', 'n', 'd', 'e', 'p',
- 'e', 'n', 'd', 'e', 'n', 't', 'P', 'r', 'o', 'g', 'I', 'D',
- 0 };
-static char const tmodel_valuename[] = "ThreadingModel";
-
-/***********************************************************************
- * static helper functions
- */
-static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid);
-static LONG register_key_defvalueW(HKEY base, WCHAR const *name,
- WCHAR const *value);
-static LONG register_key_defvalueA(HKEY base, WCHAR const *name,
- char const *value);
-static LONG register_progid(WCHAR const *clsid,
- char const *progid, char const *curver_progid,
- char const *name, char const *extra);
-
-/***********************************************************************
- * register_interfaces
- */
-static HRESULT register_interfaces(struct regsvr_interface const *list)
-{
- LONG res = ERROR_SUCCESS;
- HKEY interface_key;
-
- res = RegCreateKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, NULL, 0,
- KEY_READ | KEY_WRITE, NULL, &interface_key, NULL);
- if (res != ERROR_SUCCESS) goto error_return;
-
- for (; res == ERROR_SUCCESS && list->iid; ++list) {
- WCHAR buf[39];
- HKEY iid_key;
-
- StringFromGUID2(list->iid, buf, 39);
- res = RegCreateKeyExW(interface_key, buf, 0, NULL, 0,
- KEY_READ | KEY_WRITE, NULL, &iid_key, NULL);
- if (res != ERROR_SUCCESS) goto error_close_interface_key;
-
- if (list->name) {
- res = RegSetValueExA(iid_key, NULL, 0, REG_SZ,
- (CONST BYTE*)(list->name),
- strlen(list->name) + 1);
- if (res != ERROR_SUCCESS) goto error_close_iid_key;
- }
-
- if (list->base_iid) {
- res = register_key_guid(iid_key, base_ifa_keyname, list->base_iid);
- if (res != ERROR_SUCCESS) goto error_close_iid_key;
- }
-
- if (0 <= list->num_methods) {
- static WCHAR const fmt[3] = { '%', 'd', 0 };
- HKEY key;
-
- res = RegCreateKeyExW(iid_key, num_methods_keyname, 0, NULL, 0,
- KEY_READ | KEY_WRITE, NULL, &key, NULL);
- if (res != ERROR_SUCCESS) goto error_close_iid_key;
-
- sprintfW(buf, fmt, list->num_methods);
- res = RegSetValueExW(key, NULL, 0, REG_SZ,
- (CONST BYTE*)buf,
- (lstrlenW(buf) + 1) * sizeof(WCHAR));
- RegCloseKey(key);
-
- if (res != ERROR_SUCCESS) goto error_close_iid_key;
- }
-
- if (list->ps_clsid) {
- res = register_key_guid(iid_key, ps_clsid_keyname, list->ps_clsid);
- if (res != ERROR_SUCCESS) goto error_close_iid_key;
- }
-
- if (list->ps_clsid32) {
- res = register_key_guid(iid_key, ps_clsid32_keyname, list->ps_clsid32);
- if (res != ERROR_SUCCESS) goto error_close_iid_key;
- }
-
- error_close_iid_key:
- RegCloseKey(iid_key);
- }
-
-error_close_interface_key:
- RegCloseKey(interface_key);
-error_return:
- return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
-}
-
-/***********************************************************************
- * unregister_interfaces
- */
-static HRESULT unregister_interfaces(struct regsvr_interface const *list)
-{
- LONG res = ERROR_SUCCESS;
- HKEY interface_key;
-
- res = RegOpenKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0,
- KEY_READ | KEY_WRITE, &interface_key);
- if (res == ERROR_FILE_NOT_FOUND) return S_OK;
- if (res != ERROR_SUCCESS) goto error_return;
-
- for (; res == ERROR_SUCCESS && list->iid; ++list) {
- WCHAR buf[39];
-
- StringFromGUID2(list->iid, buf, 39);
- res = pRegDeleteTreeW(interface_key, buf);
- if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
- }
-
- RegCloseKey(interface_key);
-error_return:
- return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
-}
-
-/***********************************************************************
- * register_coclasses
- */
-static HRESULT register_coclasses(struct regsvr_coclass const *list)
-{
- LONG res = ERROR_SUCCESS;
- HKEY coclass_key;
-
- res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0,
- KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL);
- if (res != ERROR_SUCCESS) goto error_return;
-
- for (; res == ERROR_SUCCESS && list->clsid; ++list) {
- WCHAR buf[39];
- HKEY clsid_key;
-
- StringFromGUID2(list->clsid, buf, 39);
- res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0,
- KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL);
- if (res != ERROR_SUCCESS) goto error_close_coclass_key;
-
- if (list->name) {
- res = RegSetValueExA(clsid_key, NULL, 0, REG_SZ,
- (CONST BYTE*)(list->name),
- strlen(list->name) + 1);
- if (res != ERROR_SUCCESS) goto error_close_clsid_key;
- }
-
- if (list->ips) {
- res = register_key_defvalueA(clsid_key, ips_keyname, list->ips);
- if (res != ERROR_SUCCESS) goto error_close_clsid_key;
- }
-
- if (list->ips32) {
- HKEY ips32_key;
-
- res = RegCreateKeyExW(clsid_key, ips32_keyname, 0, NULL, 0,
- KEY_READ | KEY_WRITE, NULL,
- &ips32_key, NULL);
- if (res != ERROR_SUCCESS) goto error_close_clsid_key;
-
- res = RegSetValueExA(ips32_key, NULL, 0, REG_SZ,
- (CONST BYTE*)list->ips32,
- lstrlenA(list->ips32) + 1);
- if (res == ERROR_SUCCESS && list->ips32_tmodel)
- res = RegSetValueExA(ips32_key, tmodel_valuename, 0, REG_SZ,
- (CONST BYTE*)list->ips32_tmodel,
- strlen(list->ips32_tmodel) + 1);
- RegCloseKey(ips32_key);
- if (res != ERROR_SUCCESS) goto error_close_clsid_key;
- }
-
- if (list->progid) {
- res = register_key_defvalueA(clsid_key, progid_keyname,
- list->progid);
- if (res != ERROR_SUCCESS) goto error_close_clsid_key;
-
- res = register_progid(buf, list->progid, NULL,
- list->name, list->progid_extra);
- if (res != ERROR_SUCCESS) goto error_close_clsid_key;
- }
-
- if (list->viprogid) {
- res = register_key_defvalueA(clsid_key, viprogid_keyname,
- list->viprogid);
- if (res != ERROR_SUCCESS) goto error_close_clsid_key;
-
- res = register_progid(buf, list->viprogid, list->progid,
- list->name, list->progid_extra);
- if (res != ERROR_SUCCESS) goto error_close_clsid_key;
- }
-
- error_close_clsid_key:
- RegCloseKey(clsid_key);
- }
-
-error_close_coclass_key:
- RegCloseKey(coclass_key);
-error_return:
- return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
-}
-
-/***********************************************************************
- * unregister_coclasses
- */
-static HRESULT unregister_coclasses(struct regsvr_coclass const *list)
-{
- LONG res = ERROR_SUCCESS;
- HKEY coclass_key;
-
- res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0,
- KEY_READ | KEY_WRITE, &coclass_key);
- if (res == ERROR_FILE_NOT_FOUND) return S_OK;
- if (res != ERROR_SUCCESS) goto error_return;
-
- for (; res == ERROR_SUCCESS && list->clsid; ++list) {
- WCHAR buf[39];
-
- StringFromGUID2(list->clsid, buf, 39);
- res = pRegDeleteTreeW(coclass_key, buf);
- if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
- if (res != ERROR_SUCCESS) goto error_close_coclass_key;
-
- if (list->progid) {
- res = pRegDeleteTreeA(HKEY_CLASSES_ROOT, list->progid);
- if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
- if (res != ERROR_SUCCESS) goto error_close_coclass_key;
- }
-
- if (list->viprogid) {
- res = pRegDeleteTreeA(HKEY_CLASSES_ROOT, list->viprogid);
- if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS;
- if (res != ERROR_SUCCESS) goto error_close_coclass_key;
- }
- }
-
-error_close_coclass_key:
- RegCloseKey(coclass_key);
-error_return:
- return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK;
-}
-
-/***********************************************************************
- * regsvr_key_guid
- */
-static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid)
-{
- WCHAR buf[39];
-
- StringFromGUID2(guid, buf, 39);
- return register_key_defvalueW(base, name, buf);
-}
-
-/***********************************************************************
- * regsvr_key_defvalueW
- */
-static LONG register_key_defvalueW(
- HKEY base,
- WCHAR const *name,
- WCHAR const *value)
-{
- LONG res;
- HKEY key;
-
- res = RegCreateKeyExW(base, name, 0, NULL, 0,
- KEY_READ | KEY_WRITE, NULL, &key, NULL);
- if (res != ERROR_SUCCESS) return res;
- res = RegSetValueExW(key, NULL, 0, REG_SZ, (CONST BYTE*)value,
- (lstrlenW(value) + 1) * sizeof(WCHAR));
- RegCloseKey(key);
- return res;
-}
-
-/***********************************************************************
- * regsvr_key_defvalueA
- */
-static LONG register_key_defvalueA(
- HKEY base,
- WCHAR const *name,
- char const *value)
-{
- LONG res;
- HKEY key;
-
- res = RegCreateKeyExW(base, name, 0, NULL, 0,
- KEY_READ | KEY_WRITE, NULL, &key, NULL);
- if (res != ERROR_SUCCESS) return res;
- res = RegSetValueExA(key, NULL, 0, REG_SZ, (CONST BYTE*)value,
- lstrlenA(value) + 1);
- RegCloseKey(key);
- return res;
-}
-
-/***********************************************************************
- * regsvr_progid
- */
-static LONG register_progid(
- WCHAR const *clsid,
- char const *progid,
- char const *curver_progid,
- char const *name,
- char const *extra)
-{
- LONG res;
- HKEY progid_key;
-
- res = RegCreateKeyExA(HKEY_CLASSES_ROOT, progid, 0,
- NULL, 0, KEY_READ | KEY_WRITE, NULL,
- &progid_key, NULL);
- if (res != ERROR_SUCCESS) return res;
-
- if (name) {
- res = RegSetValueExA(progid_key, NULL, 0, REG_SZ,
- (CONST BYTE*)name, strlen(name) + 1);
- if (res != ERROR_SUCCESS) goto error_close_progid_key;
- }
-
- if (clsid) {
- res = register_key_defvalueW(progid_key, clsid_keyname, clsid);
- if (res != ERROR_SUCCESS) goto error_close_progid_key;
- }
-
- if (curver_progid) {
- res = register_key_defvalueA(progid_key, curver_keyname,
- curver_progid);
- if (res != ERROR_SUCCESS) goto error_close_progid_key;
- }
-
- if (extra) {
- HKEY extra_key;
-
- res = RegCreateKeyExA(progid_key, extra, 0,
- NULL, 0, KEY_READ | KEY_WRITE, NULL,
- &extra_key, NULL);
- if (res == ERROR_SUCCESS)
- RegCloseKey(extra_key);
- }
-
-error_close_progid_key:
- RegCloseKey(progid_key);
- return res;
-}
-
-/***********************************************************************
- * coclass list
- */
-static GUID const CLSID_DirectSoundBufferConfig = {
- 0xB2F586D4, 0x5558, 0x49D1, {0xA0,0x7B,0x32,0x49,0xDB,0xBB,0x33,0xC2} };
-
-static struct regsvr_coclass const coclass_list[] = {
- { &CLSID_DirectSound,
- "DirectSound Object",
- NULL,
- "dsound.dll",
- "Both"
- },
- { &CLSID_DirectSound8,
- "DirectSound 8.0 Object",
- NULL,
- "dsound.dll",
- "Both"
- },
- { &CLSID_DirectSoundBufferConfig,
- "DirectSoundBufferConfig Object",
- NULL,
- "dsound.dll",
- "Both"
- },
- { &CLSID_DirectSoundCapture,
- "DirectSoundCapture Object",
- NULL,
- "dsound.dll",
- "Both"
- },
- { &CLSID_DirectSoundCapture8,
- "DirectSoundCapture 8.0 Object",
- NULL,
- "dsound.dll",
- "Both"
- },
- { &CLSID_DirectSoundFullDuplex,
- "DirectSoundFullDuplex Object",
- NULL,
- "dsound.dll",
- "Both"
- },
- { NULL } /* list terminator */
-};
-
-/***********************************************************************
- * interface list
- */
-
-static struct regsvr_interface const interface_list[] = {
- { NULL } /* list terminator */
-};
-
-/***********************************************************************
- * DllRegisterServer (DSOUND.@)
- */
-HRESULT WINAPI DllRegisterServer(void)
-{
- HRESULT hr;
-
- TRACE("\n");
-
- hr = register_coclasses(coclass_list);
- if (SUCCEEDED(hr))
- hr = register_interfaces(interface_list);
- return hr;
-}
-
-/***********************************************************************
- * DllUnregisterServer (DSOUND.@)
- */
-HRESULT WINAPI DllUnregisterServer(void)
-{
- HRESULT hr;
-
- HMODULE advapi32 = GetModuleHandleA("advapi32");
- if (!advapi32) return E_FAIL;
- pRegDeleteTreeA = (void *) GetProcAddress(advapi32, "RegDeleteTreeA");
- pRegDeleteTreeW = (void *) GetProcAddress(advapi32, "RegDeleteTreeW");
- if (!pRegDeleteTreeA || !pRegDeleteTreeW) return E_FAIL;
-
- TRACE("\n");
-
- hr = unregister_coclasses(coclass_list);
- if (SUCCEEDED(hr))
- hr = unregister_interfaces(interface_list);
- return hr;
-}
+++ /dev/null
-/* DirectSound
- *
- * Copyright 1998 Marcus Meissner
- * Copyright 1998 Rob Riggs
- * Copyright 2000-2001 TransGaming Technologies, Inc.
- * Copyright 2002-2003 Rok Mandeljc <rok.mandeljc@gimb.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-/*
- * Most thread locking is complete. There may be a few race
- * conditions still lurking.
- *
- * Tested with a Soundblaster clone, a Gravis UltraSound Classic,
- * and a Turtle Beach Tropez+.
- *
- * TODO:
- * Implement SetCooperativeLevel properly (need to address focus issues)
- * Implement DirectSound3DBuffers (stubs in place)
- * Use hardware 3D support if available
- * Add critical section locking inside Release and AddRef methods
- * Handle static buffers - put those in hardware, non-static not in hardware
- * Hardware DuplicateSoundBuffer
- * Proper volume calculation, and setting volume in HEL primary buffer
- * Optimize WINMM and negotiate fragment size, decrease DS_HEL_MARGIN
- */
-
-#include <stdarg.h>
-#include <math.h> /* Insomnia - pow() function */
-
-#define NONAMELESSUNION
-#define NONAMELESSSTRUCT
-#include "windef.h"
-#include "winbase.h"
-#include "winuser.h"
-#include "mmsystem.h"
-#include "winternl.h"
-#include "mmddk.h"
-#include "wine/debug.h"
-#include "dsound.h"
-#include "dsdriver.h"
-#include "dsound_private.h"
-
-/* default velocity of sound in the air */
-#define DEFAULT_VELOCITY 340
-
-WINE_DEFAULT_DEBUG_CHANNEL(dsound3d);
-
-/*******************************************************************************
- * Auxiliary functions
- */
-
-/* scalar product (i believe it's called dot product in english) */
-static inline D3DVALUE ScalarProduct (const D3DVECTOR *a, const D3DVECTOR *b)
-{
- D3DVALUE c;
- c = (a->x*b->x) + (a->y*b->y) + (a->z*b->z);
- TRACE("(%f,%f,%f) * (%f,%f,%f) = %f)\n", a->x, a->y, a->z, b->x, b->y,
- b->z, c);
- return c;
-}
-
-/* vector product (i believe it's called cross product in english */
-static inline D3DVECTOR VectorProduct (const D3DVECTOR *a, const D3DVECTOR *b)
-{
- D3DVECTOR c;
- c.x = (a->y*b->z) - (a->z*b->y);
- c.y = (a->z*b->x) - (a->x*b->z);
- c.z = (a->x*b->y) - (a->y*b->x);
- TRACE("(%f,%f,%f) x (%f,%f,%f) = (%f,%f,%f)\n", a->x, a->y, a->z, b->x, b->y,
- b->z, c.x, c.y, c.z);
- return c;
-}
-
-/* magnitude (length) of vector */
-static inline D3DVALUE VectorMagnitude (const D3DVECTOR *a)
-{
- D3DVALUE l;
- l = sqrt (ScalarProduct (a, a));
- TRACE("|(%f,%f,%f)| = %f\n", a->x, a->y, a->z, l);
- return l;
-}
-
-/* conversion between radians and degrees */
-static inline D3DVALUE RadToDeg (D3DVALUE angle)
-{
- D3DVALUE newangle;
- newangle = angle * (360/(2*M_PI));
- TRACE("%f rad = %f deg\n", angle, newangle);
- return newangle;
-}
-
-/* angle between vectors - rad version */
-static inline D3DVALUE AngleBetweenVectorsRad (const D3DVECTOR *a, const D3DVECTOR *b)
-{
- D3DVALUE la, lb, product, angle, cos;
- /* definition of scalar product: a*b = |a|*|b|*cos... therefore: */
- product = ScalarProduct (a,b);
- la = VectorMagnitude (a);
- lb = VectorMagnitude (b);
- if (!la || !lb)
- return 0;
-
- cos = product/(la*lb);
- angle = acos(cos);
- TRACE("angle between (%f,%f,%f) and (%f,%f,%f) = %f radians (%f degrees)\n", a->x, a->y, a->z, b->x,
- b->y, b->z, angle, RadToDeg(angle));
- return angle;
-}
-
-static inline D3DVALUE AngleBetweenVectorsDeg (const D3DVECTOR *a, const D3DVECTOR *b)
-{
- return RadToDeg(AngleBetweenVectorsRad(a, b));
-}
-
-/* calculates vector between two points */
-static inline D3DVECTOR VectorBetweenTwoPoints (const D3DVECTOR *a, const D3DVECTOR *b)
-{
- D3DVECTOR c;
- c.x = b->x - a->x;
- c.y = b->y - a->y;
- c.z = b->z - a->z;
- TRACE("A (%f,%f,%f), B (%f,%f,%f), AB = (%f,%f,%f)\n", a->x, a->y, a->z, b->x, b->y,
- b->z, c.x, c.y, c.z);
- return c;
-}
-
-/* calculates the length of vector's projection on another vector */
-static inline D3DVALUE ProjectVector (const D3DVECTOR *a, const D3DVECTOR *p)
-{
- D3DVALUE prod, result;
- prod = ScalarProduct(a, p);
- result = prod/VectorMagnitude(p);
- TRACE("length projection of (%f,%f,%f) on (%f,%f,%f) = %f\n", a->x, a->y, a->z, p->x,
- p->y, p->z, result);
- return result;
-}
-
-/*******************************************************************************
- * 3D Buffer and Listener mixing
- */
-
-void DSOUND_Calc3DBuffer(IDirectSoundBufferImpl *dsb)
-{
- /* volume, at which the sound will be played after all calcs. */
- D3DVALUE lVolume = 0;
- /* stuff for distance related stuff calc. */
- D3DVECTOR vDistance;
- D3DVALUE flDistance = 0;
- /* panning related stuff */
- D3DVALUE flAngle;
- D3DVECTOR vLeft;
- /* doppler shift related stuff */
-#if 0
- D3DVALUE flFreq, flBufferVel, flListenerVel;
-#endif
-
- TRACE("(%p)\n",dsb);
-
- /* initial buffer volume */
- lVolume = dsb->ds3db_lVolume;
-
- switch (dsb->ds3db_ds3db.dwMode)
- {
- case DS3DMODE_DISABLE:
- TRACE("3D processing disabled\n");
- /* this one is here only to eliminate annoying warning message */
- DSOUND_RecalcVolPan (&dsb->volpan);
- break;
- case DS3DMODE_NORMAL:
- TRACE("Normal 3D processing mode\n");
- /* we need to calculate distance between buffer and listener*/
- vDistance = VectorBetweenTwoPoints(&dsb->ds3db_ds3db.vPosition, &dsb->device->ds3dl.vPosition);
- flDistance = VectorMagnitude (&vDistance);
- break;
- case DS3DMODE_HEADRELATIVE:
- TRACE("Head-relative 3D processing mode\n");
- /* distance between buffer and listener is same as buffer's position */
- flDistance = VectorMagnitude (&dsb->ds3db_ds3db.vPosition);
- break;
- }
-
- if (flDistance > dsb->ds3db_ds3db.flMaxDistance)
- {
- /* some apps don't want you to hear too distant sounds... */
- if (dsb->dsbd.dwFlags & DSBCAPS_MUTE3DATMAXDISTANCE)
- {
- dsb->volpan.lVolume = DSBVOLUME_MIN;
- DSOUND_RecalcVolPan (&dsb->volpan);
- /* i guess mixing here would be a waste of power */
- return;
- }
- else
- flDistance = dsb->ds3db_ds3db.flMaxDistance;
- }
-
- if (flDistance < dsb->ds3db_ds3db.flMinDistance)
- flDistance = dsb->ds3db_ds3db.flMinDistance;
-
- /* attenuation proportional to the distance squared, converted to millibels as in lVolume*/
- lVolume -= log10(flDistance/dsb->ds3db_ds3db.flMinDistance * flDistance/dsb->ds3db_ds3db.flMinDistance)*1000;
- TRACE("dist. att: Distance = %f, MinDistance = %f => adjusting volume %d to %f\n", flDistance, dsb->ds3db_ds3db.flMinDistance, dsb->ds3db_lVolume, lVolume);
-
- /* conning */
- /* sometimes it happens that vConeOrientation vector = (0,0,0); in this case angle is "nan" and it's useless*/
- if (dsb->ds3db_ds3db.vConeOrientation.x == 0 && dsb->ds3db_ds3db.vConeOrientation.y == 0 && dsb->ds3db_ds3db.vConeOrientation.z == 0)
- {
- TRACE("conning: cones not set\n");
- }
- else
- {
- /* calculate angle */
- flAngle = AngleBetweenVectorsDeg(&dsb->ds3db_ds3db.vConeOrientation, &vDistance);
- /* if by any chance it happens that OutsideConeAngle = InsideConeAngle (that means that conning has no effect) */
- if (dsb->ds3db_ds3db.dwInsideConeAngle != dsb->ds3db_ds3db.dwOutsideConeAngle)
- {
- /* my test show that for my way of calc., we need only half of angles */
- DWORD dwInsideConeAngle = dsb->ds3db_ds3db.dwInsideConeAngle/2;
- DWORD dwOutsideConeAngle = dsb->ds3db_ds3db.dwOutsideConeAngle/2;
- if (dwOutsideConeAngle == dwInsideConeAngle)
- ++dwOutsideConeAngle;
-
- /* full volume */
- if (flAngle < dwInsideConeAngle)
- flAngle = dwInsideConeAngle;
- /* min (app defined) volume */
- if (flAngle > dwOutsideConeAngle)
- flAngle = dwOutsideConeAngle;
- /* this probably isn't the right thing, but it's ok for the time being */
- lVolume += ((dsb->ds3db_ds3db.lConeOutsideVolume)/((dwOutsideConeAngle) - (dwInsideConeAngle))) * flAngle;
- }
- TRACE("conning: Angle = %f deg; InsideConeAngle(/2) = %d deg; OutsideConeAngle(/2) = %d deg; ConeOutsideVolume = %d => adjusting volume to %f\n",
- flAngle, dsb->ds3db_ds3db.dwInsideConeAngle/2, dsb->ds3db_ds3db.dwOutsideConeAngle/2, dsb->ds3db_ds3db.lConeOutsideVolume, lVolume);
- }
- dsb->volpan.lVolume = lVolume;
-
- /* panning */
- if (dsb->device->ds3dl.vPosition.x == dsb->ds3db_ds3db.vPosition.x &&
- dsb->device->ds3dl.vPosition.y == dsb->ds3db_ds3db.vPosition.y &&
- dsb->device->ds3dl.vPosition.z == dsb->ds3db_ds3db.vPosition.z) {
- dsb->volpan.lPan = 0;
- flAngle = 0.0;
- }
- else
- {
- vDistance = VectorBetweenTwoPoints(&dsb->device->ds3dl.vPosition, &dsb->ds3db_ds3db.vPosition);
- vLeft = VectorProduct(&dsb->device->ds3dl.vOrientFront, &dsb->device->ds3dl.vOrientTop);
- flAngle = AngleBetweenVectorsRad(&vLeft, &vDistance);
- /* for now, we'll use "linear formula" (which is probably incorrect); if someone has it in book, correct it */
- dsb->volpan.lPan = 10000*2*flAngle/M_PI - 10000;
- }
- TRACE("panning: Angle = %f rad, lPan = %d\n", flAngle, dsb->volpan.lPan);
-
- /* FIXME: Doppler Effect disabled since i have no idea which frequency to change and how to do it */
-#if 0
- /* doppler shift*/
- if ((VectorMagnitude(&ds3db_ds3db.vVelocity) == 0) && (VectorMagnitude(&dsb->device->ds3dl.vVelocity) == 0))
- {
- TRACE("doppler: Buffer and Listener don't have velocities\n");
- }
- else if (ds3db_ds3db.vVelocity != dsb->device->ds3dl.vVelocity)
- {
- /* calculate length of ds3db_ds3db.vVelocity component which causes Doppler Effect
- NOTE: if buffer moves TOWARDS the listener, it's velocity component is NEGATIVE
- if buffer moves AWAY from listener, it's velocity component is POSITIVE */
- flBufferVel = ProjectVector(&dsb->ds3db_ds3db.vVelocity, &vDistance);
- /* calculate length of ds3dl.vVelocity component which causes Doppler Effect
- NOTE: if listener moves TOWARDS the buffer, it's velocity component is POSITIVE
- if listener moves AWAY from buffer, it's velocity component is NEGATIVE */
- flListenerVel = ProjectVector(&dsb->device->ds3dl.vVelocity, &vDistance);
- /* formula taken from Gianicoli D.: Physics, 4th edition: */
- /* FIXME: replace dsb->freq with appropriate frequency ! */
- flFreq = dsb->freq * ((DEFAULT_VELOCITY + flListenerVel)/(DEFAULT_VELOCITY + flBufferVel));
- TRACE("doppler: Buffer velocity (component) = %lf, Listener velocity (component) = %lf => Doppler shift: %ld Hz -> %lf Hz\n", flBufferVel, flListenerVel,
- dsb->freq, flFreq);
- /* FIXME: replace following line with correct frequency setting ! */
- dsb->freq = flFreq;
- DSOUND_RecalcFormat(dsb);
- DSOUND_MixToTemporary(dsb, 0, dsb->buflen);
- }
-#endif
-
- /* time for remix */
- DSOUND_RecalcVolPan(&dsb->volpan);
-}
-
-static void DSOUND_Mix3DBuffer(IDirectSoundBufferImpl *dsb)
-{
- TRACE("(%p)\n",dsb);
-
- DSOUND_Calc3DBuffer(dsb);
-}
-
-static void DSOUND_ChangeListener(IDirectSound3DListenerImpl *ds3dl)
-{
- int i;
- TRACE("(%p)\n",ds3dl);
- for (i = 0; i < ds3dl->device->nrofbuffers; i++)
- {
- /* check if this buffer is waiting for recalculation */
- if (ds3dl->device->buffers[i]->ds3db_need_recalc)
- {
- DSOUND_Mix3DBuffer(ds3dl->device->buffers[i]);
- }
- }
-}
-
-/*******************************************************************************
- * IDirectSound3DBuffer
- */
-
-/* IUnknown methods */
-static HRESULT WINAPI IDirectSound3DBufferImpl_QueryInterface(
- LPDIRECTSOUND3DBUFFER iface, REFIID riid, LPVOID *ppobj)
-{
- IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface;
-
- TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
- return IDirectSoundBuffer_QueryInterface((LPDIRECTSOUNDBUFFER8)This->dsb, riid, ppobj);
-}
-
-static ULONG WINAPI IDirectSound3DBufferImpl_AddRef(LPDIRECTSOUND3DBUFFER iface)
-{
- IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
-}
-
-static ULONG WINAPI IDirectSound3DBufferImpl_Release(LPDIRECTSOUND3DBUFFER iface)
-{
- IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref + 1);
-
- if (!ref) {
- This->dsb->ds3db = NULL;
- IDirectSoundBuffer_Release((LPDIRECTSOUNDBUFFER8)This->dsb);
- HeapFree(GetProcessHeap(), 0, This);
- TRACE("(%p) released\n", This);
- }
- return ref;
-}
-
-/* IDirectSound3DBuffer methods */
-static HRESULT WINAPI IDirectSound3DBufferImpl_GetAllParameters(
- LPDIRECTSOUND3DBUFFER iface,
- LPDS3DBUFFER lpDs3dBuffer)
-{
- IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface;
- TRACE("(%p,%p)\n",This,lpDs3dBuffer);
-
- if (lpDs3dBuffer == NULL) {
- WARN("invalid parameter: lpDs3dBuffer == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (lpDs3dBuffer->dwSize < sizeof(*lpDs3dBuffer)) {
- WARN("invalid parameter: lpDs3dBuffer->dwSize = %d\n",lpDs3dBuffer->dwSize);
- return DSERR_INVALIDPARAM;
- }
-
- TRACE("returning: all parameters\n");
- *lpDs3dBuffer = This->dsb->ds3db_ds3db;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DBufferImpl_GetConeAngles(
- LPDIRECTSOUND3DBUFFER iface,
- LPDWORD lpdwInsideConeAngle,
- LPDWORD lpdwOutsideConeAngle)
-{
- IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface;
- TRACE("returning: Inside Cone Angle = %d degrees; Outside Cone Angle = %d degrees\n",
- This->dsb->ds3db_ds3db.dwInsideConeAngle, This->dsb->ds3db_ds3db.dwOutsideConeAngle);
- *lpdwInsideConeAngle = This->dsb->ds3db_ds3db.dwInsideConeAngle;
- *lpdwOutsideConeAngle = This->dsb->ds3db_ds3db.dwOutsideConeAngle;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DBufferImpl_GetConeOrientation(
- LPDIRECTSOUND3DBUFFER iface,
- LPD3DVECTOR lpvConeOrientation)
-{
- IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface;
- TRACE("returning: Cone Orientation vector = (%f,%f,%f)\n",
- This->dsb->ds3db_ds3db.vConeOrientation.x,
- This->dsb->ds3db_ds3db.vConeOrientation.y,
- This->dsb->ds3db_ds3db.vConeOrientation.z);
- *lpvConeOrientation = This->dsb->ds3db_ds3db.vConeOrientation;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DBufferImpl_GetConeOutsideVolume(
- LPDIRECTSOUND3DBUFFER iface,
- LPLONG lplConeOutsideVolume)
-{
- IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface;
- TRACE("returning: Cone Outside Volume = %d\n", This->dsb->ds3db_ds3db.lConeOutsideVolume);
- *lplConeOutsideVolume = This->dsb->ds3db_ds3db.lConeOutsideVolume;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DBufferImpl_GetMaxDistance(
- LPDIRECTSOUND3DBUFFER iface,
- LPD3DVALUE lpfMaxDistance)
-{
- IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface;
- TRACE("returning: Max Distance = %f\n", This->dsb->ds3db_ds3db.flMaxDistance);
- *lpfMaxDistance = This->dsb->ds3db_ds3db.flMaxDistance;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DBufferImpl_GetMinDistance(
- LPDIRECTSOUND3DBUFFER iface,
- LPD3DVALUE lpfMinDistance)
-{
- IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface;
- TRACE("returning: Min Distance = %f\n", This->dsb->ds3db_ds3db.flMinDistance);
- *lpfMinDistance = This->dsb->ds3db_ds3db.flMinDistance;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DBufferImpl_GetMode(
- LPDIRECTSOUND3DBUFFER iface,
- LPDWORD lpdwMode)
-{
- IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface;
- TRACE("returning: Mode = %d\n", This->dsb->ds3db_ds3db.dwMode);
- *lpdwMode = This->dsb->ds3db_ds3db.dwMode;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DBufferImpl_GetPosition(
- LPDIRECTSOUND3DBUFFER iface,
- LPD3DVECTOR lpvPosition)
-{
- IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface;
- TRACE("returning: Position vector = (%f,%f,%f)\n",
- This->dsb->ds3db_ds3db.vPosition.x,
- This->dsb->ds3db_ds3db.vPosition.y,
- This->dsb->ds3db_ds3db.vPosition.z);
- *lpvPosition = This->dsb->ds3db_ds3db.vPosition;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DBufferImpl_GetVelocity(
- LPDIRECTSOUND3DBUFFER iface,
- LPD3DVECTOR lpvVelocity)
-{
- IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface;
- TRACE("returning: Velocity vector = (%f,%f,%f)\n",
- This->dsb->ds3db_ds3db.vVelocity.x,
- This->dsb->ds3db_ds3db.vVelocity.y,
- This->dsb->ds3db_ds3db.vVelocity.z);
- *lpvVelocity = This->dsb->ds3db_ds3db.vVelocity;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DBufferImpl_SetAllParameters(
- LPDIRECTSOUND3DBUFFER iface,
- LPCDS3DBUFFER lpcDs3dBuffer,
- DWORD dwApply)
-{
- IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface;
- DWORD status = DSERR_INVALIDPARAM;
- TRACE("(%p,%p,%x)\n",iface,lpcDs3dBuffer,dwApply);
-
- if (lpcDs3dBuffer == NULL) {
- WARN("invalid parameter: lpcDs3dBuffer == NULL\n");
- return status;
- }
-
- if (lpcDs3dBuffer->dwSize != sizeof(DS3DBUFFER)) {
- WARN("invalid parameter: lpcDs3dBuffer->dwSize = %d\n", lpcDs3dBuffer->dwSize);
- return status;
- }
-
- TRACE("setting: all parameters; dwApply = %d\n", dwApply);
- This->dsb->ds3db_ds3db = *lpcDs3dBuffer;
-
- if (dwApply == DS3D_IMMEDIATE)
- {
- DSOUND_Mix3DBuffer(This->dsb);
- }
- This->dsb->ds3db_need_recalc = TRUE;
- status = DS_OK;
-
- return status;
-}
-
-static HRESULT WINAPI IDirectSound3DBufferImpl_SetConeAngles(
- LPDIRECTSOUND3DBUFFER iface,
- DWORD dwInsideConeAngle,
- DWORD dwOutsideConeAngle,
- DWORD dwApply)
-{
- IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface;
- TRACE("setting: Inside Cone Angle = %d; Outside Cone Angle = %d; dwApply = %d\n",
- dwInsideConeAngle, dwOutsideConeAngle, dwApply);
- This->dsb->ds3db_ds3db.dwInsideConeAngle = dwInsideConeAngle;
- This->dsb->ds3db_ds3db.dwOutsideConeAngle = dwOutsideConeAngle;
- if (dwApply == DS3D_IMMEDIATE)
- {
- DSOUND_Mix3DBuffer(This->dsb);
- }
- This->dsb->ds3db_need_recalc = TRUE;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DBufferImpl_SetConeOrientation(
- LPDIRECTSOUND3DBUFFER iface,
- D3DVALUE x, D3DVALUE y, D3DVALUE z,
- DWORD dwApply)
-{
- IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface;
- TRACE("setting: Cone Orientation vector = (%f,%f,%f); dwApply = %d\n", x, y, z, dwApply);
- This->dsb->ds3db_ds3db.vConeOrientation.x = x;
- This->dsb->ds3db_ds3db.vConeOrientation.y = y;
- This->dsb->ds3db_ds3db.vConeOrientation.z = z;
- if (dwApply == DS3D_IMMEDIATE)
- {
- This->dsb->ds3db_need_recalc = FALSE;
- DSOUND_Mix3DBuffer(This->dsb);
- }
- This->dsb->ds3db_need_recalc = TRUE;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DBufferImpl_SetConeOutsideVolume(
- LPDIRECTSOUND3DBUFFER iface,
- LONG lConeOutsideVolume,
- DWORD dwApply)
-{
- IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface;
- TRACE("setting: ConeOutsideVolume = %d; dwApply = %d\n", lConeOutsideVolume, dwApply);
- This->dsb->ds3db_ds3db.lConeOutsideVolume = lConeOutsideVolume;
- if (dwApply == DS3D_IMMEDIATE)
- {
- This->dsb->ds3db_need_recalc = FALSE;
- DSOUND_Mix3DBuffer(This->dsb);
- }
- This->dsb->ds3db_need_recalc = TRUE;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DBufferImpl_SetMaxDistance(
- LPDIRECTSOUND3DBUFFER iface,
- D3DVALUE fMaxDistance,
- DWORD dwApply)
-{
- IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface;
- TRACE("setting: MaxDistance = %f; dwApply = %d\n", fMaxDistance, dwApply);
- This->dsb->ds3db_ds3db.flMaxDistance = fMaxDistance;
- if (dwApply == DS3D_IMMEDIATE)
- {
- This->dsb->ds3db_need_recalc = FALSE;
- DSOUND_Mix3DBuffer(This->dsb);
- }
- This->dsb->ds3db_need_recalc = TRUE;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DBufferImpl_SetMinDistance(
- LPDIRECTSOUND3DBUFFER iface,
- D3DVALUE fMinDistance,
- DWORD dwApply)
-{
- IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface;
- TRACE("setting: MinDistance = %f; dwApply = %d\n", fMinDistance, dwApply);
- This->dsb->ds3db_ds3db.flMinDistance = fMinDistance;
- if (dwApply == DS3D_IMMEDIATE)
- {
- This->dsb->ds3db_need_recalc = FALSE;
- DSOUND_Mix3DBuffer(This->dsb);
- }
- This->dsb->ds3db_need_recalc = TRUE;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DBufferImpl_SetMode(
- LPDIRECTSOUND3DBUFFER iface,
- DWORD dwMode,
- DWORD dwApply)
-{
- IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface;
- TRACE("setting: Mode = %d; dwApply = %d\n", dwMode, dwApply);
- This->dsb->ds3db_ds3db.dwMode = dwMode;
- if (dwApply == DS3D_IMMEDIATE)
- {
- This->dsb->ds3db_need_recalc = FALSE;
- DSOUND_Mix3DBuffer(This->dsb);
- }
- This->dsb->ds3db_need_recalc = TRUE;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DBufferImpl_SetPosition(
- LPDIRECTSOUND3DBUFFER iface,
- D3DVALUE x, D3DVALUE y, D3DVALUE z,
- DWORD dwApply)
-{
- IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface;
- TRACE("setting: Position vector = (%f,%f,%f); dwApply = %d\n", x, y, z, dwApply);
- This->dsb->ds3db_ds3db.vPosition.x = x;
- This->dsb->ds3db_ds3db.vPosition.y = y;
- This->dsb->ds3db_ds3db.vPosition.z = z;
- if (dwApply == DS3D_IMMEDIATE)
- {
- This->dsb->ds3db_need_recalc = FALSE;
- DSOUND_Mix3DBuffer(This->dsb);
- }
- This->dsb->ds3db_need_recalc = TRUE;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DBufferImpl_SetVelocity(
- LPDIRECTSOUND3DBUFFER iface,
- D3DVALUE x, D3DVALUE y, D3DVALUE z,
- DWORD dwApply)
-{
- IDirectSound3DBufferImpl *This = (IDirectSound3DBufferImpl *)iface;
- TRACE("setting: Velocity vector = (%f,%f,%f); dwApply = %d\n", x, y, z, dwApply);
- This->dsb->ds3db_ds3db.vVelocity.x = x;
- This->dsb->ds3db_ds3db.vVelocity.y = y;
- This->dsb->ds3db_ds3db.vVelocity.z = z;
- if (dwApply == DS3D_IMMEDIATE)
- {
- This->dsb->ds3db_need_recalc = FALSE;
- DSOUND_Mix3DBuffer(This->dsb);
- }
- This->dsb->ds3db_need_recalc = TRUE;
- return DS_OK;
-}
-
-static const IDirectSound3DBufferVtbl ds3dbvt =
-{
- /* IUnknown methods */
- IDirectSound3DBufferImpl_QueryInterface,
- IDirectSound3DBufferImpl_AddRef,
- IDirectSound3DBufferImpl_Release,
- /* IDirectSound3DBuffer methods */
- IDirectSound3DBufferImpl_GetAllParameters,
- IDirectSound3DBufferImpl_GetConeAngles,
- IDirectSound3DBufferImpl_GetConeOrientation,
- IDirectSound3DBufferImpl_GetConeOutsideVolume,
- IDirectSound3DBufferImpl_GetMaxDistance,
- IDirectSound3DBufferImpl_GetMinDistance,
- IDirectSound3DBufferImpl_GetMode,
- IDirectSound3DBufferImpl_GetPosition,
- IDirectSound3DBufferImpl_GetVelocity,
- IDirectSound3DBufferImpl_SetAllParameters,
- IDirectSound3DBufferImpl_SetConeAngles,
- IDirectSound3DBufferImpl_SetConeOrientation,
- IDirectSound3DBufferImpl_SetConeOutsideVolume,
- IDirectSound3DBufferImpl_SetMaxDistance,
- IDirectSound3DBufferImpl_SetMinDistance,
- IDirectSound3DBufferImpl_SetMode,
- IDirectSound3DBufferImpl_SetPosition,
- IDirectSound3DBufferImpl_SetVelocity,
-};
-
-HRESULT IDirectSound3DBufferImpl_Create(
- IDirectSoundBufferImpl *dsb,
- IDirectSound3DBufferImpl **pds3db)
-{
- IDirectSound3DBufferImpl *ds3db;
- TRACE("(%p,%p)\n",dsb,pds3db);
-
- ds3db = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*ds3db));
-
- if (ds3db == NULL) {
- WARN("out of memory\n");
- *pds3db = 0;
- return DSERR_OUTOFMEMORY;
- }
-
- ds3db->ref = 0;
- ds3db->dsb = dsb;
- ds3db->lpVtbl = &ds3dbvt;
-
- ds3db->dsb->ds3db_ds3db.dwSize = sizeof(DS3DBUFFER);
- ds3db->dsb->ds3db_ds3db.vPosition.x = 0.0;
- ds3db->dsb->ds3db_ds3db.vPosition.y = 0.0;
- ds3db->dsb->ds3db_ds3db.vPosition.z = 0.0;
- ds3db->dsb->ds3db_ds3db.vVelocity.x = 0.0;
- ds3db->dsb->ds3db_ds3db.vVelocity.y = 0.0;
- ds3db->dsb->ds3db_ds3db.vVelocity.z = 0.0;
- ds3db->dsb->ds3db_ds3db.dwInsideConeAngle = DS3D_DEFAULTCONEANGLE;
- ds3db->dsb->ds3db_ds3db.dwOutsideConeAngle = DS3D_DEFAULTCONEANGLE;
- ds3db->dsb->ds3db_ds3db.vConeOrientation.x = 0.0;
- ds3db->dsb->ds3db_ds3db.vConeOrientation.y = 0.0;
- ds3db->dsb->ds3db_ds3db.vConeOrientation.z = 0.0;
- ds3db->dsb->ds3db_ds3db.lConeOutsideVolume = DS3D_DEFAULTCONEOUTSIDEVOLUME;
- ds3db->dsb->ds3db_ds3db.flMinDistance = DS3D_DEFAULTMINDISTANCE;
- ds3db->dsb->ds3db_ds3db.flMaxDistance = DS3D_DEFAULTMAXDISTANCE;
- ds3db->dsb->ds3db_ds3db.dwMode = DS3DMODE_NORMAL;
-
- ds3db->dsb->ds3db_need_recalc = TRUE;
-
- IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER8)dsb);
-
- *pds3db = ds3db;
- return S_OK;
-}
-
-HRESULT IDirectSound3DBufferImpl_Destroy(
- IDirectSound3DBufferImpl *pds3db)
-{
- TRACE("(%p)\n",pds3db);
-
- while (IDirectSound3DBufferImpl_Release((LPDIRECTSOUND3DBUFFER)pds3db) > 0);
-
- return S_OK;
-}
-
-/*******************************************************************************
- * IDirectSound3DListener
- */
-
-/* IUnknown methods */
-static HRESULT WINAPI IDirectSound3DListenerImpl_QueryInterface(
- LPDIRECTSOUND3DLISTENER iface, REFIID riid, LPVOID *ppobj)
-{
- IDirectSound3DListenerImpl *This = (IDirectSound3DListenerImpl *)iface;
-
- TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppobj);
-
- if (ppobj == NULL) {
- WARN("invalid parameter\n");
- return E_INVALIDARG;
- }
-
- *ppobj = NULL; /* assume failure */
-
- if ( IsEqualGUID(riid, &IID_IUnknown) ||
- IsEqualGUID(riid, &IID_IDirectSound3DListener ) ) {
- IDirectSound3DListener_AddRef((LPDIRECTSOUND3DLISTENER)This);
- *ppobj = This;
- return S_OK;
- }
-
- if ( IsEqualGUID(riid, &IID_IDirectSoundBuffer) ) {
- if (!This->device->primary)
- PrimaryBufferImpl_Create(This->device, &(This->device->primary), &(This->device->dsbd));
- if (This->device->primary) {
- *ppobj = This->device->primary;
- IDirectSoundBuffer_AddRef((LPDIRECTSOUNDBUFFER)*ppobj);
- return S_OK;
- }
- }
-
- FIXME( "Unknown IID %s\n", debugstr_guid( riid ) );
- return E_NOINTERFACE;
-}
-
-static ULONG WINAPI IDirectSound3DListenerImpl_AddRef(LPDIRECTSOUND3DLISTENER iface)
-{
- IDirectSound3DListenerImpl *This = (IDirectSound3DListenerImpl *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
-}
-
-static ULONG WINAPI IDirectSound3DListenerImpl_Release(LPDIRECTSOUND3DLISTENER iface)
-{
- IDirectSound3DListenerImpl *This = (IDirectSound3DListenerImpl *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref + 1);
-
- if (!ref) {
- This->device->listener = 0;
- HeapFree(GetProcessHeap(), 0, This);
- TRACE("(%p) released\n", This);
- }
- return ref;
-}
-
-/* IDirectSound3DListener methods */
-static HRESULT WINAPI IDirectSound3DListenerImpl_GetAllParameter(
- LPDIRECTSOUND3DLISTENER iface,
- LPDS3DLISTENER lpDS3DL)
-{
- IDirectSound3DListenerImpl *This = (IDirectSound3DListenerImpl *)iface;
- TRACE("(%p,%p)\n",This,lpDS3DL);
-
- if (lpDS3DL == NULL) {
- WARN("invalid parameter: lpDS3DL == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (lpDS3DL->dwSize < sizeof(*lpDS3DL)) {
- WARN("invalid parameter: lpDS3DL->dwSize = %d\n",lpDS3DL->dwSize);
- return DSERR_INVALIDPARAM;
- }
-
- TRACE("returning: all parameters\n");
- *lpDS3DL = This->device->ds3dl;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DListenerImpl_GetDistanceFactor(
- LPDIRECTSOUND3DLISTENER iface,
- LPD3DVALUE lpfDistanceFactor)
-{
- IDirectSound3DListenerImpl *This = (IDirectSound3DListenerImpl *)iface;
- TRACE("returning: Distance Factor = %f\n", This->device->ds3dl.flDistanceFactor);
- *lpfDistanceFactor = This->device->ds3dl.flDistanceFactor;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DListenerImpl_GetDopplerFactor(
- LPDIRECTSOUND3DLISTENER iface,
- LPD3DVALUE lpfDopplerFactor)
-{
- IDirectSound3DListenerImpl *This = (IDirectSound3DListenerImpl *)iface;
- TRACE("returning: Doppler Factor = %f\n", This->device->ds3dl.flDopplerFactor);
- *lpfDopplerFactor = This->device->ds3dl.flDopplerFactor;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DListenerImpl_GetOrientation(
- LPDIRECTSOUND3DLISTENER iface,
- LPD3DVECTOR lpvOrientFront,
- LPD3DVECTOR lpvOrientTop)
-{
- IDirectSound3DListenerImpl *This = (IDirectSound3DListenerImpl *)iface;
- TRACE("returning: OrientFront vector = (%f,%f,%f); OrientTop vector = (%f,%f,%f)\n", This->device->ds3dl.vOrientFront.x,
- This->device->ds3dl.vOrientFront.y, This->device->ds3dl.vOrientFront.z, This->device->ds3dl.vOrientTop.x, This->device->ds3dl.vOrientTop.y,
- This->device->ds3dl.vOrientTop.z);
- *lpvOrientFront = This->device->ds3dl.vOrientFront;
- *lpvOrientTop = This->device->ds3dl.vOrientTop;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DListenerImpl_GetPosition(
- LPDIRECTSOUND3DLISTENER iface,
- LPD3DVECTOR lpvPosition)
-{
- IDirectSound3DListenerImpl *This = (IDirectSound3DListenerImpl *)iface;
- TRACE("returning: Position vector = (%f,%f,%f)\n", This->device->ds3dl.vPosition.x, This->device->ds3dl.vPosition.y, This->device->ds3dl.vPosition.z);
- *lpvPosition = This->device->ds3dl.vPosition;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DListenerImpl_GetRolloffFactor(
- LPDIRECTSOUND3DLISTENER iface,
- LPD3DVALUE lpfRolloffFactor)
-{
- IDirectSound3DListenerImpl *This = (IDirectSound3DListenerImpl *)iface;
- TRACE("returning: RolloffFactor = %f\n", This->device->ds3dl.flRolloffFactor);
- *lpfRolloffFactor = This->device->ds3dl.flRolloffFactor;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DListenerImpl_GetVelocity(
- LPDIRECTSOUND3DLISTENER iface,
- LPD3DVECTOR lpvVelocity)
-{
- IDirectSound3DListenerImpl *This = (IDirectSound3DListenerImpl *)iface;
- TRACE("returning: Velocity vector = (%f,%f,%f)\n", This->device->ds3dl.vVelocity.x, This->device->ds3dl.vVelocity.y, This->device->ds3dl.vVelocity.z);
- *lpvVelocity = This->device->ds3dl.vVelocity;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DListenerImpl_SetAllParameters(
- LPDIRECTSOUND3DLISTENER iface,
- LPCDS3DLISTENER lpcDS3DL,
- DWORD dwApply)
-{
- IDirectSound3DListenerImpl *This = (IDirectSound3DListenerImpl *)iface;
- TRACE("setting: all parameters; dwApply = %d\n", dwApply);
- This->device->ds3dl = *lpcDS3DL;
- if (dwApply == DS3D_IMMEDIATE)
- {
- This->device->ds3dl_need_recalc = FALSE;
- DSOUND_ChangeListener(This);
- }
- This->device->ds3dl_need_recalc = TRUE;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DListenerImpl_SetDistanceFactor(
- LPDIRECTSOUND3DLISTENER iface,
- D3DVALUE fDistanceFactor,
- DWORD dwApply)
-{
- IDirectSound3DListenerImpl *This = (IDirectSound3DListenerImpl *)iface;
- TRACE("setting: Distance Factor = %f; dwApply = %d\n", fDistanceFactor, dwApply);
- This->device->ds3dl.flDistanceFactor = fDistanceFactor;
- if (dwApply == DS3D_IMMEDIATE)
- {
- This->device->ds3dl_need_recalc = FALSE;
- DSOUND_ChangeListener(This);
- }
- This->device->ds3dl_need_recalc = TRUE;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DListenerImpl_SetDopplerFactor(
- LPDIRECTSOUND3DLISTENER iface,
- D3DVALUE fDopplerFactor,
- DWORD dwApply)
-{
- IDirectSound3DListenerImpl *This = (IDirectSound3DListenerImpl *)iface;
- TRACE("setting: Doppler Factor = %f; dwApply = %d\n", fDopplerFactor, dwApply);
- This->device->ds3dl.flDopplerFactor = fDopplerFactor;
- if (dwApply == DS3D_IMMEDIATE)
- {
- This->device->ds3dl_need_recalc = FALSE;
- DSOUND_ChangeListener(This);
- }
- This->device->ds3dl_need_recalc = TRUE;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DListenerImpl_SetOrientation(
- LPDIRECTSOUND3DLISTENER iface,
- D3DVALUE xFront, D3DVALUE yFront, D3DVALUE zFront,
- D3DVALUE xTop, D3DVALUE yTop, D3DVALUE zTop,
- DWORD dwApply)
-{
- IDirectSound3DListenerImpl *This = (IDirectSound3DListenerImpl *)iface;
- TRACE("setting: Front vector = (%f,%f,%f); Top vector = (%f,%f,%f); dwApply = %d\n",
- xFront, yFront, zFront, xTop, yTop, zTop, dwApply);
- This->device->ds3dl.vOrientFront.x = xFront;
- This->device->ds3dl.vOrientFront.y = yFront;
- This->device->ds3dl.vOrientFront.z = zFront;
- This->device->ds3dl.vOrientTop.x = xTop;
- This->device->ds3dl.vOrientTop.y = yTop;
- This->device->ds3dl.vOrientTop.z = zTop;
- if (dwApply == DS3D_IMMEDIATE)
- {
- This->device->ds3dl_need_recalc = FALSE;
- DSOUND_ChangeListener(This);
- }
- This->device->ds3dl_need_recalc = TRUE;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DListenerImpl_SetPosition(
- LPDIRECTSOUND3DLISTENER iface,
- D3DVALUE x, D3DVALUE y, D3DVALUE z,
- DWORD dwApply)
-{
- IDirectSound3DListenerImpl *This = (IDirectSound3DListenerImpl *)iface;
- TRACE("setting: Position vector = (%f,%f,%f); dwApply = %d\n", x, y, z, dwApply);
- This->device->ds3dl.vPosition.x = x;
- This->device->ds3dl.vPosition.y = y;
- This->device->ds3dl.vPosition.z = z;
- if (dwApply == DS3D_IMMEDIATE)
- {
- This->device->ds3dl_need_recalc = FALSE;
- DSOUND_ChangeListener(This);
- }
- This->device->ds3dl_need_recalc = TRUE;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DListenerImpl_SetRolloffFactor(
- LPDIRECTSOUND3DLISTENER iface,
- D3DVALUE fRolloffFactor,
- DWORD dwApply)
-{
- IDirectSound3DListenerImpl *This = (IDirectSound3DListenerImpl *)iface;
- TRACE("setting: Rolloff Factor = %f; dwApply = %d\n", fRolloffFactor, dwApply);
- This->device->ds3dl.flRolloffFactor = fRolloffFactor;
- if (dwApply == DS3D_IMMEDIATE)
- {
- This->device->ds3dl_need_recalc = FALSE;
- DSOUND_ChangeListener(This);
- }
- This->device->ds3dl_need_recalc = TRUE;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DListenerImpl_SetVelocity(
- LPDIRECTSOUND3DLISTENER iface,
- D3DVALUE x, D3DVALUE y, D3DVALUE z,
- DWORD dwApply)
-{
- IDirectSound3DListenerImpl *This = (IDirectSound3DListenerImpl *)iface;
- TRACE("setting: Velocity vector = (%f,%f,%f); dwApply = %d\n", x, y, z, dwApply);
- This->device->ds3dl.vVelocity.x = x;
- This->device->ds3dl.vVelocity.y = y;
- This->device->ds3dl.vVelocity.z = z;
- if (dwApply == DS3D_IMMEDIATE)
- {
- This->device->ds3dl_need_recalc = FALSE;
- DSOUND_ChangeListener(This);
- }
- This->device->ds3dl_need_recalc = TRUE;
- return DS_OK;
-}
-
-static HRESULT WINAPI IDirectSound3DListenerImpl_CommitDeferredSettings(
- LPDIRECTSOUND3DLISTENER iface)
-{
- IDirectSound3DListenerImpl *This = (IDirectSound3DListenerImpl *)iface;
- TRACE("\n");
- DSOUND_ChangeListener(This);
- return DS_OK;
-}
-
-static const IDirectSound3DListenerVtbl ds3dlvt =
-{
- /* IUnknown methods */
- IDirectSound3DListenerImpl_QueryInterface,
- IDirectSound3DListenerImpl_AddRef,
- IDirectSound3DListenerImpl_Release,
- /* IDirectSound3DListener methods */
- IDirectSound3DListenerImpl_GetAllParameter,
- IDirectSound3DListenerImpl_GetDistanceFactor,
- IDirectSound3DListenerImpl_GetDopplerFactor,
- IDirectSound3DListenerImpl_GetOrientation,
- IDirectSound3DListenerImpl_GetPosition,
- IDirectSound3DListenerImpl_GetRolloffFactor,
- IDirectSound3DListenerImpl_GetVelocity,
- IDirectSound3DListenerImpl_SetAllParameters,
- IDirectSound3DListenerImpl_SetDistanceFactor,
- IDirectSound3DListenerImpl_SetDopplerFactor,
- IDirectSound3DListenerImpl_SetOrientation,
- IDirectSound3DListenerImpl_SetPosition,
- IDirectSound3DListenerImpl_SetRolloffFactor,
- IDirectSound3DListenerImpl_SetVelocity,
- IDirectSound3DListenerImpl_CommitDeferredSettings,
-};
-
-HRESULT IDirectSound3DListenerImpl_Create(
- DirectSoundDevice * device,
- IDirectSound3DListenerImpl ** ppdsl)
-{
- IDirectSound3DListenerImpl *pdsl;
- TRACE("(%p,%p)\n",device,ppdsl);
-
- pdsl = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*pdsl));
-
- if (pdsl == NULL) {
- WARN("out of memory\n");
- *ppdsl = 0;
- return DSERR_OUTOFMEMORY;
- }
-
- pdsl->ref = 0;
- pdsl->lpVtbl = &ds3dlvt;
-
- pdsl->device = device;
-
- pdsl->device->ds3dl.dwSize = sizeof(DS3DLISTENER);
- pdsl->device->ds3dl.vPosition.x = 0.0;
- pdsl->device->ds3dl.vPosition.y = 0.0;
- pdsl->device->ds3dl.vPosition.z = 0.0;
- pdsl->device->ds3dl.vVelocity.x = 0.0;
- pdsl->device->ds3dl.vVelocity.y = 0.0;
- pdsl->device->ds3dl.vVelocity.z = 0.0;
- pdsl->device->ds3dl.vOrientFront.x = 0.0;
- pdsl->device->ds3dl.vOrientFront.y = 0.0;
- pdsl->device->ds3dl.vOrientFront.z = 1.0;
- pdsl->device->ds3dl.vOrientTop.x = 0.0;
- pdsl->device->ds3dl.vOrientTop.y = 1.0;
- pdsl->device->ds3dl.vOrientTop.z = 0.0;
- pdsl->device->ds3dl.flDistanceFactor = DS3D_DEFAULTDISTANCEFACTOR;
- pdsl->device->ds3dl.flRolloffFactor = DS3D_DEFAULTROLLOFFFACTOR;
- pdsl->device->ds3dl.flDopplerFactor = DS3D_DEFAULTDOPPLERFACTOR;
-
- pdsl->device->ds3dl_need_recalc = TRUE;
-
- *ppdsl = pdsl;
- return S_OK;
-}
+++ /dev/null
-Makefile
-capture.ok
-ds3d.ok
-ds3d8.ok
-dsound.ok
-dsound8.ok
-propset.ok
-testlist.c
+++ /dev/null
-TOPSRCDIR = @top_srcdir@
-TOPOBJDIR = ../../..
-SRCDIR = @srcdir@
-VPATH = @srcdir@
-TESTDLL = dsound.dll
-IMPORTS = dsound ole32 version user32 kernel32
-EXTRALIBS = -ldxguid -luuid -ldxerr8
-
-CTESTS = \
- capture.c \
- ds3d.c \
- ds3d8.c \
- dsound.c \
- dsound8.c \
- propset.c
-
-@MAKE_TEST_RULES@
-
-### Dependencies:
+++ /dev/null
-/*
- * Unit tests for capture functions
- *
- * Copyright (c) 2002 Francois Gouget
- * Copyright (c) 2003 Robert Reif
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#define NONAMELESSSTRUCT
-#define NONAMELESSUNION
-#include <windows.h>
-
-#include <stdio.h>
-
-#include "wine/test.h"
-#include "dsound.h"
-#include "mmreg.h"
-#include "dxerr8.h"
-#include "dsconf.h"
-
-#include "dsound_test.h"
-
-#define NOTIFICATIONS 5
-
-static HRESULT (WINAPI *pDirectSoundCaptureCreate)(LPCGUID,LPDIRECTSOUNDCAPTURE*,LPUNKNOWN)=NULL;
-static HRESULT (WINAPI *pDirectSoundCaptureEnumerateA)(LPDSENUMCALLBACKA,LPVOID)=NULL;
-
-static const char * get_format_str(WORD format)
-{
- static char msg[32];
-#define WAVE_FORMAT(f) case f: return #f
- switch (format) {
- WAVE_FORMAT(WAVE_FORMAT_PCM);
- WAVE_FORMAT(WAVE_FORMAT_ADPCM);
- WAVE_FORMAT(WAVE_FORMAT_IBM_CVSD);
- WAVE_FORMAT(WAVE_FORMAT_ALAW);
- WAVE_FORMAT(WAVE_FORMAT_MULAW);
- WAVE_FORMAT(WAVE_FORMAT_OKI_ADPCM);
- WAVE_FORMAT(WAVE_FORMAT_IMA_ADPCM);
- WAVE_FORMAT(WAVE_FORMAT_MEDIASPACE_ADPCM);
- WAVE_FORMAT(WAVE_FORMAT_SIERRA_ADPCM);
- WAVE_FORMAT(WAVE_FORMAT_G723_ADPCM);
- WAVE_FORMAT(WAVE_FORMAT_DIGISTD);
- WAVE_FORMAT(WAVE_FORMAT_DIGIFIX);
- WAVE_FORMAT(WAVE_FORMAT_DIALOGIC_OKI_ADPCM);
- WAVE_FORMAT(WAVE_FORMAT_YAMAHA_ADPCM);
- WAVE_FORMAT(WAVE_FORMAT_SONARC);
- WAVE_FORMAT(WAVE_FORMAT_DSPGROUP_TRUESPEECH);
- WAVE_FORMAT(WAVE_FORMAT_ECHOSC1);
- WAVE_FORMAT(WAVE_FORMAT_AUDIOFILE_AF36);
- WAVE_FORMAT(WAVE_FORMAT_APTX);
- WAVE_FORMAT(WAVE_FORMAT_AUDIOFILE_AF10);
- WAVE_FORMAT(WAVE_FORMAT_DOLBY_AC2);
- WAVE_FORMAT(WAVE_FORMAT_GSM610);
- WAVE_FORMAT(WAVE_FORMAT_ANTEX_ADPCME);
- WAVE_FORMAT(WAVE_FORMAT_CONTROL_RES_VQLPC);
- WAVE_FORMAT(WAVE_FORMAT_DIGIREAL);
- WAVE_FORMAT(WAVE_FORMAT_DIGIADPCM);
- WAVE_FORMAT(WAVE_FORMAT_CONTROL_RES_CR10);
- WAVE_FORMAT(WAVE_FORMAT_NMS_VBXADPCM);
- WAVE_FORMAT(WAVE_FORMAT_G721_ADPCM);
- WAVE_FORMAT(WAVE_FORMAT_MPEG);
- WAVE_FORMAT(WAVE_FORMAT_MPEGLAYER3);
- WAVE_FORMAT(WAVE_FORMAT_CREATIVE_ADPCM);
- WAVE_FORMAT(WAVE_FORMAT_CREATIVE_FASTSPEECH8);
- WAVE_FORMAT(WAVE_FORMAT_CREATIVE_FASTSPEECH10);
- WAVE_FORMAT(WAVE_FORMAT_FM_TOWNS_SND);
- WAVE_FORMAT(WAVE_FORMAT_OLIGSM);
- WAVE_FORMAT(WAVE_FORMAT_OLIADPCM);
- WAVE_FORMAT(WAVE_FORMAT_OLICELP);
- WAVE_FORMAT(WAVE_FORMAT_OLISBC);
- WAVE_FORMAT(WAVE_FORMAT_OLIOPR);
- WAVE_FORMAT(WAVE_FORMAT_DEVELOPMENT);
- WAVE_FORMAT(WAVE_FORMAT_EXTENSIBLE);
- }
-#undef WAVE_FORMAT
- sprintf(msg, "Unknown(0x%04x)", format);
- return msg;
-}
-
-static char * format_string(WAVEFORMATEX* wfx)
-{
- static char str[64];
-
- sprintf(str, "%5ldx%2dx%d %s",
- wfx->nSamplesPerSec, wfx->wBitsPerSample, wfx->nChannels,
- get_format_str(wfx->wFormatTag));
-
- return str;
-}
-
-static void IDirectSoundCapture_test(LPDIRECTSOUNDCAPTURE dsco,
- BOOL initialized, LPCGUID lpGuid)
-{
- HRESULT rc;
- DSCCAPS dsccaps;
- int ref;
- IUnknown * unknown;
- IDirectSoundCapture * dsc;
-
- /* Try to Query for objects */
- rc=IDirectSoundCapture_QueryInterface(dsco, &IID_IUnknown,
- (LPVOID*)&unknown);
- ok(rc==DS_OK, "IDirectSoundCapture_QueryInterface(IID_IUnknown) "
- "failed: %s\n", DXGetErrorString8(rc));
- if (rc==DS_OK)
- IDirectSoundCapture_Release(unknown);
-
- rc=IDirectSoundCapture_QueryInterface(dsco, &IID_IDirectSoundCapture,
- (LPVOID*)&dsc);
- ok(rc==DS_OK, "IDirectSoundCapture_QueryInterface(IID_IDirectSoundCapture) "
- "failed: %s\n", DXGetErrorString8(rc));
- if (rc==DS_OK)
- IDirectSoundCapture_Release(dsc);
-
- if (initialized == FALSE) {
- /* try unitialized object */
- rc=IDirectSoundCapture_GetCaps(dsco,0);
- ok(rc==DSERR_UNINITIALIZED, "IDirectSoundCapture_GetCaps(NULL) "
- "should have returned DSERR_UNINITIALIZED, returned: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSoundCapture_GetCaps(dsco, &dsccaps);
- ok(rc==DSERR_UNINITIALIZED,"IDirectSoundCapture_GetCaps() "
- "should have returned DSERR_UNINITIALIZED, returned: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSoundCapture_Initialize(dsco, lpGuid);
- ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL,
- "IDirectSoundCapture_Initialize() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DSERR_NODRIVER) {
- trace(" No Driver\n");
- goto EXIT;
- } else if (rc==E_FAIL) {
- trace(" No Device\n");
- goto EXIT;
- } else if (rc==DSERR_ALLOCATED) {
- trace(" Already In Use\n");
- goto EXIT;
- }
- }
-
- rc=IDirectSoundCapture_Initialize(dsco, lpGuid);
- ok(rc==DSERR_ALREADYINITIALIZED, "IDirectSoundCapture_Initialize() "
- "should have returned DSERR_ALREADYINITIALIZED: %s\n",
- DXGetErrorString8(rc));
-
- /* DSOUND: Error: Invalid caps buffer */
- rc=IDirectSoundCapture_GetCaps(dsco, 0);
- ok(rc==DSERR_INVALIDPARAM, "IDirectSoundCapture_GetCaps(NULL) "
- "should have returned DSERR_INVALIDPARAM, returned: %s\n",
- DXGetErrorString8(rc));
-
- ZeroMemory(&dsccaps, sizeof(dsccaps));
-
- /* DSOUND: Error: Invalid caps buffer */
- rc=IDirectSound_GetCaps(dsco, &dsccaps);
- ok(rc==DSERR_INVALIDPARAM, "IDirectSound_GetCaps() "
- "should have returned DSERR_INVALIDPARAM, returned: %s\n",
- DXGetErrorString8(rc));
-
- dsccaps.dwSize=sizeof(dsccaps);
-
- /* DSOUND: Running on a certified driver */
- rc=IDirectSoundCapture_GetCaps(dsco, &dsccaps);
- ok(rc==DS_OK, "IDirectSoundCapture_GetCaps() failed: %s\n",
- DXGetErrorString8(rc));
-
-EXIT:
- ref=IDirectSoundCapture_Release(dsco);
- ok(ref==0, "IDirectSoundCapture_Release() has %d references, "
- "should have 0\n", ref);
-}
-
-static void IDirectSoundCapture_tests(void)
-{
- HRESULT rc;
- LPDIRECTSOUNDCAPTURE dsco=NULL;
-
- trace("Testing IDirectSoundCapture\n");
-
- /* try the COM class factory method of creation with no device specified */
- rc=CoCreateInstance(&CLSID_DirectSoundCapture, NULL, CLSCTX_INPROC_SERVER,
- &IID_IDirectSoundCapture, (void**)&dsco);
- ok(rc==S_OK||rc==REGDB_E_CLASSNOTREG,"CoCreateInstance(CLSID_DirectSoundCapture) failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==REGDB_E_CLASSNOTREG) {
- trace(" Class Not Registered\n");
- return;
- }
- if (dsco)
- IDirectSoundCapture_test(dsco, FALSE, NULL);
-
- /* try the COM class factory method of creation with default capture
- * device specified */
- rc=CoCreateInstance(&CLSID_DirectSoundCapture, NULL, CLSCTX_INPROC_SERVER,
- &IID_IDirectSoundCapture, (void**)&dsco);
- ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSoundCapture) failed: %s\n",
- DXGetErrorString8(rc));
- if (dsco)
- IDirectSoundCapture_test(dsco, FALSE, &DSDEVID_DefaultCapture);
-
- /* try the COM class factory method of creation with default voice
- * capture device specified */
- rc=CoCreateInstance(&CLSID_DirectSoundCapture, NULL, CLSCTX_INPROC_SERVER,
- &IID_IDirectSoundCapture, (void**)&dsco);
- ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSoundCapture) failed: %s\n",
- DXGetErrorString8(rc));
- if (dsco)
- IDirectSoundCapture_test(dsco, FALSE, &DSDEVID_DefaultVoiceCapture);
-
- /* try the COM class factory method of creation with a bad
- * IID specified */
- rc=CoCreateInstance(&CLSID_DirectSoundCapture, NULL, CLSCTX_INPROC_SERVER,
- &CLSID_DirectSoundPrivate, (void**)&dsco);
- ok(rc==E_NOINTERFACE,
- "CoCreateInstance(CLSID_DirectSoundCapture,CLSID_DirectSoundPrivate) "
- "should have failed: %s\n",DXGetErrorString8(rc));
-
- /* try with no device specified */
- rc=pDirectSoundCaptureCreate(NULL,&dsco,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL,
- "DirectSoundCaptureCreate(NULL) failed: %s\n",DXGetErrorString8(rc));
- if (rc==S_OK && dsco)
- IDirectSoundCapture_test(dsco, TRUE, NULL);
-
- /* try with default capture device specified */
- rc=pDirectSoundCaptureCreate(&DSDEVID_DefaultCapture,&dsco,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL,
- "DirectSoundCaptureCreate(DSDEVID_DefaultCapture) failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK && dsco)
- IDirectSoundCapture_test(dsco, TRUE, NULL);
-
- /* try with default voice capture device specified */
- rc=pDirectSoundCaptureCreate(&DSDEVID_DefaultVoiceCapture,&dsco,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL,
- "DirectSoundCaptureCreate(DSDEVID_DefaultVoiceCapture) failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK && dsco)
- IDirectSoundCapture_test(dsco, TRUE, NULL);
-
- /* try with a bad device specified */
- rc=pDirectSoundCaptureCreate(&DSDEVID_DefaultVoicePlayback,&dsco,NULL);
- ok(rc==DSERR_NODRIVER,
- "DirectSoundCaptureCreate(DSDEVID_DefaultVoicePlatback) "
- "should have failed: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK && dsco)
- IDirectSoundCapture_Release(dsco);
-}
-
-typedef struct {
- char* wave;
- DWORD wave_len;
-
- LPDIRECTSOUNDCAPTUREBUFFER dscbo;
- LPWAVEFORMATEX wfx;
- DSBPOSITIONNOTIFY posnotify[NOTIFICATIONS];
- HANDLE event[NOTIFICATIONS];
- LPDIRECTSOUNDNOTIFY notify;
-
- DWORD buffer_size;
- DWORD read;
- DWORD offset;
- DWORD size;
-
- DWORD last_pos;
-} capture_state_t;
-
-static int capture_buffer_service(capture_state_t* state)
-{
- HRESULT rc;
- LPVOID ptr1,ptr2;
- DWORD len1,len2;
- DWORD capture_pos,read_pos;
-
- rc=IDirectSoundCaptureBuffer_GetCurrentPosition(state->dscbo,&capture_pos,
- &read_pos);
- ok(rc==DS_OK,"IDirectSoundCaptureBuffer_GetCurrentPosition() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return 0;
-
- rc=IDirectSoundCaptureBuffer_Lock(state->dscbo,state->offset,state->size,
- &ptr1,&len1,&ptr2,&len2,0);
- ok(rc==DS_OK,"IDirectSoundCaptureBuffer_Lock() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return 0;
-
- rc=IDirectSoundCaptureBuffer_Unlock(state->dscbo,ptr1,len1,ptr2,len2);
- ok(rc==DS_OK,"IDirectSoundCaptureBuffer_Unlock() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return 0;
-
- state->offset = (state->offset + state->size) % state->buffer_size;
-
- return 1;
-}
-
-static void test_capture_buffer(LPDIRECTSOUNDCAPTURE dsco,
- LPDIRECTSOUNDCAPTUREBUFFER dscbo, int record)
-{
- HRESULT rc;
- DSCBCAPS dscbcaps;
- WAVEFORMATEX wfx;
- DWORD size,status;
- capture_state_t state;
- int i, ref;
-
- /* Private dsound.dll: Error: Invalid caps pointer */
- rc=IDirectSoundCaptureBuffer_GetCaps(dscbo,0);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSoundCaptureBuffer_GetCaps() should "
- "have returned DSERR_INVALIDPARAM, returned: %s\n",
- DXGetErrorString8(rc));
-
- /* Private dsound.dll: Error: Invalid caps pointer */
- dscbcaps.dwSize=0;
- rc=IDirectSoundCaptureBuffer_GetCaps(dscbo,&dscbcaps);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSoundCaptureBuffer_GetCaps() should "
- "have returned DSERR_INVALIDPARAM, returned: %s\n",
- DXGetErrorString8(rc));
-
- dscbcaps.dwSize=sizeof(dscbcaps);
- rc=IDirectSoundCaptureBuffer_GetCaps(dscbo,&dscbcaps);
- ok(rc==DS_OK,"IDirectSoundCaptureBuffer_GetCaps() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK && winetest_debug > 1) {
- trace(" Caps: size = %ld flags=0x%08lx buffer size=%ld\n",
- dscbcaps.dwSize,dscbcaps.dwFlags,dscbcaps.dwBufferBytes);
- }
-
- /* Query the format size. Note that it may not match sizeof(wfx) */
- /* Private dsound.dll: Error: Either pwfxFormat or pdwSizeWritten must
- * be non-NULL */
- rc=IDirectSoundCaptureBuffer_GetFormat(dscbo,NULL,0,NULL);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSoundCaptureBuffer_GetFormat() should "
- "have returned DSERR_INVALIDPARAM, returned: %s\n",
- DXGetErrorString8(rc));
-
- size=0;
- rc=IDirectSoundCaptureBuffer_GetFormat(dscbo,NULL,0,&size);
- ok(rc==DS_OK && size!=0,"IDirectSoundCaptureBuffer_GetFormat() should "
- "have returned the needed size: rc=%s, size=%ld\n",
- DXGetErrorString8(rc),size);
-
- rc=IDirectSoundCaptureBuffer_GetFormat(dscbo,&wfx,sizeof(wfx),NULL);
- ok(rc==DS_OK,"IDirectSoundCaptureBuffer_GetFormat() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK && winetest_debug > 1) {
- trace(" Format: tag=0x%04x %ldx%dx%d avg.B/s=%ld align=%d\n",
- wfx.wFormatTag,wfx.nSamplesPerSec,wfx.wBitsPerSample,
- wfx.nChannels,wfx.nAvgBytesPerSec,wfx.nBlockAlign);
- }
-
- /* Private dsound.dll: Error: Invalid status pointer */
- rc=IDirectSoundCaptureBuffer_GetStatus(dscbo,0);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSoundCaptureBuffer_GetStatus() should "
- "have returned DSERR_INVALIDPARAM, returned: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSoundCaptureBuffer_GetStatus(dscbo,&status);
- ok(rc==DS_OK,"IDirectSoundCaptureBuffer_GetStatus() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK && winetest_debug > 1) {
- trace(" Status=0x%04lx\n",status);
- }
-
- ZeroMemory(&state, sizeof(state));
- state.dscbo=dscbo;
- state.wfx=&wfx;
- state.buffer_size = dscbcaps.dwBufferBytes;
- for (i = 0; i < NOTIFICATIONS; i++)
- state.event[i] = CreateEvent( NULL, FALSE, FALSE, NULL );
- state.size = dscbcaps.dwBufferBytes / NOTIFICATIONS;
-
- rc=IDirectSoundCaptureBuffer_QueryInterface(dscbo,&IID_IDirectSoundNotify,
- (void **)&(state.notify));
- ok((rc==DS_OK)&&(state.notify!=NULL),
- "IDirectSoundCaptureBuffer_QueryInterface() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return;
-
- for (i = 0; i < NOTIFICATIONS; i++) {
- state.posnotify[i].dwOffset = (i * state.size) + state.size - 1;
- state.posnotify[i].hEventNotify = state.event[i];
- }
-
- rc=IDirectSoundNotify_SetNotificationPositions(state.notify,NOTIFICATIONS,
- state.posnotify);
- ok(rc==DS_OK,"IDirectSoundNotify_SetNotificationPositions() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return;
-
- ref=IDirectSoundNotify_Release(state.notify);
- ok(ref==0,"IDirectSoundNotify_Release(): has %d references, should have "
- "0\n",ref);
- if (ref!=0)
- return;
-
- if (record) {
- rc=IDirectSoundCaptureBuffer_Start(dscbo,DSCBSTART_LOOPING);
- ok(rc==DS_OK,"IDirectSoundCaptureBuffer_Start() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return;
-
- rc=IDirectSoundCaptureBuffer_GetStatus(dscbo,&status);
- ok(rc==DS_OK,"IDirectSoundCaptureBuffer_GetStatus() failed: %s\n",
- DXGetErrorString8(rc));
- ok(status==(DSCBSTATUS_CAPTURING|DSCBSTATUS_LOOPING),
- "GetStatus: bad status: %lx\n",status);
- if (rc!=DS_OK)
- return;
-
- /* wait for the notifications */
- for (i = 0; i < (NOTIFICATIONS * 2); i++) {
- rc=WaitForMultipleObjects(NOTIFICATIONS,state.event,FALSE,3000);
- ok(rc==(WAIT_OBJECT_0+(i%NOTIFICATIONS)),
- "WaitForMultipleObjects failed: 0x%lx\n",rc);
- if (rc!=(WAIT_OBJECT_0+(i%NOTIFICATIONS))) {
- ok((rc==WAIT_TIMEOUT)||(rc==WAIT_FAILED),
- "Wrong notification: should be %d, got %ld\n",
- i%NOTIFICATIONS,rc-WAIT_OBJECT_0);
- }
- if (!capture_buffer_service(&state))
- break;
- }
-
- rc=IDirectSoundCaptureBuffer_Stop(dscbo);
- ok(rc==DS_OK,"IDirectSoundCaptureBuffer_Stop() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return;
- }
-}
-
-static BOOL WINAPI dscenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription,
- LPCSTR lpcstrModule, LPVOID lpContext)
-{
- HRESULT rc;
- LPDIRECTSOUNDCAPTURE dsco=NULL;
- LPDIRECTSOUNDCAPTUREBUFFER dscbo=NULL;
- DSCBUFFERDESC bufdesc;
- WAVEFORMATEX wfx;
- DSCCAPS dsccaps;
- DWORD f;
- int ref;
-
- /* Private dsound.dll: Error: Invalid interface buffer */
- trace("*** Testing %s - %s ***\n",lpcstrDescription,lpcstrModule);
- rc=pDirectSoundCaptureCreate(lpGuid,NULL,NULL);
- ok(rc==DSERR_INVALIDPARAM,"DirectSoundCaptureCreate() should have "
- "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK) {
- ref=IDirectSoundCapture_Release(dsco);
- ok(ref==0,"IDirectSoundCapture_Release() has %d references, should "
- "have 0\n",ref);
- }
-
- rc=pDirectSoundCaptureCreate(lpGuid,&dsco,NULL);
- ok((rc==DS_OK)||(rc==DSERR_NODRIVER)||(rc==E_FAIL)||(rc==DSERR_ALLOCATED),
- "DirectSoundCaptureCreate() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK) {
- if (rc==DSERR_NODRIVER)
- trace(" No Driver\n");
- else if (rc==E_FAIL)
- trace(" No Device\n");
- else if (rc==DSERR_ALLOCATED)
- trace(" Already In Use\n");
- goto EXIT;
- }
-
- /* Private dsound.dll: Error: Invalid caps buffer */
- rc=IDirectSoundCapture_GetCaps(dsco,NULL);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSoundCapture_GetCaps() should have "
- "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
-
- /* Private dsound.dll: Error: Invalid caps buffer */
- dsccaps.dwSize=0;
- rc=IDirectSoundCapture_GetCaps(dsco,&dsccaps);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSoundCapture_GetCaps() should have "
- "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
-
- dsccaps.dwSize=sizeof(dsccaps);
- rc=IDirectSoundCapture_GetCaps(dsco,&dsccaps);
- ok(rc==DS_OK,"IDirectSoundCapture_GetCaps() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK && winetest_debug > 1) {
- trace(" Caps: size=%ld flags=0x%08lx formats=%05lx channels=%ld\n",
- dsccaps.dwSize,dsccaps.dwFlags,dsccaps.dwFormats,
- dsccaps.dwChannels);
- }
-
- /* Private dsound.dll: Error: Invalid size */
- /* Private dsound.dll: Error: Invalid capture buffer description */
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=0;
- bufdesc.dwFlags=0;
- bufdesc.dwBufferBytes=0;
- bufdesc.dwReserved=0;
- bufdesc.lpwfxFormat=NULL;
- rc=IDirectSoundCapture_CreateCaptureBuffer(dsco,&bufdesc,&dscbo,NULL);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSoundCapture_CreateCaptureBuffer() "
- "should have returned DSERR_INVALIDPARAM, returned: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK) {
- ref=IDirectSoundCaptureBuffer_Release(dscbo);
- ok(ref==0,"IDirectSoundCaptureBuffer_Release() has %d references, "
- "should have 0\n",ref);
- }
-
- /* Private dsound.dll: Error: Invalid buffer size */
- /* Private dsound.dll: Error: Invalid capture buffer description */
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=0;
- bufdesc.dwBufferBytes=0;
- bufdesc.dwReserved=0;
- bufdesc.lpwfxFormat=NULL;
- rc=IDirectSoundCapture_CreateCaptureBuffer(dsco,&bufdesc,&dscbo,NULL);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSoundCapture_CreateCaptureBuffer() "
- "should have returned DSERR_INVALIDPARAM, returned %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK) {
- ref=IDirectSoundCaptureBuffer_Release(dscbo);
- ok(ref==0,"IDirectSoundCaptureBuffer_Release() has %d references, "
- "should have 0\n",ref);
- }
-
- /* Private dsound.dll: Error: Invalid buffer size */
- /* Private dsound.dll: Error: Invalid capture buffer description */
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- ZeroMemory(&wfx, sizeof(wfx));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=0;
- bufdesc.dwBufferBytes=0;
- bufdesc.dwReserved=0;
- bufdesc.lpwfxFormat=&wfx;
- rc=IDirectSoundCapture_CreateCaptureBuffer(dsco,&bufdesc,&dscbo,NULL);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSoundCapture_CreateCaptureBuffer() "
- "should have returned DSERR_INVALIDPARAM, returned :%s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK) {
- ref=IDirectSoundCaptureBuffer_Release(dscbo);
- ok(ref==0,"IDirectSoundCaptureBuffer_Release() has %d references, "
- "should have 0\n",ref);
- }
-
- /* Private dsound.dll: Error: Invalid buffer size */
- /* Private dsound.dll: Error: Invalid capture buffer description */
- init_format(&wfx,WAVE_FORMAT_PCM,11025,8,1);
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=0;
- bufdesc.dwBufferBytes=0;
- bufdesc.dwReserved=0;
- bufdesc.lpwfxFormat=&wfx;
- rc=IDirectSoundCapture_CreateCaptureBuffer(dsco,&bufdesc,&dscbo,NULL);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSoundCapture_CreateCaptureBuffer() "
- "should have returned DSERR_INVALIDPARAM, returned: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK) {
- ref=IDirectSoundCaptureBuffer_Release(dscbo);
- ok(ref==0,"IDirectSoundCaptureBuffer_Release() has %d references, "
- "should have 0\n",ref);
- }
-
- for (f=0;f<NB_FORMATS;f++) {
- dscbo=NULL;
- init_format(&wfx,WAVE_FORMAT_PCM,formats[f][0],formats[f][1],
- formats[f][2]);
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=0;
- bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec;
- bufdesc.dwReserved=0;
- bufdesc.lpwfxFormat=&wfx;
- if (winetest_interactive)
- trace(" Testing the capture buffer at %s\n", format_string(&wfx));
- rc=IDirectSoundCapture_CreateCaptureBuffer(dsco,&bufdesc,&dscbo,NULL);
- ok(((rc==DS_OK)&&(dscbo!=NULL))||(rc==DSERR_BADFORMAT)||
- ((rc==DSERR_NODRIVER))||(rc==DSERR_ALLOCATED)||(rc==E_INVALIDARG),
- "IDirectSoundCapture_CreateCaptureBuffer() failed to create a "
- "%s capture buffer: %s\n",format_string(&wfx),DXGetErrorString8(rc));
- if (rc==DS_OK) {
- test_capture_buffer(dsco, dscbo, winetest_interactive);
- ref=IDirectSoundCaptureBuffer_Release(dscbo);
- ok(ref==0,"IDirectSoundCaptureBuffer_Release() has %d references, "
- "should have 0\n",ref);
- } else if (rc==DSERR_BADFORMAT) {
- ok(!(dsccaps.dwFormats & formats[f][3]),
- "IDirectSoundCapture_CreateCaptureBuffer() failed to create a "
- "capture buffer: format listed as supported but using it failed\n");
- if (!(dsccaps.dwFormats & formats[f][3]))
- trace(" Format not supported: %s\n", format_string(&wfx));
- } else if (rc==DSERR_NODRIVER) {
- trace(" No Driver\n");
- } else if (rc==DSERR_ALLOCATED) {
- trace(" Already In Use\n");
- } else if (rc==E_INVALIDARG) { /* try the old version struct */
- DSCBUFFERDESC1 bufdesc1;
- ZeroMemory(&bufdesc1, sizeof(bufdesc1));
- bufdesc1.dwSize=sizeof(bufdesc1);
- bufdesc1.dwFlags=0;
- bufdesc1.dwBufferBytes=wfx.nAvgBytesPerSec;
- bufdesc1.dwReserved=0;
- bufdesc1.lpwfxFormat=&wfx;
- rc=IDirectSoundCapture_CreateCaptureBuffer(dsco,
- (DSCBUFFERDESC*)&bufdesc1,&dscbo,NULL);
- ok(rc==DS_OK,
- "IDirectSoundCapture_CreateCaptureBuffer() failed to create a "
- "%s capture buffer: %s\n",format_string(&wfx),
- DXGetErrorString8(rc));
- if (rc==DS_OK) {
- test_capture_buffer(dsco, dscbo, winetest_interactive);
- ref=IDirectSoundCaptureBuffer_Release(dscbo);
- ok(ref==0,"IDirectSoundCaptureBuffer_Release() has %d "
- "references, should have 0\n",ref);
- }
- }
- }
-
- /* try a non PCM format */
-#if 0
- init_format(&wfx,WAVE_FORMAT_MULAW,8000,8,1);
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSCBCAPS_WAVEMAPPED;
- bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec;
- bufdesc.dwReserved=0;
- bufdesc.lpwfxFormat=&wfx;
- if (winetest_interactive)
- trace(" Testing the capture buffer at %s\n", format_string(&wfx));
- rc=IDirectSoundCapture_CreateCaptureBuffer(dsco,&bufdesc,&dscbo,NULL);
- ok((rc==DS_OK)&&(dscbo!=NULL),"IDirectSoundCapture_CreateCaptureBuffer() "
- "failed to create a capture buffer: %s\n",DXGetErrorString8(rc));
- if ((rc==DS_OK)&&(dscbo!=NULL)) {
- test_capture_buffer(dsco, dscbo, winetest_interactive);
- ref=IDirectSoundCaptureBuffer_Release(dscbo);
- ok(ref==0,"IDirectSoundCaptureBuffer_Release() has %d references, "
- "should have 0\n",ref);
- }
-#endif
-
- /* Try an invalid format to test error handling */
-#if 0
- init_format(&wfx,WAVE_FORMAT_PCM,2000000,16,2);
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSCBCAPS_WAVEMAPPED;
- bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec;
- bufdesc.dwReserved=0;
- bufdesc.lpwfxFormat=&wfx;
- if (winetest_interactive)
- trace(" Testing the capture buffer at %s\n", format_string(&wfx));
- rc=IDirectSoundCapture_CreateCaptureBuffer(dsco,&bufdesc,&dscbo,NULL);
- ok(rc!=DS_OK,"IDirectSoundCapture_CreateCaptureBuffer() should have failed "
- "at 2 MHz %s\n",DXGetErrorString8(rc));
-#endif
-
-EXIT:
- if (dsco!=NULL) {
- ref=IDirectSoundCapture_Release(dsco);
- ok(ref==0,"IDirectSoundCapture_Release() has %d references, should "
- "have 0\n",ref);
- }
-
- return TRUE;
-}
-
-static void capture_tests(void)
-{
- HRESULT rc;
- rc=pDirectSoundCaptureEnumerateA(&dscenum_callback,NULL);
- ok(rc==DS_OK,"DirectSoundCaptureEnumerateA() failed: %s\n",
- DXGetErrorString8(rc));
-}
-
-START_TEST(capture)
-{
- HMODULE hDsound;
-
- CoInitialize(NULL);
-
- hDsound = LoadLibraryA("dsound.dll");
- if (!hDsound) {
- trace("dsound.dll not found\n");
- return;
- }
-
- trace("DLL Version: %s\n", get_file_version("dsound.dll"));
-
- pDirectSoundCaptureCreate=(void*)GetProcAddress(hDsound,"DirectSoundCaptureCreate");
- pDirectSoundCaptureEnumerateA=(void*)GetProcAddress(hDsound,"DirectSoundCaptureEnumerateA");
- if (!pDirectSoundCaptureCreate || !pDirectSoundCaptureEnumerateA)
- {
- trace("capture test skipped\n");
- return;
- }
-
- IDirectSoundCapture_tests();
- capture_tests();
-
- CoUninitialize();
-}
+++ /dev/null
-/*
- * Tests the panning and 3D functions of DirectSound
- *
- * Part of this test involves playing test tones. But this only makes
- * sense if someone is going to carefully listen to it, and would only
- * bother everyone else.
- * So this is only done if the test is being run in interactive mode.
- *
- * Copyright (c) 2002-2004 Francois Gouget
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#define NONAMELESSSTRUCT
-#define NONAMELESSUNION
-#include <windows.h>
-
-#include <math.h>
-
-#include "wine/test.h"
-#include "dsound.h"
-#include "dxerr8.h"
-
-#include "dsound_test.h"
-
-#define PI 3.14159265358979323846
-char* wave_generate_la(WAVEFORMATEX* wfx, double duration, DWORD* size)
-{
- int i;
- int nb_samples;
- char* buf;
- char* b;
-
- nb_samples=(int)(duration*wfx->nSamplesPerSec);
- *size=nb_samples*wfx->nBlockAlign;
- b=buf=malloc(*size);
- for (i=0;i<nb_samples;i++) {
- double y=sin(440.0*2*PI*i/wfx->nSamplesPerSec);
- if (wfx->wBitsPerSample==8) {
- unsigned char sample=(unsigned char)((double)127.5*(y+1.0));
- *b++=sample;
- if (wfx->nChannels==2)
- *b++=sample;
- } else {
- signed short sample=(signed short)((double)32767.5*y-0.5);
- b[0]=sample & 0xff;
- b[1]=sample >> 8;
- b+=2;
- if (wfx->nChannels==2) {
- b[0]=sample & 0xff;
- b[1]=sample >> 8;
- b+=2;
- }
- }
- }
- return buf;
-}
-
-const char * getDSBCAPS(DWORD xmask) {
- static struct {
- DWORD mask;
- const char *name;
- } flags[] = {
-#define FE(x) { x, #x },
- FE(DSBCAPS_PRIMARYBUFFER)
- FE(DSBCAPS_STATIC)
- FE(DSBCAPS_LOCHARDWARE)
- FE(DSBCAPS_LOCSOFTWARE)
- FE(DSBCAPS_CTRL3D)
- FE(DSBCAPS_CTRLFREQUENCY)
- FE(DSBCAPS_CTRLPAN)
- FE(DSBCAPS_CTRLVOLUME)
- FE(DSBCAPS_CTRLPOSITIONNOTIFY)
- FE(DSBCAPS_STICKYFOCUS)
- FE(DSBCAPS_GLOBALFOCUS)
- FE(DSBCAPS_GETCURRENTPOSITION2)
- FE(DSBCAPS_MUTE3DATMAXDISTANCE)
-#undef FE
- };
- static char buffer[512];
- unsigned int i;
- BOOL first = TRUE;
-
- buffer[0] = 0;
-
- for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++) {
- if ((flags[i].mask & xmask) == flags[i].mask) {
- if (first)
- first = FALSE;
- else
- strcat(buffer, "|");
- strcat(buffer, flags[i].name);
- }
- }
-
- return buffer;
-}
-
-HWND get_hwnd()
-{
- HWND hwnd=GetForegroundWindow();
- if (!hwnd)
- hwnd=GetDesktopWindow();
- return hwnd;
-}
-
-void init_format(WAVEFORMATEX* wfx, int format, int rate, int depth,
- int channels)
-{
- wfx->wFormatTag=format;
- wfx->nChannels=channels;
- wfx->wBitsPerSample=depth;
- wfx->nSamplesPerSec=rate;
- wfx->nBlockAlign=wfx->nChannels*wfx->wBitsPerSample/8;
- /* FIXME: Shouldn't this test be if (format!=WAVE_FORMAT_PCM) */
- if (wfx->nBlockAlign==0)
- {
- /* align compressed formats to byte boundary */
- wfx->nBlockAlign=1;
- }
- wfx->nAvgBytesPerSec=wfx->nSamplesPerSec*wfx->nBlockAlign;
- wfx->cbSize=0;
-}
-
-typedef struct {
- char* wave;
- DWORD wave_len;
-
- LPDIRECTSOUNDBUFFER dsbo;
- LPWAVEFORMATEX wfx;
- DWORD buffer_size;
- DWORD written;
- DWORD played;
- DWORD offset;
-} play_state_t;
-
-static int buffer_refill(play_state_t* state, DWORD size)
-{
- LPVOID ptr1,ptr2;
- DWORD len1,len2;
- HRESULT rc;
-
- if (size>state->wave_len-state->written)
- size=state->wave_len-state->written;
-
- rc=IDirectSoundBuffer_Lock(state->dsbo,state->offset,size,
- &ptr1,&len1,&ptr2,&len2,0);
- ok(rc==DS_OK,"IDirectSoundBuffer_Lock() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return -1;
-
- memcpy(ptr1,state->wave+state->written,len1);
- state->written+=len1;
- if (ptr2!=NULL) {
- memcpy(ptr2,state->wave+state->written,len2);
- state->written+=len2;
- }
- state->offset=state->written % state->buffer_size;
- rc=IDirectSoundBuffer_Unlock(state->dsbo,ptr1,len1,ptr2,len2);
- ok(rc==DS_OK,"IDirectSoundBuffer_Unlock() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return -1;
- return size;
-}
-
-static int buffer_silence(play_state_t* state, DWORD size)
-{
- LPVOID ptr1,ptr2;
- DWORD len1,len2;
- HRESULT rc;
- BYTE s;
-
- rc=IDirectSoundBuffer_Lock(state->dsbo,state->offset,size,
- &ptr1,&len1,&ptr2,&len2,0);
- ok(rc==DS_OK,"IDirectSoundBuffer_Lock() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return -1;
-
- s=(state->wfx->wBitsPerSample==8?0x80:0);
- memset(ptr1,s,len1);
- if (ptr2!=NULL) {
- memset(ptr2,s,len2);
- }
- state->offset=(state->offset+size) % state->buffer_size;
- rc=IDirectSoundBuffer_Unlock(state->dsbo,ptr1,len1,ptr2,len2);
- ok(rc==DS_OK,"IDirectSoundBuffer_Unlock() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return -1;
- return size;
-}
-
-static int buffer_service(play_state_t* state)
-{
- DWORD last_play_pos,play_pos,buf_free;
- HRESULT rc;
-
- rc=IDirectSoundBuffer_GetCurrentPosition(state->dsbo,&play_pos,NULL);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetCurrentPosition() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK) {
- goto STOP;
- }
-
- /* Update the amount played */
- last_play_pos=state->played % state->buffer_size;
- if (play_pos<last_play_pos)
- state->played+=state->buffer_size-last_play_pos+play_pos;
- else
- state->played+=play_pos-last_play_pos;
-
- if (winetest_debug > 1)
- trace("buf size=%ld last_play_pos=%ld play_pos=%ld played=%ld / %ld\n",
- state->buffer_size,last_play_pos,play_pos,state->played,
- state->wave_len);
-
- if (state->played>state->wave_len)
- {
- /* Everything has been played */
- goto STOP;
- }
-
- /* Refill the buffer */
- if (state->offset<=play_pos)
- buf_free=play_pos-state->offset;
- else
- buf_free=state->buffer_size-state->offset+play_pos;
-
- if (winetest_debug > 1)
- trace("offset=%ld free=%ld written=%ld / %ld\n",
- state->offset,buf_free,state->written,state->wave_len);
- if (buf_free==0)
- return 1;
-
- if (state->written<state->wave_len)
- {
- int w=buffer_refill(state,buf_free);
- if (w==-1)
- goto STOP;
- buf_free-=w;
- if (state->written==state->wave_len && winetest_debug > 1)
- trace("last sound byte at %ld\n",
- (state->written % state->buffer_size));
- }
-
- if (buf_free>0) {
- /* Fill with silence */
- if (winetest_debug > 1)
- trace("writing %ld bytes of silence\n",buf_free);
- if (buffer_silence(state,buf_free)==-1)
- goto STOP;
- }
- return 1;
-
-STOP:
- if (winetest_debug > 1)
- trace("stopping playback\n");
- rc=IDirectSoundBuffer_Stop(state->dsbo);
- ok(rc==DS_OK,"IDirectSoundBuffer_Stop() failed: %s\n",
- DXGetErrorString8(rc));
- return 0;
-}
-
-void test_buffer(LPDIRECTSOUND dso, LPDIRECTSOUNDBUFFER dsbo,
- BOOL is_primary, BOOL set_volume, LONG volume,
- BOOL set_pan, LONG pan, BOOL play, double duration,
- BOOL buffer3d, LPDIRECTSOUND3DLISTENER listener,
- BOOL move_listener, BOOL move_sound,
- BOOL set_frequency, DWORD frequency)
-{
- HRESULT rc;
- DSBCAPS dsbcaps;
- WAVEFORMATEX wfx,wfx2;
- DWORD size,status,freq;
- int ref;
-
- if (set_frequency) {
- rc=IDirectSoundBuffer_SetFrequency(dsbo,frequency);
- ok(rc==DS_OK||rc==DSERR_CONTROLUNAVAIL,
- "IDirectSoundBuffer_SetFrequency() failed to set frequency "
- "%s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return;
- }
-
- /* DSOUND: Error: Invalid caps pointer */
- rc=IDirectSoundBuffer_GetCaps(dsbo,0);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSoundBuffer_GetCaps() should have "
- "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
-
- ZeroMemory(&dsbcaps, sizeof(dsbcaps));
-
- /* DSOUND: Error: Invalid caps pointer */
- rc=IDirectSoundBuffer_GetCaps(dsbo,&dsbcaps);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSoundBuffer_GetCaps() should have "
- "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
-
- dsbcaps.dwSize=sizeof(dsbcaps);
- rc=IDirectSoundBuffer_GetCaps(dsbo,&dsbcaps);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetCaps() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK && winetest_debug > 1) {
- trace(" Caps: flags=0x%08lx size=%ld\n",dsbcaps.dwFlags,
- dsbcaps.dwBufferBytes);
- }
-
- /* Query the format size. Note that it may not match sizeof(wfx) */
- size=0;
- rc=IDirectSoundBuffer_GetFormat(dsbo,NULL,0,&size);
- ok(rc==DS_OK && size!=0,"IDirectSoundBuffer_GetFormat() should have "
- "returned the needed size: rc=%s size=%ld\n",DXGetErrorString8(rc),size);
-
- rc=IDirectSoundBuffer_GetFormat(dsbo,&wfx,sizeof(wfx),NULL);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetFormat() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK && winetest_debug > 1) {
- trace(" Format: %s tag=0x%04x %ldx%dx%d avg.B/s=%ld align=%d\n",
- is_primary ? "Primary" : "Secondary",
- wfx.wFormatTag,wfx.nSamplesPerSec,wfx.wBitsPerSample,
- wfx.nChannels,wfx.nAvgBytesPerSec,wfx.nBlockAlign);
- }
-
- /* DSOUND: Error: Invalid frequency buffer */
- rc=IDirectSoundBuffer_GetFrequency(dsbo,0);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSoundBuffer_GetFrequency() should have "
- "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
-
- /* DSOUND: Error: Primary buffers don't support CTRLFREQUENCY */
- rc=IDirectSoundBuffer_GetFrequency(dsbo,&freq);
- ok((rc==DS_OK && !is_primary) || (rc==DSERR_CONTROLUNAVAIL&&is_primary) ||
- (rc==DSERR_CONTROLUNAVAIL&&!(dsbcaps.dwFlags&DSBCAPS_CTRLFREQUENCY)),
- "IDirectSoundBuffer_GetFrequency() failed: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK) {
- DWORD f = set_frequency?frequency:wfx.nSamplesPerSec;
- ok(freq==f,"The frequency returned by GetFrequency "
- "%ld does not match the format %ld\n",freq,f);
- }
-
- /* DSOUND: Error: Invalid status pointer */
- rc=IDirectSoundBuffer_GetStatus(dsbo,0);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSoundBuffer_GetStatus() should have "
- "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
-
- rc=IDirectSoundBuffer_GetStatus(dsbo,&status);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetStatus() failed: %s\n",
- DXGetErrorString8(rc));
- ok(status==0,"status=0x%lx instead of 0\n",status);
-
- if (is_primary) {
- /* We must call SetCooperativeLevel to be allowed to call SetFormat */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
- rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
- ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel(DSSCL_PRIORITY) failed: "
- "%s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return;
-
- /* DSOUND: Error: Invalid format pointer */
- rc=IDirectSoundBuffer_SetFormat(dsbo,0);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSoundBuffer_SetFormat() should have "
- "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
-
- init_format(&wfx2,WAVE_FORMAT_PCM,11025,16,2);
- rc=IDirectSoundBuffer_SetFormat(dsbo,&wfx2);
- ok(rc==DS_OK,"IDirectSoundBuffer_SetFormat() failed: %s\n",
- DXGetErrorString8(rc));
-
- /* There is no garantee that SetFormat will actually change the
- * format to what we asked for. It depends on what the soundcard
- * supports. So we must re-query the format.
- */
- rc=IDirectSoundBuffer_GetFormat(dsbo,&wfx,sizeof(wfx),NULL);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetFormat() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK &&
- (wfx.wFormatTag!=wfx2.wFormatTag ||
- wfx.nSamplesPerSec!=wfx2.nSamplesPerSec ||
- wfx.wBitsPerSample!=wfx2.wBitsPerSample ||
- wfx.nChannels!=wfx2.nChannels)) {
- trace("Requested format tag=0x%04x %ldx%dx%d avg.B/s=%ld align=%d\n",
- wfx2.wFormatTag,wfx2.nSamplesPerSec,wfx2.wBitsPerSample,
- wfx2.nChannels,wfx2.nAvgBytesPerSec,wfx2.nBlockAlign);
- trace("Got tag=0x%04x %ldx%dx%d avg.B/s=%ld align=%d\n",
- wfx.wFormatTag,wfx.nSamplesPerSec,wfx.wBitsPerSample,
- wfx.nChannels,wfx.nAvgBytesPerSec,wfx.nBlockAlign);
- }
-
- /* Set the CooperativeLevel back to normal */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
- rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
- ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel(DSSCL_NORMAL) failed: "
- "%s\n",DXGetErrorString8(rc));
- }
-
- if (play) {
- play_state_t state;
- DS3DLISTENER listener_param;
- LPDIRECTSOUND3DBUFFER buffer=NULL;
- DS3DBUFFER buffer_param;
- DWORD start_time,now;
-
- if (winetest_interactive) {
- if (set_frequency)
- trace(" Playing %g second 440Hz tone at %ldx%dx%d with a "
- "frequency of %ld (%ldHz)\n", duration,
- wfx.nSamplesPerSec, wfx.wBitsPerSample, wfx.nChannels,
- frequency, (440 * frequency) / wfx.nSamplesPerSec);
- else
- trace(" Playing %g second 440Hz tone at %ldx%dx%d\n", duration,
- wfx.nSamplesPerSec, wfx.wBitsPerSample, wfx.nChannels);
- }
-
- if (is_primary) {
- /* We must call SetCooperativeLevel to be allowed to call Lock */
- /* DSOUND: Setting DirectSound cooperative level to
- * DSSCL_WRITEPRIMARY */
- rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),
- DSSCL_WRITEPRIMARY);
- ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel(DSSCL_WRITEPRIMARY) "
- "failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return;
- }
- if (buffer3d) {
- LPDIRECTSOUNDBUFFER temp_buffer;
-
- rc=IDirectSoundBuffer_QueryInterface(dsbo,&IID_IDirectSound3DBuffer,
- (LPVOID *)&buffer);
- ok(rc==DS_OK,"IDirectSoundBuffer_QueryInterface() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return;
-
- /* check the COM interface */
- rc=IDirectSoundBuffer_QueryInterface(dsbo, &IID_IDirectSoundBuffer,
- (LPVOID *)&temp_buffer);
- ok(rc==DS_OK && temp_buffer!=NULL,
- "IDirectSoundBuffer_QueryInterface() failed: %s\n",
- DXGetErrorString8(rc));
- ok(temp_buffer==dsbo,"COM interface broken: %p != %p\n",
- temp_buffer,dsbo);
- ref=IDirectSoundBuffer_Release(temp_buffer);
- ok(ref==1,"IDirectSoundBuffer_Release() has %d references, "
- "should have 1\n",ref);
-
- temp_buffer=NULL;
- rc=IDirectSound3DBuffer_QueryInterface(dsbo,
- &IID_IDirectSoundBuffer,
- (LPVOID *)&temp_buffer);
- ok(rc==DS_OK && temp_buffer!=NULL,
- "IDirectSound3DBuffer_QueryInterface() failed: %s\n",
- DXGetErrorString8(rc));
- ok(temp_buffer==dsbo,"COM interface broken: %p != %p\n",
- temp_buffer,dsbo);
- ref=IDirectSoundBuffer_Release(temp_buffer);
- ok(ref==1,"IDirectSoundBuffer_Release() has %d references, "
- "should have 1\n",ref);
-
-#if 0
- /* FIXME: this works on windows */
- ref=IDirectSoundBuffer_Release(dsbo);
- ok(ref==0,"IDirectSoundBuffer_Release() has %d references, "
- "should have 0\n",ref);
-
- rc=IDirectSound3DBuffer_QueryInterface(buffer,
- &IID_IDirectSoundBuffer,
- (LPVOID *)&dsbo);
- ok(rc==DS_OK && dsbo!=NULL,"IDirectSound3DBuffer_QueryInterface() "
- "failed: %s\n",DXGetErrorString8(rc));
-#endif
-
- /* DSOUND: Error: Invalid buffer */
- rc=IDirectSound3DBuffer_GetAllParameters(buffer,0);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSound3DBuffer_GetAllParameters() "
- "failed: %s\n",DXGetErrorString8(rc));
-
- ZeroMemory(&buffer_param, sizeof(buffer_param));
-
- /* DSOUND: Error: Invalid buffer */
- rc=IDirectSound3DBuffer_GetAllParameters(buffer,&buffer_param);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSound3DBuffer_GetAllParameters() "
- "failed: %s\n",DXGetErrorString8(rc));
-
- buffer_param.dwSize=sizeof(buffer_param);
- rc=IDirectSound3DBuffer_GetAllParameters(buffer,&buffer_param);
- ok(rc==DS_OK,"IDirectSound3DBuffer_GetAllParameters() failed: %s\n",
- DXGetErrorString8(rc));
- }
- if (set_volume) {
- if (dsbcaps.dwFlags & DSBCAPS_CTRLVOLUME) {
- LONG val;
- rc=IDirectSoundBuffer_GetVolume(dsbo,&val);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetVolume() failed: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSoundBuffer_SetVolume(dsbo,volume);
- ok(rc==DS_OK,"IDirectSoundBuffer_SetVolume() failed: %s\n",
- DXGetErrorString8(rc));
- } else {
- /* DSOUND: Error: Buffer does not have CTRLVOLUME */
- rc=IDirectSoundBuffer_GetVolume(dsbo,&volume);
- ok(rc==DSERR_CONTROLUNAVAIL,"IDirectSoundBuffer_GetVolume() "
- "should have returned DSERR_CONTROLUNAVAIL, returned: %s\n",
- DXGetErrorString8(rc));
- }
- }
-
- if (set_pan) {
- if (dsbcaps.dwFlags & DSBCAPS_CTRLPAN) {
- LONG val;
- rc=IDirectSoundBuffer_GetPan(dsbo,&val);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetPan() failed: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSoundBuffer_SetPan(dsbo,pan);
- ok(rc==DS_OK,"IDirectSoundBuffer_SetPan() failed: %s\n",
- DXGetErrorString8(rc));
- } else {
- /* DSOUND: Error: Buffer does not have CTRLPAN */
- rc=IDirectSoundBuffer_GetPan(dsbo,&pan);
- ok(rc==DSERR_CONTROLUNAVAIL,"IDirectSoundBuffer_GetPan() "
- "should have returned DSERR_CONTROLUNAVAIL, returned: %s\n",
- DXGetErrorString8(rc));
- }
- }
-
- if (set_frequency)
- state.wave=wave_generate_la(&wfx,(duration*frequency)/wfx.nSamplesPerSec,&state.wave_len);
- else
- state.wave=wave_generate_la(&wfx,duration,&state.wave_len);
-
- state.dsbo=dsbo;
- state.wfx=&wfx;
- state.buffer_size=dsbcaps.dwBufferBytes;
- state.played=state.written=state.offset=0;
- buffer_refill(&state,state.buffer_size);
-
- rc=IDirectSoundBuffer_Play(dsbo,0,0,DSBPLAY_LOOPING);
- ok(rc==DS_OK,"IDirectSoundBuffer_Play() failed: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSoundBuffer_GetStatus(dsbo,&status);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetStatus() failed: %s\n",
- DXGetErrorString8(rc));
- ok(status==(DSBSTATUS_PLAYING|DSBSTATUS_LOOPING),
- "GetStatus: bad status: %lx\n",status);
-
- if (listener) {
- ZeroMemory(&listener_param,sizeof(listener_param));
- listener_param.dwSize=sizeof(listener_param);
- rc=IDirectSound3DListener_GetAllParameters(listener,
- &listener_param);
- ok(rc==DS_OK,"IDirectSound3dListener_GetAllParameters() "
- "failed: %s\n",DXGetErrorString8(rc));
- if (move_listener) {
- listener_param.vPosition.x = -5.0;
- listener_param.vVelocity.x = 10.0/duration;
- }
- rc=IDirectSound3DListener_SetAllParameters(listener,
- &listener_param,
- DS3D_IMMEDIATE);
- ok(rc==DS_OK,"IDirectSound3dListener_SetPosition() failed: %s\n",
- DXGetErrorString8(rc));
- }
- if (buffer3d) {
- if (move_sound) {
- buffer_param.vPosition.x = 100.0;
- buffer_param.vVelocity.x = -200.0/duration;
- }
- buffer_param.flMinDistance = 10;
- rc=IDirectSound3DBuffer_SetAllParameters(buffer,&buffer_param,
- DS3D_IMMEDIATE);
- ok(rc==DS_OK,"IDirectSound3dBuffer_SetPosition() failed: %s\n",
- DXGetErrorString8(rc));
- }
-
- start_time=GetTickCount();
- while (buffer_service(&state)) {
- WaitForSingleObject(GetCurrentProcess(),TIME_SLICE);
- now=GetTickCount();
- if (listener && move_listener) {
- listener_param.vPosition.x = -5.0+10.0*(now-start_time)/
- 1000/duration;
- if (winetest_debug>2)
- trace("listener position=%g\n",listener_param.vPosition.x);
- rc=IDirectSound3DListener_SetPosition(listener,
- listener_param.vPosition.x,listener_param.vPosition.y,
- listener_param.vPosition.z,DS3D_IMMEDIATE);
- ok(rc==DS_OK,"IDirectSound3dListener_SetPosition() failed: "
- "%s\n",DXGetErrorString8(rc));
- }
- if (buffer3d && move_sound) {
- buffer_param.vPosition.x = 100-200.0*(now-start_time)/
- 1000/duration;
- if (winetest_debug>2)
- trace("sound position=%g\n",buffer_param.vPosition.x);
- rc=IDirectSound3DBuffer_SetPosition(buffer,
- buffer_param.vPosition.x,buffer_param.vPosition.y,
- buffer_param.vPosition.z,DS3D_IMMEDIATE);
- ok(rc==DS_OK,"IDirectSound3dBuffer_SetPosition() failed: %s\n",
- DXGetErrorString8(rc));
- }
- }
- /* Check the sound duration was within 10% of the expected value */
- now=GetTickCount();
- ok(fabs(1000*duration-now+start_time)<=100*duration,
- "The sound played for %ld ms instead of %g ms\n",
- now-start_time,1000*duration);
-
- free(state.wave);
- if (is_primary) {
- /* Set the CooperativeLevel back to normal */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
- rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
- ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel(DSSCL_NORMAL) "
- "failed: %s\n",DXGetErrorString8(rc));
- }
- if (buffer3d) {
- ref=IDirectSound3DBuffer_Release(buffer);
- ok(ref==0,"IDirectSound3DBuffer_Release() has %d references, "
- "should have 0\n",ref);
- }
- }
-}
-
-static HRESULT test_secondary(LPGUID lpGuid, int play,
- int has_3d, int has_3dbuffer,
- int has_listener, int has_duplicate,
- int move_listener, int move_sound)
-{
- HRESULT rc;
- LPDIRECTSOUND dso=NULL;
- LPDIRECTSOUNDBUFFER primary=NULL,secondary=NULL;
- LPDIRECTSOUND3DLISTENER listener=NULL;
- DSBUFFERDESC bufdesc;
- WAVEFORMATEX wfx, wfx1;
- int ref;
-
- /* Create the DirectSound object */
- rc=DirectSoundCreate(lpGuid,&dso,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER,"DirectSoundCreate() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return rc;
-
- /* We must call SetCooperativeLevel before creating primary buffer */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
- rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
- ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel(DSSCL_PRIORITY) failed: "
- "%s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER;
- if (has_3d)
- bufdesc.dwFlags|=DSBCAPS_CTRL3D;
- else
- bufdesc.dwFlags|=(DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN);
- rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
- ok((rc==DS_OK && primary!=NULL) || (rc==DSERR_CONTROLUNAVAIL),
- "IDirectSound_CreateSoundBuffer() failed to create a %sprimary buffer: "
- "%s\n",has_3d?"3D ":"", DXGetErrorString8(rc));
- if (rc==DSERR_CONTROLUNAVAIL)
- trace(" No Primary\n");
- else if (rc==DS_OK && primary!=NULL) {
- rc=IDirectSoundBuffer_GetFormat(primary,&wfx1,sizeof(wfx1),NULL);
- ok(rc==DS_OK,"IDirectSoundBuffer8_Getformat() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT1;
-
- if (has_listener) {
- rc=IDirectSoundBuffer_QueryInterface(primary,
- &IID_IDirectSound3DListener,
- (void **)&listener);
- ok(rc==DS_OK && listener!=NULL,
- "IDirectSoundBuffer_QueryInterface() failed to get a 3D "
- "listener: %s\n",DXGetErrorString8(rc));
- ref=IDirectSoundBuffer_Release(primary);
- ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, "
- "should have 0\n",ref);
- if (rc==DS_OK && listener!=NULL) {
- DS3DLISTENER listener_param;
- ZeroMemory(&listener_param,sizeof(listener_param));
- /* DSOUND: Error: Invalid buffer */
- rc=IDirectSound3DListener_GetAllParameters(listener,0);
- ok(rc==DSERR_INVALIDPARAM,
- "IDirectSound3dListener_GetAllParameters() should have "
- "returned DSERR_INVALIDPARAM, returned: %s\n",
- DXGetErrorString8(rc));
-
- /* DSOUND: Error: Invalid buffer */
- rc=IDirectSound3DListener_GetAllParameters(listener,
- &listener_param);
- ok(rc==DSERR_INVALIDPARAM,
- "IDirectSound3dListener_GetAllParameters() should have "
- "returned DSERR_INVALIDPARAM, returned: %s\n",
- DXGetErrorString8(rc));
-
- listener_param.dwSize=sizeof(listener_param);
- rc=IDirectSound3DListener_GetAllParameters(listener,
- &listener_param);
- ok(rc==DS_OK,"IDirectSound3dListener_GetAllParameters() "
- "failed: %s\n",DXGetErrorString8(rc));
- }
- else
- goto EXIT;
- }
-
- init_format(&wfx,WAVE_FORMAT_PCM,22050,16,2);
- secondary=NULL;
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
- if (has_3d)
- bufdesc.dwFlags|=DSBCAPS_CTRL3D;
- else
- bufdesc.dwFlags|=
- (DSBCAPS_CTRLFREQUENCY|DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN);
- bufdesc.dwBufferBytes=align(wfx.nAvgBytesPerSec*BUFFER_LEN/1000,
- wfx.nBlockAlign);
- bufdesc.lpwfxFormat=&wfx;
- if (winetest_interactive) {
- trace(" Testing a %s%ssecondary buffer %s%s%s%sat %ldx%dx%d "
- "with a primary buffer at %ldx%dx%d\n",
- has_3dbuffer?"3D ":"",
- has_duplicate?"duplicated ":"",
- listener!=NULL||move_sound?"with ":"",
- move_listener?"moving ":"",
- listener!=NULL?"listener ":"",
- listener&&move_sound?"and moving sound ":move_sound?
- "moving sound ":"",
- wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels,
- wfx1.nSamplesPerSec,wfx1.wBitsPerSample,wfx1.nChannels);
- }
- rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
- ok(rc==DS_OK && secondary!=NULL,"IDirectSound_CreateSoundBuffer() "
- "failed to create a %s%ssecondary buffer %s%s%s%sat %ldx%dx%d (%s): %s\n",
- has_3dbuffer?"3D ":"", has_duplicate?"duplicated ":"",
- listener!=NULL||move_sound?"with ":"", move_listener?"moving ":"",
- listener!=NULL?"listener ":"",
- listener&&move_sound?"and moving sound ":move_sound?
- "moving sound ":"",
- wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels,
- getDSBCAPS(bufdesc.dwFlags),DXGetErrorString8(rc));
- if (rc==DS_OK && secondary!=NULL) {
- if (!has_3d) {
- LONG refvol,vol,refpan,pan;
-
- /* Check the initial secondary buffer's volume and pan */
- rc=IDirectSoundBuffer_GetVolume(secondary,&vol);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetVolume(secondary) failed: "
- "%s\n",DXGetErrorString8(rc));
- ok(vol==0,"wrong volume for a new secondary buffer: %ld\n",vol);
- rc=IDirectSoundBuffer_GetPan(secondary,&pan);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetPan(secondary) failed: "
- "%s\n",DXGetErrorString8(rc));
- ok(pan==0,"wrong pan for a new secondary buffer: %ld\n",pan);
-
- /* Check that changing the secondary buffer's volume and pan
- * does not impact the primary buffer's volume and pan
- */
- rc=IDirectSoundBuffer_GetVolume(primary,&refvol);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetVolume(primary) failed: "
- "%s\n",DXGetErrorString8(rc));
- rc=IDirectSoundBuffer_GetPan(primary,&refpan);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetPan(primary) failed: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSoundBuffer_SetVolume(secondary,-1000);
- ok(rc==DS_OK,"IDirectSoundBuffer_SetVolume(secondary) failed: "
- "%s\n",DXGetErrorString8(rc));
- rc=IDirectSoundBuffer_GetVolume(secondary,&vol);
- ok(rc==DS_OK,"IDirectSoundBuffer_SetVolume(secondary) failed: "
- "%s\n",DXGetErrorString8(rc));
- ok(vol==-1000,"secondary: wrong volume %ld instead of -1000\n",
- vol);
- rc=IDirectSoundBuffer_SetPan(secondary,-1000);
- ok(rc==DS_OK,"IDirectSoundBuffer_SetPan(secondary) failed: "
- "%s\n",DXGetErrorString8(rc));
- rc=IDirectSoundBuffer_GetPan(secondary,&pan);
- ok(rc==DS_OK,"IDirectSoundBuffer_SetPan(secondary) failed: "
- "%s\n",DXGetErrorString8(rc));
- ok(pan==-1000,"secondary: wrong pan %ld instead of -1000\n",
- pan);
-
- rc=IDirectSoundBuffer_GetVolume(primary,&vol);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetVolume(primary) failed: "
- "%s\n",DXGetErrorString8(rc));
- ok(vol==refvol,"The primary volume changed from %ld to %ld\n",
- refvol,vol);
- rc=IDirectSoundBuffer_GetPan(primary,&pan);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetPan(primary) failed: %s\n",
- DXGetErrorString8(rc));
- ok(pan==refpan,"The primary pan changed from %ld to %ld\n",
- refpan,pan);
-
- rc=IDirectSoundBuffer_SetVolume(secondary,0);
- ok(rc==DS_OK,"IDirectSoundBuffer_SetVolume(secondary) failed: "
- "%s\n",DXGetErrorString8(rc));
- rc=IDirectSoundBuffer_SetPan(secondary,0);
- ok(rc==DS_OK,"IDirectSoundBuffer_SetPan(secondary) failed: "
- "%s\n",DXGetErrorString8(rc));
- }
- if (has_duplicate) {
- LPDIRECTSOUNDBUFFER duplicated=NULL;
-
- /* DSOUND: Error: Invalid source buffer */
- rc=IDirectSound_DuplicateSoundBuffer(dso,0,0);
- ok(rc==DSERR_INVALIDPARAM,
- "IDirectSound_DuplicateSoundBuffer() should have returned "
- "DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
-
- /* DSOUND: Error: Invalid dest buffer */
- rc=IDirectSound_DuplicateSoundBuffer(dso,secondary,0);
- ok(rc==DSERR_INVALIDPARAM,
- "IDirectSound_DuplicateSoundBuffer() should have returned "
- "DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
-
- /* DSOUND: Error: Invalid source buffer */
- rc=IDirectSound_DuplicateSoundBuffer(dso,0,&duplicated);
- ok(rc==DSERR_INVALIDPARAM,
- "IDirectSound_DuplicateSoundBuffer() should have returned "
- "DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
-
- duplicated=NULL;
- rc=IDirectSound_DuplicateSoundBuffer(dso,secondary,
- &duplicated);
- ok(rc==DS_OK && duplicated!=NULL,
- "IDirectSound_DuplicateSoundBuffer() failed to duplicate "
- "a secondary buffer: %s\n",DXGetErrorString8(rc));
-
- if (rc==DS_OK && duplicated!=NULL) {
- ref=IDirectSoundBuffer_Release(secondary);
- ok(ref==0,"IDirectSoundBuffer_Release() secondary has %d "
- "references, should have 0\n",ref);
- secondary=duplicated;
- }
- }
-
- if (rc==DS_OK && secondary!=NULL) {
- double duration;
- duration=(move_listener || move_sound?4.0:1.0);
- test_buffer(dso,secondary,0,FALSE,0,FALSE,0,
- winetest_interactive,duration,has_3dbuffer,
- listener,move_listener,move_sound,FALSE,0);
- ref=IDirectSoundBuffer_Release(secondary);
- ok(ref==0,"IDirectSoundBuffer_Release() %s has %d references, "
- "should have 0\n",has_duplicate?"duplicated":"secondary",
- ref);
- }
- }
- }
-EXIT1:
- if (has_listener) {
- ref=IDirectSound3DListener_Release(listener);
- ok(ref==0,"IDirectSound3dListener_Release() listener has %d "
- "references, should have 0\n",ref);
- } else {
- ref=IDirectSoundBuffer_Release(primary);
- ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, "
- "should have 0\n",ref);
- }
-
- /* Set the CooperativeLevel back to normal */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
- rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
- ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel(DSSCL_NORMAL) failed: %s\n",
- DXGetErrorString8(rc));
-
-EXIT:
- ref=IDirectSound_Release(dso);
- ok(ref==0,"IDirectSound_Release() has %d references, should have 0\n",ref);
- if (ref!=0)
- return DSERR_GENERIC;
-
- return rc;
-}
-
-static HRESULT test_for_driver(LPGUID lpGuid)
-{
- HRESULT rc;
- LPDIRECTSOUND dso=NULL;
- int ref;
-
- /* Create the DirectSound object */
- rc=DirectSoundCreate(lpGuid,&dso,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL,
- "DirectSoundCreate() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return rc;
-
- ref=IDirectSound_Release(dso);
- ok(ref==0,"IDirectSound_Release() has %d references, should have 0\n",ref);
- if (ref!=0)
- return DSERR_GENERIC;
-
- return rc;
-}
-
-static HRESULT test_primary(LPGUID lpGuid)
-{
- HRESULT rc;
- LPDIRECTSOUND dso=NULL;
- LPDIRECTSOUNDBUFFER primary=NULL;
- DSBUFFERDESC bufdesc;
- DSCAPS dscaps;
- int ref, i;
-
- /* Create the DirectSound object */
- rc=DirectSoundCreate(lpGuid,&dso,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER,"DirectSoundCreate() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return rc;
-
- /* Get the device capabilities */
- ZeroMemory(&dscaps, sizeof(dscaps));
- dscaps.dwSize=sizeof(dscaps);
- rc=IDirectSound_GetCaps(dso,&dscaps);
- ok(rc==DS_OK,"IDirectSound_GetCaps() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- /* We must call SetCooperativeLevel before calling CreateSoundBuffer */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
- rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
- ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel(DSSCL_PRIORITY) failed: "
- "%s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- /* Testing the primary buffer */
- primary=NULL;
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN;
- rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
- ok((rc==DS_OK && primary!=NULL) || (rc==DSERR_CONTROLUNAVAIL),
- "IDirectSound_CreateSoundBuffer() failed to create a primary buffer: "
- "%s\n",DXGetErrorString8(rc));
- if (rc==DSERR_CONTROLUNAVAIL)
- trace(" No Primary\n");
- else if (rc==DS_OK && primary!=NULL) {
- test_buffer(dso,primary,1,TRUE,0,TRUE,0,winetest_interactive &&
- !(dscaps.dwFlags & DSCAPS_EMULDRIVER),1.0,0,NULL,0,0,
- FALSE,0);
- if (winetest_interactive) {
- LONG volume,pan;
-
- volume = DSBVOLUME_MAX;
- for (i = 0; i < 6; i++) {
- test_buffer(dso,primary,1,TRUE,volume,TRUE,0,
- winetest_interactive &&
- !(dscaps.dwFlags & DSCAPS_EMULDRIVER),
- 1.0,0,NULL,0,0,FALSE,0);
- volume -= ((DSBVOLUME_MAX-DSBVOLUME_MIN) / 40);
- }
-
- pan = DSBPAN_LEFT;
- for (i = 0; i < 7; i++) {
- test_buffer(dso,primary,1,TRUE,0,TRUE,pan,
- winetest_interactive &&
- !(dscaps.dwFlags & DSCAPS_EMULDRIVER),1.0,0,0,0,0,FALSE,0);
- pan += ((DSBPAN_RIGHT-DSBPAN_LEFT) / 6);
- }
- }
- ref=IDirectSoundBuffer_Release(primary);
- ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, "
- "should have 0\n",ref);
- }
-
- /* Set the CooperativeLevel back to normal */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
- rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
- ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel(DSSCL_NORMAL) failed: %s\n",
- DXGetErrorString8(rc));
-
-EXIT:
- ref=IDirectSound_Release(dso);
- ok(ref==0,"IDirectSound_Release() has %d references, should have 0\n",ref);
- if (ref!=0)
- return DSERR_GENERIC;
-
- return rc;
-}
-
-static HRESULT test_primary_3d(LPGUID lpGuid)
-{
- HRESULT rc;
- LPDIRECTSOUND dso=NULL;
- LPDIRECTSOUNDBUFFER primary=NULL;
- DSBUFFERDESC bufdesc;
- DSCAPS dscaps;
- int ref;
-
- /* Create the DirectSound object */
- rc=DirectSoundCreate(lpGuid,&dso,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER,"DirectSoundCreate() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return rc;
-
- /* Get the device capabilities */
- ZeroMemory(&dscaps, sizeof(dscaps));
- dscaps.dwSize=sizeof(dscaps);
- rc=IDirectSound_GetCaps(dso,&dscaps);
- ok(rc==DS_OK,"IDirectSound_GetCaps() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- /* We must call SetCooperativeLevel before calling CreateSoundBuffer */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
- rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
- ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel(DSSCL_PRIORITY) failed: "
- "%s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- primary=NULL;
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER;
- rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
- ok(rc==DS_OK && primary!=NULL,"IDirectSound_CreateSoundBuffer() failed "
- "to create a primary buffer: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK && primary!=NULL) {
- ref=IDirectSoundBuffer_Release(primary);
- ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, "
- "should have 0\n",ref);
- primary=NULL;
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRL3D;
- rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
- ok(rc==DS_OK && primary!=NULL,"IDirectSound_CreateSoundBuffer() "
- "failed to create a 3D primary buffer: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK && primary!=NULL) {
- test_buffer(dso,primary,1,FALSE,0,FALSE,0,winetest_interactive &&
- !(dscaps.dwFlags & DSCAPS_EMULDRIVER),1.0,0,0,0,0,
- FALSE,0);
- ref=IDirectSoundBuffer_Release(primary);
- ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, "
- "should have 0\n",ref);
- }
- }
- /* Set the CooperativeLevel back to normal */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
- rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
- ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel(DSSCL_NORMAL) failed: %s\n",
- DXGetErrorString8(rc));
-
-EXIT:
- ref=IDirectSound_Release(dso);
- ok(ref==0,"IDirectSound_Release() has %d references, should have 0\n",ref);
- if (ref!=0)
- return DSERR_GENERIC;
-
- return rc;
-}
-
-static HRESULT test_primary_3d_with_listener(LPGUID lpGuid)
-{
- HRESULT rc;
- LPDIRECTSOUND dso=NULL;
- LPDIRECTSOUNDBUFFER primary=NULL;
- DSBUFFERDESC bufdesc;
- DSCAPS dscaps;
- int ref;
-
- /* Create the DirectSound object */
- rc=DirectSoundCreate(lpGuid,&dso,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER,"DirectSoundCreate() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return rc;
-
- /* Get the device capabilities */
- ZeroMemory(&dscaps, sizeof(dscaps));
- dscaps.dwSize=sizeof(dscaps);
- rc=IDirectSound_GetCaps(dso,&dscaps);
- ok(rc==DS_OK,"IDirectSound_GetCaps() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- /* We must call SetCooperativeLevel before calling CreateSoundBuffer */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
- rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
- ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel(DSSCL_PRIORITY) failed: "
- "%s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
- primary=NULL;
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRL3D;
- rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
- ok(rc==DS_OK && primary!=NULL,"IDirectSound_CreateSoundBuffer() failed "
- "to create a 3D primary buffer: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK && primary!=NULL) {
- LPDIRECTSOUND3DLISTENER listener=NULL;
- rc=IDirectSoundBuffer_QueryInterface(primary,
- &IID_IDirectSound3DListener,(void **)&listener);
- ok(rc==DS_OK && listener!=NULL,"IDirectSoundBuffer_QueryInterface() "
- "failed to get a 3D listener: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK && listener!=NULL) {
- LPDIRECTSOUNDBUFFER temp_buffer=NULL;
-
- /* Checking the COM interface */
- rc=IDirectSoundBuffer_QueryInterface(primary,
- &IID_IDirectSoundBuffer,(LPVOID *)&temp_buffer);
- ok(rc==DS_OK && temp_buffer!=NULL,
- "IDirectSoundBuffer_QueryInterface() failed: %s\n",
- DXGetErrorString8(rc));
- ok(temp_buffer==primary,
- "COM interface broken: %p != %p\n",
- temp_buffer,primary);
- if (rc==DS_OK && temp_buffer!=NULL) {
- ref=IDirectSoundBuffer_Release(temp_buffer);
- ok(ref==1,"IDirectSoundBuffer_Release() has %d references, "
- "should have 1\n",ref);
-
- temp_buffer=NULL;
- rc=IDirectSound3DListener_QueryInterface(listener,
- &IID_IDirectSoundBuffer,(LPVOID *)&temp_buffer);
- ok(rc==DS_OK && temp_buffer!=NULL,
- "IDirectSoundBuffer_QueryInterface() failed: %s\n",
- DXGetErrorString8(rc));
- ok(temp_buffer==primary,
- "COM interface broken: %p != %p\n",
- temp_buffer,primary);
- ref=IDirectSoundBuffer_Release(temp_buffer);
- ok(ref==1,"IDirectSoundBuffer_Release() has %d references, "
- "should have 1\n",ref);
-
- /* Testing the buffer */
- test_buffer(dso,primary,1,FALSE,0,FALSE,0,
- winetest_interactive &&
- !(dscaps.dwFlags & DSCAPS_EMULDRIVER),1.0,0,
- listener,0,0,FALSE,0);
- }
-
- /* Testing the reference counting */
- ref=IDirectSound3DListener_Release(listener);
- ok(ref==0,"IDirectSound3DListener_Release() listener has %d "
- "references, should have 0\n",ref);
- }
-
- /* Testing the reference counting */
- ref=IDirectSoundBuffer_Release(primary);
- ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, "
- "should have 0\n",ref);
- }
-
-EXIT:
- ref=IDirectSound_Release(dso);
- ok(ref==0,"IDirectSound_Release() has %d references, should have 0\n",ref);
- if (ref!=0)
-return DSERR_GENERIC;
-
- return rc;
-}
-
-static BOOL WINAPI dsenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription,
- LPCSTR lpcstrModule, LPVOID lpContext)
-{
- HRESULT rc;
- trace("*** Testing %s - %s ***\n",lpcstrDescription,lpcstrModule);
-
- rc = test_for_driver(lpGuid);
- if (rc == DSERR_NODRIVER) {
- trace(" No Driver\n");
- return 1;
- } else if (rc == DSERR_ALLOCATED) {
- trace(" Already In Use\n");
- return 1;
- } else if (rc == E_FAIL) {
- trace(" No Device\n");
- return 1;
- }
-
- trace(" Testing the primary buffer\n");
- test_primary(lpGuid);
-
- trace(" Testing 3D primary buffer\n");
- test_primary_3d(lpGuid);
-
- trace(" Testing 3D primary buffer with listener\n");
- test_primary_3d_with_listener(lpGuid);
-
- /* Testing secondary buffers */
- test_secondary(lpGuid,winetest_interactive,0,0,0,0,0,0);
- test_secondary(lpGuid,winetest_interactive,0,0,0,1,0,0);
-
- /* Testing 3D secondary buffers */
- test_secondary(lpGuid,winetest_interactive,1,0,0,0,0,0);
- test_secondary(lpGuid,winetest_interactive,1,1,0,0,0,0);
- test_secondary(lpGuid,winetest_interactive,1,1,0,1,0,0);
- test_secondary(lpGuid,winetest_interactive,1,0,1,0,0,0);
- test_secondary(lpGuid,winetest_interactive,1,0,1,1,0,0);
- test_secondary(lpGuid,winetest_interactive,1,1,1,0,0,0);
- test_secondary(lpGuid,winetest_interactive,1,1,1,1,0,0);
- test_secondary(lpGuid,winetest_interactive,1,1,1,0,1,0);
- test_secondary(lpGuid,winetest_interactive,1,1,1,0,0,1);
- test_secondary(lpGuid,winetest_interactive,1,1,1,0,1,1);
-
- return 1;
-}
-
-static void ds3d_tests(void)
-{
- HRESULT rc;
- rc=DirectSoundEnumerateA(&dsenum_callback,NULL);
- ok(rc==DS_OK,"DirectSoundEnumerateA() failed: %s\n",DXGetErrorString8(rc));
-}
-
-START_TEST(ds3d)
-{
- CoInitialize(NULL);
-
- trace("DLL Version: %s\n", get_file_version("dsound.dll"));
-
- ds3d_tests();
-
- CoUninitialize();
-}
+++ /dev/null
-/*
- * Tests the panning and 3D functions of DirectSound
- *
- * Part of this test involves playing test tones. But this only makes
- * sense if someone is going to carefully listen to it, and would only
- * bother everyone else.
- * So this is only done if the test is being run in interactive mode.
- *
- * Copyright (c) 2002-2004 Francois Gouget
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#define NONAMELESSSTRUCT
-#define NONAMELESSUNION
-#include <windows.h>
-
-#include <math.h>
-
-#include "wine/test.h"
-#include "dsound.h"
-#include "dxerr8.h"
-
-#include "dsound_test.h"
-
-static HRESULT (WINAPI *pDirectSoundCreate8)(LPCGUID,LPDIRECTSOUND8*,LPUNKNOWN)=NULL;
-
-typedef struct {
- char* wave;
- DWORD wave_len;
-
- LPDIRECTSOUNDBUFFER dsbo;
- LPWAVEFORMATEX wfx;
- DWORD buffer_size;
- DWORD written;
- DWORD played;
- DWORD offset;
-} play_state_t;
-
-static int buffer_refill8(play_state_t* state, DWORD size)
-{
- LPVOID ptr1,ptr2;
- DWORD len1,len2;
- HRESULT rc;
-
- if (size>state->wave_len-state->written)
- size=state->wave_len-state->written;
-
- rc=IDirectSoundBuffer_Lock(state->dsbo,state->offset,size,
- &ptr1,&len1,&ptr2,&len2,0);
- ok(rc==DS_OK,"IDirectSoundBuffer_Lock() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return -1;
-
- memcpy(ptr1,state->wave+state->written,len1);
- state->written+=len1;
- if (ptr2!=NULL) {
- memcpy(ptr2,state->wave+state->written,len2);
- state->written+=len2;
- }
- state->offset=state->written % state->buffer_size;
- rc=IDirectSoundBuffer_Unlock(state->dsbo,ptr1,len1,ptr2,len2);
- ok(rc==DS_OK,"IDirectSoundBuffer_Unlock() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return -1;
- return size;
-}
-
-static int buffer_silence8(play_state_t* state, DWORD size)
-{
- LPVOID ptr1,ptr2;
- DWORD len1,len2;
- HRESULT rc;
- BYTE s;
-
- rc=IDirectSoundBuffer_Lock(state->dsbo,state->offset,size,
- &ptr1,&len1,&ptr2,&len2,0);
- ok(rc==DS_OK,"IDirectSoundBuffer_Lock() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return -1;
-
- s=(state->wfx->wBitsPerSample==8?0x80:0);
- memset(ptr1,s,len1);
- if (ptr2!=NULL) {
- memset(ptr2,s,len2);
- }
- state->offset=(state->offset+size) % state->buffer_size;
- rc=IDirectSoundBuffer_Unlock(state->dsbo,ptr1,len1,ptr2,len2);
- ok(rc==DS_OK,"IDirectSoundBuffer_Unlock() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return -1;
- return size;
-}
-
-static int buffer_service8(play_state_t* state)
-{
- DWORD last_play_pos,play_pos,buf_free;
- HRESULT rc;
-
- rc=IDirectSoundBuffer_GetCurrentPosition(state->dsbo,&play_pos,NULL);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetCurrentPosition() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK) {
- goto STOP;
- }
-
- /* Update the amount played */
- last_play_pos=state->played % state->buffer_size;
- if (play_pos<last_play_pos)
- state->played+=state->buffer_size-last_play_pos+play_pos;
- else
- state->played+=play_pos-last_play_pos;
-
- if (winetest_debug > 1)
- trace("buf size=%ld last_play_pos=%ld play_pos=%ld played=%ld / %ld\n",
- state->buffer_size,last_play_pos,play_pos,state->played,
- state->wave_len);
-
- if (state->played>state->wave_len)
- {
- /* Everything has been played */
- goto STOP;
- }
-
- /* Refill the buffer */
- if (state->offset<=play_pos)
- buf_free=play_pos-state->offset;
- else
- buf_free=state->buffer_size-state->offset+play_pos;
-
- if (winetest_debug > 1)
- trace("offset=%ld free=%ld written=%ld / %ld\n",
- state->offset,buf_free,state->written,state->wave_len);
- if (buf_free==0)
- return 1;
-
- if (state->written<state->wave_len)
- {
- int w=buffer_refill8(state,buf_free);
- if (w==-1)
- goto STOP;
- buf_free-=w;
- if (state->written==state->wave_len && winetest_debug > 1)
- trace("last sound byte at %ld\n",
- (state->written % state->buffer_size));
- }
-
- if (buf_free>0) {
- /* Fill with silence */
- if (winetest_debug > 1)
- trace("writing %ld bytes of silence\n",buf_free);
- if (buffer_silence8(state,buf_free)==-1)
- goto STOP;
- }
- return 1;
-
-STOP:
- if (winetest_debug > 1)
- trace("stopping playback\n");
- rc=IDirectSoundBuffer_Stop(state->dsbo);
- ok(rc==DS_OK,"IDirectSoundBuffer_Stop() failed: %s\n",
- DXGetErrorString8(rc));
- return 0;
-}
-
-void test_buffer8(LPDIRECTSOUND8 dso, LPDIRECTSOUNDBUFFER dsbo,
- BOOL is_primary, BOOL set_volume, LONG volume,
- BOOL set_pan, LONG pan, BOOL play, double duration,
- BOOL buffer3d, LPDIRECTSOUND3DLISTENER listener,
- BOOL move_listener, BOOL move_sound)
-{
- HRESULT rc;
- DSBCAPS dsbcaps;
- WAVEFORMATEX wfx,wfx2;
- DWORD size,status,freq;
- int ref;
-
- /* DSOUND: Error: Invalid caps pointer */
- rc=IDirectSoundBuffer_GetCaps(dsbo,0);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSoundBuffer_GetCaps() should have "
- "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
-
- ZeroMemory(&dsbcaps, sizeof(dsbcaps));
-
- /* DSOUND: Error: Invalid caps pointer */
- rc=IDirectSoundBuffer_GetCaps(dsbo,&dsbcaps);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSoundBuffer_GetCaps() should have "
- "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
-
- dsbcaps.dwSize=sizeof(dsbcaps);
- rc=IDirectSoundBuffer_GetCaps(dsbo,&dsbcaps);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetCaps() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK && winetest_debug > 1) {
- trace(" Caps: flags=0x%08lx size=%ld\n",dsbcaps.dwFlags,
- dsbcaps.dwBufferBytes);
- }
-
- /* Query the format size. Note that it may not match sizeof(wfx) */
- size=0;
- rc=IDirectSoundBuffer_GetFormat(dsbo,NULL,0,&size);
- ok(rc==DS_OK && size!=0,"IDirectSoundBuffer_GetFormat() should have "
- "returned the needed size: rc=%s size=%ld\n",DXGetErrorString8(rc),size);
-
- rc=IDirectSoundBuffer_GetFormat(dsbo,&wfx,sizeof(wfx),NULL);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetFormat() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK && winetest_debug > 1) {
- trace(" Format: %s tag=0x%04x %ldx%dx%d avg.B/s=%ld align=%d\n",
- is_primary ? "Primary" : "Secondary",
- wfx.wFormatTag,wfx.nSamplesPerSec,wfx.wBitsPerSample,
- wfx.nChannels,wfx.nAvgBytesPerSec,wfx.nBlockAlign);
- }
-
- /* DSOUND: Error: Invalid frequency buffer */
- rc=IDirectSoundBuffer_GetFrequency(dsbo,0);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSoundBuffer_GetFrequency() should have "
- "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
-
- /* DSOUND: Error: Primary buffers don't support CTRLFREQUENCY */
- rc=IDirectSoundBuffer_GetFrequency(dsbo,&freq);
- ok((rc==DS_OK && !is_primary) || (rc==DSERR_CONTROLUNAVAIL&&is_primary) ||
- (rc==DSERR_CONTROLUNAVAIL&&!(dsbcaps.dwFlags&DSBCAPS_CTRLFREQUENCY)),
- "IDirectSoundBuffer_GetFrequency() failed: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK) {
- ok(freq==wfx.nSamplesPerSec,"The frequency returned by GetFrequency "
- "%ld does not match the format %ld\n",freq,wfx.nSamplesPerSec);
- }
-
- /* DSOUND: Error: Invalid status pointer */
- rc=IDirectSoundBuffer_GetStatus(dsbo,0);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSoundBuffer_GetStatus() should have "
- "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
-
- rc=IDirectSoundBuffer_GetStatus(dsbo,&status);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetStatus() failed: %s\n",
- DXGetErrorString8(rc));
- ok(status==0,"status=0x%lx instead of 0\n",status);
-
- if (is_primary) {
- /* We must call SetCooperativeLevel to be allowed to call SetFormat */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
- rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
- ok(rc==DS_OK,"IDirectSound8_SetCooperativeLevel(DSSCL_PRIORITY) "
- "failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return;
-
- /* DSOUND: Error: Invalid format pointer */
- rc=IDirectSoundBuffer_SetFormat(dsbo,0);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSoundBuffer_SetFormat() should have "
- "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
-
- init_format(&wfx2,WAVE_FORMAT_PCM,11025,16,2);
- rc=IDirectSoundBuffer_SetFormat(dsbo,&wfx2);
- ok(rc==DS_OK,"IDirectSoundBuffer_SetFormat() failed: %s\n",
- DXGetErrorString8(rc));
-
- /* There is no garantee that SetFormat will actually change the
- * format to what we asked for. It depends on what the soundcard
- * supports. So we must re-query the format.
- */
- rc=IDirectSoundBuffer_GetFormat(dsbo,&wfx,sizeof(wfx),NULL);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetFormat() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK &&
- (wfx.wFormatTag!=wfx2.wFormatTag ||
- wfx.nSamplesPerSec!=wfx2.nSamplesPerSec ||
- wfx.wBitsPerSample!=wfx2.wBitsPerSample ||
- wfx.nChannels!=wfx2.nChannels)) {
- trace("Requested format tag=0x%04x %ldx%dx%d avg.B/s=%ld align=%d\n",
- wfx2.wFormatTag,wfx2.nSamplesPerSec,wfx2.wBitsPerSample,
- wfx2.nChannels,wfx2.nAvgBytesPerSec,wfx2.nBlockAlign);
- trace("Got tag=0x%04x %ldx%dx%d avg.B/s=%ld align=%d\n",
- wfx.wFormatTag,wfx.nSamplesPerSec,wfx.wBitsPerSample,
- wfx.nChannels,wfx.nAvgBytesPerSec,wfx.nBlockAlign);
- }
-
- /* Set the CooperativeLevel back to normal */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
- rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
- ok(rc==DS_OK,"IDirectSound8_SetCooperativeLevel(DSSCL_NORMAL) "
- "failed: %s\n",DXGetErrorString8(rc));
- }
-
- if (play) {
- play_state_t state;
- DS3DLISTENER listener_param;
- LPDIRECTSOUND3DBUFFER buffer=NULL;
- DS3DBUFFER buffer_param;
- DWORD start_time,now;
-
- if (winetest_interactive) {
- trace(" Playing %g second 440Hz tone at %ldx%dx%d\n", duration,
- wfx.nSamplesPerSec, wfx.wBitsPerSample,wfx.nChannels);
- }
-
- if (is_primary) {
- /* We must call SetCooperativeLevel to be allowed to call Lock */
- /* DSOUND: Setting DirectSound cooperative level to
- * DSSCL_WRITEPRIMARY */
- rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),
- DSSCL_WRITEPRIMARY);
- ok(rc==DS_OK,
- "IDirectSound8_SetCooperativeLevel(DSSCL_WRITEPRIMARY) failed: "
- "%s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return;
- }
- if (buffer3d) {
- LPDIRECTSOUNDBUFFER temp_buffer;
-
- rc=IDirectSoundBuffer_QueryInterface(dsbo,&IID_IDirectSound3DBuffer,
- (LPVOID *)&buffer);
- ok(rc==DS_OK,"IDirectSoundBuffer_QueryInterface() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return;
-
- /* check the COM interface */
- rc=IDirectSoundBuffer_QueryInterface(dsbo, &IID_IDirectSoundBuffer,
- (LPVOID *)&temp_buffer);
- ok(rc==DS_OK && temp_buffer!=NULL,
- "IDirectSoundBuffer_QueryInterface() failed: %s\n",
- DXGetErrorString8(rc));
- ok(temp_buffer==dsbo,"COM interface broken: %p != %p\n",
- temp_buffer,dsbo);
- ref=IDirectSoundBuffer_Release(temp_buffer);
- ok(ref==1,"IDirectSoundBuffer_Release() has %d references, "
- "should have 1\n",ref);
-
- temp_buffer=NULL;
- rc=IDirectSound3DBuffer_QueryInterface(dsbo, &IID_IDirectSoundBuffer,
- (LPVOID *)&temp_buffer);
- ok(rc==DS_OK && temp_buffer!=NULL,
- "IDirectSound3DBuffer_QueryInterface() failed: %s\n",
- DXGetErrorString8(rc));
- ok(temp_buffer==dsbo,"COM interface broken: %p != %p\n",
- temp_buffer,dsbo);
- ref=IDirectSoundBuffer_Release(temp_buffer);
- ok(ref==1,"IDirectSoundBuffer_Release() has %d references, "
- "should have 1\n",ref);
-
-#if 0
- /* FIXME: this works on windows */
- ref=IDirectSoundBuffer_Release(dsbo);
- ok(ref==0,"IDirectSoundBuffer_Release() has %d references, "
- "should have 0\n",ref);
-
- rc=IDirectSound3DBuffer_QueryInterface(buffer,
- &IID_IDirectSoundBuffer,
- (LPVOID *)&dsbo);
- ok(rc==DS_OK && dsbo!=NULL,"IDirectSound3DBuffer_QueryInterface() "
- "failed: %s\n",DXGetErrorString8(rc),
-#endif
-
- /* DSOUND: Error: Invalid buffer */
- rc=IDirectSound3DBuffer_GetAllParameters(buffer,0);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSound3DBuffer_GetAllParameters() "
- "failed: %s\n",DXGetErrorString8(rc));
-
- ZeroMemory(&buffer_param, sizeof(buffer_param));
-
- /* DSOUND: Error: Invalid buffer */
- rc=IDirectSound3DBuffer_GetAllParameters(buffer,&buffer_param);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSound3DBuffer_GetAllParameters() "
- "failed: %s\n",DXGetErrorString8(rc));
-
- buffer_param.dwSize=sizeof(buffer_param);
- rc=IDirectSound3DBuffer_GetAllParameters(buffer,&buffer_param);
- ok(rc==DS_OK,"IDirectSound3DBuffer_GetAllParameters() failed: %s\n",
- DXGetErrorString8(rc));
- }
- if (set_volume) {
- if (dsbcaps.dwFlags & DSBCAPS_CTRLVOLUME) {
- LONG val;
- rc=IDirectSoundBuffer_GetVolume(dsbo,&val);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetVolume() failed: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSoundBuffer_SetVolume(dsbo,volume);
- ok(rc==DS_OK,"IDirectSoundBuffer_SetVolume() failed: %s\n",
- DXGetErrorString8(rc));
- } else {
- /* DSOUND: Error: Buffer does not have CTRLVOLUME */
- rc=IDirectSoundBuffer_GetVolume(dsbo,&volume);
- ok(rc==DSERR_CONTROLUNAVAIL,"IDirectSoundBuffer_GetVolume() "
- "should have returned DSERR_CONTROLUNAVAIL, returned: %s\n",
- DXGetErrorString8(rc));
- }
- }
-
- if (set_pan) {
- if (dsbcaps.dwFlags & DSBCAPS_CTRLPAN) {
- LONG val;
- rc=IDirectSoundBuffer_GetPan(dsbo,&val);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetPan() failed: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSoundBuffer_SetPan(dsbo,pan);
- ok(rc==DS_OK,"IDirectSoundBuffer_SetPan() failed: %s\n",
- DXGetErrorString8(rc));
- } else {
- /* DSOUND: Error: Buffer does not have CTRLPAN */
- rc=IDirectSoundBuffer_GetPan(dsbo,&pan);
- ok(rc==DSERR_CONTROLUNAVAIL,"IDirectSoundBuffer_GetPan() "
- "should have returned DSERR_CONTROLUNAVAIL, returned: %s\n",
- DXGetErrorString8(rc));
- }
- }
-
- state.wave=wave_generate_la(&wfx,duration,&state.wave_len);
-
- state.dsbo=dsbo;
- state.wfx=&wfx;
- state.buffer_size=dsbcaps.dwBufferBytes;
- state.played=state.written=state.offset=0;
- buffer_refill8(&state,state.buffer_size);
-
- rc=IDirectSoundBuffer_Play(dsbo,0,0,DSBPLAY_LOOPING);
- ok(rc==DS_OK,"IDirectSoundBuffer_Play() failed: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSoundBuffer_GetStatus(dsbo,&status);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetStatus() failed: %s\n",
- DXGetErrorString8(rc));
- ok(status==(DSBSTATUS_PLAYING|DSBSTATUS_LOOPING),
- "GetStatus: bad status: %lx\n",status);
-
- if (listener) {
- ZeroMemory(&listener_param,sizeof(listener_param));
- listener_param.dwSize=sizeof(listener_param);
- rc=IDirectSound3DListener_GetAllParameters(listener,&listener_param);
- ok(rc==DS_OK,"IDirectSound3dListener_GetAllParameters() "
- "failed: %s\n",DXGetErrorString8(rc));
- if (move_listener) {
- listener_param.vPosition.x = -5.0;
- listener_param.vVelocity.x = 10.0/duration;
- }
- rc=IDirectSound3DListener_SetAllParameters(listener,
- &listener_param,
- DS3D_IMMEDIATE);
- ok(rc==DS_OK,"IDirectSound3dListener_SetPosition() failed: %s\n",
- DXGetErrorString8(rc));
- }
- if (buffer3d) {
- if (move_sound) {
- buffer_param.vPosition.x = 100.0;
- buffer_param.vVelocity.x = -200.0/duration;
- }
- buffer_param.flMinDistance = 10;
- rc=IDirectSound3DBuffer_SetAllParameters(buffer,&buffer_param,
- DS3D_IMMEDIATE);
- ok(rc==DS_OK,"IDirectSound3dBuffer_SetPosition() failed: %s\n",
- DXGetErrorString8(rc));
- }
-
- start_time=GetTickCount();
- while (buffer_service8(&state)) {
- WaitForSingleObject(GetCurrentProcess(),TIME_SLICE);
- now=GetTickCount();
- if (listener && move_listener) {
- listener_param.vPosition.x = -5.0+10.0*(now-start_time)/
- 1000/duration;
- if (winetest_debug>2)
- trace("listener position=%g\n",listener_param.vPosition.x);
- rc=IDirectSound3DListener_SetPosition(listener,
- listener_param.vPosition.x,listener_param.vPosition.y,
- listener_param.vPosition.z,DS3D_IMMEDIATE);
- ok(rc==DS_OK,"IDirectSound3dListener_SetPosition() failed: "
- "%s\n",DXGetErrorString8(rc));
- }
- if (buffer3d && move_sound) {
- buffer_param.vPosition.x = 100-200.0*(now-start_time)/
- 1000/duration;
- if (winetest_debug>2)
- trace("sound position=%g\n",buffer_param.vPosition.x);
- rc=IDirectSound3DBuffer_SetPosition(buffer,
- buffer_param.vPosition.x,buffer_param.vPosition.y,
- buffer_param.vPosition.z,DS3D_IMMEDIATE);
- ok(rc==DS_OK,"IDirectSound3dBuffer_SetPosition() failed: %s\n",
- DXGetErrorString8(rc));
- }
- }
- /* Check the sound duration was within 10% of the expected value */
- now=GetTickCount();
- ok(fabs(1000*duration-now+start_time)<=100*duration,
- "The sound played for %ld ms instead of %g ms\n",
- now-start_time,1000*duration);
-
- free(state.wave);
- if (is_primary) {
- /* Set the CooperativeLevel back to normal */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
- rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
- ok(rc==DS_OK,"IDirectSound8_SetCooperativeLevel(DSSCL_NORMAL) "
- "failed: %s\n",DXGetErrorString8(rc));
- }
- if (buffer3d) {
- ref=IDirectSound3DBuffer_Release(buffer);
- ok(ref==0,"IDirectSound3DBuffer_Release() has %d references, "
- "should have 0\n",ref);
- }
- }
-}
-
-static HRESULT test_secondary8(LPGUID lpGuid, int play,
- int has_3d, int has_3dbuffer,
- int has_listener, int has_duplicate,
- int move_listener, int move_sound)
-{
- HRESULT rc;
- LPDIRECTSOUND8 dso=NULL;
- LPDIRECTSOUNDBUFFER primary=NULL,secondary=NULL;
- LPDIRECTSOUND3DLISTENER listener=NULL;
- DSBUFFERDESC bufdesc;
- WAVEFORMATEX wfx, wfx1;
- int ref;
-
- /* Create the DirectSound object */
- rc=pDirectSoundCreate8(lpGuid,&dso,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER,"DirectSoundCreate8() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return rc;
-
- /* We must call SetCooperativeLevel before creating primary buffer */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
- rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
- ok(rc==DS_OK,"IDirectSound8_SetCooperativeLevel(DSSCL_PRIORITY) failed: "
- "%s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER;
- if (has_3d)
- bufdesc.dwFlags|=DSBCAPS_CTRL3D;
- else
- bufdesc.dwFlags|=(DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN);
- rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
- ok((rc==DS_OK && primary!=NULL) || (rc == DSERR_CONTROLUNAVAIL),
- "IDirectSound8_CreateSoundBuffer() failed to create a %sprimary buffer: "
- "%s\n",has_3d?"3D ":"", DXGetErrorString8(rc));
- if (rc == DSERR_CONTROLUNAVAIL)
- trace(" No Primary\n");
- else if (rc==DS_OK && primary!=NULL) {
- rc=IDirectSoundBuffer_GetFormat(primary,&wfx1,sizeof(wfx1),NULL);
- ok(rc==DS_OK,"IDirectSoundBuffer8_Getformat() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT1;
-
- if (has_listener) {
- rc=IDirectSoundBuffer_QueryInterface(primary,
- &IID_IDirectSound3DListener,
- (void **)&listener);
- ok(rc==DS_OK && listener!=NULL,
- "IDirectSoundBuffer_QueryInterface() failed to get a 3D "
- "listener %s\n",DXGetErrorString8(rc));
- ref=IDirectSoundBuffer_Release(primary);
- ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, "
- "should have 0\n",ref);
- if (rc==DS_OK && listener!=NULL) {
- DS3DLISTENER listener_param;
- ZeroMemory(&listener_param,sizeof(listener_param));
- /* DSOUND: Error: Invalid buffer */
- rc=IDirectSound3DListener_GetAllParameters(listener,0);
- ok(rc==DSERR_INVALIDPARAM,
- "IDirectSound3dListener_GetAllParameters() should have "
- "returned DSERR_INVALIDPARAM, returned: %s\n",
- DXGetErrorString8(rc));
-
- /* DSOUND: Error: Invalid buffer */
- rc=IDirectSound3DListener_GetAllParameters(listener,
- &listener_param);
- ok(rc==DSERR_INVALIDPARAM,
- "IDirectSound3dListener_GetAllParameters() should have "
- "returned DSERR_INVALIDPARAM, returned: %s\n",
- DXGetErrorString8(rc));
-
- listener_param.dwSize=sizeof(listener_param);
- rc=IDirectSound3DListener_GetAllParameters(listener,
- &listener_param);
- ok(rc==DS_OK,"IDirectSound3dListener_GetAllParameters() "
- "failed: %s\n",DXGetErrorString8(rc));
- }
- else
- goto EXIT;
- }
-
- init_format(&wfx,WAVE_FORMAT_PCM,22050,16,2);
- secondary=NULL;
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
- if (has_3d)
- bufdesc.dwFlags|=DSBCAPS_CTRL3D;
- else
- bufdesc.dwFlags|=
- (DSBCAPS_CTRLFREQUENCY|DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN);
- bufdesc.dwBufferBytes=align(wfx.nAvgBytesPerSec*BUFFER_LEN/1000,
- wfx.nBlockAlign);
- bufdesc.lpwfxFormat=&wfx;
- if (has_3d) {
- /* a stereo 3D buffer should fail */
- rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
- ok(rc==DSERR_INVALIDPARAM,
- "IDirectSound8_CreateSoundBuffer(secondary) should have "
- "returned DSERR_INVALIDPARAM, returned %s\n",
- DXGetErrorString8(rc));
- if (secondary)
- ref=IDirectSoundBuffer_Release(secondary);
- init_format(&wfx,WAVE_FORMAT_PCM,22050,16,1);
- }
-
- if (winetest_interactive) {
- trace(" Testing a %s%ssecondary buffer %s%s%s%sat %ldx%dx%d "
- "with a primary buffer at %ldx%dx%d\n",
- has_3dbuffer?"3D ":"",
- has_duplicate?"duplicated ":"",
- listener!=NULL||move_sound?"with ":"",
- move_listener?"moving ":"",
- listener!=NULL?"listener ":"",
- listener&&move_sound?"and moving sound ":move_sound?
- "moving sound ":"",
- wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels,
- wfx1.nSamplesPerSec,wfx1.wBitsPerSample,wfx1.nChannels);
- }
- rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
- ok(rc==DS_OK && secondary!=NULL,"IDirectSound8_CreateSoundBuffer() "
- "failed to create a %s%ssecondary buffer %s%s%s%sat %ldx%dx%d (%s): %s\n",
- has_3dbuffer?"3D ":"", has_duplicate?"duplicated ":"",
- listener!=NULL||move_sound?"with ":"", move_listener?"moving ":"",
- listener!=NULL?"listener ":"",
- listener&&move_sound?"and moving sound ":move_sound?
- "moving sound ":"",
- wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels,
- getDSBCAPS(bufdesc.dwFlags),DXGetErrorString8(rc));
- if (rc==DS_OK && secondary!=NULL) {
- if (!has_3d) {
- LONG refvol,vol,refpan,pan;
-
- /* Check the initial secondary buffer's volume and pan */
- rc=IDirectSoundBuffer_GetVolume(secondary,&vol);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetVolume(secondary) failed: "
- "%s\n",DXGetErrorString8(rc));
- ok(vol==0,"wrong volume for a new secondary buffer: %ld\n",vol);
- rc=IDirectSoundBuffer_GetPan(secondary,&pan);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetPan(secondary) failed: "
- "%s\n",DXGetErrorString8(rc));
- ok(pan==0,"wrong pan for a new secondary buffer: %ld\n",pan);
-
- /* Check that changing the secondary buffer's volume and pan
- * does not impact the primary buffer's volume and pan
- */
- rc=IDirectSoundBuffer_GetVolume(primary,&refvol);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetVolume(primary) failed: "
- "%s\n",DXGetErrorString8(rc));
- rc=IDirectSoundBuffer_GetPan(primary,&refpan);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetPan(primary) failed: "
- "%s\n",DXGetErrorString8(rc));
-
- rc=IDirectSoundBuffer_SetVolume(secondary,-1000);
- ok(rc==DS_OK,"IDirectSoundBuffer_SetVolume(secondary) failed: "
- "%s\n",DXGetErrorString8(rc));
- rc=IDirectSoundBuffer_GetVolume(secondary,&vol);
- ok(rc==DS_OK,"IDirectSoundBuffer_SetVolume(secondary) failed: "
- "%s\n",DXGetErrorString8(rc));
- ok(vol==-1000,"secondary: wrong volume %ld instead of -1000\n",
- vol);
- rc=IDirectSoundBuffer_SetPan(secondary,-1000);
- ok(rc==DS_OK,"IDirectSoundBuffer_SetPan(secondary) failed: "
- "%s\n",DXGetErrorString8(rc));
- rc=IDirectSoundBuffer_GetPan(secondary,&pan);
- ok(rc==DS_OK,"IDirectSoundBuffer_SetPan(secondary) failed: "
- "%s\n",DXGetErrorString8(rc));
- ok(pan==-1000,"secondary: wrong pan %ld instead of -1000\n",
- pan);
-
- rc=IDirectSoundBuffer_GetVolume(primary,&vol);
- ok(rc==DS_OK,"IDirectSoundBuffer_`GetVolume(primary) failed: i"
- "%s\n",DXGetErrorString8(rc));
- ok(vol==refvol,"The primary volume changed from %ld to %ld\n",
- refvol,vol);
- rc=IDirectSoundBuffer_GetPan(primary,&pan);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetPan(primary) failed: "
- "%s\n",DXGetErrorString8(rc));
- ok(pan==refpan,"The primary pan changed from %ld to %ld\n",
- refpan,pan);
-
- rc=IDirectSoundBuffer_SetVolume(secondary,0);
- ok(rc==DS_OK,"IDirectSoundBuffer_SetVolume(secondary) failed: "
- "%s\n",DXGetErrorString8(rc));
- rc=IDirectSoundBuffer_SetPan(secondary,0);
- ok(rc==DS_OK,"IDirectSoundBuffer_SetPan(secondary) failed: "
- "%s\n",DXGetErrorString8(rc));
- }
- if (has_duplicate) {
- LPDIRECTSOUNDBUFFER duplicated=NULL;
-
- /* DSOUND: Error: Invalid source buffer */
- rc=IDirectSound8_DuplicateSoundBuffer(dso,0,0);
- ok(rc==DSERR_INVALIDPARAM,
- "IDirectSound8_DuplicateSoundBuffer() should have returned "
- "DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
-
- /* DSOUND: Error: Invalid dest buffer */
- rc=IDirectSound8_DuplicateSoundBuffer(dso,secondary,0);
- ok(rc==DSERR_INVALIDPARAM,
- "IDirectSound8_DuplicateSoundBuffer() should have returned "
- "DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
-
- /* DSOUND: Error: Invalid source buffer */
- rc=IDirectSound8_DuplicateSoundBuffer(dso,0,&duplicated);
- ok(rc==DSERR_INVALIDPARAM,
- "IDirectSound8_DuplicateSoundBuffer() should have returned "
- "DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
-
- duplicated=NULL;
- rc=IDirectSound8_DuplicateSoundBuffer(dso,secondary,
- &duplicated);
- ok(rc==DS_OK && duplicated!=NULL,
- "IDirectSound8_DuplicateSoundBuffer() failed to duplicate "
- "a secondary buffer: %s\n",DXGetErrorString8(rc));
-
- if (rc==DS_OK && duplicated!=NULL) {
- ref=IDirectSoundBuffer_Release(secondary);
- ok(ref==0,"IDirectSoundBuffer_Release() secondary has %d "
- "references, should have 0\n",ref);
- secondary=duplicated;
- }
- }
-
- if (rc==DS_OK && secondary!=NULL) {
- double duration;
- duration=(move_listener || move_sound?4.0:1.0);
- test_buffer8(dso,secondary,0,FALSE,0,FALSE,0,
- winetest_interactive,duration,has_3dbuffer,
- listener,move_listener,move_sound);
- ref=IDirectSoundBuffer_Release(secondary);
- ok(ref==0,"IDirectSoundBuffer_Release() %s has %d references, "
- "should have 0\n",has_duplicate?"duplicated":"secondary",
- ref);
- }
- }
- }
-EXIT1:
- if (has_listener) {
- ref=IDirectSound3DListener_Release(listener);
- ok(ref==0,"IDirectSound3dListener_Release() listener has %d "
- "references, should have 0\n",ref);
- } else {
- ref=IDirectSoundBuffer_Release(primary);
- ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, "
- "should have 0\n",ref);
- }
-
- /* Set the CooperativeLevel back to normal */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
- rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
- ok(rc==DS_OK,"IDirectSound8_SetCooperativeLevel(DSSCL_NORMAL) failed: "
- "%s\n",DXGetErrorString8(rc));
-
-EXIT:
- ref=IDirectSound8_Release(dso);
- ok(ref==0,"IDirectSound8_Release() has %d references, should have 0\n",ref);
- if (ref!=0)
- return DSERR_GENERIC;
-
- return rc;
-}
-
-static HRESULT test_for_driver8(LPGUID lpGuid)
-{
- HRESULT rc;
- LPDIRECTSOUND8 dso=NULL;
- int ref;
-
- /* Create the DirectSound object */
- rc=pDirectSoundCreate8(lpGuid,&dso,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL,
- "DirectSoundCreate8() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return rc;
-
- ref=IDirectSound8_Release(dso);
- ok(ref==0,"IDirectSound8_Release() has %d references, should have 0\n",ref);
- if (ref!=0)
- return DSERR_GENERIC;
-
- return rc;
-}
-
-static HRESULT test_primary8(LPGUID lpGuid)
-{
- HRESULT rc;
- LPDIRECTSOUND8 dso=NULL;
- LPDIRECTSOUNDBUFFER primary=NULL;
- DSBUFFERDESC bufdesc;
- DSCAPS dscaps;
- int ref, i;
-
- /* Create the DirectSound object */
- rc=pDirectSoundCreate8(lpGuid,&dso,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER,"DirectSoundCreate8() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return rc;
-
- /* Get the device capabilities */
- ZeroMemory(&dscaps, sizeof(dscaps));
- dscaps.dwSize=sizeof(dscaps);
- rc=IDirectSound8_GetCaps(dso,&dscaps);
- ok(rc==DS_OK,"IDirectSound8_GetCaps() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- /* We must call SetCooperativeLevel before calling CreateSoundBuffer */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
- rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
- ok(rc==DS_OK,"IDirectSound8_SetCooperativeLevel(DSSCL_PRIORITY) failed: "
- "%s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- /* Testing the primary buffer */
- primary=NULL;
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLPAN;
- rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
- ok((rc==DS_OK && primary!=NULL) || (rc == DSERR_CONTROLUNAVAIL),
- "IDirectSound8_CreateSoundBuffer() failed to create a primary buffer: "
- "%s\n",DXGetErrorString8(rc));
- if (rc == DSERR_CONTROLUNAVAIL)
- trace(" No Primary\n");
- else if (rc==DS_OK && primary!=NULL) {
- test_buffer8(dso,primary,1,TRUE,0,TRUE,0,winetest_interactive &&
- !(dscaps.dwFlags & DSCAPS_EMULDRIVER),1.0,0,NULL,0,0);
- if (winetest_interactive) {
- LONG volume,pan;
-
- volume = DSBVOLUME_MAX;
- for (i = 0; i < 6; i++) {
- test_buffer8(dso,primary,1,TRUE,volume,TRUE,0,
- winetest_interactive &&
- !(dscaps.dwFlags & DSCAPS_EMULDRIVER),
- 1.0,0,NULL,0,0);
- volume -= ((DSBVOLUME_MAX-DSBVOLUME_MIN) / 40);
- }
-
- pan = DSBPAN_LEFT;
- for (i = 0; i < 7; i++) {
- test_buffer8(dso,primary,1,TRUE,0,TRUE,pan,
- winetest_interactive &&
- !(dscaps.dwFlags & DSCAPS_EMULDRIVER),1.0,0,0,0,0);
- pan += ((DSBPAN_RIGHT-DSBPAN_LEFT) / 6);
- }
- }
- ref=IDirectSoundBuffer_Release(primary);
- ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, "
- "should have 0\n",ref);
- }
-
- /* Set the CooperativeLevel back to normal */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
- rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
- ok(rc==DS_OK,"IDirectSound8_SetCooperativeLevel(DSSCL_NORMAL) failed: "
- "%s\n",DXGetErrorString8(rc));
-
-EXIT:
- ref=IDirectSound8_Release(dso);
- ok(ref==0,"IDirectSound8_Release() has %d references, should have 0\n",ref);
- if (ref!=0)
- return DSERR_GENERIC;
-
- return rc;
-}
-
-static HRESULT test_primary_3d8(LPGUID lpGuid)
-{
- HRESULT rc;
- LPDIRECTSOUND8 dso=NULL;
- LPDIRECTSOUNDBUFFER primary=NULL;
- DSBUFFERDESC bufdesc;
- DSCAPS dscaps;
- int ref;
-
- /* Create the DirectSound object */
- rc=pDirectSoundCreate8(lpGuid,&dso,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER,"DirectSoundCreate8() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return rc;
-
- /* Get the device capabilities */
- ZeroMemory(&dscaps, sizeof(dscaps));
- dscaps.dwSize=sizeof(dscaps);
- rc=IDirectSound8_GetCaps(dso,&dscaps);
- ok(rc==DS_OK,"IDirectSound8_GetCaps failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- /* We must call SetCooperativeLevel before calling CreateSoundBuffer */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
- rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
- ok(rc==DS_OK,"IDirectSound8_SetCooperativeLevel(DSSCL_PRIORITY) failed: "
- "%s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- primary=NULL;
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER;
- rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
- ok(rc==DS_OK && primary!=NULL,"IDirectSound8_CreateSoundBuffer() failed "
- "to create a primary buffer: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK && primary!=NULL) {
- ref=IDirectSoundBuffer_Release(primary);
- ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, "
- "should have 0\n",ref);
- primary=NULL;
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRL3D;
- rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
- ok(rc==DS_OK && primary!=NULL,"IDirectSound8_CreateSoundBuffer() "
- "failed to create a 3D primary buffer: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK && primary!=NULL) {
- test_buffer8(dso,primary,1,FALSE,0,FALSE,0,
- winetest_interactive &&
- !(dscaps.dwFlags & DSCAPS_EMULDRIVER),1.0,0,0,0,0);
- ref=IDirectSoundBuffer_Release(primary);
- ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, "
- "should have 0\n",ref);
- }
- }
- /* Set the CooperativeLevel back to normal */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
- rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
- ok(rc==DS_OK,"IDirectSound8_SetCooperativeLevel(DSSCL_NORMAL) failed: "
- "%s\n",DXGetErrorString8(rc));
-
-EXIT:
- ref=IDirectSound8_Release(dso);
- ok(ref==0,"IDirectSound8_Release() has %d references, should have 0\n",ref);
- if (ref!=0)
- return DSERR_GENERIC;
-
- return rc;
-}
-
-static HRESULT test_primary_3d_with_listener8(LPGUID lpGuid)
-{
- HRESULT rc;
- LPDIRECTSOUND8 dso=NULL;
- LPDIRECTSOUNDBUFFER primary=NULL;
- DSBUFFERDESC bufdesc;
- DSCAPS dscaps;
- int ref;
-
- /* Create the DirectSound object */
- rc=pDirectSoundCreate8(lpGuid,&dso,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER,"DirectSoundCreate8() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return rc;
-
- /* Get the device capabilities */
- ZeroMemory(&dscaps, sizeof(dscaps));
- dscaps.dwSize=sizeof(dscaps);
- rc=IDirectSound8_GetCaps(dso,&dscaps);
- ok(rc==DS_OK,"IDirectSound8_GetCaps() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- /* We must call SetCooperativeLevel before calling CreateSoundBuffer */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
- rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
- ok(rc==DS_OK,"IDirectSound8_SetCooperativeLevel(DSSCL_PRIORITY) failed: "
- "%s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
- primary=NULL;
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRL3D;
- rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
- ok(rc==DS_OK && primary!=NULL,"IDirectSound8_CreateSoundBuffer() failed "
- "to create a 3D primary buffer %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK && primary!=NULL) {
- LPDIRECTSOUND3DLISTENER listener=NULL;
- rc=IDirectSoundBuffer_QueryInterface(primary,
- &IID_IDirectSound3DListener,
- (void **)&listener);
- ok(rc==DS_OK && listener!=NULL,"IDirectSoundBuffer_QueryInterface() "
- "failed to get a 3D listener: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK && listener!=NULL) {
- LPDIRECTSOUNDBUFFER temp_buffer=NULL;
-
- /* Checking the COM interface */
- rc=IDirectSoundBuffer_QueryInterface(primary,
- &IID_IDirectSoundBuffer,
- (LPVOID *)&temp_buffer);
- ok(rc==DS_OK && temp_buffer!=NULL,
- "IDirectSoundBuffer_QueryInterface() failed: %s\n",
- DXGetErrorString8(rc));
- ok(temp_buffer==primary,"COM interface broken: %p != %p\n",temp_buffer,primary);
- if (rc==DS_OK && temp_buffer!=NULL) {
- ref=IDirectSoundBuffer_Release(temp_buffer);
- ok(ref==1,"IDirectSoundBuffer_Release() has %d references, "
- "should have 1\n",ref);
-
- temp_buffer=NULL;
- rc=IDirectSound3DListener_QueryInterface(listener,
- &IID_IDirectSoundBuffer,(LPVOID *)&temp_buffer);
- ok(rc==DS_OK && temp_buffer!=NULL,
- "IDirectSoundBuffer_QueryInterface() failed: %s\n",
- DXGetErrorString8(rc));
- ok(temp_buffer==primary,"COM interface broken: %p != %p\n",temp_buffer,primary);
- ref=IDirectSoundBuffer_Release(temp_buffer);
- ok(ref==1,"IDirectSoundBuffer_Release() has %d references, "
- "should have 1\n",ref);
-
- /* Testing the buffer */
- test_buffer8(dso,primary,1,FALSE,0,FALSE,0,
- winetest_interactive &&
- !(dscaps.dwFlags & DSCAPS_EMULDRIVER),
- 1.0,0,listener,0,0);
- }
-
- /* Testing the reference counting */
- ref=IDirectSound3DListener_Release(listener);
- ok(ref==0,"IDirectSound3DListener_Release() listener has %d "
- "references, should have 0\n",ref);
- }
-
- /* Testing the reference counting */
- ref=IDirectSoundBuffer_Release(primary);
- ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, "
- "should have 0\n",ref);
- }
-
-EXIT:
- ref=IDirectSound8_Release(dso);
- ok(ref==0,"IDirectSound8_Release() has %d references, should have 0\n",ref);
- if (ref!=0)
-return DSERR_GENERIC;
-
- return rc;
-}
-
-static BOOL WINAPI dsenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription,
- LPCSTR lpcstrModule, LPVOID lpContext)
-{
- HRESULT rc;
- trace("*** Testing %s - %s ***\n",lpcstrDescription,lpcstrModule);
-
- rc = test_for_driver8(lpGuid);
- if (rc == DSERR_NODRIVER) {
- trace(" No Driver\n");
- return 1;
- } else if (rc == DSERR_ALLOCATED) {
- trace(" Already In Use\n");
- return 1;
- } else if (rc == E_FAIL) {
- trace(" No Device\n");
- return 1;
- }
-
- trace(" Testing the primary buffer\n");
- test_primary8(lpGuid);
-
- trace(" Testing 3D primary buffer\n");
- test_primary_3d8(lpGuid);
-
- trace(" Testing 3D primary buffer with listener\n");
- test_primary_3d_with_listener8(lpGuid);
-
- /* Testing secondary buffers */
- test_secondary8(lpGuid,winetest_interactive,0,0,0,0,0,0);
- test_secondary8(lpGuid,winetest_interactive,0,0,0,1,0,0);
-
- /* Testing 3D secondary buffers */
- test_secondary8(lpGuid,winetest_interactive,1,0,0,0,0,0);
- test_secondary8(lpGuid,winetest_interactive,1,1,0,0,0,0);
- test_secondary8(lpGuid,winetest_interactive,1,1,0,1,0,0);
- test_secondary8(lpGuid,winetest_interactive,1,0,1,0,0,0);
- test_secondary8(lpGuid,winetest_interactive,1,0,1,1,0,0);
- test_secondary8(lpGuid,winetest_interactive,1,1,1,0,0,0);
- test_secondary8(lpGuid,winetest_interactive,1,1,1,1,0,0);
- test_secondary8(lpGuid,winetest_interactive,1,1,1,0,1,0);
- test_secondary8(lpGuid,winetest_interactive,1,1,1,0,0,1);
- test_secondary8(lpGuid,winetest_interactive,1,1,1,0,1,1);
-
- return 1;
-}
-
-static void ds3d8_tests(void)
-{
- HRESULT rc;
- rc=DirectSoundEnumerateA(&dsenum_callback,NULL);
- ok(rc==DS_OK,"DirectSoundEnumerateA() failed: %s\n",DXGetErrorString8(rc));
-}
-
-START_TEST(ds3d8)
-{
- HMODULE hDsound;
-
- CoInitialize(NULL);
-
- hDsound = LoadLibraryA("dsound.dll");
- if (!hDsound) {
- trace("dsound.dll not found\n");
- return;
- }
-
- trace("DLL Version: %s\n", get_file_version("dsound.dll"));
-
- pDirectSoundCreate8 = (void*)GetProcAddress(hDsound, "DirectSoundCreate8");
- if (!pDirectSoundCreate8) {
- trace("ds3d8 test skipped\n");
- return;
- }
-
- ds3d8_tests();
-
- CoUninitialize();
-}
+++ /dev/null
-/*
- * Tests basic sound playback in DirectSound.
- * In particular we test each standard Windows sound format to make sure
- * we handle the sound card/driver quirks correctly.
- *
- * Part of this test involves playing test tones. But this only makes
- * sense if someone is going to carefully listen to it, and would only
- * bother everyone else.
- * So this is only done if the test is being run in interactive mode.
- *
- * Copyright (c) 2002-2004 Francois Gouget
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#define NONAMELESSSTRUCT
-#define NONAMELESSUNION
-#include <windows.h>
-
-#include "wine/test.h"
-#include "dsound.h"
-#include "dxerr8.h"
-#include "dsconf.h"
-
-#include "dsound_test.h"
-
-static void IDirectSound_test(LPDIRECTSOUND dso, BOOL initialized,
- LPCGUID lpGuid)
-{
- HRESULT rc;
- DSCAPS dscaps;
- int ref;
- IUnknown * unknown;
- IDirectSound * ds;
- IDirectSound8 * ds8;
- DWORD speaker_config, new_speaker_config;
-
- /* Try to Query for objects */
- rc=IDirectSound_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown);
- ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IUnknown) failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK)
- IDirectSound_Release(unknown);
-
- rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds);
- ok(rc==DS_OK,"IDirectSound_QueryInterface(IID_IDirectSound) failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK)
- IDirectSound_Release(ds);
-
- rc=IDirectSound_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8);
- ok(rc==E_NOINTERFACE,"IDirectSound_QueryInterface(IID_IDirectSound8) "
- "should have failed: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK)
- IDirectSound8_Release(ds8);
-
- if (initialized == FALSE) {
- /* try unitialized object */
- rc=IDirectSound_GetCaps(dso,0);
- ok(rc==DSERR_UNINITIALIZED,"IDirectSound_GetCaps(NULL) "
- "should have returned DSERR_UNINITIALIZED, returned: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSound_GetCaps(dso,&dscaps);
- ok(rc==DSERR_UNINITIALIZED,"IDirectSound_GetCaps() "
- "should have returned DSERR_UNINITIALIZED, returned: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSound_Compact(dso);
- ok(rc==DSERR_UNINITIALIZED,"IDirectSound_Compact() "
- "should have returned DSERR_UNINITIALIZED, returned: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSound_GetSpeakerConfig(dso,&speaker_config);
- ok(rc==DSERR_UNINITIALIZED,"IDirectSound_GetSpeakerConfig() "
- "should have returned DSERR_UNINITIALIZED, returned: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSound_Initialize(dso,lpGuid);
- ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL,
- "IDirectSound_Initialize() failed: %s\n",DXGetErrorString8(rc));
- if (rc==DSERR_NODRIVER) {
- trace(" No Driver\n");
- goto EXIT;
- } else if (rc==E_FAIL) {
- trace(" No Device\n");
- goto EXIT;
- } else if (rc==DSERR_ALLOCATED) {
- trace(" Already In Use\n");
- goto EXIT;
- }
- }
-
- rc=IDirectSound_Initialize(dso,lpGuid);
- ok(rc==DSERR_ALREADYINITIALIZED, "IDirectSound_Initialize() "
- "should have returned DSERR_ALREADYINITIALIZED: %s\n",
- DXGetErrorString8(rc));
-
- /* DSOUND: Error: Invalid caps buffer */
- rc=IDirectSound_GetCaps(dso,0);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSound_GetCaps(NULL) "
- "should have returned DSERR_INVALIDPARAM, returned: %s\n",
- DXGetErrorString8(rc));
-
- ZeroMemory(&dscaps, sizeof(dscaps));
-
- /* DSOUND: Error: Invalid caps buffer */
- rc=IDirectSound_GetCaps(dso,&dscaps);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSound_GetCaps() "
- "should have returned DSERR_INVALIDPARAM, returned: %s\n",
- DXGetErrorString8(rc));
-
- dscaps.dwSize=sizeof(dscaps);
-
- /* DSOUND: Running on a certified driver */
- rc=IDirectSound_GetCaps(dso,&dscaps);
- ok(rc==DS_OK,"IDirectSound_GetCaps() failed: %s\n",DXGetErrorString8(rc));
-
- rc=IDirectSound_Compact(dso);
- ok(rc==DSERR_PRIOLEVELNEEDED,"IDirectSound_Compact() failed: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
- ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel() failed: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSound_Compact(dso);
- ok(rc==DS_OK,"IDirectSound_Compact() failed: %s\n",DXGetErrorString8(rc));
-
- rc=IDirectSound_GetSpeakerConfig(dso,0);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSound_GetSpeakerConfig(NULL) "
- "should have returned DSERR_INVALIDPARAM, returned: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSound_GetSpeakerConfig(dso,&speaker_config);
- ok(rc==DS_OK,"IDirectSound_GetSpeakerConfig() failed: %s\n",
- DXGetErrorString8(rc));
-
- speaker_config = DSSPEAKER_COMBINED(DSSPEAKER_STEREO,
- DSSPEAKER_GEOMETRY_WIDE);
- rc=IDirectSound_SetSpeakerConfig(dso,speaker_config);
- ok(rc==DS_OK,"IDirectSound_SetSpeakerConfig() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK) {
- rc=IDirectSound_GetSpeakerConfig(dso,&new_speaker_config);
- ok(rc==DS_OK,"IDirectSound_GetSpeakerConfig() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK && speaker_config!=new_speaker_config)
- trace("IDirectSound_GetSpeakerConfig() failed to set speaker "
- "config: expected 0x%08lx, got 0x%08lx\n",
- speaker_config,new_speaker_config);
- }
-
-EXIT:
- ref=IDirectSound_Release(dso);
- ok(ref==0,"IDirectSound_Release() has %d references, should have 0\n",ref);
-}
-
-static void IDirectSound_tests(void)
-{
- HRESULT rc;
- LPDIRECTSOUND dso=NULL;
-
- trace("Testing IDirectSound\n");
-
- /* try the COM class factory method of creation with no device specified */
- rc=CoCreateInstance(&CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER,
- &IID_IDirectSound, (void**)&dso);
- ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSound) failed: %s\n",
- DXGetErrorString8(rc));
- if (dso)
- IDirectSound_test(dso, FALSE, NULL);
-
- /* try the COM class factory method of creation with default playback
- * device specified */
- rc=CoCreateInstance(&CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER,
- &IID_IDirectSound, (void**)&dso);
- ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSound) failed: %s\n",
- DXGetErrorString8(rc));
- if (dso)
- IDirectSound_test(dso, FALSE, &DSDEVID_DefaultPlayback);
-
- /* try the COM class factory method of creation with default voice
- * playback device specified */
- rc=CoCreateInstance(&CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER,
- &IID_IDirectSound, (void**)&dso);
- ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSound) failed: %s\n",
- DXGetErrorString8(rc));
- if (dso)
- IDirectSound_test(dso, FALSE, &DSDEVID_DefaultVoicePlayback);
-
- /* try the COM class factory method of creation with a bad
- * IID specified */
- rc=CoCreateInstance(&CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER,
- &CLSID_DirectSoundPrivate, (void**)&dso);
- ok(rc==E_NOINTERFACE,
- "CoCreateInstance(CLSID_DirectSound,CLSID_DirectSoundPrivate) "
- "should have failed: %s\n",DXGetErrorString8(rc));
-
- /* try the COM class factory method of creation with a bad
- * GUID and IID specified */
- rc=CoCreateInstance(&CLSID_DirectSoundPrivate, NULL, CLSCTX_INPROC_SERVER,
- &IID_IDirectSound, (void**)&dso);
- ok(rc==REGDB_E_CLASSNOTREG,
- "CoCreateInstance(CLSID_DirectSoundPrivate,IID_IDirectSound) "
- "should have failed: %s\n",DXGetErrorString8(rc));
-
- /* try with no device specified */
- rc=DirectSoundCreate(NULL,&dso,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL,
- "DirectSoundCreate(NULL) failed: %s\n",DXGetErrorString8(rc));
- if (rc==S_OK && dso)
- IDirectSound_test(dso, TRUE, NULL);
-
- /* try with default playback device specified */
- rc=DirectSoundCreate(&DSDEVID_DefaultPlayback,&dso,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL,
- "DirectSoundCreate(DSDEVID_DefaultPlayback) failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK && dso)
- IDirectSound_test(dso, TRUE, NULL);
-
- /* try with default voice playback device specified */
- rc=DirectSoundCreate(&DSDEVID_DefaultVoicePlayback,&dso,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL,
- "DirectSoundCreate(DSDEVID_DefaultVoicePlayback) failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK && dso)
- IDirectSound_test(dso, TRUE, NULL);
-
- /* try with a bad device specified */
- rc=DirectSoundCreate(&DSDEVID_DefaultVoiceCapture,&dso,NULL);
- ok(rc==DSERR_NODRIVER,"DirectSoundCreate(DSDEVID_DefaultVoiceCapture) "
- "should have failed: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK && dso)
- IDirectSound_Release(dso);
-}
-
-static HRESULT test_dsound(LPGUID lpGuid)
-{
- HRESULT rc;
- LPDIRECTSOUND dso=NULL;
- int ref;
-
- /* DSOUND: Error: Invalid interface buffer */
- rc=DirectSoundCreate(lpGuid,0,NULL);
- ok(rc==DSERR_INVALIDPARAM,"DirectSoundCreate() should have returned "
- "DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
-
- /* Create the DirectSound object */
- rc=DirectSoundCreate(lpGuid,&dso,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL,
- "DirectSoundCreate() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return rc;
-
- /* Try the enumerated device */
- IDirectSound_test(dso, TRUE, lpGuid);
-
- /* Try the COM class factory method of creation with enumerated device */
- rc=CoCreateInstance(&CLSID_DirectSound, NULL, CLSCTX_INPROC_SERVER,
- &IID_IDirectSound, (void**)&dso);
- ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSound) failed: %s\n",
- DXGetErrorString8(rc));
- if (dso)
- IDirectSound_test(dso, FALSE, lpGuid);
-
- /* Create a DirectSound object */
- rc=DirectSoundCreate(lpGuid,&dso,NULL);
- ok(rc==DS_OK,"DirectSoundCreate() failed: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK) {
- LPDIRECTSOUND dso1=NULL;
-
- /* Create a second DirectSound object */
- rc=DirectSoundCreate(lpGuid,&dso1,NULL);
- ok(rc==DS_OK,"DirectSoundCreate() failed: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK) {
- /* Release the second DirectSound object */
- ref=IDirectSound_Release(dso1);
- ok(ref==0,"IDirectSound_Release() has %d references, should have "
- "0\n",ref);
- ok(dso!=dso1,"DirectSound objects should be unique: dso=%p,dso1=%p\n",dso,dso1);
- }
-
- /* Release the first DirectSound object */
- ref=IDirectSound_Release(dso);
- ok(ref==0,"IDirectSound_Release() has %d references, should have 0\n",
- ref);
- if (ref!=0)
- return DSERR_GENERIC;
- } else
- return rc;
-
- /* Create a DirectSound object */
- rc=DirectSoundCreate(lpGuid,&dso,NULL);
- ok(rc==DS_OK,"DirectSoundCreate() failed: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK) {
- LPDIRECTSOUNDBUFFER secondary;
- DSBUFFERDESC bufdesc;
- WAVEFORMATEX wfx;
-
- init_format(&wfx,WAVE_FORMAT_PCM,11025,8,1);
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRL3D;
- bufdesc.dwBufferBytes=align(wfx.nAvgBytesPerSec*BUFFER_LEN/1000,
- wfx.nBlockAlign);
- bufdesc.lpwfxFormat=&wfx;
- rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
- ok(rc==DS_OK && secondary!=NULL,
- "IDirectSound_CreateSoundBuffer() failed to create a secondary "
- "buffer %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK && secondary!=NULL) {
- LPDIRECTSOUND3DBUFFER buffer3d;
- rc=IDirectSound_QueryInterface(secondary, &IID_IDirectSound3DBuffer,
- (void **)&buffer3d);
- ok(rc==DS_OK && buffer3d!=NULL,"IDirectSound_QueryInterface() "
- "failed: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK && buffer3d!=NULL) {
- ref=IDirectSound3DBuffer_AddRef(buffer3d);
- ok(ref==2,"IDirectSound3DBuffer_AddRef() has %d references, "
- "should have 2\n",ref);
- }
- ref=IDirectSoundBuffer_AddRef(secondary);
- ok(ref==2,"IDirectSoundBuffer_AddRef() has %d references, "
- "should have 2\n",ref);
- }
- /* release with buffer */
- ref=IDirectSound_Release(dso);
- ok(ref==0,"IDirectSound_Release() has %d references, should have 0\n",
- ref);
- if (ref!=0)
- return DSERR_GENERIC;
- } else
- return rc;
-
- return DS_OK;
-}
-
-static HRESULT test_primary(LPGUID lpGuid)
-{
- HRESULT rc;
- LPDIRECTSOUND dso=NULL;
- LPDIRECTSOUNDBUFFER primary=NULL,second=NULL,third=NULL;
- DSBUFFERDESC bufdesc;
- DSCAPS dscaps;
- WAVEFORMATEX wfx;
- int ref;
-
- /* Create the DirectSound object */
- rc=DirectSoundCreate(lpGuid,&dso,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED,
- "DirectSoundCreate() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return rc;
-
- /* Get the device capabilities */
- ZeroMemory(&dscaps, sizeof(dscaps));
- dscaps.dwSize=sizeof(dscaps);
- rc=IDirectSound_GetCaps(dso,&dscaps);
- ok(rc==DS_OK,"IDirectSound_GetCaps() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- /* DSOUND: Error: Invalid buffer description pointer */
- rc=IDirectSound_CreateSoundBuffer(dso,0,0,NULL);
- ok(rc==DSERR_INVALIDPARAM,
- "IDirectSound_CreateSoundBuffer() should have failed: %s\n",
- DXGetErrorString8(rc));
-
- /* DSOUND: Error: Invalid buffer description pointer */
- rc=IDirectSound_CreateSoundBuffer(dso,0,&primary,NULL);
- ok(rc==DSERR_INVALIDPARAM && primary==0,
- "IDirectSound_CreateSoundBuffer() should have failed: rc=%s,"
- "dsbo=%p\n",DXGetErrorString8(rc),primary);
-
- /* DSOUND: Error: Invalid buffer description pointer */
- rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,0,NULL);
- ok(rc==DSERR_INVALIDPARAM && primary==0,
- "IDirectSound_CreateSoundBuffer() should have failed: rc=%s,"
- "dsbo=0x%p\n",DXGetErrorString8(rc),primary);
-
- ZeroMemory(&bufdesc, sizeof(bufdesc));
-
- /* DSOUND: Error: Invalid size */
- /* DSOUND: Error: Invalid buffer description */
- rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
- ok(rc==DSERR_INVALIDPARAM && primary==0,
- "IDirectSound_CreateSoundBuffer() should have failed: rc=%s,"
- "primary=%p\n",DXGetErrorString8(rc),primary);
-
- /* We must call SetCooperativeLevel before calling CreateSoundBuffer */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
- rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
- ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- /* Testing the primary buffer */
- primary=NULL;
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRLVOLUME;
- bufdesc.lpwfxFormat = &wfx;
- init_format(&wfx,WAVE_FORMAT_PCM,11025,8,2);
- rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSound_CreateSoundBuffer() should have "
- "returned DSERR_INVALIDPARAM, returned: %s\n", DXGetErrorString8(rc));
- if (rc==DS_OK && primary!=NULL)
- IDirectSoundBuffer_Release(primary);
-
- primary=NULL;
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRLVOLUME;
- rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
- ok((rc==DS_OK && primary!=NULL) || (rc==DSERR_CONTROLUNAVAIL),
- "IDirectSound_CreateSoundBuffer() failed to create a primary buffer: "
- "%s\n",DXGetErrorString8(rc));
- if (rc==DSERR_CONTROLUNAVAIL)
- trace(" No Primary\n");
- else if (rc==DS_OK && primary!=NULL) {
- LONG vol;
-
- /* Try to create a second primary buffer */
- /* DSOUND: Error: The primary buffer already exists.
- * Any changes made to the buffer description will be ignored. */
- rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&second,NULL);
- ok(rc==DS_OK && second==primary,
- "IDirectSound_CreateSoundBuffer() should have returned original "
- "primary buffer: %s\n",DXGetErrorString8(rc));
- ref=IDirectSoundBuffer_Release(second);
- ok(ref==1,"IDirectSoundBuffer_Release() primary has %d references, "
- "should have 1\n",ref);
-
- /* Try to duplicate a primary buffer */
- /* DSOUND: Error: Can't duplicate primary buffers */
- rc=IDirectSound_DuplicateSoundBuffer(dso,primary,&third);
- /* rc=0x88780032 */
- ok(rc!=DS_OK,"IDirectSound_DuplicateSoundBuffer() primary buffer "
- "should have failed %s\n",DXGetErrorString8(rc));
-
- rc=IDirectSoundBuffer_GetVolume(primary,&vol);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetVolume() failed: %s\n",
- DXGetErrorString8(rc));
-
- if (winetest_interactive) {
- trace("Playing a 5 seconds reference tone at the current "
- "volume.\n");
- if (rc==DS_OK)
- trace("(the current volume is %ld according to DirectSound)\n",
- vol);
- trace("All subsequent tones should be identical to this one.\n");
- trace("Listen for stutter, changes in pitch, volume, etc.\n");
- }
- test_buffer(dso,primary,1,FALSE,0,FALSE,0,winetest_interactive &&
- !(dscaps.dwFlags & DSCAPS_EMULDRIVER),5.0,0,0,0,0,FALSE,0);
-
- ref=IDirectSoundBuffer_Release(primary);
- ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, "
- "should have 0\n",ref);
- }
-
- /* Set the CooperativeLevel back to normal */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
- rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
- ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel() failed: %s\n",
- DXGetErrorString8(rc));
-
-EXIT:
- ref=IDirectSound_Release(dso);
- ok(ref==0,"IDirectSound_Release() has %d references, should have 0\n",ref);
- if (ref!=0)
- return DSERR_GENERIC;
-
- return rc;
-}
-
-/*
- * Test the primary buffer at different formats while keeping the
- * secondary buffer at a constant format.
- */
-static HRESULT test_primary_secondary(LPGUID lpGuid)
-{
- HRESULT rc;
- LPDIRECTSOUND dso=NULL;
- LPDIRECTSOUNDBUFFER primary=NULL,secondary=NULL;
- DSBUFFERDESC bufdesc;
- DSCAPS dscaps;
- WAVEFORMATEX wfx, wfx2;
- int f,ref;
-
- /* Create the DirectSound object */
- rc=DirectSoundCreate(lpGuid,&dso,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED,
- "DirectSoundCreate() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return rc;
-
- /* Get the device capabilities */
- ZeroMemory(&dscaps, sizeof(dscaps));
- dscaps.dwSize=sizeof(dscaps);
- rc=IDirectSound_GetCaps(dso,&dscaps);
- ok(rc==DS_OK,"IDirectSound_GetCaps() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- /* We must call SetCooperativeLevel before creating primary buffer */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
- rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
- ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER;
- rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
- ok(rc==DS_OK && primary!=NULL,
- "IDirectSound_CreateSoundBuffer() failed to create a primary buffer "
- "%s\n",DXGetErrorString8(rc));
-
- if (rc==DS_OK && primary!=NULL) {
- for (f=0;f<NB_FORMATS;f++) {
- /* We must call SetCooperativeLevel to be allowed to call
- * SetFormat */
- /* DSOUND: Setting DirectSound cooperative level to
- * DSSCL_PRIORITY */
- rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
- ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- init_format(&wfx,WAVE_FORMAT_PCM,formats[f][0],formats[f][1],
- formats[f][2]);
- wfx2=wfx;
- rc=IDirectSoundBuffer_SetFormat(primary,&wfx);
- ok(rc==DS_OK,"IDirectSoundBuffer_SetFormat() failed: %s\n",
- DXGetErrorString8(rc));
-
- /* There is no garantee that SetFormat will actually change the
- * format to what we asked for. It depends on what the soundcard
- * supports. So we must re-query the format.
- */
- rc=IDirectSoundBuffer_GetFormat(primary,&wfx,sizeof(wfx),NULL);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetFormat() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK &&
- (wfx.wFormatTag!=wfx2.wFormatTag ||
- wfx.nSamplesPerSec!=wfx2.nSamplesPerSec ||
- wfx.wBitsPerSample!=wfx2.wBitsPerSample ||
- wfx.nChannels!=wfx2.nChannels)) {
- trace("Requested primary format tag=0x%04x %ldx%dx%d "
- "avg.B/s=%ld align=%d\n",
- wfx2.wFormatTag,wfx2.nSamplesPerSec,wfx2.wBitsPerSample,
- wfx2.nChannels,wfx2.nAvgBytesPerSec,wfx2.nBlockAlign);
- trace("Got tag=0x%04x %ldx%dx%d avg.B/s=%ld align=%d\n",
- wfx.wFormatTag,wfx.nSamplesPerSec,wfx.wBitsPerSample,
- wfx.nChannels,wfx.nAvgBytesPerSec,wfx.nBlockAlign);
- }
-
- /* Set the CooperativeLevel back to normal */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
- rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
- ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel() failed: %s\n",
- DXGetErrorString8(rc));
-
- init_format(&wfx2,WAVE_FORMAT_PCM,11025,16,2);
-
- secondary=NULL;
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
- bufdesc.dwBufferBytes=align(wfx.nAvgBytesPerSec*BUFFER_LEN/1000,
- wfx.nBlockAlign);
- bufdesc.lpwfxFormat=&wfx2;
- if (winetest_interactive) {
- trace(" Testing a primary buffer at %ldx%dx%d with a "
- "secondary buffer at %ldx%dx%d\n",
- wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels,
- wfx2.nSamplesPerSec,wfx2.wBitsPerSample,wfx2.nChannels);
- }
- rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
- ok(rc==DS_OK && secondary!=NULL,
- "IDirectSound_CreateSoundBuffer() failed to create a secondary "
- "buffer %s\n",DXGetErrorString8(rc));
-
- if (rc==DS_OK && secondary!=NULL) {
- test_buffer(dso,secondary,0,FALSE,0,FALSE,0,
- winetest_interactive,1.0,0,NULL,0,0,FALSE,0);
-
- ref=IDirectSoundBuffer_Release(secondary);
- ok(ref==0,"IDirectSoundBuffer_Release() has %d references, "
- "should have 0\n",ref);
- }
- }
-
- ref=IDirectSoundBuffer_Release(primary);
- ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, "
- "should have 0\n",ref);
- }
-
- /* Set the CooperativeLevel back to normal */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
- rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
- ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel() failed: %s\n",
- DXGetErrorString8(rc));
-
-EXIT:
- ref=IDirectSound_Release(dso);
- ok(ref==0,"IDirectSound_Release() has %d references, should have 0\n",ref);
- if (ref!=0)
- return DSERR_GENERIC;
-
- return rc;
-}
-
-static HRESULT test_secondary(LPGUID lpGuid)
-{
- HRESULT rc;
- LPDIRECTSOUND dso=NULL;
- LPDIRECTSOUNDBUFFER primary=NULL,secondary=NULL;
- DSBUFFERDESC bufdesc;
- DSCAPS dscaps;
- WAVEFORMATEX wfx, wfx1;
- DWORD f;
- int ref;
-
- /* Create the DirectSound object */
- rc=DirectSoundCreate(lpGuid,&dso,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED,
- "DirectSoundCreate() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return rc;
-
- /* Get the device capabilities */
- ZeroMemory(&dscaps, sizeof(dscaps));
- dscaps.dwSize=sizeof(dscaps);
- rc=IDirectSound_GetCaps(dso,&dscaps);
- ok(rc==DS_OK,"IDirectSound_GetCaps() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- /* We must call SetCooperativeLevel before creating primary buffer */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
- rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
- ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER;
- rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
- ok(rc==DS_OK && primary!=NULL,
- "IDirectSound_CreateSoundBuffer() failed to create a primary buffer "
- "%s\n",DXGetErrorString8(rc));
-
- if (rc==DS_OK && primary!=NULL) {
- rc=IDirectSoundBuffer_GetFormat(primary,&wfx1,sizeof(wfx1),NULL);
- ok(rc==DS_OK,"IDirectSoundBuffer8_Getformat() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT1;
-
- for (f=0;f<NB_FORMATS;f++) {
- init_format(&wfx,WAVE_FORMAT_PCM,formats[f][0],formats[f][1],
- formats[f][2]);
- secondary=NULL;
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
- bufdesc.dwBufferBytes=align(wfx.nAvgBytesPerSec*BUFFER_LEN/1000,
- wfx.nBlockAlign);
- rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSound_CreateSoundBuffer() "
- "should have returned DSERR_INVALIDPARAM, returned: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK && secondary!=NULL)
- IDirectSoundBuffer_Release(secondary);
-
- secondary=NULL;
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
- bufdesc.dwBufferBytes=align(wfx.nAvgBytesPerSec*BUFFER_LEN/1000,
- wfx.nBlockAlign);
- bufdesc.lpwfxFormat=&wfx;
- if (winetest_interactive) {
- trace(" Testing a secondary buffer at %ldx%dx%d "
- "with a primary buffer at %ldx%dx%d\n",
- wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels,
- wfx1.nSamplesPerSec,wfx1.wBitsPerSample,wfx1.nChannels);
- }
- rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
- ok(rc==DS_OK && secondary!=NULL,
- "IDirectSound_CreateSoundBuffer() failed to create a secondary "
- "buffer %s\n",DXGetErrorString8(rc));
-
- if (rc==DS_OK && secondary!=NULL) {
- test_buffer(dso,secondary,0,FALSE,0,FALSE,0,
- winetest_interactive,1.0,0,NULL,0,0,FALSE,0);
-
- ref=IDirectSoundBuffer_Release(secondary);
- ok(ref==0,"IDirectSoundBuffer_Release() has %d references, "
- "should have 0\n",ref);
- }
- }
-EXIT1:
- ref=IDirectSoundBuffer_Release(primary);
- ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, "
- "should have 0\n",ref);
- }
-
- /* Set the CooperativeLevel back to normal */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
- rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
- ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel() failed: %s\n",
- DXGetErrorString8(rc));
-
-EXIT:
- ref=IDirectSound_Release(dso);
- ok(ref==0,"IDirectSound_Release() has %d references, should have 0\n",ref);
- if (ref!=0)
- return DSERR_GENERIC;
-
- return rc;
-}
-
-static HRESULT test_block_align(LPGUID lpGuid)
-{
- HRESULT rc;
- LPDIRECTSOUND dso=NULL;
- LPDIRECTSOUNDBUFFER secondary=NULL;
- DSBUFFERDESC bufdesc;
- DSBCAPS dsbcaps;
- WAVEFORMATEX wfx;
- int ref;
-
- /* Create the DirectSound object */
- rc=DirectSoundCreate(lpGuid,&dso,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED,
- "DirectSoundCreate() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return rc;
-
- init_format(&wfx,WAVE_FORMAT_PCM,11025,16,2);
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
- bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec + 1;
- bufdesc.lpwfxFormat=&wfx;
- rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
- ok(rc==DS_OK,"IDirectSound_CreateSoundBuffer() "
- "should have returned DS_OK, returned: %s\n",
- DXGetErrorString8(rc));
-
- if (rc==DS_OK && secondary!=NULL) {
- ZeroMemory(&dsbcaps, sizeof(dsbcaps));
- dsbcaps.dwSize = sizeof(dsbcaps);
- rc=IDirectSoundBuffer_GetCaps(secondary,&dsbcaps);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetCaps() should have returned DS_OK, "
- "returned: %s\n", DXGetErrorString8(rc));
- if (rc==DS_OK)
- ok(dsbcaps.dwBufferBytes==(wfx.nAvgBytesPerSec + wfx.nBlockAlign),
- "Buffer size not a multiple of nBlockAlign: requested %ld, "
- "got %ld, should be %ld\n", bufdesc.dwBufferBytes,
- dsbcaps.dwBufferBytes, wfx.nAvgBytesPerSec + wfx.nBlockAlign);
- ref=IDirectSoundBuffer_Release(secondary);
- ok(ref==0,"IDirectSoundBuffer_Release() secondary has %d references, "
- "should have 0\n",ref);
- }
-
- ref=IDirectSound_Release(dso);
- ok(ref==0,"IDirectSound_Release() has %d references, should have 0\n",ref);
- if (ref!=0)
- return DSERR_GENERIC;
-
- return rc;
-}
-
-static struct fmt {
- int bits;
- int channels;
-} fmts[] = { { 8, 1 }, { 8, 2 }, { 16, 1 }, {16, 2 } };
-
-static HRESULT test_frequency(LPGUID lpGuid)
-{
- HRESULT rc;
- LPDIRECTSOUND dso=NULL;
- LPDIRECTSOUNDBUFFER primary=NULL,secondary=NULL;
- DSBUFFERDESC bufdesc;
- DSCAPS dscaps;
- WAVEFORMATEX wfx, wfx1;
- DWORD f, r;
- int ref;
- int rates[] = { 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100,
- 48000, 96000 };
-
- /* Create the DirectSound object */
- rc=DirectSoundCreate(lpGuid,&dso,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED,
- "DirectSoundCreate() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return rc;
-
- /* Get the device capabilities */
- ZeroMemory(&dscaps, sizeof(dscaps));
- dscaps.dwSize=sizeof(dscaps);
- rc=IDirectSound_GetCaps(dso,&dscaps);
- ok(rc==DS_OK,"IDirectSound_GetCaps() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- /* We must call SetCooperativeLevel before creating primary buffer */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
- rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
- ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER;
- rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
- ok(rc==DS_OK && primary!=NULL,
- "IDirectSound_CreateSoundBuffer() failed to create a primary buffer "
- "%s\n",DXGetErrorString8(rc));
-
- if (rc==DS_OK && primary!=NULL) {
- rc=IDirectSoundBuffer_GetFormat(primary,&wfx1,sizeof(wfx1),NULL);
- ok(rc==DS_OK,"IDirectSoundBuffer8_Getformat() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT1;
-
- for (f=0;f<sizeof(fmts)/sizeof(fmts[0]);f++) {
- for (r=0;r<sizeof(rates)/sizeof(rates[0]);r++) {
- init_format(&wfx,WAVE_FORMAT_PCM,11025,fmts[f].bits,
- fmts[f].channels);
- secondary=NULL;
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2|DSBCAPS_CTRLFREQUENCY;
- bufdesc.dwBufferBytes=align((wfx.nAvgBytesPerSec*rates[r]/11025)*
- BUFFER_LEN/1000,wfx.nBlockAlign);
- bufdesc.lpwfxFormat=&wfx;
- if (winetest_interactive) {
- trace(" Testing a secondary buffer at %ldx%dx%d "
- "with a primary buffer at %ldx%dx%d\n",
- wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels,
- wfx1.nSamplesPerSec,wfx1.wBitsPerSample,wfx1.nChannels);
- }
- rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
- ok(rc==DS_OK && secondary!=NULL,
- "IDirectSound_CreateSoundBuffer() failed to create a secondary "
- "buffer %s\n",DXGetErrorString8(rc));
-
- if (rc==DS_OK && secondary!=NULL) {
- test_buffer(dso,secondary,0,FALSE,0,FALSE,0,
- winetest_interactive,1.0,0,NULL,0,0,TRUE,rates[r]);
-
- ref=IDirectSoundBuffer_Release(secondary);
- ok(ref==0,"IDirectSoundBuffer_Release() has %d references, "
- "should have 0\n",ref);
- }
- }
- }
-EXIT1:
- ref=IDirectSoundBuffer_Release(primary);
- ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, "
- "should have 0\n",ref);
- }
-
- /* Set the CooperativeLevel back to normal */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
- rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
- ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel() failed: %s\n",
- DXGetErrorString8(rc));
-
-EXIT:
- ref=IDirectSound_Release(dso);
- ok(ref==0,"IDirectSound_Release() has %d references, should have 0\n",ref);
- if (ref!=0)
- return DSERR_GENERIC;
-
- return rc;
-}
-
-static BOOL WINAPI dsenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription,
- LPCSTR lpcstrModule, LPVOID lpContext)
-{
- HRESULT rc;
- trace("*** Testing %s - %s ***\n",lpcstrDescription,lpcstrModule);
- rc = test_dsound(lpGuid);
- if (rc == DSERR_NODRIVER)
- trace(" No Driver\n");
- else if (rc == DSERR_ALLOCATED)
- trace(" Already In Use\n");
- else if (rc == E_FAIL)
- trace(" No Device\n");
- else {
- test_block_align(lpGuid);
- test_primary(lpGuid);
- test_primary_secondary(lpGuid);
- test_secondary(lpGuid);
- test_frequency(lpGuid);
- }
-
- return 1;
-}
-
-static void dsound_tests(void)
-{
- HRESULT rc;
- rc=DirectSoundEnumerateA(&dsenum_callback,NULL);
- ok(rc==DS_OK,"DirectSoundEnumerateA() failed: %s\n",DXGetErrorString8(rc));
-}
-
-START_TEST(dsound)
-{
- CoInitialize(NULL);
-
- trace("DLL Version: %s\n", get_file_version("dsound.dll"));
-
- IDirectSound_tests();
- dsound_tests();
-
- CoUninitialize();
-}
+++ /dev/null
-/*
- * Tests basic sound playback in DirectSound.
- * In particular we test each standard Windows sound format to make sure
- * we handle the sound card/driver quirks correctly.
- *
- * Part of this test involves playing test tones. But this only makes
- * sense if someone is going to carefully listen to it, and would only
- * bother everyone else.
- * So this is only done if the test is being run in interactive mode.
- *
- * Copyright (c) 2002-2004 Francois Gouget
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#define NONAMELESSSTRUCT
-#define NONAMELESSUNION
-#include <windows.h>
-#include <stdio.h>
-
-#include "wine/test.h"
-#include "dsound.h"
-#include "dxerr8.h"
-#include "dsconf.h"
-
-#include "dsound_test.h"
-
-static HRESULT (WINAPI *pDirectSoundCreate8)(LPCGUID,LPDIRECTSOUND8*,LPUNKNOWN)=NULL;
-
-int align(int length, int align)
-{
- return (length / align) * align;
-}
-
-static void IDirectSound8_test(LPDIRECTSOUND8 dso, BOOL initialized,
- LPCGUID lpGuid)
-{
- HRESULT rc;
- DSCAPS dscaps;
- int ref;
- IUnknown * unknown;
- IDirectSound * ds;
- IDirectSound8 * ds8;
- DWORD speaker_config, new_speaker_config;
- DWORD certified;
-
- /* Try to Query for objects */
- rc=IDirectSound8_QueryInterface(dso,&IID_IUnknown,(LPVOID*)&unknown);
- ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IUnknown) failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK)
- IDirectSound8_Release(unknown);
-
- rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound,(LPVOID*)&ds);
- ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound) failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK)
- IDirectSound_Release(ds);
-
- rc=IDirectSound8_QueryInterface(dso,&IID_IDirectSound8,(LPVOID*)&ds8);
- ok(rc==DS_OK,"IDirectSound8_QueryInterface(IID_IDirectSound8) "
- "should have returned DSERR_INVALIDPARAM, returned: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK)
- IDirectSound8_Release(ds8);
-
- if (initialized == FALSE) {
- /* try unitialized object */
- rc=IDirectSound8_GetCaps(dso,0);
- ok(rc==DSERR_UNINITIALIZED,"IDirectSound8_GetCaps(NULL) "
- "should have returned DSERR_UNINITIALIZED, returned: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSound8_GetCaps(dso,&dscaps);
- ok(rc==DSERR_UNINITIALIZED,"IDirectSound8_GetCaps() "
- "should have returned DSERR_UNINITIALIZED, returned: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSound8_Compact(dso);
- ok(rc==DSERR_UNINITIALIZED,"IDirectSound8_Compact() "
- "should have returned DSERR_UNINITIALIZED, returned: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSound8_GetSpeakerConfig(dso,&speaker_config);
- ok(rc==DSERR_UNINITIALIZED,"IDirectSound8_GetSpeakerConfig() "
- "should have returned DSERR_UNINITIALIZED, returned: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSound8_VerifyCertification(dso, &certified);
- ok(rc==DSERR_UNINITIALIZED,"IDirectSound8_VerifyCertification() "
- "should have returned DSERR_UNINITIALIZED, returned: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSound8_Initialize(dso,lpGuid);
- ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL,
- "IDirectSound8_Initialize() failed: %s\n",DXGetErrorString8(rc));
- if (rc==DSERR_NODRIVER) {
- trace(" No Driver\n");
- goto EXIT;
- } else if (rc==E_FAIL) {
- trace(" No Device\n");
- goto EXIT;
- } else if (rc==DSERR_ALLOCATED) {
- trace(" Already In Use\n");
- goto EXIT;
- }
- }
-
- rc=IDirectSound8_Initialize(dso,lpGuid);
- ok(rc==DSERR_ALREADYINITIALIZED, "IDirectSound8_Initialize() "
- "should have returned DSERR_ALREADYINITIALIZED: %s\n",
- DXGetErrorString8(rc));
-
- /* DSOUND: Error: Invalid caps buffer */
- rc=IDirectSound8_GetCaps(dso,0);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSound8_GetCaps() "
- "should have returned DSERR_INVALIDPARAM, returned: %s\n",
- DXGetErrorString8(rc));
-
- ZeroMemory(&dscaps, sizeof(dscaps));
-
- /* DSOUND: Error: Invalid caps buffer */
- rc=IDirectSound8_GetCaps(dso,&dscaps);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSound8_GetCaps() "
- "should have returned DSERR_INVALIDPARAM, returned: %s\n",
- DXGetErrorString8(rc));
-
- dscaps.dwSize=sizeof(dscaps);
-
- /* DSOUND: Running on a certified driver */
- rc=IDirectSound8_GetCaps(dso,&dscaps);
- ok(rc==DS_OK,"IDirectSound8_GetCaps() failed: %s\n",DXGetErrorString8(rc));
-
- rc=IDirectSound8_Compact(dso);
- ok(rc==DSERR_PRIOLEVELNEEDED,"IDirectSound8_Compact() failed: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
- ok(rc==DS_OK,"IDirectSound8_SetCooperativeLevel() failed: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSound8_Compact(dso);
- ok(rc==DS_OK,"IDirectSound8_Compact() failed: %s\n",DXGetErrorString8(rc));
-
- rc=IDirectSound8_GetSpeakerConfig(dso,0);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSound8_GetSpeakerConfig(NULL) "
- "should have returned DSERR_INVALIDPARAM, returned: %s\n",
- DXGetErrorString8(rc));
-
- rc=IDirectSound8_GetSpeakerConfig(dso,&speaker_config);
- ok(rc==DS_OK,"IDirectSound8_GetSpeakerConfig() failed: %s\n",
- DXGetErrorString8(rc));
-
- speaker_config = DSSPEAKER_COMBINED(DSSPEAKER_STEREO,
- DSSPEAKER_GEOMETRY_WIDE);
- rc=IDirectSound8_SetSpeakerConfig(dso,speaker_config);
- ok(rc==DS_OK,"IDirectSound8_SetSpeakerConfig() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK) {
- rc=IDirectSound8_GetSpeakerConfig(dso,&new_speaker_config);
- ok(rc==DS_OK,"IDirectSound8_GetSpeakerConfig() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK && speaker_config!=new_speaker_config)
- trace("IDirectSound8_GetSpeakerConfig() failed to set speaker "
- "config: expected 0x%08lx, got 0x%08lx\n",
- speaker_config,new_speaker_config);
- }
-
- rc=IDirectSound8_VerifyCertification(dso, &certified);
- ok(rc==DS_OK||rc==E_NOTIMPL,"IDirectSound8_VerifyCertification() failed: %s\n",
- DXGetErrorString8(rc));
-
-EXIT:
- ref=IDirectSound8_Release(dso);
- ok(ref==0,"IDirectSound8_Release() has %d references, should have 0\n",ref);
-}
-
-static void IDirectSound8_tests(void)
-{
- HRESULT rc;
- LPDIRECTSOUND8 dso=NULL;
-
- trace("Testing IDirectSound8\n");
-
- /* try the COM class factory method of creation with no device specified */
- rc=CoCreateInstance(&CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER,
- &IID_IDirectSound8, (void**)&dso);
- ok(rc==S_OK,"CoCreateInstance() failed: %s\n",DXGetErrorString8(rc));
- if (dso)
- IDirectSound8_test(dso, FALSE, NULL);
-
- /* try the COM class factory method of creation with default playback
- * device specified */
- rc=CoCreateInstance(&CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER,
- &IID_IDirectSound8, (void**)&dso);
- ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSound8) failed: %s\n",
- DXGetErrorString8(rc));
- if (dso)
- IDirectSound8_test(dso, FALSE, &DSDEVID_DefaultPlayback);
-
- /* try the COM class factory method of creation with default voice
- * playback device specified */
- rc=CoCreateInstance(&CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER,
- &IID_IDirectSound8, (void**)&dso);
- ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSound8) failed: %s\n",
- DXGetErrorString8(rc));
- if (dso)
- IDirectSound8_test(dso, FALSE, &DSDEVID_DefaultVoicePlayback);
-
- /* try the COM class factory method of creation with a bad
- * IID specified */
- rc=CoCreateInstance(&CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER,
- &CLSID_DirectSoundPrivate, (void**)&dso);
- ok(rc==E_NOINTERFACE,
- "CoCreateInstance(CLSID_DirectSound8,CLSID_DirectSoundPrivate) "
- "should have failed: %s\n",DXGetErrorString8(rc));
-
- /* try the COM class factory method of creation with a bad
- * GUID and IID specified */
- rc=CoCreateInstance(&CLSID_DirectSoundPrivate, NULL, CLSCTX_INPROC_SERVER,
- &IID_IDirectSound8, (void**)&dso);
- ok(rc==REGDB_E_CLASSNOTREG,
- "CoCreateInstance(CLSID_DirectSoundPrivate,IID_IDirectSound8) "
- "should have failed: %s\n",DXGetErrorString8(rc));
-
- /* try with no device specified */
- rc=pDirectSoundCreate8(NULL,&dso,NULL);
- ok(rc==S_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL,
- "DirectSoundCreate8() failed: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK && dso)
- IDirectSound8_test(dso, TRUE, NULL);
-
- /* try with default playback device specified */
- rc=pDirectSoundCreate8(&DSDEVID_DefaultPlayback,&dso,NULL);
- ok(rc==S_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL,
- "DirectSoundCreate8() failed: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK && dso)
- IDirectSound8_test(dso, TRUE, NULL);
-
- /* try with default voice playback device specified */
- rc=pDirectSoundCreate8(&DSDEVID_DefaultVoicePlayback,&dso,NULL);
- ok(rc==S_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL,
- "DirectSoundCreate8() failed: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK && dso)
- IDirectSound8_test(dso, TRUE, NULL);
-
- /* try with a bad device specified */
- rc=pDirectSoundCreate8(&DSDEVID_DefaultVoiceCapture,&dso,NULL);
- ok(rc==DSERR_NODRIVER,"DirectSoundCreate8(DSDEVID_DefaultVoiceCapture) "
- "should have failed: %s\n",DXGetErrorString8(rc));
-}
-
-static HRESULT test_dsound8(LPGUID lpGuid)
-{
- HRESULT rc;
- LPDIRECTSOUND8 dso=NULL;
- int ref;
-
- /* DSOUND: Error: Invalid interface buffer */
- rc=pDirectSoundCreate8(lpGuid,0,NULL);
- ok(rc==DSERR_INVALIDPARAM,"DirectSoundCreate8() should have returned "
- "DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
-
- /* Create the DirectSound8 object */
- rc=pDirectSoundCreate8(lpGuid,&dso,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL,
- "DirectSoundCreate8() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return rc;
-
- /* Try the enumerated device */
- IDirectSound8_test(dso, TRUE, lpGuid);
-
- /* Try the COM class factory method of creation with enumerated device */
- rc=CoCreateInstance(&CLSID_DirectSound8, NULL, CLSCTX_INPROC_SERVER,
- &IID_IDirectSound8, (void**)&dso);
- ok(rc==S_OK,"CoCreateInstance(CLSID_DirectSound) failed: %s\n",
- DXGetErrorString8(rc));
- if (dso)
- IDirectSound8_test(dso, FALSE, lpGuid);
-
- /* Create a DirectSound8 object */
- rc=pDirectSoundCreate8(lpGuid,&dso,NULL);
- ok(rc==DS_OK,"DirectSoundCreate8() failed: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK) {
- LPDIRECTSOUND8 dso1=NULL;
-
- /* Create a second DirectSound8 object */
- rc=pDirectSoundCreate8(lpGuid,&dso1,NULL);
- ok(rc==DS_OK,"DirectSoundCreate8() failed: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK) {
- /* Release the second DirectSound8 object */
- ref=IDirectSound8_Release(dso1);
- ok(ref==0,"IDirectSound8_Release() has %d references, "
- "should have 0\n",ref);
- ok(dso!=dso1,"DirectSound8 objects should be unique: "
- "dso=%p,dso1=%p\n",dso,dso1);
- }
-
- /* Release the first DirectSound8 object */
- ref=IDirectSound8_Release(dso);
- ok(ref==0,"IDirectSound8_Release() has %d references, should have 0\n",
- ref);
- if (ref!=0)
- return DSERR_GENERIC;
- } else
- return rc;
-
- /* Create a DirectSound8 object */
- rc=pDirectSoundCreate8(lpGuid,&dso,NULL);
- ok(rc==DS_OK,"DirectSoundCreate8() failed: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK) {
- LPDIRECTSOUNDBUFFER secondary;
- DSBUFFERDESC bufdesc;
- WAVEFORMATEX wfx;
-
- init_format(&wfx,WAVE_FORMAT_PCM,11025,8,1);
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_CTRL3D;
- bufdesc.dwBufferBytes=align(wfx.nAvgBytesPerSec*BUFFER_LEN/1000,
- wfx.nBlockAlign);
- bufdesc.lpwfxFormat=&wfx;
- rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
- ok(rc==DS_OK && secondary!=NULL,
- "IDirectSound8_CreateSoundBuffer() failed to create a secondary "
- "buffer: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK && secondary!=NULL) {
- LPDIRECTSOUND3DBUFFER buffer3d;
- LPDIRECTSOUNDBUFFER8 buffer8;
- rc=IDirectSound8_QueryInterface(secondary,
- &IID_IDirectSound3DBuffer,
- (void **)&buffer3d);
- ok(rc==DS_OK && buffer3d!=NULL,
- "IDirectSound8_QueryInterface() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK && buffer3d!=NULL) {
- ref=IDirectSound3DBuffer_AddRef(buffer3d);
- ok(ref==2,"IDirectSound3DBuffer_AddRef() has %d references, "
- "should have 2\n",ref);
- }
- rc=IDirectSound8_QueryInterface(secondary,
- &IID_IDirectSoundBuffer8,
- (void **)&buffer8);
- if (rc==DS_OK && buffer8!=NULL) {
- ref=IDirectSoundBuffer8_AddRef(buffer8);
- ok(ref==3,"IDirectSoundBuffer8_AddRef() has %d references, "
- "should have 3\n",ref);
- }
- ref=IDirectSoundBuffer_AddRef(secondary);
- ok(ref==4,"IDirectSoundBuffer_AddRef() has %d references, "
- "should have 4\n",ref);
- }
- /* release with buffer */
- ref=IDirectSound8_Release(dso);
- ok(ref==0,"IDirectSound8_Release() has %d references, should have 0\n",
- ref);
- if (ref!=0)
- return DSERR_GENERIC;
- } else
- return rc;
-
- return DS_OK;
-}
-
-static HRESULT test_primary8(LPGUID lpGuid)
-{
- HRESULT rc;
- LPDIRECTSOUND8 dso=NULL;
- LPDIRECTSOUNDBUFFER primary=NULL,second=NULL,third=NULL;
- DSBUFFERDESC bufdesc;
- DSCAPS dscaps;
- WAVEFORMATEX wfx;
- int ref;
-
- /* Create the DirectSound object */
- rc=pDirectSoundCreate8(lpGuid,&dso,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED,
- "DirectSoundCreate8() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return rc;
-
- /* Get the device capabilities */
- ZeroMemory(&dscaps, sizeof(dscaps));
- dscaps.dwSize=sizeof(dscaps);
- rc=IDirectSound8_GetCaps(dso,&dscaps);
- ok(rc==DS_OK,"IDirectSound8_GetCaps() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- /* DSOUND: Error: Invalid buffer description pointer */
- rc=IDirectSound8_CreateSoundBuffer(dso,0,0,NULL);
- ok(rc==DSERR_INVALIDPARAM,
- "IDirectSound8_CreateSoundBuffer should have returned "
- "DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
-
- /* DSOUND: Error: Invalid buffer description pointer */
- rc=IDirectSound8_CreateSoundBuffer(dso,0,&primary,NULL);
- ok(rc==DSERR_INVALIDPARAM && primary==0,
- "IDirectSound8_CreateSoundBuffer() should have returned "
- "DSERR_INVALIDPARAM, returned: rc=%s,dsbo=%p\n",
- DXGetErrorString8(rc),primary);
-
- /* DSOUND: Error: Invalid buffer description pointer */
- rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,0,NULL);
- ok(rc==DSERR_INVALIDPARAM && primary==0,
- "IDirectSound8_CreateSoundBuffer() should have failed: rc=%s,"
- "dsbo=%p\n",DXGetErrorString8(rc),primary);
-
- ZeroMemory(&bufdesc, sizeof(bufdesc));
-
- /* DSOUND: Error: Invalid size */
- /* DSOUND: Error: Invalid buffer description */
- rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
- ok(rc==DSERR_INVALIDPARAM && primary==0,
- "IDirectSound8_CreateSoundBuffer() should have failed: rc=%s,"
- "primary=%p\n",DXGetErrorString8(rc),primary);
-
- /* We must call SetCooperativeLevel before calling CreateSoundBuffer */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
- rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
- ok(rc==DS_OK,"IDirectSound8_SetCooperativeLevel() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- /* Testing the primary buffer */
- primary=NULL;
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRLVOLUME;
- bufdesc.lpwfxFormat = &wfx;
- init_format(&wfx,WAVE_FORMAT_PCM,11025,8,2);
- rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSound8_CreateSoundBuffer() should have "
- "returned DSERR_INVALIDPARAM, returned: %s\n", DXGetErrorString8(rc));
- if (rc==DS_OK && primary!=NULL)
- IDirectSoundBuffer_Release(primary);
-
- primary=NULL;
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_CTRLVOLUME;
- rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
- ok((rc==DS_OK && primary!=NULL) || (rc==DSERR_CONTROLUNAVAIL),
- "IDirectSound8_CreateSoundBuffer() failed to create a primary buffer: "
- "%s\n",DXGetErrorString8(rc));
- if (rc==DSERR_CONTROLUNAVAIL)
- trace(" No Primary\n");
- else if (rc==DS_OK && primary!=NULL) {
- LONG vol;
-
- /* Try to create a second primary buffer */
- /* DSOUND: Error: The primary buffer already exists.
- * Any changes made to the buffer description will be ignored. */
- rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&second,NULL);
- ok(rc==DS_OK && second==primary,
- "IDirectSound8_CreateSoundBuffer() should have returned original "
- "primary buffer: %s\n",DXGetErrorString8(rc));
- ref=IDirectSoundBuffer_Release(second);
- ok(ref==1,"IDirectSoundBuffer_Release() primary has %d references, "
- "should have 1\n",ref);
-
- /* Try to duplicate a primary buffer */
- /* DSOUND: Error: Can't duplicate primary buffers */
- rc=IDirectSound8_DuplicateSoundBuffer(dso,primary,&third);
- /* rc=0x88780032 */
- ok(rc!=DS_OK,"IDirectSound8_DuplicateSoundBuffer() primary buffer "
- "should have failed %s\n",DXGetErrorString8(rc));
-
- rc=IDirectSoundBuffer_GetVolume(primary,&vol);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetVolume() failed: %s\n",
- DXGetErrorString8(rc));
-
- if (winetest_interactive) {
- trace("Playing a 5 seconds reference tone at the current volume.\n");
- if (rc==DS_OK)
- trace("(the current volume is %ld according to DirectSound)\n",
- vol);
- trace("All subsequent tones should be identical to this one.\n");
- trace("Listen for stutter, changes in pitch, volume, etc.\n");
- }
- test_buffer8(dso,primary,1,FALSE,0,FALSE,0,winetest_interactive &&
- !(dscaps.dwFlags & DSCAPS_EMULDRIVER),5.0,0,0,0,0);
-
- ref=IDirectSoundBuffer_Release(primary);
- ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, "
- "should have 0\n",ref);
- }
-
- /* Set the CooperativeLevel back to normal */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
- rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
- ok(rc==DS_OK,"IDirectSound8_SetCooperativeLevel() failed: %s\n",
- DXGetErrorString8(rc));
-
-EXIT:
- ref=IDirectSound8_Release(dso);
- ok(ref==0,"IDirectSound8_Release() has %d references, should have 0\n",ref);
- if (ref!=0)
- return DSERR_GENERIC;
-
- return rc;
-}
-
-/*
- * Test the primary buffer at different formats while keeping the
- * secondary buffer at a constant format.
- */
-static HRESULT test_primary_secondary8(LPGUID lpGuid)
-{
- HRESULT rc;
- LPDIRECTSOUND8 dso=NULL;
- LPDIRECTSOUNDBUFFER primary=NULL,secondary=NULL;
- DSBUFFERDESC bufdesc;
- DSCAPS dscaps;
- WAVEFORMATEX wfx, wfx2;
- int ref;
- unsigned int f;
-
- /* Create the DirectSound object */
- rc=pDirectSoundCreate8(lpGuid,&dso,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED,
- "DirectSoundCreate8() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return rc;
-
- /* Get the device capabilities */
- ZeroMemory(&dscaps, sizeof(dscaps));
- dscaps.dwSize=sizeof(dscaps);
- rc=IDirectSound8_GetCaps(dso,&dscaps);
- ok(rc==DS_OK,"IDirectSound8_GetCaps() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- /* We must call SetCooperativeLevel before creating primary buffer */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
- rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
- ok(rc==DS_OK,"IDirectSound8_SetCooperativeLevel() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER;
- rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
- ok(rc==DS_OK && primary!=NULL,
- "IDirectSound8_CreateSoundBuffer() failed to create a primary buffer "
- "%s\n",DXGetErrorString8(rc));
-
- if (rc==DS_OK && primary!=NULL) {
- for (f=0;f<NB_FORMATS;f++) {
- /* We must call SetCooperativeLevel to be allowed to call
- * SetFormat */
- /* DSOUND: Setting DirectSound cooperative level to
- * DSSCL_PRIORITY */
- rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
- ok(rc==DS_OK,"IDirectSound8_SetCooperativeLevel() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- init_format(&wfx,WAVE_FORMAT_PCM,formats[f][0],formats[f][1],
- formats[f][2]);
- wfx2=wfx;
- rc=IDirectSoundBuffer_SetFormat(primary,&wfx);
- ok(rc==DS_OK,"IDirectSoundBuffer_SetFormat() failed: %s\n",
- DXGetErrorString8(rc));
-
- /* There is no garantee that SetFormat will actually change the
- * format to what we asked for. It depends on what the soundcard
- * supports. So we must re-query the format.
- */
- rc=IDirectSoundBuffer_GetFormat(primary,&wfx,sizeof(wfx),NULL);
- ok(rc==DS_OK,"IDirectSoundBuffer_GetFormat() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK &&
- (wfx.wFormatTag!=wfx2.wFormatTag ||
- wfx.nSamplesPerSec!=wfx2.nSamplesPerSec ||
- wfx.wBitsPerSample!=wfx2.wBitsPerSample ||
- wfx.nChannels!=wfx2.nChannels)) {
- trace("Requested primary format tag=0x%04x %ldx%dx%d "
- "avg.B/s=%ld align=%d\n",
- wfx2.wFormatTag,wfx2.nSamplesPerSec,wfx2.wBitsPerSample,
- wfx2.nChannels,wfx2.nAvgBytesPerSec,wfx2.nBlockAlign);
- trace("Got tag=0x%04x %ldx%dx%d avg.B/s=%ld align=%d\n",
- wfx.wFormatTag,wfx.nSamplesPerSec,wfx.wBitsPerSample,
- wfx.nChannels,wfx.nAvgBytesPerSec,wfx.nBlockAlign);
- }
-
- /* Set the CooperativeLevel back to normal */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
- rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
- ok(rc==DS_OK,"IDirectSound8_SetCooperativeLevel() failed: %s\n",
- DXGetErrorString8(rc));
-
- init_format(&wfx2,WAVE_FORMAT_PCM,11025,16,2);
-
- secondary=NULL;
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
- bufdesc.dwBufferBytes=align(wfx.nAvgBytesPerSec*BUFFER_LEN/1000,
- wfx.nBlockAlign);
- bufdesc.lpwfxFormat=&wfx2;
- if (winetest_interactive) {
- trace(" Testing a primary buffer at %ldx%dx%d with a "
- "secondary buffer at %ldx%dx%d\n",
- wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels,
- wfx2.nSamplesPerSec,wfx2.wBitsPerSample,wfx2.nChannels);
- }
- rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
- ok(rc==DS_OK && secondary!=NULL,
- "IDirectSound_CreateSoundBuffer() failed to create a secondary "
- "buffer %s\n",DXGetErrorString8(rc));
-
- if (rc==DS_OK && secondary!=NULL) {
- test_buffer8(dso,secondary,0,FALSE,0,FALSE,0,
- winetest_interactive,1.0,0,NULL,0,0);
-
- ref=IDirectSoundBuffer_Release(secondary);
- ok(ref==0,"IDirectSoundBuffer_Release() has %d references, "
- "should have 0\n",ref);
- }
- }
-
- ref=IDirectSoundBuffer_Release(primary);
- ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, "
- "should have 0\n",ref);
- }
-
- /* Set the CooperativeLevel back to normal */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
- rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
- ok(rc==DS_OK,"IDirectSound8_SetCooperativeLevel() failed: %s\n",
- DXGetErrorString8(rc));
-
-EXIT:
- ref=IDirectSound8_Release(dso);
- ok(ref==0,"IDirectSound8_Release() has %d references, should have 0\n",ref);
- if (ref!=0)
- return DSERR_GENERIC;
-
- return rc;
-}
-
-static HRESULT test_secondary8(LPGUID lpGuid)
-{
- HRESULT rc;
- LPDIRECTSOUND8 dso=NULL;
- LPDIRECTSOUNDBUFFER primary=NULL,secondary=NULL;
- DSBUFFERDESC bufdesc;
- DSCAPS dscaps;
- WAVEFORMATEX wfx, wfx1;
- DWORD f;
- int ref;
-
- /* Create the DirectSound object */
- rc=pDirectSoundCreate8(lpGuid,&dso,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED,
- "DirectSoundCreate8() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- return rc;
-
- /* Get the device capabilities */
- ZeroMemory(&dscaps, sizeof(dscaps));
- dscaps.dwSize=sizeof(dscaps);
- rc=IDirectSound8_GetCaps(dso,&dscaps);
- ok(rc==DS_OK,"IDirectSound8_GetCaps() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- /* We must call SetCooperativeLevel before creating primary buffer */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
- rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
- ok(rc==DS_OK,"IDirectSound8_SetCooperativeLevel() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER;
- rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
- ok(rc==DS_OK && primary!=NULL,
- "IDirectSound8_CreateSoundBuffer() failed to create a primary buffer "
- "%s\n",DXGetErrorString8(rc));
-
- if (rc==DS_OK && primary!=NULL) {
- rc=IDirectSoundBuffer_GetFormat(primary,&wfx1,sizeof(wfx1),NULL);
- ok(rc==DS_OK,"IDirectSoundBuffer8_Getformat() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT1;
-
- for (f=0;f<NB_FORMATS;f++) {
- init_format(&wfx,WAVE_FORMAT_PCM,formats[f][0],formats[f][1],
- formats[f][2]);
- secondary=NULL;
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
- bufdesc.dwBufferBytes=align(wfx.nAvgBytesPerSec*BUFFER_LEN/1000,
- wfx.nBlockAlign);
- rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
- ok(rc==DSERR_INVALIDPARAM,"IDirectSound8_CreateSoundBuffer() "
- "should have returned DSERR_INVALIDPARAM, returned: %s\n",
- DXGetErrorString8(rc));
- if (rc==DS_OK && secondary!=NULL)
- IDirectSoundBuffer_Release(secondary);
-
- secondary=NULL;
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_GETCURRENTPOSITION2;
- bufdesc.dwBufferBytes=align(wfx.nAvgBytesPerSec*BUFFER_LEN/1000,
- wfx.nBlockAlign);
- bufdesc.lpwfxFormat=&wfx;
- if (winetest_interactive) {
- trace(" Testing a secondary buffer at %ldx%dx%d "
- "with a primary buffer at %ldx%dx%d\n",
- wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels,
- wfx1.nSamplesPerSec,wfx1.wBitsPerSample,wfx1.nChannels);
- }
- rc=IDirectSound8_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
- ok(rc==DS_OK && secondary!=NULL,
- "IDirectSound8_CreateSoundBuffer() failed to create a secondary "
- "buffer: %s\n",DXGetErrorString8(rc));
-
- if (rc==DS_OK && secondary!=NULL) {
- test_buffer8(dso,secondary,0,FALSE,0,FALSE,0,
- winetest_interactive,1.0,0,NULL,0,0);
-
- ref=IDirectSoundBuffer_Release(secondary);
- ok(ref==0,"IDirectSoundBuffer_Release() has %d references, "
- "should have 0\n",ref);
- }
- }
-EXIT1:
- ref=IDirectSoundBuffer_Release(primary);
- ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, "
- "should have 0\n",ref);
- }
-
- /* Set the CooperativeLevel back to normal */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_NORMAL */
- rc=IDirectSound8_SetCooperativeLevel(dso,get_hwnd(),DSSCL_NORMAL);
- ok(rc==DS_OK,"IDirectSound8_SetCooperativeLevel() failed: %s\n",
- DXGetErrorString8(rc));
-
-EXIT:
- ref=IDirectSound8_Release(dso);
- ok(ref==0,"IDirectSound8_Release() has %d references, should have 0\n",ref);
- if (ref!=0)
- return DSERR_GENERIC;
-
- return rc;
-}
-
-static BOOL WINAPI dsenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription,
- LPCSTR lpcstrModule, LPVOID lpContext)
-{
- HRESULT rc;
- trace("*** Testing %s - %s ***\n",lpcstrDescription,lpcstrModule);
- rc = test_dsound8(lpGuid);
- if (rc == DSERR_NODRIVER)
- trace(" No Driver\n");
- else if (rc == DSERR_ALLOCATED)
- trace(" Already In Use\n");
- else if (rc == E_FAIL)
- trace(" No Device\n");
- else {
- test_primary8(lpGuid);
- test_primary_secondary8(lpGuid);
- test_secondary8(lpGuid);
- }
-
- return 1;
-}
-
-static void dsound8_tests(void)
-{
- HRESULT rc;
- rc=DirectSoundEnumerateA(&dsenum_callback,NULL);
- ok(rc==DS_OK,"DirectSoundEnumerateA() failed: %s\n",DXGetErrorString8(rc));
-}
-
-const char * get_file_version(const char * file_name)
-{
- static char version[32];
- DWORD size;
- DWORD handle;
-
- size = GetFileVersionInfoSizeA("dsound.dll", &handle);
- if (size) {
- char * data = HeapAlloc(GetProcessHeap(), 0, size);
- if (data) {
- if (GetFileVersionInfoA("dsound.dll", handle, size, data)) {
- VS_FIXEDFILEINFO *pFixedVersionInfo;
- UINT len;
- if (VerQueryValueA(data, "\\", (LPVOID *)&pFixedVersionInfo, &len)) {
- sprintf(version, "%ld.%ld.%ld.%ld",
- pFixedVersionInfo->dwFileVersionMS >> 16,
- pFixedVersionInfo->dwFileVersionMS & 0xffff,
- pFixedVersionInfo->dwFileVersionLS >> 16,
- pFixedVersionInfo->dwFileVersionLS & 0xffff);
- } else
- sprintf(version, "not available");
- } else
- sprintf(version, "failed");
-
- HeapFree(GetProcessHeap(), 0, data);
- } else
- sprintf(version, "failed");
- } else
- sprintf(version, "not available");
-
- return version;
-}
-
-START_TEST(dsound8)
-{
- HMODULE hDsound;
-
- CoInitialize(NULL);
-
- hDsound = LoadLibraryA("dsound.dll");
- if (!hDsound) {
- trace("dsound.dll not found\n");
- return;
- }
-
- trace("DLL Version: %s\n", get_file_version("dsound.dll"));
-
- pDirectSoundCreate8 = (void*)GetProcAddress(hDsound, "DirectSoundCreate8");
- if (!pDirectSoundCreate8) {
- trace("dsound8 test skipped\n");
- return;
- }
-
- IDirectSound8_tests();
- dsound8_tests();
-
- CoUninitialize();
-}
+++ /dev/null
-/*
- * Unit tests for dsound functions
- *
- * Copyright (c) 2004 Francois Gouget
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-static const unsigned int formats[][4]={
- { 8000, 8, 1, 0 },
- { 8000, 8, 2, 0 },
- { 8000, 16, 1, 0 },
- { 8000, 16, 2, 0 },
- {11025, 8, 1, WAVE_FORMAT_1M08 },
- {11025, 8, 2, WAVE_FORMAT_1S08 },
- {11025, 16, 1, WAVE_FORMAT_1M16 },
- {11025, 16, 2, WAVE_FORMAT_1S16 },
- {22050, 8, 1, WAVE_FORMAT_2M08 },
- {22050, 8, 2, WAVE_FORMAT_2S08 },
- {22050, 16, 1, WAVE_FORMAT_2M16 },
- {22050, 16, 2, WAVE_FORMAT_2S16 },
- {44100, 8, 1, WAVE_FORMAT_4M08 },
- {44100, 8, 2, WAVE_FORMAT_4S08 },
- {44100, 16, 1, WAVE_FORMAT_4M16 },
- {44100, 16, 2, WAVE_FORMAT_4S16 },
- {48000, 8, 1, WAVE_FORMAT_48M08 },
- {48000, 8, 2, WAVE_FORMAT_48S08 },
- {48000, 16, 1, WAVE_FORMAT_48M16 },
- {48000, 16, 2, WAVE_FORMAT_48S16 },
- {96000, 8, 1, WAVE_FORMAT_96M08 },
- {96000, 8, 2, WAVE_FORMAT_96S08 },
- {96000, 16, 1, WAVE_FORMAT_96M16 },
- {96000, 16, 2, WAVE_FORMAT_96S16 }
-};
-#define NB_FORMATS (sizeof(formats)/sizeof(*formats))
-
-/* The time slice determines how often we will service the buffer */
-#define TIME_SLICE 31
-#define BUFFER_LEN 400
-
-extern char* wave_generate_la(WAVEFORMATEX*,double,DWORD*);
-extern HWND get_hwnd(void);
-extern void init_format(WAVEFORMATEX*,int,int,int,int);
-extern void test_buffer(LPDIRECTSOUND,LPDIRECTSOUNDBUFFER,
- BOOL,BOOL,LONG,BOOL,LONG,BOOL,double,BOOL,
- LPDIRECTSOUND3DLISTENER,BOOL,BOOL,BOOL,DWORD);
-extern void test_buffer8(LPDIRECTSOUND8,LPDIRECTSOUNDBUFFER,
- BOOL,BOOL,LONG,BOOL,LONG,BOOL,double,BOOL,
- LPDIRECTSOUND3DLISTENER,BOOL,BOOL);
-extern const char * getDSBCAPS(DWORD xmask);
-extern int align(int length, int align);
-extern const char * get_file_version(const char * file_name);
+++ /dev/null
-/*
- * Unit tests for CLSID_DirectSoundPrivate property set functions
- * (used by dxdiag)
- *
- * Copyright (c) 2003 Robert Reif
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#define NONAMELESSSTRUCT
-#define NONAMELESSUNION
-#define COBJMACROS
-#include <windows.h>
-
-#include "wine/test.h"
-#include "dsound.h"
-#include "initguid.h"
-#include "dsconf.h"
-#include "dxerr8.h"
-
-#include "dsound_test.h"
-
-#ifndef DSBCAPS_CTRLDEFAULT
-#define DSBCAPS_CTRLDEFAULT \
- DSBCAPS_CTRLFREQUENCY|DSBCAPS_CTRLPAN|DSBCAPS_CTRLVOLUME
-#endif
-
-DEFINE_GUID(DSPROPSETID_VoiceManager, \
- 0x62A69BAE,0xDF9D,0x11D1,0x99,0xA6,0x00,0xC0,0x4F,0xC9,0x9D,0x46);
-DEFINE_GUID(DSPROPSETID_EAX20_ListenerProperties, \
- 0x306a6a8,0xb224,0x11d2,0x99,0xe5,0x0,0x0,0xe8,0xd8,0xc7,0x22);
-DEFINE_GUID(DSPROPSETID_EAX20_BufferProperties, \
- 0x306a6a7,0xb224,0x11d2,0x99,0xe5,0x0,0x0,0xe8,0xd8,0xc7,0x22);
-DEFINE_GUID(DSPROPSETID_I3DL2_ListenerProperties, \
- 0xDA0F0520,0x300A,0x11D3,0x8A,0x2B,0x00,0x60,0x97,0x0D,0xB0,0x11);
-DEFINE_GUID(DSPROPSETID_I3DL2_BufferProperties, \
- 0xDA0F0521,0x300A,0x11D3,0x8A,0x2B,0x00,0x60,0x97,0x0D,0xB0,0x11);
-DEFINE_GUID(DSPROPSETID_ZOOMFX_BufferProperties, \
- 0xCD5368E0,0x3450,0x11D3,0x8B,0x6E,0x00,0x10,0x5A,0x9B,0x7B,0xBC);
-
-typedef HRESULT (CALLBACK * MYPROC)(REFCLSID, REFIID, LPVOID *);
-
-static HRESULT (WINAPI *pDirectSoundCreate8)(LPCGUID,LPDIRECTSOUND8*,
- LPUNKNOWN)=NULL;
-static HRESULT (WINAPI *pDirectSoundCaptureCreate)(LPCGUID,
- LPDIRECTSOUNDCAPTURE*,LPUNKNOWN)=NULL;
-static HRESULT (WINAPI *pDirectSoundCaptureCreate8)(LPCGUID,
- LPDIRECTSOUNDCAPTURE8*,LPUNKNOWN)=NULL;
-static HRESULT (WINAPI *pDirectSoundFullDuplexCreate)(LPCGUID,LPCGUID,
- LPCDSCBUFFERDESC,LPCDSBUFFERDESC,HWND,DWORD,LPDIRECTSOUNDFULLDUPLEX*,
- LPDIRECTSOUNDCAPTUREBUFFER8*,LPDIRECTSOUNDBUFFER8*,LPUNKNOWN)=NULL;
-
-BOOL CALLBACK callback(PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_DATA data,
- LPVOID context)
-{
- trace(" found device:\n");
- trace(" Type: %s\n",
- data->Type == DIRECTSOUNDDEVICE_TYPE_EMULATED ? "Emulated" :
- data->Type == DIRECTSOUNDDEVICE_TYPE_VXD ? "VxD" :
- data->Type == DIRECTSOUNDDEVICE_TYPE_WDM ? "WDM" : "Unknown");
- trace(" DataFlow: %s\n",
- data->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER ? "Render" :
- data->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE ?
- "Capture" : "Unknown");
- trace(" DeviceId: {%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\n",
- data->DeviceId.Data1,data->DeviceId.Data2,data->DeviceId.Data3,
- data->DeviceId.Data4[0],data->DeviceId.Data4[1],
- data->DeviceId.Data4[2],data->DeviceId.Data4[3],
- data->DeviceId.Data4[4],data->DeviceId.Data4[5],
- data->DeviceId.Data4[6],data->DeviceId.Data4[7]);
- trace(" Description: %s\n", data->Description);
- trace(" Module: %s\n", data->Module);
- trace(" Interface: %s\n", data->Interface);
- trace(" WaveDeviceId: %ld\n", data->WaveDeviceId);
-
- return TRUE;
-}
-
-BOOL CALLBACK callback1(PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA data,
- LPVOID context)
-{
- char descriptionA[0x100];
- char moduleA[MAX_PATH];
-
- trace(" found device:\n");
- trace(" Type: %s\n",
- data->Type == DIRECTSOUNDDEVICE_TYPE_EMULATED ? "Emulated" :
- data->Type == DIRECTSOUNDDEVICE_TYPE_VXD ? "VxD" :
- data->Type == DIRECTSOUNDDEVICE_TYPE_WDM ? "WDM" : "Unknown");
- trace(" DataFlow: %s\n",
- data->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER ? "Render" :
- data->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE ?
- "Capture" : "Unknown");
- trace(" DeviceId: {%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\n",
- data->DeviceId.Data1,data->DeviceId.Data2,data->DeviceId.Data3,
- data->DeviceId.Data4[0],data->DeviceId.Data4[1],
- data->DeviceId.Data4[2],data->DeviceId.Data4[3],
- data->DeviceId.Data4[4],data->DeviceId.Data4[5],
- data->DeviceId.Data4[6],data->DeviceId.Data4[7]);
- trace(" DescriptionA: %s\n", data->DescriptionA);
- WideCharToMultiByte(CP_ACP, 0, data->DescriptionW, -1, descriptionA, sizeof(descriptionA), NULL, NULL);
- trace(" DescriptionW: %s\n", descriptionA);
- trace(" ModuleA: %s\n", data->ModuleA);
- WideCharToMultiByte(CP_ACP, 0, data->ModuleW, -1, moduleA, sizeof(moduleA), NULL, NULL);
- trace(" ModuleW: %s\n", moduleA);
- trace(" WaveDeviceId: %ld\n", data->WaveDeviceId);
-
- return TRUE;
-}
-
-BOOL CALLBACK callbackA(PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA data,
- LPVOID context)
-{
- trace(" found device:\n");
- trace(" Type: %s\n",
- data->Type == DIRECTSOUNDDEVICE_TYPE_EMULATED ? "Emulated" :
- data->Type == DIRECTSOUNDDEVICE_TYPE_VXD ? "VxD" :
- data->Type == DIRECTSOUNDDEVICE_TYPE_WDM ? "WDM" : "Unknown");
- trace(" DataFlow: %s\n",
- data->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER ? "Render" :
- data->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE ?
- "Capture" : "Unknown");
- trace(" DeviceId: {%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\n",
- data->DeviceId.Data1,data->DeviceId.Data2,data->DeviceId.Data3,
- data->DeviceId.Data4[0],data->DeviceId.Data4[1],
- data->DeviceId.Data4[2],data->DeviceId.Data4[3],
- data->DeviceId.Data4[4],data->DeviceId.Data4[5],
- data->DeviceId.Data4[6],data->DeviceId.Data4[7]);
- trace(" Description: %s\n", data->Description);
- trace(" Module: %s\n", data->Module);
- trace(" Interface: %s\n", data->Interface);
- trace(" WaveDeviceId: %ld\n", data->WaveDeviceId);
-
- return TRUE;
-}
-
-BOOL CALLBACK callbackW(PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data,
- LPVOID context)
-{
- char descriptionA[0x100];
- char moduleA[MAX_PATH];
- char interfaceA[MAX_PATH];
-
- trace("found device:\n");
- trace("\tType: %s\n",
- data->Type == DIRECTSOUNDDEVICE_TYPE_EMULATED ? "Emulated" :
- data->Type == DIRECTSOUNDDEVICE_TYPE_VXD ? "VxD" :
- data->Type == DIRECTSOUNDDEVICE_TYPE_WDM ? "WDM" : "Unknown");
- trace("\tDataFlow: %s\n",
- data->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER ? "Render" :
- data->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE ?
- "Capture" : "Unknown");
- trace("\tDeviceId: {%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\n",
- data->DeviceId.Data1,data->DeviceId.Data2,data->DeviceId.Data3,
- data->DeviceId.Data4[0],data->DeviceId.Data4[1],
- data->DeviceId.Data4[2],data->DeviceId.Data4[3],
- data->DeviceId.Data4[4],data->DeviceId.Data4[5],
- data->DeviceId.Data4[6],data->DeviceId.Data4[7]);
- WideCharToMultiByte(CP_ACP, 0, data->Description, -1, descriptionA, sizeof(descriptionA), NULL, NULL);
- WideCharToMultiByte(CP_ACP, 0, data->Module, -1, moduleA, sizeof(moduleA), NULL, NULL);
- WideCharToMultiByte(CP_ACP, 0, data->Interface, -1, interfaceA, sizeof(interfaceA), NULL, NULL);
- trace("\tDescription: %s\n", descriptionA);
- trace("\tModule: %s\n", moduleA);
- trace("\tInterface: %s\n", interfaceA);
- trace("\tWaveDeviceId: %ld\n", data->WaveDeviceId);
-
- return TRUE;
-}
-
-static void propset_private_tests(void)
-{
- HMODULE hDsound;
- HRESULT rc;
- IClassFactory * pcf;
- IKsPropertySet * pps;
- MYPROC fProc;
- ULONG support;
-
- hDsound = LoadLibrary("dsound.dll");
- ok(hDsound!=0,"LoadLibrary(dsound.dll) failed\n");
- if (hDsound==0)
- return;
-
- fProc = (MYPROC)GetProcAddress(hDsound, "DllGetClassObject");
-
- /* try direct sound first */
- /* DSOUND: Error: Invalid interface buffer */
- rc = (fProc)(&CLSID_DirectSound, &IID_IClassFactory, (void **)0);
- ok(rc==DSERR_INVALIDPARAM,"DllGetClassObject(CLSID_DirectSound, "
- "IID_IClassFactory) should have returned DSERR_INVALIDPARAM, "
- "returned: %s\n",DXGetErrorString8(rc));
-
- rc = (fProc)(&CLSID_DirectSound, &IID_IClassFactory, (void **)(&pcf));
- ok(pcf!=0, "DllGetClassObject(CLSID_DirectSound, IID_IClassFactory) "
- "failed: %s\n",DXGetErrorString8(rc));
- if (pcf==0)
- goto error;
-
- /* direct sound doesn't have an IKsPropertySet */
- /* DSOUND: Error: Invalid interface buffer */
- rc = IClassFactory_CreateInstance(pcf, NULL, &IID_IKsPropertySet,
- (void **)0);
- ok(rc==DSERR_INVALIDPARAM, "CreateInstance(IID_IKsPropertySet) should have "
- "returned DSERR_INVALIDPARAM, returned: %s\n",DXGetErrorString8(rc));
-
- rc = IClassFactory_CreateInstance(pcf, NULL, &IID_IKsPropertySet,
- (void **)(&pps));
- ok(rc==E_NOINTERFACE, "CreateInstance(IID_IKsPropertySet) should have "
- "returned E_NOINTERFACE, returned: %s\n",DXGetErrorString8(rc));
-
- /* and the direct sound 8 version */
- if (pDirectSoundCreate8) {
- rc = (fProc)(&CLSID_DirectSound8, &IID_IClassFactory, (void **)(&pcf));
- ok(pcf!=0, "DllGetClassObject(CLSID_DirectSound8, IID_IClassFactory) "
- "failed: %s\n",DXGetErrorString8(rc));
- if (pcf==0)
- goto error;
-
- /* direct sound 8 doesn't have an IKsPropertySet */
- rc = IClassFactory_CreateInstance(pcf, NULL, &IID_IKsPropertySet,
- (void **)(&pps));
- ok(rc==E_NOINTERFACE, "CreateInstance(IID_IKsPropertySet) should have "
- "returned E_NOINTERFACE, returned: %s\n",DXGetErrorString8(rc));
- }
-
- /* try direct sound capture next */
- if (pDirectSoundCaptureCreate) {
- rc = (fProc)(&CLSID_DirectSoundCapture, &IID_IClassFactory,
- (void **)(&pcf));
- ok(pcf!=0, "DllGetClassObject(CLSID_DirectSoundCapture, IID_IClassFactory) "
- "failed: %s\n",DXGetErrorString8(rc));
- if (pcf==0)
- goto error;
-
- /* direct sound capture doesn't have an IKsPropertySet */
- rc = IClassFactory_CreateInstance(pcf, NULL, &IID_IKsPropertySet,
- (void **)(&pps));
- ok(rc==E_NOINTERFACE, "CreateInstance(IID_IKsPropertySet) should have "
- "returned E_NOINTERFACE,returned: %s\n",DXGetErrorString8(rc));
- }
-
- /* and the direct sound capture 8 version */
- if (pDirectSoundCaptureCreate8) {
- rc = (fProc)(&CLSID_DirectSoundCapture8, &IID_IClassFactory,
- (void **)(&pcf));
- ok(pcf!=0, "DllGetClassObject(CLSID_DirectSoundCapture8, "
- "IID_IClassFactory) failed: %s\n",DXGetErrorString8(rc));
- if (pcf==0)
- goto error;
-
- /* direct sound capture 8 doesn't have an IKsPropertySet */
- rc = IClassFactory_CreateInstance(pcf, NULL, &IID_IKsPropertySet,
- (void **)(&pps));
- ok(rc==E_NOINTERFACE, "CreateInstance(IID_IKsPropertySet) should have "
- "returned E_NOINTERFACE, returned: %s\n",DXGetErrorString8(rc));
- }
-
- /* try direct sound full duplex next */
- if (pDirectSoundFullDuplexCreate) {
- rc = (fProc)(&CLSID_DirectSoundFullDuplex, &IID_IClassFactory,
- (void **)(&pcf));
- ok(pcf!=0, "DllGetClassObject(CLSID_DirectSoundFullDuplex, "
- "IID_IClassFactory) failed: %s\n",DXGetErrorString8(rc));
- if (pcf==0)
- goto error;
-
- /* direct sound full duplex doesn't have an IKsPropertySet */
- rc = IClassFactory_CreateInstance(pcf, NULL, &IID_IKsPropertySet,
- (void **)(&pps));
- ok(rc==E_NOINTERFACE, "CreateInstance(IID_IKsPropertySet) should have "
- "returned NOINTERFACE, returned: %s\n",DXGetErrorString8(rc));
- }
-
- /* try direct sound private last */
- rc = (fProc)(&CLSID_DirectSoundPrivate, &IID_IClassFactory,
- (void **)(&pcf));
-
- /* some early versions of Direct Sound do not have this */
- if (pcf==0)
- goto error;
-
- /* direct sound private does have an IKsPropertySet */
- rc = IClassFactory_CreateInstance(pcf, NULL, &IID_IKsPropertySet,
- (void **)(&pps));
- ok(rc==DS_OK, "CreateInstance(IID_IKsPropertySet) failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto error;
-
- /* test generic DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION */
- rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice,
- DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION,
- &support);
- ok(rc==DS_OK||rc==E_INVALIDARG,
- "QuerySupport(DSPROPSETID_DirectSoundDevice, "
- "DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION) failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK) {
- if (rc==E_INVALIDARG)
- trace(" Not Supported\n");
- goto error;
- }
-
- ok(support & KSPROPERTY_SUPPORT_GET,
- "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION: "
- "support = 0x%lx\n",support);
- ok(!(support & KSPROPERTY_SUPPORT_SET),
- "Shouldn't be able to set DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION: "
- "support = 0x%lx\n",support);
-
- /* test DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1 */
- rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice,
- DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1,
- &support);
- ok(rc==DS_OK||rc==E_INVALIDARG,
- "QuerySupport(DSPROPSETID_DirectSoundDevice, "
- "DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1) failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK) {
- if (rc==E_INVALIDARG)
- trace(" Not Supported\n");
- goto error;
- }
-
- ok(support & KSPROPERTY_SUPPORT_GET,
- "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1: "
- "support = 0x%lx\n",support);
- ok(!(support & KSPROPERTY_SUPPORT_SET),
- "Shouldn't be able to set DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1: "
- "support = 0x%lx\n",support);
-
- /* test DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A */
- rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice,
- DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A,
- &support);
- ok(rc==DS_OK||rc==E_INVALIDARG,
- "QuerySupport(DSPROPSETID_DirectSoundDevice, "
- "DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A) failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK) {
- if (rc==E_INVALIDARG)
- trace(" Not Supported\n");
- goto error;
- }
-
- ok(support & KSPROPERTY_SUPPORT_GET,
- "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A: "
- "support = 0x%lx\n",support);
- ok(!(support & KSPROPERTY_SUPPORT_SET),
- "Shouldn't be able to set DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A: "
- "support = 0x%lx\n",support);
-
- /* test DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W */
- rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice,
- DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W,
- &support);
- ok(rc==DS_OK||rc==E_INVALIDARG,
- "QuerySupport(DSPROPSETID_DirectSoundDevice, "
- "DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W) failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK) {
- if (rc==E_INVALIDARG)
- trace(" Not Supported\n");
- goto error;
- }
-
- ok(support & KSPROPERTY_SUPPORT_GET,
- "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W: "
- "support = 0x%lx\n",support);
- ok(!(support & KSPROPERTY_SUPPORT_SET),
- "Shouldn't be able to set DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W: "
- "support = 0x%lx\n",support);
-
- /* test generic DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING */
- rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice,
- DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING, &support);
- ok(rc==DS_OK, "QuerySupport(DSPROPSETID_DirectSoundDevice, "
- "DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING) failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto error;
-
- ok(support & KSPROPERTY_SUPPORT_GET,
- "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING: "
- "support = 0x%lx\n",support);
- ok(!(support & KSPROPERTY_SUPPORT_SET), "Shouldn't be able to set "
- "DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING: support = "
- "0x%lx\n",support);
-
- /* test DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A */
- rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice,
- DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A, &support);
- ok(rc==DS_OK, "QuerySupport(DSPROPSETID_DirectSoundDevice, "
- "DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A) failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto error;
-
- ok(support & KSPROPERTY_SUPPORT_GET,
- "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A: "
- "support = 0x%lx\n",support);
- ok(!(support & KSPROPERTY_SUPPORT_SET), "Shouldn't be able to set "
- "DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A: support = "
- "0x%lx\n",support);
-
- /* test DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W */
- rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice,
- DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W, &support);
- ok(rc==DS_OK, "QuerySupport(DSPROPSETID_DirectSoundDevice, "
- "DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W) failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto error;
-
- ok(support & KSPROPERTY_SUPPORT_GET,
- "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W: "
- "support = 0x%lx\n",support);
- ok(!(support & KSPROPERTY_SUPPORT_SET), "Shouldn't be able to set "
- "DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W: support = "
- "0x%lx\n",support);
-
- /* test generic DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE */
- trace("*** Testing DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE ***\n");
- rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice,
- DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE,
- &support);
- ok(rc==DS_OK, "QuerySupport(DSPROPSETID_DirectSoundDevice, "
- "DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE) failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto error;
-
- ok(support & KSPROPERTY_SUPPORT_GET,
- "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE: "
- "support = 0x%lx\n",support);
- ok(!(support & KSPROPERTY_SUPPORT_SET),"Shouldn't be able to set "
- "DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE: support = 0x%lx\n",support);
-
- if (support & KSPROPERTY_SUPPORT_GET) {
- DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_DATA data;
- ULONG bytes;
-
- data.Callback = callback;
- data.Context = 0;
-
- rc = IKsPropertySet_Get(pps, &DSPROPSETID_DirectSoundDevice,
- DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE,
- NULL, 0, &data, sizeof(data), &bytes);
- ok(rc==DS_OK, "Couldn't enumerate: 0x%lx\n",rc);
- }
-
- /* test DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1 */
- trace("*** Testing DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1 ***\n");
- rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice,
- DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1,
- &support);
- ok(rc==DS_OK, "QuerySupport(DSPROPSETID_DirectSoundDevice, "
- "DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1) failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto error;
-
- ok(support & KSPROPERTY_SUPPORT_GET,
- "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1: "
- "support = 0x%lx\n",support);
- ok(!(support & KSPROPERTY_SUPPORT_SET),"Shouldn't be able to set "
- "DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1: support = 0x%lx\n",support);
-
- if (support & KSPROPERTY_SUPPORT_GET) {
- DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1_DATA data;
- ULONG bytes;
-
- data.Callback = callback1;
- data.Context = 0;
-
- rc = IKsPropertySet_Get(pps, &DSPROPSETID_DirectSoundDevice,
- DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1,
- NULL, 0, &data, sizeof(data), &bytes);
- ok(rc==DS_OK, "Couldn't enumerate: 0x%lx\n",rc);
- }
-
- /* test DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A */
- trace("*** Testing DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A ***\n");
- rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice,
- DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A,
- &support);
- ok(rc==DS_OK, "QuerySupport(DSPROPSETID_DirectSoundDevice, "
- "DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A) failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto error;
-
- ok(support & KSPROPERTY_SUPPORT_GET,
- "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A: "
- "support = 0x%lx\n",support);
- ok(!(support & KSPROPERTY_SUPPORT_SET),"Shouldn't be able to set "
- "DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A: support = 0x%lx\n",support);
-
- if (support & KSPROPERTY_SUPPORT_GET) {
- DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA data;
- ULONG bytes;
-
- data.Callback = callbackA;
- data.Context = 0;
-
- rc = IKsPropertySet_Get(pps, &DSPROPSETID_DirectSoundDevice,
- DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A,
- NULL, 0, &data, sizeof(data), &bytes);
- ok(rc==DS_OK, "Couldn't enumerate: 0x%lx\n",rc);
- }
-
- /* test DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W */
- trace("*** Testing DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W ***\n");
- rc = IKsPropertySet_QuerySupport(pps, &DSPROPSETID_DirectSoundDevice,
- DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W,
- &support);
- ok(rc==DS_OK, "QuerySupport(DSPROPSETID_DirectSoundDevice, "
- "DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W) failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto error;
-
- ok(support & KSPROPERTY_SUPPORT_GET,
- "Couldn't get DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W: "
- "support = 0x%lx\n",support);
- ok(!(support & KSPROPERTY_SUPPORT_SET),"Shouldn't be able to set "
- "DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W: support = 0x%lx\n",support);
-
- if (support & KSPROPERTY_SUPPORT_GET) {
- DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA data;
- ULONG bytes;
-
- data.Callback = callbackW;
- data.Context = 0;
-
- rc = IKsPropertySet_Get(pps, &DSPROPSETID_DirectSoundDevice,
- DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W,
- NULL, 0, &data, sizeof(data), &bytes);
- ok(rc==DS_OK, "Couldn't enumerate: 0x%lx\n",rc);
- }
-
-error:
- FreeLibrary(hDsound);
-}
-
-static BOOL WINAPI dsenum_callback(LPGUID lpGuid, LPCSTR lpcstrDescription,
- LPCSTR lpcstrModule, LPVOID lpContext)
-{
- HRESULT rc;
- LPDIRECTSOUND dso=NULL;
- LPDIRECTSOUNDBUFFER primary=NULL,secondary=NULL;
- DSBUFFERDESC bufdesc;
- WAVEFORMATEX wfx;
- int ref;
-
- trace("*** Testing %s - %s ***\n",lpcstrDescription,lpcstrModule);
-
- rc=DirectSoundCreate(lpGuid,&dso,NULL);
- ok(rc==DS_OK||rc==DSERR_NODRIVER||rc==DSERR_ALLOCATED||rc==E_FAIL,
- "DirectSoundCreate() failed: %s\n",DXGetErrorString8(rc));
- if (rc!=DS_OK) {
- if (rc==DSERR_NODRIVER)
- trace(" No Driver\n");
- else if (rc == DSERR_ALLOCATED)
- trace(" Already In Use\n");
- else if (rc == E_FAIL)
- trace(" No Device\n");
- goto EXIT;
- }
-
- /* We must call SetCooperativeLevel before calling CreateSoundBuffer */
- /* DSOUND: Setting DirectSound cooperative level to DSSCL_PRIORITY */
- rc=IDirectSound_SetCooperativeLevel(dso,get_hwnd(),DSSCL_PRIORITY);
- ok(rc==DS_OK,"IDirectSound_SetCooperativeLevel() failed: %s\n",
- DXGetErrorString8(rc));
- if (rc!=DS_OK)
- goto EXIT;
-
- /* Testing 3D buffers */
- primary=NULL;
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_PRIMARYBUFFER|DSBCAPS_LOCHARDWARE|DSBCAPS_CTRL3D;
- rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&primary,NULL);
- ok(rc==DS_OK&&primary!=NULL,"IDirectSound_CreateSoundBuffer() failed to "
- "create a hardware 3D primary buffer: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK&&primary!=NULL) {
- ZeroMemory(&wfx, sizeof(wfx));
- wfx.wFormatTag=WAVE_FORMAT_PCM;
- wfx.nChannels=1;
- wfx.wBitsPerSample=16;
- wfx.nSamplesPerSec=44100;
- wfx.nBlockAlign=wfx.nChannels*wfx.wBitsPerSample/8;
- wfx.nAvgBytesPerSec=wfx.nSamplesPerSec*wfx.nBlockAlign;
- ZeroMemory(&bufdesc, sizeof(bufdesc));
- bufdesc.dwSize=sizeof(bufdesc);
- bufdesc.dwFlags=DSBCAPS_CTRLDEFAULT|DSBCAPS_GETCURRENTPOSITION2;
- bufdesc.dwBufferBytes=wfx.nAvgBytesPerSec;
- bufdesc.lpwfxFormat=&wfx;
- trace(" Testing a secondary buffer at %ldx%dx%d\n",
- wfx.nSamplesPerSec,wfx.wBitsPerSample,wfx.nChannels);
- rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL);
- ok(rc==DS_OK&&secondary!=NULL,"IDirectSound_CreateSoundBuffer() "
- "failed to create a secondary buffer: %s\n",DXGetErrorString8(rc));
- if (rc==DS_OK&&secondary!=NULL) {
- IKsPropertySet * pPropertySet=NULL;
- rc=IDirectSoundBuffer_QueryInterface(secondary,
- &IID_IKsPropertySet,
- (void **)&pPropertySet);
- /* it's not an error for this to fail */
- if(rc==DS_OK) {
- ULONG ulTypeSupport;
- trace(" Supports property sets\n");
- /* it's not an error for these to fail */
- rc=IKsPropertySet_QuerySupport(pPropertySet,
- &DSPROPSETID_VoiceManager,
- 0,&ulTypeSupport);
- if((rc==DS_OK)&&(ulTypeSupport&(KSPROPERTY_SUPPORT_GET|
- KSPROPERTY_SUPPORT_SET)))
- trace(" DSPROPSETID_VoiceManager supported\n");
- else
- trace(" DSPROPSETID_VoiceManager not supported\n");
- rc=IKsPropertySet_QuerySupport(pPropertySet,
- &DSPROPSETID_EAX20_ListenerProperties,0,&ulTypeSupport);
- if((rc==DS_OK)&&(ulTypeSupport&(KSPROPERTY_SUPPORT_GET|
- KSPROPERTY_SUPPORT_SET)))
- trace(" DSPROPSETID_EAX20_ListenerProperties "
- "supported\n");
- else
- trace(" DSPROPSETID_EAX20_ListenerProperties not "
- "supported\n");
- rc=IKsPropertySet_QuerySupport(pPropertySet,
- &DSPROPSETID_EAX20_BufferProperties,0,&ulTypeSupport);
- if((rc==DS_OK)&&(ulTypeSupport&(KSPROPERTY_SUPPORT_GET|
- KSPROPERTY_SUPPORT_SET)))
- trace(" DSPROPSETID_EAX20_BufferProperties supported\n");
- else
- trace(" DSPROPSETID_EAX20_BufferProperties not "
- "supported\n");
- rc=IKsPropertySet_QuerySupport(pPropertySet,
- &DSPROPSETID_I3DL2_ListenerProperties,0,&ulTypeSupport);
- if((rc==DS_OK)&&(ulTypeSupport&(KSPROPERTY_SUPPORT_GET|
- KSPROPERTY_SUPPORT_SET)))
- trace(" DSPROPSETID_I3DL2_ListenerProperties "
- "supported\n");
- else
- trace(" DSPROPSETID_I3DL2_ListenerProperties not "
- "supported\n");
- rc=IKsPropertySet_QuerySupport(pPropertySet,
- &DSPROPSETID_I3DL2_BufferProperties,0,&ulTypeSupport);
- if((rc==DS_OK)&&(ulTypeSupport&(KSPROPERTY_SUPPORT_GET|
- KSPROPERTY_SUPPORT_SET)))
- trace(" DSPROPSETID_I3DL2_BufferProperties supported\n");
- else
- trace(" DSPROPSETID_I3DL2_BufferProperties not "
- "supported\n");
- rc=IKsPropertySet_QuerySupport(pPropertySet,
- &DSPROPSETID_ZOOMFX_BufferProperties,0,&ulTypeSupport);
- if((rc==DS_OK)&&(ulTypeSupport&(KSPROPERTY_SUPPORT_GET|
- KSPROPERTY_SUPPORT_SET)))
- trace(" DSPROPSETID_ZOOMFX_BufferProperties "
- "supported\n");
- else
- trace(" DSPROPSETID_ZOOMFX_BufferProperties not "
- "supported\n");
- ref=IKsPropertySet_Release(pPropertySet);
- /* try a few common ones */
- ok(ref==0,"IKsPropertySet_Release() secondary has %d "
- "references, should have 0\n",ref);
- } else
- trace(" Doesn't support property sets\n");
-
- ref=IDirectSoundBuffer_Release(secondary);
- ok(ref==0,"IDirectSoundBuffer_Release() secondary has %d "
- "references, should have 0\n",ref);
- }
-
- ref=IDirectSoundBuffer_Release(primary);
- ok(ref==0,"IDirectSoundBuffer_Release() primary has %d references, "
- "should have 0\n",ref);
- }
-
-EXIT:
- if (dso!=NULL) {
- ref=IDirectSound_Release(dso);
- ok(ref==0,"IDirectSound_Release() has %d references, should have 0\n",
- ref);
- }
- return 1;
-}
-
-static void propset_buffer_tests(void)
-{
- HRESULT rc;
- rc=DirectSoundEnumerateA(&dsenum_callback,NULL);
- ok(rc==DS_OK,"DirectSoundEnumerateA() failed: %s\n",DXGetErrorString8(rc));
-}
-
-START_TEST(propset)
-{
- HMODULE hDsound;
-
- CoInitialize(NULL);
-
- hDsound = LoadLibraryA("dsound.dll");
- if (!hDsound) {
- trace("dsound.dll not found\n");
- return;
- }
-
- trace("DLL Version: %s\n", get_file_version("dsound.dll"));
-
- pDirectSoundCreate8 = (void*)GetProcAddress(hDsound, "DirectSoundCreate8");
- pDirectSoundCaptureCreate=(void*)GetProcAddress(hDsound,"DirectSoundCaptureCreate");
- pDirectSoundCaptureCreate8=(void*)GetProcAddress(hDsound,"DirectSoundCaptureCreate8");
- pDirectSoundFullDuplexCreate=(void*)GetProcAddress(hDsound,"DirectSoundFullDuplexCreate");
-
- propset_private_tests();
- propset_buffer_tests();
-
- CoUninitialize();
-}
+++ /dev/null
-/*
- * Copyright 2001 Ove Kaaven
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#define WINE_OLESELFREGISTER
-#define WINE_FILEDESCRIPTION_STR "Wine DirectSound"
-#define WINE_FILENAME_STR "dsound.dll"
-#define WINE_FILEVERSION 5,3,1,904
-#define WINE_FILEVERSION_STR "5.3.1.904"
-#define WINE_PRODUCTVERSION 5,3,1,904
-#define WINE_PRODUCTVERSION_STR "5.3.1.904"
-
-#include "wine/wine_common_ver.rc"