commit - 87abdf60b66234cded899c05ebd50fe261a047eb
commit + 15aecb89d41f59ac375c7a2a2194ab7cddcaa020
blob - f57e6cfb71160e07a8b93e2140184f870868027e
blob + 4d7957cecda7b5f2fd118d3c6a408773c513a5f4
--- amused.c
+++ amused.c
struct event ev_sigint;
struct event ev_sigterm;
+static int notify_seek;
+
enum amused_process {
PROC_MAIN,
PROC_PLAYER,
sizeof(current_position));
if (current_position < 0)
current_position = -1;
+ if (notify_seek) {
+ notify_seek = 0;
+ control_notify(IMSG_CTL_SEEK);
+ }
break;
case IMSG_LEN:
if (datalen != sizeof(current_duration))
return;
}
+ control_notify(IMSG_CTL_JUMP);
+
main_send_player(IMSG_STOP, -1, NULL, 0);
if (!main_play_song(song)) {
main_senderr(iev, "can't play");
s.rp.repeat_one = repeat_one;
imsg_compose_event(iev, IMSG_CTL_STATUS, 0, 0, -1, &s, sizeof(s));
+}
+
+void
+main_seek(struct player_seek *s)
+{
+ switch (play_state) {
+ case STATE_STOPPED:
+ main_playlist_resume();
+ break;
+ case STATE_PLAYING:
+ break;
+ case STATE_PAUSED:
+ play_state = STATE_PLAYING;
+ break;
+ }
+
+ notify_seek = 1;
+ main_send_player(IMSG_CTL_SEEK, -1, s, sizeof(*s));
}
blob - 1e6e863f9f9375ee460cd143634e837ef73083d4
blob + 940c6f3e44493e581b166e148052859aef01f73e
--- amused.h
+++ amused.h
void main_enqueue(int, struct playlist *, struct imsgev *, struct imsg *);
void main_send_playlist(struct imsgev *);
void main_send_status(struct imsgev *);
+void main_seek(struct player_seek *);
/* ctl.c */
__dead void usage(void);
blob - 8a2c1030cdb8036e6d3a558d4a563739144ec5d1
blob + 0b9e7f0a14f2b475d0a8ee38c162acf2f3fa0ecb
--- control.c
+++ control.c
struct ctl_conn *c;
struct imsg imsg;
struct player_repeat rp;
+ struct player_seek seek;
ssize_t n, off;
if ((c = control_connbyfd(fd)) == NULL) {
case IMSG_CTL_TOGGLE_PLAY:
switch (play_state) {
case STATE_STOPPED:
+ control_notify(IMSG_CTL_PLAY);
main_playlist_resume();
break;
case STATE_PLAYING:
+ control_notify(IMSG_CTL_PAUSE);
play_state = STATE_PAUSED;
main_send_player(IMSG_PAUSE, -1, NULL, 0);
break;
case STATE_PAUSED:
+ control_notify(IMSG_CTL_PLAY);
play_state = STATE_PLAYING;
main_send_player(IMSG_RESUME, -1, NULL, 0);
break;
}
- control_notify(imsg.hdr.type);
break;
case IMSG_CTL_PAUSE:
if (play_state != STATE_PLAYING)
break;
case IMSG_CTL_FLUSH:
playlist_truncate();
- control_notify(imsg.hdr.type);
+ control_notify(IMSG_CTL_COMMIT);
break;
case IMSG_CTL_SHOW:
main_send_playlist(&c->iev);
main_send_status(&c->iev);
break;
case IMSG_CTL_NEXT:
+ control_notify(imsg.hdr.type);
main_send_player(IMSG_STOP, -1, NULL, 0);
main_playlist_advance();
- control_notify(imsg.hdr.type);
break;
case IMSG_CTL_PREV:
+ control_notify(imsg.hdr.type);
main_send_player(IMSG_STOP, -1, NULL, 0);
main_playlist_previous();
- control_notify(imsg.hdr.type);
break;
case IMSG_CTL_JUMP:
main_playlist_jump(&c->iev, &imsg);
- control_notify(imsg.hdr.type);
break;
case IMSG_CTL_REPEAT:
if (IMSG_DATA_SIZE(imsg) != sizeof(rp)) {
c->monitor = 1;
break;
case IMSG_CTL_SEEK:
- if (IMSG_DATA_SIZE(imsg) !=
- sizeof(struct player_seek)) {
+ if (IMSG_DATA_SIZE(imsg) != sizeof(seek)) {
main_senderr(&c->iev, "wrong size");
break;
}
- switch (play_state) {
- case STATE_STOPPED:
- main_playlist_resume();
- break;
- case STATE_PLAYING:
- break;
- case STATE_PAUSED:
- play_state = STATE_PLAYING;
- break;
- }
- main_send_player(IMSG_CTL_SEEK, -1, imsg.data,
- IMSG_DATA_SIZE(imsg));
- control_notify(imsg.hdr.type);
+ memcpy(&seek, imsg.data, sizeof(seek));
+ main_seek(&seek);
break;
default:
log_debug("%s: error handling imsg %d", __func__,
blob - dd7b94f7ce9191b416561e685a269a2fd1c3ccad
blob + 2dc2c91eec648890a1814d302a46d9f07f72e594
--- ctl.c
+++ ctl.c
switch (type) {
case IMSG_CTL_PLAY:
return "play";
- case IMSG_CTL_TOGGLE_PLAY:
- return "toggle";
case IMSG_CTL_PAUSE:
return "pause";
case IMSG_CTL_STOP:
return "stop";
- case IMSG_CTL_FLUSH:
- return "flush";
case IMSG_CTL_NEXT:
return "next";
case IMSG_CTL_PREV:
return "prev";
case IMSG_CTL_JUMP:
return "jump";
- case IMSG_CTL_REPEAT:
- return "repeat";
case IMSG_CTL_ADD:
return "add";
case IMSG_CTL_COMMIT:
return "load";
+ case IMSG_CTL_SEEK:
+ return "seek";
default:
return "unknown";
}
static int
ctl_monitor(struct parse_result *res, int argc, char **argv)
{
- int ch;
+ int ch, n = 0;
const char *events;
char *dup, *tmp, *tok;
if (argc > 1)
ctl_usage(res->ctl);
+ events = "play,pause,stop,next,prev,jump,repeat,add,load,seek";
if (argc == 1)
events = *argv;
- else
- events = "play,toggle,pause,stop,restart,flush,next,prev,"
- "jump,repeat,add,load";
tmp = dup = xstrdup(events);
while ((tok = strsep(&tmp, ",")) != NULL) {
if (*tok == '\0')
continue;
+ n++;
if (!strcmp(tok, "play"))
res->monitor[IMSG_CTL_PLAY] = 1;
- else if (!strcmp(tok, "toggle"))
- res->monitor[IMSG_CTL_TOGGLE_PLAY] = 1;
else if (!strcmp(tok, "pause"))
res->monitor[IMSG_CTL_PAUSE] = 1;
else if (!strcmp(tok, "stop"))
res->monitor[IMSG_CTL_STOP] = 1;
- else if (!strcmp(tok, "restart")) /* compat */
- res->monitor[IMSG_CTL_SEEK] = 1;
- else if (!strcmp(tok, "flush"))
- res->monitor[IMSG_CTL_FLUSH] = 1;
else if (!strcmp(tok, "next"))
res->monitor[IMSG_CTL_NEXT] = 1;
else if (!strcmp(tok, "prev"))
res->monitor[IMSG_CTL_COMMIT] = 1;
else if (!strcmp(tok, "seek"))
res->monitor[IMSG_CTL_SEEK] = 1;
- else
- fatalx("unknown event \"%s\"", tok);
+ else {
+ log_warnx("unknown event \"%s\"", tok);
+ n--;
+ }
}
free(dup);
+ if (n == 0)
+ ctl_usage(res->ctl);
return ctlaction(res);
}