struct a2dp_setup_cb {
struct a2dp_setup *setup;
+ a2dp_discover_cb_t discover_cb;
a2dp_select_cb_t select_cb;
a2dp_config_cb_t config_cb;
a2dp_stream_cb_t resume_cb;
struct avdtp_stream *stream;
struct avdtp_error *err;
avdtp_set_configuration_cb setconf_cb;
+ GSList *seps;
GSList *caps;
gboolean reconfigure;
gboolean start;
}
}
+static void finalize_discover(struct a2dp_setup *s)
+{
+ GSList *l;
+
+ for (l = s->cb; l != NULL; ) {
+ struct a2dp_setup_cb *cb = l->data;
+
+ l = l->next;
+
+ if (!cb->discover_cb)
+ continue;
+
+ cb->discover_cb(s->session, s->seps, s->err, cb->user_data);
+ setup_cb_free(cb);
+ }
+}
+
static struct a2dp_setup *find_setup_by_session(struct avdtp *session)
{
GSList *l;
return a2dp_find_sep(session, l, NULL);
}
+static void discover_cb(struct avdtp *session, GSList *seps,
+ struct avdtp_error *err, void *user_data)
+{
+ struct a2dp_setup *setup = user_data;
+
+ DBG("err %p", err);
+
+ setup->seps = seps;
+ setup->err = err;
+
+ finalize_discover(setup);
+}
+
+unsigned int a2dp_discover(struct avdtp *session, a2dp_discover_cb_t cb,
+ void *user_data)
+{
+ struct a2dp_setup *setup;
+ struct a2dp_setup_cb *cb_data;
+
+ setup = a2dp_setup_get(session);
+ if (!setup)
+ return 0;
+
+ cb_data = setup_cb_new(setup);
+ cb_data->discover_cb = cb;
+ cb_data->user_data = user_data;
+
+ if (avdtp_discover(session, discover_cb, setup) == 0)
+ return cb_data->id;
+
+ setup_cb_free(cb_data);
+ return 0;
+}
+
unsigned int a2dp_select_capabilities(struct avdtp *session,
uint8_t type, const char *sender,
a2dp_select_cb_t cb,
if (!setup->cb) {
DBG("aborting setup %p", setup);
- avdtp_abort(setup->session, setup->stream);
- return TRUE;
+ if (!avdtp_abort(setup->session, setup->stream))
+ return TRUE;
}
setup_unref(setup);
void *user_data);
};
+typedef void (*a2dp_discover_cb_t) (struct avdtp *session, GSList *seps,
+ struct avdtp_error *err,
+ void *user_data);
typedef void (*a2dp_select_cb_t) (struct avdtp *session,
struct a2dp_sep *sep, GSList *caps,
void *user_data);
int *err);
void a2dp_remove_sep(struct a2dp_sep *sep);
+unsigned int a2dp_discover(struct avdtp *session, a2dp_discover_cb_t cb,
+ void *user_data);
unsigned int a2dp_select_capabilities(struct avdtp *session,
uint8_t type, const char *sender,
a2dp_select_cb_t cb,