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