1 /****************************************************************************** 2 * Copyright (c) 2022 Telink Semiconductor (Shanghai) Co., Ltd. ("TELINK") 3 * All rights reserved. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 *****************************************************************************/ 18 #ifndef _AUDIO_BAP_H_ 19 #define _AUDIO_BAP_H_ 20 21 #if (BLC_AUDIO_ASCP_ENABLE) 22 23 typedef enum { 24 BLT_AUDIO_ASCP_FLAG_NONE = 0x0000, 25 BLT_AUDIO_ASCP_FLAG_FIRST = 0x0001, 26 BLT_AUDIO_ASCP_FLAG_RASE = 0x0002, // Read Ase Attribute 27 BLT_AUDIO_ASCP_FLAG_CCC = 0x0004, 28 } BLT_AUDIO_ASCP_FLAGS_ENUM; 29 30 typedef enum { 31 BLT_AUDIO_ASE_STATE_IDLE = 0x00, 32 BLT_AUDIO_ASE_STATE_CODEC_CFG = 0x01, 33 BLT_AUDIO_ASE_STATE_QOS_CFG = 0x02, 34 BLT_AUDIO_ASE_STATE_ENABLING = 0x03, 35 BLT_AUDIO_ASE_STATE_STREAMING = 0x04, 36 BLT_AUDIO_ASE_STATE_DISABLING = 0x05, 37 BLT_AUDIO_ASE_STATE_RELEASING = 0x06, 38 } BLT_AUDIO_ASE_STATE_ENUM; 39 40 typedef enum { 41 BLT_AUDIO_ASE_FLAG_NONE = 0x0000, 42 43 BLT_AUDIOC_ASE_FLAG_ENABLE = 0x8000, 44 BLT_AUDIOC_ASE_FLAG_DISABLE = 0x4000, 45 BLT_AUDIOC_ASE_FLAG_SEND_WAIT = 0x2000, 46 BLT_AUDIOC_ASE_FLAG_SEND_CODEC = 0x1000, 47 BLT_AUDIOC_ASE_FLAG_SEND_QOS = 0x0800, 48 BLT_AUDIOC_ASE_FLAG_SEND_ENABLE = 0x0400, 49 BLT_AUDIOC_ASE_FLAG_SEND_DISABLE = 0x0200, 50 BLT_AUDIOC_ASE_FLAG_SEND_START = 0x0100, 51 BLT_AUDIOC_ASE_FLAG_SEND_STOP = 0x0080, 52 BLT_AUDIOC_ASE_FLAG_SEND_RELEASE = 0x0040, 53 BLT_AUDIOC_ASE_FLAG_SEND_UPDATE = 0x0020, 54 55 BLT_AUDIOC_ASE_FLAG_ENABLE_MASK = BLT_AUDIOC_ASE_FLAG_SEND_CODEC | BLT_AUDIOC_ASE_FLAG_SEND_QOS | 56 BLT_AUDIOC_ASE_FLAG_SEND_ENABLE | BLT_AUDIOC_ASE_FLAG_SEND_START | 57 BLT_AUDIOC_ASE_FLAG_ENABLE, 58 BLT_AUDIOC_ASE_FLAG_DISABLE_MASK = BLT_AUDIOC_ASE_FLAG_SEND_DISABLE | BLT_AUDIOC_ASE_FLAG_SEND_STOP | 59 BLT_AUDIOC_ASE_FLAG_SEND_RELEASE | BLT_AUDIOC_ASE_FLAG_DISABLE, 60 61 BLT_AUDIOC_ASE_FLAG_CREATE_CIS = 0x0010, 62 BLT_AUDIOC_ASE_FLAG_DESTORY_CIS = 0x0008, 63 BLT_AUDIOC_ASE_FLAG_CREATE_CIS_WAIT = 0x0004, 64 BLT_AUDIOC_ASE_FLAG_DESTORY_CIS_WAIT = 0x0002, 65 66 BLT_AUDIOS_ASE_FLAG_NOTY_STATE = 0x0001, 67 } BLT_AUDIO_ASE_FLAGS_ENUM; 68 69 typedef enum { 70 BLT_AUDIO_ASE_READY_NONE = 0x0000, 71 BLT_AUDIO_ASE_PARAM_READY = 0x8000, 72 BLT_AUDIO_ASE_CODEC_READY = 0x0001, 73 } BLT_AUDIO_ASE_READY_ENUM; 74 75 typedef enum { 76 BLT_AUDIO_ASCS_OPCODE_CONFIG_CODEC = 0x01, 77 BLT_AUDIO_ASCS_OPCODE_CONFIG_QOS = 0x02, 78 BLT_AUDIO_ASCS_OPCODE_CONFIG_ENABLE = 0x03, 79 BLT_AUDIO_ASCS_OPCODE_CONFIG_RECV_START = 0x04, 80 BLT_AUDIO_ASCS_OPCODE_CONFIG_DISABLE = 0x05, 81 BLT_AUDIO_ASCS_OPCODE_CONFIG_RECV_STOP = 0x06, 82 BLT_AUDIO_ASCS_OPCODE_CONFIG_UPDATE_METADATA = 0x07, 83 BLT_AUDIO_ASCS_OPCODE_CONFIG_RELEASE = 0x08, 84 } BLT_AUDIO_ASCS_OPCODE_ENUM; 85 86 typedef enum { 87 BLT_AUDIO_ASCS_ERRCODE_NONE = 0x0000, 88 BLT_AUDIO_ASCS_ERRCODE_UNSUPPORTED_OPCODE = 0x0001, 89 BLT_AUDIO_ASCS_ERRCODE_TRUNCATED_OPERATION = 0x0002, 90 BLT_AUDIO_ASCS_ERRCODE_INVALID_ASE_ID = 0x0003, 91 BLT_AUDIO_ASCS_ERRCODE_INVALID_ASE_STATE = 0x0004, 92 BLT_AUDIO_ASCS_ERRCODE_UNSUPPORTED_CAPABILITY = 0x0005, // need ASCS_REASON_ENUM 93 BLT_AUDIO_ASCS_ERRCODE_UNSUPPORTED_CONFIG = 0x0006, // need ASCS_REASON_ENUM 94 BLT_AUDIO_ASCS_ERRCODE_REJECTED_CONFIG = 0x0007, // need ASCS_REASON_ENUM 95 BLT_AUDIO_ASCS_ERRCODE_INVALID_CONFIG = 0x0008, // need ASCS_REASON_ENUM 96 BLT_AUDIO_ASCS_ERRCODE_UNSUPPORTED_METADATA = 0x0009, // need Value of the Metadata Type field in error 97 BLT_AUDIO_ASCS_ERRCODE_REJECTED_METADATA = 0x000A, // need Value of the Metadata Type field in error 98 BLT_AUDIO_ASCS_ERRCODE_INVALID_METADATA = 0x000B, // need Value of the Metadata Type field in error 99 BLT_AUDIO_ASCS_ERRCODE_INSUFFICIENT_RESOURCE = 0x000C, 100 BLT_AUDIO_ASCS_ERRCODE_UNSPECIFIED_ERROR = 0x000D, 101 } BLT_AUDIO_ASCS_ERRCODE_ENUM; 102 103 typedef enum { 104 BLT_AUDIO_ASCS_REASON_DIRECTION = 0x01, 105 BLT_AUDIO_ASCS_REASON_CODEC_ID = 0x02, 106 BLT_AUDIO_ASCS_REASON_CONFIG_LENGTH = 0x03, 107 BLT_AUDIO_ASCS_REASON_CONFIG = 0x04, 108 BLT_AUDIO_ASCS_REASON_SDU_INTERVAL = 0x05, 109 BLT_AUDIO_ASCS_REASON_FRAMING = 0x06, 110 BLT_AUDIO_ASCS_REASON_PHY = 0x07, 111 BLT_AUDIO_ASCS_REASON_SDU_SIZE = 0x08, 112 BLT_AUDIO_ASCS_REASON_RETRANS_NUMBER = 0x09, 113 BLT_AUDIO_ASCS_REASON_MAX_LATENCY = 0x0A, 114 BLT_AUDIO_ASCS_REASON_PRESENT_DELAY = 0x0B, 115 BLT_AUDIO_ASCS_REASON_METADATA_LENGTH = 0x0C, 116 } BLT_AUDIO_ASCS_REASON_ENUM; 117 118 typedef struct { // 42Bytes 119 u8 direction; /* <! audio sink and audio source */ 120 121 u8 prefSDUMinInterval[3]; /* <! Range: 0x0000FF - 0xFFFFFF */ 122 u8 prefSDUMaxInterval[3]; /* <! Range: 0x0000FF - 0xFFFFFF */ 123 u8 prefFraming; /* <! Preferred Frame */ 124 u8 prefPHY; /* <! Preferred PHY */ 125 u16 prefMaxSDU; 126 u8 prefRetransmitNum; /* <! Range: 0x00 - 0xFF */ 127 u16 prefMaxTransportLatency; /* <! Range: 0x0005-0x0FA0 */ 128 u8 prefMinPresentationDelay[3]; /* <! Unit: us */ 129 u8 prefMaxPresentationDelay[3]; /* <! Unit: us */ 130 131 u8 codecId[5]; 132 u8 codecSpecificCfgLen; 133 u8 codecSpecificCfg 134 [16]; /* <! max = 16Byte. Shall exist only if the Codec_Specific_Configuration_Length field is not 0x00. */ 135 } blt_audio_ascpCodecParam_t; 136 137 typedef struct { // 15Bytes 138 u8 cigID; 139 u8 cisID; 140 u8 SDUInterval[3]; 141 u8 framing; // refer AUDIO_FRAMING_UNFRAMED 142 u8 PHY; // refer AUDIO_PHY_FLAG_1M 143 u16 maxSDU; /* <! Range: 0x00C0xFFF */ 144 u8 retransmitNum; /* <! Range: 0x00C0x0F */ 145 u16 maxTransportLatency; /* <! Range: 0x0005C0x0FA0 */ 146 u8 presentationDelay[3]; /* <! Unit: us */ 147 } blt_audio_ascpQosParam_t; 148 149 typedef struct { // 7Bytes 150 u8 cigID; 151 u8 cisID; 152 u8 metaDataLen; 153 u8 metaData[4]; 154 } blt_audio_ascpEnableParam_t, blt_audio_ascpDisableParam_t, blt_audio_ascpStreamParam_t; 155 156 typedef struct { 157 u8 aseID; 158 u8 state; // refer ASCS_ASE_STATE_ENUM 159 union { 160 blt_audio_ascpCodecParam_t codec; 161 blt_audio_ascpQosParam_t qos; 162 blt_audio_ascpEnableParam_t enable; 163 blt_audio_ascpDisableParam_t disable; 164 blt_audio_ascpStreamParam_t stream; 165 } u; 166 } blt_audio_ascpState_t; 167 168 typedef struct { 169 u8 SDUMinInterval[3]; /* <! Range: 0x0000FF - 0xFFFFFF */ 170 u8 SDUMaxInterval[3]; /* <! Range: 0x0000FF - 0xFFFFFF */ 171 u8 framing; /* <! Preferred Frame */ 172 u8 PHY; /* <! Preferred PHY */ 173 u16 maxSDU; 174 u8 retransmitNum; /* <! Range: 0x00 - 0x0F */ 175 u16 maxTransportLatency; /* <! Range: 0x0005C0x0FA0 */ 176 u8 minPresentationDelay[3]; /* <! Unit: us */ 177 u8 maxPresentationDelay[3]; /* <! Unit: us */ 178 } blt_audio_ascpPreferredParam_t; 179 180 typedef struct { 181 u8 frequency; 182 u8 duration; 183 u16 frameOcts; 184 u32 allocation; 185 } blt_audio_ascpSpecificParam_t; 186 187 typedef struct { 188 u16 streamingContext; 189 } blt_audio_ascpMetadataParam_t; 190 191 int blc_audio_ascpAttRead(u16 connHandle, void *p); 192 int blc_audio_ascpAttWrite(u16 connHandle, void *p); 193 194 int blc_audio_ascpCisRequestEvt(u16 connHandle, u16 cisHandle, u8 *pPkt); 195 int blc_audio_ascpCisConnectEvt(u16 connHandle, u16 cisHandle, u8 *pPkt); 196 int blc_audio_ascpCisDisconnEvt(u16 connHandle, u16 cisHandle, u8 *pPkt); 197 int blc_audio_ascpRemoveCIGByAse(u16 connHandle, u8 aseID); 198 199 int blc_audio_ascpSetAseCfg(u16 connHandle, u8 aseID, blc_audio_aseConfig_t *pCfg); 200 int blc_audio_ascpSetAllAseCfg(u16 connHandle, blc_audio_aseConfig_t *pCfg); 201 202 int blc_audio_ascpEnableAse(u16 connHandle, u8 aseID); 203 int blc_audio_ascpDisableAse(u16 connHandle, u8 aseID); 204 int blc_audio_ascpReleaseAse(u16 connHandle, u8 aseID); 205 int blc_audio_ascpSendCtrlData(u16 connHandle, u8 aseID, u8 *pData, u16 dataLen); 206 207 static int blt_audio_ascpInit(blt_audio_handle_t *pHandle); 208 static int blt_audio_ascpGattIn(blt_audio_handle_t *pHandle, u8 *pPkt); 209 static int blt_audio_ascpSetServ(blt_audio_handle_t *pHandle, attribute_t *pService); 210 static void blt_audio_ascpSetConn(blt_audio_handle_t *pHandle, BLC_AUDIO_STATE_ENUM state); 211 static void blt_audio_ascpProcess(blt_audio_handle_t *pHandle); 212 213 static int blt_audio_ascpCreateCis(blt_audio_handle_t *pHandle, blt_audio_ascpAse_t *pAse); 214 static void blt_audio_ascpAseClientHandler(blt_audio_handle_t *pHandle, u8 aseNum); 215 static void blt_audio_ascpAseServerHandler(blt_audio_handle_t *pHandle, u8 aseNum); 216 static int blt_audio_ascpClientNotyHandler(blt_audio_handle_t *pHandle, blt_audio_attNotify_t *pNoty); 217 218 static u8 blt_audio_ascpCisIndex(blt_audio_handle_t *pHandle, u8 cigID, u8 cisID, u8 excludeAseID); 219 static u8 blt_audio_ascpCisIndex2(blt_audio_handle_t *pHandle, u8 cigID, u8 cisID); 220 221 static blt_audio_ascpAse_t *blt_audio_ascpFindAse(blt_audio_handle_t *pHandle, u8 aseID); 222 static u8 blt_audio_ascpGetSpecificParam(u8 specLen, u8 *pSpecific, blt_audio_ascpSpecificParam_t *pParam); 223 static u8 blt_audio_ascpGetMetadataParam(u8 metaLen, u8 *pMeta, blt_audio_ascpMetadataParam_t *pParam); 224 225 static int blt_audio_ascpSendAseCodec(blt_audio_handle_t *pHandle, blt_audio_ascpAse_t *pAse); 226 static int blt_audio_ascpSendAseQOS(blt_audio_handle_t *pHandle, blt_audio_ascpAse_t *pAse); 227 static int blt_audio_ascpSendAseEnable(blt_audio_handle_t *pHandle, blt_audio_ascpAse_t *pAse); 228 static int blt_audio_ascpSendAseStart(blt_audio_handle_t *pHandle, blt_audio_ascpAse_t *pAse); 229 static int blt_audio_ascpSendAseDisable(blt_audio_handle_t *pHandle, blt_audio_ascpAse_t *pAse); 230 static int blt_audio_ascpSendAseStop(blt_audio_handle_t *pHandle, blt_audio_ascpAse_t *pAse); 231 static int blt_audio_ascpSendAseUpdate(blt_audio_handle_t *pHandle, blt_audio_ascpAse_t *pAse); 232 static int blt_audio_ascpSendAseRelease(blt_audio_handle_t *pHandle, blt_audio_ascpAse_t *pAse); 233 234 static bool blt_audio_ascpSendAseState(blt_audio_handle_t *pHandle, u8 num, u8 isNotify); 235 static void blt_audio_ascpConfigHandle(blt_audio_handle_t *pHandle, u8 opcode, u8 dataLen, u8 *pData); 236 237 static void blt_audio_ascpSendEnableEvt(blt_audio_handle_t *pHandle, blt_audio_ascpAse_t *pAse, u8 errCode, u8 reason); 238 static void blt_audio_ascpSendUpdateEvt(blt_audio_handle_t *pHandle, blt_audio_ascpAse_t *pAse); 239 static void blt_audio_ascpSendStartEvt(blt_audio_handle_t *pHandle, blt_audio_ascpAse_t *pAse); 240 static void blt_audio_ascpSendDisableEvt(blt_audio_handle_t *pHandle, blt_audio_ascpAse_t *pAse); 241 static void blt_audio_ascpSendStopEvt(blt_audio_handle_t *pHandle, blt_audio_ascpAse_t *pAse); 242 static void blt_audio_ascpSendReleaseEvt(blt_audio_handle_t *pHandle, blt_audio_ascpAse_t *pAse); 243 244 #endif // #if (BLC_AUDIO_ASCS_ENABLE) 245 246 #endif // _AUDIO_BAP_H_ 247