diff --git a/inc/common/queue.h b/inc/common/queue.h index b4a4b67776e8af85e8f8b1604156421c5077dfb7..11820a63adc8fa42375ce60b54d7a210e95c0a84 100644 --- a/inc/common/queue.h +++ b/inc/common/queue.h @@ -3,15 +3,22 @@ #include <pthread.h> #include <common/common.h> -#define LKT_PLAY_STOP ((void *) (size_t) 0) -#define LKT_PLAY_PLAY ((void *) (size_t) 1) -#define LKT_PLAY_PAUSE ((void *) (size_t) 2) -#define LKT_PLAY_TOGGLE ((void *) (size_t) 3) +enum { + _LKT_PLAY_STOP = 0, + _LKT_PLAY_PLAY = 1, + _LKT_PLAY_PAUSE = 2, + _LKT_PLAY_TOGGLE = 3, +}; + +#define LKT_PLAY_STOP ((void *) (size_t) _LKT_PLAY_STOP) +#define LKT_PLAY_PLAY ((void *) (size_t) _LKT_PLAY_PLAY) +#define LKT_PLAY_PAUSE ((void *) (size_t) _LKT_PLAY_PAUSE) +#define LKT_PLAY_TOGGLE ((void *) (size_t) _LKT_PLAY_TOGGLE) enum lkt_event_type { lkt_event_null = 0, // NULL lkt_event_play_pos = (1 << 1), // size_t - lkt_event_play_file = (1 << 2), // const char* + lkt_event_play_file = (1 << 2), // XXX: UNUSED // lkt_event_play_next = (1 << 3), // NULL lkt_event_play_prev = (1 << 4), // NULL lkt_event_play_toggle = (1 << 5), // size_t, `LKT_PLAY_.*` diff --git a/src/module/mpv.c b/src/module/mpv.c index 919b09d9e022203ab43abfbbf5453337bff3615c..eb0b901484c0956859f55e8c443a663fe1998405 100644 --- a/src/module/mpv.c +++ b/src/module/mpv.c @@ -151,8 +151,8 @@ lmpv_toggle_pause(mpv_handle *ctx) int lmpv_handle(struct lkt_win *win, mpv_handle *ctx, struct queue *queue, - volatile int *time_pos, volatile int *time_duration, - volatile int *state) + volatile int *time_pos, volatile int *time_duration, + volatile int *state) { size_t ao_volume; mpv_event *event = NULL; diff --git a/src/net/listen.c b/src/net/listen.c index 59ffd99c68c90ee7726d4c9a059d7b7be1301da8..fa05cfe7a0d1a275ead32fcdbd1e5c66f4aba598 100644 --- a/src/net/listen.c +++ b/src/net/listen.c @@ -726,21 +726,62 @@ static inline void handle_queue_events(struct lkt_state *srv) { lkt_event evt; - char *string = malloc(BUFFER_MAX * sizeof(char)); - if (!string) - return; + char *string = NULL; redo: evt = lkt_queue_handle(&srv->queue); switch (evt.type) { case lkt_event_play_pos: + if (NULL == (string = malloc(BUFFER_MAX * sizeof(char)))) + return; safe_snprintf(string, BUFFER_MAX, "%ld", (size_t) evt.attr); command_play(srv->db, &srv->win, &string, &srv->mpd_idle_events); + free(string); + break; + + case lkt_event_play_next: + command_next(srv->db, &srv->win, &srv->mpd_idle_events); + break; + + case lkt_event_play_prev: + command_previous(srv->db, &srv->win, &srv->mpd_idle_events); + break; + + case lkt_event_play_toggle: + switch ((size_t) evt.attr) { + case _LKT_PLAY_PAUSE: + case _LKT_PLAY_PLAY: + case _LKT_PLAY_TOGGLE: + database_queue_toggle_pause(srv->db); + break; + case _LKT_PLAY_STOP: + database_queue_stop(srv->db); + break; + } + break; + + case lkt_event_prop_vol: + database_config_queue(srv->db, "volume", (size_t) evt.attr); + break; + + case lkt_event_prop_dur: + database_config_queue(srv->db, "duration", (size_t) evt.attr); + break; + + case lkt_event_prop_time: + database_config_queue(srv->db, "elapsed", (size_t) evt.attr); + break; + + case lkt_event_skip_current: + if (NULL == (string = malloc(PATH_MAX * sizeof(char)))) + return; + database_queue_skip_current(srv->db, string); + srv->win.load_file(&srv->win, string); + free(string); break; case lkt_event_null: default: - free(string); return; } goto redo;