diff --git a/src/base/commands.c b/src/base/commands.c index 0651f6b7ecd2cc409ae8d670d3f9283e37d74e95..f10afa7edb84782a57f003c0b4f63f366c6e03a1 100644 --- a/src/base/commands.c +++ b/src/base/commands.c @@ -229,12 +229,47 @@ command_next(struct lkt_state *srv, char UNUSED *args[LKT_MESSAGE_ARGS_MAX]) } bool -command_pause(struct lkt_state *srv, char UNUSED *args[LKT_MESSAGE_ARGS_MAX]) +command_pause(struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX]) { - srv->mpd_idle_events |= MPD_IDLE_PLAYER; - if (!database_queue_toggle_pause(srv->db)) - return false; - return ! MOD_PROC(srv->window_mod, "toggle"); + /* The simple toggle version */ + if ((! args) || (args && ! args[0])) { + toggle_anyway: + srv->mpd_idle_events |= MPD_IDLE_PLAYER; + RETURN_UNLESS(database_queue_toggle_pause(srv->db), "Failed to toggle pause in db", false); + return ! MOD_PROC(srv->window_mod, "toggle"); + } + + /* Set the 'pause' state */ + else { + long state = strtol(args[0], NULL, 0); + struct lkt_queue_state queue; + LOG_DEBUG("COMMAND", "Forcing the paused state to %ld", state); + GOTO_UNLESS(database_queue_state(srv->db, &queue), + "Failed to get queue state, try to toggle pause state anyway", toggle_anyway); + + /* Pause := 0 | 1 + * current := (kara_id > 0) | (NULL --> -1) */ + + /* Play! */ + if (queue.current < 0) { + LOG_DEBUG("COMMAND", "Not playing anything, force play from begening of the queue"); + return command_play(srv, NULL); + } + + /* Set play/unpause or the pause */ + else if (queue.paused != state) { + RETURN_UNLESS(database_queue_set_paused(srv->db, state), + "Oupsi, can't get queue state", false); + srv->mpd_idle_events |= MPD_IDLE_PLAYER; + return ! MOD_PROC(srv->window_mod, "toggle"); + } + + /* Nop */ + else { + LOG_DEBUG("COMMAND", "Playback was already %s", state ? "paused" : "unpaused"); + return true; + } + } } bool @@ -265,14 +300,14 @@ __play_that_file(struct lkt_state *win, int pos) } bool -command_play(struct lkt_state *srv, char UNUSED *args[LKT_MESSAGE_ARGS_MAX]) +command_play(struct lkt_state *srv, char *args[LKT_MESSAGE_ARGS_MAX]) { char *endptr, err; long pos = 1; struct lkt_queue_state queue_state; /* Argument handle. */ - if (args[0]) { + if (args && args[0]) { STRTOL(pos, args[0], endptr, err); RETURN_IF(err, "STRTOL failed", false); } diff --git a/src/module/module_sdl2.c b/src/module/module_sdl2.c index 61d5b86c50383c4bc7fe63cd929748e24621ce6f..3bcc6e126cb619c44b03eb7d2608e0b6cdab86b0 100644 --- a/src/module/module_sdl2.c +++ b/src/module/module_sdl2.c @@ -53,15 +53,18 @@ struct module_sdl2_window { * Function definitions * ************************/ -static bool module_sdl2_get_elapsed(struct module_sdl2_window *, int *); +// *INDENT-OFF* +static bool module_sdl2_get_elapsed (struct module_sdl2_window *, int *); static bool module_sdl2_get_duration(struct module_sdl2_window *, int *); -static bool module_sdl2_set_volume(struct module_sdl2_window *, int); +static bool module_sdl2_set_paussed (struct module_sdl2_window *, int); +static bool module_sdl2_set_volume (struct module_sdl2_window *, int); static bool module_sdl2_set_position(struct module_sdl2_window *, int); -static bool module_sdl2_load_file(struct module_sdl2_window *, const char *); +static bool module_sdl2_load_file (struct module_sdl2_window *, const char *); static bool module_sdl2_toggle_pause(struct module_sdl2_window *); -static void module_sdl2_free(struct module_sdl2_window *); -static void module_sdl2_close(struct module_sdl2_window *); -static bool module_sdl2_new(struct module_sdl2_window **, struct queue *, volatile sqlite3 *); +static void module_sdl2_free (struct module_sdl2_window *); +static void module_sdl2_close (struct module_sdl2_window *); +static bool module_sdl2_new (struct module_sdl2_window **, struct queue *, volatile sqlite3 *); +// *INDENT-OF* /********************* * Private functions * @@ -166,7 +169,7 @@ mod_toggle_pause(va_list *va) va_list copy; struct module_sdl2_window **win; va_copy(copy, *va); - win = (struct module_sdl2_window **) va_arg(copy, void **); + win = (struct module_sdl2_window **) va_arg(copy, void **); bool ret = module_sdl2_toggle_pause(*win); va_end(copy); return ! ret; @@ -178,9 +181,9 @@ mod_load_file(va_list *va) va_list copy; struct module_sdl2_window **win; va_copy(copy, *va); - win = (struct module_sdl2_window **) va_arg(copy, void **); + win = (struct module_sdl2_window **) va_arg(copy, void **); const char *file = va_arg(copy, const char *); - bool ret = module_sdl2_load_file(*win, file); + bool ret = module_sdl2_load_file(*win, file); va_end(copy); return ! ret; } @@ -191,9 +194,22 @@ mod_set_volume(va_list *va) va_list copy; struct module_sdl2_window **win; va_copy(copy, *va); - win = (struct module_sdl2_window **) va_arg(copy, void **); + win = (struct module_sdl2_window **) va_arg(copy, void **); int volume = va_arg(copy, int); - bool ret = module_sdl2_set_volume(*win, volume); + bool ret = module_sdl2_set_volume(*win, volume); + va_end(copy); + return ! ret; +} + +static int +mod_set_paused(va_list *va) +{ + va_list copy; + struct module_sdl2_window **win; + va_copy(copy, *va); + win = (struct module_sdl2_window **) va_arg(copy, void **); + int state = va_arg(copy, int); + bool ret = module_sdl2_set_paussed(*win, state); va_end(copy); return ! ret; } @@ -204,9 +220,9 @@ mod_set_position(va_list *va) va_list copy; struct module_sdl2_window **win; va_copy(copy, *va); - win = (struct module_sdl2_window **) va_arg(copy, void **); + win = (struct module_sdl2_window **) va_arg(copy, void **); int seconds = va_arg(copy, int); - bool ret = module_sdl2_set_position(*win, seconds); + bool ret = module_sdl2_set_position(*win, seconds); va_end(copy); return ! ret; } @@ -217,9 +233,9 @@ mod_get_duration(va_list *va) va_list copy; struct module_sdl2_window **win; va_copy(copy, *va); - win = (struct module_sdl2_window **) va_arg(copy, void **); + win = (struct module_sdl2_window **) va_arg(copy, void **); int *duration = va_arg(copy, int *); - bool ret = module_sdl2_get_duration(*win, duration); + bool ret = module_sdl2_get_duration(*win, duration); va_end(copy); return ! ret; } @@ -230,9 +246,9 @@ mod_get_elapsed(va_list *va) va_list copy; struct module_sdl2_window **win; va_copy(copy, *va); - win = (struct module_sdl2_window **) va_arg(copy, void **); + win = (struct module_sdl2_window **) va_arg(copy, void **); int *elapsed = va_arg(copy, int *); - bool ret = module_sdl2_get_elapsed(*win, elapsed); + bool ret = module_sdl2_get_elapsed(*win, elapsed); va_end(copy); return ! ret; } @@ -247,10 +263,11 @@ REG_ADD_NAMED("free", mod_free) REG_ADD_NAMED("close", mod_close) REG_ADD_NAMED("toggle", mod_toggle_pause) REG_ADD_NAMED("load", mod_load_file) +REG_ADD_NAMED("set_paused", mod_set_paused) +REG_ADD_NAMED("set_position", mod_set_position) REG_ADD_NAMED("set_volume", mod_set_volume) REG_ADD_NAMED("get_duration", mod_get_duration) REG_ADD_NAMED("get_elapsed", mod_get_elapsed) -REG_ADD_NAMED("set_position", mod_set_position) REG_END() #if ! defined (LKT_STATIC_MODULE) REG_EXPORT(sdl2_reg) @@ -514,6 +531,18 @@ module_sdl2_load_file(struct module_sdl2_window *win, const char *filepath) return ret; } +static bool +module_sdl2_set_paussed(struct module_sdl2_window *win, int paused) +{ + RETURN_UNLESS(win && win->window, "Invalid arguments", false); + if (((!paused) && win->state == STATE_PAUSE) || (win->state == STATE_PLAY && paused)) { + return ! lmpv_toggle_pause((struct mpv_handle *) win->mpv); + } else { + LOG_DEBUG("WINDOW", "No need to toggle paused state, already what was asked"); + return true; + } +} + static bool module_sdl2_set_volume(struct module_sdl2_window *win, int vol) { diff --git a/src/net/listen.c b/src/net/listen.c index a0ecab1b46318123b4c8a6f2b281a2a023983de0..33114bff45342bb5c6a73081fe4bd60ac0718e15 100644 --- a/src/net/listen.c +++ b/src/net/listen.c @@ -188,7 +188,7 @@ handle_simple_command(struct lkt_state *srv, size_t c, struct lkt_command cmd) else if (STR_MATCH(cmd.name, "next")) err = ! command_next(srv, NULL); else if (STR_MATCH(cmd.name, "pause")) - err = ! command_pause(srv, NULL); + err = ! command_pause(srv, cmd.args); else if (STR_MATCH(cmd.name, "previous")) err = ! command_previous(srv, NULL); else if (STR_MATCH(cmd.name, "play"))