diff --git a/src/emulator.c b/src/emulator.c index 7ec6a3c6..af314567 100644 --- a/src/emulator.c +++ b/src/emulator.c @@ -62,7 +62,6 @@ struct emu { struct render_backend *r, *r2; struct imgui *imgui; struct microprofile *mp; - struct trace_writer *trace_writer; /* hosts which support creating multiple gl contexts will render video on @@ -565,6 +564,12 @@ static void emu_paint(struct emu *emu) { /* * dreamcast guest interface */ +static void emu_guest_poll_input(void *userdata) { + struct emu *emu = userdata; + + input_poll(emu->host); +} + static void emu_guest_vertical_blank(void *userdata) { struct emu *emu = userdata; @@ -827,6 +832,7 @@ struct emu *emu_create(struct host *host) { emu->dc->start_render = &emu_guest_start_render; emu->dc->finish_render = &emu_guest_finish_render; emu->dc->vertical_blank = &emu_guest_vertical_blank; + emu->dc->poll_input = &emu_guest_poll_input; /* start up the video thread */ emu->multi_threaded = video_supports_multiple_contexts(emu->host); diff --git a/src/guest/dreamcast.c b/src/guest/dreamcast.c index 9d0fcf65..a4a45283 100644 --- a/src/guest/dreamcast.c +++ b/src/guest/dreamcast.c @@ -16,6 +16,14 @@ #include "guest/scheduler.h" #include "guest/sh4/sh4.h" +void dc_poll_input(struct dreamcast *dc) { + if (!dc->poll_input) { + return; + } + + dc->poll_input(dc->userdata); +} + void dc_vertical_blank(struct dreamcast *dc) { if (!dc->vertical_blank) { return; diff --git a/src/guest/dreamcast.h b/src/guest/dreamcast.h index ff71713d..84a8fe45 100644 --- a/src/guest/dreamcast.h +++ b/src/guest/dreamcast.h @@ -126,6 +126,7 @@ typedef void (*push_audio_cb)(void *, const int16_t *, int); typedef void (*start_render_cb)(void *, struct tile_context *); typedef void (*finish_render_cb)(void *); typedef void (*vertical_blank_cb)(void *); +typedef void (*poll_input_cb)(void *); struct dreamcast { int running; @@ -155,6 +156,7 @@ struct dreamcast { start_render_cb start_render; finish_render_cb finish_render; vertical_blank_cb vertical_blank; + poll_input_cb poll_input; }; struct dreamcast *dc_create(); @@ -193,5 +195,6 @@ void dc_push_audio(struct dreamcast *dc, const int16_t *data, int frames); void dc_start_render(struct dreamcast *dc, struct tile_context *ctx); void dc_finish_render(struct dreamcast *dc); void dc_vertical_blank(struct dreamcast *dc); +void dc_poll_input(struct dreamcast *dc); #endif diff --git a/src/guest/maple/controller.c b/src/guest/maple/controller.c index bc740124..3f95a30c 100644 --- a/src/guest/maple/controller.c +++ b/src/guest/maple/controller.c @@ -33,6 +33,12 @@ struct controller { struct maple_cond cnd; }; +static void controller_update(struct controller *ctrl) { + /* dc_poll_input will call into controller_input if new values are + available */ + dc_poll_input(ctrl->dc); +} + static int controller_input(struct maple_device *dev, int button, int16_t value) { struct controller *ctrl = (struct controller *)dev; @@ -95,6 +101,8 @@ static int controller_frame(struct maple_device *dev, } case MAPLE_REQ_GETCOND: { + controller_update(ctrl); + res->header.command = MAPLE_RES_TRANSFER; res->header.recv_addr = frame->header.send_addr; res->header.send_addr = frame->header.recv_addr; diff --git a/src/host/sdl_host.c b/src/host/sdl_host.c index ed809d78..6e2d17d0 100644 --- a/src/host/sdl_host.c +++ b/src/host/sdl_host.c @@ -858,6 +858,9 @@ int main(int argc, char **argv) { if (emu_load_game(emu, load)) { while (!g_host->closed) { + /* even though the emulator itself will poll for events when updating + controller input, the main loop needs to also poll to ensure the + close event is received */ host_poll_events(g_host); /* only step the emulator if the available audio is running low. this