📄 propset.c
字号:
err = mmErr(WineWaveInMessage((HWAVEIN)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(WineWaveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDIFACE,(DWORD_PTR)&drv,0)); if (err == DS_OK && drv) ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD; else WARN("WineWaveInMessage(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("WineWaveInMessage(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[%ld]\n", wod); ppd->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER; ppd->WaveDeviceId = wod; err = mmErr(WineWaveOutMessage((HWAVEOUT)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(WineWaveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0)); if (err == DS_OK && drv) ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD; else WARN("WineWaveOutMessage(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("WineWaveOutMessage(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( &dev_guid, &DSOUND_capture_guids[wid] ) ) { DSDRIVERDESC desc; TRACE("DSOUND_capture_guids[%ld]\n", wid); ppd->WaveDeviceId = wid; err = mmErr(WineWaveInMessage((HWAVEIN)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(WineWaveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDIFACE,(DWORD_PTR)&drv,0)); if (err == DS_OK && drv) ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD; else WARN("WineWaveInMessage(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("WineWaveInMessage(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=%ld\n", *pcbReturned); } return S_OK;}static HRESULT WINAPI DSPROPERTY_Enumerate1( REFGUID guidPropSet, LPVOID pPropData, ULONG cbPropData, PULONG pcbReturned ){ 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(WineWaveOutMessage((HWAVEOUT)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(WineWaveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0)); if (err == DS_OK && drv) data.Type = DIRECTSOUNDDEVICE_TYPE_VXD; else WARN("WineWaveOutMessage(DRV_QUERYDSOUNDIFACE) failed\n"); TRACE("calling Callback(%p,%p)\n", &data, ppd->Context); (ppd->Callback)(&data, ppd->Context); } } devs = waveInGetNumDevs(); for (wid = 0; wid < devs; ++wid) { err = mmErr(WineWaveInMessage((HWAVEIN)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(WineWaveInMessage((HWAVEIN)wid, DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0)); if (err == DS_OK && drv) data.Type = DIRECTSOUNDDEVICE_TYPE_VXD; else WARN("WineWaveInMessage(DRV_QUERYDSOUNDIFACE) failed\n"); 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;}static HRESULT WINAPI DSPROPERTY_EnumerateA( REFGUID guidPropSet, LPVOID pPropData, ULONG cbPropData, PULONG pcbReturned ){ PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_DATA ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_ENUMERATE_A_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_A_DATA data; devs = waveOutGetNumDevs(); for (wod = 0; wod < devs; ++wod) { err = mmErr(WineWaveOutMessage((HWAVEOUT)wod,DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0)); if (err == DS_OK) { DWORD size; err = mmErr(WineWaveOutMessage((HWAVEOUT)wod,DRV_QUERYDEVICEINTERFACESIZE,(DWORD_PTR)&size,0)); if (err == DS_OK) { WCHAR * nameW = HeapAlloc(GetProcessHeap(),0,size); if (nameW) { err = mmErr(WineWaveOutMessage((HWAVEOUT)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(WineWaveOutMessage((HWAVEOUT)wod, DRV_QUERYDSOUNDIFACE, (DWORD_PTR)&drv, 0)); if (err == DS_OK && drv) data.Type = DIRECTSOUNDDEVICE_TYPE_VXD; else WARN("WineWaveOutMessage(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(WineWaveInMessage((HWAVEIN)wid,DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,0)); if (err == DS_OK) { DWORD size; err = mmErr(WineWaveInMessage((HWAVEIN)wid,DRV_QUERYDEVICEINTERFACESIZE,(DWORD_PTR)&size,0)); if (err == DS_OK) { WCHAR * nameW = HeapAlloc(GetProcessHeap(),0,size); if (nameW) { err = mmErr(WineWaveInMessage((HWAVEIN)wid,DRV_QUERYDEVICEINTERFACE,(DWORD_PTR)nameW,size));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -