153a5a1b3Sopenharmony_ci/* 253a5a1b3Sopenharmony_ci * 353a5a1b3Sopenharmony_ci * BlueZ - Bluetooth protocol stack for Linux 453a5a1b3Sopenharmony_ci * 553a5a1b3Sopenharmony_ci * Copyright (C) 2006-2010 Nokia Corporation 653a5a1b3Sopenharmony_ci * Copyright (C) 2004-2010 Marcel Holtmann <marcel@holtmann.org> 753a5a1b3Sopenharmony_ci * Copyright (C) 2018 Pali Rohár <pali.rohar@gmail.com> 853a5a1b3Sopenharmony_ci * 953a5a1b3Sopenharmony_ci * 1053a5a1b3Sopenharmony_ci * This library is free software; you can redistribute it and/or 1153a5a1b3Sopenharmony_ci * modify it under the terms of the GNU Lesser General Public 1253a5a1b3Sopenharmony_ci * License as published by the Free Software Foundation; either 1353a5a1b3Sopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 1453a5a1b3Sopenharmony_ci * 1553a5a1b3Sopenharmony_ci * This library is distributed in the hope that it will be useful, 1653a5a1b3Sopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 1753a5a1b3Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1853a5a1b3Sopenharmony_ci * Lesser General Public License for more details. 1953a5a1b3Sopenharmony_ci * 2053a5a1b3Sopenharmony_ci * You should have received a copy of the GNU Lesser General Public 2153a5a1b3Sopenharmony_ci * License along with this library; if not, write to the Free Software 2253a5a1b3Sopenharmony_ci * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 2353a5a1b3Sopenharmony_ci * 2453a5a1b3Sopenharmony_ci */ 2553a5a1b3Sopenharmony_ci 2653a5a1b3Sopenharmony_ci#include <endian.h> 2753a5a1b3Sopenharmony_ci#include <stdint.h> 2853a5a1b3Sopenharmony_ci 2953a5a1b3Sopenharmony_ci#define A2DP_CODEC_SBC 0x00 3053a5a1b3Sopenharmony_ci#define A2DP_CODEC_MPEG12 0x01 3153a5a1b3Sopenharmony_ci#define A2DP_CODEC_MPEG24 0x02 3253a5a1b3Sopenharmony_ci#define A2DP_CODEC_ATRAC 0x04 3353a5a1b3Sopenharmony_ci#define A2DP_CODEC_VENDOR 0xFF 3453a5a1b3Sopenharmony_ci 3553a5a1b3Sopenharmony_ci#define SBC_SAMPLING_FREQ_16000 (1 << 3) 3653a5a1b3Sopenharmony_ci#define SBC_SAMPLING_FREQ_32000 (1 << 2) 3753a5a1b3Sopenharmony_ci#define SBC_SAMPLING_FREQ_44100 (1 << 1) 3853a5a1b3Sopenharmony_ci#define SBC_SAMPLING_FREQ_48000 1 3953a5a1b3Sopenharmony_ci 4053a5a1b3Sopenharmony_ci#define SBC_CHANNEL_MODE_MONO (1 << 3) 4153a5a1b3Sopenharmony_ci#define SBC_CHANNEL_MODE_DUAL_CHANNEL (1 << 2) 4253a5a1b3Sopenharmony_ci#define SBC_CHANNEL_MODE_STEREO (1 << 1) 4353a5a1b3Sopenharmony_ci#define SBC_CHANNEL_MODE_JOINT_STEREO 1 4453a5a1b3Sopenharmony_ci 4553a5a1b3Sopenharmony_ci#define SBC_BLOCK_LENGTH_4 (1 << 3) 4653a5a1b3Sopenharmony_ci#define SBC_BLOCK_LENGTH_8 (1 << 2) 4753a5a1b3Sopenharmony_ci#define SBC_BLOCK_LENGTH_12 (1 << 1) 4853a5a1b3Sopenharmony_ci#define SBC_BLOCK_LENGTH_16 1 4953a5a1b3Sopenharmony_ci 5053a5a1b3Sopenharmony_ci#define SBC_SUBBANDS_4 (1 << 1) 5153a5a1b3Sopenharmony_ci#define SBC_SUBBANDS_8 1 5253a5a1b3Sopenharmony_ci 5353a5a1b3Sopenharmony_ci#define SBC_ALLOCATION_SNR (1 << 1) 5453a5a1b3Sopenharmony_ci#define SBC_ALLOCATION_LOUDNESS 1 5553a5a1b3Sopenharmony_ci 5653a5a1b3Sopenharmony_ci#define SBC_MIN_BITPOOL 2 5753a5a1b3Sopenharmony_ci#define SBC_MAX_BITPOOL 250 5853a5a1b3Sopenharmony_ci 5953a5a1b3Sopenharmony_ci/* Other settings: 6053a5a1b3Sopenharmony_ci * Block length = 16 6153a5a1b3Sopenharmony_ci * Allocation method = Loudness 6253a5a1b3Sopenharmony_ci * Subbands = 8 6353a5a1b3Sopenharmony_ci */ 6453a5a1b3Sopenharmony_ci#define SBC_BITPOOL_MQ_MONO_44100 19 6553a5a1b3Sopenharmony_ci#define SBC_BITPOOL_MQ_MONO_48000 18 6653a5a1b3Sopenharmony_ci#define SBC_BITPOOL_MQ_JOINT_STEREO_44100 35 6753a5a1b3Sopenharmony_ci#define SBC_BITPOOL_MQ_JOINT_STEREO_48000 33 6853a5a1b3Sopenharmony_ci#define SBC_BITPOOL_HQ_MONO_44100 31 6953a5a1b3Sopenharmony_ci#define SBC_BITPOOL_HQ_MONO_48000 29 7053a5a1b3Sopenharmony_ci#define SBC_BITPOOL_HQ_JOINT_STEREO_44100 53 7153a5a1b3Sopenharmony_ci#define SBC_BITPOOL_HQ_JOINT_STEREO_48000 51 7253a5a1b3Sopenharmony_ci 7353a5a1b3Sopenharmony_ci#define MPEG_CHANNEL_MODE_MONO (1 << 3) 7453a5a1b3Sopenharmony_ci#define MPEG_CHANNEL_MODE_DUAL_CHANNEL (1 << 2) 7553a5a1b3Sopenharmony_ci#define MPEG_CHANNEL_MODE_STEREO (1 << 1) 7653a5a1b3Sopenharmony_ci#define MPEG_CHANNEL_MODE_JOINT_STEREO 1 7753a5a1b3Sopenharmony_ci 7853a5a1b3Sopenharmony_ci#define MPEG_LAYER_MP1 (1 << 2) 7953a5a1b3Sopenharmony_ci#define MPEG_LAYER_MP2 (1 << 1) 8053a5a1b3Sopenharmony_ci#define MPEG_LAYER_MP3 1 8153a5a1b3Sopenharmony_ci 8253a5a1b3Sopenharmony_ci#define MPEG_SAMPLING_FREQ_16000 (1 << 5) 8353a5a1b3Sopenharmony_ci#define MPEG_SAMPLING_FREQ_22050 (1 << 4) 8453a5a1b3Sopenharmony_ci#define MPEG_SAMPLING_FREQ_24000 (1 << 3) 8553a5a1b3Sopenharmony_ci#define MPEG_SAMPLING_FREQ_32000 (1 << 2) 8653a5a1b3Sopenharmony_ci#define MPEG_SAMPLING_FREQ_44100 (1 << 1) 8753a5a1b3Sopenharmony_ci#define MPEG_SAMPLING_FREQ_48000 1 8853a5a1b3Sopenharmony_ci 8953a5a1b3Sopenharmony_ci#define MPEG_BIT_RATE_INDEX_0 (1 << 0) 9053a5a1b3Sopenharmony_ci#define MPEG_BIT_RATE_INDEX_1 (1 << 1) 9153a5a1b3Sopenharmony_ci#define MPEG_BIT_RATE_INDEX_2 (1 << 2) 9253a5a1b3Sopenharmony_ci#define MPEG_BIT_RATE_INDEX_3 (1 << 3) 9353a5a1b3Sopenharmony_ci#define MPEG_BIT_RATE_INDEX_4 (1 << 4) 9453a5a1b3Sopenharmony_ci#define MPEG_BIT_RATE_INDEX_5 (1 << 5) 9553a5a1b3Sopenharmony_ci#define MPEG_BIT_RATE_INDEX_6 (1 << 6) 9653a5a1b3Sopenharmony_ci#define MPEG_BIT_RATE_INDEX_7 (1 << 7) 9753a5a1b3Sopenharmony_ci#define MPEG_BIT_RATE_INDEX_8 (1 << 8) 9853a5a1b3Sopenharmony_ci#define MPEG_BIT_RATE_INDEX_9 (1 << 9) 9953a5a1b3Sopenharmony_ci#define MPEG_BIT_RATE_INDEX_10 (1 << 10) 10053a5a1b3Sopenharmony_ci#define MPEG_BIT_RATE_INDEX_11 (1 << 11) 10153a5a1b3Sopenharmony_ci#define MPEG_BIT_RATE_INDEX_12 (1 << 12) 10253a5a1b3Sopenharmony_ci#define MPEG_BIT_RATE_INDEX_13 (1 << 13) 10353a5a1b3Sopenharmony_ci#define MPEG_BIT_RATE_INDEX_14 (1 << 14) 10453a5a1b3Sopenharmony_ci 10553a5a1b3Sopenharmony_ci#define MPEG_MP1_BIT_RATE_32000 MPEG_BIT_RATE_INDEX_1 10653a5a1b3Sopenharmony_ci#define MPEG_MP1_BIT_RATE_64000 MPEG_BIT_RATE_INDEX_2 10753a5a1b3Sopenharmony_ci#define MPEG_MP1_BIT_RATE_96000 MPEG_BIT_RATE_INDEX_3 10853a5a1b3Sopenharmony_ci#define MPEG_MP1_BIT_RATE_128000 MPEG_BIT_RATE_INDEX_4 10953a5a1b3Sopenharmony_ci#define MPEG_MP1_BIT_RATE_160000 MPEG_BIT_RATE_INDEX_5 11053a5a1b3Sopenharmony_ci#define MPEG_MP1_BIT_RATE_192000 MPEG_BIT_RATE_INDEX_6 11153a5a1b3Sopenharmony_ci#define MPEG_MP1_BIT_RATE_224000 MPEG_BIT_RATE_INDEX_7 11253a5a1b3Sopenharmony_ci#define MPEG_MP1_BIT_RATE_256000 MPEG_BIT_RATE_INDEX_8 11353a5a1b3Sopenharmony_ci#define MPEG_MP1_BIT_RATE_288000 MPEG_BIT_RATE_INDEX_9 11453a5a1b3Sopenharmony_ci#define MPEG_MP1_BIT_RATE_320000 MPEG_BIT_RATE_INDEX_10 11553a5a1b3Sopenharmony_ci#define MPEG_MP1_BIT_RATE_352000 MPEG_BIT_RATE_INDEX_11 11653a5a1b3Sopenharmony_ci#define MPEG_MP1_BIT_RATE_384000 MPEG_BIT_RATE_INDEX_12 11753a5a1b3Sopenharmony_ci#define MPEG_MP1_BIT_RATE_416000 MPEG_BIT_RATE_INDEX_13 11853a5a1b3Sopenharmony_ci#define MPEG_MP1_BIT_RATE_448000 MPEG_BIT_RATE_INDEX_14 11953a5a1b3Sopenharmony_ci 12053a5a1b3Sopenharmony_ci#define MPEG_MP2_BIT_RATE_32000 MPEG_BIT_RATE_INDEX_1 12153a5a1b3Sopenharmony_ci#define MPEG_MP2_BIT_RATE_48000 MPEG_BIT_RATE_INDEX_2 12253a5a1b3Sopenharmony_ci#define MPEG_MP2_BIT_RATE_56000 MPEG_BIT_RATE_INDEX_3 12353a5a1b3Sopenharmony_ci#define MPEG_MP2_BIT_RATE_64000 MPEG_BIT_RATE_INDEX_4 12453a5a1b3Sopenharmony_ci#define MPEG_MP2_BIT_RATE_80000 MPEG_BIT_RATE_INDEX_5 12553a5a1b3Sopenharmony_ci#define MPEG_MP2_BIT_RATE_96000 MPEG_BIT_RATE_INDEX_6 12653a5a1b3Sopenharmony_ci#define MPEG_MP2_BIT_RATE_112000 MPEG_BIT_RATE_INDEX_7 12753a5a1b3Sopenharmony_ci#define MPEG_MP2_BIT_RATE_128000 MPEG_BIT_RATE_INDEX_8 12853a5a1b3Sopenharmony_ci#define MPEG_MP2_BIT_RATE_160000 MPEG_BIT_RATE_INDEX_9 12953a5a1b3Sopenharmony_ci#define MPEG_MP2_BIT_RATE_192000 MPEG_BIT_RATE_INDEX_10 13053a5a1b3Sopenharmony_ci#define MPEG_MP2_BIT_RATE_224000 MPEG_BIT_RATE_INDEX_11 13153a5a1b3Sopenharmony_ci#define MPEG_MP2_BIT_RATE_256000 MPEG_BIT_RATE_INDEX_12 13253a5a1b3Sopenharmony_ci#define MPEG_MP2_BIT_RATE_320000 MPEG_BIT_RATE_INDEX_13 13353a5a1b3Sopenharmony_ci#define MPEG_MP2_BIT_RATE_384000 MPEG_BIT_RATE_INDEX_14 13453a5a1b3Sopenharmony_ci 13553a5a1b3Sopenharmony_ci#define MPEG_MP3_BIT_RATE_32000 MPEG_BIT_RATE_INDEX_1 13653a5a1b3Sopenharmony_ci#define MPEG_MP3_BIT_RATE_40000 MPEG_BIT_RATE_INDEX_2 13753a5a1b3Sopenharmony_ci#define MPEG_MP3_BIT_RATE_48000 MPEG_BIT_RATE_INDEX_3 13853a5a1b3Sopenharmony_ci#define MPEG_MP3_BIT_RATE_56000 MPEG_BIT_RATE_INDEX_4 13953a5a1b3Sopenharmony_ci#define MPEG_MP3_BIT_RATE_64000 MPEG_BIT_RATE_INDEX_5 14053a5a1b3Sopenharmony_ci#define MPEG_MP3_BIT_RATE_80000 MPEG_BIT_RATE_INDEX_6 14153a5a1b3Sopenharmony_ci#define MPEG_MP3_BIT_RATE_96000 MPEG_BIT_RATE_INDEX_7 14253a5a1b3Sopenharmony_ci#define MPEG_MP3_BIT_RATE_112000 MPEG_BIT_RATE_INDEX_8 14353a5a1b3Sopenharmony_ci#define MPEG_MP3_BIT_RATE_128000 MPEG_BIT_RATE_INDEX_9 14453a5a1b3Sopenharmony_ci#define MPEG_MP3_BIT_RATE_160000 MPEG_BIT_RATE_INDEX_10 14553a5a1b3Sopenharmony_ci#define MPEG_MP3_BIT_RATE_192000 MPEG_BIT_RATE_INDEX_11 14653a5a1b3Sopenharmony_ci#define MPEG_MP3_BIT_RATE_224000 MPEG_BIT_RATE_INDEX_12 14753a5a1b3Sopenharmony_ci#define MPEG_MP3_BIT_RATE_256000 MPEG_BIT_RATE_INDEX_13 14853a5a1b3Sopenharmony_ci#define MPEG_MP3_BIT_RATE_320000 MPEG_BIT_RATE_INDEX_14 14953a5a1b3Sopenharmony_ci 15053a5a1b3Sopenharmony_ci#define MPEG_BIT_RATE_FREE MPEG_BIT_RATE_INDEX_0 15153a5a1b3Sopenharmony_ci 15253a5a1b3Sopenharmony_ci#define MPEG_GET_BITRATE(a) ((uint16_t)(a).bitrate1 << 8 | (a).bitrate2) 15353a5a1b3Sopenharmony_ci#define MPEG_SET_BITRATE(a, b) \ 15453a5a1b3Sopenharmony_ci do { \ 15553a5a1b3Sopenharmony_ci (a).bitrate1 = ((b) >> 8) & 0x7f; \ 15653a5a1b3Sopenharmony_ci (a).bitrate2 = (b) & 0xff; \ 15753a5a1b3Sopenharmony_ci } while (0) 15853a5a1b3Sopenharmony_ci 15953a5a1b3Sopenharmony_ci#define AAC_OBJECT_TYPE_MPEG2_AAC_LC 0x80 16053a5a1b3Sopenharmony_ci#define AAC_OBJECT_TYPE_MPEG4_AAC_LC 0x40 16153a5a1b3Sopenharmony_ci#define AAC_OBJECT_TYPE_MPEG4_AAC_LTP 0x20 16253a5a1b3Sopenharmony_ci#define AAC_OBJECT_TYPE_MPEG4_AAC_SCA 0x10 16353a5a1b3Sopenharmony_ci 16453a5a1b3Sopenharmony_ci#define AAC_SAMPLING_FREQ_8000 0x0800 16553a5a1b3Sopenharmony_ci#define AAC_SAMPLING_FREQ_11025 0x0400 16653a5a1b3Sopenharmony_ci#define AAC_SAMPLING_FREQ_12000 0x0200 16753a5a1b3Sopenharmony_ci#define AAC_SAMPLING_FREQ_16000 0x0100 16853a5a1b3Sopenharmony_ci#define AAC_SAMPLING_FREQ_22050 0x0080 16953a5a1b3Sopenharmony_ci#define AAC_SAMPLING_FREQ_24000 0x0040 17053a5a1b3Sopenharmony_ci#define AAC_SAMPLING_FREQ_32000 0x0020 17153a5a1b3Sopenharmony_ci#define AAC_SAMPLING_FREQ_44100 0x0010 17253a5a1b3Sopenharmony_ci#define AAC_SAMPLING_FREQ_48000 0x0008 17353a5a1b3Sopenharmony_ci#define AAC_SAMPLING_FREQ_64000 0x0004 17453a5a1b3Sopenharmony_ci#define AAC_SAMPLING_FREQ_88200 0x0002 17553a5a1b3Sopenharmony_ci#define AAC_SAMPLING_FREQ_96000 0x0001 17653a5a1b3Sopenharmony_ci 17753a5a1b3Sopenharmony_ci#define AAC_CHANNELS_1 0x02 17853a5a1b3Sopenharmony_ci#define AAC_CHANNELS_2 0x01 17953a5a1b3Sopenharmony_ci 18053a5a1b3Sopenharmony_ci#define AAC_GET_BITRATE(a) ((a).bitrate1 << 16 | \ 18153a5a1b3Sopenharmony_ci (a).bitrate2 << 8 | (a).bitrate3) 18253a5a1b3Sopenharmony_ci#define AAC_GET_FREQUENCY(a) ((a).frequency1 << 4 | (a).frequency2) 18353a5a1b3Sopenharmony_ci 18453a5a1b3Sopenharmony_ci#define AAC_SET_BITRATE(a, b) \ 18553a5a1b3Sopenharmony_ci do { \ 18653a5a1b3Sopenharmony_ci (a).bitrate1 = (b >> 16) & 0x7f; \ 18753a5a1b3Sopenharmony_ci (a).bitrate2 = (b >> 8) & 0xff; \ 18853a5a1b3Sopenharmony_ci (a).bitrate3 = b & 0xff; \ 18953a5a1b3Sopenharmony_ci } while (0) 19053a5a1b3Sopenharmony_ci#define AAC_SET_FREQUENCY(a, f) \ 19153a5a1b3Sopenharmony_ci do { \ 19253a5a1b3Sopenharmony_ci (a).frequency1 = (f >> 4) & 0xff; \ 19353a5a1b3Sopenharmony_ci (a).frequency2 = f & 0x0f; \ 19453a5a1b3Sopenharmony_ci } while (0) 19553a5a1b3Sopenharmony_ci 19653a5a1b3Sopenharmony_ci#define AAC_INIT_BITRATE(b) \ 19753a5a1b3Sopenharmony_ci .bitrate1 = (b >> 16) & 0x7f, \ 19853a5a1b3Sopenharmony_ci .bitrate2 = (b >> 8) & 0xff, \ 19953a5a1b3Sopenharmony_ci .bitrate3 = b & 0xff, 20053a5a1b3Sopenharmony_ci#define AAC_INIT_FREQUENCY(f) \ 20153a5a1b3Sopenharmony_ci .frequency1 = (f >> 4) & 0xff, \ 20253a5a1b3Sopenharmony_ci .frequency2 = f & 0x0f, 20353a5a1b3Sopenharmony_ci 20453a5a1b3Sopenharmony_ci#define APTX_VENDOR_ID 0x0000004f 20553a5a1b3Sopenharmony_ci#define APTX_CODEC_ID 0x0001 20653a5a1b3Sopenharmony_ci 20753a5a1b3Sopenharmony_ci#define APTX_CHANNEL_MODE_MONO 0x01 20853a5a1b3Sopenharmony_ci#define APTX_CHANNEL_MODE_STEREO 0x02 20953a5a1b3Sopenharmony_ci 21053a5a1b3Sopenharmony_ci#define APTX_SAMPLING_FREQ_16000 0x08 21153a5a1b3Sopenharmony_ci#define APTX_SAMPLING_FREQ_32000 0x04 21253a5a1b3Sopenharmony_ci#define APTX_SAMPLING_FREQ_44100 0x02 21353a5a1b3Sopenharmony_ci#define APTX_SAMPLING_FREQ_48000 0x01 21453a5a1b3Sopenharmony_ci 21553a5a1b3Sopenharmony_ci#define FASTSTREAM_VENDOR_ID 0x0000000a 21653a5a1b3Sopenharmony_ci#define FASTSTREAM_CODEC_ID 0x0001 21753a5a1b3Sopenharmony_ci 21853a5a1b3Sopenharmony_ci#define FASTSTREAM_DIRECTION_SINK 0x1 21953a5a1b3Sopenharmony_ci#define FASTSTREAM_DIRECTION_SOURCE 0x2 22053a5a1b3Sopenharmony_ci 22153a5a1b3Sopenharmony_ci#define FASTSTREAM_SINK_SAMPLING_FREQ_44100 0x2 22253a5a1b3Sopenharmony_ci#define FASTSTREAM_SINK_SAMPLING_FREQ_48000 0x1 22353a5a1b3Sopenharmony_ci 22453a5a1b3Sopenharmony_ci#define FASTSTREAM_SOURCE_SAMPLING_FREQ_16000 0x2 22553a5a1b3Sopenharmony_ci 22653a5a1b3Sopenharmony_ci#define APTX_LL_VENDOR_ID 0x0000000a 22753a5a1b3Sopenharmony_ci#define APTX_LL_CODEC_ID 0x0002 22853a5a1b3Sopenharmony_ci 22953a5a1b3Sopenharmony_ci/* Default parameters for aptX Low Latency encoder */ 23053a5a1b3Sopenharmony_ci 23153a5a1b3Sopenharmony_ci/* Target codec buffer level = 180 */ 23253a5a1b3Sopenharmony_ci#define APTX_LL_TARGET_LEVEL2 0xb4 23353a5a1b3Sopenharmony_ci#define APTX_LL_TARGET_LEVEL1 0x00 23453a5a1b3Sopenharmony_ci 23553a5a1b3Sopenharmony_ci/* Initial codec buffer level = 360 */ 23653a5a1b3Sopenharmony_ci#define APTX_LL_INITIAL_LEVEL2 0x68 23753a5a1b3Sopenharmony_ci#define APTX_LL_INITIAL_LEVEL1 0x01 23853a5a1b3Sopenharmony_ci 23953a5a1b3Sopenharmony_ci/* SRA max rate 0.005 * 10000 = 50 */ 24053a5a1b3Sopenharmony_ci#define APTX_LL_SRA_MAX_RATE 0x32 24153a5a1b3Sopenharmony_ci 24253a5a1b3Sopenharmony_ci/* SRA averaging time = 1s */ 24353a5a1b3Sopenharmony_ci#define APTX_LL_SRA_AVG_TIME 0x01 24453a5a1b3Sopenharmony_ci 24553a5a1b3Sopenharmony_ci/* Good working codec buffer level = 180 */ 24653a5a1b3Sopenharmony_ci#define APTX_LL_GOOD_WORKING_LEVEL2 0xB4 24753a5a1b3Sopenharmony_ci#define APTX_LL_GOOD_WORKING_LEVEL1 0x00 24853a5a1b3Sopenharmony_ci 24953a5a1b3Sopenharmony_ci#define APTX_HD_VENDOR_ID 0x000000D7 25053a5a1b3Sopenharmony_ci#define APTX_HD_CODEC_ID 0x0024 25153a5a1b3Sopenharmony_ci 25253a5a1b3Sopenharmony_ci#define LDAC_VENDOR_ID 0x0000012d 25353a5a1b3Sopenharmony_ci#define LDAC_CODEC_ID 0x00aa 25453a5a1b3Sopenharmony_ci 25553a5a1b3Sopenharmony_ci#define LDAC_SAMPLING_FREQ_44100 0x20 25653a5a1b3Sopenharmony_ci#define LDAC_SAMPLING_FREQ_48000 0x10 25753a5a1b3Sopenharmony_ci#define LDAC_SAMPLING_FREQ_88200 0x08 25853a5a1b3Sopenharmony_ci#define LDAC_SAMPLING_FREQ_96000 0x04 25953a5a1b3Sopenharmony_ci#define LDAC_SAMPLING_FREQ_176400 0x02 26053a5a1b3Sopenharmony_ci#define LDAC_SAMPLING_FREQ_192000 0x01 26153a5a1b3Sopenharmony_ci 26253a5a1b3Sopenharmony_ci#define LDAC_CHANNEL_MODE_MONO 0x04 26353a5a1b3Sopenharmony_ci#define LDAC_CHANNEL_MODE_DUAL 0x02 26453a5a1b3Sopenharmony_ci#define LDAC_CHANNEL_MODE_STEREO 0x01 26553a5a1b3Sopenharmony_ci 26653a5a1b3Sopenharmony_citypedef struct { 26753a5a1b3Sopenharmony_ci uint8_t vendor_id4; 26853a5a1b3Sopenharmony_ci uint8_t vendor_id3; 26953a5a1b3Sopenharmony_ci uint8_t vendor_id2; 27053a5a1b3Sopenharmony_ci uint8_t vendor_id1; 27153a5a1b3Sopenharmony_ci uint8_t codec_id2; 27253a5a1b3Sopenharmony_ci uint8_t codec_id1; 27353a5a1b3Sopenharmony_ci} __attribute__ ((packed)) a2dp_vendor_codec_t; 27453a5a1b3Sopenharmony_ci 27553a5a1b3Sopenharmony_ci#define A2DP_GET_VENDOR_ID(a) ( \ 27653a5a1b3Sopenharmony_ci (((uint32_t)(a).vendor_id4) << 0) | \ 27753a5a1b3Sopenharmony_ci (((uint32_t)(a).vendor_id3) << 8) | \ 27853a5a1b3Sopenharmony_ci (((uint32_t)(a).vendor_id2) << 16) | \ 27953a5a1b3Sopenharmony_ci (((uint32_t)(a).vendor_id1) << 24) \ 28053a5a1b3Sopenharmony_ci ) 28153a5a1b3Sopenharmony_ci#define A2DP_GET_CODEC_ID(a) ((a).codec_id2 | (((uint16_t)(a).codec_id1) << 8)) 28253a5a1b3Sopenharmony_ci#define A2DP_SET_VENDOR_ID_CODEC_ID(v, c) ((a2dp_vendor_codec_t){ \ 28353a5a1b3Sopenharmony_ci .vendor_id4 = (((v) >> 0) & 0xff), \ 28453a5a1b3Sopenharmony_ci .vendor_id3 = (((v) >> 8) & 0xff), \ 28553a5a1b3Sopenharmony_ci .vendor_id2 = (((v) >> 16) & 0xff), \ 28653a5a1b3Sopenharmony_ci .vendor_id1 = (((v) >> 24) & 0xff), \ 28753a5a1b3Sopenharmony_ci .codec_id2 = (((c) >> 0) & 0xff), \ 28853a5a1b3Sopenharmony_ci .codec_id1 = (((c) >> 8) & 0xff), \ 28953a5a1b3Sopenharmony_ci }) 29053a5a1b3Sopenharmony_ci 29153a5a1b3Sopenharmony_citypedef struct { 29253a5a1b3Sopenharmony_ci uint8_t reserved; 29353a5a1b3Sopenharmony_ci uint8_t target_level2; 29453a5a1b3Sopenharmony_ci uint8_t target_level1; 29553a5a1b3Sopenharmony_ci uint8_t initial_level2; 29653a5a1b3Sopenharmony_ci uint8_t initial_level1; 29753a5a1b3Sopenharmony_ci uint8_t sra_max_rate; 29853a5a1b3Sopenharmony_ci uint8_t sra_avg_time; 29953a5a1b3Sopenharmony_ci uint8_t good_working_level2; 30053a5a1b3Sopenharmony_ci uint8_t good_working_level1; 30153a5a1b3Sopenharmony_ci} __attribute__ ((packed)) a2dp_aptx_ll_new_caps_t; 30253a5a1b3Sopenharmony_ci 30353a5a1b3Sopenharmony_citypedef struct { 30453a5a1b3Sopenharmony_ci a2dp_vendor_codec_t info; 30553a5a1b3Sopenharmony_ci uint8_t frequency; 30653a5a1b3Sopenharmony_ci uint8_t channel_mode; 30753a5a1b3Sopenharmony_ci} __attribute__ ((packed)) a2dp_ldac_t; 30853a5a1b3Sopenharmony_ci 30953a5a1b3Sopenharmony_ci#if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \ 31053a5a1b3Sopenharmony_ci __BYTE_ORDER == __LITTLE_ENDIAN 31153a5a1b3Sopenharmony_ci 31253a5a1b3Sopenharmony_citypedef struct { 31353a5a1b3Sopenharmony_ci uint8_t channel_mode:4; 31453a5a1b3Sopenharmony_ci uint8_t frequency:4; 31553a5a1b3Sopenharmony_ci uint8_t allocation_method:2; 31653a5a1b3Sopenharmony_ci uint8_t subbands:2; 31753a5a1b3Sopenharmony_ci uint8_t block_length:4; 31853a5a1b3Sopenharmony_ci uint8_t min_bitpool; 31953a5a1b3Sopenharmony_ci uint8_t max_bitpool; 32053a5a1b3Sopenharmony_ci} __attribute__ ((packed)) a2dp_sbc_t; 32153a5a1b3Sopenharmony_ci 32253a5a1b3Sopenharmony_citypedef struct { 32353a5a1b3Sopenharmony_ci uint8_t channel_mode:4; 32453a5a1b3Sopenharmony_ci uint8_t crc:1; 32553a5a1b3Sopenharmony_ci uint8_t layer:3; 32653a5a1b3Sopenharmony_ci uint8_t frequency:6; 32753a5a1b3Sopenharmony_ci uint8_t mpf:1; 32853a5a1b3Sopenharmony_ci uint8_t rfa:1; 32953a5a1b3Sopenharmony_ci uint8_t bitrate1:7; 33053a5a1b3Sopenharmony_ci uint8_t vbr:1; 33153a5a1b3Sopenharmony_ci uint8_t bitrate2; 33253a5a1b3Sopenharmony_ci} __attribute__ ((packed)) a2dp_mpeg_t; 33353a5a1b3Sopenharmony_ci 33453a5a1b3Sopenharmony_citypedef struct { 33553a5a1b3Sopenharmony_ci uint8_t object_type; 33653a5a1b3Sopenharmony_ci uint8_t frequency1; 33753a5a1b3Sopenharmony_ci uint8_t rfa:2; 33853a5a1b3Sopenharmony_ci uint8_t channels:2; 33953a5a1b3Sopenharmony_ci uint8_t frequency2:4; 34053a5a1b3Sopenharmony_ci uint8_t bitrate1:7; 34153a5a1b3Sopenharmony_ci uint8_t vbr:1; 34253a5a1b3Sopenharmony_ci uint8_t bitrate2; 34353a5a1b3Sopenharmony_ci uint8_t bitrate3; 34453a5a1b3Sopenharmony_ci} __attribute__ ((packed)) a2dp_aac_t; 34553a5a1b3Sopenharmony_ci 34653a5a1b3Sopenharmony_citypedef struct { 34753a5a1b3Sopenharmony_ci a2dp_vendor_codec_t info; 34853a5a1b3Sopenharmony_ci uint8_t channel_mode:4; 34953a5a1b3Sopenharmony_ci uint8_t frequency:4; 35053a5a1b3Sopenharmony_ci} __attribute__ ((packed)) a2dp_aptx_t; 35153a5a1b3Sopenharmony_ci 35253a5a1b3Sopenharmony_citypedef struct { 35353a5a1b3Sopenharmony_ci a2dp_vendor_codec_t info; 35453a5a1b3Sopenharmony_ci uint8_t direction; 35553a5a1b3Sopenharmony_ci uint8_t sink_frequency:4; 35653a5a1b3Sopenharmony_ci uint8_t source_frequency:4; 35753a5a1b3Sopenharmony_ci} __attribute__ ((packed)) a2dp_faststream_t; 35853a5a1b3Sopenharmony_ci 35953a5a1b3Sopenharmony_citypedef struct { 36053a5a1b3Sopenharmony_ci a2dp_aptx_t aptx; 36153a5a1b3Sopenharmony_ci uint8_t bidirect_link:1; 36253a5a1b3Sopenharmony_ci uint8_t has_new_caps:1; 36353a5a1b3Sopenharmony_ci uint8_t reserved:6; 36453a5a1b3Sopenharmony_ci a2dp_aptx_ll_new_caps_t new_caps[0]; 36553a5a1b3Sopenharmony_ci} __attribute__ ((packed)) a2dp_aptx_ll_t; 36653a5a1b3Sopenharmony_ci 36753a5a1b3Sopenharmony_ci#elif defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && \ 36853a5a1b3Sopenharmony_ci __BYTE_ORDER == __BIG_ENDIAN 36953a5a1b3Sopenharmony_ci 37053a5a1b3Sopenharmony_citypedef struct { 37153a5a1b3Sopenharmony_ci uint8_t frequency:4; 37253a5a1b3Sopenharmony_ci uint8_t channel_mode:4; 37353a5a1b3Sopenharmony_ci uint8_t block_length:4; 37453a5a1b3Sopenharmony_ci uint8_t subbands:2; 37553a5a1b3Sopenharmony_ci uint8_t allocation_method:2; 37653a5a1b3Sopenharmony_ci uint8_t min_bitpool; 37753a5a1b3Sopenharmony_ci uint8_t max_bitpool; 37853a5a1b3Sopenharmony_ci} __attribute__ ((packed)) a2dp_sbc_t; 37953a5a1b3Sopenharmony_ci 38053a5a1b3Sopenharmony_citypedef struct { 38153a5a1b3Sopenharmony_ci uint8_t layer:3; 38253a5a1b3Sopenharmony_ci uint8_t crc:1; 38353a5a1b3Sopenharmony_ci uint8_t channel_mode:4; 38453a5a1b3Sopenharmony_ci uint8_t rfa:1; 38553a5a1b3Sopenharmony_ci uint8_t mpf:1; 38653a5a1b3Sopenharmony_ci uint8_t frequency:6; 38753a5a1b3Sopenharmony_ci uint8_t vbr:1; 38853a5a1b3Sopenharmony_ci uint8_t bitrate1:7; 38953a5a1b3Sopenharmony_ci uint8_t bitrate2; 39053a5a1b3Sopenharmony_ci} __attribute__ ((packed)) a2dp_mpeg_t; 39153a5a1b3Sopenharmony_ci 39253a5a1b3Sopenharmony_citypedef struct { 39353a5a1b3Sopenharmony_ci uint8_t object_type; 39453a5a1b3Sopenharmony_ci uint8_t frequency1; 39553a5a1b3Sopenharmony_ci uint8_t frequency2:4; 39653a5a1b3Sopenharmony_ci uint8_t channels:2; 39753a5a1b3Sopenharmony_ci uint8_t rfa:2; 39853a5a1b3Sopenharmony_ci uint8_t vbr:1; 39953a5a1b3Sopenharmony_ci uint8_t bitrate1:7; 40053a5a1b3Sopenharmony_ci uint8_t bitrate2; 40153a5a1b3Sopenharmony_ci uint8_t bitrate3; 40253a5a1b3Sopenharmony_ci} __attribute__ ((packed)) a2dp_aac_t; 40353a5a1b3Sopenharmony_ci 40453a5a1b3Sopenharmony_citypedef struct { 40553a5a1b3Sopenharmony_ci a2dp_vendor_codec_t info; 40653a5a1b3Sopenharmony_ci uint8_t frequency:4; 40753a5a1b3Sopenharmony_ci uint8_t channel_mode:4; 40853a5a1b3Sopenharmony_ci} __attribute__ ((packed)) a2dp_aptx_t; 40953a5a1b3Sopenharmony_ci 41053a5a1b3Sopenharmony_citypedef struct { 41153a5a1b3Sopenharmony_ci a2dp_vendor_codec_t info; 41253a5a1b3Sopenharmony_ci uint8_t direction; 41353a5a1b3Sopenharmony_ci uint8_t source_frequency:4; 41453a5a1b3Sopenharmony_ci uint8_t sink_frequency:4; 41553a5a1b3Sopenharmony_ci} __attribute__ ((packed)) a2dp_faststream_t; 41653a5a1b3Sopenharmony_ci 41753a5a1b3Sopenharmony_citypedef struct { 41853a5a1b3Sopenharmony_ci a2dp_aptx_t aptx; 41953a5a1b3Sopenharmony_ci uint8_t reserved:6; 42053a5a1b3Sopenharmony_ci uint8_t has_new_caps:1; 42153a5a1b3Sopenharmony_ci uint8_t bidirect_link:1; 42253a5a1b3Sopenharmony_ci a2dp_aptx_ll_new_caps_t new_caps[0]; 42353a5a1b3Sopenharmony_ci} __attribute__ ((packed)) a2dp_aptx_ll_t; 42453a5a1b3Sopenharmony_ci 42553a5a1b3Sopenharmony_ci#else 42653a5a1b3Sopenharmony_ci#error "Unknown byte order" 42753a5a1b3Sopenharmony_ci#endif 42853a5a1b3Sopenharmony_ci 42953a5a1b3Sopenharmony_citypedef struct { 43053a5a1b3Sopenharmony_ci a2dp_aptx_t aptx; 43153a5a1b3Sopenharmony_ci uint8_t reserved0; 43253a5a1b3Sopenharmony_ci uint8_t reserved1; 43353a5a1b3Sopenharmony_ci uint8_t reserved2; 43453a5a1b3Sopenharmony_ci uint8_t reserved3; 43553a5a1b3Sopenharmony_ci} __attribute__ ((packed)) a2dp_aptx_hd_t; 436