@@ -458,10 +458,10 @@ static int asha_source_accept(struct btd_service *service)
return -1;
}
- if (!bt_asha_probe(asha_dev->asha, db, client))
+ if (!bt_asha_attach(asha_dev->asha, db, client,
+ (bt_asha_attach_cb_t) asha_source_endpoint_register, asha_dev)) {
return -1;
-
- asha_source_endpoint_register(asha_dev);
+ }
btd_service_connecting_complete(service, 0);
@@ -177,6 +177,10 @@ void bt_asha_reset(struct bt_asha *asha)
bt_asha_state_reset(asha);
asha->psm = 0;
+ memset(asha->hisyncid, 0, sizeof(asha->hisyncid));
+
+ asha->attach_cb = NULL;
+ asha->attach_cb_data = NULL;
update_asha_set(asha, false);
}
@@ -335,6 +339,21 @@ static bool uuid_cmp(const char *uuid1, const bt_uuid_t *uuid2)
return bt_uuid_cmp(&lhs, uuid2) == 0;
}
+static void check_probe_done(struct bt_asha *asha)
+{
+ uint8_t zeroes[8] = { 0, };
+
+ /* Once we have ROPs & PSM, we should be good to go */
+ if (asha->psm == 0 || memcmp(asha->hisyncid, zeroes, sizeof(zeroes) == 0))
+ return;
+
+ if (asha->attach_cb) {
+ asha->attach_cb(asha->attach_cb_data);
+ asha->attach_cb = NULL;
+ asha->attach_cb_data = NULL;
+ }
+}
+
static void read_psm(bool success,
uint8_t att_ecode,
const uint8_t *value,
@@ -356,6 +375,8 @@ static void read_psm(bool success,
asha->psm = get_le16(value);
DBG("Got PSM: %u", asha->psm);
+
+ check_probe_done(asha);
}
static void read_rops(bool success,
@@ -400,6 +421,8 @@ static void read_rops(bool success,
asha->render_delay, asha->codec_ids);
update_asha_set(asha, true);
+
+ check_probe_done(asha);
}
static void audio_status_register(uint16_t att_ecode, void *user_data)
@@ -501,14 +524,18 @@ static void foreach_asha_service(struct gatt_db_attribute *attr,
gatt_db_service_foreach_char(asha->attr, handle_characteristic, asha);
}
-bool bt_asha_probe(struct bt_asha *asha, struct gatt_db *db,
- struct bt_gatt_client *client)
+bool bt_asha_attach(struct bt_asha *asha, struct gatt_db *db,
+ struct bt_gatt_client *client, bt_asha_attach_cb_t attach_cb,
+ void *cb_user_data)
{
bt_uuid_t asha_uuid;
asha->db = gatt_db_ref(db);
asha->client = bt_gatt_client_clone(client);
+ asha->attach_cb = attach_cb;
+ asha->attach_cb_data = cb_user_data;
+
bt_uuid16_create(&asha_uuid, ASHA_SERVICE);
gatt_db_foreach_service(db, &asha_uuid, foreach_asha_service, asha);
@@ -23,6 +23,7 @@ enum bt_asha_state_t {
};
typedef void (*bt_asha_cb_t)(int status, void *data);
+typedef void (*bt_asha_attach_cb_t)(void *data);
struct bt_asha {
struct bt_gatt_client *client;
@@ -45,6 +46,9 @@ struct bt_asha {
enum bt_asha_state_t state;
bt_asha_cb_t cb;
void *cb_user_data;
+
+ bt_asha_attach_cb_t attach_cb;
+ void *attach_cb_data;
};
struct bt_asha_set {
@@ -65,5 +69,6 @@ unsigned int bt_asha_stop(struct bt_asha *asha, bt_asha_cb_t cb,
bool bt_asha_set_volume(struct bt_asha *asha, int8_t volume);
-bool bt_asha_probe(struct bt_asha *asha, struct gatt_db *db,
- struct bt_gatt_client *client);
+bool bt_asha_attach(struct bt_asha *asha, struct gatt_db *db,
+ struct bt_gatt_client *client, bt_asha_attach_cb_t probe_cb,
+ void *cb_user_data);