1 /*
2  * Copyright (C) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef A2DP_DEF_H
17 #define A2DP_DEF_H
18 
19 #include <cstddef>
20 #include <cstdint>
21 
22 #include "a2dp_codec/include/a2dp_codec_constant.h"
23 #include "avdtp.h"
24 #include "bt_def.h"
25 #include "btstack.h"
26 
27 namespace OHOS {
28 namespace bluetooth {
29 /**
30  * SBC Codec Specific Information Element
31  */
32 #define A2DP_ROLE_SOURCE 0
33 #define A2DP_ROLE_SINK 1
34 #define A2DP_ROLE_INT 2
35 #define A2DP_ROLE_ACP 3
36 
37 /* the timeout to wait for open req after setconfig for incoming connections */
38 #ifndef A2DP_SIGNALLING_TIMEOUT_MS
39 #define A2DP_SIGNALLING_TIMEOUT_MS (8 * 1000) /* 8 seconds */
40 #endif
41 
42 /// Service class uuid for A2DP.
43 #define A2DP_SERVICE_CLASS_UUID (0x110A)
44 
45 /// Number of items when add service class id list.
46 #define A2DP_SERVICE_CLASS_ID_LIST_NUMBER (0x0001)
47 
48 /// Service class uuid for A2DP Sink.
49 #define A2DP_SINK_SERVICE_CLASS_UUID (0x110B)
50 /// Service class uuid for A2DP Source.
51 #define A2DP_SERVICE_CLASS_UUID (0x110A)
52 /// Service class uuid for AVDTP.
53 #define A2DP_PROTOCOL_UUID_AVDTP (0x0019)
54 /// Service class uuid for L2CAP.
55 #define A2DP_PROTOCOL_UUID_L2CAP (0x0100)
56 /// Number of items when add protocol descriptor.
57 #define A2DP_PROTOCOL_DESCRIPTOR_LIST_NUMBER (0x0002)
58 /// Number of items when add bluetooth profile descriptor list.
59 #define A2DP_BLUETOOTH_PROFILE_DESCRIPTOR_LIST_NUMBER (0x0001)
60 /// Profile uuid for A2DP.
61 #define A2DP_PROFILE_UUID (0x110D)
62 /// The Version of A2DP Profile is 1.3.
63 #define A2DP_PROFILE_REV_1_3 (0x0103)
64 
65 /* Time to wait for signalling from ACP */
66 #ifndef A2DP_ACCEPT_SIGNALLING_TIMEOUT_MS
67 #define A2DP_ACCEPT_SIGNALLING_TIMEOUT_MS (2 * 1000) /* 2 seconds */
68 #endif
69 
70 /* Time to wait for close transport channel from INT */
71 #ifndef A2DP_ACCEPT_CLOSING_SIGNALLING_TIMEOUT_MS
72 #define A2DP_ACCEPT_CLOSING_SIGNALLING_TIMEOUT_MS (3 * 1000) /* 3 seconds */
73 #endif
74 
75 #define A2DP_MAX_AVDTP_MTU_SIZE 1024  // MTU=1005, AVDTP Header:12, L2CAP:4
76 
77 #define A2DP_STREAM_HANDLES_NUMBER 1  // number of start stream
78 
79 struct CallbackParameter {
80     uint8_t role;
81     bool srcRole;
82     uint16_t handle;
83 };
84 
85 struct CodecInfo {
86     A2dpCodecIndex codecIndex;
87     uint8_t codecInfo[A2DP_CODEC_SIZE];  // Codec codecInfo
88 };
89 
90 enum ServiceStatus {
91     STREAM_CONNECTING,
92     STREAM_CONNECT,
93     STREAM_DISCONNECTING,
94     STREAM_DISCONNECT,
95     STREAM_CONNECT_FAILED,
96     STREAM_DISCONNECT_FAILED,
97     STREAM_TIMEOUT
98 };
99 
100 enum EventStream {
101     EVT_SDP_DISC,
102     EVT_SDP_CFM,
103     EVT_CONNECT_REQ,
104     EVT_CONNECT_IND,
105     EVT_CONNECT_CFM,
106     EVT_DISCOVER_REQ,
107     EVT_DISCOVER_CFM,
108     EVT_SETCONFIG_REQ,
109     EVT_SETCONFIG_IND,
110     EVT_SETCONFIG_CFM,
111     EVT_GET_ALLCAP_REQ,
112     EVT_GET_ALLCAP_IND,
113     EVT_GET_ALLCAP_CFM,
114     EVT_GET_CAP_REQ,
115     EVT_GET_CAP_IND,
116     EVT_GET_CAP_CFM,
117     EVT_OPEN_REQ,
118     EVT_OPEN_IND,
119     EVT_OPEN_CFM,
120     EVT_START_REQ,
121     EVT_START_IND,
122     EVT_START_CFM,
123     EVT_GETCONFIG_REQ,
124     EVT_GETCONFIG_IND,
125     EVT_GETCONFIG_CFM,
126     EVT_RECONFIG_REQ,
127     EVT_RECONFIG_IND,
128     EVT_RECONFIG_CFM,
129     EVT_SUSPEND_REQ,
130     EVT_SUSPEND_IND,
131     EVT_SUSPEND_CFM,
132     EVT_DISCONNECT_REQ,
133     EVT_DISCONNECT_IND,
134     EVT_DISCONNECT_CFM,
135     EVT_CLOSE_REQ,
136     EVT_CLOSE_IND,
137     EVT_CLOSE_CFM,
138     EVT_DELAY_REQ,
139     EVT_DELAY_IND,
140     EVT_DELAY_CFM,
141     EVT_ABORT_REQ,
142     EVT_ABORT_IND,
143     EVT_ABORT_CFM,
144     EVT_WRITE_CFM,
145     EVT_TIME_OUT,
146     EVT_CLOSE_TRANS_IND
147 };
148 
149 struct StreamInfo {
150     BtAddr addr;
151     uint16_t handle;
152     uint8_t acpSeid;
153     uint8_t label;
154     uint8_t errCode;
155 };
156 
157 struct ConfigureStream {
158     BtAddr addr;
159     uint8_t intSeid;
160     uint8_t acpSeid;
161     AvdtSepConfig cfg;
162 };
163 
164 struct ConfigrueRsp {
165     AvdtCatetory category;
166     uint16_t handle;
167     uint16_t scbIndex;
168     uint8_t label;
169     BtAddr addr;
170     uint8_t codecInfo[AVDT_CODEC_SIZE];
171     uint8_t role;
172 };
173 
174 struct GetConfigrueRsp {
175     AvdtCatetory category;
176     uint16_t handle;
177     uint16_t scbIndex;
178     uint8_t label;
179     BtAddr addr;
180     AvdtSepConfig cfg;
181 };
182 
183 struct SepDetail {
184     BtAddr addr;
185     AvdtStreamConfig cfg;
186 };
187 
188 struct ConnectReq {
189     BtAddr addr;
190     uint8_t errCode;
191 };
192 
193 struct DelayReportInfo {
194     BtAddr addr;
195     uint16_t handle;
196     uint16_t delayValue;
197 };
198 
199 union A2dpAvdtMsgData {
200     StreamInfo stream;
201     ConnectReq connectInfo;
202     ConfigureStream configStream;
203     ConfigrueRsp configRsp;
204     GetConfigrueRsp getConfigureRsp;
205     DelayReportInfo delayReportInfo;
206     AvdtSepInfo discoverData[AVDT_NUM_SEPS];
207     SepDetail sepDetail;
208     AvdtCtrlData msg;
209 };
210 
211 struct A2dpAvdtMsg {
212     uint16_t handle;
213     uint8_t role;
214     uint8_t event;
215     A2dpAvdtMsgData a2dpMsg;
216 };
217 
218 enum A2dpEvent {
219     A2DP_INVALID_EVT = 0,
220     A2DP_CONNECT_EVT,
221     A2DP_DISCONNECT_EVT,
222     A2DP_AVDTP_EVT,
223     A2DP_SDP_EVT,
224     A2DP_TIMEOUT_EVT,
225 };
226 
227 enum A2dpConnectNum {
228     A2DP_CONNECT_NUM_MAX = 6,
229     A2DP_CONNECT_NUM_UN_MAX,
230 };
231 
232 enum A2dpMessage {
233     A2DP_MSG_CONNECT,
234     A2DP_MSG_DISCONNECT,
235     A2DP_MSG_CONNECT_TIMEOUT,
236     A2DP_MSG_CONNECT_FORBIDDEN,
237     A2DP_MSG_PROFILE_CONNECTED,
238     A2DP_MSG_PROFILE_CONNECTING,
239     A2DP_MSG_PROFILE_DISCONNECTED,
240     A2DP_MSG_PROFILE_DISCONNECTING,
241     A2DP_MSG_PROFILE_AUDIO_PLAY_START,
242     A2DP_MSG_PROFILE_AUDIO_PLAY_SUSPEND,
243     A2DP_MSG_PROFILE_AUDIO_PLAY_STOP,
244     A2DP_MSG_PROFILE_CODEC_CHANGE,
245 };
246 }  // namespace bluetooth
247 }  // namespace OHOS
248 #endif  // A2DP_DEF_H