commit 310ef57cd092b0af07f656a3b8d40eea6a07ddea from: Omar Polo date: Sat Feb 19 10:16:28 2022 UTC add (and handle) cmd `repeat' commit - f3bd773be6486fa2c212ff27aee53e3894bcc51d commit + 310ef57cd092b0af07f656a3b8d40eea6a07ddea blob - a11b339bdc978e30d749022cfe6e17ca634bca8f blob + ba393dd2b0aa1bbe05e5b2204c9d9360e90188b4 --- amused.h +++ amused.h @@ -45,6 +45,7 @@ enum imsg_type { IMSG_CTL_NEXT, IMSG_CTL_PREV, IMSG_CTL_JUMP, + IMSG_CTL_REPEAT, /* struct player_repeat */ IMSG_CTL_BEGIN, IMSG_CTL_ADD, /* path to a file */ @@ -75,15 +76,22 @@ enum actions { NEXT, LOAD, JUMP, + REPEAT, }; struct ctl_command; +struct player_repeat { + int repeat_one; + int repeat_all; +}; + struct parse_result { enum actions action; char **files; const char *file; int pretty; + struct player_repeat rep; struct ctl_command *ctl; }; blob - e00746ebf384ba0bc7a061e3cad4c88fbc8c60b9 blob + 8a1263255b91f3fda656a08f0eb16ff40921810d --- control.c +++ control.c @@ -229,9 +229,10 @@ control_close(int fd) void control_dispatch_imsg(int fd, short event, void *bula) { - struct ctl_conn *c; - struct imsg imsg; - ssize_t n; + struct ctl_conn *c; + struct imsg imsg; + struct player_repeat rp; + ssize_t n; if ((c = control_connbyfd(fd)) == NULL) { log_warnx("%s: fd %d: not found", __func__, fd); @@ -325,6 +326,17 @@ control_dispatch_imsg(int fd, short event, void *bula) break; case IMSG_CTL_JUMP: main_playlist_jump(&c->iev, &imsg); + break; + case IMSG_CTL_REPEAT: + if (IMSG_DATA_SIZE(imsg) != sizeof(rp)) { + log_warnx("%s: got wrong size", __func__); + break; + } + memcpy(&rp, imsg.data, sizeof(rp)); + if (rp.repeat_all != -1) + repeat_all = rp.repeat_all; + if (rp.repeat_one != -1) + repeat_one = rp.repeat_one; break; case IMSG_CTL_BEGIN: if (control_state.tx != -1) { blob - 63feafe6ba8676e50d2a725b225aebe35ab74f30 blob + 4a5f6e06c1b5f7d147203eb13605df28d3add24a --- ctl.c +++ ctl.c @@ -44,6 +44,7 @@ int ctl_add(struct parse_result *, int, char **); int ctl_show(struct parse_result *, int, char **); int ctl_load(struct parse_result *, int, char **); int ctl_jump(struct parse_result *, int, char **); +int ctl_repeat(struct parse_result *, int, char **); struct ctl_command ctl_commands[] = { { "play", PLAY, ctl_noarg, "" }, @@ -59,6 +60,7 @@ struct ctl_command ctl_commands[] = { { "prev", PREV, ctl_noarg, "" }, { "load", LOAD, ctl_load, "[file]", 1 }, { "jump", JUMP, ctl_jump, "pattern" }, + { "repeat", REPEAT, ctl_repeat, "one|all on|off" }, { NULL }, }; @@ -392,6 +394,10 @@ ctlaction(struct parse_result *res) done = 0; ret = jump_req(res->file); break; + case REPEAT: + imsg_compose(ibuf, IMSG_CTL_REPEAT, 0, 0, -1, + &res->rep, sizeof(res->rep)); + break; case NONE: /* action not expected */ fatalx("invalid action %u", res->action); @@ -516,6 +522,38 @@ ctl_jump(struct parse_result *res, int argc, char **ar ctl_usage(res->ctl); res->file = argv[0]; + return ctlaction(res); +} + +int +ctl_repeat(struct parse_result *res, int argc, char **argv) +{ + int ch, b; + + while ((ch = getopt(argc, argv, "")) != -1) + ctl_usage(res->ctl); + argc -= optind; + argv += optind; + + if (argc != 2) + ctl_usage(res->ctl); + + if (!strcmp(argv[1], "on")) + b = 1; + else if (!strcmp(argv[1], "off")) + b = 0; + else + ctl_usage(res->ctl); + + res->rep.repeat_one = -1; + res->rep.repeat_all = -1; + if (!strcmp(argv[0], "one")) + res->rep.repeat_one = b; + else if (!strcmp(argv[0], "all")) + res->rep.repeat_all = b; + else + ctl_usage(res->ctl); + return ctlaction(res); }