BOOL WINAPI DllMain( HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: dsound_hInstance = hInstDLL; #if 1 DPRINT("NumDevs %u\n", waveOutGetNumDevs()); if (EnumAudioDeviceInterfaces(&RootInfo) != S_OK) { DPRINT("EnumAudioDeviceInterfaces failed\n"); RootInfo = NULL; } DPRINT1("EnumAudioDeviceInterfaces %p %u\n", RootInfo, waveOutGetNumDevs()); #endif DisableThreadLibraryCalls(dsound_hInstance); break; default: break; } return TRUE; }
HRESULT DSoundEnumerate( LPDSENUMCALLBACKA lpDSEnumCallbackA, LPDSENUMCALLBACKW lpDSEnumCallbackW, LPVOID lpContext, BOOL bPlayback) { ULONG ResourceId; BOOL bResult; LPFILTERINFO CurInfo; WAVEOUTCAPSW WaveOutCaps; WAVEINCAPSW WaveInCaps; if (!RootInfo) { EnumAudioDeviceInterfaces(&RootInfo); } if (lpDSEnumCallbackA == NULL && lpDSEnumCallbackW == NULL) { DPRINT("No callback\n"); return DSERR_INVALIDPARAM; } if (bPlayback) { /* use resource id of playback string */ ResourceId = IDS_PRIMARY_PLAYBACK_DEVICE; } else { /* use resource id of playback string */ ResourceId = IDS_PRIMARY_RECORD_DEVICE; } if (RootInfo) { /* perform first callback */ bResult = DoDSoundCallback(lpDSEnumCallbackA, lpDSEnumCallbackW, NULL, ResourceId, NULL, L"", lpContext); if (!bResult) { /* callback asked as to stop */ return DS_OK; } /* now iterate through all devices */ CurInfo = RootInfo; do { if (bPlayback && !IsEqualGUID(&CurInfo->DeviceGuid[1], &GUID_NULL)) { RtlZeroMemory(&WaveOutCaps, sizeof(WAVEOUTCAPSW)); /* sanity check */ ASSERT(CurInfo->MappedId[1] != ULONG_MAX); /* get wave out caps */ waveOutGetDevCapsW((UINT_PTR)CurInfo->MappedId[1], &WaveOutCaps, sizeof(WAVEOUTCAPSW)); WaveOutCaps.szPname[MAXPNAMELEN-1] = L'\0'; bResult = DoDSoundCallback(lpDSEnumCallbackA, lpDSEnumCallbackW, &CurInfo->DeviceGuid[1], 0, WaveOutCaps.szPname, L"" /* FIXME */, lpContext); if (!bResult) { /* callback asked as to stop */ return DS_OK; } } else if (!bPlayback && !IsEqualGUID(&CurInfo->DeviceGuid[0], &GUID_NULL)) { RtlZeroMemory(&WaveInCaps, sizeof(WAVEINCAPSW)); /* sanity check */ ASSERT(CurInfo->MappedId[1] != ULONG_MAX); /* get wave in caps */ waveInGetDevCapsW((UINT_PTR)CurInfo->MappedId[0], &WaveInCaps, sizeof(WAVEINCAPSW)); WaveInCaps.szPname[MAXPNAMELEN-1] = L'\0'; bResult = DoDSoundCallback(lpDSEnumCallbackA, lpDSEnumCallbackW, &CurInfo->DeviceGuid[0], 0, WaveInCaps.szPname, L"" /* FIXME */, lpContext); if (!bResult) { /* callback asked as to stop */ return DS_OK; } } /* move to next entry */ CurInfo = CurInfo->lpNext; }while(CurInfo); } return DS_OK; }
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; }