Skip to content

Commit

Permalink
shared/bap: Read PAC Sink/Source if respective location is found
Browse files Browse the repository at this point in the history
If PAC Sink/Source has been found but not record has been recovered it
means an error must have occurred so this attempt to read the records
once again.
  • Loading branch information
Vudentz committed Dec 9, 2022
1 parent 6b5b513 commit 3bdc16d
Showing 1 changed file with 64 additions and 44 deletions.
108 changes: 64 additions & 44 deletions src/shared/bap.c
Original file line number Diff line number Diff line change
Expand Up @@ -2837,6 +2837,50 @@ static void read_sink_pac(struct bt_bap *bap, bool success, uint8_t att_ecode,
bap_parse_pacs(bap, BT_BAP_SINK, bap->rdb->sinks, value, length);
}

static void bap_pending_destroy(void *data)
{
struct bt_bap_pending *pending = data;
struct bt_bap *bap = pending->bap;

if (queue_remove_if(bap->pending, NULL, pending))
free(pending);

bap_notify_ready(bap);
}

static void bap_pending_complete(bool success, uint8_t att_ecode,
const uint8_t *value, uint16_t length,
void *user_data)
{
struct bt_bap_pending *pending = user_data;

if (pending->func)
pending->func(pending->bap, success, att_ecode, value, length,
pending->user_data);
}

static void bap_read_value(struct bt_bap *bap, uint16_t value_handle,
bap_func_t func, void *user_data)
{
struct bt_bap_pending *pending;

pending = new0(struct bt_bap_pending, 1);
pending->bap = bap;
pending->func = func;
pending->user_data = user_data;

pending->id = bt_gatt_client_read_value(bap->client, value_handle,
bap_pending_complete, pending,
bap_pending_destroy);
if (!pending->id) {
DBG(bap, "Unable to send Read request");
free(pending);
return;
}

queue_push_tail(bap->pending, pending);
}

static void read_source_pac_loc(struct bt_bap *bap, bool success,
uint8_t att_ecode, const uint8_t *value,
uint16_t length, void *user_data)
Expand All @@ -2851,6 +2895,16 @@ static void read_source_pac_loc(struct bt_bap *bap, bool success,

gatt_db_attribute_write(pacs->source_loc, 0, value, length, 0, NULL,
NULL, NULL);

/* Resume reading sinks if supported but for some reason is empty */
if (pacs->source && queue_isempty(bap->rdb->sources)) {
uint16_t value_handle;

if (gatt_db_attribute_get_char_data(pacs->source,
NULL, &value_handle,
NULL, NULL, NULL))
bap_read_value(bap, value_handle, read_source_pac, bap);
}
}

static void read_sink_pac_loc(struct bt_bap *bap, bool success,
Expand All @@ -2867,6 +2921,16 @@ static void read_sink_pac_loc(struct bt_bap *bap, bool success,

gatt_db_attribute_write(pacs->sink_loc, 0, value, length, 0, NULL,
NULL, NULL);

/* Resume reading sinks if supported but for some reason is empty */
if (pacs->sink && queue_isempty(bap->rdb->sinks)) {
uint16_t value_handle;

if (gatt_db_attribute_get_char_data(pacs->sink,
NULL, &value_handle,
NULL, NULL, NULL))
bap_read_value(bap, value_handle, read_sink_pac, bap);
}
}

static void read_pac_context(struct bt_bap *bap, bool success,
Expand Down Expand Up @@ -2900,50 +2964,6 @@ static void read_pac_supported_context(struct bt_bap *bap, bool success,
NULL, NULL, NULL);
}

static void bap_pending_destroy(void *data)
{
struct bt_bap_pending *pending = data;
struct bt_bap *bap = pending->bap;

if (queue_remove_if(bap->pending, NULL, pending))
free(pending);

bap_notify_ready(bap);
}

static void bap_pending_complete(bool success, uint8_t att_ecode,
const uint8_t *value, uint16_t length,
void *user_data)
{
struct bt_bap_pending *pending = user_data;

if (pending->func)
pending->func(pending->bap, success, att_ecode, value, length,
pending->user_data);
}

static void bap_read_value(struct bt_bap *bap, uint16_t value_handle,
bap_func_t func, void *user_data)
{
struct bt_bap_pending *pending;

pending = new0(struct bt_bap_pending, 1);
pending->bap = bap;
pending->func = func;
pending->user_data = user_data;

pending->id = bt_gatt_client_read_value(bap->client, value_handle,
bap_pending_complete, pending,
bap_pending_destroy);
if (!pending->id) {
DBG(bap, "Unable to send Read request");
free(pending);
return;
}

queue_push_tail(bap->pending, pending);
}

static void foreach_pacs_char(struct gatt_db_attribute *attr, void *user_data)
{
struct bt_bap *bap = user_data;
Expand Down

0 comments on commit 3bdc16d

Please sign in to comment.