Re: [PATCH BlueZ bluez] shared/bap: Set stream to idle when I/O is disconnected

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

ke, 2025-06-25 kello 13:24 +0800, Yang Li kirjoitti:

> 
[clip]
> When music is paused on the pixel 9 phone, the CIS link gets 
> disconnected. As the transport state changes from ACTIVE to IDLE, the 
> stream state transitions from config to qos.
> 
>    > HCI Event: Disconnect Complete (0x05) plen 4           #1425 [hci0] 
> 49.572089
>            Status: Success (0x00)
>            Handle: 512 Address: 6A:AB:51:47:3B:80 (Resolvable)
>              Identity type: Random (0x01)
>              Identity: E8:D5:2B:59:57:A6 (Static)
>            Reason: Remote User Terminated Connection (0x13)
>    bluetoothd[2313]: src/shared/bap.c:stream_io_disconnected() stream 
> 0x1f9fc20 io disconnected
>    bluetoothd[2313]: src/shared/bap.c:bap_ucast_set_state() stream 
> 0x1f9fc20 dir 0x01: releasing -> config
>    bluetoothd[2313]: src/shared/bap.c:stream_notify() stream 0x1f9fc20 
> state 1
>    bluetoothd[2313]: profiles/audio/transport.c:bap_state_changed() 
> stream 0x1f9fc20: releasing(6) -> config(1)
>    bluetoothd[2313]: 
> profiles/audio/transport.c:transport_update_playing() 
> /org/bluez/hci0/dev_6A_AB_51_47_3B_80/fd1 State=TRANSPORT_STATE_ACTIVE 
> Playing=0
>    bluetoothd[2313]: 
> profiles/audio/transport.c:media_transport_remove_owner() Transport 
> /org/bluez/hci0/dev_6A_AB_51_47_3B_80/fd1 Owner :1.1
>    bluetoothd[2313]: profiles/audio/transport.c:media_owner_free() Owner 
> :1.1
>    bluetoothd[2313]: 
> profiles/audio/transport.c:media_transport_suspend() Transport 
> /org/bluez/hci0/dev_6A_AB_51_47_3B_80/fd1 Owner
>    bluetoothd[2313]: profiles/audio/transport.c:transport_set_state() 
> State changed /org/bluez/hci0/dev_6A_AB_51_47_3B_80/fd1: 
> TRANSPORT_STATE_ACTIVE -> TRANSPORT_STATE_IDLE
>    bluetoothd[2313]: src/shared/bap.c:stream_disable() stream 0x1f9fc20

AFAICS the bug appears to be:

- bap.c:stream_disable() should do nothing if stream is
  not ENABLING or STREAMING

since it's called from bt_bap_stream_disable() which is called on
transport suspend which should be noop for BAP server if stream is
already gone.

>    bluetoothd[2313]: src/shared/bap.c:bap_ucast_set_state() stream 
> 0x1f9fc20 dir 0x01: config -> qos
>    ATTbluetoothd[2313]: < ACL Data TX: H.. flags 0x00 dlen 51 #1426 
> [hci0] 49.585656
>        ATT: Handle Value Notification (0x1b) len 46
>          Handle: 0x007b Type: Sink ASE (0x2bc4)
>            Data[44]: 
> 01010002050a00204e00409c00204e00409c0006000000001302010302020105030300000003042800020501
>              ASE ID: 1
>              State: Codec Configured (0x01)
>              Framing: Unframed PDUs supported (0x00)
>              PHY: 0x02
>              LE 2M PHY preffered (0x02)
>              RTN: 5
>              Max Transport Latency: 10
>              Presentation Delay Min: 20000 us
>    ...
>    bluetoothd[2313]: < ACL Data TX: H.. flags 0x00 dlen 24 #1427 [hci0] 
> 49.585725
>        ATT: Handle Value Notification (0x1b) len 19
>          Handle: 0x007b Type: Sink ASE (0x2bc4)
>            Data[17]: 0102010010270000025000050a00204e00
>              ASE ID: 1
>              State: QoS Configured (0x02)
>              CIG ID: 0x01
>              CIS ID: 0x00
>    ...
> 
> when playback resumes on the phone, it attempts to set the ASE state to 
> Codec. However, since the stream has already transitioned from config to 
> qos, the phone ends up disconnecting the connection.
> 
>    bluetoothd[2313]: < ACL Data TX: H.. flags 0x00 dlen 12  #1433 [hci0] 
> 60.216004
>        ATT: Handle Value Notification (0x1b) len 7
>          Handle: 0x0087 Type: ASE Control Point (0x2bc6)
>            Data[5]: 0101010000
>              Opcode: Codec Configuration (0x01)
>              Number of ASE(s): 1
>              ASE: #0
>              ASE ID: 0x01
>              ASE Response Code: Success (0x00)
>              ASE Response Reason: None (0x00)
>    bluetoothd[2313]: < ACL Data TX: H.. flags 0x00 dlen 51 #1434 [hci0] 
> 60.226086
>        ATT: Handle Value Notification (0x1b) len 46
>          Handle: 0x007b Type: Sink ASE (0x2bc4)
>            Data[44]: 
> 01010002050a00204e00409c00204e00409c0006000000001302010302020105030300000003042800020501
>              ASE ID: 1
>              State: Codec Configured (0x01)
>              Framing: Unframed PDUs supported (0x00)
>              PHY: 0x02
>              LE 2M PHY preffered (0x02)
>              RTN: 5
>              Max Transport Latency: 10
>              Presentation Delay Min: 20000 us
>              Presentation Delay Max: 40000 us
>              Preferred Presentation Delay Min: 20000 us
>              Preferred Presentation Delay Max: 40000 us
>              Codec: LC3 (0x06)
>              Codec Specific Configuration: #0: len 0x02 type 0x01
>                Sampling Frequency: 16 Khz (0x03)
>              Codec Specific Configuration: #1: len 0x02 type 0x02
>                Frame Duration: 10 ms (0x01)
>              Codec Specific Configuration: #2: len 0x05 type 0x03
>             Location: 0x00000003
>                Front Left (0x00000001)
>                Front Right (0x00000002)
>              Codec Specific Configuration: #3: len 0x03 type 0x04
>                Frame Length: 40 (0x0028)
>              Codec Specific Configuration: #4: len 0x02 type 0x05
>                Frame Blocks per SDU: 1 (0x01)
> 
>    ...
> 
>    > HCI Event: Disconnect Complete (0x05) plen 4           #1445 [hci0] 
> 63.651497
>          Status: Success (0x00)
>          Handle: 16 Address: 6A:AB:51:47:3B:80 (Resolvable)
>            Identity type: Random (0x01)
>            Identity: E8:D5:2B:59:57:A6 (Static)
>          Reason: Remote User Terminated Connection (0x13)
> 
> Introducing a check in the stream logic to distinguish between Unicast 
> and Broadcast would indeed make it easier to handle different stream 
> types cleanly.
> However, if we temporarily ignore Unicast caching, a simpler and cleaner 
> approach would be to transition the stream directly to IDLE when I/O is 
> disconnected.

This disconnect callback is used for all the roles: unicast client,
unicast server, broadcast. All of those require different handling, so
it's probably most clear to split it.


For unicast server:

The behavior has to follow BAP v1.0.2 Sec. 5.6.8 and ASCS Table 3.2.
Transition to IDLE is only allowed from RELEASING --- but one can as
well go to CONFIG like it is in current master.

CIS loss from STREAMING should go to QOS, and I think it currently does
so, via bap_stream_set_io.


[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux