From 2cc2e7d131b5829955c6bde38cd2252d747c3f1f Mon Sep 17 00:00:00 2001 From: Andrzej Kaczmarek Date: Mon, 26 May 2014 15:16:49 +0200 Subject: [PATCH] android/a2dp: Add support to check aptX capabilities --- android/a2dp.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/android/a2dp.c b/android/a2dp.c index 58c949bc6..3ba743407 100644 --- a/android/a2dp.c +++ b/android/a2dp.c @@ -371,10 +371,40 @@ static int aac_check_config(void *caps, uint8_t caps_len, void *conf, return 0; } +static int aptx_check_config(void *caps, uint8_t caps_len, void *conf, + uint8_t conf_len) +{ + a2dp_aptx_t *cap, *config; + + if (conf_len != caps_len || conf_len != sizeof(a2dp_aptx_t)) { + error("APTX: Invalid configuration size (%u)", conf_len); + return -EINVAL; + } + + cap = caps; + config = conf; + + if (!(cap->frequency & config->frequency)) { + error("APTX: Unsupported frequenct (%u) by endpoint", + config->frequency); + return -EINVAL; + } + + if (!(cap->channel_mode & config->channel_mode)) { + error("APTX: Unsupported channel mode (%u) by endpoint", + config->channel_mode); + return -EINVAL; + } + + return 0; +} + static int check_capabilities(struct a2dp_preset *preset, struct avdtp_media_codec_capability *codec, uint8_t codec_len) { + a2dp_vendor_codec_t *vndcodec; + /* Codec specific */ switch (codec->media_codec_type) { case A2DP_CODEC_SBC: @@ -383,6 +413,13 @@ static int check_capabilities(struct a2dp_preset *preset, case A2DP_CODEC_MPEG24: return aac_check_config(codec->data, codec_len, preset->data, preset->len); + case A2DP_CODEC_VENDOR: + vndcodec = (void *) codec->data; + if (btohl(vndcodec->vendor_id) == APTX_VENDOR_ID && + btohs(vndcodec->codec_id) == APTX_CODEC_ID) + return aptx_check_config(codec->data, codec_len, + preset->data, preset->len); + return -EINVAL; default: return -EINVAL; } -- 2.47.3