X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=play.c;h=59a4cec85ce26bb5d5d57c7926ad70245a4c656b;hp=9fc49e377e8048cb2f6b703cdabf9d156843812d;hb=e4efba96ba3f2d77eb75fc27631e590c8be3c879;hpb=36ec2a43a7d9c085f16544e282a439cdbaec1e00 diff --git a/play.c b/play.c index 9fc49e37..59a4cec8 100644 --- a/play.c +++ b/play.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012-2014 Andre Noll + * Copyright (C) 2012 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -184,10 +184,10 @@ static void parse_config_or_die(int argc, char *argv[]) loglevel = get_loglevel_by_name(conf.loglevel_arg); } for (i = 0; i < conf.key_map_given; i++) { - char *s = strchr(conf.key_map_arg[i] + 1, ':'); - if (s) + char *kma = conf.key_map_arg[i]; + if (*kma && strchr(kma + 1, ':')) continue; - PARA_EMERG_LOG("invalid key map arg: %s\n", conf.key_map_arg[i]); + PARA_EMERG_LOG("invalid key map arg: %s\n", kma); goto err; } free(config_file); @@ -263,7 +263,7 @@ static int get_playback_error(struct play_task *pt) static int eof_cleanup(struct play_task *pt) { struct writer *w = writers + DEFAULT_WRITER; - struct filter *decoder = filters + pt->fn.filter_num; + const struct filter *decoder = filter_get(pt->fn.filter_num); int ret; ret = get_playback_error(pt); @@ -277,7 +277,8 @@ static int eof_cleanup(struct play_task *pt) memset(&pt->wn, 0, sizeof(struct writer_node)); task_reap(&pt->fn.task); - decoder->close(&pt->fn); + if (decoder->close) + decoder->close(&pt->fn); btr_remove_node(&pt->fn.btrn); free(pt->fn.conf); memset(&pt->fn, 0, sizeof(struct filter_node)); @@ -368,7 +369,7 @@ static int load_file(struct play_task *pt) const char *af; char *tmp, buf[20]; int ret; - struct filter *decoder; + const struct filter *decoder; btr_remove_node(&pt->rn.btrn); if (!pt->rn.receiver || pt->next_file != pt->current_file) { @@ -393,7 +394,7 @@ static int load_file(struct play_task *pt) if (ret < 0) goto fail; pt->fn.filter_num = ret; - decoder = filters + ret; + decoder = filter_get(ret); pt->fn.btrn = btr_new_node(&(struct btr_node_description) EMBRACE(.name = decoder->name, .parent = pt->rn.btrn, .handler = decoder->execute, .context = &pt->fn)); @@ -619,37 +620,31 @@ static char **get_mapped_keyseqs(void) result = para_malloc((NUM_MAPPED_KEYS + 1) * sizeof(char *)); FOR_EACH_MAPPED_KEY(i) { - int idx = get_key_map_idx(i); char *seq = get_key_map_seq(i); - char *cmd = get_key_map_cmd(i); - bool internal = is_internal_key(i); - PARA_DEBUG_LOG("%s key sequence #%d: %s -> %s\n", - internal? "internal" : "user-defined", - idx, seq, cmd); result[i] = seq; - free(cmd); } result[i] = NULL; return result; } -#include "play_completion.h" +#include "play.command_list.h" +typedef int play_command_handler_t(struct play_task *, int, char**); +static play_command_handler_t PLAY_COMMAND_HANDLERS; /* defines one command of para_play */ struct pp_command { const char *name; - int (*handler)(struct play_task *, int, char**); + play_command_handler_t *handler; const char *description; const char *usage; const char *help; }; -#include "play_command_list.h" static struct pp_command pp_cmds[] = {DEFINE_PLAY_CMD_ARRAY}; #define FOR_EACH_COMMAND(c) for (c = 0; pp_cmds[c].name; c++) -#include "play_completion.h" +#include "play.completion.h" static struct i9e_completer pp_completers[]; I9E_DUMMY_COMPLETER(jmp); @@ -872,6 +867,7 @@ static int com_prev(struct play_task *pt, int argc, __a_unused char **argv) kill_stream(pt); pt->next_file = ret; pt->rq = CRT_FILE_CHANGE; + pt->start_chunk = 0; return 0; } @@ -887,6 +883,7 @@ static int com_next(struct play_task *pt, int argc, __a_unused char **argv) kill_stream(pt); pt->next_file = ret; pt->rq = CRT_FILE_CHANGE; + pt->start_chunk = 0; return 0; } @@ -918,6 +915,8 @@ static int com_jmp(struct play_task *pt, int argc, char **argv) return ret; if (percent < 0 || percent > 100) return -ERRNO_TO_PARA_ERROR(EINVAL); + if (percent == 100) + return com_next(pt, 1, (char *[]){"next", NULL}); if (pt->playing && !pt->fn.btrn) return 0; pt->start_chunk = percent * pt->num_chunks / 100; @@ -1026,7 +1025,7 @@ static void sigint_handler(int sig) * stderr. Once the i9e subsystem has been initialized, we switch to the i9e * log facility. */ -static void session_open(__a_unused struct play_task *pt) +static void session_open(struct play_task *pt) { int ret; char *history_file;