• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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