From af7a29424c889ea6993561262539586d7ac1dc40 Mon Sep 17 00:00:00 2001 From: wm4 Date: Sun, 23 Oct 2011 05:26:30 +0200 Subject: commands: add show_chapters_osd command to display chapters on OSD The command lists the chapters in the current file on the OSD. It also marks the current chapter. This is actually a cheap replacement for the chapter select libmenu functionality. --- DOCS/OUTDATED-tech/slave.txt | 2 ++ command.c | 41 +++++++++++++++++++++++++++++++++++++++++ input/input.c | 3 +++ input/input.h | 2 ++ 4 files changed, 48 insertions(+) diff --git a/DOCS/OUTDATED-tech/slave.txt b/DOCS/OUTDATED-tech/slave.txt index 6bb1dc53c4..4359aa1a29 100644 --- a/DOCS/OUTDATED-tech/slave.txt +++ b/DOCS/OUTDATED-tech/slave.txt @@ -493,6 +493,8 @@ vo_rootwin [value] volume [abs] Increase/decrease volume or set it to if [abs] is nonzero. +show_chapters_osd + Show the list of chapters in the currently played file on the OSD. Available properties: diff --git a/command.c b/command.c index a7446cb855..f7a0529eeb 100644 --- a/command.c +++ b/command.c @@ -2806,6 +2806,44 @@ static void clear_play_tree(MPContext *mpctx) do_clear_pt(mpctx->playtree, exclude); } +static char *format_time(double time) +{ + int h, m, s = time; + h = s / 3600; + s -= h * 3600; + m = s / 60; + s -= m * 60; + return talloc_asprintf(NULL, "%02d:%02d:%02d", h, m, s); +} + +static void show_chapters_on_osd(MPContext *mpctx) +{ + int count = get_chapter_count(mpctx); + int cur = mpctx->demuxer ? get_current_chapter(mpctx) : -1; + char *res = NULL; + int n; + + if (count < 1) { + res = talloc_asprintf_append(res, "No chapters."); + } + + for (n = 0; n < count; n++) { + char *name = chapter_display_name(mpctx, n); + double t = chapter_start_time(mpctx, n); + char* time = format_time(t); + res = talloc_asprintf_append(res, "%s", time); + talloc_free(time); + char *m1 = "> ", *m2 = " <"; + if (n != cur) + m1 = m2 = ""; + res = talloc_asprintf_append(res, " %s%s%s\n", m1, name, m2); + talloc_free(name); + } + + set_osd_msg(OSD_MSG_TEXT, 1, mpctx->opts.osd_duration, "%s", res); + talloc_free(res); +} + void run_command(MPContext *mpctx, mp_cmd_t *cmd) { struct MPOpts *opts = &mpctx->opts; @@ -3622,6 +3660,9 @@ void run_command(MPContext *mpctx, mp_cmd_t *cmd) af_reinit(sh_audio->afilter, af); } break; + case MP_CMD_SHOW_CHAPTERS: + show_chapters_on_osd(mpctx); + break; default: mp_msg(MSGT_CPLAYER, MSGL_V, diff --git a/input/input.c b/input/input.c index 91b55d2aeb..f99c3218dc 100644 --- a/input/input.c +++ b/input/input.c @@ -221,6 +221,9 @@ static const mp_cmd_t mp_cmds[] = { { MP_CMD_AF_DEL, "af_del", { ARG_STRING } }, { MP_CMD_AF_CLR, "af_clr", }, { MP_CMD_AF_CMDLINE, "af_cmdline", { ARG_STRING, ARG_STRING } }, + + { MP_CMD_SHOW_CHAPTERS, "show_chapters_osd", }, + {0} }; diff --git a/input/input.h b/input/input.h index 87814dd56c..9bbf6bf7df 100644 --- a/input/input.h +++ b/input/input.h @@ -153,6 +153,8 @@ enum mp_command_type { MP_CMD_AF_DEL, MP_CMD_AF_CLR, MP_CMD_AF_CMDLINE, + + MP_CMD_SHOW_CHAPTERS, }; // The arg types -- cgit v1.2.3