[PATCH 2/2] dsound: Clean up property sets hugely
Maarten Lankhorst
m.b.lankhorst at gmail.com
Fri Dec 4 07:09:33 CST 2009
---
dlls/dsound/propset.c | 1216 +++++++++++--------------------------------------
1 files changed, 261 insertions(+), 955 deletions(-)
diff --git a/dlls/dsound/propset.c b/dlls/dsound/propset.c
index 3cf65e5..fb9f280 100644
--- a/dlls/dsound/propset.c
+++ b/dlls/dsound/propset.c
@@ -88,69 +88,6 @@ static ULONG WINAPI IKsPrivatePropertySetImpl_Release(LPKSPROPERTYSET iface)
return ref;
}
-static HRESULT DSPROPERTY_WaveDeviceMappingA(
- LPVOID pPropData,
- ULONG cbPropData,
- PULONG pcbReturned )
-{
- HRESULT hr = DSERR_INVALIDPARAM;
- PDSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A_DATA ppd;
- TRACE("(pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
- pPropData,cbPropData,pcbReturned);
-
- ppd = pPropData;
-
- if (!ppd) {
- WARN("invalid parameter: pPropData\n");
- return DSERR_INVALIDPARAM;
- }
-
- if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) {
- ULONG wod;
- unsigned int wodn;
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
- wodn = waveOutGetNumDevs();
- for (wod = 0; wod < wodn; wod++) {
- WAVEOUTCAPSA capsA;
- MMRESULT res;
- res = waveOutGetDevCapsA(wod, &capsA, sizeof(capsA));
- if (res == MMSYSERR_NOERROR) {
- if (lstrcmpA(capsA.szPname, ppd->DeviceName) == 0) {
- ppd->DeviceId = DSOUND_renderer_guids[wod];
- hr = DS_OK;
- TRACE("found %s for %s\n", debugstr_guid(&ppd->DeviceId),
- ppd->DeviceName);
- break;
- }
- }
- }
- } else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
- ULONG wid;
- unsigned int widn;
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
- widn = waveInGetNumDevs();
- for (wid = 0; wid < widn; wid++) {
- WAVEINCAPSA capsA;
- MMRESULT res;
- res = waveInGetDevCapsA(wid, &capsA, sizeof(capsA));
- if (res == MMSYSERR_NOERROR) {
- if (lstrcmpA(capsA.szPname, ppd->DeviceName) == 0) {
- ppd->DeviceId = DSOUND_capture_guids[wid];
- TRACE("found %s for %s\n", debugstr_guid(&ppd->DeviceId),
- ppd->DeviceName);
- hr = DS_OK;
- break;
- }
- }
- }
- }
-
- if (pcbReturned)
- *pcbReturned = cbPropData;
-
- return hr;
-}
-
static HRESULT DSPROPERTY_WaveDeviceMappingW(
LPVOID pPropData,
ULONG cbPropData,
@@ -214,424 +151,39 @@ static HRESULT DSPROPERTY_WaveDeviceMappingW(
return hr;
}
-static HRESULT DSPROPERTY_Description1(
+static HRESULT DSPROPERTY_WaveDeviceMappingA(
LPVOID pPropData,
ULONG cbPropData,
PULONG pcbReturned )
{
- HRESULT err;
- GUID dev_guid;
- PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA ppd;
- TRACE("(pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
- pPropData,cbPropData,pcbReturned);
-
- ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA) pPropData;
+ DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_A_DATA *ppd = pPropData;
+ DSPROPERTY_DIRECTSOUNDDEVICE_WAVEDEVICEMAPPING_W_DATA data;
+ DWORD len;
+ HRESULT hr;
- if (!ppd) {
- WARN("invalid parameter: pPropData\n");
- return DSERR_INVALIDPARAM;
- }
-
- TRACE("DeviceId=%s\n",debugstr_guid(&ppd->DeviceId));
- if ( IsEqualGUID( &ppd->DeviceId , &GUID_NULL) ) {
- /* default device of type specified by ppd->DataFlow */
- if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
- } else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) {
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
- } else {
- TRACE("DataFlow=Unknown(%d)\n", ppd->DataFlow);
- }
- FIXME("(pPropData=%p,cbPropData=%d,pcbReturned=%p) GUID_NULL not implemented!\n",
- pPropData,cbPropData,pcbReturned);
- return E_PROP_ID_UNSUPPORTED;
- }
-
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
- GetDeviceID(&ppd->DeviceId, &dev_guid);
-
- if ( IsEqualGUID( &ppd->DeviceId, &DSDEVID_DefaultPlayback) ||
- IsEqualGUID( &ppd->DeviceId, &DSDEVID_DefaultVoicePlayback) ) {
- ULONG wod;
- unsigned int wodn;
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
- wodn = waveOutGetNumDevs();
- for (wod = 0; wod < wodn; wod++) {
- if (IsEqualGUID( &dev_guid, &DSOUND_renderer_guids[wod] ) ) {
- DSDRIVERDESC desc;
- ppd->WaveDeviceId = wod;
- ppd->Devnode = wod;
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- PIDSDRIVER drv = NULL;
- lstrcpynA(ppd->DescriptionA, desc.szDesc, sizeof(ppd->DescriptionA));
- lstrcpynA(ppd->ModuleA, desc.szDrvname, sizeof(ppd->ModuleA));
- MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, ppd->DescriptionW, sizeof(ppd->DescriptionW)/sizeof(WCHAR) );
- MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, ppd->ModuleW, sizeof(ppd->ModuleW)/sizeof(WCHAR) );
- err = mmErr(waveOutMessage(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
- if (err == DS_OK && drv)
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
- break;
- } else {
- WARN("waveOutMessage(DRV_QUERYDSOUNDDESC) failed\n");
- return E_PROP_ID_UNSUPPORTED;
- }
- }
- }
- } else if ( IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) ||
- IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoiceCapture) ) {
- 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, &DSOUND_capture_guids[wid] ) ) {
- DSDRIVERDESC desc;
- ppd->WaveDeviceId = wid;
- ppd->Devnode = wid;
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- PIDSCDRIVER drv;
- lstrcpynA(ppd->DescriptionA, desc.szDesc, sizeof(ppd->DescriptionA));
- lstrcpynA(ppd->ModuleA, desc.szDrvname, sizeof(ppd->ModuleA));
- MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, ppd->DescriptionW, sizeof(ppd->DescriptionW)/sizeof(WCHAR) );
- MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, ppd->ModuleW, sizeof(ppd->ModuleW)/sizeof(WCHAR) );
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDIFACE,(DWORD_PTR)&drv,0));
- if (err == DS_OK && drv)
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
- break;
- } else {
- WARN("waveInMessage(DRV_QUERYDSOUNDDESC) failed\n");
- return E_PROP_ID_UNSUPPORTED;
- }
- }
- }
- } else {
- BOOL found = FALSE;
- ULONG wod;
- unsigned int wodn;
- /* given specific device so try the render devices first */
- wodn = waveOutGetNumDevs();
- for (wod = 0; wod < wodn; wod++) {
- if (IsEqualGUID( &ppd->DeviceId, &DSOUND_renderer_guids[wod] ) ) {
- DSDRIVERDESC desc;
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
- ppd->WaveDeviceId = wod;
- ppd->Devnode = wod;
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- PIDSDRIVER drv = NULL;
- lstrcpynA(ppd->DescriptionA, desc.szDesc, sizeof(ppd->DescriptionA));
- lstrcpynA(ppd->ModuleA, desc.szDrvname, sizeof(ppd->ModuleA));
- MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, ppd->DescriptionW, sizeof(ppd->DescriptionW)/sizeof(WCHAR) );
- MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, ppd->ModuleW, sizeof(ppd->ModuleW)/sizeof(WCHAR) );
- err = mmErr(waveOutMessage(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&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(DRV_QUERYDSOUNDDESC) failed\n");
- return E_PROP_ID_UNSUPPORTED;
- }
- }
- }
-
- if (found == FALSE) {
- ULONG wid;
- unsigned int widn;
- /* given specific device so try the capture devices next */
- widn = waveInGetNumDevs();
- for (wid = 0; wid < widn; wid++) {
- if (IsEqualGUID( &ppd->DeviceId, &DSOUND_capture_guids[wid] ) ) {
- DSDRIVERDESC desc;
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
- ppd->WaveDeviceId = wid;
- ppd->Devnode = wid;
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- PIDSDRIVER drv = NULL;
- lstrcpynA(ppd->DescriptionA, desc.szDesc, sizeof(ppd->DescriptionA));
- lstrcpynA(ppd->ModuleA, desc.szDrvname, sizeof(ppd->ModuleA));
- MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, ppd->DescriptionW, sizeof(ppd->DescriptionW)/sizeof(WCHAR) );
- MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, ppd->ModuleW, sizeof(ppd->ModuleW)/sizeof(WCHAR) );
- err = mmErr(waveInMessage(UlongToHandle(wid), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&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(DRV_QUERYDSOUNDDESC) failed\n");
- return E_PROP_ID_UNSUPPORTED;
- }
- }
- }
-
- if (found == FALSE) {
- WARN("device not found\n");
- return E_PROP_ID_UNSUPPORTED;
- }
- }
- }
-
- if (pcbReturned) {
- *pcbReturned = cbPropData;
- TRACE("*pcbReturned=%d\n", *pcbReturned);
- }
-
- return S_OK;
-}
-
-static HRESULT DSPROPERTY_DescriptionA(
- LPVOID pPropData,
- ULONG cbPropData,
- PULONG pcbReturned )
-{
- PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA ppd = pPropData;
- HRESULT err;
- GUID dev_guid;
TRACE("(pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
- pPropData,cbPropData,pcbReturned);
+ pPropData,cbPropData,pcbReturned);
- TRACE("DeviceId=%s\n",debugstr_guid(&ppd->DeviceId));
- if ( IsEqualGUID( &ppd->DeviceId , &GUID_NULL) ) {
- /* default device of type specified by ppd->DataFlow */
- if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
- } else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) {
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
- } else {
- TRACE("DataFlow=Unknown(%d)\n", ppd->DataFlow);
- }
- FIXME("(pPropData=%p,cbPropData=%d,pcbReturned=%p) GUID_NULL not implemented!\n",
- pPropData,cbPropData,pcbReturned);
- return E_PROP_ID_UNSUPPORTED;
+ if (!ppd || !ppd->DeviceName) {
+ WARN("invalid parameter: ppd=%p\n", ppd);
+ return DSERR_INVALIDPARAM;
}
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
- GetDeviceID(&ppd->DeviceId, &dev_guid);
-
- if ( IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultPlayback) ||
- IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoicePlayback) ) {
- ULONG wod;
- unsigned int wodn;
- if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultPlayback) )
- TRACE("DSDEVID_DefaultPlayback\n");
- else
- TRACE("DSDEVID_DefaultVoicePlayback\n");
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
- wodn = waveOutGetNumDevs();
- for (wod = 0; wod < wodn; wod++) {
- if (IsEqualGUID( &dev_guid, &DSOUND_renderer_guids[wod] ) ) {
- DSDRIVERDESC desc;
- ppd->WaveDeviceId = wod;
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&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(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
- if (err == DS_OK && drv)
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
- break;
- } else {
- 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) ) {
- ULONG wid;
- unsigned int widn;
- if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture) )
- TRACE("DSDEVID_DefaultCapture\n");
- else
- TRACE("DSDEVID_DefaultVoiceCapture\n");
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
- widn = waveInGetNumDevs();
- for (wid = 0; wid < widn; wid++) {
- if (IsEqualGUID( &dev_guid, &DSOUND_capture_guids[wid] ) ) {
- DSDRIVERDESC desc;
- ppd->WaveDeviceId = wid;
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&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(UlongToHandle(wid),DRV_QUERYDSOUNDIFACE,(DWORD_PTR)&drv,0));
- if (err == DS_OK && drv)
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
- 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;
- }
- }
- }
- } else {
- BOOL found = FALSE;
- ULONG wod;
- unsigned int wodn;
- /* given specific device so try the render devices first */
- TRACE("Checking renderer devices\n");
- wodn = waveOutGetNumDevs();
- for (wod = 0; wod < wodn; wod++) {
- if (IsEqualGUID( &ppd->DeviceId, &DSOUND_renderer_guids[wod] ) ) {
- DSDRIVERDESC desc;
- TRACE("DSOUND_renderer_guids[%d]\n", wod);
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
- ppd->WaveDeviceId = wod;
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&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(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&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("waveOutMessage(DRV_QUERYDSOUNDDESC) failed\n");
- return E_PROP_ID_UNSUPPORTED;
- }
- }
- }
-
- if (found == FALSE) {
- ULONG wid;
- unsigned int widn;
- TRACE("Checking capture devices\n");
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
- widn = waveInGetNumDevs();
- for (wid = 0; wid < widn; wid++) {
- if (IsEqualGUID( &ppd->DeviceId, &DSOUND_capture_guids[wid] ) ) {
- DSDRIVERDESC desc;
- TRACE("DSOUND_capture_guids[%d]\n", wid);
- ppd->WaveDeviceId = wid;
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&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(UlongToHandle(wid),DRV_QUERYDSOUNDIFACE,(DWORD_PTR)&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, szDescription);
- HeapFree(GetProcessHeap(), 0, szModule);
- HeapFree(GetProcessHeap(), 0, szInterface);
- return E_OUTOFMEMORY;
- }
- } else {
- WARN("waveInMessage(DRV_QUERYDSOUNDDESC) failed\n");
- return E_PROP_ID_UNSUPPORTED;
- }
- }
- }
- }
+ data.DataFlow = ppd->DataFlow;
+ len = strlen(ppd->DeviceName)+1;
+ data.DeviceName = HeapAlloc(GetProcessHeap(), 0, len);
+ if (!data.DeviceName)
+ return E_OUTOFMEMORY;
+ MultiByteToWideChar(CP_ACP, 0, ppd->DeviceName, -1, data.DeviceName, len );
- if (found == FALSE) {
- WARN("device not found\n");
- return E_PROP_ID_UNSUPPORTED;
- }
- }
+ hr = DSPROPERTY_WaveDeviceMappingW(&data, cbPropData, pcbReturned);
+ HeapFree(GetProcessHeap(), 0, data.DeviceName);
+ ppd->DeviceId = data.DeviceId;
- if (pcbReturned) {
- *pcbReturned = cbPropData;
- TRACE("*pcbReturned=%d\n", *pcbReturned);
- }
+ if (pcbReturned)
+ *pcbReturned = cbPropData;
- return S_OK;
+ return hr;
}
static HRESULT DSPROPERTY_DescriptionW(
@@ -642,548 +194,302 @@ static HRESULT DSPROPERTY_DescriptionW(
PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA ppd = pPropData;
HRESULT err;
GUID dev_guid;
+ ULONG wod, wid, wodn, widn;
+ DSDRIVERDESC desc;
+
TRACE("pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
- pPropData,cbPropData,pcbReturned);
+ pPropData,cbPropData,pcbReturned);
TRACE("DeviceId=%s\n",debugstr_guid(&ppd->DeviceId));
if ( IsEqualGUID( &ppd->DeviceId , &GUID_NULL) ) {
- /* default device of type specified by ppd->DataFlow */
- if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
- } else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) {
- TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
- } else {
- TRACE("DataFlow=Unknown(%d)\n", ppd->DataFlow);
- }
- FIXME("(pPropData=%p,cbPropData=%d,pcbReturned=%p) GUID_NULL not implemented!\n",
- pPropData,cbPropData,pcbReturned);
- return E_PROP_ID_UNSUPPORTED;
+ /* default device of type specified by ppd->DataFlow */
+ if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) {
+ TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE\n");
+ ppd->DeviceId = DSDEVID_DefaultCapture;
+ } else if (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) {
+ TRACE("DataFlow=DIRECTSOUNDDEVICE_DATAFLOW_RENDER\n");
+ ppd->DeviceId = DSDEVID_DefaultPlayback;
+ } else {
+ WARN("DataFlow=Unknown(%d)\n", ppd->DataFlow);
+ return E_PROP_ID_UNSUPPORTED;
+ }
}
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
GetDeviceID(&ppd->DeviceId, &dev_guid);
- if ( IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultPlayback) ||
- IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultVoicePlayback) ) {
- ULONG wod;
- unsigned int wodn;
- if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultPlayback) )
- TRACE("DSDEVID_DefaultPlayback\n");
- else
- TRACE("DSDEVID_DefaultVoicePlayback\n");
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
- wodn = waveOutGetNumDevs();
- for (wod = 0; wod < wodn; wod++) {
- if (IsEqualGUID( &dev_guid, &DSOUND_renderer_guids[wod] ) ) {
- DSDRIVERDESC desc;
- TRACE("DSOUND_renderer_guids[%d]\n", wod);
- ppd->WaveDeviceId = wod;
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&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(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
- if (err == DS_OK && drv)
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
- break;
- } else {
- 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) ) {
- ULONG wid;
- unsigned int widn;
- if (IsEqualGUID( &ppd->DeviceId , &DSDEVID_DefaultCapture))
- TRACE("DSDEVID_DefaultCapture\n");
- else
- TRACE("DSDEVID_DefaultVoiceCapture\n");
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
- widn = waveInGetNumDevs();
- for (wid = 0; wid < widn; wid++) {
- if (IsEqualGUID( &dev_guid, &DSOUND_capture_guids[wid] ) ) {
- DSDRIVERDESC desc;
- ppd->WaveDeviceId = wid;
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&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(UlongToHandle(wid),DRV_QUERYDSOUNDIFACE,(DWORD_PTR)&drv,0));
- if (err == DS_OK && drv)
- ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
- 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;
- }
- }
- }
- } else {
- BOOL found = FALSE;
- ULONG wod;
- unsigned int wodn;
- TRACE("Checking renderer devices\n");
- /* given specific device so try the render devices first */
- wodn = waveOutGetNumDevs();
- for (wod = 0; wod < wodn; wod++) {
- if (IsEqualGUID( &ppd->DeviceId, &DSOUND_renderer_guids[wod] ) ) {
- DSDRIVERDESC desc;
- TRACE("DSOUND_renderer_guids[%d]\n", wod);
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
- ppd->WaveDeviceId = wod;
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&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(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&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, wDescription);
- HeapFree(GetProcessHeap(), 0, wModule);
- HeapFree(GetProcessHeap(), 0, wInterface);
- return E_OUTOFMEMORY;
- }
- } else {
- WARN("waveOutMessage(DRV_QUERYDSOUNDDESC) failed\n");
- return E_PROP_ID_UNSUPPORTED;
- }
- }
- }
+ wodn = waveOutGetNumDevs();
+ widn = waveInGetNumDevs();
+ wid = wod = dev_guid.Data4[7];
+ if (!memcmp(&dev_guid, &DSOUND_renderer_guids[0], sizeof(GUID)-1)
+ && wod < wodn)
+ {
+ ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
+ ppd->WaveDeviceId = wod;
+ }
+ else if (!memcmp(&dev_guid, &DSOUND_capture_guids[0], sizeof(GUID)-1)
+ && wid < widn)
+ {
+ ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
+ ppd->WaveDeviceId = wid;
+ }
+ else
+ {
+ WARN("Device not found\n");
+ return E_PROP_ID_UNSUPPORTED;
+ }
- if (found == FALSE) {
- ULONG wid;
- unsigned int widn;
- TRACE("Checking capture devices\n");
- ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
- widn = waveInGetNumDevs();
- for (wid = 0; wid < widn; wid++) {
- if (IsEqualGUID( &dev_guid, &DSOUND_capture_guids[wid] ) ) {
- DSDRIVERDESC desc;
- TRACE("DSOUND_capture_guids[%d]\n", wid);
- ppd->WaveDeviceId = wid;
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&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(UlongToHandle(wid),DRV_QUERYDSOUNDIFACE,(DWORD_PTR)&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 (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER)
+ err = waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0);
+ else
+ err = waveInMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0);
+
+ if (err != MMSYSERR_NOERROR)
+ {
+ WARN("waveMessage(DRV_QUERYDSOUNDDESC) failed!\n");
+ return E_PROP_ID_UNSUPPORTED;
+ }
+ else
+ {
+ /* FIXME: Still a memory leak.. */
+ int desclen, modlen;
+ static WCHAR wInterface[] = { 'I','n','t','e','r','f','a','c','e',0 };
+
+ modlen = strlen(desc.szDrvname)+1;
+ desclen = strlen(desc.szDesc)+1;
+ ppd->Module = HeapAlloc(GetProcessHeap(),0,modlen*sizeof(WCHAR));
+ ppd->Description = HeapAlloc(GetProcessHeap(),0,desclen*sizeof(WCHAR));
+ ppd->Interface = wInterface;
+ if (!ppd->Description || !ppd->Module)
+ {
+ WARN("Out of memory\n");
+ HeapFree(GetProcessHeap(), 0, ppd->Description);
+ HeapFree(GetProcessHeap(), 0, ppd->Module);
+ ppd->Description = ppd->Module = NULL;
+ return E_OUTOFMEMORY;
}
- if (found == FALSE) {
- WARN("device not found\n");
- return E_PROP_ID_UNSUPPORTED;
- }
+ MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, ppd->Module, modlen );
+ MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, ppd->Description, desclen );
}
+ ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD;
+
if (pcbReturned) {
- *pcbReturned = cbPropData;
- TRACE("*pcbReturned=%d\n", *pcbReturned);
+ *pcbReturned = sizeof(*ppd);
+ TRACE("*pcbReturned=%d\n", *pcbReturned);
}
return S_OK;
}
-static HRESULT DSPROPERTY_Enumerate1(
+static HRESULT DSPROPERTY_EnumerateW(
LPVOID pPropData,
ULONG cbPropData,
PULONG pcbReturned )
{
- PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1_DATA ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1_DATA) pPropData;
- HRESULT err;
+ PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA ppd = pPropData;
+ DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data;
+ BOOL ret;
+ int widn, wodn, i;
TRACE("(pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
pPropData,cbPropData,pcbReturned);
- 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(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- PIDSCDRIVER drv;
- ZeroMemory(&data, sizeof(data));
- data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
- data.WaveDeviceId = wod;
- data.DeviceId = DSOUND_renderer_guids[wod];
- lstrcpynA(data.DescriptionA, desc.szDesc, sizeof(data.DescriptionA));
- lstrcpynA(data.ModuleA, desc.szDrvname, sizeof(data.ModuleA));
-
- MultiByteToWideChar( CP_ACP, 0, data.DescriptionA, -1, data.DescriptionW, sizeof(data.DescriptionW)/sizeof(WCHAR) );
- MultiByteToWideChar( CP_ACP, 0, data.ModuleA, -1, data.ModuleW, sizeof(data.ModuleW)/sizeof(WCHAR) );
-
- data.Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
- err = mmErr(waveOutMessage(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
- if (err == DS_OK && drv)
- data.Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-
- TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
- (ppd->Callback)(&data, ppd->Context);
- }
- }
+ if (pcbReturned)
+ *pcbReturned = 0;
- devs = waveInGetNumDevs();
- for (wid = 0; wid < devs; ++wid) {
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- PIDSCDRIVER drv;
- ZeroMemory(&data, sizeof(data));
- data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
- data.WaveDeviceId = wid;
- data.DeviceId = DSOUND_capture_guids[wid];
- lstrcpynA(data.DescriptionA, desc.szDesc, sizeof(data.DescriptionA));
- lstrcpynA(data.ModuleA, desc.szDrvname, sizeof(data.ModuleA));
-
- MultiByteToWideChar( CP_ACP, 0, data.DescriptionA, -1, data.DescriptionW, sizeof(data.DescriptionW)/sizeof(WCHAR) );
- MultiByteToWideChar( CP_ACP, 0, data.ModuleA, -1, data.ModuleW, sizeof(data.ModuleW)/sizeof(WCHAR) );
-
- data.Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
- err = mmErr(waveInMessage(UlongToHandle(wid), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
- if (err == DS_OK && drv)
- data.Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-
- TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
- (ppd->Callback)(&data, ppd->Context);
- }
- }
+ if (!ppd || !ppd->Callback)
+ {
+ WARN("Invalid ppd %p\n", ppd);
+ return E_PROP_ID_UNSUPPORTED;
+ }
+ wodn = waveOutGetNumDevs();
+ widn = waveInGetNumDevs();
+
+ data.DeviceId = DSOUND_renderer_guids[0];
+ for (i = 0; i < wodn; ++i)
+ {
+ HRESULT hr;
+ data.DeviceId.Data4[7] = i;
+ hr = DSPROPERTY_DescriptionW(&data, sizeof(data), NULL);
+ if (FAILED(hr))
+ {
+ ERR("DescriptionW failed!\n");
return S_OK;
}
+ ret = ppd->Callback(&data, ppd->Context);
+ HeapFree(GetProcessHeap(), 0, data.Module);
+ HeapFree(GetProcessHeap(), 0, data.Description);
+ if (!ret)
+ return S_OK;
}
- if (pcbReturned) {
- *pcbReturned = 0;
- FIXME("*pcbReturned=%d\n", *pcbReturned);
+ data.DeviceId = DSOUND_capture_guids[0];
+ for (i = 0; i < widn; ++i)
+ {
+ HRESULT hr;
+ data.DeviceId.Data4[7] = i;
+ hr = DSPROPERTY_DescriptionW(&data, sizeof(data), NULL);
+ if (FAILED(hr))
+ {
+ ERR("DescriptionW failed!\n");
+ return S_OK;
+ }
+ ret = ppd->Callback(&data, ppd->Context);
+ HeapFree(GetProcessHeap(), 0, data.Module);
+ HeapFree(GetProcessHeap(), 0, data.Description);
+ if (!ret)
+ return S_OK;
}
+ return S_OK;
+}
- return E_PROP_ID_UNSUPPORTED;
+static void DSPROPERTY_descWtoA(DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA *dataW,
+ DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA *dataA)
+{
+ DWORD modlen, desclen;
+ static char Interface[] = "Interface";
+
+ modlen = lstrlenW(dataW->Module)+1;
+ desclen = lstrlenW(dataW->Description)+1;
+ dataA->Type = dataW->Type;
+ dataA->DataFlow = dataW->DataFlow;
+ dataA->DeviceId = dataW->DeviceId;
+ dataA->WaveDeviceId = dataW->WaveDeviceId;
+ dataA->Interface = Interface;
+ dataA->Module = HeapAlloc(GetProcessHeap(), 0, modlen);
+ dataA->Description = HeapAlloc(GetProcessHeap(), 0, desclen);
+ if (dataA->Module)
+ WideCharToMultiByte(CP_ACP, 0, dataW->Module, -1, dataA->Module, modlen, NULL, NULL);
+ if (dataA->Description)
+ WideCharToMultiByte(CP_ACP, 0, dataW->Description, -1, dataA->Description, desclen, NULL, NULL);
+}
+
+static void DSPROPERTY_descWto1(DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA *dataW,
+ DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA *data1)
+{
+ data1->DeviceId = dataW->DeviceId;
+ lstrcpynW(data1->ModuleW, dataW->Module, sizeof(data1->ModuleW)/sizeof(*data1->ModuleW));
+ lstrcpynW(data1->DescriptionW, dataW->Description, sizeof(data1->DescriptionW)/sizeof(*data1->DescriptionW));
+ WideCharToMultiByte(CP_ACP, 0, data1->DescriptionW, -1, data1->DescriptionA, sizeof(data1->DescriptionA), NULL, NULL);
+ WideCharToMultiByte(CP_ACP, 0, data1->ModuleW, -1, data1->ModuleA, sizeof(data1->ModuleA), NULL, NULL);
+ data1->Type = dataW->Type;
+ data1->DataFlow = dataW->DataFlow;
+ data1->WaveDeviceId = data1->Devnode = dataW->WaveDeviceId;
+}
+
+static BOOL CALLBACK DSPROPERTY_enumWtoA(DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA *descW, void *data)
+{
+ DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA descA;
+ DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA *ppd = data;
+ BOOL ret;
+
+ DSPROPERTY_descWtoA(descW, &descA);
+ ret = ppd->Callback(&descA, ppd->Context);
+ HeapFree(GetProcessHeap(), 0, descA.Module);
+ HeapFree(GetProcessHeap(), 0, descA.Description);
+ return ret;
}
static HRESULT DSPROPERTY_EnumerateA(
LPVOID pPropData,
ULONG cbPropData,
- PULONG pcbReturned )
+ PULONG pcbReturned)
{
- PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA ppd = pPropData;
- HRESULT err;
- TRACE("(pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
- pPropData,cbPropData,pcbReturned);
+ DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA *ppd = pPropData;
+ DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA data;
- if (ppd) {
- if (ppd->Callback) {
- unsigned devs, wod, wid;
- DSDRIVERDESC desc;
- DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA data;
-
- devs = waveOutGetNumDevs();
- for (wod = 0; wod < devs; ++wod) {
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- DWORD size;
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDEVICEINTERFACESIZE,(DWORD_PTR)&size,0));
- if (err == DS_OK) {
- WCHAR * nameW = HeapAlloc(GetProcessHeap(),0,size);
- if (nameW) {
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDEVICEINTERFACE,(DWORD_PTR)nameW,size));
- if (err == DS_OK) {
- CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,size/sizeof(WCHAR));
- if (szInterface) {
- PIDSCDRIVER drv;
- ZeroMemory(&data, sizeof(data));
- data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
- data.WaveDeviceId = wod;
- data.DeviceId = DSOUND_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;
-
- data.Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
- err = mmErr(waveOutMessage(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
- if (err == DS_OK && drv)
- data.Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-
- TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
- (ppd->Callback)(&data, ppd->Context);
- }
- HeapFree(GetProcessHeap(),0,szInterface);
- }
- }
- HeapFree(GetProcessHeap(),0,nameW);
- }
- }
- }
+ if (!ppd || !ppd->Callback)
+ {
+ WARN("Invalid ppd %p\n", ppd);
+ return E_PROP_ID_UNSUPPORTED;
+ }
- devs = waveInGetNumDevs();
- for (wid = 0; wid < devs; ++wid) {
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- DWORD size;
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDEVICEINTERFACESIZE,(DWORD_PTR)&size,0));
- if (err == DS_OK) {
- WCHAR * nameW = HeapAlloc(GetProcessHeap(),0,size);
- if (nameW) {
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDEVICEINTERFACE,(DWORD_PTR)nameW,size));
- if (err == DS_OK) {
- CHAR * szInterface = HeapAlloc(GetProcessHeap(),0,size/sizeof(WCHAR));
- if (szInterface) {
- PIDSCDRIVER drv;
- ZeroMemory(&data, sizeof(data));
- data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
- data.WaveDeviceId = wid;
- data.DeviceId = DSOUND_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;
-
- data.Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
- err = mmErr(waveInMessage(UlongToHandle(wid), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
- if (err == DS_OK && drv)
- data.Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-
- TRACE("calling Callback(%p,%p)\n", &data, ppd->Context);
- (ppd->Callback)(&data, ppd->Context);
- }
- HeapFree(GetProcessHeap(),0,szInterface);
- }
- }
- HeapFree(GetProcessHeap(),0,nameW);
- }
- }
- }
+ data.Callback = DSPROPERTY_enumWtoA;
+ data.Context = ppd;
- return S_OK;
- }
- }
+ return DSPROPERTY_EnumerateW(&data, cbPropData, pcbReturned);
+}
- if (pcbReturned) {
- *pcbReturned = 0;
- FIXME("*pcbReturned=%d\n", *pcbReturned);
+static BOOL CALLBACK DSPROPERTY_enumWto1(DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA *descW, void *data)
+{
+ DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA desc1;
+ DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1_DATA *ppd = data;
+ BOOL ret;
+
+ DSPROPERTY_descWto1(descW, &desc1);
+ ret = ppd->Callback(&desc1, ppd->Context);
+ return ret;
+}
+
+static HRESULT DSPROPERTY_Enumerate1(
+ LPVOID pPropData,
+ ULONG cbPropData,
+ PULONG pcbReturned)
+{
+ DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_1_DATA *ppd = pPropData;
+ DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA data;
+
+ if (!ppd || !ppd->Callback)
+ {
+ WARN("Invalid ppd %p\n", ppd);
+ return E_PROP_ID_UNSUPPORTED;
}
- return E_PROP_ID_UNSUPPORTED;
+ data.Callback = DSPROPERTY_enumWto1;
+ data.Context = ppd;
+
+ return DSPROPERTY_EnumerateW(&data, cbPropData, pcbReturned);
}
-static HRESULT DSPROPERTY_EnumerateW(
+static HRESULT DSPROPERTY_DescriptionA(
LPVOID pPropData,
ULONG cbPropData,
- PULONG pcbReturned )
+ PULONG pcbReturned)
{
- PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA ppd = pPropData;
- HRESULT err;
- TRACE("(pPropData=%p,cbPropData=%d,pcbReturned=%p)\n",
- pPropData,cbPropData,pcbReturned);
+ DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data;
+ DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA *ppd = pPropData;
+ HRESULT hr;
- if (ppd) {
- if (ppd->Callback) {
- unsigned devs, wod, wid;
- DSDRIVERDESC desc;
- DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data;
-
- devs = waveOutGetNumDevs();
- for (wod = 0; wod < devs; ++wod) {
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
- WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
- if (wDescription && wModule) {
- DWORD size;
- err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDEVICEINTERFACESIZE, (DWORD_PTR)&size, 0));
- if (err == DS_OK) {
- WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,size);
- if (wInterface) {
- err = mmErr(waveOutMessage(UlongToHandle(wod), DRV_QUERYDEVICEINTERFACE, (DWORD_PTR)wInterface, size));
- if (err == DS_OK) {
- PIDSCDRIVER drv;
- ZeroMemory(&data, sizeof(data));
- data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER;
- data.WaveDeviceId = wod;
- data.DeviceId = DSOUND_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;
-
- data.Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
- err = mmErr(waveOutMessage(UlongToHandle(wod), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
- if (err == DS_OK && drv)
- data.Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-
- 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);
- }
- }
+ if (pcbReturned)
+ *pcbReturned = sizeof(*ppd);
+ if (!pPropData)
+ return S_OK;
- devs = waveInGetNumDevs();
- for (wid = 0; wid < devs; ++wid) {
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0));
- if (err == DS_OK) {
- WCHAR * wDescription = HeapAlloc(GetProcessHeap(),0,0x200);
- WCHAR * wModule = HeapAlloc(GetProcessHeap(),0,0x200);
- if (wDescription && wModule) {
- DWORD size;
- err = mmErr(waveInMessage(UlongToHandle(wid),DRV_QUERYDEVICEINTERFACESIZE, (DWORD_PTR)&size, 0));
- if (err == DS_OK) {
- WCHAR * wInterface = HeapAlloc(GetProcessHeap(),0,size);
- if (wInterface) {
- err = mmErr(waveInMessage(UlongToHandle(wid), DRV_QUERYDEVICEINTERFACE, (DWORD_PTR)wInterface, size));
- if (err == DS_OK) {
- PIDSCDRIVER drv;
- ZeroMemory(&data, sizeof(data));
- data.DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE;
- data.WaveDeviceId = wid;
- data.DeviceId = DSOUND_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;
- data.Type = DIRECTSOUNDDEVICE_TYPE_EMULATED;
- err = mmErr(waveInMessage(UlongToHandle(wid), DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0));
- if (err == DS_OK && drv)
- data.Type = DIRECTSOUNDDEVICE_TYPE_VXD;
- else
- WARN("waveInMessage(DRV_QUERYDSOUNDIFACE) failed\n");
-
- 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);
- }
- }
+ data.DeviceId = ppd->DeviceId;
+ data.DataFlow = ppd->DataFlow;
+ hr = DSPROPERTY_DescriptionW(&data, sizeof(data), NULL);
+ if (FAILED(hr))
+ return hr;
+ DSPROPERTY_descWtoA(&data, ppd);
+ HeapFree(GetProcessHeap(), 0, data.Module);
+ HeapFree(GetProcessHeap(), 0, data.Interface);
+ return hr;
+}
- return S_OK;
- }
- }
+static HRESULT DSPROPERTY_Description1(
+ LPVOID pPropData,
+ ULONG cbPropData,
+ PULONG pcbReturned)
+{
+ DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data;
+ DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA *ppd = pPropData;
+ HRESULT hr;
- if (pcbReturned) {
- *pcbReturned = 0;
- FIXME("*pcbReturned=%d\n", *pcbReturned);
- }
+ if (pcbReturned)
+ *pcbReturned = sizeof(*ppd);
+ if (!pPropData)
+ return S_OK;
- return E_PROP_ID_UNSUPPORTED;
+ data.DeviceId = ppd->DeviceId;
+ data.DataFlow = ppd->DataFlow;
+ hr = DSPROPERTY_DescriptionW(&data, sizeof(data), NULL);
+ if (FAILED(hr))
+ return hr;
+ DSPROPERTY_descWto1(&data, ppd);
+ HeapFree(GetProcessHeap(), 0, data.Module);
+ HeapFree(GetProcessHeap(), 0, data.Interface);
+ return hr;
}
static HRESULT WINAPI IKsPrivatePropertySetImpl_Get(
--
1.6.5.3
More information about the wine-patches
mailing list