• 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 kCtpMetadataResponsePreferredAudioContexts = 0x01;
64 constexpr uint8_t kCtpMetadataResponseStreamingAudioContexts = 0x02;
65 constexpr uint8_t kCtpMetadataResponseProgramInfo = 0x03;
66 constexpr uint8_t kCtpMetadataResponseLanguage = 0x04;
67 constexpr uint8_t kCtpMetadataResponseCcidList = 0x05;
68 constexpr uint8_t kCtpMetadataResponseParentalRating = 0x06;
69 constexpr uint8_t kCtpMetadataResponseProgramInfoUri = 0x07;
70 constexpr uint8_t kCtpMetadataResponseExtendedMetadata = 0xFE;
71 constexpr uint8_t kCtpMetadataResponseVendorSpecific = 0xFF;
72 
73 constexpr uint8_t kLeAudioErrorCtpUnsupporterdOpcode = 0xFF;
74 constexpr uint8_t kLeAudioErrorCtpTruncatedOperation = 0xFE;
75 constexpr uint8_t kLeAudioErrorCtpCtpErr = 0xFD;
76 
77 /* ASE states */
78 constexpr uint8_t kAseStateIdle = 0x00;
79 constexpr uint8_t kAseStateCodecConfigured = 0x01;
80 constexpr uint8_t kAseStateQosConfigured = 0x02;
81 constexpr uint8_t kAseStateEnabling = 0x03;
82 constexpr uint8_t kAseStateStreaming = 0x04;
83 constexpr uint8_t kAseStateDisabling = 0x05;
84 constexpr uint8_t kAseStateReleasing = 0x06;
85 
86 /* Control point opcodes */
87 constexpr uint8_t kCtpOpcodeCodecConfiguration = 0x01;
88 constexpr uint8_t kCtpOpcodeQosConfiguration = 0x02;
89 constexpr uint8_t kCtpOpcodeEnable = 0x03;
90 constexpr uint8_t kCtpOpcodeReceiverStartReady = 0x04;
91 constexpr uint8_t kCtpOpcodeDisable = 0x05;
92 constexpr uint8_t kCtpOpcodeReceiverStopReady = 0x06;
93 constexpr uint8_t kCtpOpcodeUpdateMetadata = 0x07;
94 constexpr uint8_t kCtpOpcodeRelease = 0x08;
95 
96 /* ASE status masks */
97 static constexpr uint32_t kAseRspHeaderMaskCtrlStatusFailureOpcode = 0x00FF0000;
98 static constexpr uint32_t kAseRspHeaderMaskCtrlStatusErrorCode = 0x0000FF00;
99 static constexpr uint32_t kAseRspHeaderMaskCtrlStatusErrorReason = 0x000000FF;
100 
101 constexpr uint16_t kAseStatusCodecConfMinLen = 23;
102 struct ase_codec_configured_state_params {
103   uint8_t framing;
104   uint8_t preferred_phy;
105   uint8_t preferred_retrans_nb;
106   uint16_t max_transport_latency;
107   uint32_t pres_delay_min;
108   uint32_t pres_delay_max;
109   uint32_t preferred_pres_delay_min;
110   uint32_t preferred_pres_delay_max;
111   types::LeAudioCodecId codec_id;
112   std::vector<uint8_t> codec_spec_conf;
113 };
114 
115 constexpr uint16_t kAseStatusCodecQosConfMinLen = 15;
116 struct ase_qos_configured_state_params {
117   uint8_t cig_id;
118   uint8_t cis_id;
119   uint32_t sdu_interval;
120   uint8_t framing;
121   uint8_t phy;
122   uint16_t max_sdu;
123   uint8_t retrans_nb;
124   uint16_t max_transport_latency;
125   uint32_t pres_delay;
126 };
127 
128 constexpr uint16_t kAseStatusTransMinLen = 3;
129 struct ase_transient_state_params {
130   uint8_t cig_id;
131   uint8_t cis_id;
132   std::vector<uint8_t> metadata;
133 };
134 
135 constexpr uint16_t kCtpAseEntryMinLen = 3;
136 struct ctp_ase_entry {
137   uint8_t ase_id;
138   uint8_t response_code;
139   uint8_t reason;
140 };
141 
142 constexpr uint16_t kCtpNtfMinLen = 2;
143 struct ctp_ntf {
144   uint8_t op;
145   std::vector<struct ctp_ase_entry> entries;
146 };
147 
148 constexpr uint16_t kAseRspHdrMinLen = 2;
149 struct ase_rsp_hdr {
150   uint8_t id;
151   uint8_t state;
152 };
153 
154 constexpr uint8_t kCtpOpSize = 1;
155 constexpr uint8_t kAseNumSize = 1;
156 constexpr uint8_t kAseIdSize = 1;
157 
158 constexpr uint16_t kCtpCodecConfMinLen = 9;
159 struct ctp_codec_conf {
160   uint8_t ase_id;
161   uint8_t target_latency;
162   uint8_t target_phy;
163   types::LeAudioCodecId codec_id;
164   types::LeAudioLc3Config codec_config;
165 };
166 
167 constexpr uint16_t kCtpQosConfMinLen = 16;
168 struct ctp_qos_conf {
169   uint8_t ase_id;
170   uint8_t cig;
171   uint8_t cis;
172   uint32_t sdu_interval;
173   uint8_t framing;
174   uint8_t phy;
175   uint16_t max_sdu;
176   uint8_t retrans_nb;
177   uint16_t max_transport_latency;
178   uint32_t pres_delay;
179 };
180 
181 constexpr uint16_t kCtpEnableMinLen = 2;
182 struct ctp_enable {
183   uint8_t ase_id;
184   std::vector<uint8_t> metadata;
185 };
186 
187 constexpr uint16_t kCtpUpdateMetadataMinLen = 2;
188 struct ctp_update_metadata {
189   uint8_t ase_id;
190   std::vector<uint8_t> metadata;
191 };
192 
193 /* Device control and common functions */
194 bool ParseAseStatusHeader(ase_rsp_hdr& rsp, uint16_t len, const uint8_t* value);
195 bool ParseAseStatusCodecConfiguredStateParams(
196     struct ase_codec_configured_state_params& rsp, uint16_t len,
197     const uint8_t* value);
198 bool ParseAseStatusQosConfiguredStateParams(
199     struct ase_qos_configured_state_params& rsp, uint16_t len,
200     const uint8_t* value);
201 bool ParseAseStatusTransientStateParams(struct ase_transient_state_params& rsp,
202                                         uint16_t len, const uint8_t* value);
203 bool ParseAseCtpNotification(struct ctp_ntf& ntf, uint16_t len,
204                              const uint8_t* value);
205 bool PrepareAseCtpCodecConfig(const std::vector<struct ctp_codec_conf>& confs,
206                               std::vector<uint8_t>& value);
207 bool PrepareAseCtpConfigQos(const std::vector<struct ctp_qos_conf>& confs,
208                             std::vector<uint8_t>& value);
209 bool PrepareAseCtpEnable(const std::vector<struct ctp_enable>& confs,
210                          std::vector<uint8_t>& value);
211 bool PrepareAseCtpAudioReceiverStartReady(const std::vector<uint8_t>& ids,
212                                           std::vector<uint8_t>& value);
213 bool PrepareAseCtpDisable(const std::vector<uint8_t>& ids,
214                           std::vector<uint8_t>& value);
215 bool PrepareAseCtpAudioReceiverStopReady(const std::vector<uint8_t>& ids,
216                                          std::vector<uint8_t>& value);
217 bool PrepareAseCtpUpdateMetadata(
218     const std::vector<struct ctp_update_metadata>& confs,
219     std::vector<uint8_t>& value);
220 bool PrepareAseCtpRelease(const std::vector<uint8_t>& ids,
221                           std::vector<uint8_t>& value);
222 }  // namespace ascs
223 
224 namespace pacs {
225 
226 constexpr uint16_t kAcsPacRecordMinLen = 7;
227 constexpr uint8_t kAcsPacMetadataLenLen = 1;
228 constexpr uint16_t kAcsPacDiscoverRspMinLen = 1;
229 
230 constexpr uint16_t kAudioLocationsRspMinLen = 4;
231 
232 constexpr uint16_t kAseAudioAvailRspMinLen = 4;
233 struct acs_available_audio_contexts {
234   types::AudioContexts snk_avail_cont;
235   types::AudioContexts src_avail_cont;
236 };
237 
238 constexpr uint16_t kAseAudioSuppContRspMinLen = 4;
239 struct acs_supported_audio_contexts {
240   types::AudioContexts snk_supp_cont;
241   types::AudioContexts src_supp_cont;
242 };
243 
244 int ParseSinglePac(std::vector<struct types::acs_ac_record>& pac_recs,
245                    uint16_t len, const uint8_t* value);
246 bool ParsePacs(std::vector<struct types::acs_ac_record>& pac_recs, uint16_t len,
247                const uint8_t* value);
248 bool ParseAudioLocations(types::AudioLocations& audio_locations, uint16_t len,
249                          const uint8_t* value);
250 bool ParseAvailableAudioContexts(struct acs_available_audio_contexts& rsp,
251                                  uint16_t len, const uint8_t* value);
252 bool ParseSupportedAudioContexts(struct acs_supported_audio_contexts& rsp,
253                                  uint16_t len, const uint8_t* value);
254 }  // namespace pacs
255 
256 namespace tmap {
257 
258 constexpr uint16_t kTmapRoleLen = 2;
259 
260 bool ParseTmapRole(std::bitset<16>& role, uint16_t len, const uint8_t* value);
261 
262 }  // namespace tmap
263 }  // namespace client_parser
264 }  // namespace le_audio
265