unsigned int cp_id;
unsigned int process_id;
+ unsigned int disconn_id;
struct queue *reqs;
struct queue *pending;
struct queue *notify;
{
struct bt_bap *bap = user_data;
+ bap->disconn_id = 0;
+
DBG(bap, "bap %p disconnected err %d", bap, err);
bt_bap_detach(bap);
bap = bt_bap_new(db, NULL);
bap->att = att;
- bt_att_register_disconnect(att, bap_disconnected, bap, NULL);
-
bt_bap_attach(bap, NULL);
return bap;
bap_endpoint_attach(bap, ep);
}
+static void bap_attach_att(struct bt_bap *bap, struct bt_att *att)
+{
+ if (bap->disconn_id) {
+ if (att == bt_bap_get_att(bap))
+ return;
+ bt_att_unregister_disconnect(bap->att, bap->disconn_id);
+ }
+
+ bap->disconn_id = bt_att_register_disconnect(bap->att,
+ bap_disconnected,
+ bap, NULL);
+}
+
bool bt_bap_attach(struct bt_bap *bap, struct bt_gatt_client *client)
{
bt_uuid_t uuid;
queue_foreach(bap_cbs, bap_attached, bap);
- if (!client)
+ if (!client) {
+ bap_attach_att(bap, bap->att);
return true;
+ }
if (bap->client)
return false;
if (!bap->client)
return false;
+ bap_attach_att(bap, bt_gatt_client_get_att(client));
+
if (bap->rdb->pacs) {
uint16_t value_handle;
struct bt_pacs *pacs = bap->rdb->pacs;
bt_gatt_client_unref(bap->client);
bap->client = NULL;
+ bt_att_unregister_disconnect(bap->att, bap->disconn_id);
+ bap->att = NULL;
+
queue_foreach(bap->streams, stream_foreach_detach, bap);
queue_foreach(bap_cbs, bap_detached, bap);
}