diff options
| author | Magnus Auvinen <magnus.auvinen@gmail.com> | 2008-12-19 12:00:05 +0000 |
|---|---|---|
| committer | Magnus Auvinen <magnus.auvinen@gmail.com> | 2008-12-19 12:00:05 +0000 |
| commit | 8ec0bdc509fa218edc4cc9a08659a18f04ce6227 (patch) | |
| tree | ac279058e84bc45182ec329a759951d082c84efe /src/engine | |
| parent | cc576906a318007e789f6dec9fb9b1a75c3ce62e (diff) | |
| download | zcatch-8ec0bdc509fa218edc4cc9a08659a18f04ce6227.tar.gz zcatch-8ec0bdc509fa218edc4cc9a08659a18f04ce6227.zip | |
improved the demo players scrubbing capabilities
Diffstat (limited to 'src/engine')
| -rw-r--r-- | src/engine/e_demorec.c | 28 | ||||
| -rw-r--r-- | src/engine/e_demorec.h | 2 | ||||
| -rw-r--r-- | src/engine/e_network_conn.c | 1 |
3 files changed, 27 insertions, 4 deletions
diff --git a/src/engine/e_demorec.c b/src/engine/e_demorec.c index f19dac22..cf3939dc 100644 --- a/src/engine/e_demorec.c +++ b/src/engine/e_demorec.c @@ -368,7 +368,7 @@ static void do_tick() { /* stop on error or eof */ dbg_msg("demorec", "end of file"); - demorec_playback_stop(); + demorec_playback_pause(); break; } @@ -529,19 +529,40 @@ int demorec_playback_play() return 0; } -int demorec_playback_set(int keyframe) +int demorec_playback_set(float percent) { + int keyframe; + int wanted_tick; if(!play_file) return -1; + + /* -5 because we have to have a current tick and previous tick when we do the playback */ + wanted_tick = playbackinfo.first_tick + (int)((playbackinfo.last_tick-playbackinfo.first_tick)*percent) - 5; + + keyframe = (int)(playbackinfo.seekable_points*percent); + if(keyframe < 0 || keyframe >= playbackinfo.seekable_points) return -1; + /* get correct key frame */ + if(keyframes[keyframe].tick < wanted_tick) + while(keyframe < playbackinfo.seekable_points-1 && keyframes[keyframe].tick < wanted_tick) + keyframe++; + + while(keyframe && keyframes[keyframe].tick > wanted_tick) + keyframe--; + + /* seek to the correct keyframe */ io_seek(play_file, keyframes[keyframe].filepos, IOSEEK_START); /*playbackinfo.start_tick = -1;*/ playbackinfo.next_tick = -1; playbackinfo.current_tick = -1; playbackinfo.previous_tick = -1; + + /* playback everything until we hit our tick */ + while(playbackinfo.previous_tick < wanted_tick) + do_tick(); demorec_playback_play(); @@ -581,6 +602,9 @@ int demorec_playback_update() /* do one more tick */ do_tick(); + + if(playbackinfo.paused) + return 0; } /* update intratick */ diff --git a/src/engine/e_demorec.h b/src/engine/e_demorec.h index 3c4f3a41..482debb4 100644 --- a/src/engine/e_demorec.h +++ b/src/engine/e_demorec.h @@ -64,7 +64,7 @@ int demorec_playback_play(); void demorec_playback_pause(); void demorec_playback_unpause(); void demorec_playback_setspeed(float speed); -int demorec_playback_set(int keyframe); +int demorec_playback_set(float precent); int demorec_playback_update(); const DEMOREC_PLAYBACKINFO *demorec_playback_info(); int demorec_isplaying(); diff --git a/src/engine/e_network_conn.c b/src/engine/e_network_conn.c index 319a5286..a8ef588f 100644 --- a/src/engine/e_network_conn.c +++ b/src/engine/e_network_conn.c @@ -15,7 +15,6 @@ static void conn_reset(NETCONNECTION *conn) conn->remote_closed = 0; conn->state = NET_CONNSTATE_OFFLINE; - conn->state = NET_CONNSTATE_OFFLINE; conn->last_send_time = 0; conn->last_recv_time = 0; conn->last_update_time = 0; |