From 9948168cca15f8a4d68c963d2fb06506b0f6ba6d Mon Sep 17 00:00:00 2001 From: Arun Raghavan Date: Mon, 12 May 2025 20:04:07 +0530 Subject: [PATCH] shared/asha: Don't wait for status notification on stop Not all devices respond with the status update, so let's just send it out and assume it worked. --- profiles/audio/asha.c | 5 ++--- profiles/audio/asha.h | 3 +-- profiles/audio/transport.c | 16 ++++------------ src/shared/asha.c | 19 ++++++++++--------- src/shared/asha.h | 4 +--- 5 files changed, 18 insertions(+), 29 deletions(-) diff --git a/profiles/audio/asha.c b/profiles/audio/asha.c index d478faf11..9bd57d780 100644 --- a/profiles/audio/asha.c +++ b/profiles/audio/asha.c @@ -170,10 +170,9 @@ unsigned int bt_asha_device_start(struct bt_asha_device *asha_dev, return (++asha_dev->resume_id); } -unsigned int bt_asha_device_stop(struct bt_asha_device *asha_dev, - bt_asha_cb_t cb, void *user_data) +unsigned int bt_asha_device_stop(struct bt_asha_device *asha_dev) { - bt_asha_stop(asha_dev->asha, cb, user_data); + bt_asha_stop(asha_dev->asha); if (asha_dev->io) { g_io_channel_shutdown(asha_dev->io, TRUE, NULL); diff --git a/profiles/audio/asha.h b/profiles/audio/asha.h index afd23e137..9ffd9d307 100644 --- a/profiles/audio/asha.h +++ b/profiles/audio/asha.h @@ -19,8 +19,7 @@ struct bt_asha_device; unsigned int bt_asha_device_start(struct bt_asha_device *asha_dev, bt_asha_cb_t cb, void *user_data); -unsigned int bt_asha_device_stop(struct bt_asha_device *asha_dev, - bt_asha_cb_t cb, void *user_data); +unsigned int bt_asha_device_stop(struct bt_asha_device *asha_dev); void bt_asha_device_state_reset(struct bt_asha_device *asha_dev); unsigned int bt_asha_device_device_get_resume_id( diff --git a/profiles/audio/transport.c b/profiles/audio/transport.c index 3d1f55b70..c5ae3a71b 100644 --- a/profiles/audio/transport.c +++ b/profiles/audio/transport.c @@ -2247,9 +2247,6 @@ static void asha_transport_sync_state(struct media_transport *transport, case ASHA_STARTED: transport_set_state(transport, TRANSPORT_STATE_ACTIVE); break; - case ASHA_STOPPING: - transport_set_state(transport, TRANSPORT_STATE_SUSPENDING); - break; } } @@ -2324,11 +2321,11 @@ static guint transport_asha_suspend(struct media_transport *transport, guint ret = 0; if (owner) { - ret = bt_asha_device_stop(asha_dev, asha_transport_state_cb, - owner); + ret = bt_asha_device_stop(asha_dev); asha_transport_sync_state(transport, asha_dev); + asha_transport_state_cb(-1, owner); } else { - ret = bt_asha_device_stop(asha_dev, NULL, NULL); + ret = bt_asha_device_stop(asha_dev); /* We won't have a callback to set the final state */ transport_set_state(transport, TRANSPORT_STATE_IDLE); } @@ -2349,14 +2346,9 @@ static void transport_asha_cancel(struct media_transport *transport, guint id) if (state == ASHA_STARTING || state == ASHA_STARTED) { DBG("Cancel requested, stopping"); - bt_asha_device_stop(asha_dev, NULL, NULL); + bt_asha_device_stop(asha_dev); /* We won't have a callback to set the final state */ transport_set_state(transport, TRANSPORT_STATE_IDLE); - } else if (state == ASHA_STOPPING) { - DBG("Cancel requested, resetting transport state"); - /* We already dispatched a stop, just reset our state */ - bt_asha_device_state_reset(asha_dev); - transport_set_state(transport, TRANSPORT_STATE_IDLE); } } diff --git a/src/shared/asha.c b/src/shared/asha.c index c9277e096..69906fcc5 100644 --- a/src/shared/asha.c +++ b/src/shared/asha.c @@ -272,8 +272,7 @@ unsigned int bt_asha_start(struct bt_asha *asha, bt_asha_cb_t cb, return 0; } -unsigned int bt_asha_stop(struct bt_asha *asha, bt_asha_cb_t cb, - void *user_data) +unsigned int bt_asha_stop(struct bt_asha *asha) { uint8_t acp_stop_cmd[] = { 0x02, /* STOP */ @@ -283,12 +282,16 @@ unsigned int bt_asha_stop(struct bt_asha *asha, bt_asha_cb_t cb, if (asha->state != ASHA_STARTED) return 0; - asha->state = ASHA_STOPPING; + asha->state = ASHA_STOPPED; - ret = asha_send_acp(asha, acp_stop_cmd, sizeof(acp_stop_cmd), - cb, user_data); + ret = asha_send_acp(asha, acp_stop_cmd, sizeof(acp_stop_cmd), NULL, + NULL); asha_set_send_status(asha, false); + /* We reset our state without waiting for a response */ + bt_asha_state_reset(asha); + DBG("ASHA stop done"); + return ret; } @@ -441,6 +444,8 @@ static void audio_status_notify(uint16_t value_handle, const uint8_t *value, bt_asha_cb_t state_cb = asha->state_cb; bt_asha_cb_t state_cb_data = asha->state_cb_data; + DBG("ASHA status %u", status); + if (asha->state == ASHA_STARTING) { if (status == 0) { asha->state = ASHA_STARTED; @@ -451,10 +456,6 @@ static void audio_status_notify(uint16_t value_handle, const uint8_t *value, bt_asha_state_reset(asha); DBG("ASHA start failed"); } - } else if (asha->state == ASHA_STOPPING) { - /* We reset our state, regardless */ - bt_asha_state_reset(asha); - DBG("ASHA stop %s", status == 0 ? "complete" : "failed"); } if (state_cb) { diff --git a/src/shared/asha.h b/src/shared/asha.h index 680a27010..9e62fcde8 100644 --- a/src/shared/asha.h +++ b/src/shared/asha.h @@ -19,7 +19,6 @@ enum bt_asha_state_t { ASHA_STOPPED = 0, ASHA_STARTING, ASHA_STARTED, - ASHA_STOPPING, }; typedef void (*bt_asha_cb_t)(int status, void *data); @@ -64,8 +63,7 @@ void bt_asha_free(struct bt_asha *asha); unsigned int bt_asha_start(struct bt_asha *asha, bt_asha_cb_t cb, void *user_data); -unsigned int bt_asha_stop(struct bt_asha *asha, bt_asha_cb_t cb, - void *user_data); +unsigned int bt_asha_stop(struct bt_asha *asha); bool bt_asha_set_volume(struct bt_asha *asha, int8_t volume); -- 2.47.3