HRESULT WINAPI IDirectSound8_fnInitialize( LPDIRECTSOUND8 iface, LPCGUID pcGuidDevice) { GUID DeviceGuid; LPOLESTR pGuidStr; HRESULT hr; LPCDirectSoundImpl This = (LPCDirectSoundImpl)CONTAINING_RECORD(iface, CDirectSoundImpl, lpVtbl); if (!RootInfo) { EnumAudioDeviceInterfaces(&RootInfo); } /* sanity check */ ASSERT(RootInfo); if (This->bInitialized) { /* object has already been initialized */ return DSERR_ALREADYINITIALIZED; } /* fixme mutual exlucsion */ if (pcGuidDevice == NULL || IsEqualGUID(pcGuidDevice, &GUID_NULL)) { /* use default playback device id */ pcGuidDevice = &DSDEVID_DefaultPlayback; } if (IsEqualIID(pcGuidDevice, &DSDEVID_DefaultCapture) || IsEqualIID(pcGuidDevice, &DSDEVID_DefaultVoiceCapture)) { /* this has to be a winetest */ return DSERR_NODRIVER; } /* now verify the guid */ if (GetDeviceID(pcGuidDevice, &DeviceGuid) != DS_OK) { if (SUCCEEDED(StringFromIID(pcGuidDevice, &pGuidStr))) { DPRINT("IDirectSound8_fnInitialize: Unknown GUID %ws\n", pGuidStr); CoTaskMemFree(pGuidStr); } return DSERR_INVALIDPARAM; } hr = FindDeviceByGuid(&DeviceGuid, &This->Filter); if (SUCCEEDED(hr)) { This->bInitialized = TRUE; return DS_OK; } DPRINT("Failed to find device\n"); return DSERR_INVALIDPARAM; }
HRESULT WINAPI KSPropertySetImpl_Get( LPKSPROPERTYSET iface, REFGUID guidPropSet, ULONG dwPropID, LPVOID pInstanceData, ULONG cbInstanceData, LPVOID pPropData, ULONG cbPropData, PULONG pcbReturned ) { LPOLESTR pStr; //HRESULT hr; MMRESULT Result; WAVEINCAPSW CapsIn; WAVEOUTCAPSW CapsOut; GUID DeviceGuid; LPFILTERINFO Filter = NULL; PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA Desc; StringFromIID(guidPropSet, &pStr); //DPRINT("Requested Property %ws dwPropID %u pInstanceData %p cbInstanceData %u pPropData %p cbPropData %u pcbReturned %p\n", // pStr, dwPropID, pInstanceData, cbInstanceData, pPropData, cbPropData, pcbReturned); CoTaskMemFree(pStr); if (!IsEqualGUID(guidPropSet, &DSPROPSETID_DirectSoundDevice)) { /* unsupported property set */ return E_PROP_ID_UNSUPPORTED; } if (dwPropID == DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1) { if (cbPropData < sizeof(DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA)) { /* invalid parameter */ return DSERR_INVALIDPARAM; } Desc = (PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA)pPropData; if (IsEqualGUID(&Desc->DeviceId, &GUID_NULL)) { if (Desc->DataFlow == DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE) { DPRINT("Using default capture guid\n"); CopyMemory(&DeviceGuid, &DSDEVID_DefaultCapture, sizeof(GUID)); } else { DPRINT("Using default playback guid\n"); CopyMemory(&DeviceGuid, &DSDEVID_DefaultPlayback, sizeof(GUID)); } } else { /* use provided guid */ CopyMemory(&DeviceGuid, &Desc->DeviceId, sizeof(GUID)); } if (GetDeviceID(&DeviceGuid, &Desc->DeviceId) != DS_OK) { DPRINT("Unknown device guid\n"); return DSERR_INVALIDPARAM; } /* sanity check */ ASSERT(FindDeviceByGuid(&Desc->DeviceId, &Filter)); ASSERT(Filter != NULL); /* fill in description */ if (IsEqualGUID(&Desc->DeviceId, &Filter->DeviceGuid[0])) { /* capture device */ Desc->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_CAPTURE; Desc->WaveDeviceId = Filter->MappedId[0]; Result = waveInGetDevCapsW(Filter->MappedId[0], &CapsIn, sizeof(WAVEINCAPSW)); if (Result != MMSYSERR_NOERROR) { CapsIn.szPname[0] = 0; DPRINT("waveInGetDevCaps Device %u failed with %x\n", Filter->MappedId[0], Result); } CapsIn.szPname[MAXPNAMELEN-1] = 0; wcscpy(Desc->DescriptionW, CapsIn.szPname); WideCharToMultiByte(CP_ACP, 0, CapsIn.szPname, -1, Desc->DescriptionA, sizeof(Desc->DescriptionA), NULL, NULL); } else { /* render device */ Desc->DataFlow = DIRECTSOUNDDEVICE_DATAFLOW_RENDER; Desc->WaveDeviceId = Filter->MappedId[1]; Result = waveOutGetDevCapsW(Filter->MappedId[1], &CapsOut, sizeof(WAVEOUTCAPSW)); if (Result != MMSYSERR_NOERROR) { CapsOut.szPname[0] = 0; DPRINT("waveOutGetDevCaps Device %u failed with %x\n", Filter->MappedId[1], Result); } CapsOut.szPname[MAXPNAMELEN-1] = 0; wcscpy(Desc->DescriptionW, CapsOut.szPname); WideCharToMultiByte(CP_ACP, 0, CapsOut.szPname, -1, Desc->DescriptionA, sizeof(Desc->DescriptionA), NULL, NULL); } /* ReactOS doesnt support vxd or emulated */ Desc->Type = DIRECTSOUNDDEVICE_TYPE_WDM; Desc->ModuleA[0] = 0; Desc->ModuleW[0] = 0; *pcbReturned = sizeof(DSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_1_DATA); return S_OK; } UNIMPLEMENTED return E_PROP_ID_UNSUPPORTED; }
HRESULT WINAPI GetDeviceID(LPCGUID pGuidSrc, LPGUID pGuidDest) { ULONG DeviceID = ULONG_MAX, Flags; MMRESULT Result; LPFILTERINFO Filter; if (!pGuidSrc || !pGuidDest) { /* invalid param */ return DSERR_INVALIDPARAM; } /* sanity check */ ASSERT(!IsEqualGUID(pGuidSrc, &GUID_NULL)); if (IsEqualGUID(&DSDEVID_DefaultPlayback, pGuidSrc) || IsEqualGUID(&DSDEVID_DefaultVoicePlayback, pGuidSrc)) { Result = waveOutMessage(UlongToHandle(WAVE_MAPPER), DRVM_MAPPER_PREFERRED_GET, (DWORD_PTR)&DeviceID, (DWORD_PTR)&Flags); if (Result != MMSYSERR_NOERROR || DeviceID == ULONG_MAX) { /* hack */ DPRINT1("Failed to get DRVM_MAPPER_PREFERRED_GET, using device 0\n"); DeviceID = 0; } if (!FindDeviceByMappedId(DeviceID, &Filter, TRUE)) { /* device not found */ return DSERR_INVALIDPARAM; } /* copy device guid */ RtlMoveMemory(pGuidDest, &Filter->DeviceGuid[1], sizeof(GUID)); return DS_OK; } else if (IsEqualGUID(&DSDEVID_DefaultCapture, pGuidSrc) || IsEqualGUID(&DSDEVID_DefaultVoiceCapture, pGuidSrc)) { Result = waveInMessage(UlongToHandle(WAVE_MAPPER), DRVM_MAPPER_PREFERRED_GET, (DWORD_PTR)&DeviceID, (DWORD_PTR)&Flags); if (Result != MMSYSERR_NOERROR || DeviceID == ULONG_MAX) { /* hack */ DPRINT1("Failed to get DRVM_MAPPER_PREFERRED_GET, for record using device 0\n"); DeviceID = 0; } if (!FindDeviceByMappedId(DeviceID, &Filter, FALSE)) { /* device not found */ return DSERR_INVALIDPARAM; } /* copy device guid */ RtlMoveMemory(pGuidDest, &Filter->DeviceGuid[0], sizeof(GUID)); return DS_OK; } if (!FindDeviceByGuid(pGuidSrc, &Filter)) { /* unknown guid */ return DSERR_INVALIDPARAM; } /* done */ return DS_OK; }