dsound capture patch

Robert Reif reif at earthlink.net
Wed Oct 20 20:10:35 CDT 2004


Trailing white space cleanup.
Add IClassFactory->CreateInstance aggregation checks.
IID_IDirectSoundCapture and IID_IDirectSoundCapture8 are same so remove 
redundant check.
Allocate capture buffer for hw driver if necessary.
-------------- next part --------------
Index: dlls/dsound/capture.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/capture.c,v
retrieving revision 1.35
diff -u -r1.35 capture.c
--- dlls/dsound/capture.c	17 Sep 2004 18:10:59 -0000	1.35
+++ dlls/dsound/capture.c	21 Oct 2004 00:11:59 -0000
@@ -56,13 +56,13 @@
 static HRESULT WINAPI IDirectSoundCaptureImpl_Initialize(
     LPDIRECTSOUNDCAPTURE iface,
     LPCGUID lpcGUID );
-static ULONG WINAPI IDirectSoundCaptureImpl_Release( 
+static ULONG WINAPI IDirectSoundCaptureImpl_Release(
     LPDIRECTSOUNDCAPTURE iface );
-static ULONG WINAPI IDirectSoundCaptureBufferImpl_Release( 
+static ULONG WINAPI IDirectSoundCaptureBufferImpl_Release(
     LPDIRECTSOUNDCAPTUREBUFFER8 iface );
 static HRESULT DSOUND_CreateDirectSoundCaptureBuffer(
-    IDirectSoundCaptureImpl *ipDSC, 
-    LPCDSCBUFFERDESC lpcDSCBufferDesc, 
+    IDirectSoundCaptureImpl *ipDSC,
+    LPCDSCBUFFERDESC lpcDSCBufferDesc,
     LPVOID* ppobj );
 static HRESULT WINAPI IDirectSoundFullDuplexImpl_Initialize(
     LPDIRECTSOUNDFULLDUPLEX iface,
@@ -105,12 +105,12 @@
  *
  * NOTES
  *    lpcGUID must be one of the values returned from DirectSoundCaptureEnumerate
- *    or NULL for the default device or DSDEVID_DefaultCapture or 
+ *    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 
+HRESULT WINAPI
 DirectSoundCaptureCreate8(
     LPCGUID lpcGUID,
     LPDIRECTSOUNDCAPTURE* lplpDSC,
@@ -130,7 +130,7 @@
     }
 
     /* Default device? */
-    if ( !lpcGUID || IsEqualGUID(lpcGUID, &GUID_NULL) ) 
+    if ( !lpcGUID || IsEqualGUID(lpcGUID, &GUID_NULL) )
 	lpcGUID = &DSDEVID_DefaultCapture;
 
     *ippDSC = HeapAlloc(GetProcessHeap(),
@@ -152,7 +152,7 @@
         dsound_capture = This;
 
         if (GetDeviceID(lpcGUID, &This->guid) == DS_OK) {
-	    HRESULT	hres; 
+	    HRESULT	hres;
             hres = IDirectSoundCaptureImpl_Initialize( (LPDIRECTSOUNDCAPTURE)This, &This->guid);
 	    if (hres != DS_OK)
 		WARN("IDirectSoundCaptureImpl_Initialize failed\n");
@@ -176,7 +176,7 @@
  *    Success: DS_OK
  *    Failure: DSERR_INVALIDPARAM
  */
-HRESULT WINAPI 
+HRESULT WINAPI
 DirectSoundCaptureEnumerateA(
     LPDSENUMCALLBACKA lpDSEnumCallback,
     LPVOID lpContext)
@@ -217,7 +217,7 @@
                   debugstr_guid(&capture_guids[wid]),desc.szDesc,desc.szDrvName,lpContext);
             if (lpDSEnumCallback(&capture_guids[wid], desc.szDesc, desc.szDrvName, lpContext) == FALSE)
                 return DS_OK;
-	} 
+	}
     }
 
     return DS_OK;
@@ -236,7 +236,7 @@
  *    Success: DS_OK
  *    Failure: DSERR_INVALIDPARAM
  */
-HRESULT WINAPI 
+HRESULT WINAPI
 DirectSoundCaptureEnumerateW(
     LPDSENUMCALLBACKW lpDSEnumCallback,
     LPVOID lpContext)
@@ -264,9 +264,9 @@
                     if (err == DS_OK) {
                         TRACE("calling lpDSEnumCallback(NULL,\"%s\",\"%s\",%p)\n",
                               "Primary Sound Capture Driver",desc.szDrvName,lpContext);
-                        MultiByteToWideChar( CP_ACP, 0, "Primary Sound Capture Driver", -1, 
+                        MultiByteToWideChar( CP_ACP, 0, "Primary Sound Capture Driver", -1,
                                              wDesc, sizeof(wDesc)/sizeof(WCHAR) );
-                        MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, 
+                        MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1,
                                              wName, sizeof(wName)/sizeof(WCHAR) );
                         if (lpDSEnumCallback(NULL, wDesc, wName, lpContext) == FALSE)
                             return DS_OK;
@@ -281,24 +281,24 @@
 	if (err == DS_OK) {
             TRACE("calling lpDSEnumCallback(%s,\"%s\",\"%s\",%p)\n",
                   debugstr_guid(&capture_guids[wid]),desc.szDesc,desc.szDrvName,lpContext);
-            MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, 
+            MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1,
                                  wDesc, sizeof(wDesc)/sizeof(WCHAR) );
-            MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, 
+            MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1,
                                  wName, sizeof(wName)/sizeof(WCHAR) );
             if (lpDSEnumCallback((LPGUID)&capture_guids[wid], wDesc, wName, lpContext) == FALSE)
                 return DS_OK;
-	} 
+	}
     }
 
     return DS_OK;
 }
 
-static void CALLBACK 
+static void CALLBACK
 DSOUND_capture_callback(
-    HWAVEIN hwi, 
-    UINT msg, 
-    DWORD dwUser, 
-    DWORD dw1, 
+    HWAVEIN hwi,
+    UINT msg,
+    DWORD dwUser,
+    DWORD dw1,
     DWORD dw2 )
 {
     IDirectSoundCaptureImpl* This = (IDirectSoundCaptureImpl*)dwUser;
@@ -313,7 +313,7 @@
 	    captureStateString[This->state],This->index);
 	if (This->state != STATE_STOPPED) {
 	    int index = This->index;
-	    if (This->state == STATE_STARTING) { 
+	    if (This->state == STATE_STARTING) {
                 This->read_position = pHdr->dwBytesRecorded;
 		This->state = STATE_CAPTURING;
 	    }
@@ -359,7 +359,7 @@
     *ppobj = NULL;
 
     if (This->driver) {
-	HRESULT	hres; 
+	HRESULT	hres;
         hres = IDsCaptureDriver_QueryInterface(This->driver, riid, ppobj);
 	if (hres != DS_OK)
 	    WARN("IDsCaptureDriver_QueryInterface failed\n");
@@ -392,7 +392,7 @@
             IDirectSoundCaptureBufferImpl_Release(
 		(LPDIRECTSOUNDCAPTUREBUFFER8) This->capture_buffer);
 
-        if (This->driver) { 
+        if (This->driver) {
             IDsCaptureDriver_Close(This->driver);
             IDsCaptureDriver_Release(This->driver);
 	}
@@ -448,7 +448,7 @@
 	return DSERR_INVALIDPARAM;    /* DSERR_GENERIC ? */
     }
 
-    hr = DSOUND_CreateDirectSoundCaptureBuffer( This, lpcDSCBufferDesc, 
+    hr = DSOUND_CreateDirectSoundCaptureBuffer( This, lpcDSCBufferDesc,
         (LPVOID*)lplpDSCaptureBuffer );
 
     if (hr != DS_OK)
@@ -471,7 +471,7 @@
     }
 
     if (lpDSCCaps->dwSize < sizeof(*lpDSCCaps)) {
-	WARN("invalid parameter: lpDSCCaps->dwSize = %ld < %d\n", 
+	WARN("invalid parameter: lpDSCCaps->dwSize = %ld < %d\n",
 	    lpDSCCaps->dwSize, sizeof(*lpDSCCaps));
 	return DSERR_INVALIDPARAM;
     }
@@ -513,7 +513,7 @@
 
     widn = waveInGetNumDevs();
 
-    if (!widn) { 
+    if (!widn) {
 	WARN("no audio devices found\n");
 	return DSERR_NODRIVER;
     }
@@ -556,12 +556,12 @@
     } else {
         TRACE("using WINMM\n");
         /* if no DirectSound interface available, use WINMM API instead */
-        This->drvdesc.dwFlags = DSDDESC_DOMMSYSTEMOPEN | 
+        This->drvdesc.dwFlags = DSDDESC_DOMMSYSTEMOPEN |
             DSDDESC_DOMMSYSTEMSETFORMAT;
     }
 
     This->drvdesc.dnDevNode = wid;
-    
+
     /* open the DirectSound driver if available */
     if (This->driver && (err == DS_OK))
         err = IDsCaptureDriver_Open(This->driver);
@@ -583,8 +583,8 @@
 
             if (err == DS_OK) {
                 This->drvcaps.dwFlags = 0;
-                strncpy(This->drvdesc.szDrvName, wic.szPname, 
-                    sizeof(This->drvdesc.szDrvName)); 
+                strncpy(This->drvdesc.szDrvName, wic.szPname,
+                    sizeof(This->drvdesc.szDrvName));
 
                 This->drvcaps.dwFlags |= DSCCAPS_EMULDRIVER;
                 This->drvcaps.dwFormats = wic.dwFormats;
@@ -611,8 +611,8 @@
 
 static HRESULT
 DSOUND_CreateDirectSoundCaptureBuffer(
-    IDirectSoundCaptureImpl *ipDSC, 
-    LPCDSCBUFFERDESC lpcDSCBufferDesc, 
+    IDirectSoundCaptureImpl *ipDSC,
+    LPCDSCBUFFERDESC lpcDSCBufferDesc,
     LPVOID* ppobj )
 {
     LPWAVEFORMATEX  wfex;
@@ -633,8 +633,8 @@
 	return DSERR_INVALIDPARAM;
     }
 
-    if ( ((lpcDSCBufferDesc->dwSize != sizeof(DSCBUFFERDESC)) && 
-          (lpcDSCBufferDesc->dwSize != sizeof(DSCBUFFERDESC1))) || 
+    if ( ((lpcDSCBufferDesc->dwSize != sizeof(DSCBUFFERDESC)) &&
+          (lpcDSCBufferDesc->dwSize != sizeof(DSCBUFFERDESC1))) ||
         (lpcDSCBufferDesc->dwBufferBytes == 0) ||
         (lpcDSCBufferDesc->lpwfxFormat == NULL) ) {
 	WARN("invalid lpcDSCBufferDesc\n");
@@ -680,6 +680,8 @@
 	return DSERR_OUTOFMEMORY;
     } else {
     	HRESULT err = DS_OK;
+        LPBYTE newbuf;
+        DWORD buflen;
         IDirectSoundCaptureBufferImpl *This = (IDirectSoundCaptureBufferImpl *)*ppobj;
 
         This->ref = 1;
@@ -691,20 +693,49 @@
 
         This->pdscbd = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,
             lpcDSCBufferDesc->dwSize);
-        if (This->pdscbd)     
+        if (This->pdscbd)
             memcpy(This->pdscbd, lpcDSCBufferDesc, lpcDSCBufferDesc->dwSize);
         else {
             WARN("no memory\n");
             This->dsound->capture_buffer = 0;
             HeapFree( GetProcessHeap(), 0, This );
             *ppobj = NULL;
-            return DSERR_OUTOFMEMORY; 
+            return DSERR_OUTOFMEMORY;
         }
 
         This->lpVtbl = &dscbvt;
 
 	if (ipDSC->driver) {
-	    err = IDsCaptureDriver_CreateCaptureBuffer(ipDSC->driver, 
+            if (This->dsound->drvdesc.dwFlags & DSDDESC_DOMMSYSTEMOPEN)
+                FIXME("DSDDESC_DOMMSYSTEMOPEN not supported\n");
+
+            if (This->dsound->drvdesc.dwFlags & DSDDESC_USESYSTEMMEMORY) {
+                /* allocate buffer from system memory */
+                buflen = lpcDSCBufferDesc->dwBufferBytes;
+                TRACE("desired buflen=%ld, old buffer=%p\n", buflen, ipDSC->buffer);
+                if (ipDSC->buffer)
+                    newbuf = HeapReAlloc(GetProcessHeap(),0,ipDSC->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 {
+                    ipDSC->buffer = newbuf;
+                    ipDSC->buflen = buflen;
+                }
+            } else {
+                /* let driver allocate memory */
+                ipDSC->buflen = lpcDSCBufferDesc->dwBufferBytes;
+                /* FIXME: */
+                if (ipDSC->buffer)
+                    HeapFree( GetProcessHeap(), 0, ipDSC->buffer);
+                ipDSC->buffer = NULL;
+            }
+
+	    err = IDsCaptureDriver_CreateCaptureBuffer(ipDSC->driver,
 		ipDSC->pwfx,0,0,&(ipDSC->buflen),&(ipDSC->buffer),(LPVOID*)&(ipDSC->hwbuf));
 	    if (err != DS_OK) {
 		WARN("IDsCaptureDriver_CreateCaptureBuffer failed\n");
@@ -714,8 +745,6 @@
 		return err;
 	    }
 	} else {
-            LPBYTE newbuf;
-            DWORD buflen;
 	    DWORD flags = CALLBACK_FUNCTION;
 	    if (ds_hw_accel != DS_HW_ACCEL_EMULATION)
 		flags |= WAVE_DIRECTSOUND;
@@ -735,7 +764,7 @@
 	    if (ipDSC->buffer)
                 newbuf = HeapReAlloc(GetProcessHeap(),0,ipDSC->buffer,buflen);
 	    else
-		newbuf = HeapAlloc(GetProcessHeap(),0,buflen);	    
+		newbuf = HeapAlloc(GetProcessHeap(),0,buflen);
             if (newbuf == NULL) {
                 WARN("failed to allocate capture buffer\n");
                 err = DSERR_OUTOFMEMORY;
@@ -826,10 +855,10 @@
 	/* Make an internal copy of the caller-supplied array.
 	 * Replace the existing copy if one is already present. */
 	if (This->dscb->notifies)
-	    This->dscb->notifies = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 
+	    This->dscb->notifies = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
 		This->dscb->notifies, howmuch * sizeof(DSBPOSITIONNOTIFY));
 	else
-	    This->dscb->notifies = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 
+	    This->dscb->notifies = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
 		howmuch * sizeof(DSBPOSITIONNOTIFY));
 
 	if (This->dscb->notifies == NULL) {
@@ -907,7 +936,7 @@
 	    hres = IDirectSoundCaptureNotifyImpl_Create(This, &This->notify);
 	if (This->notify) {
 	    if (This->dsound->hwbuf) {
-		hres = IDsCaptureDriverBuffer_QueryInterface(This->dsound->hwbuf, 
+		hres = IDsCaptureDriverBuffer_QueryInterface(This->dsound->hwbuf,
 		    &IID_IDsDriverNotify, (LPVOID*)&(This->hwnotify));
 		if (hres != DS_OK) {
 		    WARN("IDsCaptureDriverBuffer_QueryInterface failed\n");
@@ -970,7 +999,7 @@
 	    This->dsound->hwi = 0;
 	}
 
-	if (This->dsound->hwbuf) 
+	if (This->dsound->hwbuf)
 	    IDsCaptureDriverBuffer_Release(This->dsound->hwbuf);
 
         /* remove from IDirectSoundCaptureImpl */
@@ -981,7 +1010,7 @@
 
         if (This->notify)
 	    IDirectSoundNotify_Release((LPDIRECTSOUNDNOTIFY)This->notify);
-        
+
 	if (This->notifies != NULL)
 		HeapFree(GetProcessHeap(), 0, This->notifies);
 
@@ -1011,7 +1040,7 @@
     }
 
     if (lpDSCBCaps->dwSize < sizeof(DSCBCAPS)) {
-        WARN("invalid parameter: lpDSCBCaps->dwSize = %ld < %d\n", 
+        WARN("invalid parameter: lpDSCBCaps->dwSize = %ld < %d\n",
 	    lpDSCBCaps->dwSize, sizeof(DSCBCAPS));
         return DSERR_INVALIDPARAM;
     }
@@ -1063,18 +1092,18 @@
             MMTIME mtime;
             mtime.wType = TIME_BYTES;
             waveInGetPosition(This->dsound->hwi, &mtime, sizeof(mtime));
-	    TRACE("mtime.u.cb=%ld,This->dsound->buflen=%ld\n", mtime.u.cb, 
+	    TRACE("mtime.u.cb=%ld,This->dsound->buflen=%ld\n", mtime.u.cb,
 		This->dsound->buflen);
 	    mtime.u.cb = mtime.u.cb % This->dsound->buflen;
             *lpdwCapturePosition = mtime.u.cb;
         }
-    
+
 	if (lpdwReadPosition) {
-            if (This->dsound->state == STATE_STARTING) { 
+            if (This->dsound->state == STATE_STARTING) {
 		if (lpdwCapturePosition)
 		    This->dsound->read_position = *lpdwCapturePosition;
                 This->dsound->state = STATE_CAPTURING;
-            } 
+            }
             *lpdwReadPosition = This->dsound->read_position;
         }
 	TRACE("new This->dsound->state=%s\n",captureStateString[This->dsound->state]);
@@ -1085,7 +1114,7 @@
         WARN("no driver\n");
         return DSERR_NODRIVER;
     }
-    
+
     TRACE("returning DS_OK\n");
     return DS_OK;
 }
@@ -1098,7 +1127,7 @@
     LPDWORD lpdwSizeWritten )
 {
     IDirectSoundCaptureBufferImpl *This = (IDirectSoundCaptureBufferImpl *)iface;
-    TRACE( "(%p,%p,0x%08lx,%p)\n", This, lpwfxFormat, dwSizeAllocated, 
+    TRACE( "(%p,%p,0x%08lx,%p)\n", This, lpwfxFormat, dwSizeAllocated,
         lpdwSizeWritten );
 
     if (This == NULL) {
@@ -1159,7 +1188,7 @@
 
     TRACE("old This->dsound->state=%s, old lpdwStatus=%08lx\n",
 	captureStateString[This->dsound->state],*lpdwStatus);
-    if ((This->dsound->state == STATE_STARTING) || 
+    if ((This->dsound->state == STATE_STARTING) ||
         (This->dsound->state == STATE_CAPTURING)) {
         *lpdwStatus |= DSCBSTATUS_CAPTURING;
         if (This->flags & DSCBSTART_LOOPING)
@@ -1227,7 +1256,7 @@
     EnterCriticalSection(&(This->dsound->lock));
 
     if (This->dsound->driver) {
-        err = IDsCaptureDriverBuffer_Lock(This->dsound->hwbuf, lplpvAudioPtr1, 
+        err = IDsCaptureDriverBuffer_Lock(This->dsound->hwbuf, lplpvAudioPtr1,
 					   lpdwAudioBytes1, lplpvAudioPtr2, lpdwAudioBytes2,
 					   dwReadCusor, dwReadBytes, dwFlags);
 	if (err != DS_OK)
@@ -1312,7 +1341,7 @@
 		if (ipDSC->pwave)
                     ipDSC->pwave = HeapReAlloc(GetProcessHeap(),0,ipDSC->pwave,
 	                ipDSC->nrofpwaves*sizeof(WAVEHDR));
-		else 
+		else
                     ipDSC->pwave = HeapAlloc(GetProcessHeap(),0,
 	                ipDSC->nrofpwaves*sizeof(WAVEHDR));
 
@@ -1324,13 +1353,13 @@
                     }
                     if (c == 0) {
                         ipDSC->pwave[0].lpData = ipDSC->buffer;
-                        ipDSC->pwave[0].dwBufferLength = 
+                        ipDSC->pwave[0].dwBufferLength =
                             This->notifies[0].dwOffset + 1;
                     } else {
-                        ipDSC->pwave[c].lpData = ipDSC->buffer + 
+                        ipDSC->pwave[c].lpData = ipDSC->buffer +
                             This->notifies[c-1].dwOffset + 1;
-                        ipDSC->pwave[c].dwBufferLength = 
-                            This->notifies[c].dwOffset - 
+                        ipDSC->pwave[c].dwBufferLength =
+                            This->notifies[c].dwOffset -
                             This->notifies[c-1].dwOffset;
                     }
                     ipDSC->pwave[c].dwBytesRecorded = 0;
@@ -1347,7 +1376,7 @@
 			break;
 		    }
 
-	            err = mmErr(waveInAddBuffer(ipDSC->hwi, 
+	            err = mmErr(waveInAddBuffer(ipDSC->hwi,
 			&(ipDSC->pwave[c]), sizeof(WAVEHDR)));
 		    if (err != DS_OK) {
                         WARN("waveInAddBuffer failed\n");
@@ -1358,7 +1387,7 @@
 		    }
                 }
 
-                memset(ipDSC->buffer, 
+                memset(ipDSC->buffer,
                     (ipDSC->pwfx->wBitsPerSample == 8) ? 128 : 0, ipDSC->buflen);
             } else {
 		TRACE("no notifiers specified\n");
@@ -1370,7 +1399,7 @@
                     ipDSC->pwave = HeapAlloc(GetProcessHeap(),0,sizeof(WAVEHDR));
 
                 ipDSC->pwave[0].lpData = ipDSC->buffer;
-                ipDSC->pwave[0].dwBufferLength = ipDSC->buflen; 
+                ipDSC->pwave[0].dwBufferLength = ipDSC->buflen;
                 ipDSC->pwave[0].dwBytesRecorded = 0;
                 ipDSC->pwave[0].dwUser = (DWORD)ipDSC;
                 ipDSC->pwave[0].dwFlags = 0;
@@ -1383,7 +1412,7 @@
                     waveInUnprepareHeader(ipDSC->hwi,
                         &(ipDSC->pwave[0]),sizeof(WAVEHDR));
 		}
-	        err = mmErr(waveInAddBuffer(ipDSC->hwi, 
+	        err = mmErr(waveInAddBuffer(ipDSC->hwi,
 		    &(ipDSC->pwave[0]), sizeof(WAVEHDR)));
 		if (err != DS_OK) {
 		    WARN("waveInAddBuffer failed\n");
@@ -1454,7 +1483,7 @@
 		WARN("IDsCaptureDriver_CreateCaptureBuffer failed\n");
 		This->dsound->hwbuf = 0;
 	    }
-	} else if (err != DS_OK) 
+	} else if (err != DS_OK)
 	    WARN("IDsCaptureDriverBuffer_Stop failed\n");
     } else if (This->dsound->hwi) {
         err = waveInStop(This->dsound->hwi);
@@ -1476,7 +1505,7 @@
     DWORD dwAudioBytes2 )
 {
     IDirectSoundCaptureBufferImpl *This = (IDirectSoundCaptureBufferImpl *)iface;
-    TRACE( "(%p,%p,%08lu,%p,%08lu)\n", This, lpvAudioPtr1, dwAudioBytes1, 
+    TRACE( "(%p,%p,%08lu,%p,%08lu)\n", This, lpvAudioPtr1, dwAudioBytes1,
         lpvAudioPtr2, dwAudioBytes2 );
 
     if (This == NULL) {
@@ -1491,13 +1520,13 @@
 
     if (This->dsound->driver) {
 	HRESULT	hres;
-        hres = IDsCaptureDriverBuffer_Unlock(This->dsound->hwbuf, lpvAudioPtr1, 
+        hres = IDsCaptureDriverBuffer_Unlock(This->dsound->hwbuf, lpvAudioPtr1,
 					   dwAudioBytes1, lpvAudioPtr2, dwAudioBytes2);
 	if (hres != DS_OK)
 	    WARN("IDsCaptureDriverBuffer_Unlock failed\n");
 	return hres;
     } else if (This->dsound->hwi) {
-        This->dsound->read_position = (This->dsound->read_position + 
+        This->dsound->read_position = (This->dsound->read_position +
             (dwAudioBytes1 + dwAudioBytes2)) % This->dsound->buflen;
     } else {
         WARN("invalid call\n");
@@ -1517,7 +1546,7 @@
 {
     IDirectSoundCaptureBufferImpl *This = (IDirectSoundCaptureBufferImpl *)iface;
 
-    FIXME( "(%p,%s,%lu,%s,%p): stub\n", This, debugstr_guid(rguidObject), 
+    FIXME( "(%p,%s,%lu,%s,%p): stub\n", This, debugstr_guid(rguidObject),
         dwIndex, debugstr_guid(rguidInterface), ppObject );
 
     return DS_OK;
@@ -1564,7 +1593,7 @@
  */
 
 static HRESULT WINAPI
-DSCCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) 
+DSCCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj)
 {
     IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
 
@@ -1580,7 +1609,7 @@
     return InterlockedIncrement(&(This->ref));
 }
 
-static ULONG WINAPI 
+static ULONG WINAPI
 DSCCF_Release(LPCLASSFACTORY iface)
 {
     IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
@@ -1589,13 +1618,18 @@
     return InterlockedDecrement(&(This->ref));
 }
 
-static HRESULT WINAPI 
+static HRESULT WINAPI
 DSCCF_CreateInstance(
 	LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj )
 {
     IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
     TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
 
+    if (pOuter) {
+        WARN("aggregation not supported\n");
+        return CLASS_E_NOAGGREGATION;
+    }
+
     if (ppobj == NULL) {
 	WARN("invalid parameter\n");
 	return E_INVALIDARG;
@@ -1603,16 +1637,14 @@
 
     *ppobj = NULL;
 
-    if ( IsEqualGUID( &IID_IDirectSoundCapture, riid ) ||
-	 IsEqualGUID( &IID_IDirectSoundCapture8, riid ) ) {
+    if ( IsEqualGUID( &IID_IDirectSoundCapture8, riid ) )
 	return DirectSoundCaptureCreate8(0,(LPDIRECTSOUNDCAPTURE8*)ppobj,pOuter);
-    }
 
     WARN("(%p,%p,%s,%p) Interface not found!\n",This,pOuter,debugstr_guid(riid),ppobj);	
     return E_NOINTERFACE;
 }
 
-static HRESULT WINAPI 
+static HRESULT WINAPI
 DSCCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
 {
     IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
@@ -1637,7 +1669,7 @@
  * Create and initialize a DirectSoundFullDuplex interface.
  *
  * PARAMS
- *    pcGuidCaptureDevice [I] Address of sound capture device GUID. 
+ *    pcGuidCaptureDevice [I] Address of sound capture device GUID.
  *    pcGuidRenderDevice  [I] Address of sound render device GUID.
  *    pcDSCBufferDesc     [I] Address of capture buffer description.
  *    pcDSBufferDesc      [I] Address of  render buffer description.
@@ -1653,7 +1685,7 @@
  *    Failure: DSERR_NOAGGREGATION, DSERR_ALLOCATED, DSERR_INVALIDPARAM,
  *             DSERR_OUTOFMEMORY DSERR_INVALIDCALL DSERR_NODRIVER
  */
-HRESULT WINAPI 
+HRESULT WINAPI
 DirectSoundFullDuplexCreate(
     LPCGUID pcGuidCaptureDevice,
     LPCGUID pcGuidRenderDevice,
@@ -1667,7 +1699,7 @@
     LPUNKNOWN pUnkOuter)
 {
     IDirectSoundFullDuplexImpl** ippDSFD=(IDirectSoundFullDuplexImpl**)ppDSFD;
-    TRACE("(%s,%s,%p,%p,%lx,%lx,%p,%p,%p,%p)\n", debugstr_guid(pcGuidCaptureDevice), 
+    TRACE("(%s,%s,%p,%p,%lx,%lx,%p,%p,%p,%p)\n", debugstr_guid(pcGuidCaptureDevice),
 	debugstr_guid(pcGuidRenderDevice), pcDSCBufferDesc, pcDSBufferDesc,
 	(DWORD)hWnd, dwLevel, ppDSFD, ppDSCBuffer8, ppDSBuffer8, pUnkOuter);
 
@@ -1764,7 +1796,7 @@
     IDirectSoundCaptureBufferImpl** ippdscb=(IDirectSoundCaptureBufferImpl**)lplpDirectSoundCaptureBuffer8;
     IDirectSoundBufferImpl** ippdsc=(IDirectSoundBufferImpl**)lplpDirectSoundBuffer8;
 
-    FIXME( "(%p,%s,%s,%p,%p,%lx,%lx,%p,%p) stub!\n", This, debugstr_guid(pCaptureGuid), 
+    FIXME( "(%p,%s,%s,%p,%p,%lx,%lx,%p,%p) stub!\n", This, debugstr_guid(pCaptureGuid),
 	debugstr_guid(pRendererGuid), lpDscBufferDesc, lpDsBufferDesc, (DWORD)hWnd, dwLevel,
 	ippdscb, ippdsc);
 
@@ -1803,8 +1835,8 @@
     return InterlockedIncrement(&(This->ref));
 }
 
-static ULONG WINAPI 
-DSFDCF_Release(LPCLASSFACTORY iface) 
+static ULONG WINAPI
+DSFDCF_Release(LPCLASSFACTORY iface)
 {
     IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
     /* static class, won't be  freed */
@@ -1812,7 +1844,7 @@
     return InterlockedDecrement(&(This->ref));
 }
 
-static HRESULT WINAPI 
+static HRESULT WINAPI
 DSFDCF_CreateInstance(
     LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj )
 {
@@ -1820,6 +1852,11 @@
 
     TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
 
+    if (pOuter) {
+        WARN("aggregation not supported\n");
+        return CLASS_E_NOAGGREGATION;
+    }
+
     if (ppobj == NULL) {
 	WARN("invalid parameter\n");
 	return E_INVALIDARG;
@@ -1837,7 +1874,7 @@
     return E_NOINTERFACE;
 }
 
-static HRESULT WINAPI 
+static HRESULT WINAPI
 DSFDCF_LockServer(LPCLASSFACTORY iface,BOOL dolock)
 {
     IClassFactoryImpl *This = (IClassFactoryImpl *)iface;


More information about the wine-patches mailing list