static BOOL CALLBACK enum_callback(GUID *guid, const WCHAR *desc, const WCHAR *module, void *user) { PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_W_DATA ppd = user; DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA data; DWORD len; BOOL ret; TRACE("%s %s %s %p\n", wine_dbgstr_guid(guid), wine_dbgstr_w(desc), wine_dbgstr_w(module), user); if(!guid) return TRUE; data.DeviceId = *guid; len = lstrlenW(module) + 1; data.Module = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); memcpy(data.Module, module, len * sizeof(WCHAR)); len = lstrlenW(desc) + 1; data.Description = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); memcpy(data.Description, desc, len * sizeof(WCHAR)); data.Interface = wInterface; ret = ppd->Callback(&data, ppd->Context); HeapFree(GetProcessHeap(), 0, data.Module); HeapFree(GetProcessHeap(), 0, data.Description); return ret; }
static HRESULT DSPROPERTY_EnumerateW( LPVOID pPropData, ULONG cbPropData, PULONG pcbReturned ) { 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 (pcbReturned) *pcbReturned = 0; 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; } 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; }