static gboolean start_ind(struct avdtp *session, struct avdtp_local_sep *sep, struct avdtp_stream *stream, uint8_t *err, void *user_data) { struct a2dp_sep *a2dp_sep = user_data; struct a2dp_setup *setup; if (a2dp_sep->type == AVDTP_SEP_TYPE_SINK) DBG("Sink %p: Start_Ind", sep); else DBG("Source %p: Start_Ind", sep); setup = find_setup_by_session(session); if (setup) finalize_resume(setup); if (!a2dp_sep->locked) { a2dp_sep->session = avdtp_ref(session); a2dp_sep->suspend_timer = g_timeout_add_seconds(SUSPEND_TIMEOUT, (GSourceFunc) suspend_timeout, a2dp_sep); } return TRUE; }
unsigned int a2dp_source_config(struct avdtp *session, a2dp_config_cb_t cb, GSList *caps, void *user_data) { struct a2dp_setup_cb *cb_data; GSList *l; struct a2dp_setup *setup; struct a2dp_sep *sep = NULL, *tmp; struct avdtp_local_sep *lsep; struct avdtp_remote_sep *rsep; struct avdtp_service_capability *cap; struct avdtp_media_codec_capability *codec_cap = NULL; int posix_err; for (l = caps; l != NULL; l = l->next) { cap = l->data; if (cap->category != AVDTP_MEDIA_CODEC) continue; codec_cap = (void *) cap->data; break; } if (!codec_cap) return 0; for (l = sources; l != NULL; l = l->next) { tmp = l->data; if (tmp->locked) continue; if (tmp->codec != codec_cap->media_codec_type) continue; if (!tmp->stream || avdtp_has_stream(session, tmp->stream)) { sep = tmp; break; } } if (!sep) { error("a2dp_source_cfg: no available SEP found"); return 0; } debug("a2dp_source_config: selected SEP %p", sep->sep); cb_data = g_new0(struct a2dp_setup_cb, 1); cb_data->config_cb = cb; cb_data->user_data = user_data; cb_data->id = ++cb_id; setup = find_setup_by_session(session); if (!setup) { setup = g_new0(struct a2dp_setup, 1); setup->session = avdtp_ref(session); setups = g_slist_append(setups, setup); }
static struct a2dp_setup *setup_new(struct avdtp *session) { struct a2dp_setup *setup; setup = g_new0(struct a2dp_setup, 1); setup->session = avdtp_ref(session); setups = g_slist_append(setups, setup); return setup; }
gboolean source_setup_stream(struct source *source, struct avdtp *session) { if (source->connect_id > 0 || source->disconnect_id > 0) return FALSE; if (session && !source->session) source->session = avdtp_ref(session); if (!source->session) return FALSE; if (avdtp_discover(source->session, discovery_complete, source) < 0) return FALSE; return TRUE; }
gboolean sink_setup_stream(struct sink *sink, struct avdtp *session) { if (sink->connect_id > 0 || sink->disconnect_id > 0) return FALSE; if (session && !sink->session) sink->session = avdtp_ref(session); if (!sink->session) return FALSE; if (avdtp_discover(sink->session, discovery_complete, sink) < 0) return FALSE; return TRUE; }
gboolean source_new_stream(struct btd_service *service, struct avdtp *session, struct avdtp_stream *stream) { struct source *source = btd_service_get_user_data(service); if (source->stream) return FALSE; if (!source->session) source->session = avdtp_ref(session); source->stream = stream; source->cb_id = avdtp_stream_add_cb(session, stream, stream_state_changed, service); return TRUE; }
gboolean sink_new_stream(struct audio_device *dev, struct avdtp *session, struct avdtp_stream *stream) { struct sink *sink = dev->sink; if (sink->stream) return FALSE; if (!sink->session) sink->session = avdtp_ref(session); sink->stream = stream; sink->cb_id = avdtp_stream_add_cb(session, stream, stream_state_changed, dev); return TRUE; }
gboolean sink_setup_stream(struct btd_service *service, struct avdtp *session) { struct sink *sink = btd_service_get_user_data(service); if (sink->connect_id > 0 || sink->disconnect_id > 0) return FALSE; if (session && !sink->session) sink->session = avdtp_ref(session); if (!sink->session) return FALSE; if (avdtp_discover(sink->session, discovery_complete, sink) < 0) return FALSE; return TRUE; }
static struct a2dp_setup *setup_new(struct avdtp *session) { struct audio_device *dev; struct a2dp_setup *setup; dev = a2dp_get_dev(session); if (!dev) { error("Unable to create setup"); return NULL; } setup = g_new0(struct a2dp_setup, 1); setup->session = avdtp_ref(session); setup->dev = a2dp_get_dev(session); setups = g_slist_append(setups, setup); return setup; }
gboolean source_new_stream(struct audio_device *dev, struct avdtp *session, struct avdtp_stream *stream) { struct source *source = dev->source; if (source->stream) return FALSE; if (!source->session) source->session = avdtp_ref(session); source->stream = stream; source->cb_id = avdtp_stream_add_cb(session, stream, stream_state_changed, dev); return TRUE; }
gboolean sink_setup_stream(struct sink *sink, struct avdtp *session) { if (sink->connect || sink->disconnect) return FALSE; if (session && !sink->session) sink->session = avdtp_ref(session); if (!sink->session) return FALSE; avdtp_set_auto_disconnect(sink->session, FALSE); if (avdtp_discover(sink->session, discovery_complete, sink) < 0) return FALSE; sink->connect = g_new0(struct pending_request, 1); return TRUE; }