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 #pragma once 19 20 #include <array> 21 #include <map> 22 #include <optional> 23 #include <vector> 24 25 #include "raw_address.h" 26 27 namespace bluetooth { 28 namespace le_audio { 29 30 enum class ConnectionState { 31 DISCONNECTED = 0, 32 CONNECTING, 33 CONNECTED, 34 DISCONNECTING 35 }; 36 37 enum class GroupStatus { 38 INACTIVE = 0, 39 ACTIVE, 40 TURNED_IDLE_DURING_CALL, 41 }; 42 43 enum class GroupStreamStatus { 44 IDLE = 0, 45 STREAMING, 46 RELEASING, 47 SUSPENDING, 48 SUSPENDED, 49 CONFIGURED_AUTONOMOUS, 50 CONFIGURED_BY_USER, 51 DESTROYED, 52 }; 53 54 enum class GroupNodeStatus { 55 ADDED = 1, 56 REMOVED, 57 }; 58 59 typedef enum { 60 LE_AUDIO_CODEC_INDEX_SOURCE_LC3 = 0, 61 LE_AUDIO_CODEC_INDEX_SOURCE_MAX 62 } btle_audio_codec_index_t; 63 64 typedef enum { QUALITY_STANDARD = 0, QUALITY_HIGH } btle_audio_quality_t; 65 66 typedef struct { 67 btle_audio_codec_index_t codec_type; 68 ToString__anon4fb16df0030869 std::string ToString() const { 70 std::string codec_name_str; 71 72 switch (codec_type) { 73 case LE_AUDIO_CODEC_INDEX_SOURCE_LC3: 74 codec_name_str = "LC3"; 75 break; 76 default: 77 codec_name_str = "Unknown LE codec " + std::to_string(codec_type); 78 break; 79 } 80 return "codec: " + codec_name_str; 81 } 82 } btle_audio_codec_config_t; 83 84 class LeAudioClientCallbacks { 85 public: 86 virtual ~LeAudioClientCallbacks() = default; 87 88 /* Callback to notify Java that stack is ready */ 89 virtual void OnInitialized(void) = 0; 90 91 /** Callback for profile connection state change */ 92 virtual void OnConnectionState(ConnectionState state, 93 const RawAddress& address) = 0; 94 95 /* Callback with group status update */ 96 virtual void OnGroupStatus(int group_id, GroupStatus group_status) = 0; 97 98 /* Callback with node status update */ 99 virtual void OnGroupNodeStatus(const RawAddress& bd_addr, int group_id, 100 GroupNodeStatus node_status) = 0; 101 /* Callback for newly recognized or reconfigured existing le audio group */ 102 virtual void OnAudioConf(uint8_t direction, int group_id, 103 uint32_t snk_audio_location, 104 uint32_t src_audio_location, 105 uint16_t avail_cont) = 0; 106 /* Callback for sink audio location recognized */ 107 virtual void OnSinkAudioLocationAvailable(const RawAddress& address, 108 uint32_t snk_audio_locations) = 0; 109 /* Callback with local codec capabilities */ 110 virtual void OnAudioLocalCodecCapabilities( 111 std::vector<btle_audio_codec_config_t> local_input_capa_codec_conf, 112 std::vector<btle_audio_codec_config_t> local_output_capa_codec_conf) = 0; 113 /* Callback with group codec configurations */ 114 virtual void OnAudioGroupCodecConf( 115 int group_id, btle_audio_codec_config_t input_codec_conf, 116 btle_audio_codec_config_t output_codec_conf, 117 std::vector<btle_audio_codec_config_t> input_selectable_codec_conf, 118 std::vector<btle_audio_codec_config_t> output_selectable_codec_conf) = 0; 119 }; 120 121 class LeAudioClientInterface { 122 public: 123 virtual ~LeAudioClientInterface() = default; 124 125 /* Register the LeAudio callbacks */ 126 virtual void Initialize( 127 LeAudioClientCallbacks* callbacks, 128 const std::vector<btle_audio_codec_config_t>& offloading_preference) = 0; 129 130 /** Connect to LEAudio */ 131 virtual void Connect(const RawAddress& address) = 0; 132 133 /** Disconnect from LEAudio */ 134 virtual void Disconnect(const RawAddress& address) = 0; 135 136 /* Set enable/disable State for the LeAudio device */ 137 virtual void SetEnableState(const RawAddress& address, bool enabled) = 0; 138 139 /* Cleanup the LeAudio */ 140 virtual void Cleanup(void) = 0; 141 142 /* Called when LeAudio is unbonded. */ 143 virtual void RemoveDevice(const RawAddress& address) = 0; 144 145 /* Attach le audio node to group */ 146 virtual void GroupAddNode(int group_id, const RawAddress& addr) = 0; 147 148 /* Detach le audio node from a group */ 149 virtual void GroupRemoveNode(int group_id, const RawAddress& addr) = 0; 150 151 /* Set active le audio group */ 152 virtual void GroupSetActive(int group_id) = 0; 153 154 /* Set codec config preference */ 155 virtual void SetCodecConfigPreference( 156 int group_id, btle_audio_codec_config_t input_codec_config, 157 btle_audio_codec_config_t output_codec_config) = 0; 158 159 /* Set Ccid for context type */ 160 virtual void SetCcidInformation(int ccid, int context_type) = 0; 161 162 /* Set In call flag */ 163 virtual void SetInCall(bool in_call) = 0; 164 165 /* Sends a preferred audio profiles change */ 166 virtual void SendAudioProfilePreferences( 167 int group_id, bool is_output_preference_le_audio, 168 bool is_duplex_preference_le_audio) = 0; 169 }; 170 171 /* Represents the broadcast source state. */ 172 enum class BroadcastState { 173 STOPPED = 0, 174 CONFIGURING, 175 CONFIGURED, 176 STOPPING, 177 STREAMING, 178 }; 179 180 using BroadcastId = uint32_t; 181 static constexpr BroadcastId kBroadcastIdInvalid = 0x00000000; 182 using BroadcastCode = std::array<uint8_t, 16>; 183 184 /* Content Metadata LTV Types */ 185 constexpr uint8_t kLeAudioMetadataTypePreferredAudioContext = 0x01; 186 constexpr uint8_t kLeAudioMetadataTypeStreamingAudioContext = 0x02; 187 constexpr uint8_t kLeAudioMetadataTypeProgramInfo = 0x03; 188 constexpr uint8_t kLeAudioMetadataTypeLanguage = 0x04; 189 constexpr uint8_t kLeAudioMetadataTypeCcidList = 0x05; 190 191 /* Codec specific LTV Types */ 192 constexpr uint8_t kLeAudioCodecLC3TypeSamplingFreq = 0x01; 193 constexpr uint8_t kLeAudioCodecLC3TypeFrameDuration = 0x02; 194 constexpr uint8_t kLeAudioCodecLC3TypeAudioChannelAllocation = 0x03; 195 constexpr uint8_t kLeAudioCodecLC3TypeOctetPerFrame = 0x04; 196 constexpr uint8_t kLeAudioCodecLC3TypeCodecFrameBlocksPerSdu = 0x05; 197 198 /* Audio quality configuration in public broadcast announcement */ 199 constexpr uint8_t kLeAudioQualityStandard = 0x1 << 1; 200 constexpr uint8_t kLeAudioQualityHigh = 0x1 << 2; 201 202 struct BasicAudioAnnouncementCodecConfig { 203 /* 5 octets for the Codec ID */ 204 uint8_t codec_id; 205 uint16_t vendor_company_id; 206 uint16_t vendor_codec_id; 207 208 /* Codec params - series of LTV formatted triplets */ 209 std::map<uint8_t, std::vector<uint8_t>> codec_specific_params; 210 }; 211 212 struct BasicAudioAnnouncementBisConfig { 213 std::map<uint8_t, std::vector<uint8_t>> codec_specific_params; 214 uint8_t bis_index; 215 }; 216 217 struct BasicAudioAnnouncementSubgroup { 218 /* Subgroup specific codec configuration and metadata */ 219 BasicAudioAnnouncementCodecConfig codec_config; 220 // Content metadata 221 std::map<uint8_t, std::vector<uint8_t>> metadata; 222 // Broadcast channel configuration 223 std::vector<BasicAudioAnnouncementBisConfig> bis_configs; 224 }; 225 226 struct BasicAudioAnnouncementData { 227 /* Announcement Header fields */ 228 uint32_t presentation_delay; 229 230 /* Subgroup specific configurations */ 231 std::vector<BasicAudioAnnouncementSubgroup> subgroup_configs; 232 }; 233 234 struct PublicBroadcastAnnouncementData { 235 // Public Broadcast Announcement features bitmap 236 uint8_t features; 237 // Metadata 238 std::map<uint8_t, std::vector<uint8_t>> metadata; 239 }; 240 241 struct BroadcastMetadata { 242 bool is_public; 243 uint16_t pa_interval; 244 RawAddress addr; 245 uint8_t addr_type; 246 uint8_t adv_sid; 247 248 BroadcastId broadcast_id; 249 std::string broadcast_name; 250 std::optional<BroadcastCode> broadcast_code; 251 252 PublicBroadcastAnnouncementData public_announcement; 253 /* Presentation delay and subgroup configurations */ 254 BasicAudioAnnouncementData basic_audio_announcement; 255 }; 256 257 class LeAudioBroadcasterCallbacks { 258 public: 259 virtual ~LeAudioBroadcasterCallbacks() = default; 260 /* Callback for the newly created broadcast event. */ 261 virtual void OnBroadcastCreated(uint32_t broadcast_id, bool success) = 0; 262 263 /* Callback for the destroyed broadcast event. */ 264 virtual void OnBroadcastDestroyed(uint32_t broadcast_id) = 0; 265 /* Callback for the broadcast source state event. */ 266 virtual void OnBroadcastStateChanged(uint32_t broadcast_id, 267 BroadcastState state) = 0; 268 /* Callback for the broadcast metadata change. */ 269 virtual void OnBroadcastMetadataChanged( 270 uint32_t broadcast_id, const BroadcastMetadata& broadcast_metadata) = 0; 271 }; 272 273 class LeAudioBroadcasterInterface { 274 public: 275 virtual ~LeAudioBroadcasterInterface() = default; 276 /* Register the LeAudio Broadcaster callbacks */ 277 virtual void Initialize(LeAudioBroadcasterCallbacks* callbacks) = 0; 278 /* Stop the LeAudio Broadcaster and all active broadcasts */ 279 virtual void Stop(void) = 0; 280 /* Cleanup the LeAudio Broadcaster */ 281 virtual void Cleanup(void) = 0; 282 /* Create Broadcast instance */ 283 virtual void CreateBroadcast( 284 bool is_public, std::string broadcast_name, 285 std::optional<BroadcastCode> broadcast_code, 286 std::vector<uint8_t> public_metadata, 287 std::vector<uint8_t> subgroup_quality, 288 std::vector<std::vector<uint8_t>> subgroup_metadata) = 0; 289 /* Update the ongoing Broadcast metadata */ 290 virtual void UpdateMetadata( 291 uint32_t broadcast_id, std::string broadcast_name, 292 std::vector<uint8_t> public_metadata, 293 std::vector<std::vector<uint8_t>> subgroup_metadata) = 0; 294 295 /* Start the existing Broadcast stream */ 296 virtual void StartBroadcast(uint32_t broadcast_id) = 0; 297 /* Pause the ongoing Broadcast stream */ 298 virtual void PauseBroadcast(uint32_t broadcast_id) = 0; 299 /* Stop the Broadcast (no stream, no periodic advertisements */ 300 virtual void StopBroadcast(uint32_t broadcast_id) = 0; 301 /* Destroy the existing Broadcast instance */ 302 virtual void DestroyBroadcast(uint32_t broadcast_id) = 0; 303 /* Get Broadcast Metadata */ 304 virtual void GetBroadcastMetadata(uint32_t broadcast_id) = 0; 305 }; 306 307 } /* namespace le_audio */ 308 } /* namespace bluetooth */ 309