Movie playback seems to work! :D

This commit is contained in:
Themaister 2011-02-02 12:45:56 +01:00
parent 2446300dd9
commit 5f8993cb83
7 changed files with 65 additions and 10 deletions

View File

@ -195,6 +195,7 @@ static const struct snes_keybind snes_keybinds_1[] = {
{ SSNES_AUDIO_INPUT_RATE_PLUS, SDLK_KP_PLUS, NO_BTN, AXIS_NONE }, { SSNES_AUDIO_INPUT_RATE_PLUS, SDLK_KP_PLUS, NO_BTN, AXIS_NONE },
{ SSNES_AUDIO_INPUT_RATE_MINUS, SDLK_KP_MINUS, NO_BTN, AXIS_NONE }, { SSNES_AUDIO_INPUT_RATE_MINUS, SDLK_KP_MINUS, NO_BTN, AXIS_NONE },
{ SSNES_REWIND, SDLK_r, NO_BTN, AXIS_NONE }, { SSNES_REWIND, SDLK_r, NO_BTN, AXIS_NONE },
{ SSNES_MOVIE_RECORD_TOGGLE, SDLK_o, NO_BTN, AXIS_NONE },
{ -1 } { -1 }
}; };

View File

@ -37,6 +37,7 @@ enum
SSNES_AUDIO_INPUT_RATE_PLUS, SSNES_AUDIO_INPUT_RATE_PLUS,
SSNES_AUDIO_INPUT_RATE_MINUS, SSNES_AUDIO_INPUT_RATE_MINUS,
SSNES_REWIND, SSNES_REWIND,
SSNES_MOVIE_RECORD_TOGGLE,
}; };
struct snes_keybind struct snes_keybind

View File

@ -37,7 +37,7 @@
#define MAX_PLAYERS 5 #define MAX_PLAYERS 5
#define MAX_BINDS 23 // Needs to be increased every time there are new binds added. #define MAX_BINDS 24 // Needs to be increased every time there are new binds added.
#define SSNES_NO_JOYPAD 0xFFFF #define SSNES_NO_JOYPAD 0xFFFF
struct settings struct settings
{ {
@ -157,7 +157,7 @@ struct global
bool frame_is_reverse; bool frame_is_reverse;
bsv_movie_t *bsv_movie; bsv_movie_t *bsv_movie;
char bsv_movie_path[256]; char bsv_movie_path[512];
bool bsv_movie_end; bool bsv_movie_end;
bool bsv_movie_playback; bool bsv_movie_playback;

View File

@ -135,7 +135,7 @@ static bool init_playback(bsv_movie_t *handle, const char *path)
} }
uint32_t header[4] = {0}; uint32_t header[4] = {0};
if (fread(header, 4, sizeof(uint32_t), handle->file) != 4) if (fread(header, sizeof(uint32_t), 4, handle->file) != 4)
{ {
SSNES_ERR("Couldn't read movie header!\n"); SSNES_ERR("Couldn't read movie header!\n");
return false; return false;
@ -209,7 +209,7 @@ void bsv_movie_free(bsv_movie_t *handle)
bool bsv_movie_get_input(bsv_movie_t *handle, int16_t *input) bool bsv_movie_get_input(bsv_movie_t *handle, int16_t *input)
{ {
if (fread(input, 1, sizeof(int16_t), handle->file) != 1) if (fread(input, sizeof(int16_t), 1, handle->file) != 1)
return false; return false;
*input = swap_if_big16(*input); *input = swap_if_big16(*input);
@ -218,7 +218,7 @@ bool bsv_movie_get_input(bsv_movie_t *handle, int16_t *input)
void bsv_movie_set_input(bsv_movie_t *handle, int16_t input) void bsv_movie_set_input(bsv_movie_t *handle, int16_t input)
{ {
fwrite(&input, 1, sizeof(int16_t), handle->file); fwrite(&input, sizeof(int16_t), 1, handle->file);
} }
bsv_movie_t *bsv_movie_init(const char *path, enum ssnes_movie_type type) bsv_movie_t *bsv_movie_init(const char *path, enum ssnes_movie_type type)

View File

@ -357,6 +357,7 @@ static const struct bind_map bind_maps[MAX_PLAYERS][MAX_BINDS - 1] = {
DECLARE_BIND(rate_step_up, SSNES_AUDIO_INPUT_RATE_PLUS) DECLARE_BIND(rate_step_up, SSNES_AUDIO_INPUT_RATE_PLUS)
DECLARE_BIND(rate_step_down, SSNES_AUDIO_INPUT_RATE_MINUS) DECLARE_BIND(rate_step_down, SSNES_AUDIO_INPUT_RATE_MINUS)
DECLARE_BIND(rewind, SSNES_REWIND) DECLARE_BIND(rewind, SSNES_REWIND)
DECLARE_BIND(movie_record_toggle, SSNES_MOVIE_RECORD_TOGGLE)
}, },
{ {
DECLARE_BIND(player2_a, SNES_DEVICE_ID_JOYPAD_A) DECLARE_BIND(player2_a, SNES_DEVICE_ID_JOYPAD_A)
@ -381,6 +382,7 @@ static const struct bind_map bind_maps[MAX_PLAYERS][MAX_BINDS - 1] = {
DECLARE_BIND(rate_step_up, SSNES_AUDIO_INPUT_RATE_PLUS) DECLARE_BIND(rate_step_up, SSNES_AUDIO_INPUT_RATE_PLUS)
DECLARE_BIND(rate_step_down, SSNES_AUDIO_INPUT_RATE_MINUS) DECLARE_BIND(rate_step_down, SSNES_AUDIO_INPUT_RATE_MINUS)
DECLARE_BIND(rewind, SSNES_REWIND) DECLARE_BIND(rewind, SSNES_REWIND)
DECLARE_BIND(movie_record_toggle, SSNES_MOVIE_RECORD_TOGGLE)
}, },
{ {
DECLARE_BIND(player3_a, SNES_DEVICE_ID_JOYPAD_A) DECLARE_BIND(player3_a, SNES_DEVICE_ID_JOYPAD_A)
@ -405,6 +407,7 @@ static const struct bind_map bind_maps[MAX_PLAYERS][MAX_BINDS - 1] = {
DECLARE_BIND(rate_step_up, SSNES_AUDIO_INPUT_RATE_PLUS) DECLARE_BIND(rate_step_up, SSNES_AUDIO_INPUT_RATE_PLUS)
DECLARE_BIND(rate_step_down, SSNES_AUDIO_INPUT_RATE_MINUS) DECLARE_BIND(rate_step_down, SSNES_AUDIO_INPUT_RATE_MINUS)
DECLARE_BIND(rewind, SSNES_REWIND) DECLARE_BIND(rewind, SSNES_REWIND)
DECLARE_BIND(movie_record_toggle, SSNES_MOVIE_RECORD_TOGGLE)
}, },
{ {
DECLARE_BIND(player4_a, SNES_DEVICE_ID_JOYPAD_A) DECLARE_BIND(player4_a, SNES_DEVICE_ID_JOYPAD_A)
@ -429,6 +432,7 @@ static const struct bind_map bind_maps[MAX_PLAYERS][MAX_BINDS - 1] = {
DECLARE_BIND(rate_step_up, SSNES_AUDIO_INPUT_RATE_PLUS) DECLARE_BIND(rate_step_up, SSNES_AUDIO_INPUT_RATE_PLUS)
DECLARE_BIND(rate_step_down, SSNES_AUDIO_INPUT_RATE_MINUS) DECLARE_BIND(rate_step_down, SSNES_AUDIO_INPUT_RATE_MINUS)
DECLARE_BIND(rewind, SSNES_REWIND) DECLARE_BIND(rewind, SSNES_REWIND)
DECLARE_BIND(movie_record_toggle, SSNES_MOVIE_RECORD_TOGGLE)
}, },
{ {
DECLARE_BIND(player5_a, SNES_DEVICE_ID_JOYPAD_A) DECLARE_BIND(player5_a, SNES_DEVICE_ID_JOYPAD_A)
@ -453,6 +457,7 @@ static const struct bind_map bind_maps[MAX_PLAYERS][MAX_BINDS - 1] = {
DECLARE_BIND(rate_step_up, SSNES_AUDIO_INPUT_RATE_PLUS) DECLARE_BIND(rate_step_up, SSNES_AUDIO_INPUT_RATE_PLUS)
DECLARE_BIND(rate_step_down, SSNES_AUDIO_INPUT_RATE_MINUS) DECLARE_BIND(rate_step_down, SSNES_AUDIO_INPUT_RATE_MINUS)
DECLARE_BIND(rewind, SSNES_REWIND) DECLARE_BIND(rewind, SSNES_REWIND)
DECLARE_BIND(movie_record_toggle, SSNES_MOVIE_RECORD_TOGGLE)
}, },
}; };

56
ssnes.c
View File

@ -689,9 +689,18 @@ static void deinit_rewind(void)
static void init_movie(void) static void init_movie(void)
{ {
if (strlen(g_extern.bsv_movie_path) > 0) if (g_extern.bsv_movie_playback)
g_extern.bsv_movie = bsv_movie_init(g_extern.bsv_movie_path, {
g_extern.bsv_movie_playback ? SSNES_MOVIE_PLAYBACK : SSNES_MOVIE_RECORD); g_extern.bsv_movie = bsv_movie_init(g_extern.bsv_movie_path, SSNES_MOVIE_PLAYBACK);
if (!g_extern.bsv_movie)
{
SSNES_ERR("Failed to load movie file: \"%s\"!\n", g_extern.bsv_movie_path);
exit(1);
}
msg_queue_push(g_extern.msg_queue, "Starting movie playback!", 2, 180);
SSNES_LOG("Starting movie playback!\n");
}
} }
static void deinit_movie(void) static void deinit_movie(void)
@ -702,6 +711,9 @@ static void deinit_movie(void)
static void fill_pathnames(void) static void fill_pathnames(void)
{ {
if (!g_extern.bsv_movie_playback)
fill_pathname(g_extern.bsv_movie_path, g_extern.savefile_name_srm, ".bsv");
switch (g_extern.game_type) switch (g_extern.game_type)
{ {
case SSNES_CART_BSX: case SSNES_CART_BSX:
@ -877,6 +889,36 @@ static void check_rewind(void)
} }
} }
static void check_movie_record(void)
{
static bool old_button = false;
bool new_button;
if ((new_button = driver.input->key_pressed(driver.input_data, SSNES_MOVIE_RECORD_TOGGLE)) && !old_button)
{
if (g_extern.bsv_movie)
{
msg_queue_clear(g_extern.msg_queue);
msg_queue_push(g_extern.msg_queue, "Stopping movie record!", 2, 180);
SSNES_LOG("Stopping movie record!\n");
bsv_movie_free(g_extern.bsv_movie);
g_extern.bsv_movie = NULL;
}
else
{
g_extern.bsv_movie = bsv_movie_init(g_extern.bsv_movie_path, SSNES_MOVIE_RECORD);
msg_queue_clear(g_extern.msg_queue);
msg_queue_push(g_extern.msg_queue, g_extern.bsv_movie ? "Starting movie record!" : "Failed to start movie record!", 2, 180);
if (g_extern.bsv_movie)
SSNES_LOG("Starting movie record!\n");
else
SSNES_ERR("Failed to start movie record!\n");
}
}
old_button = new_button;
}
static void do_state_checks(void) static void do_state_checks(void)
{ {
set_fast_forward_button(driver.input->key_pressed(driver.input_data, SSNES_FAST_FORWARD_KEY)); set_fast_forward_button(driver.input->key_pressed(driver.input_data, SSNES_FAST_FORWARD_KEY));
@ -889,6 +931,9 @@ static void do_state_checks(void)
} }
check_fullscreen(); check_fullscreen();
check_input_rate(); check_input_rate();
if (!g_extern.bsv_movie_playback)
check_movie_record();
} }
@ -916,6 +961,7 @@ int main(int argc, char *argv[])
psnes_set_input_poll(input_poll); psnes_set_input_poll(input_poll);
psnes_set_input_state(input_state); psnes_set_input_state(input_state);
init_msg_queue();
init_controllers(); init_controllers();
init_movie(); init_movie();
@ -929,7 +975,6 @@ int main(int argc, char *argv[])
init_recording(); init_recording();
#endif #endif
init_msg_queue();
// Main loop // Main loop
for(;;) for(;;)
@ -946,7 +991,6 @@ int main(int argc, char *argv[])
psnes_run(); psnes_run();
} }
deinit_msg_queue();
#ifdef HAVE_FFMPEG #ifdef HAVE_FFMPEG
deinit_recording(); deinit_recording();
#endif #endif
@ -958,6 +1002,8 @@ int main(int argc, char *argv[])
} }
deinit_movie(); deinit_movie();
deinit_msg_queue();
psnes_unload_cartridge(); psnes_unload_cartridge();
psnes_term(); psnes_term();
uninit_drivers(); uninit_drivers();

View File

@ -205,3 +205,5 @@
# Hold button down to rewind. Rewinding must be enabled. # Hold button down to rewind. Rewinding must be enabled.
# input_rewind = r # input_rewind = r
# Toggle between recording and not.
# input_movie_record_toggle = o