dsound: property set interface patch

Robert Reif reif at earthlink.net
Fri Dec 3 12:53:38 CST 2004


Return the actual device interface name.
Fixes some memory leaks.
-------------- next part --------------
Index: dlls/dsound/propset.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/propset.c,v
retrieving revision 1.26
diff -u -r1.26 propset.c
--- dlls/dsound/propset.c	17 Sep 2004 18:10:59 -0000	1.26
+++ dlls/dsound/propset.c	3 Dec 2004 19:46:45 -0000
@@ -848,15 +848,29 @@
 		for (wod = 0; wod < devs; ++wod) {
 		    err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
 		    if (err == DS_OK) {
+			DWORD size;
 			memset(&data, 0, sizeof(data));
 			data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
 			data.WaveDeviceId = wod;
 			data.DeviceId = renderer_guids[wod];
 			data.Description = desc.szDesc;
 			data.Module = desc.szDrvName;
-			data.Interface = "Interface";
-			TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
-			(ppd->Callback)(&data, ppd->Context);
+			err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDEVICEINTERFACESIZE,(DWORD_PTR)&size,0));
+			if (err == DS_OK) {
+			    WCHAR * nameW = HeapAlloc(GetProcessHeap(),0,size);
+			    err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDEVICEINTERFACE,(DWORD_PTR)nameW,size));
+			    if (err == DS_OK) {
+				CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,size/sizeof(WCHAR));
+				WideCharToMultiByte( CP_ACP, 0, nameW, size/sizeof(WCHAR), szInterface, size/sizeof(WCHAR), NULL, NULL );
+				data.Interface = szInterface;
+
+				TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
+				(ppd->Callback)(&data, ppd->Context);
+
+				HeapFree(GetProcessHeap(),0,szInterface);
+			    }
+			    HeapFree(GetProcessHeap(),0,nameW);
+			}
 		    }
 		}
 
@@ -864,15 +878,29 @@
 		for (wid = 0; wid < devs; ++wid) {
 		    err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
 		    if (err == DS_OK) {
+			DWORD size;
 			memset(&data, 0, sizeof(data));
 			data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
 			data.WaveDeviceId = wid;
 			data.DeviceId = capture_guids[wid];
 			data.Description = desc.szDesc;
 			data.Module = desc.szDrvName;
-			data.Interface = "Interface";
-			TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
-			(ppd->Callback)(&data, ppd->Context);
+			err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDEVICEINTERFACESIZE,(DWORD_PTR)&size,0));
+			if (err == DS_OK) {
+			    WCHAR * nameW = HeapAlloc(GetProcessHeap(),0,size);
+			    err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDEVICEINTERFACE,(DWORD_PTR)nameW,size));
+			    if (err == DS_OK) {
+				CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,size/sizeof(WCHAR));
+				WideCharToMultiByte( CP_ACP, 0, nameW, size/sizeof(WCHAR), szInterface, size/sizeof(WCHAR), NULL, NULL );
+				data.Interface = szInterface;
+
+				TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
+				(ppd->Callback)(&data, ppd->Context);
+
+				HeapFree(GetProcessHeap(),0,szInterface);
+			    }
+			    HeapFree(GetProcessHeap(),0,nameW);
+			}
 		    }
 		}
 
@@ -913,25 +941,33 @@
 		for (wod = 0; wod < devs; ++wod) {
 		    err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
 		    if (err == DS_OK) {
-			/* FIXME: this is a memory leak */
 			WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
 			WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
-			WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
-
-			memset(&data, 0, sizeof(data));
-			data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
-			data.WaveDeviceId = wod;
-			data.DeviceId = renderer_guids[wod];
-
-			MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100  );
-			MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, wModule, 0x100 );
-			MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
-
-			data.Description = wDescription;
-			data.Module = wModule;
-			data.Interface = wInterface;
-			TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
-			(ppd->Callback)(&data, ppd->Context);
+			DWORD size;
+			err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDEVICEINTERFACESIZE, (DWORD_PTR)&size, 0));
+			if (err == DS_OK) {
+			    WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,size);
+			    err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDEVICEINTERFACE, (DWORD_PTR)wInterface, size));
+			    if (err == DS_OK) {
+				memset(&data, 0, sizeof(data));
+				data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
+				data.WaveDeviceId = wod;
+				data.DeviceId = renderer_guids[wod];
+
+				MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
+				MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, wModule, 0x100 );
+
+				data.Description = wDescription;
+				data.Module = wModule;
+				data.Interface = wInterface;
+
+				TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
+				(ppd->Callback)(&data, ppd->Context);
+			    }
+			    HeapFree(GetProcessHeap(),0,wInterface);
+			}
+			HeapFree(GetProcessHeap(),0,wDescription);
+			HeapFree(GetProcessHeap(),0,wModule);
 		    }
 		}
 
@@ -939,25 +975,32 @@
 		for (wid = 0; wid < devs; ++wid) {
 		    err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
 		    if (err == DS_OK) {
-			/* FIXME: this is a memory leak */
 			WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
 			WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
-			WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
-
-			memset(&data, 0, sizeof(data));
-			data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
-			data.WaveDeviceId = wid;
-			data.DeviceId = capture_guids[wid];
-
-			MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100  );
-			MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, wModule, 0x100 );
-			MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
-
-			data.Description = wDescription;
-			data.Module = wModule;
-			data.Interface = wInterface;
-			TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
-			(ppd->Callback)(&data, ppd->Context);
+			DWORD size;
+			err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDEVICEINTERFACESIZE, (DWORD_PTR)&size, 0));
+			if (err == DS_OK) {
+			    WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,size);
+			    err = mmErr(waveInMessage((HWAVEIN)wod, DRV_QUERYDEVICEINTERFACE, (DWORD_PTR)wInterface, size));
+			    if (err == DS_OK) {
+				memset(&data, 0, sizeof(data));
+				data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
+				data.WaveDeviceId = wid;
+				data.DeviceId = capture_guids[wid];
+
+				MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
+				MultiByteToWideChar( CP_ACP, 0, desc.szDrvName, -1, wModule, 0x100 );
+
+				data.Description = wDescription;
+				data.Module = wModule;
+				data.Interface = wInterface;
+				TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
+				(ppd->Callback)(&data, ppd->Context);
+			    }
+			    HeapFree(GetProcessHeap(),0,wInterface);
+			}
+			HeapFree(GetProcessHeap(),0,wDescription);
+			HeapFree(GetProcessHeap(),0,wModule);
 		    }
 		}
 


More information about the wine-patches mailing list