diff --git a/src/sdl/sdl-events.c b/src/sdl/sdl-events.c index c787d2f9a..09dd00af8 100644 --- a/src/sdl/sdl-events.c +++ b/src/sdl/sdl-events.c @@ -4,16 +4,17 @@ #include "gba-io.h" #include "gba-video.h" -int GBASDLInitEvents() { +int GBASDLInitEvents(struct GBASDLEvents* context) { if (SDL_InitSubSystem(SDL_INIT_JOYSTICK) < 0) { return 0; } SDL_JoystickEventState(SDL_ENABLE); - SDL_JoystickOpen(0); + context->joystick = SDL_JoystickOpen(0); return 1; } -void GBASDLDeinitEvents() { +void GBASDLDeinitEvents(struct GBASDLEvents* context) { + SDL_JoystickClose(context->joystick); SDL_QuitSubSystem(SDL_INIT_JOYSTICK); } diff --git a/src/sdl/sdl-events.h b/src/sdl/sdl-events.h index a9e718560..6e5294532 100644 --- a/src/sdl/sdl-events.h +++ b/src/sdl/sdl-events.h @@ -5,8 +5,12 @@ #include -int GBASDLInitEvents(void); -void GBASDLDeinitEvents(void); +struct GBASDLEvents { + SDL_Joystick* joystick; +}; + +int GBASDLInitEvents(struct GBASDLEvents*); +void GBASDLDeinitEvents(struct GBASDLEvents*); void GBASDLHandleEvent(struct GBAThread* context, const union SDL_Event* event); diff --git a/src/util/circle-buffer.c b/src/util/circle-buffer.c index a2231e7fa..d1b16cb62 100644 --- a/src/util/circle-buffer.c +++ b/src/util/circle-buffer.c @@ -42,8 +42,24 @@ int CircleBufferWrite32(struct CircleBuffer* buffer, int32_t value) { return 1; } -int CircleBufferRead32(struct CircleBuffer* buffer, int32_t* value) { - uint32_t* data = buffer->readPtr; +int CircleBufferRead8(struct CircleBuffer* buffer, int8_t* value) { + int8_t* data = buffer->readPtr; + if (buffer->readPtr == buffer->writePtr) { + return 0; + } + *value = *data; + ++data; + ptrdiff_t size = (int8_t*) data - (int8_t*) buffer->data; + if (size < buffer->capacity) { + buffer->readPtr = data; + } else { + buffer->readPtr = buffer->data; + } + return 1; +} + +int CircleBufferRead32(struct CircleBuffer* buffer, int32_t* value) { + int32_t* data = buffer->readPtr; if (buffer->readPtr == buffer->writePtr) { return 0; } diff --git a/src/util/circle-buffer.h b/src/util/circle-buffer.h index 47c23f0de..b896be49f 100644 --- a/src/util/circle-buffer.h +++ b/src/util/circle-buffer.h @@ -14,6 +14,7 @@ void CircleBufferInit(struct CircleBuffer* buffer, unsigned capacity); void CircleBufferDeinit(struct CircleBuffer* buffer); unsigned CircleBufferSize(const struct CircleBuffer* buffer); int CircleBufferWrite32(struct CircleBuffer* buffer, int32_t value); +int CircleBufferRead8(struct CircleBuffer* buffer, int8_t* value); int CircleBufferRead32(struct CircleBuffer* buffer, int32_t* value); #endif