summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUoti Urpala <uau@glyph.nonexistent.invalid>2008-11-30 03:19:46 +0200
committerUoti Urpala <uau@glyph.nonexistent.invalid>2008-12-09 04:31:07 +0200
commit6fec7ec734c25424e268465ae806063273c4e5be (patch)
tree2f934dad79b7d25ac1c187070c55232a512f12af
parent77c709ad31ebe997dbd824506c145a0ac24581d0 (diff)
downloadmpv-6fec7ec734c25424e268465ae806063273c4e5be.tar.bz2
mpv-6fec7ec734c25424e268465ae806063273c4e5be.tar.xz
Allow seeking while paused
Screen is now updated immediately (doesn't always work without correct-pts yet though). Doing audio unpause after the seek reset can display errors. Main loop code now checks for possible reasons to stop command processing instead of relying on each command to also set an explicit 'break' flag.
-rw-r--r--command.c11
-rw-r--r--command.h2
-rw-r--r--mplayer.c33
3 files changed, 18 insertions, 28 deletions
diff --git a/command.c b/command.c
index e642944ada..72fe83c2e7 100644
--- a/command.c
+++ b/command.c
@@ -2367,12 +2367,11 @@ static const struct {
};
#endif
-int run_command(MPContext *mpctx, mp_cmd_t *cmd)
+void run_command(MPContext *mpctx, mp_cmd_t *cmd)
{
struct MPOpts *opts = &mpctx->opts;
sh_audio_t * const sh_audio = mpctx->sh_audio;
sh_video_t * const sh_video = mpctx->sh_video;
- int brk_cmd = 0;
if (!set_property_command(mpctx, cmd))
switch (cmd->id) {
case MP_CMD_SEEK:{
@@ -2397,7 +2396,6 @@ int run_command(MPContext *mpctx, mp_cmd_t *cmd)
mpctx->rel_seek_secs += v;
mpctx->osd_function = (v > 0) ? OSD_FFW : OSD_REW;
}
- brk_cmd = 1;
}
break;
@@ -2562,7 +2560,6 @@ int run_command(MPContext *mpctx, mp_cmd_t *cmd)
mpctx->stop_play = (n > 0) ? PT_NEXT_ENTRY : PT_PREV_ENTRY;
if (mpctx->stop_play)
mpctx->play_tree_step = n;
- brk_cmd = 1;
}
}
break;
@@ -2579,7 +2576,6 @@ int run_command(MPContext *mpctx, mp_cmd_t *cmd)
play_tree_iter_free(i);
} else
mpctx->stop_play = (n > 0) ? PT_UP_NEXT : PT_UP_PREV;
- brk_cmd = 1;
}
break;
@@ -2593,7 +2589,6 @@ int run_command(MPContext *mpctx, mp_cmd_t *cmd)
else if (v < 0 && mpctx->playtree_iter->file > 1)
mpctx->stop_play = PT_PREV_SRC;
}
- brk_cmd = 1;
break;
case MP_CMD_SUB_STEP:
@@ -2676,7 +2671,6 @@ int run_command(MPContext *mpctx, mp_cmd_t *cmd)
pt_iter_goto_head(mpctx->playtree_iter);
mpctx->stop_play = PT_NEXT_SRC;
}
- brk_cmd = 1;
}
break;
@@ -2700,7 +2694,6 @@ int run_command(MPContext *mpctx, mp_cmd_t *cmd)
mpctx->stop_play = PT_NEXT_SRC;
}
}
- brk_cmd = 1;
}
break;
@@ -2710,7 +2703,6 @@ int run_command(MPContext *mpctx, mp_cmd_t *cmd)
(mpctx->playtree_iter, 0, 1) != PLAY_TREE_ITER_END)
/* NOP */ ;
mpctx->stop_play = PT_STOP;
- brk_cmd = 1;
break;
#ifdef CONFIG_RADIO
@@ -3242,5 +3234,4 @@ int run_command(MPContext *mpctx, mp_cmd_t *cmd)
pause_player(mpctx);
break;
}
- return brk_cmd;
}
diff --git a/command.h b/command.h
index f87c5a00ca..ee8c451a7c 100644
--- a/command.h
+++ b/command.h
@@ -4,7 +4,7 @@
struct MPContext;
struct mp_cmd;
-int run_command(struct MPContext *mpctx, struct mp_cmd *cmd);
+void run_command(struct MPContext *mpctx, struct mp_cmd *cmd);
char *property_expand_string(struct MPContext *mpctx, char *str);
void property_print_help(void);
diff --git a/mplayer.c b/mplayer.c
index 04e8dc54b4..0ccb31b8aa 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -2514,6 +2514,7 @@ static int seek(MPContext *mpctx, double amount, int style)
mpctx->sh_video->last_pts = MP_NOPTS_VALUE;
mpctx->num_buffered_frames = 0;
mpctx->delay = 0;
+ mpctx->time_frame = 0;
// Not all demuxers set d_video->pts during seek, so this value
// (which is used by at least vobsub and edl code below) may
// be completely wrong (probably 0).
@@ -3743,7 +3744,7 @@ if(!mpctx->sh_audio && mpctx->d_audio->sh) {
/*========================== PLAY AUDIO ============================*/
-if (mpctx->sh_audio)
+if (mpctx->sh_audio && !mpctx->paused)
if (!fill_audio_out_buffers(mpctx))
// at eof, all audio at least written to ao
if (!mpctx->sh_video)
@@ -3891,16 +3892,6 @@ if(auto_quality>0){
}
#endif
-//============================ Handle PAUSE ===============================
-
-// handle -sstep
-if(step_sec>0) {
- mpctx->osd_function=OSD_FFW;
- mpctx->rel_seek_secs+=step_sec;
-}
-
- edl_update(mpctx);
-
//================= Keyboard events, SEEKing ====================
current_module="key_events";
@@ -3908,20 +3899,28 @@ if(step_sec>0) {
{
while (1) {
mp_cmd_t* cmd;
- int brk_cmd = 0;
- while( !brk_cmd && (cmd = mp_input_get_cmd(mpctx->input, 0,0,0)) != NULL) {
- brk_cmd = run_command(mpctx, cmd);
+ while ((cmd = mp_input_get_cmd(mpctx->input, 0,0,0)) != NULL) {
+ run_command(mpctx, cmd);
mp_cmd_free(cmd);
- if (brk_cmd == 2)
- goto goto_enable_cache;
+ if (mpctx->stop_play)
+ break;
}
- if (mpctx->paused && !mpctx->stop_play)
+ if (mpctx->paused && !(mpctx->stop_play || mpctx->rel_seek_secs
+ || mpctx->abs_seek_pos))
pause_loop(mpctx);
else
break;
}
}
+// handle -sstep
+if (step_sec > 0 && !mpctx->paused) {
+ mpctx->osd_function=OSD_FFW;
+ mpctx->rel_seek_secs+=step_sec;
+}
+
+ edl_update(mpctx);
+
/* Looping. */
if(mpctx->stop_play==AT_END_OF_FILE && opts->loop_times>=0) {
mp_msg(MSGT_CPLAYER,MSGL_V,"loop_times = %d\n", opts->loop_times);