• R/O
  • HTTP
  • SSH
  • HTTPS

提交

標籤
無標籤

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

system/bt


Commit MetaInfo

修訂79f4e57290c78f087718dce8fcd2999267a79a3c (tree)
時間2016-09-17 04:31:13
作者Bhakthavatsala Raghavendra <braghave@code...>
CommiterBhakthavatsala Raghavendra

Log Message

Bluetooth: Add AAC codec Support in Split-a2dp mode

Add AAC codec support in split-a2dp mode

Change-Id: I174b0c44cdef8b5d174a2e39fa34fefc55d4807b

Change Summary

差異

--- a/audio_a2dp_hw/bthost_ipc.c
+++ b/audio_a2dp_hw/bthost_ipc.c
@@ -89,6 +89,7 @@ struct a2dp_stream_common audio_stream;
8989
9090 audio_sbc_encoder_config sbc_codec;
9191 audio_aptx_encoder_config aptx_codec;
92+audio_aac_encoder_config aac_codec;
9293 /*****************************************************************************
9394 ** Externs
9495 ******************************************************************************/
@@ -269,8 +270,105 @@ static void* a2dp_codec_parser(uint8_t *codec_cfg, audio_format_t *codec_type)
269270 sbc_codec.bitrate |= (*p_cfg++ << 16);
270271 sbc_codec.bitrate |= (*p_cfg++ << 24);
271272 *codec_type = AUDIO_FORMAT_SBC;
272- INFO("Done copying full codec config");
273+ INFO("SBC: Done copying full codec config");
273274 return ((void *)(&sbc_codec));
275+ } else if (codec_cfg[CODEC_OFFSET] == CODEC_TYPE_AAC)
276+ {
277+ uint16_t aac_samp_freq = 0;
278+ uint32_t aac_bit_rate = 0;
279+ memset(&aac_codec,0,sizeof(audio_aac_encoder_config));
280+ p_cfg++;//skip dev idx
281+ len = *p_cfg++;
282+ p_cfg++;//skip media type
283+ len--;
284+ p_cfg++;//skip codec type
285+ len--;
286+ byte = *p_cfg++;
287+ len--;
288+ switch (byte & A2D_AAC_IE_OBJ_TYPE_MSK)
289+ {
290+ case A2D_AAC_IE_OBJ_TYPE_MPEG_2_AAC_LC:
291+ aac_codec.enc_mode = AUDIO_FORMAT_AAC_SUB_LC;
292+ break;
293+ case A2D_AAC_IE_OBJ_TYPE_MPEG_4_AAC_LC:
294+ aac_codec.enc_mode = AUDIO_FORMAT_AAC_SUB_LC;
295+ break;
296+ case A2D_AAC_IE_OBJ_TYPE_MPEG_4_AAC_LTP:
297+ aac_codec.enc_mode = AUDIO_FORMAT_AAC_SUB_LTP;
298+ break;
299+ case A2D_AAC_IE_OBJ_TYPE_MPEG_4_AAC_SCA:
300+ aac_codec.enc_mode = AUDIO_FORMAT_AAC_SUB_SCALABLE;
301+ break;
302+ default:
303+ ERROR("Unknown encoder mode");
304+ }
305+ //USE 0 (AAC_LC) as hardcoded value till Audio
306+ //define constants
307+ aac_codec.enc_mode = 0;
308+ //USE LOAS(1) or LATM(4) hardcoded values till
309+ //Audio define proper constants
310+ aac_codec.format_flag = 4;
311+ byte = *p_cfg++;
312+ len--;
313+ aac_samp_freq = byte << 8; //1st byte of sample_freq
314+ byte = *p_cfg++;
315+ len--;
316+ aac_samp_freq |= byte & 0x00F0; //1st nibble of second byte of samp_freq
317+
318+ switch (aac_samp_freq) {
319+ case 0x8000: aac_codec.sampling_rate = 8000; break;
320+ case 0x4000: aac_codec.sampling_rate = 11025; break;
321+ case 0x2000: aac_codec.sampling_rate = 12000; break;
322+ case 0x1000: aac_codec.sampling_rate = 16000; break;
323+ case 0x0800: aac_codec.sampling_rate = 22050; break;
324+ case 0x0400: aac_codec.sampling_rate = 24000; break;
325+ case 0x0200: aac_codec.sampling_rate = 32000; break;
326+ case 0x0100: aac_codec.sampling_rate = 44100; break;
327+ case 0x0080: aac_codec.sampling_rate = 48000; break;
328+ case 0x0040: aac_codec.sampling_rate = 64000; break;
329+ case 0x0020: aac_codec.sampling_rate = 88200; break;
330+ case 0x0010: aac_codec.sampling_rate = 96000; break;
331+ default:
332+ ERROR("Invalid sample_freq: %x", aac_samp_freq);
333+ }
334+
335+ switch (byte & A2D_AAC_IE_CHANNELS_MSK)
336+ {
337+ case A2D_AAC_IE_CHANNELS_1:
338+ aac_codec.channels = 1;
339+ break;
340+ case A2D_AAC_IE_CHANNELS_2:
341+ aac_codec.channels = 2;
342+ break;
343+ default:
344+ ERROR("Unknow channel mode");
345+ }
346+ byte = *p_cfg++; //Move to VBR byte
347+ len--;
348+ switch (byte & A2D_AAC_IE_VBR_MSK)
349+ {
350+ case A2D_AAC_IE_VBR:
351+ break;
352+ default:
353+ ERROR("VBR not supported");
354+ }
355+ aac_bit_rate = 0x7F&byte;
356+ //Move it 2nd byte of 32 bit word. leaving the VBR bit
357+ aac_bit_rate = aac_bit_rate << 16;
358+ byte = *p_cfg++; //Move to 2nd byteof bitrate
359+ len--;
360+
361+ //Move it to 3rd byte of 32bit word
362+ aac_bit_rate |= 0x0000FF00 & (((uint32_t)byte)<<8);
363+ byte = *p_cfg++; //Move to 3rd byte of bitrate
364+ len--;
365+
366+ aac_bit_rate |= 0x000000FF & (((uint32_t)byte));
367+ aac_codec.bitrate = aac_bit_rate;
368+
369+ *codec_type = AUDIO_FORMAT_AAC;
370+ INFO("AAC: Done copying full codec config");
371+ return ((void *)(&aac_codec));
274372 }
275373 else if (codec_cfg[CODEC_OFFSET] == NON_A2DP_CODEC_TYPE)
276374 {
@@ -332,6 +430,8 @@ static void* a2dp_codec_parser(uint8_t *codec_cfg, audio_format_t *codec_type)
332430 aptx_codec.bitrate |= (*p_cfg++ << 8);
333431 aptx_codec.bitrate |= (*p_cfg++ << 16);
334432 aptx_codec.bitrate |= (*p_cfg++ << 24);
433+
434+ INFO("APTx: Done copying full codec config");
335435 return ((void *)&aptx_codec);
336436 }
337437 return NULL;
@@ -933,7 +1033,7 @@ int audio_stop_stream()
9331033 return 0;
9341034 }
9351035 audio_stream.state = AUDIO_A2DP_STATE_STOPPED;
936- return -1;
1036+ return -1;
9371037 }
9381038
9391039 int audio_suspend_stream()
--- a/audio_a2dp_hw/bthost_ipc.h
+++ b/audio_a2dp_hw/bthost_ipc.h
@@ -101,6 +101,20 @@ codec specific definitions
101101 #define A2D_APTX_CHAN_STEREO 0x02
102102 #define A2D_APTX_CHAN_MONO 0x01
103103
104+
105+#define A2D_AAC_IE_OBJ_TYPE_MSK 0xF0 /* b7-b4 Object Type */
106+#define A2D_AAC_IE_OBJ_TYPE_MPEG_2_AAC_LC 0x80 /* b7:MPEG-2 AAC LC */
107+#define A2D_AAC_IE_OBJ_TYPE_MPEG_4_AAC_LC 0x40 /* b7:MPEG-4 AAC LC */
108+#define A2D_AAC_IE_OBJ_TYPE_MPEG_4_AAC_LTP 0x20 /* b7:MPEG-4 AAC LTP */
109+#define A2D_AAC_IE_OBJ_TYPE_MPEG_4_AAC_SCA 0x10 /* b7:MPEG-4 AAC SCALABLE */
110+
111+#define A2D_AAC_IE_CHANNELS_MSK 0x0C
112+#define A2D_AAC_IE_CHANNELS_1 0x08 /* Channel 1 */
113+#define A2D_AAC_IE_CHANNELS_2 0x04 /* Channel 2 */
114+
115+#define A2D_AAC_IE_VBR_MSK 0x80
116+#define A2D_AAC_IE_VBR 0x80 /* supported */
117+
104118 typedef struct {
105119 uint8_t codec_type;
106120 uint8_t dev_idx;
--- a/bta/Android.mk
+++ b/bta/Android.mk
@@ -57,6 +57,7 @@ LOCAL_SRC_FILES:= \
5757 ./av/bta_av_cfg.c \
5858 ./av/bta_av_ssm.c \
5959 ./av/bta_av_sbc.c \
60+ ./av/bta_av_aac.c \
6061 ./ar/bta_ar.c \
6162 ./hl/bta_hl_act.c \
6263 ./hl/bta_hl_api.c \
--- /dev/null
+++ b/bta/av/bta_av_aac.c
@@ -0,0 +1,83 @@
1+/******************************************************************************
2+ *
3+ * Copyright (c) 2016, The Linux Foundation. All rights reserved.
4+ *
5+ * Redistribution and use in source and binary forms, with or without
6+ * modification, are permitted provided that the following conditions are
7+ * met:
8+ * * Redistributions of source code must retain the above copyright
9+ * notice, this list of conditions and the following disclaimer.
10+ * * Redistributions in binary form must reproduce the above
11+ * copyright notice, this list of conditions and the following
12+ * disclaimer in the documentation and/or other materials provided
13+ * with the distribution.
14+ * * Neither the name of The Linux Foundation nor the names of its
15+ * contributors may be used to endorse or promote products derived
16+ * from this software without specific prior written permission.
17+ *
18+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
19+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
20+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
21+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
22+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
25+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
27+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
28+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29+ *
30+ ******************************************************************************/
31+
32+#include "a2d_api.h"
33+#include "a2d_aac.h"
34+#include "bta_av_aac.h"
35+#include "utl.h"
36+
37+/*******************************************************************************
38+**
39+** Function bta_av_aac_cfg_in_cap
40+**
41+** Description Checks if AAC codec config is allowed for given caps.
42+** codec config bits are also checked for sanity
43+**
44+** Returns 0 if ok, nonzero if error.
45+**
46+*******************************************************************************/
47+UINT8 bta_av_aac_cfg_in_cap(UINT8 *p_cfg, tA2D_AAC_CIE *p_cap)
48+{
49+ UINT8 status = 0;
50+ tA2D_AAC_CIE cfg_cie;
51+
52+ /* parse configuration */
53+ if ((status = A2D_ParsAacInfo(&cfg_cie, p_cfg, FALSE)) != 0)
54+ {
55+ APPL_TRACE_DEBUG("bta_av_aac_cfg_in_cap can't parse %d", status);
56+ return status;
57+ }
58+
59+
60+ /* object type */
61+ if ((cfg_cie.object_type & p_cap->object_type) == 0)
62+ {
63+ status = A2D_NS_OBJ_TYPE;
64+ }
65+ /* frequency */
66+ else if ((cfg_cie.samp_freq & p_cap->samp_freq) == 0)
67+ {
68+ status = A2D_NS_SAMP_FREQ;
69+ }
70+ /* channels */
71+ else if ((cfg_cie.channels & p_cap->channels) == 0)
72+ {
73+ status = A2D_NS_CHANNEL;
74+ }
75+ /* block length */
76+ else if ((cfg_cie.bit_rate & p_cap->bit_rate) == 0)
77+ {
78+ status = A2D_NS_BIT_RATE;
79+ }
80+ APPL_TRACE_DEBUG("bta_av_aac_cfg_in_cap return %d", status);
81+ return status;
82+}
83+
--- /dev/null
+++ b/bta/include/bta_av_aac.h
@@ -0,0 +1,57 @@
1+/******************************************************************************
2+ *
3+ * Copyright (c) 2016, The Linux Foundation. All rights reserved.
4+ *
5+ * Redistribution and use in source and binary forms, with or without
6+ * modification, are permitted provided that the following conditions are
7+ * met:
8+ * * Redistributions of source code must retain the above copyright
9+ * notice, this list of conditions and the following disclaimer.
10+ * * Redistributions in binary form must reproduce the above
11+ * copyright notice, this list of conditions and the following
12+ * disclaimer in the documentation and/or other materials provided
13+ * with the distribution.
14+ * * Neither the name of The Linux Foundation nor the names of its
15+ * contributors may be used to endorse or promote products derived
16+ * from this software without specific prior written permission.
17+ *
18+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
19+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
20+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
21+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
22+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
25+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
27+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
28+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29+ *
30+ ******************************************************************************/
31+
32+/******************************************************************************
33+ *
34+ * Interface to utility functions for AAC codec
35+ *
36+ ******************************************************************************/
37+#ifndef BTA_AV_AAC_H
38+#define BTA_AV_AAC_H
39+
40+
41+/* AAC packet header size */
42+#define BTA_AV_AAC_HDR_SIZE A2D_AAC_MPL_HDR_LEN
43+
44+/*******************************************************************************
45+**
46+** Function bta_av_aac_cfg_in_cap
47+**
48+** Description Checks if AAC codec config is allowed for given caps.
49+** codec config bits are also checked for sanity
50+**
51+** Returns 0 if ok, nonzero if error.
52+**
53+*******************************************************************************/
54+extern UINT8 bta_av_aac_cfg_in_cap(UINT8 *p_cfg, tA2D_AAC_CIE *p_cap);
55+
56+#endif /* BTA_AV_AAC_H */
57+
--- a/bta/include/bta_av_api.h
+++ b/bta/include/bta_av_api.h
@@ -109,8 +109,12 @@ typedef UINT8 tBTA_AV_HNDL;
109109 #endif
110110
111111 #ifndef BTA_AV_MAX_SEPS
112+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
113+#define BTA_AV_MAX_SEPS 3
114+#else
112115 #define BTA_AV_MAX_SEPS 2
113116 #endif
117+#endif
114118
115119 #ifndef BTA_AV_MAX_A2DP_MTU
116120 /*#define BTA_AV_MAX_A2DP_MTU 668 //224 (DM5) * 3 - 4(L2CAP header) */
--- a/bta/include/bta_av_co.h
+++ b/bta/include/bta_av_co.h
@@ -63,6 +63,9 @@ enum
6363 {
6464 BTIF_SV_AV_AA_SBC_INDEX = 0,
6565 BTIF_SV_AV_AA_APTX_INDEX,
66+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
67+ BTIF_SV_AV_AA_AAC_INDEX,
68+#endif
6669 BTIF_SV_AV_AA_SRC_SEP_INDEX /* Last index */
6770 };
6871
--- a/btif/co/bta_av_co.c
+++ b/btif/co/bta_av_co.c
@@ -45,6 +45,10 @@
4545
4646 #include "bt_utils.h"
4747 #include "a2d_aptx.h"
48+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
49+#include "a2d_aac.h"
50+#include "bta_av_aac.h"
51+#endif
4852
4953 /*****************************************************************************
5054 ** Constants
@@ -160,6 +164,36 @@ const tA2D_APTX_CIE btif_av_aptx_default_config =
160164 A2D_APTX_FUTURE_2
161165 };
162166
167+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
168+const tA2D_AAC_CIE bta_av_co_aac_caps =
169+{
170+ (A2D_AAC_IE_OBJ_TYPE_MPEG_2_AAC_LC|A2D_AAC_IE_OBJ_TYPE_MPEG_4_AAC_LC), /* obj type */
171+#ifndef BTA_AV_SPLIT_A2DP_DEF_FREQ_48KHZ
172+ (A2D_AAC_IE_SAMP_FREQ_44100),
173+#else
174+ (A2D_AAC_IE_SAMP_FREQ_44100 | A2D_AAC_IE_SAMP_FREQ_48000),
175+#endif
176+ (A2D_AAC_IE_CHANNELS_1 | A2D_AAC_IE_CHANNELS_2 ), /* channels */
177+ A2D_AAC_IE_BIT_RATE, /* BIT RATE */
178+ A2D_AAC_IE_VBR_NOT_SUPP /* variable bit rate */
179+};
180+
181+/* Default AAC codec configuration */
182+const tA2D_AAC_CIE btif_av_aac_default_config =
183+{
184+ A2D_AAC_IE_OBJ_TYPE_MPEG_2_AAC_LC, /* obj type */
185+#ifndef BTA_AV_SPLIT_A2DP_DEF_FREQ_48KHZ
186+ A2D_AAC_IE_SAMP_FREQ_44100, /* samp_freq */
187+#else
188+ A2D_AAC_IE_SAMP_FREQ_48000, /* samp_freq */
189+#endif
190+ A2D_AAC_IE_CHANNELS_2, /* channels */
191+ BTIF_AAC_DEFAULT_BIT_RATE, /* bit rate */
192+ A2D_AAC_IE_VBR_NOT_SUPP
193+};
194+#endif
195+
196+
163197 /*****************************************************************************
164198 ** Local data
165199 *****************************************************************************/
@@ -216,6 +250,10 @@ typedef struct
216250 tBTIF_AV_CODEC_INFO codec_cfg_sbc_setconfig; /* remote peer setconfig preference (SBC) */
217251 tBTIF_AV_CODEC_INFO codec_cfg_aptx;
218252 tBTIF_AV_CODEC_INFO codec_cfg_aptx_setconfig; /* remote peer setconfig preference (aptX)*/
253+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
254+ tBTIF_AV_CODEC_INFO codec_cfg_aac;
255+ tBTIF_AV_CODEC_INFO codec_cfg_aac_setconfig; /* remote peer setconfig preference (AAC)*/
256+#endif
219257 tBTA_AV_CO_CP cp;
220258 } tBTA_AV_CO_CB;
221259
@@ -380,7 +418,13 @@ BOOLEAN bta_av_co_audio_init(UINT8 *p_codec_type, UINT8 *p_codec_info, UINT8 *p_
380418 *p_codec_type = A2D_NON_A2DP_MEDIA_CT;
381419 A2D_BldAptxInfo(AVDT_MEDIA_AUDIO, (tA2D_APTX_CIE *) &bta_av_co_aptx_caps, p_codec_info);
382420 return TRUE;
383-
421+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
422+ case BTIF_SV_AV_AA_AAC_INDEX:
423+ APPL_TRACE_DEBUG("%s AAC", __func__);
424+ *p_codec_type = BTA_AV_CODEC_M24;
425+ A2D_BldAacInfo(AVDT_MEDIA_AUDIO, (tA2D_AAC_CIE *) &bta_av_co_aac_caps ,p_codec_info);
426+ return TRUE;
427+#endif
384428 #if (BTA_AV_SINK_INCLUDED == TRUE)
385429 case BTIF_SV_AV_AA_SBC_SINK_INDEX:
386430 *p_codec_type = BTA_AV_CODEC_SBC;
@@ -707,6 +751,12 @@ UINT8 bta_av_co_audio_getconfig(tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type,
707751 }
708752 break;
709753 }
754+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
755+ case BTA_AV_CODEC_M24:
756+ APPL_TRACE_DEBUG("%s: AAC is supported", __func__);
757+ supported = TRUE;
758+ break;
759+#endif
710760 default:
711761 break;
712762 }
@@ -977,7 +1027,17 @@ void bta_av_co_audio_setconfig(tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type,
9771027 }
9781028 break;
9791029 }
1030+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
1031+ case BTA_AV_CODEC_M24:
1032+ {
1033+ APPL_TRACE_DEBUG("%s AAC", __func__);
1034+ bta_av_co_cb.codec_cfg_aac_setconfig.id = BTIF_AV_CODEC_M24;
1035+ memcpy(bta_av_co_cb.codec_cfg_aac_setconfig.info, p_codec_info, AVDT_CODEC_SIZE);
1036+ bta_av_co_cb.codec_cfg_setconfig = &bta_av_co_cb.codec_cfg_aac_setconfig;
9801037
1038+ APPL_TRACE_DEBUG("%s codec_type = %x", __func__, codec_type);
1039+ } break;
1040+#endif
9811041 default:
9821042 APPL_TRACE_ERROR("bta_av_co_audio_setconfig unsupported cid %d", bta_av_co_cb.codec_cfg->id);
9831043 recfg_needed = TRUE;
@@ -1259,7 +1319,14 @@ static BOOLEAN bta_av_co_audio_codec_build_config(const UINT8 *p_codec_caps, UIN
12591319 p_codec_cfg[BTA_AV_CO_SBC_MIN_BITPOOL_OFF],
12601320 p_codec_caps[BTA_AV_CO_SBC_MAX_BITPOOL_OFF]);
12611321 break;
1262-
1322+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
1323+ case BTIF_AV_CODEC_M24:
1324+ /* only copy the relevant portions for this codec to avoid issues when
1325+ comparing codec configs covering larger codec sets than SBC (7 bytes) */
1326+ memcpy(p_codec_cfg, bta_av_co_cb.codec_cfg->info, A2D_AAC_INFO_LEN+1);
1327+ APPL_TRACE_DEBUG("%s AAC", __func__);
1328+ break;
1329+#endif
12631330 case A2D_NON_A2DP_MEDIA_CT:
12641331 {
12651332 UINT16 codecId;
@@ -1317,6 +1384,37 @@ static BOOLEAN bta_av_co_audio_codec_cfg_matches_caps(UINT8 codec_id, const UINT
13171384 return FALSE;
13181385 }
13191386 break;
1387+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
1388+ /* in case of Sink we have to match if Src Cap is a subset of ours */
1389+ case BTA_AV_CODEC_M24:
1390+ {
1391+ tBTIF_AV_CODEC_INFO *p_local_aac_cfg = (tBTIF_AV_CODEC_INFO*)p_codec_cfg;
1392+ tA2D_AAC_CIE p_local_aac_caps;
1393+ tA2D_AAC_CIE p_snk_aac_caps;
1394+
1395+ if (A2D_ParsAacInfo(&p_local_aac_caps, (UINT8*)p_local_aac_cfg, FALSE) != A2D_SUCCESS) {
1396+ APPL_TRACE_ERROR("%s: A2D_BldAacInfo: LOCAL failed", __func__);
1397+ }
1398+ if (A2D_ParsAacInfo(&p_snk_aac_caps, (UINT8*)p_codec_cfg, FALSE) != A2D_SUCCESS) {
1399+ APPL_TRACE_ERROR("%s: A2D_BldAacInfo: SNK failed", __func__);
1400+ }
1401+
1402+ APPL_TRACE_EVENT("AAC obj_type: snk %x local %x",
1403+ p_snk_aac_caps.object_type, p_local_aac_caps.object_type);
1404+ APPL_TRACE_EVENT("AAC samp_freq: snk %x local %x",
1405+ p_snk_aac_caps.samp_freq, p_local_aac_caps.samp_freq);
1406+ APPL_TRACE_EVENT("AAC channels: snk %x local %x",
1407+ p_snk_aac_caps.channels, p_local_aac_caps.channels);
1408+ APPL_TRACE_EVENT("AAC bit_rate: snk %x local %x",
1409+ p_snk_aac_caps.bit_rate, p_local_aac_caps.bit_rate);
1410+ APPL_TRACE_EVENT("AAC vbr: snk %x local %x",
1411+ p_snk_aac_caps.vbr, p_local_aac_caps.vbr);
1412+ return (((p_snk_aac_caps.object_type)&(p_local_aac_caps.object_type))&&
1413+ ((p_snk_aac_caps.samp_freq)&(p_local_aac_caps.samp_freq))&&
1414+ ((p_snk_aac_caps.channels)&(p_local_aac_caps.channels)));
1415+ }
1416+ break;
1417+#endif
13201418 case A2D_NON_A2DP_MEDIA_CT:
13211419 {
13221420 UINT16 codecId;
@@ -1379,6 +1477,11 @@ static BOOLEAN bta_av_co_audio_codec_match(const UINT8 *p_codec_caps, UINT8 code
13791477 case BTIF_AV_CODEC_SBC:
13801478 return bta_av_co_audio_codec_cfg_matches_caps(bta_av_co_cb.codec_cfg_sbc.id, p_codec_caps, bta_av_co_cb.codec_cfg_sbc.info);
13811479 break;
1480+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
1481+ case BTIF_AV_CODEC_M24:
1482+ return bta_av_co_audio_codec_cfg_matches_caps(bta_av_co_cb.codec_cfg_aac.id, p_codec_caps, bta_av_co_cb.codec_cfg_aac.info);
1483+ break;
1484+#endif
13821485 case A2D_NON_A2DP_MEDIA_CT:
13831486 {
13841487 UINT16 codecId;
@@ -1582,6 +1685,46 @@ static BOOLEAN bta_av_co_audio_peer_supports_codec(tBTA_AV_CO_PEER *p_peer, UINT
15821685 } else
15831686 APPL_TRACE_DEBUG("%s aptX is disabled", __func__);
15841687
1688+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
1689+ if (bt_split_a2dp_enabled && btif_av_is_codec_offload_supported(AAC)) {
1690+ for (index = 0; index < p_peer->num_sup_snks; index++)
1691+ {
1692+ APPL_TRACE_DEBUG("%s AAC: index: %d, codec_type: %d", __func__, index, p_peer->snks[index].codec_type);
1693+
1694+ if (p_peer->snks[index].codec_type == bta_av_co_cb.codec_cfg_aac.id)
1695+ {
1696+ switch (p_peer->snks[index].codec_type)
1697+ {
1698+ case BTIF_AV_CODEC_M24:
1699+ if (p_snk_index) *p_snk_index = index;
1700+ APPL_TRACE_DEBUG("%s AAC", __func__);
1701+ if (bta_av_co_audio_codec_match(p_peer->snks[index].codec_caps, BTIF_AV_CODEC_M24))
1702+ {
1703+#if defined(BTA_AV_CO_CP_SCMS_T) && (BTA_AV_CO_CP_SCMS_T == TRUE)
1704+ if (bta_av_co_audio_sink_has_scmst(&p_peer->snks[index]))
1705+#endif
1706+ {
1707+ bta_av_co_cb.current_codec_id = bta_av_co_cb.codec_cfg_aac.id;
1708+ bta_av_co_cb.codec_cfg = &bta_av_co_cb.codec_cfg_aac;
1709+
1710+ APPL_TRACE_DEBUG("%s AAC matched", __func__);
1711+ return TRUE;
1712+ }
1713+ }
1714+ break;
1715+
1716+ default:
1717+ APPL_TRACE_ERROR("AAC: bta_av_co_audio_peer_supports_codec: unsupported codec id %d", bta_av_co_cb.codec_cfg->id);
1718+ //Fall thru for further SBC check
1719+ break;
1720+ }
1721+ }
1722+ }
1723+ } else
1724+ APPL_TRACE_DEBUG("%s aptX is disabled", __func__);
1725+#endif
1726+
1727+
15851728 for (index = 0; index < p_peer->num_sup_snks; index++)
15861729 {
15871730 if (p_peer->snks[index].codec_type == codec_type ||
@@ -1720,6 +1863,15 @@ static BOOLEAN bta_av_co_audio_media_supports_config(UINT8 codec_type, const UIN
17201863 return FALSE;
17211864 }
17221865 break;
1866+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
1867+ case BTA_AV_CODEC_M24:
1868+ if (bta_av_aac_cfg_in_cap((UINT8 *)p_codec_cfg, (tA2D_AAC_CIE *)&bta_av_co_aac_caps))
1869+ {
1870+ APPL_TRACE_DEBUG("%s AAC ",__func__);
1871+ return FALSE;
1872+ }
1873+ break;
1874+#endif
17231875 case A2D_NON_A2DP_MEDIA_CT:
17241876 aptx_capabilities = &(((tBTA_AV_CO_SINK*)p_codec_cfg)->codec_caps[0]);
17251877 codecId = ((tA2D_APTX_CIE*)(aptx_capabilities))->codecId;
@@ -1876,7 +2028,15 @@ void bta_av_co_audio_codec_reset(void)
18762028 APPL_TRACE_ERROR("bta_av_co_audio_codec_reset A2D_BldSbcInfo failed");
18772029 } else
18782030 bta_av_co_cb.codec_cfg = &(bta_av_co_cb.codec_cfg_sbc);
1879-
2031+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
2032+ /* Reset the current configuration to AAC */
2033+ bta_av_co_cb.codec_cfg_aac.id = BTIF_AV_CODEC_M24;
2034+ if (A2D_BldAacInfo(A2D_MEDIA_TYPE_AUDIO, (tA2D_AAC_CIE *)&btif_av_aac_default_config, bta_av_co_cb.codec_cfg_aac.info) != A2D_SUCCESS)
2035+ {
2036+ APPL_TRACE_ERROR("bta_av_co_audio_codec_reset A2D_BldAacInfo failed");
2037+ } else
2038+ bta_av_co_cb.codec_cfg = &(bta_av_co_cb.codec_cfg_sbc);
2039+#endif
18802040 /* Reset the Current configuration to aptX */
18812041 bta_av_co_cb.codec_cfg_aptx.id = A2D_NON_A2DP_MEDIA_CT;
18822042 if (A2D_BldAptxInfo(A2D_MEDIA_TYPE_AUDIO, (tA2D_APTX_CIE *)&btif_av_aptx_default_config, bta_av_co_cb.codec_cfg_aptx.info) != A2D_SUCCESS)
@@ -1902,6 +2062,10 @@ BOOLEAN bta_av_co_audio_set_codec(const tBTIF_AV_MEDIA_FEEDINGS *p_feeding, tBTI
19022062 tBTIF_AV_CODEC_INFO new_cfg_sbc;
19032063 tA2D_APTX_CIE aptx_config;
19042064 tBTIF_AV_CODEC_INFO new_cfg_aptx;
2065+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
2066+ tA2D_AAC_CIE aac_config;
2067+ tBTIF_AV_CODEC_INFO new_cfg_aac;
2068+#endif
19052069 FUNC_TRACE();
19062070
19072071 /* Check AV feeding is supported */
@@ -1930,6 +2094,10 @@ BOOLEAN bta_av_co_audio_set_codec(const tBTIF_AV_MEDIA_FEEDINGS *p_feeding, tBTI
19302094 }
19312095 new_cfg_aptx.id = A2D_NON_A2DP_MEDIA_CT;
19322096 aptx_config = btif_av_aptx_default_config;
2097+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
2098+ new_cfg_aac.id = BTIF_AV_CODEC_M24;
2099+ aac_config = btif_av_aac_default_config;
2100+#endif
19332101 switch (p_feeding->cfg.pcm.sampling_freq)
19342102 {
19352103 case 8000:
@@ -1940,6 +2108,9 @@ BOOLEAN bta_av_co_audio_set_codec(const tBTIF_AV_MEDIA_FEEDINGS *p_feeding, tBTI
19402108 case 48000:
19412109 sbc_config.samp_freq = A2D_SBC_IE_SAMP_FREQ_48;
19422110 aptx_config.sampleRate = A2D_APTX_SAMPLERATE_48000;
2111+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
2112+ aac_config.samp_freq = A2D_AAC_IE_SAMP_FREQ_48000;
2113+#endif
19432114 break;
19442115
19452116 case 11025:
@@ -1947,6 +2118,9 @@ BOOLEAN bta_av_co_audio_set_codec(const tBTIF_AV_MEDIA_FEEDINGS *p_feeding, tBTI
19472118 case 44100:
19482119 sbc_config.samp_freq = A2D_SBC_IE_SAMP_FREQ_44;
19492120 aptx_config.sampleRate = A2D_APTX_SAMPLERATE_44100;
2121+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
2122+ aac_config.samp_freq = A2D_AAC_IE_SAMP_FREQ_44100;
2123+#endif
19502124 break;
19512125 default:
19522126 APPL_TRACE_ERROR("bta_av_co_audio_set_codec PCM sampling frequency unsupported");
@@ -1964,6 +2138,13 @@ BOOLEAN bta_av_co_audio_set_codec(const tBTIF_AV_MEDIA_FEEDINGS *p_feeding, tBTI
19642138 APPL_TRACE_ERROR("%s A2D_BldAptxInfo failed", __func__);
19652139 return FALSE;
19662140 }
2141+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
2142+ if (A2D_BldAacInfo(A2D_MEDIA_TYPE_AUDIO, &aac_config, new_cfg_aac.info) != A2D_SUCCESS)
2143+ {
2144+ APPL_TRACE_ERROR("%s A2D_BldAacInfo failed", __func__);
2145+ return FALSE;
2146+ }
2147+#endif
19672148 break;
19682149
19692150
@@ -1977,6 +2158,9 @@ BOOLEAN bta_av_co_audio_set_codec(const tBTIF_AV_MEDIA_FEEDINGS *p_feeding, tBTI
19772158 bta_av_co_cb.codec_cfg_sbc = new_cfg_sbc;
19782159 bta_av_co_cb.codec_cfg = &bta_av_co_cb.codec_cfg_sbc;
19792160 bta_av_co_cb.codec_cfg_aptx= new_cfg_aptx;
2161+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
2162+ bta_av_co_cb.codec_cfg_aac = new_cfg_aac;
2163+#endif
19802164
19812165 /* Check all devices support it */
19822166 *p_status = BTIF_SUCCESS;
@@ -2042,6 +2226,9 @@ BOOLEAN bta_av_co_audio_get_codec_config(UINT8 *p_config, UINT16 *p_minmtu, UINT
20422226 tBTA_AV_CO_PEER *p_peer;
20432227 tBTA_AV_CO_SINK *p_sink;
20442228 tA2D_SBC_CIE *sbc_config;
2229+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
2230+ tA2D_AAC_CIE *aac_config;
2231+#endif
20452232
20462233 APPL_TRACE_EVENT("%s codec 0x%x", __func__, bta_av_co_cb.codec_cfg->id);
20472234
@@ -2069,6 +2256,17 @@ BOOLEAN bta_av_co_audio_get_codec_config(UINT8 *p_config, UINT16 *p_minmtu, UINT
20692256 } else {
20702257 APPL_TRACE_DEBUG("%s vendorId: %d codecId: %d\n", __func__, ((tA2D_APTX_CIE *)p_config)->vendorId, ((tA2D_APTX_CIE *)p_config)->codecId);
20712258 }
2259+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
2260+ if (type == BTIF_AV_CODEC_M24)
2261+ {
2262+ APPL_TRACE_DEBUG("%s AAC", __func__);
2263+ aac_config = (tA2D_AAC_CIE *)p_config;
2264+ if (A2D_ParsAacInfo(aac_config, bta_av_co_cb.codec_cfg_aac.info, FALSE) == A2D_SUCCESS)
2265+ result = TRUE;
2266+ else
2267+ memcpy((tA2D_AAC_CIE *) p_config, &btif_av_aac_default_config, sizeof(tA2D_AAC_CIE));
2268+ }
2269+#endif
20722270 for (index = 0; index < BTA_AV_CO_NUM_ELEMENTS(bta_av_co_cb.peers); index++)
20732271 {
20742272 p_peer = &bta_av_co_cb.peers[index];
@@ -2172,6 +2370,60 @@ BOOLEAN bta_av_co_audio_get_sbc_config(tA2D_SBC_CIE *p_sbc_config, UINT16 *p_min
21722370
21732371 return result;
21742372 }
2373+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
2374+/*******************************************************************************
2375+ **
2376+ ** Function bta_av_co_audio_get_aac_config
2377+ **
2378+ ** Description Retrieves the AAC codec configuration. If the codec in use
2379+ ** is not AAC, return the default AAC codec configuration.
2380+ **
2381+ ** Returns TRUE if codec is AAC, FALSE otherwise
2382+ **
2383+ *******************************************************************************/
2384+BOOLEAN bta_av_co_audio_get_aac_config(tA2D_AAC_CIE *p_aac_config, UINT16 *p_minmtu)
2385+{
2386+ BOOLEAN result = FALSE;
2387+ UINT8 index;
2388+ tBTA_AV_CO_PEER *p_peer;
2389+
2390+ APPL_TRACE_EVENT("bta_av_co_cb.codec_cfg->id : codec 0x%x", bta_av_co_cb.codec_cfg->id);
2391+
2392+ /* Minimum MTU is by default very large */
2393+ *p_minmtu = 0xFFFF;
2394+
2395+ mutex_global_lock();
2396+ if (bta_av_co_cb.codec_cfg->id == BTIF_AV_CODEC_M24)
2397+ {
2398+ if (A2D_ParsAacInfo(p_aac_config, bta_av_co_cb.codec_cfg->info, FALSE) == A2D_SUCCESS)
2399+ {
2400+ for (index = 0; index < BTA_AV_CO_NUM_ELEMENTS(bta_av_co_cb.peers); index++)
2401+ {
2402+ p_peer = &bta_av_co_cb.peers[index];
2403+ if (p_peer->opened)
2404+ {
2405+ APPL_TRACE_EVENT("%s on index= %d", __func__, index);
2406+ if (p_peer->mtu < *p_minmtu)
2407+ {
2408+ *p_minmtu = p_peer->mtu;
2409+ }
2410+ }
2411+ }
2412+ result = TRUE;
2413+ }
2414+ }
2415+
2416+ if (!result)
2417+ {
2418+ /* Not AAC, still return the default values */
2419+ APPL_TRACE_EVENT("%s Not SBC, still return the default values", __func__);
2420+ *p_aac_config = btif_av_aac_default_config;
2421+ }
2422+ mutex_global_unlock();
2423+
2424+ return result;
2425+}
2426+#endif
21752427
21762428 /*******************************************************************************
21772429 **
--- a/btif/include/btif_av_api.h
+++ b/btif/include/btif_av_api.h
@@ -51,7 +51,7 @@
5151 /* Codec type */
5252 #define BTIF_AV_CODEC_NONE 0xF1
5353 #define BTIF_AV_CODEC_SBC A2D_MEDIA_CT_SBC /* SBC media codec type */
54-
54+#define BTIF_AV_CODEC_M24 A2D_MEDIA_CT_M24 /* AAC media codec type */
5555 #define BTIF_AV_CODEC_PCM 0x5 /* Raw PCM */
5656
5757 typedef UINT8 tBTIF_AV_CODEC_ID;
--- a/btif/include/btif_av_co.h
+++ b/btif/include/btif_av_co.h
@@ -30,7 +30,6 @@
3030 /*******************************************************************************
3131 ** Constants & Macros
3232 ********************************************************************************/
33-
3433 /*******************************************************************************
3534 ** Functions
3635 ********************************************************************************/
@@ -154,6 +153,20 @@ BOOLEAN bta_av_co_audio_get_codec_config(UINT8 *p_sbc_config, UINT16 *p_minmtu,
154153 **
155154 *******************************************************************************/
156155 BOOLEAN bta_av_co_audio_get_sbc_config(tA2D_SBC_CIE *p_sbc_config, UINT16 *p_minmtu);
156+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
157+/*******************************************************************************
158+ **
159+ ** Function bta_av_co_audio_get_aac_config
160+ **
161+ ** Description Retrieves the AAC codec configuration. If the codec in use
162+ ** is not AAC, return the default SBC codec configuration.
163+ **
164+ ** Returns TRUE if codec is AAC, FALSE otherwise
165+ **
166+ *******************************************************************************/
167+BOOLEAN bta_av_co_audio_get_aac_config(tA2D_AAC_CIE *p_aac_config, UINT16 *p_minmtu);
168+#endif
169+
157170
158171 /*******************************************************************************
159172 **
--- a/btif/include/btif_media.h
+++ b/btif/include/btif_media.h
@@ -39,6 +39,7 @@
3939 #include "bt_common.h"
4040 #include "btif_av_api.h"
4141 #include "audio_a2dp_hw.h"
42+#include "a2d_aac.h"
4243
4344 /*******************************************************************************
4445 ** Constants
@@ -83,6 +84,11 @@ typedef struct
8384 UINT8 CodecType; /* SBC or Non-A2DP */
8485 UINT8 BluetoothVendorID; /* Bluetooth Vendor ID */
8586 UINT8 BluetoothCodecID; /* Bluetooth Codec ID */
87+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
88+ UINT8 ObjectType;
89+ UINT32 bit_rate;
90+ UINT8 vbr;
91+#endif
8692 } tBTIF_MEDIA_INIT_AUDIO;
8793
8894 #if (BTA_AV_INCLUDED == TRUE)
--- a/btif/src/btif_media_task.c
+++ b/btif/src/btif_media_task.c
@@ -61,12 +61,14 @@
6161 #include "a2d_int.h"
6262 #include "a2d_sbc.h"
6363 #include "a2d_aptx.h"
64+#include "a2d_aac.h"
6465 #include "audio_a2dp_hw.h"
6566 #include "bt_target.h"
6667 #include "bta_api.h"
6768 #include "bta_av_api.h"
6869 #include "bta_av_ci.h"
6970 #include "bta_av_sbc.h"
71+#include "bta_av_aac.h"
7072 #include "bta_sys.h"
7173 #include "bta_sys_int.h"
7274 #include "btif_av.h"
@@ -184,6 +186,12 @@ enum {
184186 #endif
185187
186188 #if (BTA_AV_CO_CP_SCMS_T == TRUE)
189+#define BTIF_MEDIA_AA_AAC_OFFSET (AVDT_MEDIA_OFFSET + BTA_AV_AAC_HDR_SIZE + 1)
190+#else
191+#define BTIF_MEDIA_AA_AAC_OFFSET (AVDT_MEDIA_OFFSET + BTA_AV_AAC_HDR_SIZE)
192+#endif
193+
194+#if (BTA_AV_CO_CP_SCMS_T == TRUE)
187195 #define BTIF_MEDIA_AA_APTX_OFFSET (AVDT_MEDIA_OFFSET + 1)
188196 #else
189197 #define BTIF_MEDIA_AA_APTX_OFFSET (AVDT_MEDIA_OFFSET - AVDT_MEDIA_HDR_SIZE) //no RTP header for aptX classic
@@ -899,6 +907,14 @@ static void btif_recv_ctrl_data(void)
899907 A2D_BldSbcInfo(AVDT_MEDIA_AUDIO,&codec_cfg,&param[1]);
900908 bitrate = btif_media_cb.encoder.u16BitRate * 1000;
901909 }
910+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
911+ else if (codec_id == BTIF_AV_CODEC_M24) {
912+ tA2D_AAC_CIE aac_cfg;
913+ bta_av_co_audio_get_aac_config(&aac_cfg, &min_mtu);
914+ A2D_BldAacInfo(AVDT_MEDIA_AUDIO,&aac_cfg,&param[1]);
915+ bitrate = btif_media_cb.encoder.u16BitRate * 1000;
916+ }
917+#endif
902918 else if (codec_id == A2D_NON_A2DP_MEDIA_CT) //this is changed to non-a2dp VS codec
903919 {
904920 //ADD APTX support
@@ -913,7 +929,7 @@ static void btif_recv_ctrl_data(void)
913929 {
914930 tA2D_APTX_CIE* codecInfo = 0;
915931 codecInfo = (tA2D_APTX_CIE*) &ptr[3];
916- if (codecInfo && codecInfo->vendorId == A2D_APTX_VENDOR_ID
932+ if (codecInfo && codecInfo->vendorId == A2D_APTX_VENDOR_ID
917933 && codecInfo->codecId == A2D_APTX_CODEC_ID_BLUETOOTH)
918934 {
919935 tA2D_APTX_CIE aptx_config;
@@ -1116,7 +1132,9 @@ static void btif_a2dp_encoder_init(tBTA_AV_HNDL hdl)
11161132 tBTIF_MEDIA_INIT_AUDIO msg;
11171133 tA2D_SBC_CIE sbc_config;
11181134 tA2D_APTX_CIE* codecInfo = 0;
1119-
1135+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
1136+ tA2D_AAC_CIE aac_config;
1137+#endif
11201138 /* lookup table for converting channel mode */
11211139 UINT16 codec_mode_tbl[5] = { SBC_JOINT_STEREO, SBC_STEREO, SBC_DUAL, 0, SBC_MONO };
11221140
@@ -1169,6 +1187,22 @@ static void btif_a2dp_encoder_init(tBTA_AV_HNDL hdl)
11691187 }
11701188 }/* if ( A2D_NON_A2DP_MEDIA_CT == codectype) */
11711189
1190+
1191+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
1192+ if (BTIF_AV_CODEC_M24 == codectype) {
1193+ ALOGI("%s Selected Codec AAC", __func__);
1194+ bta_av_co_audio_get_codec_config ((UINT8*)&aac_config, &minmtu, BTIF_AV_CODEC_M24);
1195+ msg.ObjectType = aac_config.object_type;
1196+ msg.ChannelMode = (aac_config.channels == A2D_AAC_IE_CHANNELS_2) ? SBC_STEREO : SBC_MONO;
1197+ msg.SamplingFreq = freq_block_tbl[aac_config.samp_freq >> 5];
1198+ msg.MtuSize = minmtu;
1199+ msg.CodecType = BTIF_AV_CODEC_M24;
1200+ msg.bit_rate = aac_config.bit_rate;
1201+ btif_media_task_enc_init_req(&msg);
1202+ return;
1203+ }
1204+#endif
1205+
11721206 ALOGI("%s Selected Codec SBC", __func__);
11731207
11741208 /* Retrieve the current SBC configuration (default if currently not used) */
@@ -1191,6 +1225,9 @@ static void btif_a2dp_encoder_update(void)
11911225 {
11921226 UINT16 minmtu = 0;
11931227 tA2D_SBC_CIE sbc_config;
1228+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
1229+ tA2D_AAC_CIE aac_config;
1230+#endif
11941231 tBTIF_MEDIA_UPDATE_AUDIO msg;
11951232 UINT8 pref_min;
11961233 UINT8 pref_max;
@@ -1218,7 +1255,17 @@ static void btif_a2dp_encoder_update(void)
12181255 msg.BluetoothCodecID = aptx_config.codecId;
12191256 }
12201257 } /* if (ptr) */
1221- } else {
1258+ }
1259+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
1260+ else if (codectype == BTIF_AV_CODEC_M24) {
1261+ bta_av_co_audio_get_aac_config(&aac_config, &minmtu);
1262+
1263+ APPL_TRACE_DEBUG("btif_a2dp_encoder_update: AAC object_type :%d channels :%d",
1264+ aac_config.object_type, aac_config.channels);
1265+ msg.CodecType = BTIF_AV_CODEC_M24;
1266+ }
1267+#endif
1268+ else {
12221269
12231270 /* Retrieve the current SBC configuration (default if currently not used) */
12241271 bta_av_co_audio_get_sbc_config(&sbc_config, &minmtu);
@@ -2464,7 +2511,16 @@ static void btif_media_task_enc_init(BT_HDR *p_msg)
24642511 /* do nothing, fall through to SBC */
24652512 }
24662513 }
2467-
2514+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
2515+ else if (pInitAudio->CodecType == BTIF_AV_CODEC_M24) {
2516+ /*AAC is supported only in split mode, so only update the
2517+ required MTU size for AAC to send down to FW via VSC*/
2518+ btif_media_cb.TxAaMtuSize = ((BTIF_MEDIA_AA_BUF_SIZE-BTIF_MEDIA_AA_AAC_OFFSET-sizeof(BT_HDR))
2519+ < pInitAudio->MtuSize) ? (BTIF_MEDIA_AA_BUF_SIZE - BTIF_MEDIA_AA_AAC_OFFSET
2520+ - sizeof(BT_HDR)) : pInitAudio->MtuSize;
2521+ return;
2522+ }
2523+#endif
24682524 /* SBC encoder config (enforced even if not used) */
24692525 btif_media_cb.encoder.s16ChannelMode = pInitAudio->ChannelMode;
24702526 btif_media_cb.encoder.s16NumOfSubBands = pInitAudio->NumOfSubBands;
@@ -2541,6 +2597,17 @@ static void btif_media_task_enc_update(BT_HDR *p_msg)
25412597 /* do nothing, fall through to SBC */
25422598 }
25432599 }
2600+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
2601+ else if (pUpdateAudio->CodecType == BTIF_AV_CODEC_M24) {
2602+ APPL_TRACE_EVENT("%s AAC" , __func__);
2603+ btif_media_cb.TxAaMtuSize = ((BTIF_MEDIA_AA_BUF_SIZE -
2604+ BTIF_MEDIA_AA_AAC_OFFSET - sizeof(BT_HDR))
2605+ < pUpdateAudio->MinMtuSize) ? (BTIF_MEDIA_AA_BUF_SIZE - BTIF_MEDIA_AA_AAC_OFFSET
2606+ - sizeof(BT_HDR)) : pUpdateAudio->MinMtuSize;
2607+ return;
2608+ }
2609+#endif
2610+ else
25442611 {
25452612 if (!pstrEncParams->s16NumOfSubBands)
25462613 {
@@ -2887,6 +2954,7 @@ static void btif_media_task_audio_feeding_init(BT_HDR *p_msg)
28872954 }
28882955 }
28892956 }
2957+
28902958 btif_media_cb.TxTranscoding = BTIF_MEDIA_TRSCD_PCM_2_SBC;
28912959 btif_media_task_pcm2sbc_init(p_feeding);
28922960 break;
--- a/include/bt_target.h
+++ b/include/bt_target.h
@@ -175,6 +175,11 @@
175175 #define HL_INCLUDED TRUE
176176 #endif
177177
178+#ifndef AAC_ENCODER_INCLUDED
179+#define AAC_ENCODER_INCLUDED TRUE
180+#endif
181+
182+
178183 #ifndef AG_VOICE_SETTINGS
179184 #define AG_VOICE_SETTINGS HCI_DEFAULT_VOICE_SETTINGS
180185 #endif
@@ -1204,8 +1209,12 @@
12041209 * Audio*2 + Video*2 + 1 Additional
12051210 */
12061211 #ifndef AVDT_NUM_SEPS
1212+#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE)
1213+#define AVDT_NUM_SEPS 7
1214+#else
12071215 #define AVDT_NUM_SEPS 5
12081216 #endif
1217+#endif
12091218
12101219 /* Number of transport channels setup by AVDT for all media streams */
12111220 #ifndef AVDT_NUM_TC_TBL
@@ -1405,6 +1414,10 @@
14051414 #define A2D_INCLUDED TRUE
14061415 #endif
14071416
1417+#ifndef A2D_M24_INCLUDED
1418+#define A2D_M24_INCLUDED A2D_INCLUDED
1419+#endif
1420+
14081421 /******************************************************************************
14091422 **
14101423 ** AVCTP
--- a/stack/Android.mk
+++ b/stack/Android.mk
@@ -39,6 +39,7 @@ LOCAL_SRC_FILES:= \
3939 ./a2dp/a2d_api.c \
4040 ./a2dp/a2d_sbc.c \
4141 ./a2dp/a2d_aptx.c \
42+ ./a2dp/a2d_aac.c \
4243 ./avrc/avrc_api.c \
4344 ./avrc/avrc_sdp.c \
4445 ./avrc/avrc_opt.c \
--- /dev/null
+++ b/stack/a2dp/a2d_aac.c
@@ -0,0 +1,175 @@
1+/******************************************************************************
2+ *
3+ * Copyright (c) 2016, The Linux Foundation. All rights reserved.
4+ *
5+ * Redistribution and use in source and binary forms, with or without
6+ * modification, are permitted provided that the following conditions are
7+ * met:
8+ * * Redistributions of source code must retain the above copyright
9+ * notice, this list of conditions and the following disclaimer.
10+ * * Redistributions in binary form must reproduce the above
11+ * copyright notice, this list of conditions and the following
12+ * disclaimer in the documentation and/or other materials provided
13+ * with the distribution.
14+ * * Neither the name of The Linux Foundation nor the names of its
15+ * contributors may be used to endorse or promote products derived
16+ * from this software without specific prior written permission.
17+ *
18+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
19+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
20+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
21+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
22+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
25+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
27+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
28+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29+ *
30+ ******************************************************************************/
31+/******************************************************************************
32+ *
33+ * Utility functions to help build and parse AAC Codec Information
34+ *
35+ ******************************************************************************/
36+
37+#include "bt_target.h"
38+#include <string.h>
39+#include "a2d_api.h"
40+#include "a2d_int.h"
41+#include "a2d_aac.h"
42+#include "bt_utils.h"
43+
44+#if (A2D_M24_INCLUDED == TRUE)
45+static UINT8 A2D_UINT32_BitsSet(UINT32 num);
46+/******************************************************************************
47+**
48+** Function A2D_BldAacInfo
49+**
50+** Description This function builds byte sequence for
51+** Aac Codec Capabilities.
52+** Input : media_type: Audio or MultiMedia.
53+** p_ie: AAC Codec Information Element
54+**
55+** Output : p_result: codec info.
56+**
57+** Returns A2D_SUCCESS if successful.
58+** Error otherwise.
59+******************************************************************************/
60+tA2D_STATUS A2D_BldAacInfo(UINT8 media_type, tA2D_AAC_CIE *p_ie, UINT8 *p_result)
61+{
62+ tA2D_STATUS status;
63+ if( p_ie == NULL || p_result == NULL ||
64+ (p_ie->object_type & ~A2D_AAC_IE_OBJ_TYPE_MSK) ||
65+ (p_ie->samp_freq & ~A2D_AAC_IE_SAMP_FREQ_MSK) ||
66+ (p_ie->channels & ~A2D_AAC_IE_CHANNELS_MSK) ||
67+ (p_ie->bit_rate & ~A2D_AAC_IE_BIT_RATE_MSK) ||
68+ (p_ie->vbr & ~A2D_AAC_IE_VBR_MSK) )
69+ {
70+ /* return invalid params if invalid bit is set */
71+ status = A2D_INVALID_PARAMS;
72+ }
73+ else
74+ {
75+ status = A2D_SUCCESS;
76+ *p_result++ = A2D_AAC_INFO_LEN;
77+ *p_result++ = media_type;
78+ *p_result++ = A2D_MEDIA_CT_M24;
79+
80+ /* Codec information */
81+ *p_result++ = p_ie->object_type; // object type
82+
83+ *p_result++ = (UINT8)(p_ie->samp_freq >> 8);
84+
85+ *p_result++ = (p_ie->samp_freq & 0x00F0)|p_ie->channels;
86+ *p_result++ = p_ie->vbr | ((p_ie->bit_rate >> 16)& 0x007F);
87+ *p_result++ = (p_ie->bit_rate >> 8)& 0x00FF;
88+ *p_result = p_ie->bit_rate & 0x000000FF;
89+ }
90+ return status;
91+}
92+
93+/******************************************************************************
94+**
95+** Function A2D_ParsAacInfo
96+**
97+** Description This function parse byte sequence for
98+** Aac Codec Capabilities.
99+** Input : p_info: input byte sequence.
100+** for_caps: True for getcap, false otherwise
101+**
102+** Output : p_ie: Aac codec information.
103+**
104+** Returns A2D_SUCCESS if successful.
105+** Error otherwise.
106+******************************************************************************/
107+tA2D_STATUS A2D_ParsAacInfo(tA2D_AAC_CIE *p_ie, UINT8 *p_info, BOOLEAN for_caps)
108+{
109+ tA2D_STATUS status;
110+ UINT8 losc;
111+ UINT8 media_type;
112+
113+ if( p_ie == NULL || p_info == NULL)
114+ status = A2D_INVALID_PARAMS;
115+ else
116+ {
117+ losc = *p_info++;
118+ media_type = *p_info++;
119+ /* Check for wrong length, media type */
120+ if(losc != A2D_AAC_INFO_LEN || *p_info != A2D_MEDIA_CT_M24)
121+ status = A2D_WRONG_CODEC;
122+ else
123+ {
124+ p_info++;
125+ /* obj type */
126+ p_ie->object_type = *p_info & A2D_AAC_IE_OBJ_TYPE_MSK; p_info++;
127+ /* samping freq */
128+ p_ie->samp_freq = *p_info; p_info++;
129+ p_ie->samp_freq = p_ie->samp_freq << 8;
130+ p_ie->samp_freq |= (*p_info & 0xF0);
131+ /* channels */
132+ p_ie->channels = *p_info & A2D_AAC_IE_CHANNELS_MSK; p_info++;
133+ /* variable bit rate */
134+ p_ie->vbr = *p_info & A2D_AAC_IE_VBR_MSK;
135+ /* bit rate */
136+ p_ie->bit_rate = *p_info & 0x7F;p_ie->bit_rate = p_ie->bit_rate << 8; p_info++;
137+ p_ie->bit_rate |= *p_info;p_ie->bit_rate = p_ie->bit_rate << 8; p_info++;
138+ p_ie->bit_rate |= *p_info;
139+ status = A2D_SUCCESS;
140+
141+ if(for_caps == FALSE)
142+ {
143+ if(A2D_UINT32_BitsSet(p_ie->object_type) != A2D_SET_ONE_BIT)
144+ status = A2D_BAD_OBJ_TYPE;
145+ if(A2D_UINT32_BitsSet(p_ie->samp_freq) != A2D_SET_ONE_BIT)
146+ status = A2D_BAD_SAMP_FREQ;
147+ if(A2D_UINT32_BitsSet(p_ie->channels) != A2D_SET_ONE_BIT)
148+ status = A2D_BAD_CHANNEL;
149+ }
150+ }
151+ }
152+ return status;
153+}
154+/******************************************************************************
155+** Function A2D_UINT32_BitsSet
156+**
157+** Description Check the given number of 32bit for the number of bits set
158+** Returns A2D_SET_ONE_BIT, if one and only one bit is set
159+** A2D_SET_ZERO_BIT, if all bits clear
160+** A2D_SET_MULTL_BIT, if multiple bits are set
161+******************************************************************************/
162+static UINT8 A2D_UINT32_BitsSet(UINT32 num)
163+{
164+ UINT8 count;
165+ BOOLEAN res;
166+ if(num == 0)
167+ res = A2D_SET_ZERO_BIT;
168+ else
169+ {
170+ count = (num & (num - 1));
171+ res = ((count==0)?A2D_SET_ONE_BIT:A2D_SET_MULTL_BIT);
172+ }
173+ return res;
174+}
175+#endif /* A2D_M24_INCLUDED == TRUE */
--- /dev/null
+++ b/stack/include/a2d_aac.h
@@ -0,0 +1,149 @@
1+/******************************************************************************
2+ *
3+ * Copyright (c) 2016, The Linux Foundation. All rights reserved.
4+ *
5+ * Redistribution and use in source and binary forms, with or without
6+ * modification, are permitted provided that the following conditions are
7+ * met:
8+ * * Redistributions of source code must retain the above copyright
9+ * notice, this list of conditions and the following disclaimer.
10+ * * Redistributions in binary form must reproduce the above
11+ * copyright notice, this list of conditions and the following
12+ * disclaimer in the documentation and/or other materials provided
13+ * with the distribution.
14+ * * Neither the name of The Linux Foundation nor the names of its
15+ * contributors may be used to endorse or promote products derived
16+ * from this software without specific prior written permission.
17+ *
18+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
19+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
20+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
21+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
22+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
25+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
27+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
28+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29+ *
30+ ******************************************************************************/
31+
32+#ifndef A2D_AAC_H
33+#define A2D_AAC_H
34+
35+/*****************************************************************************
36+** Constants
37+*****************************************************************************/
38+
39+#define A2D_AAC_MPL_HDR_LEN 1
40+
41+/* AAC media codec capabilitiy len*/
42+#define A2D_AAC_INFO_LEN 8
43+
44+/* AAC Codec Specific */
45+#define A2D_AAC_IE_OBJ_TYPE_MSK 0xF0 /* b7-b4 Object Type */
46+#define A2D_AAC_IE_OBJ_TYPE_MPEG_2_AAC_LC 0x80 /* b7:MPEG-2 AAC LC */
47+#define A2D_AAC_IE_OBJ_TYPE_MPEG_4_AAC_LC 0x40 /* b7:MPEG-4 AAC LC */
48+#define A2D_AAC_IE_OBJ_TYPE_MPEG_4_AAC_LTP 0x20 /* b7:MPEG-4 AAC LTP */
49+#define A2D_AAC_IE_OBJ_TYPE_MPEG_4_AAC_SCA 0x10 /* b7:MPEG-4 AAC SCALABLE */
50+
51+#define A2D_AAC_IE_SAMP_FREQ_MSK 0xFFF0 /* b15-b4 sampling frequency */
52+#define A2D_AAC_IE_SAMP_FREQ_8000 0x8000 /* b15: 8000 */
53+#define A2D_AAC_IE_SAMP_FREQ_11025 0x4000 /* b15: 11025 */
54+#define A2D_AAC_IE_SAMP_FREQ_12000 0x2000 /* b15: 12000 */
55+#define A2D_AAC_IE_SAMP_FREQ_16000 0x1000 /* b15: 16000 */
56+#define A2D_AAC_IE_SAMP_FREQ_22050 0x0800 /* b15: 22050 */
57+#define A2D_AAC_IE_SAMP_FREQ_24000 0x0400 /* b15: 24000 */
58+#define A2D_AAC_IE_SAMP_FREQ_32000 0x0200 /* b15: 32000 */
59+#define A2D_AAC_IE_SAMP_FREQ_44100 0x0100 /* b15: 441000 */
60+#define A2D_AAC_IE_SAMP_FREQ_48000 0x0080 /* b15: 48000 */
61+#define A2D_AAC_IE_SAMP_FREQ_64000 0x0040 /* b15: 64000 */
62+#define A2D_AAC_IE_SAMP_FREQ_88200 0x0020 /* b15: 88200 */
63+#define A2D_AAC_IE_SAMP_FREQ_96000 0x0010 /* b15: 96000 */
64+
65+
66+#define A2D_AAC_IE_CHANNELS_MSK 0x0C /* b7-b6 channels supported */
67+#define A2D_AAC_IE_CHANNELS_1 0x08 /* Channel 1 */
68+#define A2D_AAC_IE_CHANNELS_2 0x04 /* Channel 2 */
69+
70+#define A2D_AAC_IE_VBR_MSK 0x80 /* b7 variable bit rate */
71+#define A2D_AAC_IE_VBR_SUPP 0x80 /* supported */
72+#define A2D_AAC_IE_VBR_NOT_SUPP 0x00 /* supported */
73+
74+#define A2D_AAC_IE_BIT_RATE_MSK 0x007FFFFF /* bit rate */
75+#define A2D_AAC_IE_BIT_RATE 0x007FFFFF
76+
77+
78+#define BTIF_AAC_DEFAULT_BIT_RATE 0x000409B6
79+
80+typedef struct {
81+ INT16 s16SamplingFreq; /* 16k, 32k, 44.1k or 48k*/
82+ INT16 s16ChannelMode; /* mono, dual, streo or joint streo*/
83+ UINT16 u16BitRate;
84+ UINT16 *ps16NextPcmBuffer;
85+ UINT8 *pu8Packet;
86+ UINT8 *pu8NextPacket;
87+ UINT16 u16PacketLength;
88+ void* encoder;
89+} A2D_AAC_ENC_PARAMS;
90+
91+/*****************************************************************************
92+** Type Definitions
93+*****************************************************************************/
94+
95+/* AAC Codec Information data type */
96+typedef struct
97+{
98+ UINT8 object_type; /* Object Type */
99+ UINT16 samp_freq; /* Sampling Frequency */
100+ UINT8 channels; /* Channels */
101+ UINT32 bit_rate; /* bit_rate */
102+ UINT8 vbr; /* variable bit rate */
103+} tA2D_AAC_CIE;
104+
105+
106+/*****************************************************************************
107+** External Function Declarations
108+*****************************************************************************/
109+#ifdef __cplusplus
110+extern "C"
111+{
112+#endif
113+/******************************************************************************
114+**
115+** Function A2D_BldAacInfo
116+**
117+** Description This function builds byte sequence for
118+** Aac Codec Capabilities.
119+** Input : media_type: Audio or MultiMedia.
120+** p_ie: AAC Codec Information Element
121+**
122+** Output : p_result: codec info.
123+**
124+** Returns A2D_SUCCESS if successful.
125+** Error otherwise.
126+******************************************************************************/
127+extern tA2D_STATUS A2D_BldAacInfo(UINT8 media_type, tA2D_AAC_CIE *p_ie, UINT8 *p_result);
128+
129+/******************************************************************************
130+**
131+** Function A2D_ParsAacInfo
132+**
133+** Description This function parse byte sequence for
134+** Aac Codec Capabilities.
135+** Input : p_info: input byte sequence.
136+** for_caps: True for getcap, false otherwise
137+**
138+** Output : p_ie: Aac codec information.
139+**
140+** Returns A2D_SUCCESS if successful.
141+** Error otherwise.
142+******************************************************************************/
143+extern tA2D_STATUS A2D_ParsAacInfo(tA2D_AAC_CIE *p_ie, UINT8 *p_info, BOOLEAN for_caps);
144+
145+#ifdef __cplusplus
146+}
147+#endif
148+
149+#endif /* A2D_AAC_H */