Calling a function already defined in the library before gb_run_frame(). This is what is currently done, and I don't think the other two options posses any significant advantage over this. However, the front-end should not have to modify values within the emulator context (gb_t). This should be changed.
Create a gb_init_input() function that allows the front-end to configure how to update the button presses.