From 6104a9ad86e08ef33563b308db7ed85923a81641 Mon Sep 17 00:00:00 2001 From: "Joseph C. Osborn" Date: Tue, 18 Jun 2024 09:15:31 -0700 Subject: [PATCH] change some replay file seeks to seek+truncates in record mode --- input/input_driver.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/input/input_driver.c b/input/input_driver.c index d2bdd1cc30..33fafc37d7 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -5640,6 +5640,7 @@ void bsv_movie_frame_rewind(void) { input_driver_state_t *input_st = &input_driver_st; bsv_movie_t *handle = input_st->bsv_movie_state_handle; + bool recording = (input_st->bsv_movie_state.flags & BSV_FLAG_MOVIE_RECORDING) ? true : false; if (!handle) return; @@ -5652,6 +5653,8 @@ void bsv_movie_frame_rewind(void) /* If we're at the beginning... */ handle->frame_ptr = 0; intfstream_seek(handle->file, (int)handle->min_file_pos, SEEK_SET); + if (recording) + intfstream_truncate(handle->file, (int)handle->min_file_pos); } else { @@ -5663,8 +5666,9 @@ void bsv_movie_frame_rewind(void) * plus another. */ handle->frame_ptr = (handle->frame_ptr - (handle->first_rewind ? 1 : 2)) & handle->frame_mask; - intfstream_seek(handle->file, - (int)handle->frame_pos[handle->frame_ptr], SEEK_SET); + intfstream_seek(handle->file, (int)handle->frame_pos[handle->frame_ptr], SEEK_SET); + if (recording) + intfstream_truncate(handle->file, (int)handle->frame_pos[handle->frame_ptr]); } if (intfstream_tell(handle->file) <= (long)handle->min_file_pos) @@ -5679,6 +5683,7 @@ void bsv_movie_frame_rewind(void) * the starting point. Nice and easy. */ intfstream_seek(handle->file, 4 * sizeof(uint32_t), SEEK_SET); + intfstream_truncate(handle->file, 4 * sizeof(uint32_t)); serial_info.data = handle->state; serial_info.size = handle->state_size; @@ -5936,17 +5941,14 @@ bool replay_set_serialized_data(void* buf) if (is_compatible) { /* If the state is part of this replay, go back to that state - and rewind the replay; otherwise - halt playback and go to that state normally. + and rewind/fast forward the replay. If the savestate movie is after the current replay length we can replace the current replay data with it, but if it's earlier we can rewind the replay to the savestate movie time point. - This can truncate the current recording, so beware! - - TODO/FIXME: Figure out what to do about rewinding across load + This can truncate the current replay if we're in recording mode. */ if (loaded_len > handle_idx) { @@ -5957,10 +5959,15 @@ bool replay_set_serialized_data(void* buf) intfstream_write(input_st->bsv_movie_state_handle->file, buffer+sizeof(int32_t), loaded_len); } else + { intfstream_seek(input_st->bsv_movie_state_handle->file, loaded_len, SEEK_SET); + if (recording) + intfstream_truncate(input_st->bsv_movie_state_handle->file, loaded_len); + } } else { + /* otherwise, if recording do not allow the load */ if (recording) { const char *str = msg_hash_to_str(MSG_REPLAY_LOAD_STATE_FAILED_INCOMPAT); @@ -5970,7 +5977,7 @@ bool replay_set_serialized_data(void* buf) RARCH_ERR("[Replay] %s.\n", str); return false; } - + /* if in playback, halt playback and go to that state normally */ if (playback) { const char *str = msg_hash_to_str(MSG_REPLAY_LOAD_STATE_HALT_INCOMPAT);