bool bsv_movie_ctl(enum bsv_ctl_state state, void *data) { switch (state) { case BSV_MOVIE_CTL_IS_INITED: return bsv_movie_state.movie; case BSV_MOVIE_CTL_PLAYBACK_ON: return bsv_movie_state.movie && bsv_movie_state.movie_playback; case BSV_MOVIE_CTL_PLAYBACK_OFF: return bsv_movie_state.movie && !bsv_movie_state.movie_playback; case BSV_MOVIE_CTL_START_RECORDING: return bsv_movie_state.movie_start_recording; case BSV_MOVIE_CTL_SET_START_RECORDING: bsv_movie_state.movie_start_recording = true; break; case BSV_MOVIE_CTL_UNSET_START_RECORDING: bsv_movie_state.movie_start_recording = false; break; case BSV_MOVIE_CTL_START_PLAYBACK: return bsv_movie_state.movie_start_playback; case BSV_MOVIE_CTL_SET_START_PLAYBACK: bsv_movie_state.movie_start_playback = true; break; case BSV_MOVIE_CTL_UNSET_START_PLAYBACK: bsv_movie_state.movie_start_playback = false; break; case BSV_MOVIE_CTL_END: return bsv_movie_state.movie_end; case BSV_MOVIE_CTL_SET_END_EOF: bsv_movie_state.eof_exit = true; break; case BSV_MOVIE_CTL_END_EOF: return bsv_movie_state.movie_end && bsv_movie_state.eof_exit; case BSV_MOVIE_CTL_SET_END: bsv_movie_state.movie_end = true; break; case BSV_MOVIE_CTL_UNSET_END: bsv_movie_state.movie_end = false; break; case BSV_MOVIE_CTL_UNSET_PLAYBACK: bsv_movie_state.movie_playback = false; break; case BSV_MOVIE_CTL_DEINIT: if (bsv_movie_state.movie) bsv_movie_free(bsv_movie_state.movie); bsv_movie_state.movie = NULL; break; case BSV_MOVIE_CTL_INIT: bsv_movie_init_state(); break; case BSV_MOVIE_CTL_SET_FRAME_START: bsv_movie_set_frame_start(bsv_movie_state.movie); break; case BSV_MOVIE_CTL_SET_FRAME_END: bsv_movie_set_frame_end(bsv_movie_state.movie); break; case BSV_MOVIE_CTL_FRAME_REWIND: bsv_movie_frame_rewind(bsv_movie_state.movie); break; default: return false; } return true; }
/** * check_rewind: * @pressed : was rewind key pressed or held? * * Checks if rewind toggle/hold was being pressed and/or held. **/ static void check_rewind(settings_t *settings, global_t *global, bool pressed) { static bool first = true; if (state_manager_frame_is_reversed()) { audio_driver_frame_is_reverse(); state_manager_set_frame_is_reversed(false); } if (first) { first = false; return; } if (!global->rewind.state) return; if (pressed) { const void *buf = NULL; if (state_manager_pop(global->rewind.state, &buf)) { state_manager_set_frame_is_reversed(true); audio_driver_setup_rewind(); rarch_main_msg_queue_push_new(MSG_REWINDING, 0, main_is_paused ? 1 : 30, true); core.retro_unserialize(buf, global->rewind.size); if (global->bsv.movie) bsv_movie_frame_rewind(global->bsv.movie); } else rarch_main_msg_queue_push_new(MSG_REWIND_REACHED_END, 0, 30, true); } else { static unsigned cnt = 0; cnt = (cnt + 1) % (settings->rewind_granularity ? settings->rewind_granularity : 1); /* Avoid possible SIGFPE. */ if ((cnt == 0) || global->bsv.movie) { static struct retro_perf_counter rewind_serialize = {0}; void *state = NULL; state_manager_push_where(global->rewind.state, &state); rarch_perf_init(&rewind_serialize, "rewind_serialize"); retro_perf_start(&rewind_serialize); core.retro_serialize(state, global->rewind.size); retro_perf_stop(&rewind_serialize); state_manager_push_do(global->rewind.state); } } retro_set_rewind_callbacks(); }
bool bsv_movie_ctl(enum bsv_ctl_state state, void *data) { switch (state) { case BSV_MOVIE_CTL_IS_INITED: return bsv_movie_state.movie; case BSV_MOVIE_CTL_PLAYBACK_ON: return bsv_movie_state.movie && bsv_movie_state.movie_playback; case BSV_MOVIE_CTL_PLAYBACK_OFF: return bsv_movie_state.movie && !bsv_movie_state.movie_playback; case BSV_MOVIE_CTL_START_RECORDING: return bsv_movie_state.movie_start_recording; case BSV_MOVIE_CTL_SET_START_RECORDING: bsv_movie_state.movie_start_recording = true; break; case BSV_MOVIE_CTL_UNSET_START_RECORDING: bsv_movie_state.movie_start_recording = false; break; case BSV_MOVIE_CTL_START_PLAYBACK: return bsv_movie_state.movie_start_playback; case BSV_MOVIE_CTL_SET_START_PLAYBACK: bsv_movie_state.movie_start_playback = true; break; case BSV_MOVIE_CTL_UNSET_START_PLAYBACK: bsv_movie_state.movie_start_playback = false; break; case BSV_MOVIE_CTL_END: return bsv_movie_state.movie_end; case BSV_MOVIE_CTL_SET_END_EOF: bsv_movie_state.eof_exit = true; break; case BSV_MOVIE_CTL_END_EOF: return bsv_movie_state.movie_end && bsv_movie_state.eof_exit; case BSV_MOVIE_CTL_SET_END: bsv_movie_state.movie_end = true; break; case BSV_MOVIE_CTL_UNSET_END: bsv_movie_state.movie_end = false; break; case BSV_MOVIE_CTL_UNSET_PLAYBACK: bsv_movie_state.movie_playback = false; break; case BSV_MOVIE_CTL_DEINIT: if (bsv_movie_state.movie) bsv_movie_free(bsv_movie_state.movie); bsv_movie_state.movie = NULL; break; case BSV_MOVIE_CTL_INIT: bsv_movie_init_state(); break; case BSV_MOVIE_CTL_SET_FRAME_START: bsv_movie_set_frame_start(bsv_movie_state.movie); break; case BSV_MOVIE_CTL_SET_FRAME_END: bsv_movie_set_frame_end(bsv_movie_state.movie); break; case BSV_MOVIE_CTL_FRAME_REWIND: bsv_movie_frame_rewind(bsv_movie_state.movie); break; case BSV_MOVIE_CTL_GET_INPUT: { int16_t *bsv_data = (int16_t*)data; bsv_movie_t *handle = bsv_movie_state.movie; if (fread(bsv_data, sizeof(int16_t), 1, handle->file) != 1) return false; *bsv_data = swap_if_big16(*bsv_data); } break; case BSV_MOVIE_CTL_SET_INPUT: { int16_t *bsv_data = (int16_t*)data; bsv_movie_t *handle = bsv_movie_state.movie; *bsv_data = swap_if_big16(*bsv_data); fwrite(bsv_data, sizeof(int16_t), 1, handle->file); } break; case BSV_MOVIE_CTL_NONE: default: return false; } return true; }
/** * check_rewind: * @pressed : was rewind key pressed or held? * * Checks if rewind toggle/hold was being pressed and/or held. **/ static void check_rewind(settings_t *settings, global_t *global, runloop_t *runloop, bool pressed) { static bool first = true; if (global->rewind.frame_is_reverse) { audio_driver_frame_is_reverse(); global->rewind.frame_is_reverse = false; } if (first) { first = false; return; } if (!global->rewind.state) return; if (pressed) { const void *buf = NULL; if (state_manager_pop(global->rewind.state, &buf)) { global->rewind.frame_is_reverse = true; audio_driver_setup_rewind(); rarch_main_msg_queue_push_new(MSG_REWINDING, 0, runloop->is_paused ? 1 : 30, true); pretro_unserialize(buf, global->rewind.size); if (global->bsv.movie) bsv_movie_frame_rewind(global->bsv.movie); } else rarch_main_msg_queue_push_new(MSG_REWIND_REACHED_END, 0, 30, true); } else { static unsigned cnt = 0; cnt = (cnt + 1) % (settings->rewind_granularity ? settings->rewind_granularity : 1); /* Avoid possible SIGFPE. */ if ((cnt == 0) || global->bsv.movie) { void *state = NULL; state_manager_push_where(global->rewind.state, &state); RARCH_PERFORMANCE_INIT(rewind_serialize); RARCH_PERFORMANCE_START(rewind_serialize); pretro_serialize(state, global->rewind.size); RARCH_PERFORMANCE_STOP(rewind_serialize); state_manager_push_do(global->rewind.state); } } retro_set_rewind_callbacks(); }
static void check_rewind(bool pressed) { static bool first = true; if (g_extern.frame_is_reverse) { /* We just rewound. Flush rewind audio buffer. */ retro_flush_audio(g_extern.audio_data.rewind_buf + g_extern.audio_data.rewind_ptr, g_extern.audio_data.rewind_size - g_extern.audio_data.rewind_ptr); g_extern.frame_is_reverse = false; } if (first) { first = false; return; } if (!g_extern.state_manager) return; if (pressed) { const void *buf = NULL; msg_queue_clear(g_extern.msg_queue); if (state_manager_pop(g_extern.state_manager, &buf)) { g_extern.frame_is_reverse = true; setup_rewind_audio(); msg_queue_push(g_extern.msg_queue, RETRO_MSG_REWINDING, 0, g_extern.is_paused ? 1 : 30); pretro_unserialize(buf, g_extern.state_size); if (g_extern.bsv.movie) bsv_movie_frame_rewind(g_extern.bsv.movie); } else msg_queue_push(g_extern.msg_queue, RETRO_MSG_REWIND_REACHED_END, 0, 30); } else { static unsigned cnt = 0; cnt = (cnt + 1) % (g_settings.rewind_granularity ? g_settings.rewind_granularity : 1); /* Avoid possible SIGFPE. */ if ((cnt == 0) || g_extern.bsv.movie) { void *state = NULL; state_manager_push_where(g_extern.state_manager, &state); RARCH_PERFORMANCE_INIT(rewind_serialize); RARCH_PERFORMANCE_START(rewind_serialize); pretro_serialize(state, g_extern.state_size); RARCH_PERFORMANCE_STOP(rewind_serialize); state_manager_push_do(g_extern.state_manager); } } retro_set_rewind_callbacks(); }