From b1fdaa81b05dcf5931e5ab58f3ec640eac60e636 Mon Sep 17 00:00:00 2001 From: Andrew Eikum Date: Sat, 24 Sep 2011 09:02:52 -0500 Subject: [PATCH] dsound: Remove hardware acceleration support. --- dlls/dsound/buffer.c | 320 +++++--------------- dlls/dsound/capture.c | 247 ++++------------ dlls/dsound/dsound.c | 116 +++----- dlls/dsound/dsound_convert.c | 1 - dlls/dsound/dsound_main.c | 60 +--- dlls/dsound/dsound_private.h | 75 ++++- dlls/dsound/duplex.c | 1 - dlls/dsound/mixer.c | 41 +-- dlls/dsound/primary.c | 554 ++++++++++------------------------- dlls/dsound/propset.c | 5 +- dlls/dsound/sound3d.c | 1 - dlls/winealsa.drv/midi.c | 1 - dlls/winealsa.drv/mmdevdrv.c | 1 - dlls/winmm/waveform.c | 68 ----- include/Makefile.in | 1 - include/dsdriver.h | 366 ----------------------- 16 files changed, 415 insertions(+), 1443 deletions(-) delete mode 100644 include/dsdriver.h diff --git a/dlls/dsound/buffer.c b/dlls/dsound/buffer.c index 6ba6c24229f..aa870f44329 100644 --- a/dlls/dsound/buffer.c +++ b/dlls/dsound/buffer.c @@ -31,7 +31,6 @@ #include "vfwmsgs.h" #include "wine/debug.h" #include "dsound.h" -#include "dsdriver.h" #include "dsound_private.h" #include "dsconf.h" @@ -108,13 +107,7 @@ static HRESULT WINAPI IDirectSoundNotifyImpl_SetNotificationPositions( 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) { + 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); @@ -127,11 +120,11 @@ static HRESULT WINAPI IDirectSoundNotifyImpl_SetNotificationPositions( } 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; - } + } else { + HeapFree(GetProcessHeap(), 0, This->dsb->notifies); + This->dsb->notifies = NULL; + This->dsb->nrofnotifies = 0; + } return S_OK; } @@ -242,14 +235,6 @@ static HRESULT WINAPI IDirectSoundBufferImpl_SetVolume(IDirectSoundBuffer8 *ifac 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); /* **** */ @@ -332,18 +317,11 @@ static HRESULT WINAPI IDirectSoundBufferImpl_Play(IDirectSoundBuffer8 *iface, DW RtlAcquireResourceExclusive(&This->lock, TRUE); This->playflags = flags; - if (This->state == STATE_STOPPED && !This->hwbuf) { + if (This->state == STATE_STOPPED) { 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); /* **** */ @@ -368,13 +346,6 @@ static HRESULT WINAPI IDirectSoundBufferImpl_Stop(IDirectSoundBuffer8 *iface) 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); /* **** */ @@ -415,36 +386,31 @@ static HRESULT WINAPI IDirectSoundBufferImpl_GetCurrentPosition(IDirectSoundBuff DWORD *playpos, DWORD *writepos) { IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer8(iface); - HRESULT hres; + DWORD pos; 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; - } + pos = This->sec_mixpos; - if (playpos) - *playpos = pos; - if (writepos) - *writepos = pos; + /* sanity */ + if (pos >= This->buflen){ + FIXME("Bad play position. playpos: %d, buflen: %d\n", pos, This->buflen); + pos %= This->buflen; } - if (writepos && This->state != STATE_STOPPED && (!This->hwbuf || !(This->device->drvdesc.dwFlags & DSDDESC_DONTNEEDWRITELEAD))) { + + if (playpos) + *playpos = pos; + if (writepos) + *writepos = pos; + + if (writepos && This->state != STATE_STOPPED) { /* 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", @@ -554,44 +520,31 @@ static HRESULT WINAPI IDirectSoundBufferImpl_Lock(IDirectSoundBuffer8 *iface, DW /* **** */ 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; - } + 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 { - 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); - } + 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); @@ -623,12 +576,7 @@ static HRESULT WINAPI IDirectSoundBufferImpl_SetCurrentPosition(IDirectSoundBuff or anything like that to reduce latency. 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) + 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); @@ -663,12 +611,6 @@ static HRESULT WINAPI IDirectSoundBufferImpl_SetPan(IDirectSoundBuffer8 *iface, 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); @@ -706,22 +648,10 @@ static HRESULT WINAPI IDirectSoundBufferImpl_Unlock(IDirectSoundBuffer8 *iface, 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)) + if (x1 || x2) { RtlAcquireResourceShared(&This->device->buffer_list_lock, TRUE); LIST_FOR_EACH_ENTRY(iter, &This->buffer->buffers, IDirectSoundBufferImpl, entry ) @@ -836,8 +766,7 @@ static HRESULT WINAPI IDirectSoundBufferImpl_GetCaps(IDirectSoundBuffer8 *iface, } caps->dwFlags = This->dsbd.dwFlags; - if (This->hwbuf) caps->dwFlags |= DSBCAPS_LOCHARDWARE; - else caps->dwFlags |= DSBCAPS_LOCSOFTWARE; + caps->dwFlags |= DSBCAPS_LOCSOFTWARE; caps->dwBufferBytes = This->buflen; @@ -953,7 +882,6 @@ HRESULT IDirectSoundBufferImpl_Create( LPWAVEFORMATEX wfex = dsbd->lpwfxFormat; HRESULT err = DS_OK; DWORD capf = 0; - int use_hw; TRACE("(%p,%p,%p)\n",device,pdsb,dsbd); if (dsbd->dwBufferBytes < DSBSIZE_MIN || dsbd->dwBufferBytes > DSBSIZE_MAX) { @@ -972,10 +900,10 @@ HRESULT IDirectSoundBufferImpl_Create( TRACE("Created buffer at %p\n", dsb); - dsb->ref = 1; - dsb->numIfaces = 1; + dsb->ref = 1; + dsb->numIfaces = 1; dsb->device = device; - dsb->IDirectSoundBuffer8_iface.lpVtbl = &dsbvt; + dsb->IDirectSoundBuffer8_iface.lpVtbl = &dsbvt; dsb->iks = NULL; /* size depends on version */ @@ -999,7 +927,6 @@ HRESULT IDirectSoundBufferImpl_Create( dsb->notify = NULL; dsb->notifies = NULL; dsb->nrofnotifies = 0; - dsb->hwnotify = 0; /* Check necessary hardware mixing capabilities */ if (wfex->nChannels==2) capf |= DSCAPS_SECONDARYSTEREO; @@ -1007,24 +934,7 @@ HRESULT IDirectSoundBufferImpl_Create( 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 */ + TRACE("capf = 0x%08x, device->drvcaps.dwFlags = 0x%08x\n", capf, device->drvcaps.dwFlags); /* Allocate an empty buffer */ dsb->buffer = HeapAlloc(GetProcessHeap(),0,sizeof(*(dsb->buffer))); @@ -1036,35 +946,15 @@ HRESULT IDirectSoundBufferImpl_Create( 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; - } + /* Allocate system memory for buffer */ + 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; } dsb->buffer->ref = 1; @@ -1131,15 +1021,11 @@ void secondarybuffer_destroy(IDirectSoundBufferImpl *This) 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); - } + 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); @@ -1206,20 +1092,6 @@ HRESULT IDirectSoundBufferImpl_Duplicate( return DSERR_OUTOFMEMORY; } - 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->pwfx); - HeapFree(GetProcessHeap(),0,dsb); - *ppdsb = NULL; - return hres; - } - } - dsb->buffer->ref++; list_add_head(&dsb->buffer->buffers, &dsb->entry); dsb->ref = 1; @@ -1304,31 +1176,10 @@ static HRESULT WINAPI IKsBufferPropertySetImpl_Get( 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; - - prop.s.Set = *guidPropSet; - prop.s.Id = dwPropID; - prop.s.Flags = 0; /* unused */ - prop.s.InstanceId = (ULONG)This->dsb->device; - - - hres = IDsDriverPropertySet_Get(ps, &prop, pInstanceData, cbInstanceData, pPropData, cbPropData, pcbReturned); - - IDsDriverPropertySet_Release(ps); - - return hres; - } - } - return E_PROP_ID_UNSUPPORTED; } @@ -1342,28 +1193,9 @@ static HRESULT WINAPI IKsBufferPropertySetImpl_Set( 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; - - prop.s.Set = *guidPropSet; - prop.s.Id = dwPropID; - prop.s.Flags = 0; /* unused */ - prop.s.InstanceId = (ULONG)This->dsb->device; - hres = IDsDriverPropertySet_Set(ps,&prop,pInstanceData,cbInstanceData,pPropData,cbPropData); - - IDsDriverPropertySet_Release(ps); - - return hres; - } - } - return E_PROP_ID_UNSUPPORTED; } @@ -1374,23 +1206,9 @@ static HRESULT WINAPI IKsBufferPropertySetImpl_QuerySupport( 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; } diff --git a/dlls/dsound/capture.c b/dlls/dsound/capture.c index 174355a22f5..4ce087b20c8 100644 --- a/dlls/dsound/capture.c +++ b/dlls/dsound/capture.c @@ -38,7 +38,6 @@ #include "winnls.h" #include "wine/debug.h" #include "dsound.h" -#include "dsdriver.h" #include "dsound_private.h" WINE_DEFAULT_DEBUG_CHANNEL(dsound); @@ -89,8 +88,6 @@ static ULONG WINAPI IDirectSoundCaptureNotifyImpl_Release(LPDIRECTSOUNDNOTIFY if 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); @@ -119,13 +116,7 @@ static HRESULT WINAPI IDirectSoundCaptureNotifyImpl_SetNotificationPositions( 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) { + 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) @@ -202,6 +193,7 @@ IDirectSoundCaptureBufferImpl_QueryInterface( { IDirectSoundCaptureBufferImpl *This = (IDirectSoundCaptureBufferImpl *)iface; HRESULT hres; + TRACE( "(%p,%s,%p)\n", This, debugstr_guid(riid), ppobj ); if (ppobj == NULL) { @@ -212,27 +204,15 @@ IDirectSoundCaptureBufferImpl_QueryInterface( *ppobj = NULL; if ( IsEqualGUID( &IID_IDirectSoundNotify, riid ) ) { - if (!This->notify) + 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; + if(FAILED(hres)) + return hres; } - WARN("IID_IDirectSoundNotify\n"); - return E_FAIL; + IDirectSoundNotify_AddRef((LPDIRECTSOUNDNOTIFY)This->notify); + *ppobj = This->notify; + return DS_OK; } if ( IsEqualGUID( &IID_IDirectSoundCaptureBuffer, riid ) || @@ -277,21 +257,12 @@ IDirectSoundCaptureBufferImpl_Release( LPDIRECTSOUNDCAPTUREBUFFER8 iface ) 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); @@ -346,11 +317,7 @@ IDirectSoundCaptureBufferImpl_GetCurrentPosition( 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) { + if (This->device->hwi) { DWORD pos; EnterCriticalSection(&This->device->lock); @@ -493,14 +460,7 @@ IDirectSoundCaptureBufferImpl_Lock( 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) { + if (This->device->hwi) { *lplpvAudioPtr1 = This->device->buffer + dwReadCusor; if ( (dwReadCusor + dwReadBytes) > This->device->buflen) { *lpdwAudioBytes1 = This->device->buflen - dwReadCusor; @@ -540,7 +500,7 @@ IDirectSoundCaptureBufferImpl_Start( return DSERR_INVALIDPARAM; } - if ( (This->device->driver == 0) && (This->device->hwi == 0) ) { + if ( This->device->hwi == 0 ) { WARN("no driver\n"); return DSERR_NODRIVER; } @@ -557,11 +517,7 @@ IDirectSoundCaptureBufferImpl_Start( 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) { + if (This->device->hwi) { DirectSoundCaptureDevice *device = This->device; if (device->buffer) { @@ -652,11 +608,7 @@ IDirectSoundCaptureBufferImpl_Stop( LPDIRECTSOUNDCAPTUREBUFFER8 iface ) 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) { + if (This->device->hwi) { hres = mmErr(waveInReset(This->device->hwi)); if (hres != DS_OK) WARN("waveInReset() failed\n"); @@ -687,12 +639,7 @@ IDirectSoundCaptureBufferImpl_Unlock( 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) { + if (!This->device->hwi) { WARN("invalid call\n"); hres = DSERR_INVALIDCALL; } @@ -877,7 +824,7 @@ static HRESULT IDirectSoundCaptureBufferImpl_Create( *ppobj = NULL; return DSERR_OUTOFMEMORY; } else { - HRESULT err = DS_OK; + HRESULT err = DS_OK; LPBYTE newbuf; DWORD buflen; IDirectSoundCaptureBufferImpl *This = *ppobj; @@ -885,9 +832,8 @@ static HRESULT IDirectSoundCaptureBufferImpl_Create( This->ref = 1; This->device = device; This->device->capture_buffer = This; - This->notify = NULL; - This->nrofnotifies = 0; - This->hwnotify = NULL; + This->notify = NULL; + This->nrofnotifies = 0; This->pdscbd = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, lpcDSCBufferDesc->dwSize); @@ -903,72 +849,32 @@ static HRESULT IDirectSoundCaptureBufferImpl_Create( This->lpVtbl = &dscbvt; - if (device->driver) { - if (This->device->drvdesc.dwFlags & DSDDESC_DOMMSYSTEMOPEN) - FIXME("DSDDESC_DOMMSYSTEMOPEN not supported\n"); + err = mmErr(waveInOpen(&(device->hwi), + device->drvdesc.dnDevNode, device->pwfx, + (DWORD_PTR)DSOUND_capture_callback, (DWORD_PTR)device, + CALLBACK_FUNCTION | WAVE_MAPPED)); + if (err != DS_OK) { + WARN("waveInOpen failed\n"); + This->device->capture_buffer = 0; + HeapFree( GetProcessHeap(), 0, This ); + *ppobj = NULL; + return err; + } - 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 | WAVE_MAPPED; - 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; - } - } + 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"); @@ -1018,11 +924,6 @@ static ULONG DirectSoundCaptureDevice_Release( 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) ); @@ -1042,6 +943,8 @@ static HRESULT DirectSoundCaptureDevice_Initialize( BOOLEAN found = FALSE; GUID devGUID; DirectSoundCaptureDevice *device = *ppDevice; + WAVEINCAPSA wic; + TRACE("(%p, %s)\n", ppDevice, debugstr_guid(lpcGUID)); /* Default device? */ @@ -1086,64 +989,22 @@ static HRESULT DirectSoundCaptureDevice_Initialize( *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.dwFlags = 0; device->drvdesc.dnDevNode = wid; - /* open the DirectSound driver if available */ - if (device->driver && (err == DS_OK)) - err = IDsCaptureDriver_Open(device->driver); + *ppDevice = device; + + err = mmErr(waveInGetDevCapsA((UINT)device->drvdesc.dnDevNode, &wic, sizeof(wic))); if (err == DS_OK) { - *ppDevice = device; + device->drvcaps.dwFlags = 0; + lstrcpynA(device->drvdesc.szDrvname, wic.szPname, + sizeof(device->drvdesc.szDrvname)); - /* 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; - } - } + device->drvcaps.dwFlags |= DSCCAPS_EMULDRIVER; + device->drvcaps.dwFormats = wic.dwFormats; + device->drvcaps.dwChannels = wic.wChannels; } return err; diff --git a/dlls/dsound/dsound.c b/dlls/dsound/dsound.c index cc27699463e..befa58dc029 100644 --- a/dlls/dsound/dsound.c +++ b/dlls/dsound/dsound.c @@ -37,7 +37,6 @@ #include "ksmedia.h" #include "wine/debug.h" #include "dsound.h" -#include "dsdriver.h" #include "dsound_private.h" WINE_DEFAULT_DEBUG_CHANNEL(dsound); @@ -1265,21 +1264,13 @@ ULONG DirectSoundDevice_Release(DirectSoundDevice * 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); + waveOutClose(device->hwo); 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); + HeapFree(GetProcessHeap(), 0, device->buffer); RtlDeleteResource(&device->buffer_list_lock); device->mixlock.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&device->mixlock); @@ -1350,6 +1341,8 @@ HRESULT DirectSoundDevice_Initialize(DirectSoundDevice ** ppDevice, LPCGUID lpcG BOOLEAN found = FALSE; GUID devGUID; DirectSoundDevice * device = *ppDevice; + WAVEOUTCAPSA woc; + TRACE("(%p,%s)\n",ppDevice,debugstr_guid(lpcGUID)); if (*ppDevice != NULL) { @@ -1406,7 +1399,6 @@ HRESULT DirectSoundDevice_Initialize(DirectSoundDevice ** ppDevice, LPCGUID lpcG *ppDevice = device; device->guid = devGUID; - device->driver = NULL; device->drvdesc.dnDevNode = wod; hr = DSOUND_ReopenDevice(device, FALSE); @@ -1416,59 +1408,50 @@ HRESULT DirectSoundDevice_Initialize(DirectSoundDevice ** ppDevice, LPCGUID lpcG 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 = 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) { @@ -1556,10 +1539,7 @@ HRESULT DirectSoundDevice_CreateSoundBuffer( if (device->primary) { *ppdsb = (IDirectSoundBuffer*)&device->primary->IDirectSoundBuffer8_iface; device->primary->dsbd.dwFlags &= ~(DSBCAPS_LOCHARDWARE | DSBCAPS_LOCSOFTWARE); - if (device->hwbuf) - device->primary->dsbd.dwFlags |= DSBCAPS_LOCHARDWARE; - else - device->primary->dsbd.dwFlags |= DSBCAPS_LOCSOFTWARE; + device->primary->dsbd.dwFlags |= DSBCAPS_LOCSOFTWARE; } else WARN("primarybuffer_create() failed\n"); } diff --git a/dlls/dsound/dsound_convert.c b/dlls/dsound/dsound_convert.c index 057ae16cb0c..63e3dbeb832 100644 --- a/dlls/dsound/dsound_convert.c +++ b/dlls/dsound/dsound_convert.c @@ -46,7 +46,6 @@ #include "winternl.h" #include "wine/debug.h" #include "dsound.h" -#include "dsdriver.h" #include "dsound_private.h" WINE_DEFAULT_DEBUG_CHANNEL(dsound); diff --git a/dlls/dsound/dsound_main.c b/dlls/dsound/dsound_main.c index 81dd7dd91b7..927c04cefc5 100644 --- a/dlls/dsound/dsound_main.c +++ b/dlls/dsound/dsound_main.c @@ -52,7 +52,6 @@ #include "rpcproxy.h" #include "initguid.h" #include "ksmedia.h" -#include "dsdriver.h" #include "dsound_private.h" @@ -93,9 +92,7 @@ HRESULT mmErr(UINT err) 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; @@ -158,20 +155,6 @@ void setup_dsound_options(void) 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); @@ -193,15 +176,8 @@ void setup_dsound_options(void) 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_capture = %d\n", ds_default_capture); 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); @@ -339,11 +315,13 @@ HRESULT WINAPI DirectSoundEnumerateW( LPVOID lpContext ) { unsigned devs, wod; - DSDRIVERDESC desc; GUID guid; int err; - WCHAR wDesc[MAXPNAMELEN]; - WCHAR wName[MAXPNAMELEN]; + WAVEOUTCAPSW caps; + + const static WCHAR winmmW[] = {'w','i','n','m','m','.','d','l','l',0}; + const static WCHAR primary_driverW[] = {'P','r','i','m','a','r','y',' ', + 'S','o','u','n','d',' ','D','r','i','v','e','r',0}; TRACE("lpDSEnumCallback = %p, lpContext = %p\n", lpDSEnumCallback, lpContext); @@ -361,13 +339,11 @@ HRESULT WINAPI DirectSoundEnumerateW( 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,ds_hw_accel)); + err = mmErr(waveOutGetDevCapsW(wod, &caps, sizeof(caps))); 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) + "Primary Sound Driver","",lpContext); + if (lpDSEnumCallback(NULL, primary_driverW, empty, lpContext) == FALSE) return DS_OK; } } @@ -376,19 +352,13 @@ HRESULT WINAPI DirectSoundEnumerateW( } for (wod = 0; wod < devs; ++wod) { - err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,ds_hw_accel)); + err = mmErr(waveOutGetDevCapsW(wod, &caps, sizeof(caps))); 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) ); - wDesc[(sizeof(wDesc)/sizeof(WCHAR)) - 1] = '\0'; + debugstr_guid(&DSOUND_renderer_guids[wod]), + wine_dbgstr_w(caps.szPname),"winmm.dll",lpContext); - MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, - wName, sizeof(wName)/sizeof(WCHAR) ); - wName[(sizeof(wName)/sizeof(WCHAR)) - 1] = '\0'; - - if (lpDSEnumCallback(&DSOUND_renderer_guids[wod], wDesc, wName, lpContext) == FALSE) + if (lpDSEnumCallback(&DSOUND_renderer_guids[wod], caps.szPname, winmmW, lpContext) == FALSE) return DS_OK; } } @@ -464,7 +434,7 @@ DirectSoundCaptureEnumerateW( 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,ds_hw_accel)); + 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); @@ -483,7 +453,7 @@ DirectSoundCaptureEnumerateW( } for (wid = 0; wid < devs; ++wid) { - err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,ds_hw_accel)); + 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); diff --git a/dlls/dsound/dsound_private.h b/dlls/dsound/dsound_private.h index 61c8b0d0f97..633ef4dfc74 100644 --- a/dlls/dsound/dsound_private.h +++ b/dlls/dsound/dsound_private.h @@ -25,18 +25,10 @@ #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 DECLSPEC_HIDDEN; extern int ds_hel_buflen DECLSPEC_HIDDEN; extern int ds_snd_queue_max DECLSPEC_HIDDEN; -extern int ds_snd_queue_min DECLSPEC_HIDDEN; extern int ds_snd_shadow_maxsize DECLSPEC_HIDDEN; -extern int ds_hw_accel DECLSPEC_HIDDEN; extern int ds_default_sample_rate DECLSPEC_HIDDEN; extern int ds_default_bits_per_sample DECLSPEC_HIDDEN; @@ -68,6 +60,66 @@ extern const mixfunc mixfunctions[4] DECLSPEC_HIDDEN; typedef void (*normfunc)(const void *, void *, unsigned); extern const normfunc normfunctions[4] DECLSPEC_HIDDEN; +typedef struct _DSDRIVERDESC +{ + DWORD dwFlags; + CHAR szDesc[256]; + CHAR szDrvname[256]; + DWORD dnDevNode; + WORD wVxdId; + WORD wReserved; + ULONG ulDeviceNum; + DWORD dwHeapType; + LPVOID pvDirectDrawHeap; + DWORD dwMemStartAddress; + DWORD dwMemEndAddress; + DWORD dwMemAllocExtra; + LPVOID pvReserved1; + LPVOID pvReserved2; +} DSDRIVERDESC,*PDSDRIVERDESC; + +typedef struct _DSDRIVERCAPS +{ + DWORD dwFlags; + DWORD dwMinSecondarySampleRate; + DWORD dwMaxSecondarySampleRate; + DWORD dwPrimaryBuffers; + DWORD dwMaxHwMixingAllBuffers; + DWORD dwMaxHwMixingStaticBuffers; + DWORD dwMaxHwMixingStreamingBuffers; + DWORD dwFreeHwMixingAllBuffers; + DWORD dwFreeHwMixingStaticBuffers; + DWORD dwFreeHwMixingStreamingBuffers; + DWORD dwMaxHw3DAllBuffers; + DWORD dwMaxHw3DStaticBuffers; + DWORD dwMaxHw3DStreamingBuffers; + DWORD dwFreeHw3DAllBuffers; + DWORD dwFreeHw3DStaticBuffers; + DWORD dwFreeHw3DStreamingBuffers; + DWORD dwTotalHwMemBytes; + DWORD dwFreeHwMemBytes; + DWORD dwMaxContigFreeHwMemBytes; +} DSDRIVERCAPS,*PDSDRIVERCAPS; + +typedef struct _DSVOLUMEPAN +{ + DWORD dwTotalLeftAmpFactor; + DWORD dwTotalRightAmpFactor; + LONG lVolume; + DWORD dwVolAmpFactor; + LONG lPan; + DWORD dwPanLeftAmpFactor; + DWORD dwPanRightAmpFactor; +} DSVOLUMEPAN,*PDSVOLUMEPAN; + +typedef struct _DSCDRIVERCAPS +{ + DWORD dwSize; + DWORD dwFlags; + DWORD dwFormats; + DWORD dwChannels; +} DSCDRIVERCAPS,*PDSCDRIVERCAPS; + /***************************************************************************** * IDirectSoundDevice implementation structure */ @@ -76,7 +128,6 @@ struct DirectSoundDevice LONG ref; GUID guid; - PIDSDRIVER driver; DSDRIVERDESC drvdesc; DSDRIVERCAPS drvcaps; DWORD priolevel; @@ -85,7 +136,6 @@ struct DirectSoundDevice LPWAVEHDR pwave; UINT timerID, pwplay, pwqueue, prebuf, helfrags; DWORD fraglen; - PIDSDRIVERBUFFER hwbuf; LPBYTE buffer; DWORD writelead, buflen, state, playpos, mixpos; int nrofbuffers; @@ -162,7 +212,6 @@ struct IDirectSoundBufferImpl /* IDirectSoundBufferImpl fields */ DirectSoundDevice* device; RTL_RWLOCK lock; - PIDSDRIVERBUFFER hwbuf; PWAVEFORMATEX pwfx; BufferMemory* buffer; LPBYTE tmp_buffer; @@ -181,7 +230,6 @@ struct IDirectSoundBufferImpl IDirectSoundNotifyImpl* notify; LPDSBPOSITIONNOTIFY notifies; int nrofnotifies; - PIDSDRIVERNOTIFY hwnotify; /* DirectSound3DBuffer fields */ IDirectSound3DBufferImpl* ds3db; @@ -217,10 +265,8 @@ struct DirectSoundCaptureDevice LONG ref; /* DirectSound driver stuff */ - PIDSCDRIVER driver; DSDRIVERDESC drvdesc; DSCDRIVERCAPS drvcaps; - PIDSCDRIVERBUFFER hwbuf; /* wave driver info */ HWAVEIN hwi; @@ -258,7 +304,6 @@ struct IDirectSoundCaptureBufferImpl IDirectSoundCaptureNotifyImpl* notify; LPDSBPOSITIONNOTIFY notifies; int nrofnotifies; - PIDSDRIVERNOTIFY hwnotify; }; /***************************************************************************** diff --git a/dlls/dsound/duplex.c b/dlls/dsound/duplex.c index 4a1fbd20db9..e3477ea016b 100644 --- a/dlls/dsound/duplex.c +++ b/dlls/dsound/duplex.c @@ -33,7 +33,6 @@ #include "winternl.h" #include "wine/debug.h" #include "dsound.h" -#include "dsdriver.h" #include "dsound_private.h" WINE_DEFAULT_DEBUG_CHANNEL(dsound); diff --git a/dlls/dsound/mixer.c b/dlls/dsound/mixer.c index 5ed8d909c9a..e574790798b 100644 --- a/dlls/dsound/mixer.c +++ b/dlls/dsound/mixer.c @@ -38,7 +38,6 @@ #include "dsound.h" #include "ks.h" #include "ksmedia.h" -#include "dsdriver.h" #include "dsound_private.h" WINE_DEFAULT_DEBUG_CHANNEL(dsound); @@ -694,7 +693,7 @@ static DWORD DSOUND_MixToPrimary(const DirectSoundDevice *device, DWORD writepos TRACE("MixToPrimary for %p, state=%d\n", dsb, dsb->state); - if (dsb->buflen && dsb->state && !dsb->hwbuf) { + if (dsb->buflen && dsb->state) { TRACE("Checking %p, mixlen=%d\n", dsb, mixlen); RtlAcquireResourceShared(&dsb->lock, TRUE); /* if buffer is stopping it is stopped now */ @@ -814,7 +813,6 @@ static void DSOUND_PerformMix(DirectSoundDevice *device) 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)); int nfiller; /* the sound of silence */ @@ -835,7 +833,7 @@ static void DSOUND_PerformMix(DirectSoundDevice *device) /* calc maximum prebuff */ prebuff_max = (device->prebuf * device->fraglen); - if (!device->hwbuf && playpos + prebuff_max >= device->helfrags * device->fraglen) + if (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 */ @@ -864,30 +862,22 @@ static void DSOUND_PerformMix(DirectSoundDevice *device) 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; @@ -897,9 +887,6 @@ static void DSOUND_PerformMix(DirectSoundDevice *device) TRACE("prebuff_left = %d, prebuff_max = %dx%d=%d, writelead=%d\n", prebuff_left, device->prebuf, device->fraglen, prebuff_max, writelead); - if (lock) - IDsDriverBuffer_Lock(device->hwbuf, &buf1, &size1, &buf2, &size2, writepos, maxq, 0); - /* do the mixing */ frag = DSOUND_MixToPrimary(device, writepos, maxq, recover, &all_stopped); @@ -916,27 +903,14 @@ static void DSOUND_PerformMix(DirectSoundDevice *device) 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); + /* update the wave queue */ + DSOUND_WaveQueue(device, FALSE); /* buffers are full. start playing if applicable */ if(device->state == STATE_STARTING){ @@ -974,12 +948,7 @@ static void DSOUND_PerformMix(DirectSoundDevice *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); + DSOUND_WaveQueue(device, TRUE); /* in the DSSCL_WRITEPRIMARY mode, the app is totally in charge... */ if (device->state == STATE_STARTING) { diff --git a/dlls/dsound/primary.c b/dlls/dsound/primary.c index c726edf0570..9eb74b7901e 100644 --- a/dlls/dsound/primary.c +++ b/dlls/dsound/primary.c @@ -35,7 +35,6 @@ #include "mmddk.h" #include "wine/debug.h" #include "dsound.h" -#include "dsdriver.h" #include "dsound_private.h" WINE_DEFAULT_DEBUG_CHANNEL(dsound); @@ -78,11 +77,8 @@ static void DSOUND_RecalcPrimary(DirectSoundDevice *device) 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; + /* calculate the 10ms write lead */ + device->writelead = (device->pwfx->nSamplesPerSec / 100) * device->pwfx->nBlockAlign; } HRESULT DSOUND_ReopenDevice(DirectSoundDevice *device, BOOL forcewave) @@ -90,60 +86,17 @@ 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); + 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); + device->drvdesc.dwFlags = 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 | WAVE_MAPPED; - - 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); + hres = mmErr(waveOutOpen(&(device->hwo), device->drvdesc.dnDevNode, + device->pwfx, (DWORD_PTR)DSOUND_callback, (DWORD_PTR)device, + CALLBACK_FUNCTION | WAVE_MAPPED)); + if (FAILED(hres)) { + WARN("waveOutOpen failed: %08x\n", hres); + return hres; + } return hres; } @@ -152,6 +105,11 @@ static HRESULT DSOUND_PrimaryOpen(DirectSoundDevice *device) { DWORD buflen; HRESULT err = DS_OK; + LPBYTE newbuf; + LPWAVEHDR headers = NULL; + DWORD overshot; + unsigned int c; + TRACE("(%p)\n", device); /* on original windows, the buffer it set to a fixed size, no matter what the settings are. @@ -162,122 +120,72 @@ static HRESULT DSOUND_PrimaryOpen(DirectSoundDevice *device) 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); - /* Start in pause mode, to allow buffers to get filled */ - waveOutPause(device->hwo); + TRACE("desired buflen=%d, old buffer=%p\n", buflen, device->buffer); - 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); - /* 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 */ + } - 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)); - 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; + } - 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; - device->buffer = newbuf; - device->pwave = headers; + /* prepare fragment headers */ + for (c=0; chelfrags; 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; + } + } - /* prepare fragment headers */ - for (c=0; chelfrags; 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; + } - 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); - 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); @@ -289,31 +197,22 @@ static HRESULT DSOUND_PrimaryOpen(DirectSoundDevice *device) static void DSOUND_PrimaryClose(DirectSoundDevice *device) { + unsigned c; + 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; chelfrags; c++) + waveOutUnprepareHeader(device->hwo, &device->pwave[c], sizeof(WAVEHDR)); + /* **** */ + EnterCriticalSection(&(device->mixlock)); - /* get out of CS when calling the wave system */ - LeaveCriticalSection(&(device->mixlock)); - /* **** */ - device->pwqueue = (DWORD)-1; /* resetting queues */ - waveOutReset(device->hwo); - for (c=0; chelfrags; 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); - } + /* clear the queue */ + device->pwqueue = 0; } HRESULT DSOUND_PrimaryCreate(DirectSoundDevice *device) @@ -341,15 +240,9 @@ HRESULT DSOUND_PrimaryDestroy(DirectSoundDevice *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; + HeapFree(GetProcessHeap(),0,device->pwave); + HeapFree(GetProcessHeap(),0,device->pwfx); + device->pwfx=NULL; LeaveCriticalSection(&(device->mixlock)); /* **** */ @@ -362,15 +255,9 @@ 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"); - } + err = mmErr(waveOutRestart(device->hwo)); + if (err != DS_OK) + WARN("waveOutRestart failed\n"); return err; } @@ -380,36 +267,15 @@ 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)); - /* don't call the wave system with the lock set */ - LeaveCriticalSection(&(device->mixlock)); - /* **** */ + err = mmErr(waveOutPause(device->hwo)); - err = mmErr(waveOutPause(device->hwo)); + EnterCriticalSection(&(device->mixlock)); - /* **** */ - EnterCriticalSection(&(device->mixlock)); - - if (err != DS_OK) - WARN("waveOutPause failed\n"); - } + if (err != DS_OK) + WARN("waveOutPause failed\n"); return err; } @@ -418,25 +284,18 @@ HRESULT DSOUND_PrimaryGetPosition(DirectSoundDevice *device, LPDWORD playpos, LP { 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); + 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 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; - /* 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; } @@ -515,72 +374,29 @@ HRESULT primarybuffer_SetFormat(DirectSoundDevice *device, LPCWAVEFORMATEX wfex) goto done; } - if (!(device->drvdesc.dwFlags & DSDDESC_DOMMSYSTEMSETFORMAT) && device->hwbuf) { - err = IDsDriverBuffer_SetFormat(device->hwbuf, device->pwfx); + DSOUND_PrimaryClose(device); - /* On bad format, try to re-create, big chance it will work then, only do this if we to */ - if (forced && (device->pwfx->nSamplesPerSec/100 != wfex->nSamplesPerSec/100 || err == DSERR_BADFORMAT)) - { - DWORD cp_size = wfex->wFormatTag == WAVE_FORMAT_PCM ? - sizeof(PCMWAVEFORMAT) : sizeof(WAVEFORMATEX) + wfex->cbSize; - err = DSERR_BUFFERLOST; - CopyMemory(device->pwfx, wfex, cp_size); - } - - if (err != DSERR_BUFFERLOST && FAILED(err)) { - DWORD size = DSOUND_GetFormatSize(oldpwfx); - WARN("IDsDriverBuffer_SetFormat failed\n"); - if (!forced) { - CopyMemory(device->pwfx, oldpwfx, size); - 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); + 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 (err == DSERR_BUFFERLOST) + if (wfex->nSamplesPerSec/100 != device->pwfx->nSamplesPerSec/100 && forced && device->buffer) { DSOUND_PrimaryClose(device); - - err = DSOUND_ReopenDevice(device, FALSE); + device->pwfx->nSamplesPerSec = wfex->nSamplesPerSec; + err = DSOUND_ReopenDevice(device, TRUE); 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); - } + 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); @@ -640,7 +456,7 @@ static HRESULT WINAPI PrimaryBufferImpl_SetVolume( IDirectSoundBufferImpl *This = impl_from_IDirectSoundBuffer(iface); DirectSoundDevice *device = This->device; DWORD ampfactors; - HRESULT hres = DS_OK; + HRESULT hres = DS_OK; TRACE("(%p,%d)\n", iface, vol); if (!(This->dsbd.dwFlags & DSBCAPS_CTRLVOLUME)) { @@ -656,22 +472,16 @@ static HRESULT WINAPI PrimaryBufferImpl_SetVolume( /* **** */ 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); - } - } + 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); + ampfactors = (device->volpan.dwTotalLeftAmpFactor & 0xffff) | (device->volpan.dwTotalRightAmpFactor << 16); + waveOutSetVolume(device->hwo, ampfactors); + } LeaveCriticalSection(&(device->mixlock)); /* **** */ @@ -697,14 +507,12 @@ static HRESULT WINAPI PrimaryBufferImpl_GetVolume( 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; + 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; } @@ -934,34 +742,22 @@ static HRESULT WINAPI PrimaryBufferImpl_Lock( 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; - } + 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 { - 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); - } + *(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; } @@ -999,25 +795,16 @@ static HRESULT WINAPI PrimaryBufferImpl_SetPan( /* **** */ 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); - } - } + 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); + ampfactors = (device->volpan.dwTotalLeftAmpFactor & 0xffff) | (device->volpan.dwTotalRightAmpFactor << 16); + waveOutSetVolume(device->hwo, ampfactors); + } LeaveCriticalSection(&(device->mixlock)); /* **** */ @@ -1043,13 +830,10 @@ static HRESULT WINAPI PrimaryBufferImpl_GetPan( return DSERR_INVALIDPARAM; } - if (!device->hwbuf) - { - waveOutGetVolume(device->hwo, &factors); - device->volpan.dwTotalLeftAmpFactor=ampfactors & 0xffff; - device->volpan.dwTotalRightAmpFactor=ampfactors >> 16; - DSOUND_AmpFactorToVolPan(&device->volpan); - } + 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; } @@ -1066,20 +850,6 @@ static HRESULT WINAPI PrimaryBufferImpl_Unlock( 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; } diff --git a/dlls/dsound/propset.c b/dlls/dsound/propset.c index e2d0e20d5a7..517ccc800f6 100644 --- a/dlls/dsound/propset.c +++ b/dlls/dsound/propset.c @@ -32,7 +32,6 @@ #include "mmddk.h" #include "wine/debug.h" #include "dsound.h" -#include "dsdriver.h" #include "dsound_private.h" #include "dsconf.h" @@ -252,9 +251,9 @@ static HRESULT DSPROPERTY_DescriptionW( } if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) - err = waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,ds_hw_accel); + err = waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0); else - err = waveInMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,ds_hw_accel); + err = waveInMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0); if (err != MMSYSERR_NOERROR) { diff --git a/dlls/dsound/sound3d.c b/dlls/dsound/sound3d.c index e64cd437f37..f4c182f5849 100644 --- a/dlls/dsound/sound3d.c +++ b/dlls/dsound/sound3d.c @@ -50,7 +50,6 @@ #include "mmddk.h" #include "wine/debug.h" #include "dsound.h" -#include "dsdriver.h" #include "dsound_private.h" /* default velocity of sound in the air */ diff --git a/dlls/winealsa.drv/midi.c b/dlls/winealsa.drv/midi.c index 42586b13f30..24fe22734d1 100644 --- a/dlls/winealsa.drv/midi.c +++ b/dlls/winealsa.drv/midi.c @@ -50,7 +50,6 @@ #include "mmddk.h" #include "mmreg.h" #include "dsound.h" -#include "dsdriver.h" #include "wine/debug.h" #include diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c index dd1372b38fd..af367ba94a6 100644 --- a/dlls/winealsa.drv/mmdevdrv.c +++ b/dlls/winealsa.drv/mmdevdrv.c @@ -42,7 +42,6 @@ #include "endpointvolume.h" #include "audioclient.h" #include "audiopolicy.h" -#include "dsdriver.h" #include diff --git a/dlls/winmm/waveform.c b/dlls/winmm/waveform.c index 3ab79766165..cf6f52ea38f 100644 --- a/dlls/winmm/waveform.c +++ b/dlls/winmm/waveform.c @@ -46,11 +46,6 @@ #include "wine/debug.h" -/* TODO: Remove after dsound has been rewritten for mmdevapi */ -#include "dsound.h" -#include "dsdriver.h" -#define DS_HW_ACCEL_FULL 0 - WINE_DEFAULT_DEBUG_CHANNEL(winmm); /* FIXME: Should be localized */ @@ -2763,53 +2758,6 @@ static UINT WINMM_QueryInstanceID(UINT device, WCHAR *str, DWORD_PTR len, return MMSYSERR_NOERROR; } -static UINT WINMM_DRVMessage(UINT dev, UINT message, DWORD_PTR param1, - DWORD_PTR param2, BOOL is_out) -{ - WINE_MLD *wmld; - UINT type = is_out ? MMDRV_WAVEOUT : MMDRV_WAVEIN; - - TRACE("(%u, %u, %ld, %ld, %d)\n", dev, message, param1, param2, is_out); - - if((wmld = MMDRV_Get(ULongToHandle(dev), type, FALSE)) == NULL){ - if((wmld = MMDRV_Get(ULongToHandle(dev), type, TRUE)) != NULL) - return MMDRV_PhysicalFeatures(wmld, message, param1, param2); - return MMSYSERR_INVALHANDLE; - } - - if(message < DRVM_IOCTL || - (message >= DRVM_IOCTL_LAST && message < DRVM_MAPPER)) - return MMSYSERR_INVALPARAM; - - return MMDRV_Message(wmld, message, param1, param2); -} - -static UINT WINMM_FillDSDriverDesc(UINT dev, DSDRIVERDESC *desc, BOOL is_out) -{ - WCHAR *name; - - if(is_out){ - if(dev >= g_outmmdevices_count) - return MMSYSERR_INVALHANDLE; - name = g_out_mmdevices[dev].out_caps.szPname; - }else{ - if(dev >= g_inmmdevices_count) - return MMSYSERR_INVALHANDLE; - name = g_in_mmdevices[dev].in_caps.szPname; - } - - memset(desc, 0, sizeof(*desc)); - - strcpy(desc->szDesc, "WinMM: "); - WideCharToMultiByte(CP_ACP, 0, name, -1, - desc->szDesc + strlen(desc->szDesc), - sizeof(desc->szDesc) - strlen(desc->szDesc), NULL, NULL); - - strcpy(desc->szDrvname, "winmm.dll"); - - return MMSYSERR_NOERROR; -} - /************************************************************************** * waveOutMessage [WINMM.@] */ @@ -2824,14 +2772,6 @@ UINT WINAPI waveOutMessage(HWAVEOUT hWaveOut, UINT uMessage, (DWORD_PTR*)dwParam1, TRUE); case DRV_QUERYFUNCTIONINSTANCEID: return WINMM_QueryInstanceID(HandleToULong(hWaveOut), (WCHAR*)dwParam1, dwParam2, TRUE); - /* TODO: Remove after dsound has been rewritten for mmdevapi */ - case DRV_QUERYDSOUNDDESC: - case DRV_QUERYDSOUNDIFACE: - if(dwParam2 == DS_HW_ACCEL_FULL) - return WINMM_DRVMessage(HandleToULong(hWaveOut), uMessage, - dwParam1, 0, TRUE); - return WINMM_FillDSDriverDesc(HandleToULong(hWaveOut), - (DSDRIVERDESC*)dwParam1, TRUE); } return MMSYSERR_NOTSUPPORTED; @@ -3203,14 +3143,6 @@ UINT WINAPI waveInMessage(HWAVEIN hWaveIn, UINT uMessage, (DWORD_PTR*)dwParam1, FALSE); case DRV_QUERYFUNCTIONINSTANCEID: return WINMM_QueryInstanceID(HandleToULong(hWaveIn), (WCHAR*)dwParam1, dwParam2, FALSE); - /* TODO: Remove after dsound has been rewritten for mmdevapi */ - case DRV_QUERYDSOUNDDESC: - case DRV_QUERYDSOUNDIFACE: - if(dwParam2 == DS_HW_ACCEL_FULL) - return WINMM_DRVMessage(HandleToULong(hWaveIn), uMessage, - dwParam1, 0, FALSE); - return WINMM_FillDSDriverDesc(HandleToULong(hWaveIn), - (DSDRIVERDESC*)dwParam1, FALSE); } return MMSYSERR_NOTSUPPORTED; diff --git a/include/Makefile.in b/include/Makefile.in index f74eece61fa..1aac2c54d06 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -248,7 +248,6 @@ SRCDIR_INCLUDES = \ dplobby8.h \ dpnathlp.h \ dsconf.h \ - dsdriver.h \ dsgetdc.h \ dshow.h \ dsound.h \ diff --git a/include/dsdriver.h b/include/dsdriver.h deleted file mode 100644 index bb7f4c60316..00000000000 --- a/include/dsdriver.h +++ /dev/null @@ -1,366 +0,0 @@ -/* - * DirectSound driver - * (DirectX 5 version) - * - * Copyright (C) 2000 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 - */ - -#ifndef __WINE_DSDRIVER_H -#define __WINE_DSDRIVER_H - -#ifdef __cplusplus -extern "C" { -#endif - -/***************************************************************************** - * Predeclare the interfaces - */ -DEFINE_GUID(IID_IDsDriver, 0x8C4233C0l, 0xB4CC, 0x11CE, 0x92, 0x94, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00); -typedef struct IDsDriver *PIDSDRIVER; - -DEFINE_GUID(IID_IDsDriverBuffer, 0x8C4233C1l, 0xB4CC, 0x11CE, 0x92, 0x94, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00); -typedef struct IDsDriverBuffer *PIDSDRIVERBUFFER; - -DEFINE_GUID(IID_IDsDriverPropertySet, 0x0F6F2E8E0, 0xD842, 0x11D0, 0x8F, 0x75, 0x00, 0xC0, 0x4F, 0xC2, 0x8A, 0xCA); -typedef struct IDsDriverPropertySet *PIDSDRIVERPROPERTYSET; - -DEFINE_GUID(IID_IDsDriverNotify, 0x00363EF44, 0x3B57, 0x11D3, 0xAC, 0x79, 0x00, 0x10, 0x5A, 0x01, 0x7f, 0xe1); -typedef struct IDsDriverNotify *PIDSDRIVERNOTIFY; - -DEFINE_GUID(IID_IDsCaptureDriver, 0x03DD10C47, 0x74FB, 0x11D3, 0x90, 0x49, 0xCB, 0xB4, 0xB3, 0x2E, 0xAA, 0x08); -typedef struct IDsCaptureDriver *PIDSCDRIVER; - -DEFINE_GUID(IID_IDsCaptureDriverBuffer, 0x03DD10C48, 0x74FB, 0x11D3, 0x90, 0x49, 0xCB, 0xB4, 0xB3, 0x2E, 0xAA, 0x08); -typedef struct IDsCaptureDriverBuffer *PIDSCDRIVERBUFFER; - -#define DSDDESC_DOMMSYSTEMOPEN 0x00000001 -#define DSDDESC_DOMMSYSTEMSETFORMAT 0x00000002 -#define DSDDESC_USESYSTEMMEMORY 0x00000004 -#define DSDDESC_DONTNEEDPRIMARYLOCK 0x00000008 -#define DSDDESC_DONTNEEDSECONDARYLOCK 0x00000010 -#define DSDDESC_DONTNEEDWRITELEAD 0x00000020 - -#define DSDHEAP_NOHEAP 0 -#define DSDHEAP_CREATEHEAP 1 -#define DSDHEAP_USEDIRECTDRAWHEAP 2 -#define DSDHEAP_PRIVATEHEAP 3 - -typedef struct _DSDRIVERDESC -{ - DWORD dwFlags; - CHAR szDesc[256]; - CHAR szDrvname[256]; - DWORD dnDevNode; - WORD wVxdId; - WORD wReserved; - ULONG ulDeviceNum; - DWORD dwHeapType; - LPVOID pvDirectDrawHeap; - DWORD dwMemStartAddress; - DWORD dwMemEndAddress; - DWORD dwMemAllocExtra; - LPVOID pvReserved1; - LPVOID pvReserved2; -} DSDRIVERDESC,*PDSDRIVERDESC; - -typedef struct _DSDRIVERCAPS -{ - DWORD dwFlags; - DWORD dwMinSecondarySampleRate; - DWORD dwMaxSecondarySampleRate; - DWORD dwPrimaryBuffers; - DWORD dwMaxHwMixingAllBuffers; - DWORD dwMaxHwMixingStaticBuffers; - DWORD dwMaxHwMixingStreamingBuffers; - DWORD dwFreeHwMixingAllBuffers; - DWORD dwFreeHwMixingStaticBuffers; - DWORD dwFreeHwMixingStreamingBuffers; - DWORD dwMaxHw3DAllBuffers; - DWORD dwMaxHw3DStaticBuffers; - DWORD dwMaxHw3DStreamingBuffers; - DWORD dwFreeHw3DAllBuffers; - DWORD dwFreeHw3DStaticBuffers; - DWORD dwFreeHw3DStreamingBuffers; - DWORD dwTotalHwMemBytes; - DWORD dwFreeHwMemBytes; - DWORD dwMaxContigFreeHwMemBytes; -} DSDRIVERCAPS,*PDSDRIVERCAPS; - -typedef struct _DSVOLUMEPAN -{ - DWORD dwTotalLeftAmpFactor; - DWORD dwTotalRightAmpFactor; - LONG lVolume; - DWORD dwVolAmpFactor; - LONG lPan; - DWORD dwPanLeftAmpFactor; - DWORD dwPanRightAmpFactor; -} DSVOLUMEPAN,*PDSVOLUMEPAN; - -typedef union _DSPROPERTY -{ - struct { - GUID Set; - ULONG Id; - ULONG Flags; - ULONG InstanceId; - } DUMMYSTRUCTNAME; - ULONGLONG Alignment; -} DSPROPERTY,*PDSPROPERTY; - -typedef struct _DSCDRIVERCAPS -{ - DWORD dwSize; - DWORD dwFlags; - DWORD dwFormats; - DWORD dwChannels; -} DSCDRIVERCAPS,*PDSCDRIVERCAPS; - -/***************************************************************************** - * IDsDriver interface - */ -#define INTERFACE IDsDriver -DECLARE_INTERFACE_(IDsDriver,IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - /*** IDsDriver methods ***/ - STDMETHOD(GetDriverDesc)(THIS_ PDSDRIVERDESC pDsDriverDesc) PURE; - STDMETHOD(Open)(THIS) PURE; - STDMETHOD(Close)(THIS) PURE; - STDMETHOD(GetCaps)(THIS_ PDSDRIVERCAPS pDsDrvCaps) PURE; - STDMETHOD(CreateSoundBuffer)(THIS_ LPWAVEFORMATEX pwfx,DWORD dwFlags,DWORD dwCardAddress,LPDWORD pdwcbBufferSize,LPBYTE *ppbBuffer,LPVOID *ppvObj) PURE; - STDMETHOD(DuplicateSoundBuffer)(THIS_ PIDSDRIVERBUFFER pIDsDriverBuffer,LPVOID *ppvObj) PURE; -}; -#undef INTERFACE - -#if !defined (__cplusplus) || defined(CINTERFACE) - /*** IUnknown methods ***/ -#define IDsDriver_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDsDriver_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDsDriver_Release(p) (p)->lpVtbl->Release(p) - /*** IDsDriver methods ***/ -#define IDsDriver_GetDriverDesc(p,a) (p)->lpVtbl->GetDriverDesc(p,a) -#define IDsDriver_Open(p) (p)->lpVtbl->Open(p) -#define IDsDriver_Close(p) (p)->lpVtbl->Close(p) -#define IDsDriver_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a) -#define IDsDriver_CreateSoundBuffer(p,a,b,c,d,e,f) (p)->lpVtbl->CreateSoundBuffer(p,a,b,c,d,e,f) -#define IDsDriver_DuplicateSoundBuffer(p,a,b) (p)->lpVtbl->DuplicateSoundBuffer(p,a,b) -#endif - -/***************************************************************************** - * IDsDriverBuffer interface - */ -#define INTERFACE IDsDriverBuffer -DECLARE_INTERFACE_(IDsDriverBuffer,IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - /*** IDsDriverBuffer methods ***/ - STDMETHOD(Lock)(THIS_ LPVOID *ppvAudio1,LPDWORD pdwLen1,LPVOID *pdwAudio2,LPDWORD pdwLen2,DWORD dwWritePosition,DWORD dwWriteLen,DWORD dwFlags) PURE; - STDMETHOD(Unlock)(THIS_ LPVOID pvAudio1,DWORD dwLen1,LPVOID pvAudio2,DWORD dwLen2) PURE; - STDMETHOD(SetFormat)(THIS_ LPWAVEFORMATEX pwfxToSet) PURE; - STDMETHOD(SetFrequency)(THIS_ DWORD dwFrequency) PURE; - STDMETHOD(SetVolumePan)(THIS_ PDSVOLUMEPAN pDsVolumePan) PURE; - STDMETHOD(SetPosition)(THIS_ DWORD dwNewPosition) PURE; - STDMETHOD(GetPosition)(THIS_ LPDWORD lpdwCurrentPlayCursor,LPDWORD lpdwCurrentWriteCursor) PURE; - STDMETHOD(Play)(THIS_ DWORD dwReserved1,DWORD dwReserved2,DWORD dwFlags) PURE; - STDMETHOD(Stop)(THIS) PURE; -}; -#undef INTERFACE - -#if !defined (__cplusplus) || defined(CINTERFACE) - /*** IUnknown methods ***/ -#define IDsDriverBuffer_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDsDriverBuffer_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDsDriverBuffer_Release(p) (p)->lpVtbl->Release(p) - /*** IDsDriverBuffer methods ***/ -#define IDsDriverBuffer_Lock(p,a,b,c,d,e,f,g) (p)->lpVtbl->Lock(p,a,b,c,d,e,f,g) -#define IDsDriverBuffer_Unlock(p,a,b,c,d) (p)->lpVtbl->Unlock(p,a,b,c,d) -#define IDsDriverBuffer_SetFormat(p,a) (p)->lpVtbl->SetFormat(p,a) -#define IDsDriverBuffer_SetFrequency(p,a) (p)->lpVtbl->SetFrequency(p,a) -#define IDsDriverBuffer_SetVolumePan(p,a) (p)->lpVtbl->SetVolumePan(p,a) -#define IDsDriverBuffer_SetPosition(p,a) (p)->lpVtbl->SetPosition(p,a) -#define IDsDriverBuffer_GetPosition(p,a,b) (p)->lpVtbl->GetPosition(p,a,b) -#define IDsDriverBuffer_Play(p,a,b,c) (p)->lpVtbl->Play(p,a,b,c) -#define IDsDriverBuffer_Stop(p) (p)->lpVtbl->Stop(p) -#endif - -/***************************************************************************** - * IDsDriverPropertySet interface - */ -#define INTERFACE IDsDriverPropertySet -DECLARE_INTERFACE_(IDsDriverPropertySet,IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - /*** IDsDriverPropertySet methods ***/ - STDMETHOD(Get)(THIS_ PDSPROPERTY pDsProperty,LPVOID pPropertyParams,ULONG cbPropertyParams,LPVOID pPropertyData,ULONG cbPropertyData,PULONG pcbReturnedData) PURE; - STDMETHOD(Set)(THIS_ PDSPROPERTY pDsProperty,LPVOID pPropertyParams,ULONG cbPropertyParams,LPVOID pPropertyData,ULONG cbPropertyData) PURE; - STDMETHOD(QuerySupport)(THIS_ REFGUID PropertySetId,ULONG PropertyId,PULONG pSupport) PURE; -}; -#undef INTERFACE - -#if !defined (__cplusplus) || defined(CINTERFACE) - /*** IUnknown methods ***/ -#define IDsDriverPropertySet_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDsDriverPropertySet_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDsDriverPropertySet_Release(p) (p)->lpVtbl->Release(p) - /*** IDsDriverPropertySet methods ***/ -#define IDsDriverPropertySet_Get(p,a,b,c,d,e,f) (p)->lpVtbl->Get(p,a,b,c,d,e,f) -#define IDsDriverPropertySet_Set(p,a,b,c,d,e) (p)->lpVtbl->Set(p,a,b,c,d,e) -#define IDsDriverPropertySet_QuerySupport(p,a,b,c) (p)->lpVtbl->QuerySupport(p,a,b,c) -#endif - -/* Defined property sets */ -DEFINE_GUID(DSPROPSETID_DirectSound3DListener, 0x6D047B40, 0x7AF9, 0x11D0, 0x92, 0x94, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0); -typedef enum -{ - DSPROPERTY_DIRECTSOUND3DLISTENER_ALL, - DSPROPERTY_DIRECTSOUND3DLISTENER_POSITION, - DSPROPERTY_DIRECTSOUND3DLISTENER_VELOCITY, - DSPROPERTY_DIRECTSOUND3DLISTENER_ORIENTATION, - DSPROPERTY_DIRECTSOUND3DLISTENER_DISTANCEFACTOR, - DSPROPERTY_DIRECTSOUND3DLISTENER_ROLLOFFFACTOR, - DSPROPERTY_DIRECTSOUND3DLISTENER_DOPPLERFACTOR, - DSPROPERTY_DIRECTSOUND3DLISTENER_BATCH, - DSPROPERTY_DIRECTSOUND3DLISTENER_ALLOCATION -} DSPROPERTY_DIRECTSOUND3DLISTENER; - -DEFINE_GUID(DSPROPSETID_DirectSound3DBuffer, 0x6D047B41, 0x7AF9, 0x11D0, 0x92, 0x94, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0); -typedef enum -{ - DSPROPERTY_DIRECTSOUND3DBUFFER_ALL, - DSPROPERTY_DIRECTSOUND3DBUFFER_POSITION, - DSPROPERTY_DIRECTSOUND3DBUFFER_VELOCITY, - DSPROPERTY_DIRECTSOUND3DBUFFER_CONEANGLES, - DSPROPERTY_DIRECTSOUND3DBUFFER_CONEORIENTATION, - DSPROPERTY_DIRECTSOUND3DBUFFER_CONEOUTSIDEVOLUME, - DSPROPERTY_DIRECTSOUND3DBUFFER_MINDISTANCE, - DSPROPERTY_DIRECTSOUND3DBUFFER_MAXDISTANCE, - DSPROPERTY_DIRECTSOUND3DBUFFER_MODE -} DSPROPERTY_DIRECTSOUND3DBUFFER; - -DEFINE_GUID(DSPROPSETID_DirectSoundSpeakerConfig, 0x6D047B42, 0x7AF9, 0x11D0, 0x92, 0x94, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0); -typedef enum -{ - DSPROPERTY_DIRECTSOUNDSPEAKERCONFIG_SPEAKERCONFIG -} DSPROPERTY_DIRECTSOUNDSPEAKERCONFIG; - -/***************************************************************************** - * IDsDriverNotify interface - */ -#define INTERFACE IDsDriverNotify -DECLARE_INTERFACE_(IDsDriverNotify,IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - /*** IDsDriverNotify methods ***/ - STDMETHOD(SetNotificationPositions)(THIS_ DWORD dwPositionNotifies,LPCDSBPOSITIONNOTIFY pcPositionNotifies) PURE; -}; -#undef INTERFACE - -#if !defined (__cplusplus) || defined(CINTERFACE) - /*** IUnknown methods ***/ -#define IDsDriverNotify_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDsDriverNotify_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDsDriverNotify_Release(p) (p)->lpVtbl->Release(p) - /*** IDsDriverNotify methods ***/ -#define IDsDriverNotify_SetNotificationPositions(p,a,b) (p)->lpVtbl->SetNotificationPositions(p,a,b) -#endif - -/***************************************************************************** - * IDsCaptureDriver interface - */ -#define INTERFACE IDsCaptureDriver -DECLARE_INTERFACE_(IDsCaptureDriver,IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - /*** IDsCaptureDriver methods ***/ - STDMETHOD(GetDriverDesc)(THIS_ PDSDRIVERDESC pDsDriverDesc) PURE; - STDMETHOD(Open)(THIS) PURE; - STDMETHOD(Close)(THIS) PURE; - STDMETHOD(GetCaps)(THIS_ PDSCDRIVERCAPS pDsDrvCaps) PURE; - STDMETHOD(CreateCaptureBuffer)(THIS_ LPWAVEFORMATEX pwfx,DWORD dwFlags,DWORD dwCardAddress,LPDWORD pdwcbBufferSize,LPBYTE *ppbBuffer,LPVOID *ppvObj) PURE; -}; -#undef INTERFACE - -#if !defined (__cplusplus) || defined(CINTERFACE) - /*** IUnknown methods ***/ -#define IDsCaptureDriver_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDsCaptureDriver_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDsCaptureDriver_Release(p) (p)->lpVtbl->Release(p) - /*** IDsCaptureDriver methods ***/ -#define IDsCaptureDriver_GetDriverDesc(p,a) (p)->lpVtbl->GetDriverDesc(p,a) -#define IDsCaptureDriver_Open(p) (p)->lpVtbl->Open(p) -#define IDsCaptureDriver_Close(p) (p)->lpVtbl->Close(p) -#define IDsCaptureDriver_GetCaps(p,a) (p)->lpVtbl->GetCaps(p,a) -#define IDsCaptureDriver_CreateCaptureBuffer(p,a,b,c,d,e,f) (p)->lpVtbl->CreateCaptureBuffer(p,a,b,c,d,e,f) -#endif - -/***************************************************************************** - * IDsCaptureDriverBuffer interface - */ -#define INTERFACE IDsCaptureDriverBuffer -DECLARE_INTERFACE_(IDsCaptureDriverBuffer,IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - /*** IDsCaptureDriverBuffer methods ***/ - STDMETHOD(Lock)(THIS_ LPVOID *ppvAudio1,LPDWORD pdwLen1,LPVOID *ppvAudio2,LPDWORD pdwLen2,DWORD dwWritePosition,DWORD dwWriteLen,DWORD dwFlags) PURE; - STDMETHOD(Unlock)(THIS_ LPVOID pvAudio1,DWORD dwLen1,LPVOID pvAudio2,DWORD dwLen2) PURE; - STDMETHOD(SetFormat)(THIS_ LPWAVEFORMATEX pwfxToSet) PURE; - STDMETHOD(GetPosition)(THIS_ LPDWORD lpdwCurrentPlayCursor,LPDWORD lpdwCurrentWriteCursor) PURE; - STDMETHOD(GetStatus)(THIS_ LPDWORD lpdwStatus) PURE; - STDMETHOD(Start)(THIS_ DWORD dwFlags) PURE; - STDMETHOD(Stop)(THIS) PURE; -}; -#undef INTERFACE - -#if !defined (__cplusplus) || defined(CINTERFACE) - /*** IUnknown methods ***/ -#define IDsCaptureDriverBuffer_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDsCaptureDriverBuffer_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDsCaptureDriverBuffer_Release(p) (p)->lpVtbl->Release(p) - /*** IDsCaptureDriverBuffer methods ***/ -#define IDsCaptureDriverBuffer_Lock(p,a,b,c,d,e,f,g) (p)->lpVtbl->Lock(p,a,b,c,d,e,f,g) -#define IDsCaptureDriverBuffer_Unlock(p,a,b,c,d) (p)->lpVtbl->Unlock(p,a,b,c,d) -#define IDsCaptureDriverBuffer_SetFormat(p,a) (p)->lpVtbl->SetFormat(p,a) -#define IDsCaptureDriverBuffer_GetPosition(p,a,b) (p)->lpVtbl->GetPosition(p,a,b) -#define IDsCaptureDriverBuffer_GetStatus(p,a) (p)->lpVtbl->GetStatus(p,a) -#define IDsCaptureDriverBuffer_Start(p,a) (p)->lpVtbl->Start(p,a) -#define IDsCaptureDriverBuffer_Stop(p) (p)->lpVtbl->Stop(p) -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* __WINE_DSDRIVER_H */