From 670ac7745d283b3212ca309e99fb29e4f16dd784 Mon Sep 17 00:00:00 2001 From: whatdoineed2do Date: Sun, 8 May 2022 13:09:59 +0100 Subject: [PATCH] [rcp] bug fix - speaker unselection upon restart / obey volume (#1459) --- src/outputs/rcp.c | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/src/outputs/rcp.c b/src/outputs/rcp.c index a9dc4697..ebae9da7 100644 --- a/src/outputs/rcp.c +++ b/src/outputs/rcp.c @@ -110,7 +110,7 @@ enum rcp_state RCP_STATE_SETUP_SERVER_CONNECT_TRANS_END, RCP_STATE_SETUP_SERVER_CONNECT, // 15 - RCP_STATE_SETUP_VOL_GET, + RCP_STATE_SETUP_VOL_SET, RCP_STATE_QUEUING_CLEAR, RCP_STATE_QUEUING_SET_TITLE, @@ -168,7 +168,7 @@ static const struct rcp_state_map rcp_state_send_map[] = { RCP_STATE_SETUP_SERVER_CONNECT_TRANS_END, NULL }, { RCP_STATE_SETUP_SERVER_CONNECT, NULL }, - { RCP_STATE_SETUP_VOL_GET, "GetVolume" }, + { RCP_STATE_SETUP_VOL_SET, "SetVolume", true }, { RCP_STATE_QUEUING_CLEAR, "ClearWorkingSong" }, { RCP_STATE_QUEUING_SET_TITLE, "SetWorkingSongInfo title", true }, @@ -420,7 +420,6 @@ rcp_state_verify(struct rcp_session *s, const char *resp) return 0; goto resp_err; - case RCP_STATE_SETUP_VOL_GET: case RCP_STATE_VOL_GET: if (strncmp(resp, "GetVolume: ", strlen("GetVolume: ")) == 0) { @@ -433,6 +432,7 @@ rcp_state_verify(struct rcp_session *s, const char *resp) } goto resp_err; + case RCP_STATE_SETUP_VOL_SET: case RCP_STATE_VOL_SET: if (strcmp(resp, "SetVolume: OK\r\n") == 0 || strcmp(resp, "SetVolume: ParameterError\r\n") == 0) @@ -464,6 +464,7 @@ rcp_session_shutdown(struct rcp_session* s, enum rcp_state state); static int rcp_state_transition(struct rcp_session *s) { + char buf[128]; switch (s->state) { case RCP_STATE_SETUP: @@ -582,10 +583,11 @@ rcp_state_transition(struct rcp_session *s) break; case RCP_STATE_SETUP_SERVER_CONNECT: - rcp_send(s, RCP_STATE_SETUP_VOL_GET, NULL); + snprintf(buf, sizeof(buf), "%d", s->device->volume); + rcp_send(s, RCP_STATE_SETUP_VOL_SET, buf); break; - case RCP_STATE_SETUP_VOL_GET: + case RCP_STATE_SETUP_VOL_SET: rcp_send(s, RCP_STATE_QUEUING_CLEAR, NULL); break; @@ -807,8 +809,6 @@ rcp_session_shutdown(struct rcp_session* s, enum rcp_state state) event_del(s->ev); event_del(s->reply_timeout); - s->device->prevent_playback = 1; - rcp_disconnect(s->sock); s->sock = -1; @@ -949,7 +949,6 @@ rcp_listen_cb(int fd, short what, void *arg) // Downgrade state to make rcp_session_shutdown perform an exit which is // quick and won't require a reponse from remote s->state = RCP_STATE_FAILED; - s->device->prevent_playback = 1; rcp_session_shutdown(s, RCP_STATE_FAILED); } @@ -964,7 +963,6 @@ rcp_reply_timeout_cb(int fd, short what, void *arg) DPRINTF(E_LOG, L_RCP, "Slow response from '%s' (state %d), shutting down\n", s->devname, s->state); s->state = RCP_STATE_FAILED; - s->device->prevent_playback = 1; rcp_session_shutdown(s, RCP_STATE_FAILED); event_del(s->reply_timeout); @@ -1052,7 +1050,7 @@ rcp_session_make(struct output_device *device, int callback_id) s->devname = strdup(device->name); s->address = strdup(device->v4_address); - s->volume = 0; + s->volume = device->volume; s->next = rcp_sessions; rcp_sessions = s; @@ -1145,7 +1143,7 @@ rcp_status(struct rcp_session *s) state = OUTPUT_STATE_STARTUP; break; - case RCP_STATE_SETUP_GET_CONNECTED_SERVER ... RCP_STATE_SETUP_VOL_GET: + case RCP_STATE_SETUP_GET_CONNECTED_SERVER ... RCP_STATE_SETUP_VOL_SET: case RCP_STATE_QUEUING_CLEAR ... RCP_STATE_QUEUING_PLAY: case RCP_STATE_VOL_GET: case RCP_STATE_VOL_SET: @@ -1198,7 +1196,6 @@ rcp_device_stop(struct output_device *device, int callback_id) * these need use to select (and cause the device probe to start connection to * remote side */ - device->prevent_playback = 0; s->callback_id = callback_id; // tear this session down, incl free'ing it @@ -1213,7 +1210,6 @@ rcp_device_flush(struct output_device *device, int callback_id) struct rcp_session *s = device->session; s->callback_id = callback_id; - s->state = OUTPUT_STATE_STOPPED; rcp_status(s); @@ -1246,7 +1242,6 @@ rcp_device_volume_set(struct output_device *device, int callback_id) s->callback_id = callback_id; - ret = snprintf(cmd, sizeof(cmd), "%d", device->volume); if (ret < 0) { return 0;