system/bt
修訂 | 79f4e57290c78f087718dce8fcd2999267a79a3c (tree) |
---|---|
時間 | 2016-09-17 04:31:13 |
作者 | Bhakthavatsala Raghavendra <braghave@code...> |
Commiter | Bhakthavatsala Raghavendra |
Bluetooth: Add AAC codec Support in Split-a2dp mode
Add AAC codec support in split-a2dp mode
Change-Id: I174b0c44cdef8b5d174a2e39fa34fefc55d4807b
@@ -89,6 +89,7 @@ struct a2dp_stream_common audio_stream; | ||
89 | 89 | |
90 | 90 | audio_sbc_encoder_config sbc_codec; |
91 | 91 | audio_aptx_encoder_config aptx_codec; |
92 | +audio_aac_encoder_config aac_codec; | |
92 | 93 | /***************************************************************************** |
93 | 94 | ** Externs |
94 | 95 | ******************************************************************************/ |
@@ -269,8 +270,105 @@ static void* a2dp_codec_parser(uint8_t *codec_cfg, audio_format_t *codec_type) | ||
269 | 270 | sbc_codec.bitrate |= (*p_cfg++ << 16); |
270 | 271 | sbc_codec.bitrate |= (*p_cfg++ << 24); |
271 | 272 | *codec_type = AUDIO_FORMAT_SBC; |
272 | - INFO("Done copying full codec config"); | |
273 | + INFO("SBC: Done copying full codec config"); | |
273 | 274 | 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)); | |
274 | 372 | } |
275 | 373 | else if (codec_cfg[CODEC_OFFSET] == NON_A2DP_CODEC_TYPE) |
276 | 374 | { |
@@ -332,6 +430,8 @@ static void* a2dp_codec_parser(uint8_t *codec_cfg, audio_format_t *codec_type) | ||
332 | 430 | aptx_codec.bitrate |= (*p_cfg++ << 8); |
333 | 431 | aptx_codec.bitrate |= (*p_cfg++ << 16); |
334 | 432 | aptx_codec.bitrate |= (*p_cfg++ << 24); |
433 | + | |
434 | + INFO("APTx: Done copying full codec config"); | |
335 | 435 | return ((void *)&aptx_codec); |
336 | 436 | } |
337 | 437 | return NULL; |
@@ -933,7 +1033,7 @@ int audio_stop_stream() | ||
933 | 1033 | return 0; |
934 | 1034 | } |
935 | 1035 | audio_stream.state = AUDIO_A2DP_STATE_STOPPED; |
936 | - return -1; | |
1036 | + return -1; | |
937 | 1037 | } |
938 | 1038 | |
939 | 1039 | int audio_suspend_stream() |
@@ -101,6 +101,20 @@ codec specific definitions | ||
101 | 101 | #define A2D_APTX_CHAN_STEREO 0x02 |
102 | 102 | #define A2D_APTX_CHAN_MONO 0x01 |
103 | 103 | |
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 | + | |
104 | 118 | typedef struct { |
105 | 119 | uint8_t codec_type; |
106 | 120 | uint8_t dev_idx; |
@@ -57,6 +57,7 @@ LOCAL_SRC_FILES:= \ | ||
57 | 57 | ./av/bta_av_cfg.c \ |
58 | 58 | ./av/bta_av_ssm.c \ |
59 | 59 | ./av/bta_av_sbc.c \ |
60 | + ./av/bta_av_aac.c \ | |
60 | 61 | ./ar/bta_ar.c \ |
61 | 62 | ./hl/bta_hl_act.c \ |
62 | 63 | ./hl/bta_hl_api.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 | + |
@@ -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 | + |
@@ -109,8 +109,12 @@ typedef UINT8 tBTA_AV_HNDL; | ||
109 | 109 | #endif |
110 | 110 | |
111 | 111 | #ifndef BTA_AV_MAX_SEPS |
112 | +#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE) | |
113 | +#define BTA_AV_MAX_SEPS 3 | |
114 | +#else | |
112 | 115 | #define BTA_AV_MAX_SEPS 2 |
113 | 116 | #endif |
117 | +#endif | |
114 | 118 | |
115 | 119 | #ifndef BTA_AV_MAX_A2DP_MTU |
116 | 120 | /*#define BTA_AV_MAX_A2DP_MTU 668 //224 (DM5) * 3 - 4(L2CAP header) */ |
@@ -63,6 +63,9 @@ enum | ||
63 | 63 | { |
64 | 64 | BTIF_SV_AV_AA_SBC_INDEX = 0, |
65 | 65 | 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 | |
66 | 69 | BTIF_SV_AV_AA_SRC_SEP_INDEX /* Last index */ |
67 | 70 | }; |
68 | 71 |
@@ -45,6 +45,10 @@ | ||
45 | 45 | |
46 | 46 | #include "bt_utils.h" |
47 | 47 | #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 | |
48 | 52 | |
49 | 53 | /***************************************************************************** |
50 | 54 | ** Constants |
@@ -160,6 +164,36 @@ const tA2D_APTX_CIE btif_av_aptx_default_config = | ||
160 | 164 | A2D_APTX_FUTURE_2 |
161 | 165 | }; |
162 | 166 | |
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 | + | |
163 | 197 | /***************************************************************************** |
164 | 198 | ** Local data |
165 | 199 | *****************************************************************************/ |
@@ -216,6 +250,10 @@ typedef struct | ||
216 | 250 | tBTIF_AV_CODEC_INFO codec_cfg_sbc_setconfig; /* remote peer setconfig preference (SBC) */ |
217 | 251 | tBTIF_AV_CODEC_INFO codec_cfg_aptx; |
218 | 252 | 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 | |
219 | 257 | tBTA_AV_CO_CP cp; |
220 | 258 | } tBTA_AV_CO_CB; |
221 | 259 |
@@ -380,7 +418,13 @@ BOOLEAN bta_av_co_audio_init(UINT8 *p_codec_type, UINT8 *p_codec_info, UINT8 *p_ | ||
380 | 418 | *p_codec_type = A2D_NON_A2DP_MEDIA_CT; |
381 | 419 | A2D_BldAptxInfo(AVDT_MEDIA_AUDIO, (tA2D_APTX_CIE *) &bta_av_co_aptx_caps, p_codec_info); |
382 | 420 | 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 | |
384 | 428 | #if (BTA_AV_SINK_INCLUDED == TRUE) |
385 | 429 | case BTIF_SV_AV_AA_SBC_SINK_INDEX: |
386 | 430 | *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, | ||
707 | 751 | } |
708 | 752 | break; |
709 | 753 | } |
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 | |
710 | 760 | default: |
711 | 761 | break; |
712 | 762 | } |
@@ -977,7 +1027,17 @@ void bta_av_co_audio_setconfig(tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type, | ||
977 | 1027 | } |
978 | 1028 | break; |
979 | 1029 | } |
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; | |
980 | 1037 | |
1038 | + APPL_TRACE_DEBUG("%s codec_type = %x", __func__, codec_type); | |
1039 | + } break; | |
1040 | +#endif | |
981 | 1041 | default: |
982 | 1042 | APPL_TRACE_ERROR("bta_av_co_audio_setconfig unsupported cid %d", bta_av_co_cb.codec_cfg->id); |
983 | 1043 | recfg_needed = TRUE; |
@@ -1259,7 +1319,14 @@ static BOOLEAN bta_av_co_audio_codec_build_config(const UINT8 *p_codec_caps, UIN | ||
1259 | 1319 | p_codec_cfg[BTA_AV_CO_SBC_MIN_BITPOOL_OFF], |
1260 | 1320 | p_codec_caps[BTA_AV_CO_SBC_MAX_BITPOOL_OFF]); |
1261 | 1321 | 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 | |
1263 | 1330 | case A2D_NON_A2DP_MEDIA_CT: |
1264 | 1331 | { |
1265 | 1332 | UINT16 codecId; |
@@ -1317,6 +1384,37 @@ static BOOLEAN bta_av_co_audio_codec_cfg_matches_caps(UINT8 codec_id, const UINT | ||
1317 | 1384 | return FALSE; |
1318 | 1385 | } |
1319 | 1386 | 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 | |
1320 | 1418 | case A2D_NON_A2DP_MEDIA_CT: |
1321 | 1419 | { |
1322 | 1420 | UINT16 codecId; |
@@ -1379,6 +1477,11 @@ static BOOLEAN bta_av_co_audio_codec_match(const UINT8 *p_codec_caps, UINT8 code | ||
1379 | 1477 | case BTIF_AV_CODEC_SBC: |
1380 | 1478 | 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); |
1381 | 1479 | 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 | |
1382 | 1485 | case A2D_NON_A2DP_MEDIA_CT: |
1383 | 1486 | { |
1384 | 1487 | UINT16 codecId; |
@@ -1582,6 +1685,46 @@ static BOOLEAN bta_av_co_audio_peer_supports_codec(tBTA_AV_CO_PEER *p_peer, UINT | ||
1582 | 1685 | } else |
1583 | 1686 | APPL_TRACE_DEBUG("%s aptX is disabled", __func__); |
1584 | 1687 | |
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 | + | |
1585 | 1728 | for (index = 0; index < p_peer->num_sup_snks; index++) |
1586 | 1729 | { |
1587 | 1730 | 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 | ||
1720 | 1863 | return FALSE; |
1721 | 1864 | } |
1722 | 1865 | 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 | |
1723 | 1875 | case A2D_NON_A2DP_MEDIA_CT: |
1724 | 1876 | aptx_capabilities = &(((tBTA_AV_CO_SINK*)p_codec_cfg)->codec_caps[0]); |
1725 | 1877 | codecId = ((tA2D_APTX_CIE*)(aptx_capabilities))->codecId; |
@@ -1876,7 +2028,15 @@ void bta_av_co_audio_codec_reset(void) | ||
1876 | 2028 | APPL_TRACE_ERROR("bta_av_co_audio_codec_reset A2D_BldSbcInfo failed"); |
1877 | 2029 | } else |
1878 | 2030 | 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 | |
1880 | 2040 | /* Reset the Current configuration to aptX */ |
1881 | 2041 | bta_av_co_cb.codec_cfg_aptx.id = A2D_NON_A2DP_MEDIA_CT; |
1882 | 2042 | 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 | ||
1902 | 2062 | tBTIF_AV_CODEC_INFO new_cfg_sbc; |
1903 | 2063 | tA2D_APTX_CIE aptx_config; |
1904 | 2064 | 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 | |
1905 | 2069 | FUNC_TRACE(); |
1906 | 2070 | |
1907 | 2071 | /* Check AV feeding is supported */ |
@@ -1930,6 +2094,10 @@ BOOLEAN bta_av_co_audio_set_codec(const tBTIF_AV_MEDIA_FEEDINGS *p_feeding, tBTI | ||
1930 | 2094 | } |
1931 | 2095 | new_cfg_aptx.id = A2D_NON_A2DP_MEDIA_CT; |
1932 | 2096 | 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 | |
1933 | 2101 | switch (p_feeding->cfg.pcm.sampling_freq) |
1934 | 2102 | { |
1935 | 2103 | case 8000: |
@@ -1940,6 +2108,9 @@ BOOLEAN bta_av_co_audio_set_codec(const tBTIF_AV_MEDIA_FEEDINGS *p_feeding, tBTI | ||
1940 | 2108 | case 48000: |
1941 | 2109 | sbc_config.samp_freq = A2D_SBC_IE_SAMP_FREQ_48; |
1942 | 2110 | 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 | |
1943 | 2114 | break; |
1944 | 2115 | |
1945 | 2116 | case 11025: |
@@ -1947,6 +2118,9 @@ BOOLEAN bta_av_co_audio_set_codec(const tBTIF_AV_MEDIA_FEEDINGS *p_feeding, tBTI | ||
1947 | 2118 | case 44100: |
1948 | 2119 | sbc_config.samp_freq = A2D_SBC_IE_SAMP_FREQ_44; |
1949 | 2120 | 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 | |
1950 | 2124 | break; |
1951 | 2125 | default: |
1952 | 2126 | 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 | ||
1964 | 2138 | APPL_TRACE_ERROR("%s A2D_BldAptxInfo failed", __func__); |
1965 | 2139 | return FALSE; |
1966 | 2140 | } |
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 | |
1967 | 2148 | break; |
1968 | 2149 | |
1969 | 2150 |
@@ -1977,6 +2158,9 @@ BOOLEAN bta_av_co_audio_set_codec(const tBTIF_AV_MEDIA_FEEDINGS *p_feeding, tBTI | ||
1977 | 2158 | bta_av_co_cb.codec_cfg_sbc = new_cfg_sbc; |
1978 | 2159 | bta_av_co_cb.codec_cfg = &bta_av_co_cb.codec_cfg_sbc; |
1979 | 2160 | 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 | |
1980 | 2164 | |
1981 | 2165 | /* Check all devices support it */ |
1982 | 2166 | *p_status = BTIF_SUCCESS; |
@@ -2042,6 +2226,9 @@ BOOLEAN bta_av_co_audio_get_codec_config(UINT8 *p_config, UINT16 *p_minmtu, UINT | ||
2042 | 2226 | tBTA_AV_CO_PEER *p_peer; |
2043 | 2227 | tBTA_AV_CO_SINK *p_sink; |
2044 | 2228 | tA2D_SBC_CIE *sbc_config; |
2229 | +#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE) | |
2230 | + tA2D_AAC_CIE *aac_config; | |
2231 | +#endif | |
2045 | 2232 | |
2046 | 2233 | APPL_TRACE_EVENT("%s codec 0x%x", __func__, bta_av_co_cb.codec_cfg->id); |
2047 | 2234 |
@@ -2069,6 +2256,17 @@ BOOLEAN bta_av_co_audio_get_codec_config(UINT8 *p_config, UINT16 *p_minmtu, UINT | ||
2069 | 2256 | } else { |
2070 | 2257 | APPL_TRACE_DEBUG("%s vendorId: %d codecId: %d\n", __func__, ((tA2D_APTX_CIE *)p_config)->vendorId, ((tA2D_APTX_CIE *)p_config)->codecId); |
2071 | 2258 | } |
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 | |
2072 | 2270 | for (index = 0; index < BTA_AV_CO_NUM_ELEMENTS(bta_av_co_cb.peers); index++) |
2073 | 2271 | { |
2074 | 2272 | 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 | ||
2172 | 2370 | |
2173 | 2371 | return result; |
2174 | 2372 | } |
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 | |
2175 | 2427 | |
2176 | 2428 | /******************************************************************************* |
2177 | 2429 | ** |
@@ -51,7 +51,7 @@ | ||
51 | 51 | /* Codec type */ |
52 | 52 | #define BTIF_AV_CODEC_NONE 0xF1 |
53 | 53 | #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 */ | |
55 | 55 | #define BTIF_AV_CODEC_PCM 0x5 /* Raw PCM */ |
56 | 56 | |
57 | 57 | typedef UINT8 tBTIF_AV_CODEC_ID; |
@@ -30,7 +30,6 @@ | ||
30 | 30 | /******************************************************************************* |
31 | 31 | ** Constants & Macros |
32 | 32 | ********************************************************************************/ |
33 | - | |
34 | 33 | /******************************************************************************* |
35 | 34 | ** Functions |
36 | 35 | ********************************************************************************/ |
@@ -154,6 +153,20 @@ BOOLEAN bta_av_co_audio_get_codec_config(UINT8 *p_sbc_config, UINT16 *p_minmtu, | ||
154 | 153 | ** |
155 | 154 | *******************************************************************************/ |
156 | 155 | 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 | + | |
157 | 170 | |
158 | 171 | /******************************************************************************* |
159 | 172 | ** |
@@ -39,6 +39,7 @@ | ||
39 | 39 | #include "bt_common.h" |
40 | 40 | #include "btif_av_api.h" |
41 | 41 | #include "audio_a2dp_hw.h" |
42 | +#include "a2d_aac.h" | |
42 | 43 | |
43 | 44 | /******************************************************************************* |
44 | 45 | ** Constants |
@@ -83,6 +84,11 @@ typedef struct | ||
83 | 84 | UINT8 CodecType; /* SBC or Non-A2DP */ |
84 | 85 | UINT8 BluetoothVendorID; /* Bluetooth Vendor ID */ |
85 | 86 | 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 | |
86 | 92 | } tBTIF_MEDIA_INIT_AUDIO; |
87 | 93 | |
88 | 94 | #if (BTA_AV_INCLUDED == TRUE) |
@@ -61,12 +61,14 @@ | ||
61 | 61 | #include "a2d_int.h" |
62 | 62 | #include "a2d_sbc.h" |
63 | 63 | #include "a2d_aptx.h" |
64 | +#include "a2d_aac.h" | |
64 | 65 | #include "audio_a2dp_hw.h" |
65 | 66 | #include "bt_target.h" |
66 | 67 | #include "bta_api.h" |
67 | 68 | #include "bta_av_api.h" |
68 | 69 | #include "bta_av_ci.h" |
69 | 70 | #include "bta_av_sbc.h" |
71 | +#include "bta_av_aac.h" | |
70 | 72 | #include "bta_sys.h" |
71 | 73 | #include "bta_sys_int.h" |
72 | 74 | #include "btif_av.h" |
@@ -184,6 +186,12 @@ enum { | ||
184 | 186 | #endif |
185 | 187 | |
186 | 188 | #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) | |
187 | 195 | #define BTIF_MEDIA_AA_APTX_OFFSET (AVDT_MEDIA_OFFSET + 1) |
188 | 196 | #else |
189 | 197 | #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) | ||
899 | 907 | A2D_BldSbcInfo(AVDT_MEDIA_AUDIO,&codec_cfg,¶m[1]); |
900 | 908 | bitrate = btif_media_cb.encoder.u16BitRate * 1000; |
901 | 909 | } |
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,¶m[1]); | |
915 | + bitrate = btif_media_cb.encoder.u16BitRate * 1000; | |
916 | + } | |
917 | +#endif | |
902 | 918 | else if (codec_id == A2D_NON_A2DP_MEDIA_CT) //this is changed to non-a2dp VS codec |
903 | 919 | { |
904 | 920 | //ADD APTX support |
@@ -913,7 +929,7 @@ static void btif_recv_ctrl_data(void) | ||
913 | 929 | { |
914 | 930 | tA2D_APTX_CIE* codecInfo = 0; |
915 | 931 | codecInfo = (tA2D_APTX_CIE*) &ptr[3]; |
916 | - if (codecInfo && codecInfo->vendorId == A2D_APTX_VENDOR_ID | |
932 | + if (codecInfo && codecInfo->vendorId == A2D_APTX_VENDOR_ID | |
917 | 933 | && codecInfo->codecId == A2D_APTX_CODEC_ID_BLUETOOTH) |
918 | 934 | { |
919 | 935 | tA2D_APTX_CIE aptx_config; |
@@ -1116,7 +1132,9 @@ static void btif_a2dp_encoder_init(tBTA_AV_HNDL hdl) | ||
1116 | 1132 | tBTIF_MEDIA_INIT_AUDIO msg; |
1117 | 1133 | tA2D_SBC_CIE sbc_config; |
1118 | 1134 | tA2D_APTX_CIE* codecInfo = 0; |
1119 | - | |
1135 | +#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE) | |
1136 | + tA2D_AAC_CIE aac_config; | |
1137 | +#endif | |
1120 | 1138 | /* lookup table for converting channel mode */ |
1121 | 1139 | UINT16 codec_mode_tbl[5] = { SBC_JOINT_STEREO, SBC_STEREO, SBC_DUAL, 0, SBC_MONO }; |
1122 | 1140 |
@@ -1169,6 +1187,22 @@ static void btif_a2dp_encoder_init(tBTA_AV_HNDL hdl) | ||
1169 | 1187 | } |
1170 | 1188 | }/* if ( A2D_NON_A2DP_MEDIA_CT == codectype) */ |
1171 | 1189 | |
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 | + | |
1172 | 1206 | ALOGI("%s Selected Codec SBC", __func__); |
1173 | 1207 | |
1174 | 1208 | /* Retrieve the current SBC configuration (default if currently not used) */ |
@@ -1191,6 +1225,9 @@ static void btif_a2dp_encoder_update(void) | ||
1191 | 1225 | { |
1192 | 1226 | UINT16 minmtu = 0; |
1193 | 1227 | tA2D_SBC_CIE sbc_config; |
1228 | +#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE) | |
1229 | + tA2D_AAC_CIE aac_config; | |
1230 | +#endif | |
1194 | 1231 | tBTIF_MEDIA_UPDATE_AUDIO msg; |
1195 | 1232 | UINT8 pref_min; |
1196 | 1233 | UINT8 pref_max; |
@@ -1218,7 +1255,17 @@ static void btif_a2dp_encoder_update(void) | ||
1218 | 1255 | msg.BluetoothCodecID = aptx_config.codecId; |
1219 | 1256 | } |
1220 | 1257 | } /* 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 { | |
1222 | 1269 | |
1223 | 1270 | /* Retrieve the current SBC configuration (default if currently not used) */ |
1224 | 1271 | 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) | ||
2464 | 2511 | /* do nothing, fall through to SBC */ |
2465 | 2512 | } |
2466 | 2513 | } |
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 | |
2468 | 2524 | /* SBC encoder config (enforced even if not used) */ |
2469 | 2525 | btif_media_cb.encoder.s16ChannelMode = pInitAudio->ChannelMode; |
2470 | 2526 | btif_media_cb.encoder.s16NumOfSubBands = pInitAudio->NumOfSubBands; |
@@ -2541,6 +2597,17 @@ static void btif_media_task_enc_update(BT_HDR *p_msg) | ||
2541 | 2597 | /* do nothing, fall through to SBC */ |
2542 | 2598 | } |
2543 | 2599 | } |
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 | |
2544 | 2611 | { |
2545 | 2612 | if (!pstrEncParams->s16NumOfSubBands) |
2546 | 2613 | { |
@@ -2887,6 +2954,7 @@ static void btif_media_task_audio_feeding_init(BT_HDR *p_msg) | ||
2887 | 2954 | } |
2888 | 2955 | } |
2889 | 2956 | } |
2957 | + | |
2890 | 2958 | btif_media_cb.TxTranscoding = BTIF_MEDIA_TRSCD_PCM_2_SBC; |
2891 | 2959 | btif_media_task_pcm2sbc_init(p_feeding); |
2892 | 2960 | break; |
@@ -175,6 +175,11 @@ | ||
175 | 175 | #define HL_INCLUDED TRUE |
176 | 176 | #endif |
177 | 177 | |
178 | +#ifndef AAC_ENCODER_INCLUDED | |
179 | +#define AAC_ENCODER_INCLUDED TRUE | |
180 | +#endif | |
181 | + | |
182 | + | |
178 | 183 | #ifndef AG_VOICE_SETTINGS |
179 | 184 | #define AG_VOICE_SETTINGS HCI_DEFAULT_VOICE_SETTINGS |
180 | 185 | #endif |
@@ -1204,8 +1209,12 @@ | ||
1204 | 1209 | * Audio*2 + Video*2 + 1 Additional |
1205 | 1210 | */ |
1206 | 1211 | #ifndef AVDT_NUM_SEPS |
1212 | +#if defined(AAC_ENCODER_INCLUDED) && (AAC_ENCODER_INCLUDED == TRUE) | |
1213 | +#define AVDT_NUM_SEPS 7 | |
1214 | +#else | |
1207 | 1215 | #define AVDT_NUM_SEPS 5 |
1208 | 1216 | #endif |
1217 | +#endif | |
1209 | 1218 | |
1210 | 1219 | /* Number of transport channels setup by AVDT for all media streams */ |
1211 | 1220 | #ifndef AVDT_NUM_TC_TBL |
@@ -1405,6 +1414,10 @@ | ||
1405 | 1414 | #define A2D_INCLUDED TRUE |
1406 | 1415 | #endif |
1407 | 1416 | |
1417 | +#ifndef A2D_M24_INCLUDED | |
1418 | +#define A2D_M24_INCLUDED A2D_INCLUDED | |
1419 | +#endif | |
1420 | + | |
1408 | 1421 | /****************************************************************************** |
1409 | 1422 | ** |
1410 | 1423 | ** AVCTP |
@@ -39,6 +39,7 @@ LOCAL_SRC_FILES:= \ | ||
39 | 39 | ./a2dp/a2d_api.c \ |
40 | 40 | ./a2dp/a2d_sbc.c \ |
41 | 41 | ./a2dp/a2d_aptx.c \ |
42 | + ./a2dp/a2d_aac.c \ | |
42 | 43 | ./avrc/avrc_api.c \ |
43 | 44 | ./avrc/avrc_sdp.c \ |
44 | 45 | ./avrc/avrc_opt.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 */ |
@@ -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 */ |