HRESULT IDirectSoundCaptureImpl_Create(IUnknown *outer_unk, REFIID riid, void **ppv, BOOL has_dsc8) { IDirectSoundCaptureImpl *obj; HRESULT hr; TRACE("(%s, %p)\n", debugstr_guid(riid), ppv); *ppv = NULL; obj = HeapAlloc(GetProcessHeap(), 0, sizeof(*obj)); if (obj == NULL) { WARN("out of memory\n"); return DSERR_OUTOFMEMORY; } setup_dsound_options(); obj->IUnknown_inner.lpVtbl = &unk_vtbl; obj->IDirectSoundCapture_iface.lpVtbl = &dscvt; obj->ref = 1; obj->refdsc = 0; obj->numIfaces = 1; obj->device = NULL; obj->has_dsc8 = has_dsc8; /* COM aggregation supported only internally */ if (outer_unk) obj->outer_unk = outer_unk; else obj->outer_unk = &obj->IUnknown_inner; hr = IUnknown_QueryInterface(&obj->IUnknown_inner, riid, ppv); IUnknown_Release(&obj->IUnknown_inner); return hr; }
/*************************************************************************** * DirectSoundEnumerateW [DSOUND.3] * * Enumerate all DirectSound drivers installed in the system * * PARAMS * lpDSEnumCallback [I] Address of callback function. * lpContext [I] Address of user defined context passed to callback function. * * RETURNS * Success: DS_OK * Failure: DSERR_INVALIDPARAM */ HRESULT WINAPI DirectSoundEnumerateW( LPDSENUMCALLBACKW lpDSEnumCallback, LPVOID lpContext ) { unsigned devs, wod; DSDRIVERDESC desc; GUID guid; int err; WCHAR wDesc[MAXPNAMELEN]; WCHAR wName[MAXPNAMELEN]; TRACE("lpDSEnumCallback = %p, lpContext = %p\n", lpDSEnumCallback, lpContext); if (lpDSEnumCallback == NULL) { WARN("invalid parameter: lpDSEnumCallback == NULL\n"); return DSERR_INVALIDPARAM; } setup_dsound_options(); devs = waveOutGetNumDevs(); if (devs > 0) { if (GetDeviceID(&DSDEVID_DefaultPlayback, &guid) == DS_OK) { static const WCHAR empty[] = { 0 }; for (wod = 0; wod < devs; ++wod) { if (IsEqualGUID( &guid, &DSOUND_renderer_guids[wod] ) ) { err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,ds_hw_accel)); if (err == DS_OK) { TRACE("calling lpDSEnumCallback(NULL,\"%s\",\"%s\",%p)\n", "Primary Sound Driver",desc.szDrvname,lpContext); MultiByteToWideChar( CP_ACP, 0, "Primary Sound Driver", -1, wDesc, sizeof(wDesc)/sizeof(WCHAR) ); if (lpDSEnumCallback(NULL, wDesc, empty, lpContext) == FALSE) return DS_OK; } } } } } for (wod = 0; wod < devs; ++wod) { err = mmErr(waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,ds_hw_accel)); if (err == DS_OK) { TRACE("calling lpDSEnumCallback(%s,\"%s\",\"%s\",%p)\n", debugstr_guid(&DSOUND_renderer_guids[wod]),desc.szDesc,desc.szDrvname,lpContext); MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, wDesc, sizeof(wDesc)/sizeof(WCHAR) ); wDesc[(sizeof(wDesc)/sizeof(WCHAR)) - 1] = '\0'; MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, wName, sizeof(wName)/sizeof(WCHAR) ); wName[(sizeof(wName)/sizeof(WCHAR)) - 1] = '\0'; if (lpDSEnumCallback(&DSOUND_renderer_guids[wod], wDesc, wName, lpContext) == FALSE) return DS_OK; } } return DS_OK; }
HRESULT DSOUND_FullDuplexCreate(REFIID riid, void **ppv) { IDirectSoundFullDuplexImpl *obj; HRESULT hr; TRACE("(%s, %p)\n", debugstr_guid(riid), ppv); *ppv = NULL; obj = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*obj)); if (!obj) { WARN("out of memory\n"); return DSERR_OUTOFMEMORY; } setup_dsound_options(); obj->IDirectSoundFullDuplex_iface.lpVtbl = &dsfd_vtbl; obj->IUnknown_iface.lpVtbl = &unk_vtbl; obj->ref = 1; obj->refdsfd = 0; obj->numIfaces = 1; hr = IUnknown_QueryInterface(&obj->IUnknown_iface, riid, ppv); IUnknown_Release(&obj->IUnknown_iface); return hr; }
/*************************************************************************** * DirectSoundEnumerateW [DSOUND.3] * * Enumerate all DirectSound drivers installed in the system * * PARAMS * lpDSEnumCallback [I] Address of callback function. * lpContext [I] Address of user defined context passed to callback function. * * RETURNS * Success: DS_OK * Failure: DSERR_INVALIDPARAM */ HRESULT WINAPI DirectSoundEnumerateW( LPDSENUMCALLBACKW lpDSEnumCallback, LPVOID lpContext ) { HRESULT hr; TRACE("(%p,%p)\n", lpDSEnumCallback, lpContext); if (lpDSEnumCallback == NULL) { WARN("invalid parameter: lpDSEnumCallback == NULL\n"); return DSERR_INVALIDPARAM; } setup_dsound_options(); hr = enumerate_mmdevices(eRender, DSOUND_renderer_guids, lpDSEnumCallback, lpContext); return SUCCEEDED(hr) ? DS_OK : hr; }
HRESULT DSOUND_FullDuplexCreate( REFIID riid, LPDIRECTSOUNDFULLDUPLEX* ppDSFD) { IDirectSoundFullDuplexImpl *This = NULL; TRACE("(%s, %p)\n", debugstr_guid(riid), ppDSFD); if (ppDSFD == NULL) { WARN("invalid parameter: ppDSFD == NULL\n"); return DSERR_INVALIDPARAM; } if (!IsEqualIID(riid, &IID_IUnknown) && !IsEqualIID(riid, &IID_IDirectSoundFullDuplex)) { *ppDSFD = 0; return E_NOINTERFACE; } /* Get dsound configuration */ setup_dsound_options(); This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectSoundFullDuplexImpl)); if (This == NULL) { WARN("out of memory\n"); *ppDSFD = NULL; return DSERR_OUTOFMEMORY; } This->lpVtbl = &dsfdvt; This->ref = 1; This->capture_device = NULL; This->renderer_device = NULL; *ppDSFD = (LPDIRECTSOUNDFULLDUPLEX)This; return DS_OK; }
static HRESULT DSOUND_FullDuplexCreate(LPDIRECTSOUNDFULLDUPLEX* ppDSFD, IUnknown *pUnkOuter) { IDirectSoundFullDuplexImpl *This = NULL; if (pUnkOuter) { WARN("pUnkOuter != 0\n"); *ppDSFD = NULL; return DSERR_NOAGGREGATION; } if (ppDSFD == NULL) { WARN("invalid parameter: ppDSFD == NULL\n"); return DSERR_INVALIDPARAM; } /* Get dsound configuration */ setup_dsound_options(); This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectSoundFullDuplexImpl)); if (This == NULL) { WARN("out of memory\n"); *ppDSFD = NULL; return DSERR_OUTOFMEMORY; } This->lpVtbl = &dsfdvt; This->ref = 1; This->capture_device = NULL; This->renderer_device = NULL; *ppDSFD = (LPDIRECTSOUNDFULLDUPLEX)This; return DS_OK; }
static HRESULT DSPROPERTY_DescriptionW( LPVOID pPropData, ULONG cbPropData, PULONG pcbReturned ) { PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_W_DATA ppd = pPropData; GUID dev_guid; IMMDevice *mmdevice; IPropertyStore *ps; PROPVARIANT pv; DWORD desclen; HRESULT hr; TRACE("pPropData=%p,cbPropData=%d,pcbReturned=%p)\n", 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"); 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; } } setup_dsound_options(); GetDeviceID(&ppd->DeviceId, &dev_guid); hr = get_mmdevice(eRender, &dev_guid, &mmdevice); if(FAILED(hr)){ hr = get_mmdevice(eCapture, &dev_guid, &mmdevice); if(FAILED(hr)) return hr; } hr = IMMDevice_OpenPropertyStore(mmdevice, STGM_READ, &ps); if(FAILED(hr)){ IMMDevice_Release(mmdevice); WARN("OpenPropertyStore failed: %08x\n", hr); return hr; } hr = IPropertyStore_GetValue(ps, (const PROPERTYKEY *)&DEVPKEY_Device_FriendlyName, &pv); if(FAILED(hr)){ IPropertyStore_Release(ps); IMMDevice_Release(mmdevice); WARN("GetValue(FriendlyName) failed: %08x\n", hr); return hr; } desclen = lstrlenW(pv.u.pwszVal) + 1; /* FIXME: Still a memory leak.. */ ppd->Description = HeapAlloc(GetProcessHeap(), 0, desclen * sizeof(WCHAR)); memcpy(ppd->Description, pv.u.pwszVal, desclen * sizeof(WCHAR)); ppd->Module = wine_vxd_drv; ppd->Interface = wInterface; ppd->Type = DIRECTSOUNDDEVICE_TYPE_VXD; PropVariantClear(&pv); IPropertyStore_Release(ps); IMMDevice_Release(mmdevice); if (pcbReturned) { *pcbReturned = sizeof(*ppd); TRACE("*pcbReturned=%d\n", *pcbReturned); } return S_OK; }
/*************************************************************************** * DirectSoundFullDuplexCreate [DSOUND.10] * * Create and initialize a DirectSoundFullDuplex interface. * * PARAMS * pcGuidCaptureDevice [I] Address of sound capture device GUID. * pcGuidRenderDevice [I] Address of sound render device GUID. * pcDSCBufferDesc [I] Address of capture buffer description. * pcDSBufferDesc [I] Address of render buffer description. * hWnd [I] Handle to application window. * dwLevel [I] Cooperative level. * ppDSFD [O] Address where full duplex interface returned. * ppDSCBuffer8 [0] Address where capture buffer interface returned. * ppDSBuffer8 [0] Address where render buffer interface returned. * pUnkOuter [I] Must be NULL. * * RETURNS * Success: DS_OK * Failure: DSERR_NOAGGREGATION, DSERR_ALLOCATED, DSERR_INVALIDPARAM, * DSERR_OUTOFMEMORY DSERR_INVALIDCALL DSERR_NODRIVER */ HRESULT WINAPI DirectSoundFullDuplexCreate( LPCGUID pcGuidCaptureDevice, LPCGUID pcGuidRenderDevice, LPCDSCBUFFERDESC pcDSCBufferDesc, LPCDSBUFFERDESC pcDSBufferDesc, HWND hWnd, DWORD dwLevel, LPDIRECTSOUNDFULLDUPLEX *ppDSFD, LPDIRECTSOUNDCAPTUREBUFFER8 *ppDSCBuffer8, LPDIRECTSOUNDBUFFER8 *ppDSBuffer8, LPUNKNOWN pUnkOuter) { HRESULT hres; IDirectSoundFullDuplexImpl *This = NULL; TRACE("(%s,%s,%p,%p,%p,%lx,%p,%p,%p,%p)\n", debugstr_guid(pcGuidCaptureDevice), debugstr_guid(pcGuidRenderDevice), pcDSCBufferDesc, pcDSBufferDesc, hWnd, dwLevel, ppDSFD, ppDSCBuffer8, ppDSBuffer8, pUnkOuter); if (pUnkOuter) { WARN("pUnkOuter != 0\n"); *ppDSFD = NULL; return DSERR_NOAGGREGATION; } if (pcDSCBufferDesc == NULL) { WARN("invalid parameter: pcDSCBufferDesc == NULL\n"); *ppDSFD = NULL; return DSERR_INVALIDPARAM; } if (pcDSBufferDesc == NULL) { WARN("invalid parameter: pcDSBufferDesc == NULL\n"); *ppDSFD = NULL; return DSERR_INVALIDPARAM; } if (ppDSFD == NULL) { WARN("invalid parameter: ppDSFD == NULL\n"); return DSERR_INVALIDPARAM; } if (ppDSCBuffer8 == NULL) { WARN("invalid parameter: ppDSCBuffer8 == NULL\n"); *ppDSFD = NULL; return DSERR_INVALIDPARAM; } if (ppDSBuffer8 == NULL) { WARN("invalid parameter: ppDSBuffer8 == NULL\n"); *ppDSFD = NULL; return DSERR_INVALIDPARAM; } /* Get dsound configuration */ setup_dsound_options(); This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectSoundFullDuplexImpl)); if (This == NULL) { WARN("out of memory\n"); *ppDSFD = NULL; return DSERR_OUTOFMEMORY; } This->lpVtbl = &dsfdvt; This->ref = 1; This->capture_device = NULL; This->renderer_device = NULL; hres = IDirectSoundFullDuplexImpl_Initialize((LPDIRECTSOUNDFULLDUPLEX)This, pcGuidCaptureDevice, pcGuidRenderDevice, pcDSCBufferDesc, pcDSBufferDesc, hWnd, dwLevel, ppDSCBuffer8, ppDSBuffer8); if (hres != DS_OK) { HeapFree(GetProcessHeap(), 0, This); WARN("IDirectSoundFullDuplexImpl_Initialize failed\n"); *ppDSFD = NULL; } else *ppDSFD = (LPDIRECTSOUNDFULLDUPLEX)This; return hres; }
static HRESULT DSPROPERTY_DescriptionW( LPVOID pPropData, ULONG cbPropData, PULONG pcbReturned ) { 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); 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"); 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; } } setup_dsound_options(); GetDeviceID(&ppd->DeviceId, &dev_guid); 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 (ppd->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_RENDER) err = waveOutMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,ds_hw_accel); else err = waveInMessage(UlongToHandle(wod),DRV_QUERYDSOUNDDESC,(DWORD_PTR)&desc,ds_hw_accel); 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 = MultiByteToWideChar( CP_ACP, 0, desc.szDrvname, -1, NULL, 0 ); desclen = MultiByteToWideChar( CP_ACP, 0, desc.szDesc, -1, NULL, 0 ); 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; } 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 = sizeof(*ppd); TRACE("*pcbReturned=%d\n", *pcbReturned); } return S_OK; }