Shutdown subsystems on exit
Porting from testing, originally by @fgsfdsfgs
This commit is contained in:
parent
8722b09bb4
commit
9e8290773b
@ -10,6 +10,7 @@ struct AudioAPI {
|
|||||||
int (*buffered)(void);
|
int (*buffered)(void);
|
||||||
int (*get_desired_buffered)(void);
|
int (*get_desired_buffered)(void);
|
||||||
void (*play)(const uint8_t *buf, size_t len);
|
void (*play)(const uint8_t *buf, size_t len);
|
||||||
|
void (*shutdown)(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -15,9 +15,13 @@ static int audio_null_get_desired_buffered(void) {
|
|||||||
static void audio_null_play(const uint8_t *buf, size_t len) {
|
static void audio_null_play(const uint8_t *buf, size_t len) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void audio_null_shutdown(void) {
|
||||||
|
}
|
||||||
|
|
||||||
struct AudioAPI audio_null = {
|
struct AudioAPI audio_null = {
|
||||||
audio_null_init,
|
audio_null_init,
|
||||||
audio_null_buffered,
|
audio_null_buffered,
|
||||||
audio_null_get_desired_buffered,
|
audio_null_get_desired_buffered,
|
||||||
audio_null_play
|
audio_null_play,
|
||||||
};
|
audio_null_shutdown
|
||||||
|
};
|
@ -40,9 +40,21 @@ static void audio_sdl_play(const uint8_t *buf, size_t len) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void audio_sdl_shutdown(void)
|
||||||
|
{
|
||||||
|
if (SDL_WasInit(SDL_INIT_AUDIO)) {
|
||||||
|
if (dev != 0) {
|
||||||
|
SDL_CloseAudioDevice(dev);
|
||||||
|
dev = 0;
|
||||||
|
}
|
||||||
|
SDL_QuitSubSystem(SDL_INIT_AUDIO);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct AudioAPI audio_sdl = {
|
struct AudioAPI audio_sdl = {
|
||||||
audio_sdl_init,
|
audio_sdl_init,
|
||||||
audio_sdl_buffered,
|
audio_sdl_buffered,
|
||||||
audio_sdl_get_desired_buffered,
|
audio_sdl_get_desired_buffered,
|
||||||
audio_sdl_play
|
audio_sdl_play,
|
||||||
|
audio_sdl_shutdown
|
||||||
};
|
};
|
@ -13,10 +13,14 @@ struct ControllerAPI {
|
|||||||
void (*read)(OSContPad *pad); // read controller and update N64 pad values
|
void (*read)(OSContPad *pad); // read controller and update N64 pad values
|
||||||
u32 (*rawkey)(void); // returns last pressed virtual key or VK_INVALID if none
|
u32 (*rawkey)(void); // returns last pressed virtual key or VK_INVALID if none
|
||||||
void (*reconfig)(void); // (optional) call when bindings have changed
|
void (*reconfig)(void); // (optional) call when bindings have changed
|
||||||
|
void (*shutdown)(void); // (optional) call in osContReset
|
||||||
};
|
};
|
||||||
|
|
||||||
// used for binding keys
|
// used for binding keys
|
||||||
u32 controller_get_raw_key(void);
|
u32 controller_get_raw_key(void);
|
||||||
void controller_reconfigure(void);
|
void controller_reconfigure(void);
|
||||||
|
|
||||||
|
// calls the shutdown() function of all controller subsystems
|
||||||
|
void controller_shutdown(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -65,6 +65,13 @@ u32 controller_get_raw_key(void) {
|
|||||||
return VK_INVALID;
|
return VK_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void controller_shutdown(void) {
|
||||||
|
for (size_t i = 0; i < sizeof(controller_implementations) / sizeof(struct ControllerAPI *); i++) {
|
||||||
|
if (controller_implementations[i]->shutdown)
|
||||||
|
controller_implementations[i]->shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void controller_reconfigure(void) {
|
void controller_reconfigure(void) {
|
||||||
for (size_t i = 0; i < sizeof(controller_implementations) / sizeof(struct ControllerAPI *); i++) {
|
for (size_t i = 0; i < sizeof(controller_implementations) / sizeof(struct ControllerAPI *); i++) {
|
||||||
if (controller_implementations[i]->reconfig)
|
if (controller_implementations[i]->reconfig)
|
||||||
|
@ -107,10 +107,14 @@ static u32 keyboard_rawkey(void) {
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void keyboard_shutdown(void) {
|
||||||
|
}
|
||||||
|
|
||||||
struct ControllerAPI controller_keyboard = {
|
struct ControllerAPI controller_keyboard = {
|
||||||
VK_BASE_KEYBOARD,
|
VK_BASE_KEYBOARD,
|
||||||
keyboard_init,
|
keyboard_init,
|
||||||
keyboard_read,
|
keyboard_read,
|
||||||
keyboard_rawkey,
|
keyboard_rawkey,
|
||||||
keyboard_bindkeys,
|
keyboard_bindkeys,
|
||||||
|
keyboard_shutdown
|
||||||
};
|
};
|
||||||
|
@ -23,6 +23,13 @@ static void tas_read(OSContPad *pad) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void tas_shutdown(void) {
|
||||||
|
if (fp != NULL) {
|
||||||
|
fclose(fp);
|
||||||
|
fp = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static u32 tas_rawkey(void) {
|
static u32 tas_rawkey(void) {
|
||||||
return VK_INVALID;
|
return VK_INVALID;
|
||||||
}
|
}
|
||||||
@ -33,4 +40,5 @@ struct ControllerAPI controller_recorded_tas = {
|
|||||||
tas_read,
|
tas_read,
|
||||||
tas_rawkey,
|
tas_rawkey,
|
||||||
NULL, // no rebinding
|
NULL, // no rebinding
|
||||||
|
tas_shutdown
|
||||||
};
|
};
|
||||||
|
@ -204,10 +204,22 @@ static u32 controller_sdl_rawkey(void) {
|
|||||||
return VK_INVALID;
|
return VK_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void controller_sdl_shutdown(void) {
|
||||||
|
if (SDL_WasInit(SDL_INIT_GAMECONTROLLER)) {
|
||||||
|
if (sdl_cntrl) {
|
||||||
|
SDL_GameControllerClose(sdl_cntrl);
|
||||||
|
sdl_cntrl = NULL;
|
||||||
|
}
|
||||||
|
SDL_QuitSubSystem(SDL_INIT_GAMECONTROLLER);
|
||||||
|
}
|
||||||
|
init_ok = false;
|
||||||
|
}
|
||||||
|
|
||||||
struct ControllerAPI controller_sdl = {
|
struct ControllerAPI controller_sdl = {
|
||||||
VK_BASE_SDL_GAMEPAD,
|
VK_BASE_SDL_GAMEPAD,
|
||||||
controller_sdl_init,
|
controller_sdl_init,
|
||||||
controller_sdl_read,
|
controller_sdl_read,
|
||||||
controller_sdl_rawkey,
|
controller_sdl_rawkey,
|
||||||
controller_sdl_bind,
|
controller_sdl_bind,
|
||||||
|
controller_sdl_shutdown
|
||||||
};
|
};
|
||||||
|
@ -481,6 +481,9 @@ static void gfx_opengl_start_frame(void) {
|
|||||||
glEnable(GL_SCISSOR_TEST);
|
glEnable(GL_SCISSOR_TEST);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void gfx_opengl_shutdown(void) {
|
||||||
|
}
|
||||||
|
|
||||||
struct GfxRenderingAPI gfx_opengl_api = {
|
struct GfxRenderingAPI gfx_opengl_api = {
|
||||||
gfx_opengl_z_is_from_0_to_1,
|
gfx_opengl_z_is_from_0_to_1,
|
||||||
gfx_opengl_unload_shader,
|
gfx_opengl_unload_shader,
|
||||||
@ -500,5 +503,6 @@ struct GfxRenderingAPI gfx_opengl_api = {
|
|||||||
gfx_opengl_set_use_alpha,
|
gfx_opengl_set_use_alpha,
|
||||||
gfx_opengl_draw_triangles,
|
gfx_opengl_draw_triangles,
|
||||||
gfx_opengl_init,
|
gfx_opengl_init,
|
||||||
gfx_opengl_start_frame
|
gfx_opengl_start_frame,
|
||||||
|
gfx_opengl_shutdown
|
||||||
};
|
};
|
||||||
|
@ -1547,3 +1547,14 @@ void gfx_end_frame(void) {
|
|||||||
gfx_wapi->swap_buffers_end();
|
gfx_wapi->swap_buffers_end();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void gfx_shutdown(void) {
|
||||||
|
if (gfx_rapi) {
|
||||||
|
if (gfx_rapi->shutdown) gfx_rapi->shutdown();
|
||||||
|
gfx_rapi = NULL;
|
||||||
|
}
|
||||||
|
if (gfx_wapi) {
|
||||||
|
if (gfx_wapi->shutdown) gfx_wapi->shutdown();
|
||||||
|
gfx_wapi = NULL;
|
||||||
|
}
|
||||||
|
}
|
@ -15,5 +15,6 @@ void gfx_init(struct GfxWindowManagerAPI *wapi, struct GfxRenderingAPI *rapi);
|
|||||||
void gfx_start_frame(void);
|
void gfx_start_frame(void);
|
||||||
void gfx_run(Gfx *commands);
|
void gfx_run(Gfx *commands);
|
||||||
void gfx_end_frame(void);
|
void gfx_end_frame(void);
|
||||||
|
void gfx_shutdown(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -27,6 +27,7 @@ struct GfxRenderingAPI {
|
|||||||
void (*draw_triangles)(float buf_vbo[], size_t buf_vbo_len, size_t buf_vbo_num_tris);
|
void (*draw_triangles)(float buf_vbo[], size_t buf_vbo_len, size_t buf_vbo_num_tris);
|
||||||
void (*init)(void);
|
void (*init)(void);
|
||||||
void (*start_frame)(void);
|
void (*start_frame)(void);
|
||||||
|
void (*shutdown)(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include "src/pc/controller/controller_keyboard.h"
|
#include "src/pc/controller/controller_keyboard.h"
|
||||||
|
|
||||||
static SDL_Window *wnd;
|
static SDL_Window *wnd;
|
||||||
|
static SDL_GLContext ctx = NULL;
|
||||||
static int inverted_scancode_table[512];
|
static int inverted_scancode_table[512];
|
||||||
|
|
||||||
static bool cur_fullscreen;
|
static bool cur_fullscreen;
|
||||||
@ -235,6 +236,15 @@ static double gfx_sdl_get_time(void) {
|
|||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void gfx_sdl_shutdown(void) {
|
||||||
|
if (SDL_WasInit(0)) {
|
||||||
|
if (ctx) { SDL_GL_DeleteContext(ctx); ctx = NULL; }
|
||||||
|
if (wnd) { SDL_DestroyWindow(wnd); wnd = NULL; }
|
||||||
|
SDL_Quit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct GfxWindowManagerAPI gfx_sdl = {
|
struct GfxWindowManagerAPI gfx_sdl = {
|
||||||
gfx_sdl_init,
|
gfx_sdl_init,
|
||||||
gfx_sdl_main_loop,
|
gfx_sdl_main_loop,
|
||||||
@ -243,5 +253,6 @@ struct GfxWindowManagerAPI gfx_sdl = {
|
|||||||
gfx_sdl_start_frame,
|
gfx_sdl_start_frame,
|
||||||
gfx_sdl_swap_buffers_begin,
|
gfx_sdl_swap_buffers_begin,
|
||||||
gfx_sdl_swap_buffers_end,
|
gfx_sdl_swap_buffers_end,
|
||||||
gfx_sdl_get_time
|
gfx_sdl_get_time,
|
||||||
|
gfx_sdl_shutdown
|
||||||
};
|
};
|
||||||
|
@ -13,6 +13,7 @@ struct GfxWindowManagerAPI {
|
|||||||
void (*swap_buffers_begin)(void);
|
void (*swap_buffers_begin)(void);
|
||||||
void (*swap_buffers_end)(void);
|
void (*swap_buffers_end)(void);
|
||||||
double (*get_time)(void); // For debug
|
double (*get_time)(void); // For debug
|
||||||
|
void (*shutdown)(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -84,6 +84,20 @@ void produce_one_frame(void) {
|
|||||||
gfx_end_frame();
|
gfx_end_frame();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void audio_shutdown(void) {
|
||||||
|
if (audio_api) {
|
||||||
|
if (audio_api->shutdown) audio_api->shutdown();
|
||||||
|
audio_api = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void game_shutdown(void) {
|
||||||
|
configfile_save(CONFIG_FILE);
|
||||||
|
controller_shutdown();
|
||||||
|
audio_shutdown();
|
||||||
|
gfx_shutdown();
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef TARGET_WEB
|
#ifdef TARGET_WEB
|
||||||
static void em_main_loop(void) {
|
static void em_main_loop(void) {
|
||||||
}
|
}
|
||||||
@ -117,17 +131,13 @@ static void on_anim_frame(double time) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void save_config(void) {
|
|
||||||
configfile_save(CONFIG_FILE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void main_func(void) {
|
void main_func(void) {
|
||||||
static u64 pool[0x165000/8 / 4 * sizeof(void *)];
|
static u64 pool[0x165000/8 / 4 * sizeof(void *)];
|
||||||
main_pool_init(pool, pool + sizeof(pool) / sizeof(pool[0]));
|
main_pool_init(pool, pool + sizeof(pool) / sizeof(pool[0]));
|
||||||
gEffectsMemoryPool = mem_pool_init(0x4000, MEMORY_POOL_LEFT);
|
gEffectsMemoryPool = mem_pool_init(0x4000, MEMORY_POOL_LEFT);
|
||||||
|
|
||||||
configfile_load(CONFIG_FILE);
|
configfile_load(CONFIG_FILE);
|
||||||
atexit(save_config);
|
atexit(game_shutdown);
|
||||||
|
|
||||||
#ifdef TARGET_WEB
|
#ifdef TARGET_WEB
|
||||||
emscripten_set_main_loop(em_main_loop, 0, 0);
|
emscripten_set_main_loop(em_main_loop, 0, 0);
|
||||||
|
Loading…
Reference in New Issue
Block a user