21 #include "../../SDL_internal.h"
23 #ifdef SDL_JOYSTICK_HIDAPI
30 #include "../../thread/SDL_systhread.h"
33 typedef struct SDL_HIDAPI_RumbleRequest
38 struct SDL_HIDAPI_RumbleRequest *prev;
40 } SDL_HIDAPI_RumbleRequest;
42 typedef struct SDL_HIDAPI_RumbleContext
49 SDL_HIDAPI_RumbleRequest *requests_head;
50 SDL_HIDAPI_RumbleRequest *requests_tail;
51 } SDL_HIDAPI_RumbleContext;
53 static SDL_HIDAPI_RumbleContext rumble_context;
55 static int SDL_HIDAPI_RumbleThread(
void *
data)
57 SDL_HIDAPI_RumbleContext *
ctx = (SDL_HIDAPI_RumbleContext *)
data;
62 SDL_HIDAPI_RumbleRequest *request =
NULL;
67 request =
ctx->requests_tail;
69 if (request ==
ctx->requests_head) {
72 ctx->requests_tail = request->prev;
78 if (request->device->dev) {
79 hid_write( request->device->dev, request->data, request->size );
90 SDL_HIDAPI_StopRumbleThread(SDL_HIDAPI_RumbleContext *
ctx)
92 SDL_HIDAPI_RumbleRequest *request;
105 while (
ctx->requests_tail) {
106 request =
ctx->requests_tail;
107 if (request ==
ctx->requests_head) {
110 ctx->requests_tail = request->prev;
117 if (
ctx->request_sem) {
131 SDL_HIDAPI_StartRumbleThread(SDL_HIDAPI_RumbleContext *
ctx)
135 SDL_HIDAPI_StopRumbleThread(
ctx);
140 if (!
ctx->request_sem) {
141 SDL_HIDAPI_StopRumbleThread(
ctx);
148 SDL_HIDAPI_StopRumbleThread(
ctx);
154 int SDL_HIDAPI_LockRumble(
void)
156 SDL_HIDAPI_RumbleContext *
ctx = &rumble_context;
159 if (SDL_HIDAPI_StartRumbleThread(
ctx) < 0) {
169 SDL_HIDAPI_RumbleContext *
ctx = &rumble_context;
170 SDL_HIDAPI_RumbleRequest *request, *found;
173 for (request =
ctx->requests_tail; request; request = request->prev) {
174 if (request->device ==
device) {
180 *
size = &found->size;
181 *maximum_size =
sizeof(found->data);
189 SDL_HIDAPI_RumbleContext *
ctx = &rumble_context;
190 SDL_HIDAPI_RumbleRequest *request;
192 if (
size >
sizeof(request->data)) {
193 SDL_HIDAPI_UnlockRumble();
194 return SDL_SetError(
"Couldn't send rumble, size %d is greater than %d",
size, (
int)
sizeof(request->data));
197 request = (SDL_HIDAPI_RumbleRequest *)
SDL_calloc(1,
sizeof(*request));
199 SDL_HIDAPI_UnlockRumble();
204 request->size =
size;
208 if (
ctx->requests_head) {
209 ctx->requests_head->prev = request;
211 ctx->requests_tail = request;
213 ctx->requests_head = request;
216 SDL_HIDAPI_UnlockRumble();
223 void SDL_HIDAPI_UnlockRumble(
void)
225 SDL_HIDAPI_RumbleContext *
ctx = &rumble_context;
236 if (SDL_HIDAPI_LockRumble() < 0) {
241 if (SDL_HIDAPI_GetPendingRumbleLocked(
device, &pending_data, &pending_size, &maximum_size)) {
242 if (
size > maximum_size) {
243 SDL_HIDAPI_UnlockRumble();
244 return SDL_SetError(
"Couldn't send rumble, size %d is greater than %d",
size, maximum_size);
248 *pending_size =
size;
249 SDL_HIDAPI_UnlockRumble();
256 void SDL_HIDAPI_QuitRumble(
void)
258 SDL_HIDAPI_RumbleContext *
ctx = &rumble_context;
261 SDL_HIDAPI_StopRumbleThread(
ctx);
#define SDL_AtomicDecRef(a)
Decrement an atomic variable used as a reference count.
#define SDL_AtomicIncRef(a)
Increment an atomic variable used as a reference count.
#define SDL_SetThreadPriority
#define SDL_DestroySemaphore
#define SDL_CreateSemaphore
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 void
#define SDL_OutOfMemory()
#define USB_PACKET_LENGTH
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
SDL_Thread * SDL_CreateThreadInternal(int(*fn)(void *), const char *name, const size_t stacksize, void *data)
@ SDL_THREAD_PRIORITY_HIGH
int HID_API_EXPORT HID_API_CALL hid_write(hid_device *device, const unsigned char *data, size_t length)
Write an Output report to a HID device.
static SDL_AudioDeviceID device
A type representing an atomic integer value. It is a struct so people don't accidentally use numeric ...