commit - 821e4c101be89279ecdc5216b12da2da8e54152d
commit + 87f575c3c6293c5cdff2b424a9f182f1857248f3
blob - a9b3a93129e6d8632418e9f76cc92eef389cbdac
blob + 7d3c534b2d025f38cc7579a3627cb96a9303e666
--- amused.c
+++ amused.c
case IMSG_ERR:
playlist_dropcurrent();
main_playlist_advance();
+ if (play_state == STATE_PLAYING)
+ control_notify(NULL, IMSG_CTL_NEXT);
+ else
+ control_notify(NULL, IMSG_CTL_STOP);
break;
case IMSG_EOF:
if (repeat_one && current_song != NULL)
if (main_play_song(current_song))
break;
main_playlist_advance();
+ if (play_state == STATE_PLAYING)
+ control_notify(NULL, IMSG_CTL_NEXT);
+ else
+ control_notify(NULL, IMSG_CTL_STOP);
break;
default:
blob - f01329e0d66edab94097e8f83217870ca699193a
blob + afaf2d8374fa674a3f9052182ad18d97c9ba1c41
--- amused.h
+++ amused.h
IMSG_CTL_ADD, /* path to a file */
IMSG_CTL_COMMIT,
+ IMSG_CTL_MONITOR,
+
IMSG_CTL_ERR,
};
blob - 8a1263255b91f3fda656a08f0eb16ff40921810d
blob + 05357b0c0efba4aa25477ee8ff32265c2202307a
--- control.c
+++ control.c
struct ctl_conn {
TAILQ_ENTRY(ctl_conn) entry;
+ int monitor; /* 1 if client is in monitor mode */
struct imsgev iev;
};
}
free(c);
+}
+
+void
+control_notify(struct imsgev *iev, int type)
+{
+ struct ctl_conn *c;
+
+ TAILQ_FOREACH(c, &ctl_conns, entry) {
+ if (&c->iev == iev || !c->monitor)
+ continue;
+
+ imsg_compose_event(&c->iev, IMSG_CTL_MONITOR, 0, 0,
+ -1, &type, sizeof(type));
+ }
}
void
main_send_player(IMSG_RESUME, -1, NULL, 0);
break;
}
+ control_notify(&c->iev, imsg.hdr.type);
break;
case IMSG_CTL_TOGGLE_PLAY:
switch (play_state) {
main_send_player(IMSG_RESUME, -1, NULL, 0);
break;
}
+ control_notify(&c->iev, imsg.hdr.type);
break;
case IMSG_CTL_PAUSE:
if (play_state != STATE_PLAYING)
break;
play_state = STATE_PAUSED;
main_send_player(IMSG_PAUSE, -1, NULL, 0);
+ control_notify(&c->iev, imsg.hdr.type);
break;
case IMSG_CTL_STOP:
if (play_state == STATE_STOPPED)
break;
play_state = STATE_STOPPED;
main_send_player(IMSG_STOP, -1, NULL, 0);
+ control_notify(&c->iev, imsg.hdr.type);
break;
case IMSG_CTL_RESTART:
main_send_player(IMSG_STOP, -1, NULL, 0);
main_restart_track();
+ control_notify(&c->iev, imsg.hdr.type);
break;
case IMSG_CTL_FLUSH:
playlist_truncate();
+ control_notify(&c->iev, imsg.hdr.type);
break;
case IMSG_CTL_SHOW:
main_send_playlist(&c->iev);
case IMSG_CTL_NEXT:
main_send_player(IMSG_STOP, -1, NULL, 0);
main_playlist_advance();
+ control_notify(&c->iev, imsg.hdr.type);
break;
case IMSG_CTL_PREV:
main_send_player(IMSG_STOP, -1, NULL, 0);
main_playlist_previous();
+ control_notify(&c->iev, imsg.hdr.type);
break;
case IMSG_CTL_JUMP:
main_playlist_jump(&c->iev, &imsg);
+ control_notify(&c->iev, imsg.hdr.type);
break;
case IMSG_CTL_REPEAT:
if (IMSG_DATA_SIZE(imsg) != sizeof(rp)) {
repeat_all = rp.repeat_all;
if (rp.repeat_one != -1)
repeat_one = rp.repeat_one;
+ control_notify(&c->iev, imsg.hdr.type);
break;
case IMSG_CTL_BEGIN:
if (control_state.tx != -1) {
}
main_enqueue(control_state.tx != -1,
&control_state.play,&c->iev, &imsg);
+ if (control_state.tx == -1)
+ control_notify(&c->iev, imsg.hdr.type);
break;
case IMSG_CTL_COMMIT:
if (control_state.tx != c->iev.ibuf.fd) {
control_state.tx = -1;
imsg_compose_event(&c->iev, IMSG_CTL_COMMIT, 0, 0, -1,
NULL, 0);
+ control_notify(&c->iev, imsg.hdr.type);
break;
+ case IMSG_CTL_MONITOR:
+ c->monitor = 1;
+ break;
default:
log_debug("%s: error handling imsg %d", __func__,
imsg.hdr.type);
blob - e75b3c1d5a53c935ef71364bbaabaa5c054b9acd
blob + 198a03208d06b4478dc845c107f3789c5cd22482
--- control.h
+++ control.h
int control_init(char *);
int control_listen(int fd);
void control_accept(int, short, void *);
+void control_notify(struct imsgev *, int);
void control_dispatch_imsg(int, short, void *);
int control_imsg_relay(struct imsg *);