📄 propset.c
字号:
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(WineWaveOutMessage((HWAVEOUT)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(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"); break; } else { WARN("no memory\n"); HeapFree(GetProcessHeap(), 0, szDescription); HeapFree(GetProcessHeap(), 0, szModule); HeapFree(GetProcessHeap(), 0, szInterface); return E_OUTOFMEMORY; } } else { WARN("WineWaveOutMessage(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(WineWaveInMessage((HWAVEIN)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(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, szDescription); HeapFree(GetProcessHeap(), 0, szModule); HeapFree(GetProcessHeap(), 0, szInterface); return E_OUTOFMEMORY; } } else { WARN("WineWaveInMessage(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[%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 */ 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(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, szDescription); HeapFree(GetProcessHeap(), 0, szModule); HeapFree(GetProcessHeap(), 0, szInterface); 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( &ppd->DeviceId, &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 */ 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(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, szDescription); HeapFree(GetProcessHeap(), 0, szModule); HeapFree(GetProcessHeap(), 0, szInterface); 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_DescriptionW( REFGUID guidPropSet, LPVOID pPropData, ULONG cbPropData, PULONG pcbReturned ){ PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA ppd = (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA) pPropData; HRESULT err; GUID dev_guid; TRACE("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p)\n", debugstr_guid(guidPropSet),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("(guidPropSet=%s,pPropData=%p,cbPropData=%ld,pcbReturned=%p) GUID_NULL not implemented!\n", debugstr_guid(guidPropSet),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; 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[%ld]\n", wod); 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"); 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; } } } } 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -