• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2019 HIMSA II K/S - www.himsa.com. Represented by EHIMA -
3  * www.ehima.com
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 /*
19  * This file contains the Audio Stream Control (LE_AUDIO) API function external
20  * definitions.
21  */
22 
23 #pragma once
24 
25 #include "le_audio_types.h"
26 
27 namespace le_audio {
28 namespace client_parser {
29 namespace ascs {
30 /*
31  * All structures and defines are described in Audio Stream Control Service
32  * specification
33  */
34 
35 constexpr uint8_t kCtpResponseCodeSuccess = 0x00;
36 constexpr uint8_t kCtpResponseCodeUnsupportedOpcode = 0x01;
37 constexpr uint8_t kCtpResponseCodeInvalidLength = 0x02;
38 constexpr uint8_t kCtpResponseCodeInvalidAseId = 0x03;
39 constexpr uint8_t kCtpResponseCodeInvalidAseStateMachineTransition = 0x04;
40 constexpr uint8_t kCtpResponseCodeInvalidAseDirection = 0x05;
41 constexpr uint8_t kCtpResponseCodeUnsupportedAudioCapabilities = 0x06;
42 constexpr uint8_t kCtpResponseCodeUnsupportedConfigurationParameterValue = 0x07;
43 constexpr uint8_t kCtpResponseCodeRejectedConfigurationParameterValue = 0x08;
44 constexpr uint8_t kCtpResponseCodeInvalidConfigurationParameterValue = 0x09;
45 constexpr uint8_t kCtpResponseCodeUnsupportedMetadata = 0x0A;
46 constexpr uint8_t kCtpResponseCodeRejectedMetadata = 0x0B;
47 constexpr uint8_t kCtpResponseCodeInvalidMetadata = 0x0C;
48 constexpr uint8_t kCtpResponseCodeInsufficientResources = 0x0D;
49 constexpr uint8_t kCtpResponseCodeUnspecifiedError = 0x0E;
50 
51 constexpr uint8_t kCtpResponseNoReason = 0x00;
52 constexpr uint8_t kCtpResponseCodecId = 0x01;
53 constexpr uint8_t kCtpResponseCodecSpecificConfiguration = 0x02;
54 constexpr uint8_t kCtpResponseSduInterval = 0x03;
55 constexpr uint8_t kCtpResponseFraming = 0x04;
56 constexpr uint8_t kCtpResponsePhy = 0x05;
57 constexpr uint8_t kCtpResponseMaximumSduSize = 0x06;
58 constexpr uint8_t kCtpResponseRetransmissionNumber = 0x07;
59 constexpr uint8_t kCtpResponseMaxTransportLatency = 0x08;
60 constexpr uint8_t kCtpResponsePresentationDelay = 0x09;
61 constexpr uint8_t kCtpResponseInvalidAseCisMapping = 0x0A;
62 
63 constexpr uint8_t kLeAudioErrorCtpUnsupporterdOpcode = 0xFF;
64 constexpr uint8_t kLeAudioErrorCtpTruncatedOperation = 0xFE;
65 constexpr uint8_t kLeAudioErrorCtpCtpErr = 0xFD;
66 
67 /* ASE states */
68 constexpr uint8_t kAseStateIdle = 0x00;
69 constexpr uint8_t kAseStateCodecConfigured = 0x01;
70 constexpr uint8_t kAseStateQosConfigured = 0x02;
71 constexpr uint8_t kAseStateEnabling = 0x03;
72 constexpr uint8_t kAseStateStreaming = 0x04;
73 constexpr uint8_t kAseStateDisabling = 0x05;
74 constexpr uint8_t kAseStateReleasing = 0x06;
75 
76 /* Control point opcodes */
77 constexpr uint8_t kCtpOpcodeCodecConfiguration = 0x01;
78 constexpr uint8_t kCtpOpcodeQosConfiguration = 0x02;
79 constexpr uint8_t kCtpOpcodeEnable = 0x03;
80 constexpr uint8_t kCtpOpcodeReceiverStartReady = 0x04;
81 constexpr uint8_t kCtpOpcodeDisable = 0x05;
82 constexpr uint8_t kCtpOpcodeReceiverStopReady = 0x06;
83 constexpr uint8_t kCtpOpcodeUpdateMetadata = 0x07;
84 constexpr uint8_t kCtpOpcodeRelease = 0x08;
85 
86 /* ASE status masks */
87 static constexpr uint32_t kAseRspHeaderMaskCtrlStatusFailureOpcode = 0x00FF0000;
88 static constexpr uint32_t kAseRspHeaderMaskCtrlStatusErrorCode = 0x0000FF00;
89 static constexpr uint32_t kAseRspHeaderMaskCtrlStatusErrorReason = 0x000000FF;
90 
91 constexpr uint16_t kAseStatusCodecConfMinLen = 23;
92 struct ase_codec_configured_state_params {
93   uint8_t framing;
94   uint8_t preferred_phy;
95   uint8_t preferred_retrans_nb;
96   uint16_t max_transport_latency;
97   uint32_t pres_delay_min;
98   uint32_t pres_delay_max;
99   uint32_t preferred_pres_delay_min;
100   uint32_t preferred_pres_delay_max;
101   types::LeAudioCodecId codec_id;
102   std::vector<uint8_t> codec_spec_conf;
103 };
104 
105 constexpr uint16_t kAseStatusCodecQosConfMinLen = 15;
106 struct ase_qos_configured_state_params {
107   uint8_t cig_id;
108   uint8_t cis_id;
109   uint32_t sdu_interval;
110   uint8_t framing;
111   uint8_t phy;
112   uint16_t max_sdu;
113   uint8_t retrans_nb;
114   uint16_t max_transport_latency;
115   uint32_t pres_delay;
116 };
117 
118 constexpr uint16_t kAseStatusTransMinLen = 3;
119 struct ase_transient_state_params {
120   uint8_t cig_id;
121   uint8_t cis_id;
122   std::vector<uint8_t> metadata;
123 };
124 
125 constexpr uint16_t kCtpAseEntryMinLen = 3;
126 struct ctp_ase_entry {
127   uint8_t ase_id;
128   uint8_t response_code;
129   uint8_t reason;
130 };
131 
132 constexpr uint16_t kCtpNtfMinLen = 2;
133 struct ctp_ntf {
134   uint8_t op;
135   std::vector<struct ctp_ase_entry> entries;
136 };
137 
138 constexpr uint16_t kAseRspHdrMinLen = 2;
139 struct ase_rsp_hdr {
140   uint8_t id;
141   uint8_t state;
142 };
143 
144 constexpr uint8_t kCtpOpSize = 1;
145 constexpr uint8_t kAseNumSize = 1;
146 constexpr uint8_t kAseIdSize = 1;
147 
148 constexpr uint16_t kCtpCodecConfMinLen = 9;
149 struct ctp_codec_conf {
150   uint8_t ase_id;
151   uint8_t target_latency;
152   uint8_t target_phy;
153   types::LeAudioCodecId codec_id;
154   types::LeAudioLc3Config codec_config;
155 };
156 
157 constexpr uint16_t kCtpQosConfMinLen = 16;
158 struct ctp_qos_conf {
159   uint8_t ase_id;
160   uint8_t cig;
161   uint8_t cis;
162   uint32_t sdu_interval;
163   uint8_t framing;
164   uint8_t phy;
165   uint16_t max_sdu;
166   uint8_t retrans_nb;
167   uint16_t max_transport_latency;
168   uint32_t pres_delay;
169 };
170 
171 constexpr uint16_t kCtpEnableMinLen = 2;
172 struct ctp_enable {
173   uint8_t ase_id;
174   std::vector<uint8_t> metadata;
175 };
176 
177 constexpr uint16_t kCtpUpdateMetadataMinLen = 2;
178 struct ctp_update_metadata {
179   uint8_t ase_id;
180   std::vector<uint8_t> metadata;
181 };
182 
183 /* Device control and common functions */
184 bool ParseAseStatusHeader(ase_rsp_hdr& rsp, uint16_t len, const uint8_t* value);
185 bool ParseAseStatusCodecConfiguredStateParams(
186     struct ase_codec_configured_state_params& rsp, uint16_t len,
187     const uint8_t* value);
188 bool ParseAseStatusQosConfiguredStateParams(
189     struct ase_qos_configured_state_params& rsp, uint16_t len,
190     const uint8_t* value);
191 bool ParseAseStatusTransientStateParams(struct ase_transient_state_params& rsp,
192                                         uint16_t len, const uint8_t* value);
193 bool ParseAseCtpNotification(struct ctp_ntf& ntf, uint16_t len,
194                              const uint8_t* value);
195 bool PrepareAseCtpCodecConfig(const std::vector<struct ctp_codec_conf>& confs,
196                               std::vector<uint8_t>& value);
197 bool PrepareAseCtpConfigQos(const std::vector<struct ctp_qos_conf>& confs,
198                             std::vector<uint8_t>& value);
199 bool PrepareAseCtpEnable(const std::vector<struct ctp_enable>& confs,
200                          std::vector<uint8_t>& value);
201 bool PrepareAseCtpAudioReceiverStartReady(const std::vector<uint8_t>& ids,
202                                           std::vector<uint8_t>& value);
203 bool PrepareAseCtpDisable(const std::vector<uint8_t>& ids,
204                           std::vector<uint8_t>& value);
205 bool PrepareAseCtpAudioReceiverStopReady(const std::vector<uint8_t>& ids,
206                                          std::vector<uint8_t>& value);
207 bool PrepareAseCtpUpdateMetadata(
208     const std::vector<struct ctp_update_metadata>& confs,
209     std::vector<uint8_t>& value);
210 bool PrepareAseCtpRelease(const std::vector<uint8_t>& ids,
211                           std::vector<uint8_t>& value);
212 }  // namespace ascs
213 
214 namespace pacs {
215 
216 constexpr uint16_t kAcsPacRecordMinLen = 7;
217 constexpr uint8_t kAcsPacMetadataLenLen = 1;
218 constexpr uint16_t kAcsPacDiscoverRspMinLen = 1;
219 
220 constexpr uint16_t kAudioLocationsRspMinLen = 4;
221 
222 constexpr uint16_t kAseAudioAvailRspMinLen = 4;
223 struct acs_available_audio_contexts {
224   types::AudioContexts snk_avail_cont;
225   types::AudioContexts src_avail_cont;
226 };
227 
228 constexpr uint16_t kAseAudioSuppContRspMinLen = 4;
229 struct acs_supported_audio_contexts {
230   types::AudioContexts snk_supp_cont;
231   types::AudioContexts src_supp_cont;
232 };
233 
234 int ParseSinglePac(std::vector<struct types::acs_ac_record>& pac_recs,
235                    uint16_t len, const uint8_t* value);
236 bool ParsePacs(std::vector<struct types::acs_ac_record>& pac_recs, uint16_t len,
237                const uint8_t* value);
238 bool ParseAudioLocations(types::AudioLocations& audio_locations, uint16_t len,
239                          const uint8_t* value);
240 bool ParseAvailableAudioContexts(struct acs_available_audio_contexts& rsp,
241                                  uint16_t len, const uint8_t* value);
242 bool ParseSupportedAudioContexts(struct acs_supported_audio_contexts& rsp,
243                                  uint16_t len, const uint8_t* value);
244 }  // namespace pacs
245 
246 namespace tmap {
247 
248 constexpr uint16_t kTmapRoleLen = 2;
249 
250 bool ParseTmapRole(std::bitset<16>& role, uint16_t len, const uint8_t* value);
251 
252 }  // namespace tmap
253 }  // namespace client_parser
254 }  // namespace le_audio
255