static int XAUDIO2_Init(SDL_AudioDriverImpl * impl) { #ifndef SDL_XAUDIO2_HAS_SDK SDL_SetError("XAudio2: SDL was built without XAudio2 support (old DirectX SDK)."); return 0; /* no XAudio2 support, ever. Update your SDK! */ #else /* XAudio2Create() is a macro that uses COM; we don't load the .dll */ IXAudio2 *ixa2 = NULL; if (FAILED(WIN_CoInitialize())) { SDL_SetError("XAudio2: CoInitialize() failed"); return 0; } if (XAudio2Create(&ixa2, 0, XAUDIO2_DEFAULT_PROCESSOR) != S_OK) { WIN_CoUninitialize(); SDL_SetError("XAudio2: XAudio2Create() failed"); return 0; /* not available. */ } IXAudio2_Release(ixa2); /* Set the function pointers */ impl->DetectDevices = XAUDIO2_DetectDevices; impl->OpenDevice = XAUDIO2_OpenDevice; impl->PlayDevice = XAUDIO2_PlayDevice; impl->WaitDevice = XAUDIO2_WaitDevice; impl->WaitDone = XAUDIO2_WaitDone; impl->GetDeviceBuf = XAUDIO2_GetDeviceBuf; impl->CloseDevice = XAUDIO2_CloseDevice; impl->Deinitialize = XAUDIO2_Deinitialize; return 1; /* this audio target is available. */ #endif }
int SDL_DINPUT_JoystickInit(void) { HRESULT result; HINSTANCE instance; result = WIN_CoInitialize(); if (FAILED(result)) { return SetDIerror("CoInitialize", result); } coinitialized = SDL_TRUE; result = CoCreateInstance(&CLSID_DirectInput8, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectInput8, (LPVOID)&dinput); if (FAILED(result)) { return SetDIerror("CoCreateInstance", result); } /* Because we used CoCreateInstance, we need to Initialize it, first. */ instance = GetModuleHandle(NULL); if (instance == NULL) { return SDL_SetError("GetModuleHandle() failed with error code %lu.", GetLastError()); } result = IDirectInput8_Initialize(dinput, instance, DIRECTINPUT_VERSION); if (FAILED(result)) { return SetDIerror("IDirectInput::Initialize", result); } return 0; }
static int XAUDIO2_Init(SDL_AudioDriverImpl * impl) { /* XAudio2Create() is a macro that uses COM; we don't load the .dll */ IXAudio2 *ixa2 = NULL; if (FAILED(WIN_CoInitialize())) { SDL_SetError("XAudio2: CoInitialize() failed"); return 0; } if (XAudio2Create(&ixa2, 0, XAUDIO2_DEFAULT_PROCESSOR) != S_OK) { WIN_CoUninitialize(); SDL_SetError("XAudio2: XAudio2Create() failed"); return 0; /* not available. */ } IXAudio2_Release(ixa2); /* Set the function pointers */ impl->DetectDevices = XAUDIO2_DetectDevices; impl->OpenDevice = XAUDIO2_OpenDevice; impl->PlayDevice = XAUDIO2_PlayDevice; impl->WaitDevice = XAUDIO2_WaitDevice; impl->WaitDone = XAUDIO2_WaitDone; impl->GetDeviceBuf = XAUDIO2_GetDeviceBuf; impl->CloseDevice = XAUDIO2_CloseDevice; impl->Deinitialize = XAUDIO2_Deinitialize; return 1; /* this audio target is available. */ }
int SDL_DINPUT_HapticInit(void) { HRESULT ret; HINSTANCE instance; if (dinput != NULL) { /* Already open. */ return SDL_SetError("Haptic: SubSystem already open."); } ret = WIN_CoInitialize(); if (FAILED(ret)) { return DI_SetError("Coinitialize", ret); } coinitialized = SDL_TRUE; ret = CoCreateInstance(&CLSID_DirectInput8, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectInput8, (LPVOID)& dinput); if (FAILED(ret)) { SDL_SYS_HapticQuit(); return DI_SetError("CoCreateInstance", ret); } /* Because we used CoCreateInstance, we need to Initialize it, first. */ instance = GetModuleHandle(NULL); if (instance == NULL) { SDL_SYS_HapticQuit(); return SDL_SetError("GetModuleHandle() failed with error code %lu.", GetLastError()); } ret = IDirectInput8_Initialize(dinput, instance, DIRECTINPUT_VERSION); if (FAILED(ret)) { SDL_SYS_HapticQuit(); return DI_SetError("Initializing DirectInput device", ret); } /* Look for haptic devices. */ ret = IDirectInput8_EnumDevices(dinput, 0, EnumHapticsCallback, NULL, DIEDFL_FORCEFEEDBACK | DIEDFL_ATTACHEDONLY); if (FAILED(ret)) { SDL_SYS_HapticQuit(); return DI_SetError("Enumerating DirectInput devices", ret); } return 0; }
static int XAUDIO2_Init(SDL_AudioDriverImpl * impl) { #ifndef SDL_XAUDIO2_HAS_SDK SDL_SetError("XAudio2: SDL was built without XAudio2 support (old DirectX SDK)."); return 0; /* no XAudio2 support, ever. Update your SDK! */ #else /* XAudio2Create() is a macro that uses COM; we don't load the .dll */ IXAudio2 *ixa2 = NULL; #if defined(__WIN32__) // TODO, WinRT: Investigate using CoInitializeEx here if (FAILED(WIN_CoInitialize())) { SDL_SetError("XAudio2: CoInitialize() failed"); return 0; } #endif if (XAudio2Create(&ixa2, 0, XAUDIO2_DEFAULT_PROCESSOR) != S_OK) { #if defined(__WIN32__) WIN_CoUninitialize(); #endif SDL_SetError("XAudio2: XAudio2Create() failed at initialization"); return 0; /* not available. */ } IXAudio2_Release(ixa2); /* Set the function pointers */ impl->DetectDevices = XAUDIO2_DetectDevices; impl->OpenDevice = XAUDIO2_OpenDevice; impl->PlayDevice = XAUDIO2_PlayDevice; impl->WaitDevice = XAUDIO2_WaitDevice; impl->WaitDone = XAUDIO2_WaitDone; impl->GetDeviceBuf = XAUDIO2_GetDeviceBuf; impl->CloseDevice = XAUDIO2_CloseDevice; impl->Deinitialize = XAUDIO2_Deinitialize; /* !!! FIXME: We can apparently use a C++ interface on Windows 8 * !!! FIXME: (Windows::Devices::Enumeration::DeviceInformation) for device * !!! FIXME: detection, but it's not implemented here yet. * !!! FIXME: see http://blogs.msdn.com/b/chuckw/archive/2012/04/02/xaudio2-and-windows-8-consumer-preview.aspx * !!! FIXME: for now, force the default device. */ #if defined(SDL_XAUDIO2_WIN8) || defined(__WINRT__) impl->OnlyHasDefaultOutputDevice = 1; #endif return 1; /* this audio target is available. */ #endif }
/* Function to scan the system for joysticks. * This function should set SDL_numjoysticks to the number of available * joysticks. Joystick 0 should be the system default joystick. * It should return 0, or -1 on an unrecoverable fatal error. */ int SDL_SYS_JoystickInit(void) { HRESULT result; HINSTANCE instance; SYS_NumJoysticks = 0; result = WIN_CoInitialize(); if (FAILED(result)) { SetDIerror("CoInitialize", result); return (-1); } coinitialized = SDL_TRUE; result = CoCreateInstance(&CLSID_DirectInput, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectInput, (LPVOID)&dinput); if (FAILED(result)) { SDL_SYS_JoystickQuit(); SetDIerror("CoCreateInstance", result); return (-1); } /* Because we used CoCreateInstance, we need to Initialize it, first. */ instance = GetModuleHandle(NULL); if (instance == NULL) { SDL_SYS_JoystickQuit(); SDL_SetError("GetModuleHandle() failed with error code %d.", GetLastError()); return (-1); } result = IDirectInput_Initialize(dinput, instance, DIRECTINPUT_VERSION); if (FAILED(result)) { SDL_SYS_JoystickQuit(); SetDIerror("IDirectInput::Initialize", result); return (-1); } /* Look for joysticks, wheels, head trackers, gamepads, etc.. */ result = IDirectInput_EnumDevices(dinput, DIDEVTYPE_JOYSTICK, EnumJoysticksCallback, NULL, DIEDFL_ATTACHEDONLY); return SYS_NumJoysticks; }
/* * Initializes the haptic subsystem. */ int SDL_SYS_HapticInit(void) { const char *env = SDL_GetHint(SDL_HINT_XINPUT_ENABLED); HRESULT ret; HINSTANCE instance; if (dinput != NULL) { /* Already open. */ return SDL_SetError("Haptic: SubSystem already open."); } /* Clear all the memory. */ SDL_memset(SDL_hapticlist, 0, sizeof(SDL_hapticlist)); SDL_numhaptics = 0; ret = WIN_CoInitialize(); if (FAILED(ret)) { return DI_SetError("Coinitialize", ret); } coinitialized = SDL_TRUE; ret = CoCreateInstance(&CLSID_DirectInput8, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectInput8, (LPVOID) & dinput); if (FAILED(ret)) { SDL_SYS_HapticQuit(); return DI_SetError("CoCreateInstance", ret); } /* Because we used CoCreateInstance, we need to Initialize it, first. */ instance = GetModuleHandle(NULL); if (instance == NULL) { SDL_SYS_HapticQuit(); return SDL_SetError("GetModuleHandle() failed with error code %d.", GetLastError()); } ret = IDirectInput8_Initialize(dinput, instance, DIRECTINPUT_VERSION); if (FAILED(ret)) { SDL_SYS_HapticQuit(); return DI_SetError("Initializing DirectInput device", ret); } /* Look for haptic devices. */ ret = IDirectInput8_EnumDevices(dinput, 0, EnumHapticsCallback, NULL, DIEDFL_FORCEFEEDBACK | DIEDFL_ATTACHEDONLY); if (FAILED(ret)) { SDL_SYS_HapticQuit(); return DI_SetError("Enumerating DirectInput devices", ret); } if (!env || SDL_atoi(env)) { loaded_xinput = (WIN_LoadXInputDLL() == 0); } if (loaded_xinput) { DWORD i; const SDL_bool bIs14OrLater = (SDL_XInputVersion >= ((1<<16)|4)); for (i = 0; (i < SDL_XINPUT_MAX_DEVICES) && (SDL_numhaptics < MAX_HAPTICS); i++) { XINPUT_CAPABILITIES caps; if (XINPUTGETCAPABILITIES(i, XINPUT_FLAG_GAMEPAD, &caps) == ERROR_SUCCESS) { if ((!bIs14OrLater) || (caps.Flags & XINPUT_CAPS_FFB_SUPPORTED)) { /* !!! FIXME: I'm not bothering to query for a real name right now. */ char buf[64]; SDL_snprintf(buf, sizeof (buf), "XInput Controller #%u", i+1); SDL_hapticlist[SDL_numhaptics].name = SDL_strdup(buf); SDL_hapticlist[SDL_numhaptics].bXInputHaptic = 1; SDL_hapticlist[SDL_numhaptics].userid = (Uint8) i; SDL_numhaptics++; } } } } return SDL_numhaptics; }