[raop] Fix bug where we send start packets during teardown

The teardown send function was setting state to CONNECTED, which made
raop_write() believe that the device had just joined.
This commit is contained in:
ejurgensen 2020-05-03 00:00:26 +02:00
parent 661289990c
commit 57ff2e3124
1 changed files with 12 additions and 2 deletions

View File

@ -142,6 +142,8 @@ enum raop_state {
RAOP_STATE_CONNECTED = RAOP_STATE_F_CONNECTED | 0x01, RAOP_STATE_CONNECTED = RAOP_STATE_F_CONNECTED | 0x01,
// Media data is being sent // Media data is being sent
RAOP_STATE_STREAMING = RAOP_STATE_F_CONNECTED | 0x02, RAOP_STATE_STREAMING = RAOP_STATE_F_CONNECTED | 0x02,
// Session teardown in progress (-> going to STOPPED state)
RAOP_STATE_TEARDOWN = RAOP_STATE_F_CONNECTED | 0x03,
// Session is failed, couldn't startup or error occurred // Session is failed, couldn't startup or error occurred
RAOP_STATE_FAILED = RAOP_STATE_F_FAILED | 0x01, RAOP_STATE_FAILED = RAOP_STATE_F_FAILED | 0x01,
// Password issue: unknown password or bad password // Password issue: unknown password or bad password
@ -1224,7 +1226,6 @@ raop_send_req_teardown(struct raop_session *rs, evrtsp_req_cb cb, const char *lo
return -1; return -1;
} }
rs->state = RAOP_STATE_CONNECTED;
rs->reqs_in_flight++; rs->reqs_in_flight++;
evrtsp_connection_set_closecb(rs->ctrl, NULL, NULL); evrtsp_connection_set_closecb(rs->ctrl, NULL, NULL);
@ -1737,8 +1738,12 @@ raop_status(struct raop_session *rs)
case RAOP_STATE_STREAMING: case RAOP_STATE_STREAMING:
state = OUTPUT_STATE_STREAMING; state = OUTPUT_STATE_STREAMING;
break; break;
case RAOP_STATE_TEARDOWN:
DPRINTF(E_LOG, L_RAOP, "Bug! raop_status() called with transitional state (TEARDOWN)\n");
state = OUTPUT_STATE_STOPPED;
break;
default: default:
DPRINTF(E_LOG, L_RAOP, "Bug! Unhandled state in raop_status()\n"); DPRINTF(E_LOG, L_RAOP, "Bug! Unhandled state in raop_status(): %d\n", rs->state);
state = OUTPUT_STATE_FAILED; state = OUTPUT_STATE_FAILED;
} }
@ -1956,6 +1961,9 @@ session_teardown(struct raop_session *rs, const char *log_caller)
deferred_session_failure(rs); deferred_session_failure(rs);
} }
// Change state immediately so we won't write any more to the device
rs->state = RAOP_STATE_TEARDOWN;
return ret; return ret;
} }
@ -3514,6 +3522,8 @@ raop_startup_cancel(struct raop_session *rs)
return; return;
} }
rs->state = RAOP_STATE_TEARDOWN;
ret = raop_send_req_teardown(rs, raop_cb_startup_cancel, "startup_cancel"); ret = raop_send_req_teardown(rs, raop_cb_startup_cancel, "startup_cancel");
if (ret < 0) if (ret < 0)
session_failure(rs); session_failure(rs);