Message ID | 20250213-ascs_bug-v3-1-d5594f0f20c6@amlogic.com |
---|---|
State | New |
Headers | show |
Series | [BlueZ,bluez,v3] bap: fixed issue of muting music silent after pause and resume. | expand |
Hi Luiz > [ EXTERNAL EMAIL ] > > Hi Yang, > > On Wed, Feb 12, 2025 at 9:58 PM Yang Li via B4 Relay > <devnull+yang.li.amlogic.com@kernel.org> wrote: >> From: Yang Li <yang.li@amlogic.com> >> >> After the ASE state changes (streaming->releasing->idle), >> the Client needs to be notified. The process as follows: >> >> ...(Sink ASE: ID=1, State=Streaming) >> ATT Write Command Packet (ASE Control Point: Op=Release) >> ATT Notification Packet (Sink ASE: ID=1, State=Releasing) >> ATT Notification Packet (Sink ASE: ID=1, State=Idle) >> >> Signed-off-by: Yang Li <yang.li@amlogic.com> >> --- >> Changes in v3: >> - Solve the compilation error reported by test.bot >> - Link to v2: https://patch.msgid.link/20250208-ascs_bug-v2-1-b7e062d6604d@amlogic.com >> --- >> src/shared/bap.c | 31 ++++++++++++++++++++++--------- >> 1 file changed, 22 insertions(+), 9 deletions(-) >> >> diff --git a/src/shared/bap.c b/src/shared/bap.c >> index 167501282..079f7ede0 100644 >> --- a/src/shared/bap.c >> +++ b/src/shared/bap.c >> @@ -930,6 +930,18 @@ static void ascs_ase_rsp_success(struct iovec *iov, uint8_t id) >> BT_ASCS_REASON_NONE); >> } >> >> +static void stream_notify_ase_state(struct bt_bap_stream *stream) >> +{ >> + struct bt_bap_endpoint *ep = stream->ep; >> + struct bt_ascs_ase_status status; >> + >> + status.id = ep->id; >> + status.state = ep->state; >> + >> + gatt_db_attribute_notify(ep->attr, (void *)&status, sizeof(status), >> + bt_bap_get_att(stream->bap)); >> +} >> + >> static void stream_notify_config(struct bt_bap_stream *stream) >> { >> struct bt_bap_endpoint *ep = stream->ep; >> @@ -1634,7 +1646,9 @@ static bool stream_notify_state(void *data) >> struct bt_bap_stream *stream = data; >> struct bt_bap_endpoint *ep = stream->ep; >> >> - DBG(stream->bap, "stream %p", stream); >> + DBG(stream->bap, "stream %p state %s", >> + stream, >> + bt_bap_stream_statestr(ep->state)); >> >> if (stream->state_id) { >> timeout_remove(stream->state_id); >> @@ -1643,6 +1657,7 @@ static bool stream_notify_state(void *data) >> >> switch (ep->state) { >> case BT_ASCS_ASE_STATE_IDLE: >> + stream_notify_ase_state(stream); >> break; >> case BT_ASCS_ASE_STATE_CONFIG: >> stream_notify_config(stream); >> @@ -1655,6 +1670,9 @@ static bool stream_notify_state(void *data) >> case BT_ASCS_ASE_STATE_DISABLING: >> stream_notify_metadata(stream); >> break; >> + case BT_ASCS_ASE_STATE_RELEASING: >> + stream_notify_ase_state(stream); >> + break; >> } >> >> return false; >> @@ -2068,17 +2086,11 @@ static unsigned int bap_ucast_metadata(struct bt_bap_stream *stream, >> >> static uint8_t stream_release(struct bt_bap_stream *stream, struct iovec *rsp) >> { >> - struct bt_bap_pac *pac; >> - >> DBG(stream->bap, "stream %p", stream); >> >> ascs_ase_rsp_success(rsp, stream->ep->id); >> >> - pac = stream->lpac; >> - if (pac->ops && pac->ops->clear) >> - pac->ops->clear(stream, pac->user_data); > This part I don't really understand, why are you removing the call to > clear? Or are you relying on bap_stream_clear_cfm? That is only called > on detach/disconnect so I don't think we should be removing the code > above since it is still possible to reconfigure after releasing. I removed the code to allow the mobile phone to disconnect CIS iso and switch the ASE status to IDLE in function ofstream_io_disconnected(). If pac->ops->clear() is executed, CIS iso disconnects actively, and stream_disable() transitions the status to QoS. bluetoothd.log as below: bluetoothd[2223]: src/shared/bap.c:stream_release() stream 0x1ed5ae8 bluetoothd[2223]: profiles/audio/media.c:pac_clear() endpoint 0x1ec8780 stream 0x1ed5ae8 bluetoothd[2223]: src/shared/bap.c:stream_disable() stream 0x1ed5ae8 bluetoothd[2223]: src/shared/bap.c:bap_ucast_set_state() stream 0x1ed5ae8 dir 0x01: streaming -> qos bluetoothd[2223]: src/shared/bap.c:bap_stream_io_detach() stream 0x1ed5ae8 bluetoothd[2223]: src/shared/bap.c:stream_io_free() fd 18 bluetoothd[2223]: profiles/audio/bap.c:bap_state() stream 0x1ed5ae8: streaming(4) -> qos(2) Could you please guide me on where to switch the ASE status to IDLE? >> - stream_set_state(stream, BT_BAP_STREAM_STATE_IDLE); >> + stream_set_state(stream, BT_BAP_STREAM_STATE_RELEASING); >> >> return 0; >> } >> @@ -6172,7 +6184,8 @@ static bool stream_io_disconnected(struct io *io, void *user_data) >> >> DBG(stream->bap, "stream %p io disconnected", stream); >> >> - bt_bap_stream_set_io(stream, -1); >> + if (stream->ep->state == BT_BAP_STREAM_STATE_RELEASING) >> + stream_set_state(stream, BT_BAP_STREAM_STATE_IDLE); >> >> return false; >> } >> >> --- >> base-commit: 2ee08ffd4d469781dc627fa50b4a015d9ad68007 >> change-id: 20250208-ascs_bug-e7c5715d3d8c >> >> Best regards, >> -- >> Yang Li <yang.li@amlogic.com> >> >> >> > > -- > Luiz Augusto von Dentz
diff --git a/src/shared/bap.c b/src/shared/bap.c index 167501282..079f7ede0 100644 --- a/src/shared/bap.c +++ b/src/shared/bap.c @@ -930,6 +930,18 @@ static void ascs_ase_rsp_success(struct iovec *iov, uint8_t id) BT_ASCS_REASON_NONE); } +static void stream_notify_ase_state(struct bt_bap_stream *stream) +{ + struct bt_bap_endpoint *ep = stream->ep; + struct bt_ascs_ase_status status; + + status.id = ep->id; + status.state = ep->state; + + gatt_db_attribute_notify(ep->attr, (void *)&status, sizeof(status), + bt_bap_get_att(stream->bap)); +} + static void stream_notify_config(struct bt_bap_stream *stream) { struct bt_bap_endpoint *ep = stream->ep; @@ -1634,7 +1646,9 @@ static bool stream_notify_state(void *data) struct bt_bap_stream *stream = data; struct bt_bap_endpoint *ep = stream->ep; - DBG(stream->bap, "stream %p", stream); + DBG(stream->bap, "stream %p state %s", + stream, + bt_bap_stream_statestr(ep->state)); if (stream->state_id) { timeout_remove(stream->state_id); @@ -1643,6 +1657,7 @@ static bool stream_notify_state(void *data) switch (ep->state) { case BT_ASCS_ASE_STATE_IDLE: + stream_notify_ase_state(stream); break; case BT_ASCS_ASE_STATE_CONFIG: stream_notify_config(stream); @@ -1655,6 +1670,9 @@ static bool stream_notify_state(void *data) case BT_ASCS_ASE_STATE_DISABLING: stream_notify_metadata(stream); break; + case BT_ASCS_ASE_STATE_RELEASING: + stream_notify_ase_state(stream); + break; } return false; @@ -2068,17 +2086,11 @@ static unsigned int bap_ucast_metadata(struct bt_bap_stream *stream, static uint8_t stream_release(struct bt_bap_stream *stream, struct iovec *rsp) { - struct bt_bap_pac *pac; - DBG(stream->bap, "stream %p", stream); ascs_ase_rsp_success(rsp, stream->ep->id); - pac = stream->lpac; - if (pac->ops && pac->ops->clear) - pac->ops->clear(stream, pac->user_data); - - stream_set_state(stream, BT_BAP_STREAM_STATE_IDLE); + stream_set_state(stream, BT_BAP_STREAM_STATE_RELEASING); return 0; } @@ -6172,7 +6184,8 @@ static bool stream_io_disconnected(struct io *io, void *user_data) DBG(stream->bap, "stream %p io disconnected", stream); - bt_bap_stream_set_io(stream, -1); + if (stream->ep->state == BT_BAP_STREAM_STATE_RELEASING) + stream_set_state(stream, BT_BAP_STREAM_STATE_IDLE); return false; }