static struct a2dp_sep *a2dp_add_sep(DBusConnection *conn, uint8_t type, uint8_t codec) { struct a2dp_sep *sep; GSList **l; sdp_record_t *(*create_record)(void); uint32_t *record_id; sdp_record_t *record; struct avdtp_sep_ind *ind; sep = g_new0(struct a2dp_sep, 1); ind = (codec == A2DP_CODEC_MPEG12) ? &mpeg_ind : &sbc_ind; sep->sep = avdtp_register_sep(type, AVDTP_MEDIA_TYPE_AUDIO, codec, ind, &cfm, sep); if (sep->sep == NULL) { g_free(sep); return NULL; } sep->codec = codec; sep->type = type; if (type == AVDTP_SEP_TYPE_SOURCE) { l = &sources; create_record = a2dp_source_record; record_id = &source_record_id; } else { l = &sinks; create_record = a2dp_sink_record; record_id = &sink_record_id; } if (*record_id != 0) goto add; record = create_record(); if (!record) { error("Unable to allocate new service record"); avdtp_unregister_sep(sep->sep); g_free(sep); return NULL; } if (add_record_to_server(BDADDR_ANY, record) < 0) { error("Unable to register A2DP service record");\ sdp_record_free(record); avdtp_unregister_sep(sep->sep); g_free(sep); return NULL; } *record_id = record->handle; add: *l = g_slist_append(*l, sep); return sep; }
static struct a2dp_sep *a2dp_add_sep(struct a2dp_server *server, uint8_t type, uint8_t codec, gboolean delay_reporting) { struct a2dp_sep *sep; GSList **l; uint32_t *record_id; sdp_record_t *record; struct avdtp_sep_ind *ind; sep = g_new0(struct a2dp_sep, 1); ind = (codec == A2DP_CODEC_MPEG12) ? &mpeg_ind : &sbc_ind; sep->sep = avdtp_register_sep(&server->src, type, AVDTP_MEDIA_TYPE_AUDIO, codec, delay_reporting, ind, &cfm, sep); if (sep->sep == NULL) { g_free(sep); return NULL; } sep->codec = codec; sep->type = type; sep->delay_reporting = delay_reporting; if (type == AVDTP_SEP_TYPE_SOURCE) { l = &server->sources; record_id = &server->source_record_id; } else { l = &server->sinks; record_id = &server->sink_record_id; } if (*record_id != 0) goto add; record = a2dp_record(type, server->version); if (!record) { error("Unable to allocate new service record"); avdtp_unregister_sep(sep->sep); g_free(sep); return NULL; } if (add_record_to_server(&server->src, record) < 0) { error("Unable to register A2DP service record"); \ sdp_record_free(record); avdtp_unregister_sep(sep->sep); g_free(sep); return NULL; } *record_id = record->handle; add: *l = g_slist_append(*l, sep); return sep; }
static void unregister_endpoint(void *data) { struct a2dp_endpoint *endpoint = data; if (endpoint->sep) avdtp_unregister_sep(endpoint->sep); if (endpoint->caps) preset_free(endpoint->caps); g_slist_free_full(endpoint->presets, preset_free); g_free(endpoint); }
static void a2dp_unregister_sep(struct a2dp_sep *sep) { avdtp_unregister_sep(sep->sep); g_free(sep); }