[DSOUND] propset cleanup
Robert Reif
reif at earthlink.net
Fri Mar 11 13:08:59 CST 2005
Add missing functionality.
Add more and better error messages.
Add checks for failed HeapAlloc.
-------------- next part --------------
Index: dlls/dsound/propset.c
===================================================================
RCS file: /home/wine/wine/dlls/dsound/propset.c,v
retrieving revision 1.33
diff -u -p -r1.33 propset.c
--- dlls/dsound/propset.c 11 Feb 2005 11:49:05 -0000 1.33
+++ dlls/dsound/propset.c 11 Mar 2005 19:04:16 -0000
@@ -391,9 +391,11 @@ static HRESULT WINAPI DSPROPERTY_Descrip
err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD)&drv, 0));
if (err == DS_OK && drv)
ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
+ else
+ WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
break;
} else {
- WARN("waveOutMessage failed\n");
+ WARN("waveOutMessage(DRV_QUERYDSOUNDDESC) failed\n");
return E_PROP_ID_UNSUPPORTED;
}
}
@@ -420,9 +422,11 @@ static HRESULT WINAPI DSPROPERTY_Descrip
err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDIFACE,(DWORD)&drv,0));
if (err == DS_OK && drv)
ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
+ else
+ WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
break;
} else {
- WARN("waveInMessage failed\n");
+ WARN("waveInMessage(DRV_QUERYDSOUNDDESC) failed\n");
return E_PROP_ID_UNSUPPORTED;
}
}
@@ -450,10 +454,12 @@ static HRESULT WINAPI DSPROPERTY_Descrip
err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD)&drv, 0));
if (err == DS_OK && drv)
ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
+ else
+ WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
found = TRUE;
break;
} else {
- WARN("waveOutMessage failed\n");
+ WARN("waveOutMessage(DRV_QUERYDSOUNDDESC) failed\n");
return E_PROP_ID_UNSUPPORTED;
}
}
@@ -481,10 +487,12 @@ static HRESULT WINAPI DSPROPERTY_Descrip
err = mmErr(waveInMessage((HWAVEIN)wod, DRV_QUERYDSOUNDIFACE, (DWORD)&drv, 0));
if (err == DS_OK && drv)
ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
+ else
+ WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
found = TRUE;
break;
} else {
- WARN("waveInMessage failed\n");
+ WARN("waveInMessage(DRV_QUERYDSOUNDDESC) failed\n");
return E_PROP_ID_UNSUPPORTED;
}
}
@@ -543,33 +551,43 @@ static HRESULT WINAPI DSPROPERTY_Descrip
ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
wodn = waveOutGetNumDevs();
for (wod = 0; wod < wodn; wod++) {
- if (IsEqualGUID( &dev_guid, &renderer_guids[wod] ) ) {
- DSDRIVERDESC desc;
- ppd->WaveDeviceId = wod;
- err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
- if (err == DS_OK) {
- PIDSDRIVER drv = NULL;
- /* FIXME: this is a memory leak */
- CHAR * szDescription = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDesc) + 1);
- CHAR * szModule = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDrvname) + 1);
- CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
-
- strcpy(szDescription, desc.szDesc);
- strcpy(szModule, desc.szDrvname);
- strcpy(szInterface, "Interface");
-
- ppd->Description = szDescription;
- ppd->Module = szModule;
- ppd->Interface = szInterface;
- err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD)&drv, 0));
- if (err == DS_OK && drv)
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- break;
+ if (IsEqualGUID( &dev_guid, &renderer_guids[wod] ) ) {
+ DSDRIVERDESC desc;
+ ppd->WaveDeviceId = wod;
+ err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
+ if (err == DS_OK) {
+ PIDSDRIVER drv = NULL;
+ /* FIXME: this is a memory leak */
+ CHAR * szDescription = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDesc) + 1);
+ CHAR * szModule = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDrvname) + 1);
+ CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
+
+ if (szDescription && szModule && szInterface) {
+ strcpy(szDescription, desc.szDesc);
+ strcpy(szModule, desc.szDrvname);
+ strcpy(szInterface, "Interface");
+
+ ppd->Description = szDescription;
+ ppd->Module = szModule;
+ ppd->Interface = szInterface;
+ err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD)&drv, 0));
+ if (err == DS_OK && drv)
+ ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
+ else
+ WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
+ break;
} else {
- WARN("waveOutMessage failed\n");
- return E_PROP_ID_UNSUPPORTED;
+ WARN("no memory\n");
+ HeapFree(GetProcessHeap(), 0, szDescription);
+ HeapFree(GetProcessHeap(), 0, szModule);
+ HeapFree(GetProcessHeap(), 0, szInterface);
+ return E_OUTOFMEMORY;
}
+ } else {
+ WARN("waveOutMessage(DRV_QUERYDSOUNDDESC) failed\n");
+ return E_PROP_ID_UNSUPPORTED;
}
+ }
}
} else if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) ||
IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoiceCapture) ) {
@@ -579,33 +597,43 @@ static HRESULT WINAPI DSPROPERTY_Descrip
ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
widn = waveInGetNumDevs();
for (wid = 0; wid < widn; wid++) {
- if (IsEqualGUID( &dev_guid, &capture_guids[wid] ) ) {
- DSDRIVERDESC desc;
- ppd->WaveDeviceId = wid;
- err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
- if (err == DS_OK) {
- PIDSCDRIVER drv;
- /* FIXME: this is a memory leak */
- CHAR * szDescription = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDesc) + 1);
- CHAR * szModule = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDrvname) + 1);
- CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
-
- strcpy(szDescription, desc.szDesc);
- strcpy(szModule, desc.szDrvname);
- strcpy(szInterface, "Interface");
-
- ppd->Description = szDescription;
- ppd->Module = szModule;
- ppd->Interface = szInterface;
- err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDIFACE,(DWORD)&drv,0));
- if (err == DS_OK && drv)
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- break;
+ if (IsEqualGUID( &dev_guid, &capture_guids[wid] ) ) {
+ DSDRIVERDESC desc;
+ ppd->WaveDeviceId = wid;
+ err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
+ if (err == DS_OK) {
+ PIDSCDRIVER drv;
+ /* FIXME: this is a memory leak */
+ CHAR * szDescription = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDesc) + 1);
+ CHAR * szModule = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDrvname) + 1);
+ CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
+
+ if (szDescription && szModule && szInterface) {
+ strcpy(szDescription, desc.szDesc);
+ strcpy(szModule, desc.szDrvname);
+ strcpy(szInterface, "Interface");
+
+ ppd->Description = szDescription;
+ ppd->Module = szModule;
+ ppd->Interface = szInterface;
+ err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDIFACE,(DWORD)&drv,0));
+ if (err == DS_OK && drv)
+ ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
+ else
+ WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
+ break;
} else {
- WARN("waveInMessage failed\n");
- return E_PROP_ID_UNSUPPORTED;
+ WARN("no memory\n");
+ HeapFree(GetProcessHeap(), 0, szDescription);
+ HeapFree(GetProcessHeap(), 0, szModule);
+ HeapFree(GetProcessHeap(), 0, szInterface);
+ return E_OUTOFMEMORY;
}
+ } else {
+ WARN("waveInMessage(DRV_QUERYDSOUNDDESC) failed\n");
+ return E_PROP_ID_UNSUPPORTED;
}
+ }
}
} else {
BOOL found = FALSE;
@@ -614,19 +642,20 @@ static HRESULT WINAPI DSPROPERTY_Descrip
/* given specific device so try the render devices first */
wodn = waveOutGetNumDevs();
for (wod = 0; wod < wodn; wod++) {
- if (IsEqualGUID( &ppd->DeviceId, &renderer_guids[wod] ) ) {
- DSDRIVERDESC desc;
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
- ppd->WaveDeviceId = wod;
- err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
- if (err == DS_OK) {
- PIDSDRIVER drv = NULL;
- /* FIXME: this is a memory leak */
- CHAR * szDescription = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDesc) + 1);
- CHAR * szModule = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDrvname) + 1);
- CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
+ if (IsEqualGUID( &ppd->DeviceId, &renderer_guids[wod] ) ) {
+ DSDRIVERDESC desc;
+ TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
+ ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
+ ppd->WaveDeviceId = wod;
+ err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
+ if (err == DS_OK) {
+ PIDSDRIVER drv = NULL;
+ /* FIXME: this is a memory leak */
+ CHAR * szDescription = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDesc) + 1);
+ CHAR * szModule = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDrvname) + 1);
+ CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
+ if (szDescription && szModule && szInterface) {
strcpy(szDescription, desc.szDesc);
strcpy(szModule, desc.szDrvname);
strcpy(szInterface, "Interface");
@@ -637,13 +666,70 @@ static HRESULT WINAPI DSPROPERTY_Descrip
err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD)&drv, 0));
if (err == DS_OK && drv)
ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
+ else
+ WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
found = TRUE;
break;
} else {
- WARN("waveOutMessage failed\n");
- return E_PROP_ID_UNSUPPORTED;
+ WARN("no memory\n");
+ HeapFree(GetProcessHeap(), 0, szDescription);
+ HeapFree(GetProcessHeap(), 0, szModule);
+ HeapFree(GetProcessHeap(), 0, szInterface);
+ return E_OUTOFMEMORY;
}
+ } else {
+ WARN("waveOutMessage(DRV_QUERYDSOUNDDESC) failed\n");
+ return E_PROP_ID_UNSUPPORTED;
}
+ }
+ }
+
+ if (found == FALSE) {
+ ULONG wid;
+ unsigned int widn;
+ TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
+ ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
+ widn = waveInGetNumDevs();
+ for (wid = 0; wid < widn; wid++) {
+ if (IsEqualGUID( &ppd->DeviceId, &capture_guids[wod] ) ) {
+ DSDRIVERDESC desc;
+ ppd->WaveDeviceId = wid;
+ err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
+ if (err == DS_OK) {
+ PIDSCDRIVER drv;
+ /* FIXME: this is a memory leak */
+ CHAR * szDescription = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDesc) + 1);
+ CHAR * szModule = HeapAlloc(GetProcessHeap(),0,strlen(desc.szDrvname) + 1);
+ CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,strlen("Interface") + 1);
+
+ if (szDescription && szModule && szInterface) {
+ strcpy(szDescription, desc.szDesc);
+ strcpy(szModule, desc.szDrvname);
+ strcpy(szInterface, "Interface");
+
+ ppd->Description = szDescription;
+ ppd->Module = szModule;
+ ppd->Interface = szInterface;
+ err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDIFACE,(DWORD)&drv,0));
+ if (err == DS_OK && drv)
+ ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
+ else
+ WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
+ found = TRUE;
+ break;
+ } else {
+ WARN("no memory\n");
+ HeapFree(GetProcessHeap(), 0, szDescription);
+ HeapFree(GetProcessHeap(), 0, szModule);
+ HeapFree(GetProcessHeap(), 0, szInterface);
+ return E_OUTOFMEMORY;
+ }
+ } else {
+ WARN("waveInMessage(DRV_QUERYDSOUNDDESC) failed\n");
+ return E_PROP_ID_UNSUPPORTED;
+ }
+ }
+ }
}
if (found == FALSE) {
@@ -698,33 +784,43 @@ static HRESULT WINAPI DSPROPERTY_Descrip
ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
wodn = waveOutGetNumDevs();
for (wod = 0; wod < wodn; wod++) {
- if (IsEqualGUID( &dev_guid, &renderer_guids[wod] ) ) {
- DSDRIVERDESC desc;
- ppd->WaveDeviceId = wod;
- err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
- if (err == DS_OK) {
- PIDSDRIVER drv = NULL;
- /* FIXME: this is a memory leak */
- WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
- WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
- WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
-
- MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
- MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, wModule, 0x100 );
- MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
-
- ppd->Description = wDescription;
- ppd->Module = wModule;
- ppd->Interface = wInterface;
- err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD)&drv, 0));
- if (err == DS_OK && drv)
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- break;
+ if (IsEqualGUID( &dev_guid, &renderer_guids[wod] ) ) {
+ DSDRIVERDESC desc;
+ ppd->WaveDeviceId = wod;
+ err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
+ if (err == DS_OK) {
+ PIDSDRIVER drv = NULL;
+ /* FIXME: this is a memory leak */
+ WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
+ WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
+ WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
+
+ if (wDescription && wModule && wInterface) {
+ MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
+ MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, wModule, 0x100 );
+ MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
+
+ ppd->Description = wDescription;
+ ppd->Module = wModule;
+ ppd->Interface = wInterface;
+ err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD)&drv, 0));
+ if (err == DS_OK && drv)
+ ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
+ else
+ WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
+ break;
} else {
- WARN("waveOutMessage failed\n");
- return E_PROP_ID_UNSUPPORTED;
+ WARN("no memory\n");
+ HeapFree(GetProcessHeap(), 0, wDescription);
+ HeapFree(GetProcessHeap(), 0, wModule);
+ HeapFree(GetProcessHeap(), 0, wInterface);
+ return E_OUTOFMEMORY;
}
+ } else {
+ WARN("waveOutMessage(DRV_QUERYDSOUNDDESC) failed\n");
+ return E_PROP_ID_UNSUPPORTED;
}
+ }
}
} else if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) ||
IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoiceCapture) ) {
@@ -734,33 +830,43 @@ static HRESULT WINAPI DSPROPERTY_Descrip
ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
widn = waveInGetNumDevs();
for (wid = 0; wid < widn; wid++) {
- if (IsEqualGUID( &dev_guid, &capture_guids[wid] ) ) {
- DSDRIVERDESC desc;
- ppd->WaveDeviceId = wid;
- err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
- if (err == DS_OK) {
- PIDSCDRIVER drv;
- /* FIXME: this is a memory leak */
- WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
- WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
- WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
-
- MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
- MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, wModule, 0x100 );
- MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
-
- ppd->Description = wDescription;
- ppd->Module = wModule;
- ppd->Interface = wInterface;
- err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDIFACE,(DWORD)&drv,0));
- if (err == DS_OK && drv)
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
+ if (IsEqualGUID( &dev_guid, &capture_guids[wid] ) ) {
+ DSDRIVERDESC desc;
+ ppd->WaveDeviceId = wid;
+ err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
+ if (err == DS_OK) {
+ PIDSCDRIVER drv;
+ /* FIXME: this is a memory leak */
+ WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
+ WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
+ WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
+
+ if (wDescription && wModule && wInterface) {
+ MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
+ MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, wModule, 0x100 );
+ MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
+
+ ppd->Description = wDescription;
+ ppd->Module = wModule;
+ ppd->Interface = wInterface;
+ err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDIFACE,(DWORD)&drv,0));
+ if (err == DS_OK && drv)
+ ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
+ else
+ WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
break;
} else {
- WARN("waveInMessage failed\n");
- return E_PROP_ID_UNSUPPORTED;
+ WARN("no memory\n");
+ HeapFree(GetProcessHeap(), 0, wDescription);
+ HeapFree(GetProcessHeap(), 0, wModule);
+ HeapFree(GetProcessHeap(), 0, wInterface);
+ return E_OUTOFMEMORY;
}
+ } else {
+ WARN("waveInMessage(DRV_QUERYDSOUNDDESC) failed\n");
+ return E_PROP_ID_UNSUPPORTED;
}
+ }
}
} else {
BOOL found = FALSE;
@@ -769,19 +875,20 @@ static HRESULT WINAPI DSPROPERTY_Descrip
/* given specific device so try the render devices first */
wodn = waveOutGetNumDevs();
for (wod = 0; wod < wodn; wod++) {
- if (IsEqualGUID( &ppd->DeviceId, &renderer_guids[wod] ) ) {
- DSDRIVERDESC desc;
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
- ppd->WaveDeviceId = wod;
- err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
- if (err == DS_OK) {
- PIDSDRIVER drv = NULL;
- /* FIXME: this is a memory leak */
- WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
- WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
- WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
+ if (IsEqualGUID( &ppd->DeviceId, &renderer_guids[wod] ) ) {
+ DSDRIVERDESC desc;
+ TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
+ ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
+ ppd->WaveDeviceId = wod;
+ err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
+ if (err == DS_OK) {
+ PIDSDRIVER drv = NULL;
+ /* FIXME: this is a memory leak */
+ WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
+ WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
+ WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
+ if (wDescription && wModule && wInterface) {
MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, wModule, 0x100 );
MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
@@ -791,14 +898,71 @@ static HRESULT WINAPI DSPROPERTY_Descrip
ppd->Interface = wInterface;
err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD)&drv, 0));
if (err == DS_OK && drv)
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
+ ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
+ else
+ WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
found = TRUE;
break;
} else {
- WARN("waveOutMessage failed\n");
- return E_PROP_ID_UNSUPPORTED;
+ WARN("no memory\n");
+ HeapFree(GetProcessHeap(), 0, wDescription);
+ HeapFree(GetProcessHeap(), 0, wModule);
+ HeapFree(GetProcessHeap(), 0, wInterface);
+ return E_OUTOFMEMORY;
}
+ } else {
+ WARN("waveOutMessage(DRV_QUERYDSOUNDDESC) failed\n");
+ return E_PROP_ID_UNSUPPORTED;
}
+ }
+ }
+
+ if (found == FALSE) {
+ ULONG wid;
+ unsigned int widn;
+ TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
+ ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
+ widn = waveInGetNumDevs();
+ for (wid = 0; wid < widn; wid++) {
+ if (IsEqualGUID( &dev_guid, &capture_guids[wid] ) ) {
+ DSDRIVERDESC desc;
+ ppd->WaveDeviceId = wid;
+ err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&(desc),0));
+ if (err == DS_OK) {
+ PIDSCDRIVER drv;
+ /* FIXME: this is a memory leak */
+ WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
+ WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
+ WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,0x200);
+
+ if (wDescription && wModule && wInterface) {
+ MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDescription, 0x100 );
+ MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, wModule, 0x100 );
+ MultiByteToWideChar( CP_ACP, 0, "Interface", -1, wInterface, 0x100 );
+
+ ppd->Description = wDescription;
+ ppd->Module = wModule;
+ ppd->Interface = wInterface;
+ err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDIFACE,(DWORD)&drv,0));
+ if (err == DS_OK && drv)
+ ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
+ else
+ WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
+ found = TRUE;
+ break;
+ } else {
+ WARN("no memory\n");
+ HeapFree(GetProcessHeap(), 0, wDescription);
+ HeapFree(GetProcessHeap(), 0, wModule);
+ HeapFree(GetProcessHeap(), 0, wInterface);
+ return E_OUTOFMEMORY;
+ }
+ } else {
+ WARN("waveInMessage(DRV_QUERYDSOUNDDESC) failed\n");
+ return E_PROP_ID_UNSUPPORTED;
+ }
+ }
+ }
}
if (found == FALSE) {
@@ -821,8 +985,68 @@ static HRESULT WINAPI DSPROPERTY_Enumera
ULONG cbPropData,
PULONG pcbReturned )
{
- FIXME("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
+ PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1_DATA ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1_DATA) pPropData;
+ HRESULT err;
+ TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
debugstr_guid(guidPropSet),pPropData,cbPropData,pcbReturned);
+
+ if ( IsEqualGUID( &DSPROPSETID_DirectSoundDevice, guidPropSet) ) {
+ if (ppd) {
+ if (ppd->Callback) {
+ unsigned devs, wod, wid;
+ DSDRIVERDESC desc;
+ DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA data;
+
+ devs = waveOutGetNumDevs();
+ for (wod = 0; wod < devs; ++wod) {
+ err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
+ if (err == DS_OK) {
+ ZeroMemory(&data, sizeof(data));
+ data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
+ data.WaveDeviceId = wod;
+ data.DeviceId = renderer_guids[wod];
+ strncpy(data.DescriptionA, desc.szDesc, sizeof(data.DescriptionA));
+ strncpy(data.ModuleA, desc.szDrvname, sizeof(data.ModuleA));
+
+ MultiByteToWideChar( CP_ACP, 0, data.DescriptionA, -1, data.DescriptionW, sizeof(data.DescriptionW) );
+ MultiByteToWideChar( CP_ACP, 0, data.ModuleA, -1, data.ModuleW, sizeof(data.ModuleW) );
+
+ TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
+ (ppd->Callback)(&data, ppd->Context);
+ }
+ }
+
+ devs = waveInGetNumDevs();
+ for (wid = 0; wid < devs; ++wid) {
+ err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
+ if (err == DS_OK) {
+ ZeroMemory(&data, sizeof(data));
+ data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
+ data.WaveDeviceId = wod;
+ data.DeviceId = renderer_guids[wod];
+ strncpy(data.DescriptionA, desc.szDesc, sizeof(data.DescriptionA));
+ strncpy(data.ModuleA, desc.szDrvname, sizeof(data.ModuleA));
+
+ MultiByteToWideChar( CP_ACP, 0, data.DescriptionA, -1, data.DescriptionW, sizeof(data.DescriptionW) );
+ MultiByteToWideChar( CP_ACP, 0, data.ModuleA, -1, data.ModuleW, sizeof(data.ModuleW) );
+
+ TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
+ (ppd->Callback)(&data, ppd->Context);
+ }
+ }
+
+ return S_OK;
+ }
+ }
+ } else {
+ FIXME("unsupported property: %s\n",debugstr_guid(guidPropSet));
+ }
+
+ if (pcbReturned) {
+ *pcbReturned = 0;
+ FIXME("*pcbReturned=%ld\n", *pcbReturned);
+ }
+
return E_PROP_ID_UNSUPPORTED;
}
@@ -849,27 +1073,31 @@ static HRESULT WINAPI DSPROPERTY_Enumera
err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
if (err == DS_OK) {
DWORD size;
- ZeroMemory(&data, sizeof(data));
- data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
- data.WaveDeviceId = wod;
- data.DeviceId = renderer_guids[wod];
- data.Description = desc.szDesc;
- data.Module = desc.szDrvname;
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);
+ if (nameW) {
+ err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDEVICEINTERFACE,(DWORD_PTR)nameW,size));
+ if (err == DS_OK) {
+ CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,size/sizeof(WCHAR));
+ if (szInterface) {
+ ZeroMemory(&data, sizeof(data));
+ data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
+ data.WaveDeviceId = wod;
+ data.DeviceId = renderer_guids[wod];
+ data.Description = desc.szDesc;
+ data.Module = desc.szDrvname;
+ WideCharToMultiByte( CP_ACP, 0, nameW, size/sizeof(WCHAR), szInterface, size/sizeof(WCHAR), NULL, NULL );
+ data.Interface = szInterface;
+
+ TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
+ (ppd->Callback)(&data, ppd->Context);
+
+ HeapFree(GetProcessHeap(),0,szInterface);
+ }
+ }
+ HeapFree(GetProcessHeap(),0,nameW);
}
- HeapFree(GetProcessHeap(),0,nameW);
}
}
}
@@ -879,27 +1107,31 @@ static HRESULT WINAPI DSPROPERTY_Enumera
err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD)&desc,0));
if (err == DS_OK) {
DWORD size;
- ZeroMemory(&data, sizeof(data));
- data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
- data.WaveDeviceId = wid;
- data.DeviceId = capture_guids[wid];
- data.Description = desc.szDesc;
- data.Module = desc.szDrvname;
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);
+ if (nameW) {
+ err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDEVICEINTERFACE,(DWORD_PTR)nameW,size));
+ if (err == DS_OK) {
+ CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,size/sizeof(WCHAR));
+ if (szInterface) {
+ ZeroMemory(&data, sizeof(data));
+ data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
+ data.WaveDeviceId = wid;
+ data.DeviceId = capture_guids[wid];
+ data.Description = desc.szDesc;
+ data.Module = desc.szDrvname;
+ WideCharToMultiByte( CP_ACP, 0, nameW, size/sizeof(WCHAR), szInterface, size/sizeof(WCHAR), NULL, NULL );
+ data.Interface = szInterface;
+
+ TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
+ (ppd->Callback)(&data, ppd->Context);
+
+ HeapFree(GetProcessHeap(),0,szInterface);
+ }
+ }
+ HeapFree(GetProcessHeap(),0,nameW);
}
- HeapFree(GetProcessHeap(),0,nameW);
}
}
}
@@ -943,31 +1175,35 @@ static HRESULT WINAPI DSPROPERTY_Enumera
if (err == DS_OK) {
WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
- 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 (wDescription && wModule) {
+ DWORD size;
+ err = mmErr(waveOutMessage((HWAVEOUT)wod,DRV_QUERYDEVICEINTERFACESIZE, (DWORD_PTR)&size, 0));
if (err == DS_OK) {
- ZeroMemory(&data, 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);
+ WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,size);
+ if (wInterface) {
+ err = mmErr(waveOutMessage((HWAVEOUT)wod, DRV_QUERYDEVICEINTERFACE, (DWORD_PTR)wInterface, size));
+ if (err == DS_OK) {
+ ZeroMemory(&data, 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,wInterface);
+ HeapFree(GetProcessHeap(),0,wDescription);
+ HeapFree(GetProcessHeap(),0,wModule);
}
- HeapFree(GetProcessHeap(),0,wDescription);
- HeapFree(GetProcessHeap(),0,wModule);
}
}
@@ -977,30 +1213,34 @@ static HRESULT WINAPI DSPROPERTY_Enumera
if (err == DS_OK) {
WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
- 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 (wDescription && wModule) {
+ DWORD size;
+ err = mmErr(waveInMessage((HWAVEIN)wid,DRV_QUERYDEVICEINTERFACESIZE, (DWORD_PTR)&size, 0));
if (err == DS_OK) {
- ZeroMemory(&data, 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);
+ WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,size);
+ if (wInterface) {
+ err = mmErr(waveInMessage((HWAVEIN)wod, DRV_QUERYDEVICEINTERFACE, (DWORD_PTR)wInterface, size));
+ if (err == DS_OK) {
+ ZeroMemory(&data, 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,wInterface);
+ HeapFree(GetProcessHeap(),0,wDescription);
+ HeapFree(GetProcessHeap(),0,wModule)
}
- HeapFree(GetProcessHeap(),0,wDescription);
- HeapFree(GetProcessHeap(),0,wModule);
}
}
@@ -1027,8 +1267,8 @@ static HRESULT WINAPI IKsPrivateProperty
ULONG cbInstanceData,
LPVOID pPropData,
ULONG cbPropData,
- PULONG pcbReturned
-) {
+ PULONG pcbReturned )
+{
IKsPrivatePropertySetImpl *This = (IKsPrivatePropertySetImpl *)iface;
TRACE("(iface=%p,guidPropSet=%s,dwPropID=%ld,pInstanceData=%p,cbInstanceData=%ld,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n",
This,debugstr_guid(guidPropSet),dwPropID,pInstanceData,cbInstanceData,pPropData,cbPropData,pcbReturned);
More information about the wine-patches
mailing list