From 4ecc5e661382c5614a6e4da5ac6dd32d151c3aa9 Mon Sep 17 00:00:00 2001 From: Maarten Lankhorst Date: Wed, 9 Dec 2009 16:58:01 +0100 Subject: [PATCH] dsound: Clean up DSPROPERTY_EnumerateA. --- dlls/dsound/propset.c | 173 +++++++++++++++--------------------------- 1 file changed, 63 insertions(+), 110 deletions(-) diff --git a/dlls/dsound/propset.c b/dlls/dsound/propset.c index 1dd94c46961..c257eeae51c 100644 --- a/dlls/dsound/propset.c +++ b/dlls/dsound/propset.c @@ -784,116 +784,6 @@ static HRESULT DSPROPERTY_Enumerate1( return E_PROP_ID_UNSUPPORTED; } -static HRESULT DSPROPERTY_EnumerateA( - LPVOID pPropData, - ULONG cbPropData, - PULONG pcbReturned ) -{ - PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA ppd = pPropData; - HRESULT err; - 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_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); - } - } - } - - 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); - } - } - } - - return S_OK; - } - } - - if (pcbReturned) { - *pcbReturned = 0; - FIXME("*pcbReturned=%d\n", *pcbReturned); - } - - return E_PROP_ID_UNSUPPORTED; -} - static HRESULT DSPROPERTY_EnumerateW( LPVOID pPropData, ULONG cbPropData, @@ -956,6 +846,69 @@ static HRESULT DSPROPERTY_EnumerateW( return S_OK; } +static BOOL DSPROPERTY_descWtoA(DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA *dataW, + DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA *dataA) +{ + DWORD modlen, desclen; + static char Interface[] = "Interface"; + + modlen = WideCharToMultiByte(CP_ACP, 0, dataW->Module, -1, NULL, 0, NULL, NULL); + desclen = WideCharToMultiByte(CP_ACP, 0, dataW->Description, -1, NULL, 0, NULL, NULL); + 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 || !dataA->Description) + { + HeapFree(GetProcessHeap(), 0, dataA->Module); + HeapFree(GetProcessHeap(), 0, dataA->Description); + dataA->Module = dataA->Description = NULL; + return FALSE; + } + + WideCharToMultiByte(CP_ACP, 0, dataW->Module, -1, dataA->Module, modlen, NULL, NULL); + WideCharToMultiByte(CP_ACP, 0, dataW->Description, -1, dataA->Description, desclen, NULL, NULL); + return TRUE; +} + +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; + + ret = DSPROPERTY_descWtoA(descW, &descA); + if (!ret) + return FALSE; + 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) +{ + DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA *ppd = pPropData; + DSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA data; + + if (!ppd || !ppd->Callback) + { + WARN("Invalid ppd %p\n", ppd); + return E_PROP_ID_UNSUPPORTED; + } + + data.Callback = DSPROPERTY_enumWtoA; + data.Context = ppd; + + return DSPROPERTY_EnumerateW(&data, cbPropData, pcbReturned); +} + static HRESULT WINAPI IKsPrivatePropertySetImpl_Get( LPKSPROPERTYSET iface, REFGUID guidPropSet,