• 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 #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