• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  *  Copyright 2003-2012 Broadcom Corporation
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 /******************************************************************************
20  *
21  *  This is the main implementation file for the BTA audio gateway.
22  *
23  ******************************************************************************/
24 
25 #include <bluetooth/log.h>
26 
27 #include <cstdint>
28 #include <string>
29 #include <vector>
30 
31 #include "bta/ag/bta_ag_int.h"
32 #include "bta/include/bta_hfp_api.h"
33 #include "bta_ag_api.h"
34 #include "bta_api.h"
35 #include "bta_sys.h"
36 #include "btm_api_types.h"
37 #include "internal_include/bt_target.h"
38 #include "macros.h"
39 #include "osi/include/alarm.h"
40 #include "osi/include/compat.h"
41 #include "stack/include/bt_hdr.h"
42 #include "stack/include/btm_client_interface.h"
43 #include "types/raw_address.h"
44 
45 using namespace bluetooth;
46 
47 /*****************************************************************************
48  * Constants and types
49  ****************************************************************************/
50 #define CASE_RETURN_STR(const) \
51   case const:                  \
52     return #const;
53 
bta_ag_res_str(tBTA_AG_RES result)54 static const char* bta_ag_res_str(tBTA_AG_RES result) {
55   switch (result) {
56     CASE_RETURN_STR(BTA_AG_SPK_RES)
57     CASE_RETURN_STR(BTA_AG_MIC_RES)
58     CASE_RETURN_STR(BTA_AG_INBAND_RING_RES)
59     CASE_RETURN_STR(BTA_AG_CIND_RES)
60     CASE_RETURN_STR(BTA_AG_BINP_RES)
61     CASE_RETURN_STR(BTA_AG_IND_RES)
62     CASE_RETURN_STR(BTA_AG_BVRA_RES)
63     CASE_RETURN_STR(BTA_AG_CNUM_RES)
64     CASE_RETURN_STR(BTA_AG_BTRH_RES)
65     CASE_RETURN_STR(BTA_AG_CLCC_RES)
66     CASE_RETURN_STR(BTA_AG_COPS_RES)
67     CASE_RETURN_STR(BTA_AG_IN_CALL_RES)
68     CASE_RETURN_STR(BTA_AG_IN_CALL_CONN_RES)
69     CASE_RETURN_STR(BTA_AG_CALL_WAIT_RES)
70     CASE_RETURN_STR(BTA_AG_OUT_CALL_ORIG_RES)
71     CASE_RETURN_STR(BTA_AG_OUT_CALL_ALERT_RES)
72     CASE_RETURN_STR(BTA_AG_OUT_CALL_CONN_RES)
73     CASE_RETURN_STR(BTA_AG_CALL_CANCEL_RES)
74     CASE_RETURN_STR(BTA_AG_END_CALL_RES)
75     CASE_RETURN_STR(BTA_AG_IN_CALL_HELD_RES)
76     CASE_RETURN_STR(BTA_AG_UNAT_RES)
77     CASE_RETURN_STR(BTA_AG_MULTI_CALL_RES)
78     CASE_RETURN_STR(BTA_AG_BIND_RES)
79     CASE_RETURN_STR(BTA_AG_IND_RES_ON_DEMAND)
80     default:
81       return "Unknown AG Result";
82   }
83 }
84 
bta_ag_evt_str(uint16_t event)85 static const char* bta_ag_evt_str(uint16_t event) {
86   switch (event) {
87     CASE_RETURN_STR(BTA_AG_API_REGISTER_EVT)
88     CASE_RETURN_STR(BTA_AG_API_DEREGISTER_EVT)
89     CASE_RETURN_STR(BTA_AG_API_OPEN_EVT)
90     CASE_RETURN_STR(BTA_AG_API_CLOSE_EVT)
91     CASE_RETURN_STR(BTA_AG_API_AUDIO_OPEN_EVT)
92     CASE_RETURN_STR(BTA_AG_API_AUDIO_CLOSE_EVT)
93     CASE_RETURN_STR(BTA_AG_API_RESULT_EVT)
94     CASE_RETURN_STR(BTA_AG_API_SETCODEC_EVT)
95     CASE_RETURN_STR(BTA_AG_RFC_OPEN_EVT)
96     CASE_RETURN_STR(BTA_AG_RFC_CLOSE_EVT)
97     CASE_RETURN_STR(BTA_AG_RFC_SRV_CLOSE_EVT)
98     CASE_RETURN_STR(BTA_AG_RFC_DATA_EVT)
99     CASE_RETURN_STR(BTA_AG_SCO_OPEN_EVT)
100     CASE_RETURN_STR(BTA_AG_SCO_CLOSE_EVT)
101     CASE_RETURN_STR(BTA_AG_DISC_ACP_RES_EVT)
102     CASE_RETURN_STR(BTA_AG_DISC_INT_RES_EVT)
103     CASE_RETURN_STR(BTA_AG_DISC_OK_EVT)
104     CASE_RETURN_STR(BTA_AG_DISC_FAIL_EVT)
105     CASE_RETURN_STR(BTA_AG_RING_TIMEOUT_EVT)
106     CASE_RETURN_STR(BTA_AG_SVC_TIMEOUT_EVT)
107     CASE_RETURN_STR(BTA_AG_COLLISION_EVT)
108     default:
109       return "Unknown AG Event";
110   }
111 }
112 
bta_ag_state_str(tBTA_AG_STATE state)113 const std::string bta_ag_state_str(tBTA_AG_STATE state) {
114   switch (state) {
115     CASE_RETURN_STRING(BTA_AG_INIT_ST);
116     CASE_RETURN_STRING(BTA_AG_OPENING_ST);
117     CASE_RETURN_STRING(BTA_AG_OPEN_ST);
118     CASE_RETURN_STRING(BTA_AG_CLOSING_ST);
119     default:
120       RETURN_UNKNOWN_TYPE_STRING(tBTA_AG_STATE, state);
121   }
122 }
123 
124 /*****************************************************************************
125  * Global data
126  ****************************************************************************/
127 
128 /* AG control block */
129 tBTA_AG_CB bta_ag_cb;
130 const tBTA_AG_DATA tBTA_AG_DATA::kEmpty = {};
131 
132 /*******************************************************************************
133  *
134  * Function         bta_ag_scb_alloc
135  *
136  * Description      Allocate an AG service control block.
137  *
138  *
139  * Returns          pointer to the scb, or NULL if none could be allocated.
140  *
141  ******************************************************************************/
bta_ag_scb_alloc(void)142 static tBTA_AG_SCB* bta_ag_scb_alloc(void) {
143   tBTA_AG_SCB* p_scb = &bta_ag_cb.scb[0];
144   int i;
145 
146   for (i = 0; i < BTA_AG_MAX_NUM_CLIENTS; i++, p_scb++) {
147     if (!p_scb->in_use) {
148       /* initialize variables */
149       p_scb->in_use = true;
150       p_scb->sco_idx = BTM_INVALID_SCO_INDEX;
151       p_scb->received_at_bac = false;
152       p_scb->codec_updated = false;
153       p_scb->codec_fallback = false;
154       p_scb->trying_cvsd_safe_settings = false;
155       p_scb->peer_codecs = BTM_SCO_CODEC_CVSD;
156       p_scb->sco_codec = BTM_SCO_CODEC_CVSD;
157       p_scb->peer_version = HFP_HSP_VERSION_UNKNOWN;
158       p_scb->hsp_version = HSP_VERSION_1_2;
159       p_scb->peer_sdp_features = 0;
160       /* set up timers */
161       p_scb->ring_timer = alarm_new("bta_ag.scb_ring_timer");
162       p_scb->collision_timer = alarm_new("bta_ag.scb_collision_timer");
163       p_scb->codec_negotiation_timer = alarm_new("bta_ag.scb_codec_negotiation_timer");
164       /* reset to CVSD S4 settings as the preferred */
165       p_scb->codec_cvsd_settings = BTA_AG_SCO_CVSD_SETTINGS_S4;
166       /* set eSCO mSBC setting to T2 as the preferred */
167       p_scb->codec_msbc_settings = BTA_AG_SCO_MSBC_SETTINGS_T2;
168       p_scb->codec_lc3_settings = BTA_AG_SCO_LC3_SETTINGS_T2;
169       /* set eSCO SWB setting to Q0 as the preferred */
170       p_scb->codec_aptx_settings = BTA_AG_SCO_APTX_SWB_SETTINGS_Q0;
171       p_scb->is_aptx_swb_codec = false;
172       log::verbose("bta_ag_scb_alloc {}", bta_ag_scb_to_idx(p_scb));
173       break;
174     }
175   }
176 
177   if (i == BTA_AG_MAX_NUM_CLIENTS) {
178     /* out of scbs */
179     p_scb = nullptr;
180     log::warn("Out of scbs");
181   }
182   return p_scb;
183 }
184 
185 /*******************************************************************************
186  *
187  * Function         bta_ag_scb_dealloc
188  *
189  * Description      Deallocate a service control block.
190  *
191  *
192  * Returns          void
193  *
194  ******************************************************************************/
bta_ag_scb_dealloc(tBTA_AG_SCB * p_scb)195 void bta_ag_scb_dealloc(tBTA_AG_SCB* p_scb) {
196   uint8_t idx;
197   bool allocated = false;
198 
199   log::verbose("bta_ag_scb_dealloc {}", bta_ag_scb_to_idx(p_scb));
200 
201   /* stop and free timers */
202   alarm_free(p_scb->ring_timer);
203   alarm_free(p_scb->codec_negotiation_timer);
204   alarm_free(p_scb->collision_timer);
205 
206   /* initialize control block */
207   *p_scb = {};
208   p_scb->sco_idx = BTM_INVALID_SCO_INDEX;
209 
210   /* If all scbs are deallocated, callback with disable event */
211   if (!bta_sys_is_register(BTA_ID_AG)) {
212     for (idx = 0; idx < BTA_AG_MAX_NUM_CLIENTS; idx++) {
213       if (bta_ag_cb.scb[idx].in_use) {
214         allocated = true;
215         break;
216       }
217     }
218 
219     if (!allocated) {
220       (*bta_ag_cb.p_cback)(BTA_AG_DISABLE_EVT, nullptr);
221     }
222   }
223 }
224 
225 /*******************************************************************************
226  *
227  * Function         bta_ag_scb_to_idx
228  *
229  * Description      Given a pointer to an scb, return its index.
230  *
231  *
232  * Returns          Index of scb starting from 1
233  *
234  ******************************************************************************/
bta_ag_scb_to_idx(tBTA_AG_SCB * p_scb)235 uint16_t bta_ag_scb_to_idx(tBTA_AG_SCB* p_scb) {
236   /* use array arithmetic to determine index */
237   return static_cast<uint16_t>(p_scb - bta_ag_cb.scb + 1);
238 }
239 
240 /*******************************************************************************
241  *
242  * Function         bta_ag_scb_by_idx
243  *
244  * Description      Given an scb index return pointer to scb.
245  *
246  *
247  * Returns          Pointer to scb or NULL if not allocated.
248  *
249  ******************************************************************************/
bta_ag_scb_by_idx(uint16_t idx)250 tBTA_AG_SCB* bta_ag_scb_by_idx(uint16_t idx) {
251   tBTA_AG_SCB* p_scb;
252 
253   /* verify index */
254   if (idx > 0 && idx <= BTA_AG_MAX_NUM_CLIENTS) {
255     p_scb = &bta_ag_cb.scb[idx - 1];
256     if (!p_scb->in_use) {
257       p_scb = nullptr;
258       log::warn("ag scb idx {} not allocated", idx);
259     }
260   } else {
261     p_scb = nullptr;
262     log::verbose("ag scb idx {} out of range", idx);
263   }
264   return p_scb;
265 }
266 
267 /*******************************************************************************
268  *
269  * Function         bta_ag_service_to_idx
270  *
271  * Description      Given a BTA service mask convert to profile index.
272  *
273  *
274  * Returns          Profile ndex of scb.
275  *
276  ******************************************************************************/
bta_ag_service_to_idx(tBTA_SERVICE_MASK services)277 uint8_t bta_ag_service_to_idx(tBTA_SERVICE_MASK services) {
278   if (services & BTA_HFP_SERVICE_MASK) {
279     return BTA_AG_HFP;
280   } else {
281     return BTA_AG_HSP;
282   }
283 }
284 
285 /*******************************************************************************
286  *
287  * Function         bta_ag_idx_by_bdaddr
288  *
289  * Description      Find SCB associated with peer BD address.
290  *
291  *
292  * Returns          Index of SCB or zero if none found.
293  *
294  ******************************************************************************/
bta_ag_idx_by_bdaddr(const RawAddress * peer_addr)295 uint16_t bta_ag_idx_by_bdaddr(const RawAddress* peer_addr) {
296   tBTA_AG_SCB* p_scb = &bta_ag_cb.scb[0];
297   if (peer_addr != nullptr) {
298     for (uint16_t i = 0; i < BTA_AG_MAX_NUM_CLIENTS; i++, p_scb++) {
299       if (p_scb->in_use && *peer_addr == p_scb->peer_addr) {
300         return i + 1;
301       }
302     }
303   }
304 
305   /* no scb found */
306   log::warn("No ag scb for peer addr");
307   return 0;
308 }
309 
310 /*******************************************************************************
311  *
312  * Function         bta_ag_other_scb_open
313  *
314  * Description      Check whether any other scb is in open state.
315  *
316  *
317  * Returns          true if another scb is in open state, false otherwise.
318  *
319  ******************************************************************************/
bta_ag_other_scb_open(tBTA_AG_SCB * p_curr_scb)320 bool bta_ag_other_scb_open(tBTA_AG_SCB* p_curr_scb) {
321   tBTA_AG_SCB* p_scb = &bta_ag_cb.scb[0];
322   for (int i = 0; i < BTA_AG_MAX_NUM_CLIENTS; i++, p_scb++) {
323     if (p_scb->in_use && p_scb != p_curr_scb && p_scb->state == BTA_AG_OPEN_ST) {
324       return true;
325     }
326   }
327   /* no other scb found */
328   log::debug("No other ag scb open");
329   return false;
330 }
331 
332 /*******************************************************************************
333  *
334  * Function         bta_ag_scb_open
335  *
336  * Description      Check whether given scb is in open state.
337  *
338  *
339  * Returns          true if scb is in open state, false otherwise.
340  *
341  ******************************************************************************/
bta_ag_scb_open(tBTA_AG_SCB * p_curr_scb)342 bool bta_ag_scb_open(tBTA_AG_SCB* p_curr_scb) {
343   return p_curr_scb && p_curr_scb->in_use && p_curr_scb->state == BTA_AG_OPEN_ST;
344 }
345 
346 /*******************************************************************************
347  *
348  * Function         bta_ag_collision_cback
349  *
350  * Description      Get notified about collision.
351  *
352  *
353  * Returns          void
354  *
355  ******************************************************************************/
bta_ag_collision_cback(tBTA_SYS_CONN_STATUS,tBTA_SYS_ID id,uint8_t,const RawAddress & peer_addr)356 void bta_ag_collision_cback(tBTA_SYS_CONN_STATUS /* status */, tBTA_SYS_ID id, uint8_t /* app_id */,
357                             const RawAddress& peer_addr) {
358   /* Check if we have opening scb for the peer device. */
359   uint16_t handle = bta_ag_idx_by_bdaddr(&peer_addr);
360   tBTA_AG_SCB* p_scb = bta_ag_scb_by_idx(handle);
361 
362   if (p_scb && (p_scb->state == BTA_AG_OPENING_ST)) {
363     if (id == BTA_ID_SYS) {
364       log::warn("AG found collision (ACL) for handle {} device {}", unsigned(handle), peer_addr);
365     } else if (id == BTA_ID_AG) {
366       log::warn("AG found collision (RFCOMM) for handle {} device {}", unsigned(handle), peer_addr);
367     } else {
368       log::warn("AG found collision (UNKNOWN) for handle {} device {}", unsigned(handle),
369                 peer_addr);
370     }
371     bta_ag_sm_execute(p_scb, BTA_AG_COLLISION_EVT, tBTA_AG_DATA::kEmpty);
372   }
373 }
374 
375 /*******************************************************************************
376  *
377  * Function         bta_ag_resume_open
378  *
379  * Description      Resume opening process.
380  *
381  *
382  * Returns          void
383  *
384  ******************************************************************************/
bta_ag_resume_open(tBTA_AG_SCB * p_scb)385 void bta_ag_resume_open(tBTA_AG_SCB* p_scb) {
386   if (p_scb->state == BTA_AG_INIT_ST) {
387     log::info("Resume connection to {}, handle{}", p_scb->peer_addr, bta_ag_scb_to_idx(p_scb));
388     tBTA_AG_DATA open_data = {.api_open = {.bd_addr = p_scb->peer_addr}};
389     bta_ag_sm_execute(p_scb, BTA_AG_API_OPEN_EVT, open_data);
390   } else {
391     log::verbose("device {} is already in state {}", p_scb->peer_addr,
392                  bta_ag_state_str(p_scb->state));
393   }
394 }
395 
396 /*******************************************************************************
397  *
398  * Function         bta_ag_api_enable
399  *
400  * Description      Handle an API enable event.
401  *
402  *
403  * Returns          void
404  *
405  ******************************************************************************/
bta_ag_api_enable(tBTA_AG_CBACK * p_cback)406 void bta_ag_api_enable(tBTA_AG_CBACK* p_cback) {
407   /* initialize control block */
408   log::info("AG api enable");
409   for (tBTA_AG_SCB& scb : bta_ag_cb.scb) {
410     alarm_free(scb.ring_timer);
411     alarm_free(scb.codec_negotiation_timer);
412     alarm_free(scb.collision_timer);
413     scb = {};
414   }
415 
416   /* store callback function */
417   bta_ag_cb.p_cback = p_cback;
418 
419   /* call init call-out */
420   get_btm_client_interface().sco.BTM_WriteVoiceSettings(AG_VOICE_SETTINGS);
421 
422   bta_sys_collision_register(BTA_ID_AG, bta_ag_collision_cback);
423 
424   /* call callback with enable event */
425   (*bta_ag_cb.p_cback)(BTA_AG_ENABLE_EVT, nullptr);
426 }
427 
428 /*******************************************************************************
429  *
430  * Function         bta_ag_api_disable
431  *
432  * Description      Handle an API disable event.
433  *
434  *
435  * Returns          void
436  *
437  ******************************************************************************/
bta_ag_api_disable()438 void bta_ag_api_disable() {
439   /* deregister all scbs in use */
440   tBTA_AG_SCB* p_scb = &bta_ag_cb.scb[0];
441   bool do_dereg = false;
442   int i;
443 
444   if (!bta_sys_is_register(BTA_ID_AG)) {
445     log::error("BTA AG is already disabled, ignoring ...");
446     return;
447   }
448 
449   /* De-register with BTA system manager */
450   bta_sys_deregister(BTA_ID_AG);
451 
452   for (i = 0; i < BTA_AG_MAX_NUM_CLIENTS; i++, p_scb++) {
453     if (p_scb->in_use) {
454       bta_ag_sm_execute(p_scb, BTA_AG_API_DEREGISTER_EVT, tBTA_AG_DATA::kEmpty);
455       do_dereg = true;
456     }
457   }
458 
459   if (bta_ag_is_sco_managed_by_audio()) {
460     // Stop session if not done
461     bta_clear_active_device();
462   }
463 
464   if (!do_dereg) {
465     /* Done, send callback evt to app */
466     (*bta_ag_cb.p_cback)(BTA_AG_DISABLE_EVT, nullptr);
467   }
468 
469   bta_sys_collision_register(BTA_ID_AG, nullptr);
470 }
471 
472 /*******************************************************************************
473  *
474  * Function         bta_ag_api_register
475  *
476  * Description      Handle an API event registers a new service.
477  *
478  *
479  * Returns          void
480  *
481  ******************************************************************************/
bta_ag_api_register(tBTA_SERVICE_MASK services,tBTA_AG_FEAT features,const std::vector<std::string> & service_names,uint8_t app_id)482 void bta_ag_api_register(tBTA_SERVICE_MASK services, tBTA_AG_FEAT features,
483                          const std::vector<std::string>& service_names, uint8_t app_id) {
484   tBTA_AG_SCB* p_scb = bta_ag_scb_alloc();
485   log::debug("bta_ag_api_register: p_scb allocation {}", p_scb == nullptr ? "failed" : "success");
486   if (p_scb) {
487     tBTA_AG_DATA data = {};
488     data.api_register.features = features;
489     data.api_register.services = services;
490     data.api_register.app_id = app_id;
491     for (int i = 0; i < BTA_AG_NUM_IDX; i++) {
492       if (!service_names[i].empty()) {
493         osi_strlcpy(data.api_register.p_name[i], service_names[i].c_str(), BTA_SERVICE_NAME_LEN);
494       } else {
495         data.api_register.p_name[i][0] = 0;
496       }
497     }
498     bta_ag_sm_execute(p_scb, BTA_AG_API_REGISTER_EVT, data);
499   } else {
500     tBTA_AG bta_ag = {};
501     bta_ag.reg.status = BTA_AG_FAIL_RESOURCES;
502     (*bta_ag_cb.p_cback)(BTA_AG_REGISTER_EVT, &bta_ag);
503   }
504 }
505 
506 /*******************************************************************************
507  *
508  * Function         bta_ag_api_result
509  *
510  * Description      Handle an API result event.
511  *
512  *
513  * Returns          void
514  *
515  ******************************************************************************/
bta_ag_api_result(uint16_t handle,tBTA_AG_RES result,const tBTA_AG_RES_DATA & result_data)516 void bta_ag_api_result(uint16_t handle, tBTA_AG_RES result, const tBTA_AG_RES_DATA& result_data) {
517   tBTA_AG_DATA event_data = {};
518   event_data.api_result.result = result;
519   event_data.api_result.data = result_data;
520   tBTA_AG_SCB* p_scb;
521   if (handle != BTA_AG_HANDLE_ALL) {
522     p_scb = bta_ag_scb_by_idx(handle);
523     if (p_scb) {
524       log::debug("Audio gateway event for one client handle:{} scb:{}", handle, p_scb->ToString());
525       bta_ag_sm_execute(p_scb, static_cast<uint16_t>(BTA_AG_API_RESULT_EVT), event_data);
526     } else {
527       log::warn("Received audio gateway event for unknown AG control block handle:{}", handle);
528     }
529   } else {
530     int i;
531     for (i = 0, p_scb = &bta_ag_cb.scb[0]; i < BTA_AG_MAX_NUM_CLIENTS; i++, p_scb++) {
532       if (p_scb->in_use && p_scb->svc_conn) {
533         log::debug("Audio gateway event for all clients scb:{}", p_scb->ToString());
534         bta_ag_sm_execute(p_scb, static_cast<uint16_t>(BTA_AG_API_RESULT_EVT), event_data);
535       }
536     }
537   }
538 }
539 
bta_ag_better_state_machine(tBTA_AG_SCB * p_scb,uint16_t event,const tBTA_AG_DATA & data)540 static void bta_ag_better_state_machine(tBTA_AG_SCB* p_scb, uint16_t event,
541                                         const tBTA_AG_DATA& data) {
542   switch (p_scb->state) {
543     case BTA_AG_INIT_ST:
544       switch (event) {
545         case BTA_AG_API_REGISTER_EVT:
546           bta_ag_register(p_scb, data);
547           break;
548         case BTA_AG_API_DEREGISTER_EVT:
549           bta_ag_deregister(p_scb, data);
550           break;
551         case BTA_AG_API_OPEN_EVT:
552           p_scb->state = BTA_AG_OPENING_ST;
553           bta_ag_start_open(p_scb, data);
554           break;
555         case BTA_AG_RFC_OPEN_EVT:
556           p_scb->state = BTA_AG_OPEN_ST;
557           bta_ag_rfc_acp_open(p_scb, data);
558           bta_ag_sco_listen(p_scb, data);
559           break;
560         case BTA_AG_SCO_OPEN_EVT:
561           log::info("Opening sco for EVT BTA_AG_SCO_OPEN_EVT");
562           bta_ag_sco_conn_open(p_scb, data);
563           break;
564         case BTA_AG_SCO_CLOSE_EVT:
565           bta_ag_sco_conn_close(p_scb, data);
566           break;
567         case BTA_AG_DISC_ACP_RES_EVT:
568           bta_ag_free_db(p_scb, data);
569           break;
570         default:
571           log::error("unknown event {} at state {}", event, bta_ag_state_str(p_scb->state));
572           break;
573       }
574       break;
575     case BTA_AG_OPENING_ST:
576       switch (event) {
577         case BTA_AG_API_DEREGISTER_EVT:
578           p_scb->state = BTA_AG_CLOSING_ST;
579           bta_ag_rfc_do_close(p_scb, data);
580           bta_ag_start_dereg(p_scb, data);
581           break;
582         case BTA_AG_API_OPEN_EVT:
583           bta_ag_open_fail(p_scb, data);
584           break;
585         case BTA_AG_API_CLOSE_EVT:
586           p_scb->state = BTA_AG_CLOSING_ST;
587           bta_ag_rfc_do_close(p_scb, data);
588           break;
589         case BTA_AG_RFC_OPEN_EVT:
590           p_scb->state = BTA_AG_OPEN_ST;
591           bta_ag_rfc_open(p_scb, data);
592           bta_ag_sco_listen(p_scb, data);
593           break;
594         case BTA_AG_RFC_CLOSE_EVT:
595           p_scb->state = BTA_AG_INIT_ST;
596           bta_ag_rfc_fail(p_scb, data);
597           break;
598         case BTA_AG_SCO_OPEN_EVT:
599           log::info("Opening sco for EVT BTA_AG_SCO_OPEN_EVT");
600           bta_ag_sco_conn_open(p_scb, data);
601           break;
602         case BTA_AG_SCO_CLOSE_EVT:
603           bta_ag_sco_conn_close(p_scb, data);
604           break;
605         case BTA_AG_DISC_INT_RES_EVT:
606           bta_ag_disc_int_res(p_scb, data);
607           break;
608         case BTA_AG_DISC_OK_EVT:
609           bta_ag_rfc_do_open(p_scb, data);
610           break;
611         case BTA_AG_DISC_FAIL_EVT:
612           p_scb->state = BTA_AG_INIT_ST;
613           bta_ag_disc_fail(p_scb, data);
614           break;
615         case BTA_AG_COLLISION_EVT:
616           p_scb->state = BTA_AG_INIT_ST;
617           bta_ag_handle_collision(p_scb, data);
618           break;
619         default:
620           log::error("unknown event {} at state {}", event, bta_ag_state_str(p_scb->state));
621           break;
622       }
623       break;
624     case BTA_AG_OPEN_ST:
625       switch (event) {
626         case BTA_AG_API_DEREGISTER_EVT:
627           p_scb->state = BTA_AG_CLOSING_ST;
628           bta_ag_start_close(p_scb, data);
629           bta_ag_start_dereg(p_scb, data);
630           break;
631         case BTA_AG_API_OPEN_EVT:
632           bta_ag_open_fail(p_scb, data);
633           break;
634         case BTA_AG_API_CLOSE_EVT:
635           p_scb->state = BTA_AG_CLOSING_ST;
636           bta_ag_start_close(p_scb, data);
637           break;
638         case BTA_AG_API_AUDIO_OPEN_EVT:
639           bta_ag_sco_open(p_scb, data);
640           break;
641         case BTA_AG_API_AUDIO_CLOSE_EVT:
642           bta_ag_sco_close(p_scb, data);
643           break;
644         case BTA_AG_API_RESULT_EVT:
645           bta_ag_result(p_scb, data);
646           break;
647         case BTA_AG_API_SETCODEC_EVT:
648           bta_ag_setcodec(p_scb, data);
649           break;
650         case BTA_AG_RFC_CLOSE_EVT:
651           p_scb->state = BTA_AG_INIT_ST;
652           bta_ag_rfc_close(p_scb, data);
653           break;
654         case BTA_AG_RFC_DATA_EVT:
655           bta_ag_rfc_data(p_scb, data);
656           break;
657         case BTA_AG_SCO_OPEN_EVT:
658           log::info("Opening sco for EVT BTA_AG_SCO_OPEN_EVT");
659           bta_ag_sco_conn_open(p_scb, data);
660           bta_ag_post_sco_open(p_scb, data);
661           break;
662         case BTA_AG_SCO_CLOSE_EVT:
663           bta_ag_sco_conn_close(p_scb, data);
664           bta_ag_post_sco_close(p_scb, data);
665           break;
666         case BTA_AG_DISC_ACP_RES_EVT:
667           bta_ag_disc_acp_res(p_scb, data);
668           break;
669         case BTA_AG_RING_TIMEOUT_EVT:
670           bta_ag_send_ring(p_scb, data);
671           break;
672         case BTA_AG_SVC_TIMEOUT_EVT:
673           p_scb->state = BTA_AG_CLOSING_ST;
674           bta_ag_start_close(p_scb, data);
675           break;
676         default:
677           log::error("unknown event {} at state {}", event, bta_ag_state_str(p_scb->state));
678           break;
679       }
680       break;
681     case BTA_AG_CLOSING_ST:
682       switch (event) {
683         case BTA_AG_API_DEREGISTER_EVT:
684           bta_ag_start_dereg(p_scb, data);
685           break;
686         case BTA_AG_API_OPEN_EVT:
687           bta_ag_open_fail(p_scb, data);
688           break;
689         case BTA_AG_RFC_CLOSE_EVT:
690           p_scb->state = BTA_AG_INIT_ST;
691           bta_ag_rfc_close(p_scb, data);
692           break;
693         case BTA_AG_SCO_OPEN_EVT:
694           log::info("Opening sco for EVT BTA_AG_SCO_OPEN_EVT");
695           bta_ag_sco_conn_open(p_scb, data);
696           break;
697         case BTA_AG_SCO_CLOSE_EVT:
698           bta_ag_sco_conn_close(p_scb, data);
699           bta_ag_post_sco_close(p_scb, data);
700           break;
701         case BTA_AG_DISC_ACP_RES_EVT:
702           bta_ag_free_db(p_scb, data);
703           break;
704         case BTA_AG_DISC_INT_RES_EVT:
705           p_scb->state = BTA_AG_INIT_ST;
706           bta_ag_free_db(p_scb, data);
707           break;
708         default:
709           log::error("unknown event {} at state {}", event, bta_ag_state_str(p_scb->state));
710           break;
711       }
712       break;
713   }
714 }
715 
716 /*******************************************************************************
717  *
718  * Function         bta_ag_sm_execute
719  *
720  * Description      State machine event handling function for AG
721  *
722  *
723  * Returns          void
724  *
725  ******************************************************************************/
bta_ag_sm_execute(tBTA_AG_SCB * p_scb,uint16_t event,const tBTA_AG_DATA & data)726 void bta_ag_sm_execute(tBTA_AG_SCB* p_scb, uint16_t event, const tBTA_AG_DATA& data) {
727   uint16_t previous_event = event;
728   tBTA_AG_STATE previous_state = p_scb->state;
729 
730   log::debug(
731           "Execute AG event handle:0x{:04x} bd_addr:{} state:{}[0x{:02x}] "
732           "event:{}[0x{:04x}] result:{}[0x{:02x}]",
733           bta_ag_scb_to_idx(p_scb), p_scb->peer_addr, bta_ag_state_str(p_scb->state),
734           static_cast<uint64_t>(p_scb->state), bta_ag_evt_str(event), event,
735           bta_ag_res_str(data.api_result.result), data.api_result.result);
736 
737   bta_ag_better_state_machine(p_scb, event, data);
738 
739   if (p_scb->state != previous_state) {
740     log::debug(
741             "State changed handle:0x{:04x} bd_addr:{} "
742             "state_change:{}[0x{:02x}]->{}[0x{:02x}] event:{}[0x{:04x}] "
743             "result:{}[0x{:02x}]",
744             bta_ag_scb_to_idx(p_scb), p_scb->peer_addr, bta_ag_state_str(previous_state),
745             static_cast<uint64_t>(previous_state), bta_ag_state_str(p_scb->state),
746             static_cast<uint64_t>(p_scb->state), bta_ag_evt_str(previous_event), previous_event,
747             bta_ag_res_str(data.api_result.result), data.api_result.result);
748   }
749 }
750 
bta_ag_sm_execute_by_handle(uint16_t handle,uint16_t event,const tBTA_AG_DATA & data)751 void bta_ag_sm_execute_by_handle(uint16_t handle, uint16_t event, const tBTA_AG_DATA& data) {
752   tBTA_AG_SCB* p_scb = bta_ag_scb_by_idx(handle);
753   if (p_scb) {
754     log::debug("AG state machine event:{}[0x{:04x}] handle:0x{:04x}", bta_ag_evt_str(event), event,
755                handle);
756     bta_ag_sm_execute(p_scb, event, data);
757   }
758 }
759 
760 /**
761  * Handles event from bta_sys_sendmsg(). It is here to support legacy alarm
762  * implementation that is mainly for timeouts.
763  *
764  * @param p_msg event message
765  * @return True to free p_msg, or False if p_msg is freed within this function
766  */
bta_ag_hdl_event(const BT_HDR_RIGID * p_msg)767 bool bta_ag_hdl_event(const BT_HDR_RIGID* p_msg) {
768   switch (p_msg->event) {
769     case BTA_AG_RING_TIMEOUT_EVT:
770     case BTA_AG_SVC_TIMEOUT_EVT:
771       bta_ag_sm_execute_by_handle(p_msg->layer_specific, p_msg->event, tBTA_AG_DATA::kEmpty);
772       break;
773     default:
774       log::fatal("bad event {} layer_specific={}", p_msg->event, p_msg->layer_specific);
775       break;
776   }
777   return true;
778 }
779