[1/2] dsound: Reorder the capture functions to avoid forward declarations.
Francois Gouget
fgouget at free.fr
Wed Dec 2 05:12:37 CST 2009
---
Reorders the implementation of the various interfaces so they are in
dependency order.
dlls/dsound/capture.c | 963 ++++++++++++++++++++++++-------------------------
1 files changed, 480 insertions(+), 483 deletions(-)
diff --git a/dlls/dsound/capture.c b/dlls/dsound/capture.c
index 93c711d..2b3fd2e 100644
--- a/dlls/dsound/capture.c
+++ b/dlls/dsound/capture.c
@@ -43,20 +43,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(dsound);
-/*****************************************************************************
- * IDirectSoundCapture implementation structure
- */
-struct IDirectSoundCaptureImpl
-{
- /* IUnknown fields */
- const IDirectSoundCaptureVtbl *lpVtbl;
- LONG ref;
-
- DirectSoundCaptureDevice *device;
-};
-
-static HRESULT IDirectSoundCaptureImpl_Create(LPDIRECTSOUNDCAPTURE8 * ppds);
-
/*****************************************************************************
* IDirectSoundCaptureNotify implementation structure
@@ -69,441 +55,6 @@ struct IDirectSoundCaptureNotifyImpl
IDirectSoundCaptureBufferImpl* dscb;
};
-static HRESULT IDirectSoundCaptureNotifyImpl_Create(IDirectSoundCaptureBufferImpl *dscb,
- IDirectSoundCaptureNotifyImpl ** pdscn);
-
-
-DirectSoundCaptureDevice * DSOUND_capture[MAXWAVEDRIVERS];
-
-static HRESULT DirectSoundCaptureDevice_Create(DirectSoundCaptureDevice ** ppDevice);
-
-static const char * const captureStateString[] = {
- "STATE_STOPPED",
- "STATE_STARTING",
- "STATE_CAPTURING",
- "STATE_STOPPING"
-};
-
-HRESULT DSOUND_CaptureCreate(
- REFIID riid,
- LPDIRECTSOUNDCAPTURE *ppDSC)
-{
- LPDIRECTSOUNDCAPTURE pDSC;
- HRESULT hr;
- TRACE("(%s, %p)\n", debugstr_guid(riid), ppDSC);
-
- if (!IsEqualIID(riid, &IID_IUnknown) &&
- !IsEqualIID(riid, &IID_IDirectSoundCapture)) {
- *ppDSC = 0;
- return E_NOINTERFACE;
- }
-
- /* Get dsound configuration */
- setup_dsound_options();
-
- hr = IDirectSoundCaptureImpl_Create(&pDSC);
- if (hr == DS_OK) {
- IDirectSoundCapture_AddRef(pDSC);
- *ppDSC = pDSC;
- } else {
- WARN("IDirectSoundCaptureImpl_Create failed\n");
- *ppDSC = 0;
- }
-
- return hr;
-}
-
-HRESULT DSOUND_CaptureCreate8(
- REFIID riid,
- LPDIRECTSOUNDCAPTURE8 *ppDSC8)
-{
- LPDIRECTSOUNDCAPTURE8 pDSC8;
- HRESULT hr;
- TRACE("(%s, %p)\n", debugstr_guid(riid), ppDSC8);
-
- if (!IsEqualIID(riid, &IID_IUnknown) &&
- !IsEqualIID(riid, &IID_IDirectSoundCapture8)) {
- *ppDSC8 = 0;
- return E_NOINTERFACE;
- }
-
- /* Get dsound configuration */
- setup_dsound_options();
-
- hr = IDirectSoundCaptureImpl_Create(&pDSC8);
- if (hr == DS_OK) {
- IDirectSoundCapture_AddRef(pDSC8);
- *ppDSC8 = pDSC8;
- } else {
- WARN("IDirectSoundCaptureImpl_Create failed\n");
- *ppDSC8 = 0;
- }
-
- return hr;
-}
-
-/***************************************************************************
- * DirectSoundCaptureCreate [DSOUND.6]
- *
- * Create and initialize a DirectSoundCapture interface.
- *
- * PARAMS
- * lpcGUID [I] Address of the GUID that identifies the sound capture device.
- * lplpDSC [O] Address of a variable to receive the interface pointer.
- * pUnkOuter [I] Must be NULL.
- *
- * RETURNS
- * Success: DS_OK
- * Failure: DSERR_NOAGGREGATION, DSERR_ALLOCATED, DSERR_INVALIDPARAM,
- * DSERR_OUTOFMEMORY
- *
- * NOTES
- * lpcGUID must be one of the values returned from DirectSoundCaptureEnumerate
- * or NULL for the default device or DSDEVID_DefaultCapture or
- * DSDEVID_DefaultVoiceCapture.
- *
- * DSERR_ALLOCATED is returned for sound devices that do not support full duplex.
- */
-HRESULT WINAPI DirectSoundCaptureCreate(
- LPCGUID lpcGUID,
- LPDIRECTSOUNDCAPTURE *ppDSC,
- LPUNKNOWN pUnkOuter)
-{
- HRESULT hr;
- LPDIRECTSOUNDCAPTURE pDSC;
- TRACE("(%s,%p,%p)\n", debugstr_guid(lpcGUID), ppDSC, pUnkOuter);
-
- if (ppDSC == NULL) {
- WARN("invalid parameter: ppDSC == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (pUnkOuter) {
- WARN("invalid parameter: pUnkOuter != NULL\n");
- *ppDSC = NULL;
- return DSERR_NOAGGREGATION;
- }
-
- hr = DSOUND_CaptureCreate(&IID_IDirectSoundCapture, &pDSC);
- if (hr == DS_OK) {
- hr = IDirectSoundCapture_Initialize(pDSC, lpcGUID);
- if (hr != DS_OK) {
- IDirectSoundCapture_Release(pDSC);
- pDSC = 0;
- }
- }
-
- *ppDSC = pDSC;
-
- return hr;
-}
-
-/***************************************************************************
- * DirectSoundCaptureCreate8 [DSOUND.12]
- *
- * Create and initialize a DirectSoundCapture interface.
- *
- * PARAMS
- * lpcGUID [I] Address of the GUID that identifies the sound capture device.
- * lplpDSC [O] Address of a variable to receive the interface pointer.
- * pUnkOuter [I] Must be NULL.
- *
- * RETURNS
- * Success: DS_OK
- * Failure: DSERR_NOAGGREGATION, DSERR_ALLOCATED, DSERR_INVALIDPARAM,
- * DSERR_OUTOFMEMORY
- *
- * NOTES
- * lpcGUID must be one of the values returned from DirectSoundCaptureEnumerate
- * or NULL for the default device or DSDEVID_DefaultCapture or
- * DSDEVID_DefaultVoiceCapture.
- *
- * DSERR_ALLOCATED is returned for sound devices that do not support full duplex.
- */
-HRESULT WINAPI DirectSoundCaptureCreate8(
- LPCGUID lpcGUID,
- LPDIRECTSOUNDCAPTURE8 *ppDSC8,
- LPUNKNOWN pUnkOuter)
-{
- HRESULT hr;
- LPDIRECTSOUNDCAPTURE8 pDSC8;
- TRACE("(%s,%p,%p)\n", debugstr_guid(lpcGUID), ppDSC8, pUnkOuter);
-
- if (ppDSC8 == NULL) {
- WARN("invalid parameter: ppDSC8 == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (pUnkOuter) {
- WARN("invalid parameter: pUnkOuter != NULL\n");
- *ppDSC8 = NULL;
- return DSERR_NOAGGREGATION;
- }
-
- hr = DSOUND_CaptureCreate8(&IID_IDirectSoundCapture8, &pDSC8);
- if (hr == DS_OK) {
- hr = IDirectSoundCapture_Initialize(pDSC8, lpcGUID);
- if (hr != DS_OK) {
- IDirectSoundCapture_Release(pDSC8);
- pDSC8 = 0;
- }
- }
-
- *ppDSC8 = pDSC8;
-
- return hr;
-}
-
-static void capture_CheckNotify(IDirectSoundCaptureBufferImpl *This, DWORD from, DWORD len)
-{
- int i;
- for (i = 0; i < This->nrofnotifies; ++i) {
- LPDSBPOSITIONNOTIFY event = This->notifies + i;
- DWORD offset = event->dwOffset;
- TRACE("checking %d, position %d, event = %p\n", i, offset, event->hEventNotify);
-
- if (offset == DSBPN_OFFSETSTOP) {
- if (!from && !len) {
- SetEvent(event->hEventNotify);
- TRACE("signalled event %p (%d)\n", event->hEventNotify, i);
- return;
- }
- else return;
- }
-
- if (offset >= from && offset < (from + len))
- {
- TRACE("signalled event %p (%d)\n", event->hEventNotify, i);
- SetEvent(event->hEventNotify);
- }
- }
-}
-
-static void CALLBACK
-DSOUND_capture_callback(HWAVEIN hwi, UINT msg, DWORD_PTR dwUser, DWORD_PTR dw1,
- DWORD_PTR dw2)
-{
- DirectSoundCaptureDevice * This = (DirectSoundCaptureDevice*)dwUser;
- IDirectSoundCaptureBufferImpl * Moi = This->capture_buffer;
- TRACE("(%p,%08x(%s),%08lx,%08lx,%08lx) entering at %d\n",hwi,msg,
- msg == MM_WIM_OPEN ? "MM_WIM_OPEN" : msg == MM_WIM_CLOSE ? "MM_WIM_CLOSE" :
- msg == MM_WIM_DATA ? "MM_WIM_DATA" : "UNKNOWN",dwUser,dw1,dw2,GetTickCount());
-
- if (msg == MM_WIM_DATA) {
- EnterCriticalSection( &(This->lock) );
- TRACE("DirectSoundCapture msg=MM_WIM_DATA, old This->state=%s, old This->index=%d\n",
- captureStateString[This->state],This->index);
- if (This->state != STATE_STOPPED) {
- int index = This->index;
- if (This->state == STATE_STARTING)
- This->state = STATE_CAPTURING;
- capture_CheckNotify(Moi, (DWORD_PTR)This->pwave[index].lpData - (DWORD_PTR)This->buffer, This->pwave[index].dwBufferLength);
- This->index = (This->index + 1) % This->nrofpwaves;
- if ( (This->index == 0) && !(This->capture_buffer->flags & DSCBSTART_LOOPING) ) {
- TRACE("end of buffer\n");
- This->state = STATE_STOPPED;
- capture_CheckNotify(Moi, 0, 0);
- } else {
- if (This->state == STATE_CAPTURING) {
- waveInUnprepareHeader(hwi, &(This->pwave[index]), sizeof(WAVEHDR));
- waveInPrepareHeader(hwi, &(This->pwave[index]), sizeof(WAVEHDR));
- waveInAddBuffer(hwi, &(This->pwave[index]), sizeof(WAVEHDR));
- } else if (This->state == STATE_STOPPING) {
- TRACE("stopping\n");
- This->state = STATE_STOPPED;
- }
- }
- }
- TRACE("DirectSoundCapture new This->state=%s, new This->index=%d\n",
- captureStateString[This->state],This->index);
- LeaveCriticalSection( &(This->lock) );
- }
-
- TRACE("completed\n");
-}
-
-/***************************************************************************
- * IDirectSoundCaptureImpl
- */
-static HRESULT WINAPI
-IDirectSoundCaptureImpl_QueryInterface(
- LPDIRECTSOUNDCAPTURE iface,
- REFIID riid,
- LPVOID* ppobj )
-{
- IDirectSoundCaptureImpl *This = (IDirectSoundCaptureImpl *)iface;
- TRACE( "(%p,%s,%p)\n", This, debugstr_guid(riid), ppobj );
-
- if (ppobj == NULL) {
- WARN("invalid parameter\n");
- return E_INVALIDARG;
- }
-
- *ppobj = NULL;
-
- if (IsEqualIID(riid, &IID_IUnknown)) {
- IDirectSoundCapture_AddRef((LPDIRECTSOUNDCAPTURE)This);
- *ppobj = This;
- return DS_OK;
- } else if (IsEqualIID(riid, &IID_IDirectSoundCapture)) {
- IDirectSoundCapture_AddRef((LPDIRECTSOUNDCAPTURE)This);
- *ppobj = This;
- return DS_OK;
- }
-
- WARN("unsupported riid: %s\n", debugstr_guid(riid));
- return E_NOINTERFACE;
-}
-
-static ULONG WINAPI
-IDirectSoundCaptureImpl_AddRef( LPDIRECTSOUNDCAPTURE iface )
-{
- IDirectSoundCaptureImpl *This = (IDirectSoundCaptureImpl *)iface;
- ULONG ref = InterlockedIncrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref - 1);
- return ref;
-}
-
-static ULONG WINAPI
-IDirectSoundCaptureImpl_Release( LPDIRECTSOUNDCAPTURE iface )
-{
- IDirectSoundCaptureImpl *This = (IDirectSoundCaptureImpl *)iface;
- ULONG ref = InterlockedDecrement(&(This->ref));
- TRACE("(%p) ref was %d\n", This, ref + 1);
-
- if (!ref) {
- if (This->device)
- DirectSoundCaptureDevice_Release(This->device);
-
- HeapFree( GetProcessHeap(), 0, This );
- TRACE("(%p) released\n", This);
- }
- return ref;
-}
-
-HRESULT WINAPI IDirectSoundCaptureImpl_CreateCaptureBuffer(
- LPDIRECTSOUNDCAPTURE iface,
- LPCDSCBUFFERDESC lpcDSCBufferDesc,
- LPDIRECTSOUNDCAPTUREBUFFER* lplpDSCaptureBuffer,
- LPUNKNOWN pUnk )
-{
- HRESULT hr;
- IDirectSoundCaptureImpl *This = (IDirectSoundCaptureImpl *)iface;
-
- TRACE( "(%p,%p,%p,%p)\n",iface,lpcDSCBufferDesc,lplpDSCaptureBuffer,pUnk);
-
- if (lpcDSCBufferDesc == NULL) {
- WARN("invalid parameter: lpcDSCBufferDesc == NULL)\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (lplpDSCaptureBuffer == NULL) {
- WARN("invalid parameter: lplpDSCaptureBuffer == NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (pUnk != NULL) {
- WARN("invalid parameter: pUnk != NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- /* FIXME: We can only have one buffer so what do we do here? */
- if (This->device->capture_buffer) {
- WARN("lnvalid parameter: already has buffer\n");
- return DSERR_INVALIDPARAM; /* DSERR_GENERIC ? */
- }
-
- hr = IDirectSoundCaptureBufferImpl_Create(This->device,
- (IDirectSoundCaptureBufferImpl **)lplpDSCaptureBuffer, lpcDSCBufferDesc);
-
- if (hr != DS_OK)
- WARN("IDirectSoundCaptureBufferImpl_Create failed\n");
-
- return hr;
-}
-
-HRESULT WINAPI IDirectSoundCaptureImpl_GetCaps(
- LPDIRECTSOUNDCAPTURE iface,
- LPDSCCAPS lpDSCCaps )
-{
- IDirectSoundCaptureImpl *This = (IDirectSoundCaptureImpl *)iface;
- TRACE("(%p,%p)\n",This,lpDSCCaps);
-
- if (This->device == NULL) {
- WARN("not initialized\n");
- return DSERR_UNINITIALIZED;
- }
-
- if (lpDSCCaps== NULL) {
- WARN("invalid parameter: lpDSCCaps== NULL\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (lpDSCCaps->dwSize < sizeof(*lpDSCCaps)) {
- WARN("invalid parameter: lpDSCCaps->dwSize = %d\n", lpDSCCaps->dwSize);
- return DSERR_INVALIDPARAM;
- }
-
- lpDSCCaps->dwFlags = This->device->drvcaps.dwFlags;
- lpDSCCaps->dwFormats = This->device->drvcaps.dwFormats;
- lpDSCCaps->dwChannels = This->device->drvcaps.dwChannels;
-
- TRACE("(flags=0x%08x,format=0x%08x,channels=%d)\n",lpDSCCaps->dwFlags,
- lpDSCCaps->dwFormats, lpDSCCaps->dwChannels);
-
- return DS_OK;
-}
-
-HRESULT WINAPI IDirectSoundCaptureImpl_Initialize(
- LPDIRECTSOUNDCAPTURE iface,
- LPCGUID lpcGUID )
-{
- IDirectSoundCaptureImpl *This = (IDirectSoundCaptureImpl *)iface;
- TRACE("(%p,%s)\n", This, debugstr_guid(lpcGUID));
-
- if (This->device != NULL) {
- WARN("already initialized\n");
- return DSERR_ALREADYINITIALIZED;
- }
- return DirectSoundCaptureDevice_Initialize(&This->device, lpcGUID);
-}
-
-static const IDirectSoundCaptureVtbl dscvt =
-{
- /* IUnknown methods */
- IDirectSoundCaptureImpl_QueryInterface,
- IDirectSoundCaptureImpl_AddRef,
- IDirectSoundCaptureImpl_Release,
-
- /* IDirectSoundCapture methods */
- IDirectSoundCaptureImpl_CreateCaptureBuffer,
- IDirectSoundCaptureImpl_GetCaps,
- IDirectSoundCaptureImpl_Initialize
-};
-
-static HRESULT IDirectSoundCaptureImpl_Create(
- LPDIRECTSOUNDCAPTURE8 * ppDSC)
-{
- IDirectSoundCaptureImpl *pDSC;
- TRACE("(%p)\n", ppDSC);
-
- /* Allocate memory */
- pDSC = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectSoundCaptureImpl));
- if (pDSC == NULL) {
- WARN("out of memory\n");
- *ppDSC = NULL;
- return DSERR_OUTOFMEMORY;
- }
-
- pDSC->lpVtbl = &dscvt;
- pDSC->ref = 0;
- pDSC->device = NULL;
-
- *ppDSC = (LPDIRECTSOUNDCAPTURE8)pDSC;
-
- return DS_OK;
-}
-
/*******************************************************************************
* IDirectSoundCaptureNotify
*/
@@ -631,6 +182,15 @@ static HRESULT IDirectSoundCaptureNotifyImpl_Create(
return DS_OK;
}
+
+static const char * const captureStateString[] = {
+ "STATE_STOPPED",
+ "STATE_STARTING",
+ "STATE_CAPTURING",
+ "STATE_STOPPING"
+};
+
+
/*******************************************************************************
* IDirectSoundCaptureBuffer
*/
@@ -1193,6 +753,74 @@ static const IDirectSoundCaptureBuffer8Vtbl dscbvt =
IDirectSoundCaptureBufferImpl_GetFXStatus
};
+static void capture_CheckNotify(IDirectSoundCaptureBufferImpl *This, DWORD from, DWORD len)
+{
+ int i;
+ for (i = 0; i < This->nrofnotifies; ++i) {
+ LPDSBPOSITIONNOTIFY event = This->notifies + i;
+ DWORD offset = event->dwOffset;
+ TRACE("checking %d, position %d, event = %p\n", i, offset, event->hEventNotify);
+
+ if (offset == DSBPN_OFFSETSTOP) {
+ if (!from && !len) {
+ SetEvent(event->hEventNotify);
+ TRACE("signalled event %p (%d)\n", event->hEventNotify, i);
+ return;
+ }
+ else return;
+ }
+
+ if (offset >= from && offset < (from + len))
+ {
+ TRACE("signalled event %p (%d)\n", event->hEventNotify, i);
+ SetEvent(event->hEventNotify);
+ }
+ }
+}
+
+static void CALLBACK
+DSOUND_capture_callback(HWAVEIN hwi, UINT msg, DWORD_PTR dwUser, DWORD_PTR dw1,
+ DWORD_PTR dw2)
+{
+ DirectSoundCaptureDevice * This = (DirectSoundCaptureDevice*)dwUser;
+ IDirectSoundCaptureBufferImpl * Moi = This->capture_buffer;
+ TRACE("(%p,%08x(%s),%08lx,%08lx,%08lx) entering at %d\n",hwi,msg,
+ msg == MM_WIM_OPEN ? "MM_WIM_OPEN" : msg == MM_WIM_CLOSE ? "MM_WIM_CLOSE" :
+ msg == MM_WIM_DATA ? "MM_WIM_DATA" : "UNKNOWN",dwUser,dw1,dw2,GetTickCount());
+
+ if (msg == MM_WIM_DATA) {
+ EnterCriticalSection( &(This->lock) );
+ TRACE("DirectSoundCapture msg=MM_WIM_DATA, old This->state=%s, old This->index=%d\n",
+ captureStateString[This->state],This->index);
+ if (This->state != STATE_STOPPED) {
+ int index = This->index;
+ if (This->state == STATE_STARTING)
+ This->state = STATE_CAPTURING;
+ capture_CheckNotify(Moi, (DWORD_PTR)This->pwave[index].lpData - (DWORD_PTR)This->buffer, This->pwave[index].dwBufferLength);
+ This->index = (This->index + 1) % This->nrofpwaves;
+ if ( (This->index == 0) && !(This->capture_buffer->flags & DSCBSTART_LOOPING) ) {
+ TRACE("end of buffer\n");
+ This->state = STATE_STOPPED;
+ capture_CheckNotify(Moi, 0, 0);
+ } else {
+ if (This->state == STATE_CAPTURING) {
+ waveInUnprepareHeader(hwi, &(This->pwave[index]), sizeof(WAVEHDR));
+ waveInPrepareHeader(hwi, &(This->pwave[index]), sizeof(WAVEHDR));
+ waveInAddBuffer(hwi, &(This->pwave[index]), sizeof(WAVEHDR));
+ } else if (This->state == STATE_STOPPING) {
+ TRACE("stopping\n");
+ This->state = STATE_STOPPED;
+ }
+ }
+ }
+ TRACE("DirectSoundCapture new This->state=%s, new This->index=%d\n",
+ captureStateString[This->state],This->index);
+ LeaveCriticalSection( &(This->lock) );
+ }
+
+ TRACE("completed\n");
+}
+
HRESULT IDirectSoundCaptureBufferImpl_Create(
DirectSoundCaptureDevice *device,
IDirectSoundCaptureBufferImpl ** ppobj,
@@ -1347,9 +975,64 @@ HRESULT IDirectSoundCaptureBufferImpl_Create(
return DS_OK;
}
+
/*******************************************************************************
* DirectSoundCaptureDevice
*/
+DirectSoundCaptureDevice * DSOUND_capture[MAXWAVEDRIVERS];
+
+static HRESULT DirectSoundCaptureDevice_Create(
+ DirectSoundCaptureDevice ** ppDevice)
+{
+ DirectSoundCaptureDevice * device;
+ TRACE("(%p)\n", ppDevice);
+
+ /* Allocate memory */
+ device = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DirectSoundCaptureDevice));
+
+ if (device == NULL) {
+ WARN("out of memory\n");
+ return DSERR_OUTOFMEMORY;
+ }
+
+ device->ref = 1;
+ device->state = STATE_STOPPED;
+
+ InitializeCriticalSection( &(device->lock) );
+ device->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": DirectSoundCaptureDevice.lock");
+
+ *ppDevice = device;
+
+ return DS_OK;
+}
+
+ULONG DirectSoundCaptureDevice_Release(
+ DirectSoundCaptureDevice * device)
+{
+ ULONG ref = InterlockedDecrement(&(device->ref));
+ TRACE("(%p) ref was %d\n", device, ref + 1);
+
+ if (!ref) {
+ TRACE("deleting object\n");
+ if (device->capture_buffer)
+ IDirectSoundCaptureBufferImpl_Release(
+ (LPDIRECTSOUNDCAPTUREBUFFER8) device->capture_buffer);
+
+ if (device->driver) {
+ IDsCaptureDriver_Close(device->driver);
+ IDsCaptureDriver_Release(device->driver);
+ }
+
+ HeapFree(GetProcessHeap(), 0, device->pwfx);
+ device->lock.DebugInfo->Spare[0] = 0;
+ DeleteCriticalSection( &(device->lock) );
+ DSOUND_capture[device->drvdesc.dnDevNode] = NULL;
+ HeapFree(GetProcessHeap(), 0, device);
+ TRACE("(%p) released\n", device);
+ }
+ return ref;
+}
+
HRESULT DirectSoundCaptureDevice_Initialize(
DirectSoundCaptureDevice ** ppDevice,
LPCGUID lpcGUID)
@@ -1378,7 +1061,7 @@ HRESULT DirectSoundCaptureDevice_Initialize(
/* enumerate WINMM audio devices and find the one we want */
for (wid=0; wid<widn; wid++) {
- if (IsEqualGUID( &devGUID, &DSOUND_capture_guids[wid]) ) {
+ if (IsEqualGUID( &devGUID, &DSOUND_capture_guids[wid]) ) {
found = TRUE;
break;
}
@@ -1466,54 +1149,368 @@ HRESULT DirectSoundCaptureDevice_Initialize(
return err;
}
-static HRESULT DirectSoundCaptureDevice_Create(
- DirectSoundCaptureDevice ** ppDevice)
+
+/*****************************************************************************
+ * IDirectSoundCapture implementation structure
+ */
+struct IDirectSoundCaptureImpl
{
- DirectSoundCaptureDevice * device;
- TRACE("(%p)\n", ppDevice);
+ /* IUnknown fields */
+ const IDirectSoundCaptureVtbl *lpVtbl;
+ LONG ref;
- /* Allocate memory */
- device = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DirectSoundCaptureDevice));
+ DirectSoundCaptureDevice *device;
+};
- if (device == NULL) {
- WARN("out of memory\n");
- return DSERR_OUTOFMEMORY;
+/***************************************************************************
+ * IDirectSoundCaptureImpl
+ */
+static HRESULT WINAPI
+IDirectSoundCaptureImpl_QueryInterface(
+ LPDIRECTSOUNDCAPTURE iface,
+ REFIID riid,
+ LPVOID* ppobj )
+{
+ IDirectSoundCaptureImpl *This = (IDirectSoundCaptureImpl *)iface;
+ TRACE( "(%p,%s,%p)\n", This, debugstr_guid(riid), ppobj );
+
+ if (ppobj == NULL) {
+ WARN("invalid parameter\n");
+ return E_INVALIDARG;
}
- device->ref = 1;
- device->state = STATE_STOPPED;
+ *ppobj = NULL;
- InitializeCriticalSection( &(device->lock) );
- device->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": DirectSoundCaptureDevice.lock");
+ if (IsEqualIID(riid, &IID_IUnknown)) {
+ IDirectSoundCapture_AddRef((LPDIRECTSOUNDCAPTURE)This);
+ *ppobj = This;
+ return DS_OK;
+ } else if (IsEqualIID(riid, &IID_IDirectSoundCapture)) {
+ IDirectSoundCapture_AddRef((LPDIRECTSOUNDCAPTURE)This);
+ *ppobj = This;
+ return DS_OK;
+ }
- *ppDevice = device;
+ WARN("unsupported riid: %s\n", debugstr_guid(riid));
+ return E_NOINTERFACE;
+}
- return DS_OK;
+static ULONG WINAPI
+IDirectSoundCaptureImpl_AddRef( LPDIRECTSOUNDCAPTURE iface )
+{
+ IDirectSoundCaptureImpl *This = (IDirectSoundCaptureImpl *)iface;
+ ULONG ref = InterlockedIncrement(&(This->ref));
+ TRACE("(%p) ref was %d\n", This, ref - 1);
+ return ref;
}
-ULONG DirectSoundCaptureDevice_Release(
- DirectSoundCaptureDevice * device)
+static ULONG WINAPI
+IDirectSoundCaptureImpl_Release( LPDIRECTSOUNDCAPTURE iface )
{
- ULONG ref = InterlockedDecrement(&(device->ref));
- TRACE("(%p) ref was %d\n", device, ref + 1);
+ IDirectSoundCaptureImpl *This = (IDirectSoundCaptureImpl *)iface;
+ ULONG ref = InterlockedDecrement(&(This->ref));
+ TRACE("(%p) ref was %d\n", This, ref + 1);
if (!ref) {
- TRACE("deleting object\n");
- if (device->capture_buffer)
- IDirectSoundCaptureBufferImpl_Release(
- (LPDIRECTSOUNDCAPTUREBUFFER8) device->capture_buffer);
+ if (This->device)
+ DirectSoundCaptureDevice_Release(This->device);
- if (device->driver) {
- IDsCaptureDriver_Close(device->driver);
- IDsCaptureDriver_Release(device->driver);
+ HeapFree( GetProcessHeap(), 0, This );
+ TRACE("(%p) released\n", This);
+ }
+ return ref;
+}
+
+HRESULT WINAPI IDirectSoundCaptureImpl_CreateCaptureBuffer(
+ LPDIRECTSOUNDCAPTURE iface,
+ LPCDSCBUFFERDESC lpcDSCBufferDesc,
+ LPDIRECTSOUNDCAPTUREBUFFER* lplpDSCaptureBuffer,
+ LPUNKNOWN pUnk )
+{
+ HRESULT hr;
+ IDirectSoundCaptureImpl *This = (IDirectSoundCaptureImpl *)iface;
+
+ TRACE( "(%p,%p,%p,%p)\n",iface,lpcDSCBufferDesc,lplpDSCaptureBuffer,pUnk);
+
+ if (lpcDSCBufferDesc == NULL) {
+ WARN("invalid parameter: lpcDSCBufferDesc == NULL)\n");
+ return DSERR_INVALIDPARAM;
+ }
+
+ if (lplpDSCaptureBuffer == NULL) {
+ WARN("invalid parameter: lplpDSCaptureBuffer == NULL\n");
+ return DSERR_INVALIDPARAM;
+ }
+
+ if (pUnk != NULL) {
+ WARN("invalid parameter: pUnk != NULL\n");
+ return DSERR_INVALIDPARAM;
+ }
+
+ /* FIXME: We can only have one buffer so what do we do here? */
+ if (This->device->capture_buffer) {
+ WARN("lnvalid parameter: already has buffer\n");
+ return DSERR_INVALIDPARAM; /* DSERR_GENERIC ? */
+ }
+
+ hr = IDirectSoundCaptureBufferImpl_Create(This->device,
+ (IDirectSoundCaptureBufferImpl **)lplpDSCaptureBuffer, lpcDSCBufferDesc);
+
+ if (hr != DS_OK)
+ WARN("IDirectSoundCaptureBufferImpl_Create failed\n");
+
+ return hr;
+}
+
+HRESULT WINAPI IDirectSoundCaptureImpl_GetCaps(
+ LPDIRECTSOUNDCAPTURE iface,
+ LPDSCCAPS lpDSCCaps )
+{
+ IDirectSoundCaptureImpl *This = (IDirectSoundCaptureImpl *)iface;
+ TRACE("(%p,%p)\n",This,lpDSCCaps);
+
+ if (This->device == NULL) {
+ WARN("not initialized\n");
+ return DSERR_UNINITIALIZED;
+ }
+
+ if (lpDSCCaps== NULL) {
+ WARN("invalid parameter: lpDSCCaps== NULL\n");
+ return DSERR_INVALIDPARAM;
+ }
+
+ if (lpDSCCaps->dwSize < sizeof(*lpDSCCaps)) {
+ WARN("invalid parameter: lpDSCCaps->dwSize = %d\n", lpDSCCaps->dwSize);
+ return DSERR_INVALIDPARAM;
+ }
+
+ lpDSCCaps->dwFlags = This->device->drvcaps.dwFlags;
+ lpDSCCaps->dwFormats = This->device->drvcaps.dwFormats;
+ lpDSCCaps->dwChannels = This->device->drvcaps.dwChannels;
+
+ TRACE("(flags=0x%08x,format=0x%08x,channels=%d)\n",lpDSCCaps->dwFlags,
+ lpDSCCaps->dwFormats, lpDSCCaps->dwChannels);
+
+ return DS_OK;
+}
+
+HRESULT WINAPI IDirectSoundCaptureImpl_Initialize(
+ LPDIRECTSOUNDCAPTURE iface,
+ LPCGUID lpcGUID )
+{
+ IDirectSoundCaptureImpl *This = (IDirectSoundCaptureImpl *)iface;
+ TRACE("(%p,%s)\n", This, debugstr_guid(lpcGUID));
+
+ if (This->device != NULL) {
+ WARN("already initialized\n");
+ return DSERR_ALREADYINITIALIZED;
+ }
+ return DirectSoundCaptureDevice_Initialize(&This->device, lpcGUID);
+}
+
+static const IDirectSoundCaptureVtbl dscvt =
+{
+ /* IUnknown methods */
+ IDirectSoundCaptureImpl_QueryInterface,
+ IDirectSoundCaptureImpl_AddRef,
+ IDirectSoundCaptureImpl_Release,
+
+ /* IDirectSoundCapture methods */
+ IDirectSoundCaptureImpl_CreateCaptureBuffer,
+ IDirectSoundCaptureImpl_GetCaps,
+ IDirectSoundCaptureImpl_Initialize
+};
+
+static HRESULT IDirectSoundCaptureImpl_Create(
+ LPDIRECTSOUNDCAPTURE8 * ppDSC)
+{
+ IDirectSoundCaptureImpl *pDSC;
+ TRACE("(%p)\n", ppDSC);
+
+ /* Allocate memory */
+ pDSC = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectSoundCaptureImpl));
+ if (pDSC == NULL) {
+ WARN("out of memory\n");
+ *ppDSC = NULL;
+ return DSERR_OUTOFMEMORY;
+ }
+
+ pDSC->lpVtbl = &dscvt;
+ pDSC->ref = 0;
+ pDSC->device = NULL;
+
+ *ppDSC = (LPDIRECTSOUNDCAPTURE8)pDSC;
+
+ return DS_OK;
+}
+
+HRESULT DSOUND_CaptureCreate(
+ REFIID riid,
+ LPDIRECTSOUNDCAPTURE *ppDSC)
+{
+ LPDIRECTSOUNDCAPTURE pDSC;
+ HRESULT hr;
+ TRACE("(%s, %p)\n", debugstr_guid(riid), ppDSC);
+
+ if (!IsEqualIID(riid, &IID_IUnknown) &&
+ !IsEqualIID(riid, &IID_IDirectSoundCapture)) {
+ *ppDSC = 0;
+ return E_NOINTERFACE;
+ }
+
+ /* Get dsound configuration */
+ setup_dsound_options();
+
+ hr = IDirectSoundCaptureImpl_Create(&pDSC);
+ if (hr == DS_OK) {
+ IDirectSoundCapture_AddRef(pDSC);
+ *ppDSC = pDSC;
+ } else {
+ WARN("IDirectSoundCaptureImpl_Create failed\n");
+ *ppDSC = 0;
+ }
+
+ return hr;
+}
+
+HRESULT DSOUND_CaptureCreate8(
+ REFIID riid,
+ LPDIRECTSOUNDCAPTURE8 *ppDSC8)
+{
+ LPDIRECTSOUNDCAPTURE8 pDSC8;
+ HRESULT hr;
+ TRACE("(%s, %p)\n", debugstr_guid(riid), ppDSC8);
+
+ if (!IsEqualIID(riid, &IID_IUnknown) &&
+ !IsEqualIID(riid, &IID_IDirectSoundCapture8)) {
+ *ppDSC8 = 0;
+ return E_NOINTERFACE;
+ }
+
+ /* Get dsound configuration */
+ setup_dsound_options();
+
+ hr = IDirectSoundCaptureImpl_Create(&pDSC8);
+ if (hr == DS_OK) {
+ IDirectSoundCapture_AddRef(pDSC8);
+ *ppDSC8 = pDSC8;
+ } else {
+ WARN("IDirectSoundCaptureImpl_Create failed\n");
+ *ppDSC8 = 0;
+ }
+
+ return hr;
+}
+
+/***************************************************************************
+ * DirectSoundCaptureCreate [DSOUND.6]
+ *
+ * Create and initialize a DirectSoundCapture interface.
+ *
+ * PARAMS
+ * lpcGUID [I] Address of the GUID that identifies the sound capture device.
+ * lplpDSC [O] Address of a variable to receive the interface pointer.
+ * pUnkOuter [I] Must be NULL.
+ *
+ * RETURNS
+ * Success: DS_OK
+ * Failure: DSERR_NOAGGREGATION, DSERR_ALLOCATED, DSERR_INVALIDPARAM,
+ * DSERR_OUTOFMEMORY
+ *
+ * NOTES
+ * lpcGUID must be one of the values returned from DirectSoundCaptureEnumerate
+ * or NULL for the default device or DSDEVID_DefaultCapture or
+ * DSDEVID_DefaultVoiceCapture.
+ *
+ * DSERR_ALLOCATED is returned for sound devices that do not support full duplex.
+ */
+HRESULT WINAPI DirectSoundCaptureCreate(
+ LPCGUID lpcGUID,
+ LPDIRECTSOUNDCAPTURE *ppDSC,
+ LPUNKNOWN pUnkOuter)
+{
+ HRESULT hr;
+ LPDIRECTSOUNDCAPTURE pDSC;
+ TRACE("(%s,%p,%p)\n", debugstr_guid(lpcGUID), ppDSC, pUnkOuter);
+
+ if (ppDSC == NULL) {
+ WARN("invalid parameter: ppDSC == NULL\n");
+ return DSERR_INVALIDPARAM;
+ }
+
+ if (pUnkOuter) {
+ WARN("invalid parameter: pUnkOuter != NULL\n");
+ *ppDSC = NULL;
+ return DSERR_NOAGGREGATION;
+ }
+
+ hr = DSOUND_CaptureCreate(&IID_IDirectSoundCapture, &pDSC);
+ if (hr == DS_OK) {
+ hr = IDirectSoundCapture_Initialize(pDSC, lpcGUID);
+ if (hr != DS_OK) {
+ IDirectSoundCapture_Release(pDSC);
+ pDSC = 0;
}
+ }
- HeapFree(GetProcessHeap(), 0, device->pwfx);
- device->lock.DebugInfo->Spare[0] = 0;
- DeleteCriticalSection( &(device->lock) );
- DSOUND_capture[device->drvdesc.dnDevNode] = NULL;
- HeapFree(GetProcessHeap(), 0, device);
- TRACE("(%p) released\n", device);
+ *ppDSC = pDSC;
+
+ return hr;
+}
+
+/***************************************************************************
+ * DirectSoundCaptureCreate8 [DSOUND.12]
+ *
+ * Create and initialize a DirectSoundCapture interface.
+ *
+ * PARAMS
+ * lpcGUID [I] Address of the GUID that identifies the sound capture device.
+ * lplpDSC [O] Address of a variable to receive the interface pointer.
+ * pUnkOuter [I] Must be NULL.
+ *
+ * RETURNS
+ * Success: DS_OK
+ * Failure: DSERR_NOAGGREGATION, DSERR_ALLOCATED, DSERR_INVALIDPARAM,
+ * DSERR_OUTOFMEMORY
+ *
+ * NOTES
+ * lpcGUID must be one of the values returned from DirectSoundCaptureEnumerate
+ * or NULL for the default device or DSDEVID_DefaultCapture or
+ * DSDEVID_DefaultVoiceCapture.
+ *
+ * DSERR_ALLOCATED is returned for sound devices that do not support full duplex.
+ */
+HRESULT WINAPI DirectSoundCaptureCreate8(
+ LPCGUID lpcGUID,
+ LPDIRECTSOUNDCAPTURE8 *ppDSC8,
+ LPUNKNOWN pUnkOuter)
+{
+ HRESULT hr;
+ LPDIRECTSOUNDCAPTURE8 pDSC8;
+ TRACE("(%s,%p,%p)\n", debugstr_guid(lpcGUID), ppDSC8, pUnkOuter);
+
+ if (ppDSC8 == NULL) {
+ WARN("invalid parameter: ppDSC8 == NULL\n");
+ return DSERR_INVALIDPARAM;
}
- return ref;
+
+ if (pUnkOuter) {
+ WARN("invalid parameter: pUnkOuter != NULL\n");
+ *ppDSC8 = NULL;
+ return DSERR_NOAGGREGATION;
+ }
+
+ hr = DSOUND_CaptureCreate8(&IID_IDirectSoundCapture8, &pDSC8);
+ if (hr == DS_OK) {
+ hr = IDirectSoundCapture_Initialize(pDSC8, lpcGUID);
+ if (hr != DS_OK) {
+ IDirectSoundCapture_Release(pDSC8);
+ pDSC8 = 0;
+ }
+ }
+
+ *ppDSC8 = pDSC8;
+
+ return hr;
}
+
--
1.6.5
More information about the wine-patches
mailing list