1 /******************************************************************************
2  *
3  *  Copyright 2009-2016 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 #define LOG_TAG "bluetooth-a2dp"
20 
21 #include "btif/include/btif_av.h"
22 
23 #include <base/functional/bind.h>
24 #include <base/strings/stringprintf.h>
25 #include <bluetooth/log.h>
26 #include <com_android_bluetooth_flags.h>
27 #include <frameworks/proto_logging/stats/enums/bluetooth/a2dp/enums.pb.h>
28 #include <frameworks/proto_logging/stats/enums/bluetooth/enums.pb.h>
29 #include <stdio.h>
30 
31 #include <chrono>
32 #include <cstdint>
33 #include <cstdio>
34 #include <cstring>
35 #include <future>
36 #include <ios>
37 #include <map>
38 #include <mutex>
39 #include <optional>
40 #include <set>
41 #include <sstream>
42 #include <string>
43 #include <utility>
44 #include <vector>
45 
46 #include "audio_hal_interface/a2dp_encoding.h"
47 #include "bta/include/bta_api.h"
48 #include "bta/include/bta_api_data_types.h"
49 #include "bta/include/bta_av_api.h"
50 #include "btif/avrcp/avrcp_service.h"
51 #include "btif/include/btif_a2dp.h"
52 #include "btif/include/btif_a2dp_sink.h"
53 #include "btif/include/btif_a2dp_source.h"
54 #include "btif/include/btif_av_co.h"
55 #include "btif/include/btif_common.h"
56 #include "btif/include/btif_metrics_logging.h"
57 #include "btif/include/btif_profile_queue.h"
58 #include "btif/include/btif_rc.h"
59 #include "btif/include/btif_util.h"
60 #include "btif/include/stack_manager_t.h"
61 #include "btif_metrics_logging.h"
62 #include "common/state_machine.h"
63 #include "device/include/device_iot_conf_defs.h"
64 #include "device/include/device_iot_config.h"
65 #include "hardware/bluetooth.h"
66 #include "hardware/bt_av.h"
67 #include "include/hardware/bt_rc.h"
68 #include "os/logging/log_adapter.h"
69 #include "osi/include/alarm.h"
70 #include "osi/include/allocator.h"
71 #include "osi/include/properties.h"
72 #include "stack/include/a2dp_codec_api.h"
73 #include "stack/include/avdt_api.h"
74 #include "stack/include/avrc_api.h"
75 #include "stack/include/avrc_defs.h"
76 #include "stack/include/bt_hdr.h"
77 #include "stack/include/bt_uuid16.h"
78 #include "stack/include/btm_ble_api.h"
79 #include "stack/include/btm_ble_api_types.h"
80 #include "stack/include/btm_log_history.h"
81 #include "stack/include/main_thread.h"
82 #include "types/raw_address.h"
83 
84 #ifdef __ANDROID__
85 #include <android/sysprop/BluetoothProperties.sysprop.h>
86 #endif
87 
88 using namespace bluetooth;
89 
90 /*****************************************************************************
91  *  Constants & Macros
92  *****************************************************************************/
93 static const char kBtifAvSourceServiceName[] = "Advanced Audio Source";
94 static const char kBtifAvSinkServiceName[] = "Advanced Audio Sink";
95 static constexpr int kDefaultMaxConnectedAudioDevices = 1;
96 static constexpr tBTA_AV_HNDL kBtaHandleUnknown = 0;
97 
98 namespace {
99 constexpr char kBtmLogHistoryTag[] = "A2DP";
100 }
101 
delay_reporting_enabled()102 static bool delay_reporting_enabled() {
103   return !osi_property_get_bool("persist.bluetooth.disabledelayreports", false);
104 }
105 
106 /*****************************************************************************
107  *  Local type definitions
108  *****************************************************************************/
109 
110 typedef struct {
111   int sample_rate;
112   int channel_count;
113   RawAddress peer_address;
114 } btif_av_sink_config_req_t;
115 
116 typedef struct {
117   bool use_latency_mode;
118 } btif_av_start_stream_req_t;
119 
120 typedef struct {
121   bool is_low_latency;
122 } btif_av_set_latency_req_t;
123 
124 typedef struct {
125   std::vector<btav_a2dp_codec_config_t> codec_preferences;
126   std::promise<void> reconf_ready_promise;
127 } btif_av_reconfig_req_t;
128 
129 /**
130  * BTIF AV events
131  */
132 typedef enum {
133   /* Reuse BTA_AV_XXX_EVT - No need to redefine them here */
134   BTIF_AV_CONNECT_REQ_EVT = BTA_AV_MAX_EVT,
135   BTIF_AV_DISCONNECT_REQ_EVT,
136   BTIF_AV_START_STREAM_REQ_EVT,
137   BTIF_AV_STOP_STREAM_REQ_EVT,
138   BTIF_AV_SUSPEND_STREAM_REQ_EVT,
139   BTIF_AV_SINK_CONFIG_REQ_EVT,
140   BTIF_AV_ACL_DISCONNECTED,
141   BTIF_AV_OFFLOAD_START_REQ_EVT,
142   BTIF_AV_AVRCP_OPEN_EVT,
143   BTIF_AV_AVRCP_CLOSE_EVT,
144   BTIF_AV_AVRCP_REMOTE_PLAY_EVT,
145   BTIF_AV_SET_LATENCY_REQ_EVT,
146   BTIF_AV_RECONFIGURE_REQ_EVT,
147 } btif_av_sm_event_t;
148 
149 class BtifAvEvent {
150 public:
151   BtifAvEvent(uint32_t event, const void* p_data, size_t data_length);
152   BtifAvEvent(const BtifAvEvent& other);
153   BtifAvEvent() = delete;
154   ~BtifAvEvent();
155   BtifAvEvent& operator=(const BtifAvEvent& other);
156 
Event() const157   uint32_t Event() const { return event_; }
Data() const158   void* Data() const { return data_; }
DataLength() const159   size_t DataLength() const { return data_length_; }
160   std::string ToString() const;
161   static std::string EventName(uint32_t event);
162 
163 private:
164   void DeepCopy(uint32_t event, const void* p_data, size_t data_length);
165   void DeepFree();
166 
167   uint32_t event_;
168   void* data_;
169   size_t data_length_;
170 };
171 
172 class BtifAvPeer;
173 
174 // Should not need dedicated Suspend state as actual actions are no
175 // different than Open state. Suspend flags are needed however to prevent
176 // media task from trying to restart stream during remote Suspend or while
177 // we are in the process of a local Suspend.
178 class BtifAvStateMachine : public bluetooth::common::StateMachine {
179 public:
180   enum {
181     kStateIdle,     // AVDTP disconnected
182     kStateOpening,  // Opening AVDTP connection
183     kStateOpened,   // AVDTP is in OPEN state
184     kStateStarted,  // A2DP stream started
185     kStateClosing,  // Closing AVDTP connection
186   };
187 
188   class StateIdle : public State {
189   public:
StateIdle(BtifAvStateMachine & sm)190     explicit StateIdle(BtifAvStateMachine& sm) : State(sm, kStateIdle), peer_(sm.Peer()) {}
191     void OnEnter() override;
192     void OnExit() override;
193     bool ProcessEvent(uint32_t event, void* p_data) override;
194 
195   private:
196     BtifAvPeer& peer_;
197   };
198 
199   class StateOpening : public State {
200   public:
StateOpening(BtifAvStateMachine & sm)201     explicit StateOpening(BtifAvStateMachine& sm) : State(sm, kStateOpening), peer_(sm.Peer()) {}
202     void OnEnter() override;
203     void OnExit() override;
204     bool ProcessEvent(uint32_t event, void* p_data) override;
205 
206   private:
207     BtifAvPeer& peer_;
208   };
209 
210   class StateOpened : public State {
211   public:
StateOpened(BtifAvStateMachine & sm)212     explicit StateOpened(BtifAvStateMachine& sm) : State(sm, kStateOpened), peer_(sm.Peer()) {}
213     void OnEnter() override;
214     void OnExit() override;
215     bool ProcessEvent(uint32_t event, void* p_data) override;
216 
217   private:
218     BtifAvPeer& peer_;
219   };
220 
221   class StateStarted : public State {
222   public:
StateStarted(BtifAvStateMachine & sm)223     explicit StateStarted(BtifAvStateMachine& sm) : State(sm, kStateStarted), peer_(sm.Peer()) {}
224     void OnEnter() override;
225     void OnExit() override;
226     bool ProcessEvent(uint32_t event, void* p_data) override;
227 
228   private:
229     BtifAvPeer& peer_;
230   };
231 
232   class StateClosing : public State {
233   public:
StateClosing(BtifAvStateMachine & sm)234     explicit StateClosing(BtifAvStateMachine& sm) : State(sm, kStateClosing), peer_(sm.Peer()) {}
235     void OnEnter() override;
236     void OnExit() override;
237     bool ProcessEvent(uint32_t event, void* p_data) override;
238 
239   private:
240     BtifAvPeer& peer_;
241   };
242 
BtifAvStateMachine(BtifAvPeer & btif_av_peer)243   explicit BtifAvStateMachine(BtifAvPeer& btif_av_peer) : peer_(btif_av_peer) {
244     state_idle_ = new StateIdle(*this);
245     state_opening_ = new StateOpening(*this);
246     state_opened_ = new StateOpened(*this);
247     state_started_ = new StateStarted(*this);
248     state_closing_ = new StateClosing(*this);
249 
250     AddState(state_idle_);
251     AddState(state_opening_);
252     AddState(state_opened_);
253     AddState(state_started_);
254     AddState(state_closing_);
255     SetInitialState(state_idle_);
256   }
257 
Peer()258   BtifAvPeer& Peer() { return peer_; }
259 
260 private:
261   BtifAvPeer& peer_;
262   StateIdle* state_idle_;
263   StateOpening* state_opening_;
264   StateOpened* state_opened_;
265   StateStarted* state_started_;
266   StateClosing* state_closing_;
267 };
268 
269 class BtifAvPeer {
270 public:
271   enum {
272     kFlagLocalSuspendPending = 0x1,
273     kFlagRemoteSuspend = 0x2,
274     kFlagPendingStart = 0x4,
275     kFlagPendingStop = 0x8,
276     kFlagPendingReconfigure = 0x10,
277   };
278   static constexpr uint64_t kTimeoutAvOpenOnRcMs = 2 * 1000;  // 2s
279 
280   BtifAvPeer(const RawAddress& peer_address, uint8_t peer_sep, tBTA_AV_HNDL bta_handle,
281              uint8_t peer_id);
282   ~BtifAvPeer();
283 
284   bt_status_t Init();
285   void Cleanup();
286 
287   /**
288    * Check whether the peer can be deleted.
289    *
290    * @return true if the pair can be deleted, otherwise false
291    */
292   bool CanBeDeleted() const;
293 
294   /**
295    * Check whether the peer is the active one.
296    *
297    * @return true if this peer is the active one
298    */
IsActivePeer() const299   bool IsActivePeer() const { return PeerAddress() == ActivePeerAddress(); }
300 
301   /**
302    * Get the address of the active peer.
303    *
304    * @return the address of the active peer
305    */
306   const RawAddress& ActivePeerAddress() const;
307 
PeerAddress() const308   const RawAddress& PeerAddress() const { return peer_address_; }
IsSource() const309   bool IsSource() const { return peer_sep_ == AVDT_TSEP_SRC; }
IsSink() const310   bool IsSink() const { return peer_sep_ == AVDT_TSEP_SNK; }
PeerSep() const311   uint8_t PeerSep() const { return peer_sep_; }
SetSep(uint8_t sep_type)312   void SetSep(uint8_t sep_type) { peer_sep_ = sep_type; }
313   /**
314    * Get the local device's Service Class UUID
315    *
316    * @return the local device's Service Class UUID: UUID_SERVCLASS_AUDIO_SOURCE
317    * or UUID_SERVCLASS_AUDIO_SINK
318    */
LocalUuidServiceClass() const319   uint16_t LocalUuidServiceClass() const {
320     return IsSink() ? UUID_SERVCLASS_AUDIO_SOURCE : UUID_SERVCLASS_AUDIO_SINK;
321   }
BtaHandle() const322   tBTA_AV_HNDL BtaHandle() const { return bta_handle_; }
SetBtaHandle(tBTA_AV_HNDL bta_handle)323   void SetBtaHandle(tBTA_AV_HNDL bta_handle) { bta_handle_ = bta_handle; }
PeerId() const324   uint8_t PeerId() const { return peer_id_; }
325 
StateMachine()326   BtifAvStateMachine& StateMachine() { return state_machine_; }
StateMachine() const327   const BtifAvStateMachine& StateMachine() const { return state_machine_; }
AvOpenOnRcTimer()328   alarm_t* AvOpenOnRcTimer() { return av_open_on_rc_timer_; }
AvOpenOnRcTimer() const329   const alarm_t* AvOpenOnRcTimer() const { return av_open_on_rc_timer_; }
330 
SetEdr(tBTA_AV_EDR edr)331   void SetEdr(tBTA_AV_EDR edr) { edr_ = edr; }
IsEdr() const332   bool IsEdr() const { return edr_ != 0; }
Is3Mbps() const333   bool Is3Mbps() const { return (edr_ & BTA_AV_EDR_3MBPS) != 0; }
334 
335   bool IsConnected() const;
336   bool IsStreaming() const;
IsInSilenceMode() const337   bool IsInSilenceMode() const { return is_silenced_; }
338 
SetSilence(bool silence)339   void SetSilence(bool silence) { is_silenced_ = silence; }
340 
341   // AVDTP delay reporting in 1/10 milliseconds
SetDelayReport(uint16_t delay)342   void SetDelayReport(uint16_t delay) { delay_report_ = delay; }
GetDelayReport() const343   uint16_t GetDelayReport() const { return delay_report_; }
344 
SetMandatoryCodecPreferred(bool preferred)345   void SetMandatoryCodecPreferred(bool preferred) { mandatory_codec_preferred_ = preferred; }
IsMandatoryCodecPreferred() const346   bool IsMandatoryCodecPreferred() const { return mandatory_codec_preferred_; }
347 
348   /**
349    * Check whether any of the flags specified by the bitlags mask is set.
350    *
351    * @param bitflags_mask the bitflags to check
352    * @return true if any of the flags to check is set, otherwise false.
353    */
CheckFlags(uint8_t bitflags_mask) const354   bool CheckFlags(uint8_t bitflags_mask) const { return (flags_ & bitflags_mask) != 0; }
355 
356   /**
357    * Set only the flags as specified by the bitflags mask.
358    *
359    * @param bitflags_mask the bitflags to set
360    */
SetFlags(uint8_t bitflags_mask)361   void SetFlags(uint8_t bitflags_mask) { flags_ |= bitflags_mask; }
362 
363   /**
364    * Clear only the flags as specified by the bitflags mask.
365    *
366    * @param bitflags_mask the bitflags to clear
367    */
ClearFlags(uint8_t bitflags_mask)368   void ClearFlags(uint8_t bitflags_mask) { flags_ &= ~bitflags_mask; }
369 
370   /**
371    * Clear all flags.
372    */
ClearAllFlags()373   void ClearAllFlags() { flags_ = 0; }
374 
375   /**
376    * Get a string representation of the flags that are set.
377    */
378   std::string FlagsToString() const;
379 
SelfInitiatedConnection() const380   bool SelfInitiatedConnection() const { return self_initiated_connection_; }
SetSelfInitiatedConnection(bool v)381   void SetSelfInitiatedConnection(bool v) { self_initiated_connection_ = v; }
382 
UseLatencyMode() const383   bool UseLatencyMode() const { return use_latency_mode_; }
SetUseLatencyMode(bool use_latency_mode)384   void SetUseLatencyMode(bool use_latency_mode) { use_latency_mode_ = use_latency_mode; }
385 
SetReconfigureStreamData(btif_av_reconfig_req_t && req)386   void SetReconfigureStreamData(btif_av_reconfig_req_t&& req) {
387     reconfig_req_ = std::make_optional<btif_av_reconfig_req_t>(std::move(req));
388   }
389 
GetReconfigureStreamData()390   std::optional<btif_av_reconfig_req_t> GetReconfigureStreamData() {
391     std::optional<btif_av_reconfig_req_t> data = std::move(reconfig_req_);
392     reconfig_req_ = std::nullopt;
393     return data;
394   }
395 
396 private:
397   const RawAddress peer_address_;
398   uint8_t peer_sep_;  // SEP type of peer device
399   tBTA_AV_HNDL bta_handle_;
400   const uint8_t peer_id_;
401   BtifAvStateMachine state_machine_;
402   alarm_t* av_open_on_rc_timer_;
403   tBTA_AV_EDR edr_;
404   uint8_t flags_;
405   bool self_initiated_connection_;
406   bool is_silenced_;
407   uint16_t delay_report_;
408   bool mandatory_codec_preferred_ = false;
409   bool use_latency_mode_ = false;
410   std::optional<btif_av_reconfig_req_t> reconfig_req_;
411 };
412 
413 class BtifAvSource {
414 public:
415   // The PeerId is used as AppId for BTA_AvRegister() purpose
416   static constexpr uint8_t kPeerIdMin = 0;
417   static constexpr uint8_t kPeerIdMax = BTA_AV_NUM_STRS;
418 
BtifAvSource()419   BtifAvSource()
420       : callbacks_(nullptr),
421         enabled_(false),
422         a2dp_offload_enabled_(false),
423         max_connected_peers_(kDefaultMaxConnectedAudioDevices) {}
424   ~BtifAvSource();
425 
426   void Init(btav_source_callbacks_t* callbacks, int max_connected_audio_devices,
427             const std::vector<btav_a2dp_codec_config_t>& codec_priorities,
428             const std::vector<btav_a2dp_codec_config_t>& offloading_preference,
429             std::vector<btav_a2dp_codec_info_t>* supported_codecs,
430             std::promise<bt_status_t> complete_promise);
431   void Cleanup();
432 
Callbacks()433   btav_source_callbacks_t* Callbacks() { return callbacks_; }
Enabled() const434   bool Enabled() const { return enabled_; }
A2dpOffloadEnabled() const435   bool A2dpOffloadEnabled() const { return a2dp_offload_enabled_; }
436   BtifAvPeer* FindPeer(const RawAddress& peer_address);
437   BtifAvPeer* FindPeerByHandle(tBTA_AV_HNDL bta_handle);
438   BtifAvPeer* FindPeerByPeerId(uint8_t peer_id);
439   BtifAvPeer* FindOrCreatePeer(const RawAddress& peer_address, tBTA_AV_HNDL bta_handle);
440 
441   /**
442    * Check whether a connection to a peer is allowed.
443    * The check considers the maximum number of connected peers.
444    *
445    * @param peer_address the peer address to connect to
446    * @return true if connection is allowed, otherwise false
447    */
448   bool AllowedToConnect(const RawAddress& peer_address) const;
449 
450   /**
451    * Delete all peers that have transitioned to Idle state and can be deleted.
452    * If a peer was just created/initialized, then it cannot be deleted yet.
453    */
454   void DeleteIdlePeers();
455 
456   /**
457    * Get the active peer.
458    *
459    * @return the active peer
460    */
ActivePeer() const461   const RawAddress& ActivePeer() const { return active_peer_; }
462 
463   /**
464    * Check whether peer is silenced
465    *
466    * @param peer_address the peer to check
467    * @return true on silence mode enabled, otherwise false
468    */
IsPeerSilenced(const RawAddress & peer_address)469   bool IsPeerSilenced(const RawAddress& peer_address) {
470     if (peer_address.IsEmpty()) {
471       return false;
472     }
473     BtifAvPeer* peer = FindPeer(peer_address);
474     if (peer == nullptr) {
475       log::warn("peer is null");
476       return false;
477     }
478     if (!peer->IsConnected()) {
479       log::warn("peer is not connected");
480       return false;
481     }
482     return peer->IsInSilenceMode();
483   }
484 
485   /**
486    * Set peer silence mode
487    *
488    * @param peer_address the peer to set
489    * @param silence true on enable silence mode, false on disable
490    * @return true on success, otherwise false
491    */
SetSilencePeer(const RawAddress & peer_address,const bool silence)492   bool SetSilencePeer(const RawAddress& peer_address, const bool silence) {
493     if (peer_address.IsEmpty()) {
494       return false;
495     }
496     log::info("peer: {}", peer_address);
497     BtifAvPeer* peer = FindPeer(peer_address);
498     if (peer == nullptr) {
499       log::warn("peer is null");
500       return false;
501     }
502     if (!peer->IsConnected()) {
503       log::warn("peer is not connected");
504       return false;
505     }
506     peer->SetSilence(silence);
507     return true;
508   }
509 
510   /**
511    * Set the active peer.
512    *
513    * @param peer_address the active peer address or RawAddress::kEmpty to
514    * reset the active peer
515    * @return true on success, otherwise false
516    */
SetActivePeer(const RawAddress & peer_address,std::promise<void> peer_ready_promise)517   bool SetActivePeer(const RawAddress& peer_address, std::promise<void> peer_ready_promise) {
518     log::info("peer={} active_peer={}", peer_address, active_peer_);
519 
520     if (active_peer_ == peer_address) {
521       peer_ready_promise.set_value();
522       return true;  // Nothing has changed
523     }
524     if (peer_address.IsEmpty()) {
525       log::info("peer address is empty, shutdown the Audio source");
526       if (!bta_av_co_set_active_source_peer(peer_address)) {
527         log::warn("unable to set active peer to empty in BtaAvCo");
528       }
529 
530       btif_a2dp_source_end_session(active_peer_);
531       std::promise<void> shutdown_complete_promise;
532       std::future<void> shutdown_complete_future = shutdown_complete_promise.get_future();
533       btif_a2dp_source_shutdown(std::move(shutdown_complete_promise));
534       using namespace std::chrono_literals;
535       if (shutdown_complete_future.wait_for(1s) == std::future_status::timeout) {
536         log::error("Timed out waiting for A2DP source shutdown to complete.");
537       }
538       active_peer_ = peer_address;
539       peer_ready_promise.set_value();
540       return true;
541     }
542 
543     BtifAvPeer* peer = FindPeer(peer_address);
544     if (peer == nullptr || !peer->IsConnected()) {
545       log::error("Error setting {} as active Source peer", peer_address);
546       peer_ready_promise.set_value();
547       return false;
548     }
549 
550     if (!btif_a2dp_source_restart_session(active_peer_, peer_address,
551                                           std::move(peer_ready_promise))) {
552       // cannot set promise but need to be handled within restart_session
553       return false;
554     }
555     active_peer_ = peer_address;
556     return true;
557   }
558 
559   /**
560    * Update source codec configuration for a peer.
561    *
562    * @param peer_address the address of the peer to update
563    * @param codec_preferences the updated codec preferences
564    */
UpdateCodecConfig(const RawAddress & peer_address,const std::vector<btav_a2dp_codec_config_t> & codec_preferences,std::promise<void> peer_ready_promise)565   void UpdateCodecConfig(const RawAddress& peer_address,
566                          const std::vector<btav_a2dp_codec_config_t>& codec_preferences,
567                          std::promise<void> peer_ready_promise) {
568     // Restart the session if the codec for the active peer is updated
569     if (!peer_address.IsEmpty() && active_peer_ == peer_address) {
570       btif_a2dp_source_end_session(active_peer_);
571     }
572 
573     btif_a2dp_source_encoder_user_config_update_req(peer_address, codec_preferences,
574                                                     std::move(peer_ready_promise));
575   }
576 
577   /**
578    * Get number of saved peers.
579    */
GetPeersCount() const580   int GetPeersCount() const {
581     std::lock_guard<std::recursive_mutex> lock(btifavsource_peers_lock_);
582     return peers_.size();
583   }
584 
585   /**
586    * Dispatch SUSPEND or STOP A2DP stream event on all peer devices.
587    * Returns true if succeeded.
588    * @param event SUSPEND or STOP event
589    */
590   void DispatchSuspendStreamEvent(btif_av_sm_event_t event);
591 
592   /**
593    * Set peer reconfigure stream data.
594    *
595    * @param peer_address the peer address to reconfigure stream
596    * @param codec_preferences codec preferences for stream reconfiguration
597    * @param reconf_ready_promise promise fulfilled when the reconfiguration done
598    */
SetPeerReconfigureStreamData(const RawAddress & peer_address,const std::vector<btav_a2dp_codec_config_t> & codec_preferences,std::promise<void> reconf_ready_promise)599   bt_status_t SetPeerReconfigureStreamData(const RawAddress& peer_address,
600                                            const std::vector<btav_a2dp_codec_config_t>& codec_preferences,
601                                            std::promise<void> reconf_ready_promise) {
602     std::lock_guard<std::recursive_mutex> lock(btifavsource_peers_lock_);
603 
604     BtifAvPeer* peer = FindPeer(peer_address);
605     if (peer == nullptr) {
606       log::error("Can not find peer: {}", peer_address.ToString());
607       return BT_STATUS_NOT_READY;
608     }
609 
610     btif_av_reconfig_req_t reconf_stream_req = {
611             .codec_preferences = codec_preferences,
612             .reconf_ready_promise = std::move(reconf_ready_promise),
613     };
614 
615     peer->SetReconfigureStreamData(std::move(reconf_stream_req));
616     return BT_STATUS_SUCCESS;
617   }
618 
619   void DumpPeersInfo(int fd);
620   void RegisterAllBtaHandles();
621   void DeregisterAllBtaHandles();
622   void BtaHandleRegistered(uint8_t peer_id, tBTA_AV_HNDL bta_handle);
623   BtifAvPeer* popPeer(const RawAddress& peer_address);
624   void AddPeer(BtifAvPeer* peer);
625 
626 private:
627   void CleanupAllPeers();
628 
629   btav_source_callbacks_t* callbacks_;
630   bool enabled_;
631   bool a2dp_offload_enabled_;
632   int max_connected_peers_;
633   std::map<RawAddress, BtifAvPeer*> peers_;
634   std::set<RawAddress> silenced_peers_;
635   RawAddress active_peer_;
636   std::map<uint8_t, tBTA_AV_HNDL> peer_id2bta_handle_;
637   // protect for BtifAvSource::peers_
638   mutable std::recursive_mutex btifavsource_peers_lock_;
639 };
640 
641 class BtifAvSink {
642 public:
643   // The PeerId is used as AppId for BTA_AvRegister() purpose
644   static constexpr uint8_t kPeerIdMin = 0;
645   static constexpr uint8_t kPeerIdMax = BTA_AV_NUM_STRS;
646 
BtifAvSink()647   BtifAvSink()
648       : callbacks_(nullptr),
649         enabled_(false),
650         max_connected_peers_(kDefaultMaxConnectedAudioDevices) {}
651   ~BtifAvSink();
652 
653   void Init(btav_sink_callbacks_t* callbacks, int max_connected_audio_devices,
654             std::promise<bt_status_t> complete_promise);
655   void Cleanup();
656 
Callbacks()657   btav_sink_callbacks_t* Callbacks() { return callbacks_; }
Enabled() const658   bool Enabled() const { return enabled_; }
659 
660   BtifAvPeer* FindPeer(const RawAddress& peer_address);
661   BtifAvPeer* FindPeerByHandle(tBTA_AV_HNDL bta_handle);
662   BtifAvPeer* FindPeerByPeerId(uint8_t peer_id);
663   BtifAvPeer* FindOrCreatePeer(const RawAddress& peer_address, tBTA_AV_HNDL bta_handle);
664 
665   /**
666    * Check whether a connection to a peer is allowed.
667    * The check considers the maximum number of connected peers.
668    *
669    * @param peer_address the peer address to connect to
670    * @return true if connection is allowed, otherwise false
671    */
672   bool AllowedToConnect(const RawAddress& peer_address) const;
673 
674   /**
675    * Delete all peers that have transitioned to Idle state and can be deleted.
676    * If a peer was just created/initialized, then it cannot be deleted yet.
677    */
678   void DeleteIdlePeers();
679 
680   /**
681    * Get the active peer.
682    *
683    * @return the active peer
684    */
ActivePeer() const685   const RawAddress& ActivePeer() const { return active_peer_; }
686 
687   /**
688    * Set the active peer.
689    *
690    * @param peer_address the active peer address or RawAddress::kEmpty to
691    * reset the active peer
692    * @return true on success, otherwise false
693    */
SetActivePeer(const RawAddress & peer_address,std::promise<void> peer_ready_promise)694   bool SetActivePeer(const RawAddress& peer_address, std::promise<void> peer_ready_promise) {
695     log::info("peer={} active_peer={}", peer_address, active_peer_);
696 
697     if (active_peer_ == peer_address) {
698       peer_ready_promise.set_value();
699       return true;  // Nothing has changed
700     }
701     if (peer_address.IsEmpty()) {
702       log::verbose("peer address is empty, shutdown the Audio sink");
703       if (!bta_av_co_set_active_sink_peer(peer_address)) {
704         log::warn("unable to set active peer to empty in BtaAvCo");
705       }
706 
707       btif_a2dp_sink_end_session(active_peer_);
708       btif_a2dp_sink_shutdown();
709       active_peer_ = peer_address;
710       peer_ready_promise.set_value();
711       return true;
712     }
713 
714     BtifAvPeer* peer = FindPeer(peer_address);
715     if (peer == nullptr || !peer->IsConnected()) {
716       log::error("Error setting {} as active Sink peer", peer_address);
717       peer_ready_promise.set_value();
718       return false;
719     }
720 
721     if (!btif_a2dp_sink_restart_session(active_peer_, peer_address,
722                                         std::move(peer_ready_promise))) {
723       // cannot set promise but need to be handled within restart_session
724       return false;
725     }
726     log::info("Setting the active peer to peer address {}", peer_address);
727     active_peer_ = peer_address;
728     return true;
729   }
730 
731   /**
732    * Get number of saved peers.
733    */
GetPeersCount() const734   int GetPeersCount() const {
735     std::lock_guard<std::recursive_mutex> lock(btifavsink_peers_lock_);
736     return peers_.size();
737   }
738 
739   void DumpPeersInfo(int fd);
740   void RegisterAllBtaHandles();
741   void DeregisterAllBtaHandles();
742   void BtaHandleRegistered(uint8_t peer_id, tBTA_AV_HNDL bta_handle);
743   BtifAvPeer* popPeer(const RawAddress& peer_address);
744   void AddPeer(BtifAvPeer* peer);
745 
746 private:
747   void CleanupAllPeers();
748 
749   btav_sink_callbacks_t* callbacks_;
750   bool enabled_;
751   int max_connected_peers_;
752   std::map<RawAddress, BtifAvPeer*> peers_;
753   RawAddress active_peer_;
754   std::map<uint8_t, tBTA_AV_HNDL> peer_id2bta_handle_;
755   // protect for BtifAvSink::peers_
756   mutable std::recursive_mutex btifavsink_peers_lock_;
757 };
758 
759 /*****************************************************************************
760  *  Static variables
761  *****************************************************************************/
762 static BtifAvSource btif_av_source;
763 static BtifAvSink btif_av_sink;
764 
765 /* Helper macro to avoid code duplication in the state machine handlers */
766 #define CHECK_RC_EVENT(e, d)       \
767   case BTA_AV_RC_OPEN_EVT:         \
768   case BTA_AV_RC_BROWSE_OPEN_EVT:  \
769   case BTA_AV_RC_CLOSE_EVT:        \
770   case BTA_AV_RC_BROWSE_CLOSE_EVT: \
771   case BTA_AV_REMOTE_CMD_EVT:      \
772   case BTA_AV_VENDOR_CMD_EVT:      \
773   case BTA_AV_META_MSG_EVT:        \
774   case BTA_AV_RC_FEAT_EVT:         \
775   case BTA_AV_RC_PSM_EVT:          \
776   case BTA_AV_REMOTE_RSP_EVT: {    \
777     btif_rc_handler(e, d);         \
778   } break;
779 
780 static void btif_av_source_dispatch_sm_event(const RawAddress& peer_address,
781                                              btif_av_sm_event_t event);
782 static void btif_av_sink_dispatch_sm_event(const RawAddress& peer_address,
783                                            btif_av_sm_event_t event);
784 static void btif_av_handle_event(uint8_t peer_sep, const RawAddress& peer_address,
785                                  tBTA_AV_HNDL bta_handle, const BtifAvEvent& btif_av_event);
786 static void btif_debug_av_peer_dump(int fd, const BtifAvPeer& peer);
787 static void btif_report_connection_state(const RawAddress& peer_address,
788                                          btav_connection_state_t state, const bt_status_t status,
789                                          uint8_t error_code, const A2dpType local_a2dp_type);
790 static void btif_report_audio_state(const RawAddress& peer_address, btav_audio_state_t state,
791                                     const A2dpType local_a2dp_type);
792 static void btif_av_report_sink_audio_config_state(const RawAddress& peer_address, int sample_rate,
793                                                    int channel_count);
794 static void btif_av_query_mandatory_codec_priority(const RawAddress& peer_address);
795 static void btif_av_source_initiate_av_open_timer_timeout(void* data);
796 static void btif_av_sink_initiate_av_open_timer_timeout(void* data);
797 static void bta_av_sink_media_callback(const RawAddress& peer_address, tBTA_AV_EVT event,
798                                        tBTA_AV_MEDIA* p_data);
799 
btif_av_source_find_peer(const RawAddress & peer_address)800 static BtifAvPeer* btif_av_source_find_peer(const RawAddress& peer_address) {
801   return btif_av_source.FindPeer(peer_address);
802 }
803 
btif_av_sink_find_peer(const RawAddress & peer_address)804 static BtifAvPeer* btif_av_sink_find_peer(const RawAddress& peer_address) {
805   return btif_av_sink.FindPeer(peer_address);
806 }
807 
btif_av_find_peer(const RawAddress & peer_address,const A2dpType local_a2dp_type)808 static BtifAvPeer* btif_av_find_peer(const RawAddress& peer_address,
809                                      const A2dpType local_a2dp_type) {
810   if (btif_av_source.Enabled() && local_a2dp_type == A2dpType::kSource) {
811     BtifAvPeer* sourcePeer = btif_av_source_find_peer(peer_address);
812     if (sourcePeer != nullptr) {
813       return sourcePeer;
814     }
815   }
816   if (btif_av_sink.Enabled() && local_a2dp_type == A2dpType::kSink) {
817     BtifAvPeer* sinkPeer = btif_av_sink_find_peer(peer_address);
818     if (sinkPeer != nullptr) {
819       return sinkPeer;
820     }
821   }
822   if (btif_av_source.Enabled()) {
823     BtifAvPeer* sourcePeer = btif_av_source_find_peer(peer_address);
824     if (sourcePeer != nullptr) {
825       return sourcePeer;
826     }
827   }
828   if (btif_av_sink.Enabled()) {
829     BtifAvPeer* sinkPeer = btif_av_sink_find_peer(peer_address);
830     if (sinkPeer != nullptr) {
831       return sinkPeer;
832     }
833   }
834   log::info("Unable to find the peer {}", peer_address);
835   return nullptr;
836 }
837 
btif_av_find_active_peer(const A2dpType local_a2dp_type)838 static BtifAvPeer* btif_av_find_active_peer(const A2dpType local_a2dp_type) {
839   if (btif_av_source.Enabled() && local_a2dp_type == A2dpType::kSource) {
840     return btif_av_source_find_peer(btif_av_source.ActivePeer());
841   }
842   if (btif_av_sink.Enabled() && local_a2dp_type == A2dpType::kSink) {
843     return btif_av_sink_find_peer(btif_av_sink.ActivePeer());
844   }
845   return nullptr;
846 }
847 
btif_av_find_by_handle(tBTA_AV_HNDL bta_handle)848 const RawAddress& btif_av_find_by_handle(tBTA_AV_HNDL bta_handle) {
849   BtifAvPeer* peer = nullptr;
850   if (btif_av_both_enable()) {
851     peer = btif_av_source.FindPeerByHandle(bta_handle);
852     if (peer == nullptr) {
853       peer = btif_av_sink.FindPeerByHandle(bta_handle);
854     }
855     if (peer == nullptr) {
856       return RawAddress::kEmpty;
857     }
858 
859     return peer->PeerAddress();
860   }
861   if (btif_av_source.Enabled()) {
862     peer = btif_av_source.FindPeerByHandle(bta_handle);
863   }
864   if (btif_av_sink.Enabled()) {
865     peer = btif_av_sink.FindPeerByHandle(bta_handle);
866   }
867 
868   if (peer == nullptr) {
869     return RawAddress::kEmpty;
870   }
871 
872   return peer->PeerAddress();
873 }
874 
875 /*****************************************************************************
876  * Local helper functions
877  *****************************************************************************/
878 
dump_av_sm_event_name(btif_av_sm_event_t event)879 static const char* dump_av_sm_event_name(btif_av_sm_event_t event) {
880   switch (static_cast<int>(event)) {
881     CASE_RETURN_STR(BTA_AV_ENABLE_EVT)
882     CASE_RETURN_STR(BTA_AV_REGISTER_EVT)
883     CASE_RETURN_STR(BTA_AV_OPEN_EVT)
884     CASE_RETURN_STR(BTA_AV_CLOSE_EVT)
885     CASE_RETURN_STR(BTA_AV_START_EVT)
886     CASE_RETURN_STR(BTA_AV_STOP_EVT)
887     CASE_RETURN_STR(BTA_AV_PROTECT_REQ_EVT)
888     CASE_RETURN_STR(BTA_AV_PROTECT_RSP_EVT)
889     CASE_RETURN_STR(BTA_AV_RC_OPEN_EVT)
890     CASE_RETURN_STR(BTA_AV_RC_CLOSE_EVT)
891     CASE_RETURN_STR(BTA_AV_RC_BROWSE_OPEN_EVT)
892     CASE_RETURN_STR(BTA_AV_RC_BROWSE_CLOSE_EVT)
893     CASE_RETURN_STR(BTA_AV_REMOTE_CMD_EVT)
894     CASE_RETURN_STR(BTA_AV_REMOTE_RSP_EVT)
895     CASE_RETURN_STR(BTA_AV_VENDOR_CMD_EVT)
896     CASE_RETURN_STR(BTA_AV_VENDOR_RSP_EVT)
897     CASE_RETURN_STR(BTA_AV_RECONFIG_EVT)
898     CASE_RETURN_STR(BTA_AV_SUSPEND_EVT)
899     CASE_RETURN_STR(BTA_AV_PENDING_EVT)
900     CASE_RETURN_STR(BTA_AV_META_MSG_EVT)
901     CASE_RETURN_STR(BTA_AV_REJECT_EVT)
902     CASE_RETURN_STR(BTA_AV_RC_FEAT_EVT)
903     CASE_RETURN_STR(BTA_AV_RC_PSM_EVT)
904     CASE_RETURN_STR(BTA_AV_OFFLOAD_START_RSP_EVT)
905     CASE_RETURN_STR(BTIF_AV_CONNECT_REQ_EVT)
906     CASE_RETURN_STR(BTIF_AV_DISCONNECT_REQ_EVT)
907     CASE_RETURN_STR(BTIF_AV_START_STREAM_REQ_EVT)
908     CASE_RETURN_STR(BTIF_AV_STOP_STREAM_REQ_EVT)
909     CASE_RETURN_STR(BTIF_AV_SUSPEND_STREAM_REQ_EVT)
910     CASE_RETURN_STR(BTIF_AV_SINK_CONFIG_REQ_EVT)
911     CASE_RETURN_STR(BTIF_AV_ACL_DISCONNECTED)
912     CASE_RETURN_STR(BTIF_AV_OFFLOAD_START_REQ_EVT)
913     CASE_RETURN_STR(BTIF_AV_AVRCP_OPEN_EVT)
914     CASE_RETURN_STR(BTIF_AV_AVRCP_CLOSE_EVT)
915     CASE_RETURN_STR(BTIF_AV_AVRCP_REMOTE_PLAY_EVT)
916     CASE_RETURN_STR(BTIF_AV_SET_LATENCY_REQ_EVT)
917     CASE_RETURN_STR(BTIF_AV_RECONFIGURE_REQ_EVT)
918     default:
919       return "UNKNOWN_EVENT";
920   }
921 }
922 
BtifAvEvent(uint32_t event,const void * p_data,size_t data_length)923 BtifAvEvent::BtifAvEvent(uint32_t event, const void* p_data, size_t data_length)
924     : event_(event), data_(nullptr), data_length_(0) {
925   DeepCopy(event, p_data, data_length);
926 }
927 
BtifAvEvent(const BtifAvEvent & other)928 BtifAvEvent::BtifAvEvent(const BtifAvEvent& other) : event_(0), data_(nullptr), data_length_(0) {
929   *this = other;
930 }
931 
operator =(const BtifAvEvent & other)932 BtifAvEvent& BtifAvEvent::operator=(const BtifAvEvent& other) {
933   DeepFree();
934   DeepCopy(other.Event(), other.Data(), other.DataLength());
935   return *this;
936 }
937 
~BtifAvEvent()938 BtifAvEvent::~BtifAvEvent() { DeepFree(); }
939 
ToString() const940 std::string BtifAvEvent::ToString() const { return BtifAvEvent::EventName(event_); }
941 
EventName(uint32_t event)942 std::string BtifAvEvent::EventName(uint32_t event) {
943   std::string name = dump_av_sm_event_name(static_cast<btif_av_sm_event_t>(event));
944   std::stringstream ss_value;
945   ss_value << "(0x" << std::hex << event << ")";
946   return name + ss_value.str();
947 }
948 
DeepCopy(uint32_t event,const void * p_data,size_t data_length)949 void BtifAvEvent::DeepCopy(uint32_t event, const void* p_data, size_t data_length) {
950   event_ = event;
951   data_length_ = data_length;
952   if (data_length == 0) {
953     data_ = nullptr;
954   } else {
955     data_ = osi_malloc(data_length_);
956     memcpy(data_, p_data, data_length);
957   }
958 
959   switch (event) {
960     case BTA_AV_META_MSG_EVT: {
961       log::assert_that(data_length >= sizeof(tBTA_AV),
962                        "assert failed: data_length >= sizeof(tBTA_AV)");
963       const tBTA_AV* av_src = (const tBTA_AV*)p_data;
964       tBTA_AV* av_dest = reinterpret_cast<tBTA_AV*>(data_);
965       if (av_src->meta_msg.p_data && av_src->meta_msg.len) {
966         av_dest->meta_msg.p_data = reinterpret_cast<uint8_t*>(osi_calloc(av_src->meta_msg.len));
967         memcpy(av_dest->meta_msg.p_data, av_src->meta_msg.p_data, av_src->meta_msg.len);
968       }
969 
970       if (av_src->meta_msg.p_msg) {
971         av_dest->meta_msg.p_msg = reinterpret_cast<tAVRC_MSG*>(osi_calloc(sizeof(tAVRC_MSG)));
972         memcpy(av_dest->meta_msg.p_msg, av_src->meta_msg.p_msg, sizeof(tAVRC_MSG));
973 
974         tAVRC_MSG* p_msg_src = av_src->meta_msg.p_msg;
975         tAVRC_MSG* p_msg_dest = av_dest->meta_msg.p_msg;
976 
977         if ((p_msg_src->hdr.opcode == AVRC_OP_VENDOR) &&
978             (p_msg_src->vendor.p_vendor_data && p_msg_src->vendor.vendor_len)) {
979           p_msg_dest->vendor.p_vendor_data =
980                   reinterpret_cast<uint8_t*>(osi_calloc(p_msg_src->vendor.vendor_len));
981           memcpy(p_msg_dest->vendor.p_vendor_data, p_msg_src->vendor.p_vendor_data,
982                  p_msg_src->vendor.vendor_len);
983         }
984         if ((p_msg_src->hdr.opcode == AVRC_OP_BROWSE) && p_msg_src->browse.p_browse_data &&
985             p_msg_src->browse.browse_len) {
986           p_msg_dest->browse.p_browse_data =
987                   reinterpret_cast<uint8_t*>(osi_calloc(p_msg_src->browse.browse_len));
988           memcpy(p_msg_dest->browse.p_browse_data, p_msg_src->browse.p_browse_data,
989                  p_msg_src->browse.browse_len);
990         }
991       }
992     } break;
993 
994     default:
995       break;
996   }
997 }
998 
DeepFree()999 void BtifAvEvent::DeepFree() {
1000   switch (event_) {
1001     case BTA_AV_META_MSG_EVT: {
1002       tBTA_AV* av = reinterpret_cast<tBTA_AV*>(data_);
1003       osi_free(av->meta_msg.p_data);
1004       av->meta_msg.p_data = nullptr;
1005 
1006       if (av->meta_msg.p_msg) {
1007         if (av->meta_msg.p_msg->hdr.opcode == AVRC_OP_VENDOR) {
1008           osi_free(av->meta_msg.p_msg->vendor.p_vendor_data);
1009         }
1010         if (av->meta_msg.p_msg->hdr.opcode == AVRC_OP_BROWSE) {
1011           osi_free(av->meta_msg.p_msg->browse.p_browse_data);
1012         }
1013         osi_free(av->meta_msg.p_msg);
1014         av->meta_msg.p_msg = nullptr;
1015       }
1016     } break;
1017 
1018     default:
1019       break;
1020   }
1021 
1022   osi_free(data_);
1023   data_ = nullptr;
1024   data_length_ = 0;
1025 }
1026 
BtifAvPeer(const RawAddress & peer_address,uint8_t peer_sep,tBTA_AV_HNDL bta_handle,uint8_t peer_id)1027 BtifAvPeer::BtifAvPeer(const RawAddress& peer_address, uint8_t peer_sep, tBTA_AV_HNDL bta_handle,
1028                        uint8_t peer_id)
1029     : peer_address_(peer_address),
1030       peer_sep_(peer_sep),
1031       bta_handle_(bta_handle),
1032       peer_id_(peer_id),
1033       state_machine_(*this),
1034       av_open_on_rc_timer_(nullptr),
1035       edr_(0),
1036       flags_(0),
1037       self_initiated_connection_(false),
1038       delay_report_(0) {}
1039 
~BtifAvPeer()1040 BtifAvPeer::~BtifAvPeer() { alarm_free(av_open_on_rc_timer_); }
1041 
FlagsToString() const1042 std::string BtifAvPeer::FlagsToString() const {
1043   std::string result;
1044 
1045   if (flags_ & BtifAvPeer::kFlagLocalSuspendPending) {
1046     if (!result.empty()) {
1047       result += "|";
1048     }
1049     result += "LOCAL_SUSPEND_PENDING";
1050   }
1051   if (flags_ & BtifAvPeer::kFlagRemoteSuspend) {
1052     if (!result.empty()) {
1053       result += "|";
1054     }
1055     result += "REMOTE_SUSPEND";
1056   }
1057   if (flags_ & BtifAvPeer::kFlagPendingStart) {
1058     if (!result.empty()) {
1059       result += "|";
1060     }
1061     result += "PENDING_START";
1062   }
1063   if (flags_ & BtifAvPeer::kFlagPendingStop) {
1064     if (!result.empty()) {
1065       result += "|";
1066     }
1067     result += "PENDING_STOP";
1068   }
1069   if (flags_ & BtifAvPeer::kFlagPendingReconfigure) {
1070     if (!result.empty()) {
1071       result += "|";
1072     }
1073     result += "PENDING_RECONFIGURE";
1074   }
1075   if (result.empty()) {
1076     result = "None";
1077   }
1078 
1079   return base::StringPrintf("0x%x(%s)", flags_, result.c_str());
1080 }
1081 
Init()1082 bt_status_t BtifAvPeer::Init() {
1083   alarm_free(av_open_on_rc_timer_);
1084   av_open_on_rc_timer_ = alarm_new("btif_av_peer.av_open_on_rc_timer");
1085   is_silenced_ = false;
1086 
1087   state_machine_.Start();
1088   return BT_STATUS_SUCCESS;
1089 }
1090 
Cleanup()1091 void BtifAvPeer::Cleanup() {
1092   state_machine_.Quit();
1093   alarm_free(av_open_on_rc_timer_);
1094   av_open_on_rc_timer_ = nullptr;
1095 }
1096 
CanBeDeleted() const1097 bool BtifAvPeer::CanBeDeleted() const {
1098   return (state_machine_.StateId() == BtifAvStateMachine::kStateIdle) &&
1099          (state_machine_.PreviousStateId() != BtifAvStateMachine::kStateInvalid);
1100 }
1101 
ActivePeerAddress() const1102 const RawAddress& BtifAvPeer::ActivePeerAddress() const {
1103   if (IsSource()) {
1104     return btif_av_sink.ActivePeer();
1105   }
1106   if (IsSink()) {
1107     return btif_av_source.ActivePeer();
1108   }
1109 
1110   log::fatal("A2DP peer {} is neither Source nor Sink", PeerAddress());
1111   return RawAddress::kEmpty;
1112 }
1113 
IsConnected() const1114 bool BtifAvPeer::IsConnected() const {
1115   int state = state_machine_.StateId();
1116   return (state == BtifAvStateMachine::kStateOpened) ||
1117          (state == BtifAvStateMachine::kStateStarted);
1118 }
1119 
IsStreaming() const1120 bool BtifAvPeer::IsStreaming() const {
1121   int state = state_machine_.StateId();
1122   return state == BtifAvStateMachine::kStateStarted;
1123 }
1124 
~BtifAvSource()1125 BtifAvSource::~BtifAvSource() { CleanupAllPeers(); }
1126 
Init(btav_source_callbacks_t * callbacks,int max_connected_audio_devices,const std::vector<btav_a2dp_codec_config_t> & codec_priorities,const std::vector<btav_a2dp_codec_config_t> & offloading_preference,std::vector<btav_a2dp_codec_info_t> * supported_codecs,std::promise<bt_status_t> complete_promise)1127 void BtifAvSource::Init(btav_source_callbacks_t* callbacks, int max_connected_audio_devices,
1128                         const std::vector<btav_a2dp_codec_config_t>& codec_priorities,
1129                         const std::vector<btav_a2dp_codec_config_t>& offloading_preference,
1130                         std::vector<btav_a2dp_codec_info_t>* supported_codecs,
1131                         std::promise<bt_status_t> complete_promise) {
1132   log::info("max_connected_audio_devices={}", max_connected_audio_devices);
1133   Cleanup();
1134   CleanupAllPeers();
1135   max_connected_peers_ = max_connected_audio_devices;
1136 
1137   /* A2DP OFFLOAD */
1138   a2dp_offload_enabled_ = GetInterfaceToProfiles()->config->isA2DPOffloadEnabled();
1139   log::verbose("a2dp_offload.enable = {}", a2dp_offload_enabled_);
1140 
1141   callbacks_ = callbacks;
1142   if (a2dp_offload_enabled_) {
1143     tBTM_BLE_VSC_CB vsc_cb = {};
1144     BTM_BleGetVendorCapabilities(&vsc_cb);
1145     bool supports_a2dp_hw_offload_v2 =
1146             vsc_cb.version_supported >= 0x0104 && vsc_cb.a2dp_offload_v2_support;
1147     bluetooth::audio::a2dp::update_codec_offloading_capabilities(offloading_preference,
1148                                                                  supports_a2dp_hw_offload_v2);
1149   }
1150   bta_av_co_init(codec_priorities, supported_codecs);
1151 
1152   if (!btif_a2dp_source_init()) {
1153     complete_promise.set_value(BT_STATUS_FAIL);
1154     return;
1155   }
1156   enabled_ = true;
1157   btif_enable_service(BTA_A2DP_SOURCE_SERVICE_ID);
1158   complete_promise.set_value(BT_STATUS_SUCCESS);
1159 }
1160 
Cleanup()1161 void BtifAvSource::Cleanup() {
1162   log::info("");
1163   if (!enabled_) {
1164     return;
1165   }
1166   enabled_ = false;
1167 
1168   btif_queue_cleanup(UUID_SERVCLASS_AUDIO_SOURCE);
1169 
1170   std::promise<void> peer_ready_promise;
1171   btif_av_source.SetActivePeer(RawAddress::kEmpty, std::move(peer_ready_promise));
1172   btif_a2dp_source_cleanup();
1173 
1174   btif_disable_service(BTA_A2DP_SOURCE_SERVICE_ID);
1175   CleanupAllPeers();
1176 
1177   callbacks_ = nullptr;
1178 }
1179 
FindPeer(const RawAddress & peer_address)1180 BtifAvPeer* BtifAvSource::FindPeer(const RawAddress& peer_address) {
1181   auto it = peers_.find(peer_address);
1182   if (it != peers_.end()) {
1183     return it->second;
1184   }
1185   return nullptr;
1186 }
1187 
FindPeerByHandle(tBTA_AV_HNDL bta_handle)1188 BtifAvPeer* BtifAvSource::FindPeerByHandle(tBTA_AV_HNDL bta_handle) {
1189   std::lock_guard<std::recursive_mutex> lock(btifavsource_peers_lock_);
1190   for (auto it : peers_) {
1191     BtifAvPeer* peer = it.second;
1192     if (peer->BtaHandle() == bta_handle) {
1193       return peer;
1194     }
1195   }
1196   return nullptr;
1197 }
1198 
FindPeerByPeerId(uint8_t peer_id)1199 BtifAvPeer* BtifAvSource::FindPeerByPeerId(uint8_t peer_id) {
1200   std::lock_guard<std::recursive_mutex> lock(btifavsource_peers_lock_);
1201   for (auto it : peers_) {
1202     BtifAvPeer* peer = it.second;
1203     if (peer->PeerId() == peer_id) {
1204       return peer;
1205     }
1206   }
1207   return nullptr;
1208 }
1209 
FindOrCreatePeer(const RawAddress & peer_address,tBTA_AV_HNDL bta_handle)1210 BtifAvPeer* BtifAvSource::FindOrCreatePeer(const RawAddress& peer_address,
1211                                            tBTA_AV_HNDL bta_handle) {
1212   std::lock_guard<std::recursive_mutex> lock(btifavsource_peers_lock_);
1213   log::verbose("peer={} bta_handle=0x{:x}", peer_address, bta_handle);
1214 
1215   BtifAvPeer* peer = FindPeer(peer_address);
1216   if (peer != nullptr) {
1217     return peer;
1218   }
1219 
1220   // Find next availabie Peer ID to use
1221   uint8_t peer_id;
1222   for (peer_id = kPeerIdMin; peer_id < kPeerIdMax; peer_id++) {
1223     /* because the peer id may be in source cb and we cannot use it */
1224     if (btif_av_src_sink_coexist_enabled() && btif_av_both_enable()) {
1225       if (FindPeerByPeerId(peer_id) == nullptr &&
1226           btif_av_sink.FindPeerByPeerId(peer_id) == nullptr) {
1227         break;
1228       }
1229     } else {
1230       if (FindPeerByPeerId(peer_id) == nullptr) {
1231         break;
1232       }
1233     }
1234   }
1235   if (peer_id == kPeerIdMax) {
1236     log::error(
1237             "Cannot create peer for peer={} : cannot allocate unique Peer "
1238             "ID",
1239             peer_address);
1240     return nullptr;
1241   }
1242 
1243   // Get the BTA Handle (if known)
1244   if (bta_handle == kBtaHandleUnknown) {
1245     auto it = peer_id2bta_handle_.find(peer_id);
1246     if (it == peer_id2bta_handle_.end() || it->second == kBtaHandleUnknown) {
1247       log::error(
1248               "Cannot create peer for peer={} : cannot convert Peer ID={} "
1249               "to unique BTA Handle",
1250               peer_address, peer_id);
1251       return nullptr;
1252     }
1253     bta_handle = it->second;
1254   }
1255 
1256   log::info("Create peer: peer={} bta_handle=0x{:x} peer_id={}", peer_address, bta_handle, peer_id);
1257   peer = new BtifAvPeer(peer_address, AVDT_TSEP_SNK, bta_handle, peer_id);
1258   peers_.insert(std::make_pair(peer_address, peer));
1259   peer->Init();
1260   return peer;
1261 }
1262 
AllowedToConnect(const RawAddress & peer_address) const1263 bool BtifAvSource::AllowedToConnect(const RawAddress& peer_address) const {
1264   std::lock_guard<std::recursive_mutex> lock(btifavsource_peers_lock_);
1265   int connected = 0;
1266 
1267   // Count peers that are in the process of connecting or already connected
1268   for (auto it : peers_) {
1269     const BtifAvPeer* peer = it.second;
1270     switch (peer->StateMachine().StateId()) {
1271       case BtifAvStateMachine::kStateOpening:
1272       case BtifAvStateMachine::kStateOpened:
1273       case BtifAvStateMachine::kStateStarted:
1274         if (peer->PeerAddress() == peer_address) {
1275           return true;  // Already connected or accounted for
1276         }
1277         connected++;
1278         break;
1279       default:
1280         break;
1281     }
1282   }
1283   const int sink_connected_peers_size = btif_av_sink.GetPeersCount();
1284   log::info("connected={}, max_connected_peers_={}, sink_connected_peers_size={}", connected,
1285             max_connected_peers_, btif_av_sink.GetPeersCount());
1286   return (connected + sink_connected_peers_size) < max_connected_peers_;
1287 }
1288 
DumpPeersInfo(int fd)1289 void BtifAvSource::DumpPeersInfo(int fd) {
1290   std::lock_guard<std::recursive_mutex> lock(btifavsource_peers_lock_);
1291   for (auto it : peers_) {
1292     const BtifAvPeer* peer = it.second;
1293     if (peer != nullptr) {
1294       btif_debug_av_peer_dump(fd, *peer);
1295     }
1296   }
1297 }
1298 
DispatchSuspendStreamEvent(btif_av_sm_event_t event)1299 void BtifAvSource::DispatchSuspendStreamEvent(btif_av_sm_event_t event) {
1300   std::lock_guard<std::recursive_mutex> lock(btifavsource_peers_lock_);
1301   if (event != BTIF_AV_SUSPEND_STREAM_REQ_EVT && event != BTIF_AV_STOP_STREAM_REQ_EVT) {
1302     log::error("Invalid event: {} id: {}", dump_av_sm_event_name(event), static_cast<int>(event));
1303     return;
1304   }
1305   bool av_stream_idle = true;
1306   for (auto it : peers_) {
1307     const BtifAvPeer* peer = it.second;
1308     if (peer->StateMachine().StateId() == BtifAvStateMachine::kStateStarted) {
1309       btif_av_source_dispatch_sm_event(peer->PeerAddress(), event);
1310       av_stream_idle = false;
1311     }
1312   }
1313 
1314   if (av_stream_idle) {
1315     btif_a2dp_on_stopped(nullptr, A2dpType::kSource);
1316   }
1317 }
1318 
DeleteIdlePeers()1319 void BtifAvSource::DeleteIdlePeers() {
1320   std::lock_guard<std::recursive_mutex> lock(btifavsource_peers_lock_);
1321   for (auto it = peers_.begin(); it != peers_.end();) {
1322     BtifAvPeer* peer = it->second;
1323     auto prev_it = it++;
1324     if (!peer->CanBeDeleted()) {
1325       continue;
1326     }
1327     log::info("peer={} bta_handle=0x{:x}", peer->PeerAddress(), peer->BtaHandle());
1328     peer->Cleanup();
1329     peers_.erase(prev_it);
1330     delete peer;
1331   }
1332 }
1333 
CleanupAllPeers()1334 void BtifAvSource::CleanupAllPeers() {
1335   std::lock_guard<std::recursive_mutex> lock(btifavsource_peers_lock_);
1336   log::info("");
1337 
1338   while (!peers_.empty()) {
1339     auto it = peers_.begin();
1340     BtifAvPeer* peer = it->second;
1341     peer->Cleanup();
1342     peers_.erase(it);
1343     delete peer;
1344   }
1345 }
1346 
RegisterAllBtaHandles()1347 void BtifAvSource::RegisterAllBtaHandles() {
1348   for (int peer_id = kPeerIdMin; peer_id < kPeerIdMax; peer_id++) {
1349     BTA_AvRegister(BTA_AV_CHNL_AUDIO, kBtifAvSourceServiceName, peer_id, nullptr,
1350                    UUID_SERVCLASS_AUDIO_SOURCE);
1351   }
1352 }
1353 
DeregisterAllBtaHandles()1354 void BtifAvSource::DeregisterAllBtaHandles() {
1355   for (auto it : peer_id2bta_handle_) {
1356     tBTA_AV_HNDL bta_handle = it.second;
1357     BTA_AvDeregister(bta_handle);
1358   }
1359   peer_id2bta_handle_.clear();
1360 }
1361 
BtaHandleRegistered(uint8_t peer_id,tBTA_AV_HNDL bta_handle)1362 void BtifAvSource::BtaHandleRegistered(uint8_t peer_id, tBTA_AV_HNDL bta_handle) {
1363   peer_id2bta_handle_.insert(std::make_pair(peer_id, bta_handle));
1364 
1365   // Set the BTA Handle for the Peer (if exists)
1366   BtifAvPeer* peer = FindPeerByPeerId(peer_id);
1367   if (peer != nullptr && peer->BtaHandle() != bta_handle) {
1368     if (peer->BtaHandle() == kBtaHandleUnknown) {
1369       log::verbose("Assign peer: peer={} bta_handle=0x{:x} peer_id={}", peer->PeerAddress(),
1370                    bta_handle, peer_id);
1371     } else {
1372       log::warn("Correct peer: peer={} bta_handle=0x{:x}->0x{:x} peer_id={}", peer->PeerAddress(),
1373                 peer->BtaHandle(), bta_handle, peer_id);
1374     }
1375     peer->SetBtaHandle(bta_handle);
1376   }
1377 }
1378 
popPeer(const RawAddress & peer_address)1379 BtifAvPeer* BtifAvSource::popPeer(const RawAddress& peer_address) {
1380   std::lock_guard<std::recursive_mutex> lock(btifavsource_peers_lock_);
1381   auto it = peers_.find(peer_address);
1382   if (it == peers_.end()) {
1383     return nullptr;
1384   }
1385   BtifAvPeer* peer = it->second;
1386   peers_.erase(it);
1387   log::info("peer={}, state={}", peer->PeerAddress(), peer->StateMachine().StateId());
1388   return peer;
1389 }
1390 
AddPeer(BtifAvPeer * peer)1391 void BtifAvSource::AddPeer(BtifAvPeer* peer) {
1392   std::lock_guard<std::recursive_mutex> lock(btifavsource_peers_lock_);
1393   log::info("peer={}, state={}", peer->PeerAddress(), peer->StateMachine().StateId());
1394   peers_.insert(std::make_pair(peer->PeerAddress(), peer));
1395 }
~BtifAvSink()1396 BtifAvSink::~BtifAvSink() { CleanupAllPeers(); }
1397 
Init(btav_sink_callbacks_t * callbacks,int max_connected_audio_devices,std::promise<bt_status_t> complete_promise)1398 void BtifAvSink::Init(btav_sink_callbacks_t* callbacks, int max_connected_audio_devices,
1399                       std::promise<bt_status_t> complete_promise) {
1400   log::info("(max_connected_audio_devices={})", max_connected_audio_devices);
1401   Cleanup();
1402   CleanupAllPeers();
1403   max_connected_peers_ = max_connected_audio_devices;
1404   callbacks_ = callbacks;
1405 
1406   /** source will have this configuration, but sink don't have, so don't
1407    * overwrite it. */
1408   if (!btif_av_source.Enabled()) {
1409     std::vector<btav_a2dp_codec_config_t> codec_priorities;  // Default priorities
1410     std::vector<btav_a2dp_codec_info_t> supported_codecs;
1411     bta_av_co_init(codec_priorities, &supported_codecs);
1412   }
1413 
1414   if (!btif_a2dp_sink_init()) {
1415     complete_promise.set_value(BT_STATUS_FAIL);
1416     return;
1417   }
1418   enabled_ = true;
1419   btif_enable_service(BTA_A2DP_SINK_SERVICE_ID);
1420   complete_promise.set_value(BT_STATUS_SUCCESS);
1421 }
1422 
Cleanup()1423 void BtifAvSink::Cleanup() {
1424   log::info("");
1425   if (!enabled_) {
1426     return;
1427   }
1428   enabled_ = false;
1429 
1430   btif_queue_cleanup(UUID_SERVCLASS_AUDIO_SINK);
1431 
1432   std::promise<void> peer_ready_promise;
1433   btif_av_sink.SetActivePeer(RawAddress::kEmpty, std::move(peer_ready_promise));
1434   btif_a2dp_sink_cleanup();
1435 
1436   btif_disable_service(BTA_A2DP_SINK_SERVICE_ID);
1437   CleanupAllPeers();
1438 
1439   callbacks_ = nullptr;
1440 }
1441 
FindPeer(const RawAddress & peer_address)1442 BtifAvPeer* BtifAvSink::FindPeer(const RawAddress& peer_address) {
1443   auto it = peers_.find(peer_address);
1444   if (it != peers_.end()) {
1445     return it->second;
1446   }
1447   return nullptr;
1448 }
1449 
FindPeerByHandle(tBTA_AV_HNDL bta_handle)1450 BtifAvPeer* BtifAvSink::FindPeerByHandle(tBTA_AV_HNDL bta_handle) {
1451   std::lock_guard<std::recursive_mutex> lock(btifavsink_peers_lock_);
1452   for (auto it : peers_) {
1453     BtifAvPeer* peer = it.second;
1454     if (peer->BtaHandle() == bta_handle) {
1455       return peer;
1456     }
1457   }
1458   return nullptr;
1459 }
1460 
FindPeerByPeerId(uint8_t peer_id)1461 BtifAvPeer* BtifAvSink::FindPeerByPeerId(uint8_t peer_id) {
1462   std::lock_guard<std::recursive_mutex> lock(btifavsink_peers_lock_);
1463   for (auto it : peers_) {
1464     BtifAvPeer* peer = it.second;
1465     if (peer->PeerId() == peer_id) {
1466       return peer;
1467     }
1468   }
1469   return nullptr;
1470 }
1471 
FindOrCreatePeer(const RawAddress & peer_address,tBTA_AV_HNDL bta_handle)1472 BtifAvPeer* BtifAvSink::FindOrCreatePeer(const RawAddress& peer_address, tBTA_AV_HNDL bta_handle) {
1473   std::lock_guard<std::recursive_mutex> lock(btifavsink_peers_lock_);
1474   log::verbose("peer={} bta_handle=0x{:x}", peer_address, bta_handle);
1475 
1476   BtifAvPeer* peer = FindPeer(peer_address);
1477   if (peer != nullptr) {
1478     return peer;
1479   }
1480 
1481   // Find next availabie Peer ID to use
1482   uint8_t peer_id;
1483   for (peer_id = kPeerIdMin; peer_id < kPeerIdMax; peer_id++) {
1484     /* because the peer id may be in source cb and we cannot use it */
1485     if (btif_av_both_enable()) {
1486       if (FindPeerByPeerId(peer_id) == nullptr &&
1487           btif_av_source.FindPeerByPeerId(peer_id) == nullptr) {
1488         break;
1489       }
1490 
1491     } else {
1492       if (FindPeerByPeerId(peer_id) == nullptr) {
1493         break;
1494       }
1495     }
1496   }
1497   if (peer_id == kPeerIdMax) {
1498     log::error(
1499             "Cannot create peer for peer={} : cannot allocate unique Peer "
1500             "ID",
1501             peer_address);
1502     return nullptr;
1503   }
1504 
1505   // Get the BTA Handle (if known)
1506   if (bta_handle == kBtaHandleUnknown) {
1507     auto it = peer_id2bta_handle_.find(peer_id);
1508     if (it == peer_id2bta_handle_.end() || it->second == kBtaHandleUnknown) {
1509       log::error(
1510               "Cannot create peer for peer={} : cannot convert Peer ID={} "
1511               "to unique BTA Handle",
1512               peer_address, peer_id);
1513       return nullptr;
1514     }
1515     bta_handle = it->second;
1516   }
1517 
1518   log::info("Create peer: peer={} bta_handle=0x{:x} peer_id={}", peer_address, bta_handle, peer_id);
1519   peer = new BtifAvPeer(peer_address, AVDT_TSEP_SRC, bta_handle, peer_id);
1520   peers_.insert(std::make_pair(peer_address, peer));
1521   peer->Init();
1522   return peer;
1523 }
1524 
DumpPeersInfo(int fd)1525 void BtifAvSink::DumpPeersInfo(int fd) {
1526   std::lock_guard<std::recursive_mutex> lock(btifavsink_peers_lock_);
1527   for (auto it : peers_) {
1528     const BtifAvPeer* peer = it.second;
1529     if (peer != nullptr) {
1530       btif_debug_av_peer_dump(fd, *peer);
1531     }
1532   }
1533 }
1534 
AllowedToConnect(const RawAddress & peer_address) const1535 bool BtifAvSink::AllowedToConnect(const RawAddress& peer_address) const {
1536   std::lock_guard<std::recursive_mutex> lock(btifavsink_peers_lock_);
1537   int connected = 0;
1538 
1539   // Count peers that are in the process of connecting or already connected
1540   for (auto it : peers_) {
1541     const BtifAvPeer* peer = it.second;
1542     switch (peer->StateMachine().StateId()) {
1543       case BtifAvStateMachine::kStateOpening:
1544       case BtifAvStateMachine::kStateOpened:
1545       case BtifAvStateMachine::kStateStarted:
1546         if (peer->PeerAddress() == peer_address) {
1547           return true;  // Already connected or accounted for
1548         }
1549         connected++;
1550         break;
1551       case BtifAvStateMachine::kStateClosing:
1552       case BtifAvStateMachine::kStateIdle:
1553         if ((btif_a2dp_sink_get_audio_track() != nullptr) &&
1554             (peer->PeerAddress() != peer_address)) {
1555           log::info("there is another peer with audio track({}), another={}, peer={}",
1556                     std::format_ptr(btif_a2dp_sink_get_audio_track()), peer->PeerAddress(),
1557                     peer_address);
1558           connected++;
1559         }
1560         break;
1561       default:
1562         break;
1563     }
1564   }
1565   const int source_connected_peers_size = btif_av_source.GetPeersCount();
1566   log::info("connected={}, max_connected_peers_={}, source_connected_peers_size={}", connected,
1567             max_connected_peers_, source_connected_peers_size);
1568   return (connected + source_connected_peers_size) < max_connected_peers_;
1569 }
1570 
DeleteIdlePeers()1571 void BtifAvSink::DeleteIdlePeers() {
1572   std::lock_guard<std::recursive_mutex> lock(btifavsink_peers_lock_);
1573   for (auto it = peers_.begin(); it != peers_.end();) {
1574     BtifAvPeer* peer = it->second;
1575     auto prev_it = it++;
1576     if (!peer->CanBeDeleted()) {
1577       continue;
1578     }
1579     log::info("Deleting idle peer: {} bta_handle=0x{:x}", peer->PeerAddress(), peer->BtaHandle());
1580     peer->Cleanup();
1581     peers_.erase(prev_it);
1582     delete peer;
1583   }
1584 }
1585 
CleanupAllPeers()1586 void BtifAvSink::CleanupAllPeers() {
1587   std::lock_guard<std::recursive_mutex> lock(btifavsink_peers_lock_);
1588   log::info("");
1589 
1590   while (!peers_.empty()) {
1591     auto it = peers_.begin();
1592     BtifAvPeer* peer = it->second;
1593     peer->Cleanup();
1594     peers_.erase(it);
1595     delete peer;
1596   }
1597 }
1598 
RegisterAllBtaHandles()1599 void BtifAvSink::RegisterAllBtaHandles() {
1600   for (int peer_id = kPeerIdMin; peer_id < kPeerIdMax; peer_id++) {
1601     BTA_AvRegister(BTA_AV_CHNL_AUDIO, kBtifAvSinkServiceName, peer_id, bta_av_sink_media_callback,
1602                    UUID_SERVCLASS_AUDIO_SINK);
1603   }
1604 }
1605 
DeregisterAllBtaHandles()1606 void BtifAvSink::DeregisterAllBtaHandles() {
1607   for (auto it : peer_id2bta_handle_) {
1608     tBTA_AV_HNDL bta_handle = it.second;
1609     BTA_AvDeregister(bta_handle);
1610   }
1611   peer_id2bta_handle_.clear();
1612 }
1613 
BtaHandleRegistered(uint8_t peer_id,tBTA_AV_HNDL bta_handle)1614 void BtifAvSink::BtaHandleRegistered(uint8_t peer_id, tBTA_AV_HNDL bta_handle) {
1615   peer_id2bta_handle_.insert(std::make_pair(peer_id, bta_handle));
1616 
1617   // Set the BTA Handle for the Peer (if exists)
1618   BtifAvPeer* peer = FindPeerByPeerId(peer_id);
1619   if (peer != nullptr && peer->BtaHandle() != bta_handle) {
1620     if (peer->BtaHandle() == kBtaHandleUnknown) {
1621       log::verbose("Assign peer: peer={} bta_handle=0x{:x} peer_id={}", peer->PeerAddress(),
1622                    bta_handle, peer_id);
1623     } else {
1624       log::warn("Correct peer: peer={} bta_handle=0x{:x}->0x{:x} peer_id={}", peer->PeerAddress(),
1625                 peer->BtaHandle(), bta_handle, peer_id);
1626     }
1627     peer->SetBtaHandle(bta_handle);
1628   }
1629 }
1630 
popPeer(const RawAddress & peer_address)1631 BtifAvPeer* BtifAvSink::popPeer(const RawAddress& peer_address) {
1632   std::lock_guard<std::recursive_mutex> lock(btifavsink_peers_lock_);
1633   auto it = peers_.find(peer_address);
1634   if (it == peers_.end()) {
1635     return nullptr;
1636   }
1637   BtifAvPeer* peer = it->second;
1638   peers_.erase(it);
1639   log::info("peer={}, state={}", peer->PeerAddress(), peer->StateMachine().StateId());
1640   return peer;
1641 }
1642 
AddPeer(BtifAvPeer * peer)1643 void BtifAvSink::AddPeer(BtifAvPeer* peer) {
1644   std::lock_guard<std::recursive_mutex> lock(btifavsink_peers_lock_);
1645   log::info("peer={}, state={}", peer->PeerAddress(), peer->StateMachine().StateId());
1646   peers_.insert(std::make_pair(peer->PeerAddress(), peer));
1647 }
1648 
OnEnter()1649 void BtifAvStateMachine::StateIdle::OnEnter() {
1650   log::info("state=Idle peer={}", peer_.PeerAddress());
1651 
1652   peer_.SetEdr(0);
1653   peer_.ClearAllFlags();
1654 
1655   // Stop A2DP if this is the active peer
1656   if (peer_.IsActivePeer() || peer_.ActivePeerAddress().IsEmpty()) {
1657     btif_a2dp_on_idle(peer_.PeerAddress(), peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
1658   }
1659 
1660   // Reset the active peer if this was the active peer and
1661   // the Idle state was reentered
1662   if (peer_.IsActivePeer() && peer_.CanBeDeleted()) {
1663     std::promise<void> peer_ready_promise;
1664     if (peer_.IsSink()) {
1665       btif_av_source.SetActivePeer(RawAddress::kEmpty, std::move(peer_ready_promise));
1666     } else if (peer_.IsSource()) {
1667       btif_av_sink.SetActivePeer(RawAddress::kEmpty, std::move(peer_ready_promise));
1668     }
1669   }
1670 
1671   // Delete peers that are re-entering the Idle state
1672   if (peer_.IsSink()) {
1673     do_in_main_thread(
1674             base::BindOnce(&BtifAvSource::DeleteIdlePeers, base::Unretained(&btif_av_source)));
1675   } else if (peer_.IsSource()) {
1676     do_in_main_thread(
1677             base::BindOnce(&BtifAvSink::DeleteIdlePeers, base::Unretained(&btif_av_sink)));
1678   }
1679 }
1680 
OnExit()1681 void BtifAvStateMachine::StateIdle::OnExit() {
1682   log::info("state=Idle peer={}", peer_.PeerAddress());
1683 }
1684 
ProcessEvent(uint32_t event,void * p_data)1685 bool BtifAvStateMachine::StateIdle::ProcessEvent(uint32_t event, void* p_data) {
1686   log::info("state=Idle peer={} event={} flags={} active_peer={}", peer_.PeerAddress(),
1687             BtifAvEvent::EventName(event), peer_.FlagsToString(), peer_.IsActivePeer());
1688 
1689   switch (event) {
1690     case BTA_AV_ENABLE_EVT:
1691       break;
1692 
1693     case BTIF_AV_STOP_STREAM_REQ_EVT:
1694     case BTIF_AV_SUSPEND_STREAM_REQ_EVT:
1695     case BTIF_AV_ACL_DISCONNECTED:
1696       // Ignore. Just re-enter Idle so the peer can be deleted
1697       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle);
1698       break;
1699 
1700     case BTIF_AV_DISCONNECT_REQ_EVT:
1701       if (peer_.BtaHandle() != kBtaHandleUnknown) {
1702         BTA_AvClose(peer_.BtaHandle());
1703         if (peer_.IsSource()) {
1704           BTA_AvCloseRc(peer_.BtaHandle());
1705         }
1706       }
1707       // Re-enter Idle so the peer can be deleted
1708       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle);
1709       break;
1710 
1711     case BTIF_AV_CONNECT_REQ_EVT:
1712     case BTA_AV_PENDING_EVT: {
1713       bool can_connect = true;
1714       peer_.SetSelfInitiatedConnection(event == BTIF_AV_CONNECT_REQ_EVT);
1715       // Check whether connection is allowed
1716       if (peer_.IsSink()) {
1717         can_connect = btif_av_source.AllowedToConnect(peer_.PeerAddress());
1718         if (!can_connect) {
1719           btif_av_source_disconnect(peer_.PeerAddress());
1720         }
1721       } else if (peer_.IsSource()) {
1722         can_connect = btif_av_sink.AllowedToConnect(peer_.PeerAddress());
1723         if (!can_connect) {
1724           btif_av_sink_disconnect(peer_.PeerAddress());
1725         }
1726       }
1727       if (!can_connect) {
1728         log::error("Cannot connect to peer {}: too many connected peers", peer_.PeerAddress());
1729         if (peer_.SelfInitiatedConnection()) {
1730           btif_queue_advance();
1731         }
1732         break;
1733       }
1734       btif_av_query_mandatory_codec_priority(peer_.PeerAddress());
1735       BTA_AvOpen(peer_.PeerAddress(), peer_.BtaHandle(), true, peer_.LocalUuidServiceClass());
1736       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateOpening);
1737       if (event == BTIF_AV_CONNECT_REQ_EVT) {
1738         DEVICE_IOT_CONFIG_ADDR_SET_INT(
1739                 peer_.PeerAddress(), IOT_CONF_KEY_A2DP_ROLE,
1740                 (peer_.LocalUuidServiceClass() == UUID_SERVCLASS_AUDIO_SOURCE)
1741                         ? IOT_CONF_VAL_A2DP_ROLE_SINK
1742                         : IOT_CONF_VAL_A2DP_ROLE_SOURCE);
1743         DEVICE_IOT_CONFIG_ADDR_INT_ADD_ONE(peer_.PeerAddress(), IOT_CONF_KEY_A2DP_CONN_COUNT);
1744       } else if (event == BTA_AV_PENDING_EVT) {
1745         DEVICE_IOT_CONFIG_ADDR_INT_ADD_ONE(peer_.PeerAddress(), IOT_CONF_KEY_A2DP_CONN_COUNT);
1746       }
1747     } break;
1748     case BTIF_AV_AVRCP_OPEN_EVT:
1749     case BTA_AV_RC_OPEN_EVT: {
1750       // IOP_FIX: Jabra 620 only does AVRCP Open without AV Open whenever it
1751       // connects. So as per the AV WP, an AVRCP connection cannot exist
1752       // without an AV connection. Therefore, we initiate an AV connection
1753       // if an RC_OPEN_EVT is received when we are in AV_CLOSED state.
1754       // We initiate the AV connection after a small 3s timeout to avoid any
1755       // collisions from the headsets, as some headsets initiate the AVRCP
1756       // connection first and then immediately initiate the AV connection
1757       //
1758       // TODO: We may need to do this only on an AVRCP Play. FixMe
1759       log::warn("Peer {} : event={} received without AV", peer_.PeerAddress(),
1760                 BtifAvEvent::EventName(event));
1761 
1762       bool can_connect = true;
1763       // Check whether connection is allowed
1764       if (peer_.IsSink()) {
1765         can_connect = btif_av_source.AllowedToConnect(peer_.PeerAddress());
1766         if (!can_connect) {
1767           log::error("Source profile doesn't allow connection to peer:{}", peer_.PeerAddress());
1768           if (btif_av_src_sink_coexist_enabled()) {
1769             BTA_AvCloseRc((reinterpret_cast<tBTA_AV*>(p_data))->rc_open.rc_handle);
1770           } else {
1771             btif_av_source_disconnect(peer_.PeerAddress());
1772           }
1773         }
1774       } else if (peer_.IsSource()) {
1775         can_connect = btif_av_sink.AllowedToConnect(peer_.PeerAddress());
1776         if (!can_connect) {
1777           log::error("Sink profile doesn't allow connection to peer:{}", peer_.PeerAddress());
1778           if (btif_av_src_sink_coexist_enabled()) {
1779             BTA_AvCloseRc((reinterpret_cast<tBTA_AV*>(p_data))->rc_open.rc_handle);
1780           } else {
1781             btif_av_sink_disconnect(peer_.PeerAddress());
1782           }
1783         }
1784       }
1785       if (!can_connect) {
1786         log::error("Cannot connect to peer {}: too many connected peers", peer_.PeerAddress());
1787         break;
1788       }
1789       /* if peer is source, then start timer for sink connect to src */
1790       if (btif_av_src_sink_coexist_enabled()) {
1791         if (peer_.IsSource()) {
1792           alarm_set_on_mloop(peer_.AvOpenOnRcTimer(), BtifAvPeer::kTimeoutAvOpenOnRcMs,
1793                              btif_av_sink_initiate_av_open_timer_timeout, &peer_);
1794         } else {
1795           alarm_set_on_mloop(peer_.AvOpenOnRcTimer(), BtifAvPeer::kTimeoutAvOpenOnRcMs,
1796                              btif_av_source_initiate_av_open_timer_timeout, &peer_);
1797         }
1798       } else {
1799         if (btif_av_source.Enabled()) {
1800           alarm_set_on_mloop(peer_.AvOpenOnRcTimer(), BtifAvPeer::kTimeoutAvOpenOnRcMs,
1801                              btif_av_source_initiate_av_open_timer_timeout, &peer_);
1802         } else if (btif_av_sink.Enabled()) {
1803           alarm_set_on_mloop(peer_.AvOpenOnRcTimer(), BtifAvPeer::kTimeoutAvOpenOnRcMs,
1804                              btif_av_sink_initiate_av_open_timer_timeout, &peer_);
1805         }
1806       }
1807       if (event == BTA_AV_RC_OPEN_EVT) {
1808         btif_rc_handler(event, reinterpret_cast<tBTA_AV*>(p_data));
1809       }
1810     } break;
1811 
1812     case BTA_AV_RC_BROWSE_OPEN_EVT:
1813       btif_rc_handler(event, reinterpret_cast<tBTA_AV*>(p_data));
1814       break;
1815 
1816     // In case Signalling channel is not down and remote started Streaming
1817     // Procedure, we have to handle Config and Open event in Idle state.
1818     // We hit these scenarios while running PTS test case for AVRCP Controller.
1819     case BTIF_AV_SINK_CONFIG_REQ_EVT: {
1820       const btif_av_sink_config_req_t* p_config_req =
1821               static_cast<const btif_av_sink_config_req_t*>(p_data);
1822       btif_av_report_sink_audio_config_state(p_config_req->peer_address, p_config_req->sample_rate,
1823                                              p_config_req->channel_count);
1824     } break;
1825 
1826     case BTA_AV_OPEN_EVT: {
1827       tBTA_AV* p_bta_data = reinterpret_cast<tBTA_AV*>(p_data);
1828       tBTA_AV_STATUS status = p_bta_data->open.status;
1829       bool can_connect = true;
1830 
1831       log::info("Peer {} : event={} flags={} status={}({}) edr=0x{:x}", peer_.PeerAddress(),
1832                 BtifAvEvent::EventName(event), peer_.FlagsToString(), status,
1833                 (status == BTA_AV_SUCCESS) ? "SUCCESS" : "FAILED", p_bta_data->open.edr);
1834 
1835       btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_CONNECTING,
1836                                    bt_status_t::BT_STATUS_SUCCESS, BTA_AV_SUCCESS,
1837                                    peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
1838 
1839       if (p_bta_data->open.status == BTA_AV_SUCCESS) {
1840         peer_.SetEdr(p_bta_data->open.edr);
1841         if (btif_av_src_sink_coexist_enabled()) {
1842           log::verbose("Peer {} sep={}, open_sep={}", peer_.PeerAddress(), peer_.PeerSep(),
1843                        p_bta_data->open.sep);
1844           /* if peer is wrong sep type, move it to BtifAvSxxx */
1845           if (peer_.PeerSep() != p_bta_data->open.sep) {
1846             BtifAvPeer* tmp_peer = nullptr;
1847             if (peer_.PeerSep() == AVDT_TSEP_SNK) {
1848               tmp_peer = btif_av_source.popPeer(peer_.PeerAddress());
1849 
1850               if (peer_.PeerAddress() != tmp_peer->PeerAddress()) {
1851                 log::error("error, not same peer");
1852               }
1853 
1854               btif_av_sink.AddPeer(tmp_peer);
1855             } else {
1856               tmp_peer = btif_av_sink.popPeer(peer_.PeerAddress());
1857 
1858               if (peer_.PeerAddress() != tmp_peer->PeerAddress()) {
1859                 log::error("error, not same peer");
1860               }
1861 
1862               btif_av_source.AddPeer(tmp_peer);
1863             }
1864             peer_.SetSep(p_bta_data->open.sep);
1865           }
1866           if (btif_rc_is_connected_peer(peer_.PeerAddress())) {
1867             log::verbose("AVRCP connected, update avrc sep");
1868             BTA_AvSetPeerSep(peer_.PeerAddress(), peer_.PeerSep());
1869           }
1870           btif_rc_check_pending_cmd(p_bta_data->open.bd_addr);
1871         }
1872         log::assert_that(peer_.PeerSep() == p_bta_data->open.sep,
1873                          "assert failed: peer_.PeerSep() == p_bta_data->open.sep");
1874 
1875         can_connect = peer_.IsSink() ? btif_av_source.AllowedToConnect(peer_.PeerAddress())
1876                                      : btif_av_sink.AllowedToConnect(peer_.PeerAddress());
1877 
1878         if (!can_connect) {
1879           log::error("Cannot connect to peer {}: too many connected peers", peer_.PeerAddress());
1880 
1881           if (peer_.IsSink()) {
1882             btif_av_source_disconnect(peer_.PeerAddress());
1883           } else if (peer_.IsSource()) {
1884             btif_av_sink_disconnect(peer_.PeerAddress());
1885           }
1886 
1887           btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_DISCONNECTED,
1888                                        bt_status_t::BT_STATUS_NOMEM, BTA_AV_FAIL_RESOURCES,
1889                                        peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
1890           peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle);
1891         } else {
1892           if (peer_.IsSink()) {
1893             // If queued PLAY command, send it now
1894             btif_rc_check_handle_pending_play(p_bta_data->open.bd_addr,
1895                                               (p_bta_data->open.status == BTA_AV_SUCCESS));
1896           } else if (peer_.IsSource() && (p_bta_data->open.status == BTA_AV_SUCCESS)) {
1897             // Bring up AVRCP connection as well
1898             BTA_AvOpenRc(peer_.BtaHandle());
1899           }
1900           btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_CONNECTED,
1901                                        bt_status_t::BT_STATUS_SUCCESS, BTA_AV_SUCCESS,
1902                                        peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
1903           peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateOpened);
1904         }
1905       } else {
1906         btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_DISCONNECTED,
1907                                      bt_status_t::BT_STATUS_FAIL, status,
1908                                      peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
1909         peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle);
1910         DEVICE_IOT_CONFIG_ADDR_INT_ADD_ONE(peer_.PeerAddress(), IOT_CONF_KEY_A2DP_CONN_FAIL_COUNT);
1911       }
1912       btif_queue_advance();
1913     } break;
1914 
1915     case BTA_AV_REMOTE_CMD_EVT:
1916     case BTA_AV_VENDOR_CMD_EVT:
1917     case BTA_AV_META_MSG_EVT:
1918     case BTA_AV_RC_FEAT_EVT:
1919     case BTA_AV_RC_PSM_EVT:
1920     case BTA_AV_REMOTE_RSP_EVT:
1921       btif_rc_handler(event, reinterpret_cast<tBTA_AV*>(p_data));
1922       break;
1923 
1924     case BTIF_AV_AVRCP_CLOSE_EVT:
1925     case BTA_AV_RC_CLOSE_EVT: {
1926       log::verbose("Peer {} : event={} : Stopping AV timer", peer_.PeerAddress(),
1927                    BtifAvEvent::EventName(event));
1928       alarm_cancel(peer_.AvOpenOnRcTimer());
1929 
1930       if (event == BTA_AV_RC_CLOSE_EVT) {
1931         btif_rc_handler(event, reinterpret_cast<tBTA_AV*>(p_data));
1932       }
1933     } break;
1934 
1935     case BTIF_AV_OFFLOAD_START_REQ_EVT:
1936       log::error("Peer {} : event={}: stream is not Opened", peer_.PeerAddress(),
1937                  BtifAvEvent::EventName(event));
1938       btif_a2dp_on_offload_started(peer_.PeerAddress(), BTA_AV_FAIL);
1939       break;
1940 
1941     case BTIF_AV_RECONFIGURE_REQ_EVT: {
1942       // Unlock JNI thread only
1943       auto req_data = peer_.GetReconfigureStreamData();
1944       if (req_data) {
1945         req_data.value().reconf_ready_promise.set_value();
1946       }
1947       break;
1948     }
1949 
1950     default:
1951       log::warn("Peer {} : Unhandled event={}", peer_.PeerAddress(), BtifAvEvent::EventName(event));
1952       return false;
1953   }
1954 
1955   return true;
1956 }
1957 
OnEnter()1958 void BtifAvStateMachine::StateOpening::OnEnter() {
1959   log::info("state=Opening peer={}", peer_.PeerAddress());
1960 
1961   // Inform the application that we are entering connecting state
1962   if (btif_av_both_enable()) {
1963     /* if peer connect to us, don't know which role it is */
1964     if (!peer_.SelfInitiatedConnection()) {
1965       return;
1966     }
1967   }
1968   btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_CONNECTING,
1969                                bt_status_t::BT_STATUS_SUCCESS, BTA_AV_SUCCESS,
1970                                peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
1971 }
1972 
OnExit()1973 void BtifAvStateMachine::StateOpening::OnExit() {
1974   log::info("state=Opening peer={}", peer_.PeerAddress());
1975 }
1976 
ProcessEvent(uint32_t event,void * p_data)1977 bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event, void* p_data) {
1978   log::info("state=Opening peer={} event={} flags={} active_peer={}", peer_.PeerAddress(),
1979             BtifAvEvent::EventName(event), peer_.FlagsToString(), peer_.IsActivePeer());
1980 
1981   switch (event) {
1982     case BTIF_AV_STOP_STREAM_REQ_EVT:
1983     case BTIF_AV_SUSPEND_STREAM_REQ_EVT:
1984       break;  // Ignore
1985 
1986     case BTIF_AV_ACL_DISCONNECTED:
1987       // ACL Disconnected needs to be handled only in Opening state, because
1988       // it is in an intermediate state. In other states we can handle
1989       // incoming/outgoing connect/disconnect requests.
1990       log::warn("Peer {} : event={}: transitioning to Idle due to ACL Disconnect",
1991                 peer_.PeerAddress(), BtifAvEvent::EventName(event));
1992       log_counter_metrics_btif(
1993               android::bluetooth::CodePathCounterKeyEnum::A2DP_CONNECTION_ACL_DISCONNECTED, 1);
1994       btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_DISCONNECTED,
1995                                    bt_status_t::BT_STATUS_FAIL, BTA_AV_FAIL,
1996                                    peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
1997       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle);
1998       if (peer_.SelfInitiatedConnection()) {
1999         btif_queue_advance();
2000       }
2001       break;
2002     case BTA_AV_REJECT_EVT:
2003       log::warn("Peer {} : event={} flags={}", peer_.PeerAddress(), BtifAvEvent::EventName(event),
2004                 peer_.FlagsToString());
2005       log_counter_metrics_btif(
2006               android::bluetooth::CodePathCounterKeyEnum::A2DP_CONNECTION_REJECT_EVT, 1);
2007       btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_DISCONNECTED,
2008                                    bt_status_t::BT_STATUS_AUTH_REJECTED, BTA_AV_FAIL,
2009                                    peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2010       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle);
2011       if (peer_.SelfInitiatedConnection()) {
2012         btif_queue_advance();
2013       }
2014       break;
2015 
2016     case BTA_AV_OPEN_EVT: {
2017       tBTA_AV* p_bta_data = reinterpret_cast<tBTA_AV*>(p_data);
2018       int av_state;
2019       tBTA_AV_STATUS status = p_bta_data->open.status;
2020 
2021       log::info("Peer {} : event={} flags={} status={}({}) edr=0x{:x}", peer_.PeerAddress(),
2022                 BtifAvEvent::EventName(event), peer_.FlagsToString(), status,
2023                 (status == BTA_AV_SUCCESS) ? "SUCCESS" : "FAILED", p_bta_data->open.edr);
2024 
2025       if (p_bta_data->open.status == BTA_AV_SUCCESS) {
2026         av_state = BtifAvStateMachine::kStateOpened;
2027         peer_.SetEdr(p_bta_data->open.edr);
2028         if (btif_av_src_sink_coexist_enabled()) {
2029           log::verbose("Peer {} sep={}, open_sep={}", peer_.PeerAddress(), peer_.PeerSep(),
2030                        p_bta_data->open.sep);
2031           /* if peer is wrong sep type, move it to BtifAvSxxx */
2032           if (peer_.PeerSep() != p_bta_data->open.sep) {
2033             BtifAvPeer* tmp_peer = nullptr;
2034             if (peer_.PeerSep() == AVDT_TSEP_SNK) {
2035               tmp_peer = btif_av_source.popPeer(peer_.PeerAddress());
2036 
2037               if (peer_.PeerAddress() != tmp_peer->PeerAddress()) {
2038                 log::error("error, not same peer");
2039               }
2040 
2041               btif_av_sink.AddPeer(tmp_peer);
2042             } else {
2043               tmp_peer = btif_av_sink.popPeer(peer_.PeerAddress());
2044 
2045               if (peer_.PeerAddress() != tmp_peer->PeerAddress()) {
2046                 log::error("error, not same peer");
2047               }
2048 
2049               btif_av_source.AddPeer(tmp_peer);
2050             }
2051             peer_.SetSep(p_bta_data->open.sep);
2052           }
2053           if (btif_rc_is_connected_peer(peer_.PeerAddress())) {
2054             log::verbose("AVRCP connected, update avrc sep");
2055             BTA_AvSetPeerSep(peer_.PeerAddress(), peer_.PeerSep());
2056           }
2057           btif_rc_check_pending_cmd(p_bta_data->open.bd_addr);
2058         }
2059         log::assert_that(peer_.PeerSep() == p_bta_data->open.sep,
2060                          "assert failed: peer_.PeerSep() == p_bta_data->open.sep");
2061         /** normally it can be checked in IDLE PENDING/CONNECT_REQ, in case:
2062          * 1 speacker connected to DUT and phone connect DUT, because
2063          * default
2064          * connect req is as SINK peer. only at here, we can know which
2065          * role
2066          *  it is.@{ */
2067         if (btif_av_src_sink_coexist_enabled()) {
2068           bool can_connect = true;
2069           if (peer_.IsSink()) {
2070             can_connect = btif_av_source.AllowedToConnect(peer_.PeerAddress());
2071             if (!can_connect) {
2072               btif_av_source_disconnect(peer_.PeerAddress());
2073             }
2074           } else if (peer_.IsSource()) {
2075             can_connect = btif_av_sink.AllowedToConnect(peer_.PeerAddress());
2076             if (!can_connect) {
2077               btif_av_sink_disconnect(peer_.PeerAddress());
2078             }
2079           }
2080         }
2081         /** @} */
2082 
2083         // Report the connection state to the application
2084         btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_CONNECTED,
2085                                      bt_status_t::BT_STATUS_SUCCESS, BTA_AV_SUCCESS,
2086                                      peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2087         log_counter_metrics_btif(
2088                 android::bluetooth::CodePathCounterKeyEnum::A2DP_CONNECTION_SUCCESS, 1);
2089       } else {
2090         if (btif_rc_is_connected_peer(peer_.PeerAddress())) {
2091           // Disconnect the AVRCP connection, in case the A2DP connectiton
2092           // failed for any reason.
2093           log::warn("Peer {} : Disconnecting AVRCP", peer_.PeerAddress());
2094           uint8_t peer_handle = btif_rc_get_connected_peer_handle(peer_.PeerAddress());
2095           if (peer_handle != BTRC_HANDLE_NONE) {
2096             BTA_AvCloseRc(peer_handle);
2097           }
2098           DEVICE_IOT_CONFIG_ADDR_INT_ADD_ONE(peer_.PeerAddress(),
2099                                              IOT_CONF_KEY_A2DP_CONN_FAIL_COUNT);
2100         }
2101         av_state = BtifAvStateMachine::kStateIdle;
2102         // Report the connection state to the application
2103         btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_DISCONNECTED,
2104                                      bt_status_t::BT_STATUS_FAIL, status,
2105                                      peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2106         log_counter_metrics_btif(
2107                 android::bluetooth::CodePathCounterKeyEnum::A2DP_CONNECTION_FAILURE, 1);
2108       }
2109 
2110       // Change state to Open/Idle based on the status
2111       peer_.StateMachine().TransitionTo(av_state);
2112       if (peer_.IsSink()) {
2113         // If queued PLAY command, send it now
2114         btif_rc_check_handle_pending_play(p_bta_data->open.bd_addr,
2115                                           (p_bta_data->open.status == BTA_AV_SUCCESS));
2116       } else if (peer_.IsSource() && (p_bta_data->open.status == BTA_AV_SUCCESS)) {
2117         // Bring up AVRCP connection as well
2118         if (btif_av_src_sink_coexist_enabled() &&
2119             btif_av_sink.AllowedToConnect(peer_.PeerAddress())) {
2120           BTA_AvOpenRc(peer_.BtaHandle());
2121         }
2122       }
2123       if (peer_.SelfInitiatedConnection()) {
2124         btif_queue_advance();
2125       }
2126     } break;
2127 
2128     case BTIF_AV_SINK_CONFIG_REQ_EVT: {
2129       const btif_av_sink_config_req_t* p_config_req =
2130               static_cast<const btif_av_sink_config_req_t*>(p_data);
2131       /* before this point, we don't know it's role, actually peer is source */
2132       if (btif_av_both_enable()) {
2133         btif_av_report_sink_audio_config_state(
2134                 p_config_req->peer_address, p_config_req->sample_rate, p_config_req->channel_count);
2135         break;
2136       }
2137       if (peer_.IsSource()) {
2138         btif_av_report_sink_audio_config_state(
2139                 p_config_req->peer_address, p_config_req->sample_rate, p_config_req->channel_count);
2140       }
2141     } break;
2142 
2143     case BTIF_AV_CONNECT_REQ_EVT: {
2144       // The device has moved already to Opening, hence don't report the
2145       // connection state.
2146       log::warn(
2147               "Peer {} : event={} : device is already connecting, ignore Connect "
2148               "request",
2149               peer_.PeerAddress(), BtifAvEvent::EventName(event));
2150       log_counter_metrics_btif(android::bluetooth::CodePathCounterKeyEnum::A2DP_ALREADY_CONNECTING,
2151                                1);
2152       btif_queue_advance();
2153     } break;
2154 
2155     case BTA_AV_PENDING_EVT: {
2156       // The device has moved already to Opening, hence don't report the
2157       // connection state.
2158       log::warn(
2159               "Peer {} : event={} : device is already connecting, ignore incoming "
2160               "request",
2161               peer_.PeerAddress(), BtifAvEvent::EventName(event));
2162       log_counter_metrics_btif(android::bluetooth::CodePathCounterKeyEnum::A2DP_ALREADY_CONNECTING,
2163                                1);
2164     } break;
2165 
2166     case BTIF_AV_OFFLOAD_START_REQ_EVT:
2167       log::error("Peer {} : event={}: stream is not Opened", peer_.PeerAddress(),
2168                  BtifAvEvent::EventName(event));
2169       btif_a2dp_on_offload_started(peer_.PeerAddress(), BTA_AV_FAIL);
2170       log_counter_metrics_btif(
2171               android::bluetooth::CodePathCounterKeyEnum::A2DP_OFFLOAD_START_REQ_FAILURE, 1);
2172       break;
2173 
2174     case BTA_AV_CLOSE_EVT:
2175       btif_a2dp_on_stopped(nullptr, peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2176       btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_DISCONNECTED,
2177                                    bt_status_t::BT_STATUS_FAIL, BTA_AV_FAIL,
2178                                    peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2179       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle);
2180       log_counter_metrics_btif(android::bluetooth::CodePathCounterKeyEnum::A2DP_CONNECTION_CLOSE,
2181                                1);
2182       DEVICE_IOT_CONFIG_ADDR_INT_ADD_ONE(peer_.PeerAddress(), IOT_CONF_KEY_A2DP_CONN_FAIL_COUNT);
2183       if (peer_.SelfInitiatedConnection()) {
2184         btif_queue_advance();
2185       }
2186       break;
2187 
2188     case BTIF_AV_DISCONNECT_REQ_EVT:
2189       BTA_AvClose(peer_.BtaHandle());
2190       btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_DISCONNECTED,
2191                                    bt_status_t::BT_STATUS_FAIL, BTA_AV_FAIL,
2192                                    peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2193       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle);
2194       DEVICE_IOT_CONFIG_ADDR_INT_ADD_ONE(peer_.PeerAddress(), IOT_CONF_KEY_A2DP_CONN_FAIL_COUNT);
2195       log_counter_metrics_btif(
2196               android::bluetooth::CodePathCounterKeyEnum::A2DP_CONNECTION_DISCONNECTED, 1);
2197       if (peer_.SelfInitiatedConnection()) {
2198         btif_queue_advance();
2199       }
2200       break;
2201 
2202     case BTIF_AV_RECONFIGURE_REQ_EVT: {
2203       // Unlock JNI thread only
2204       auto req_data = peer_.GetReconfigureStreamData();
2205       if (req_data) {
2206         req_data.value().reconf_ready_promise.set_value();
2207       }
2208       break;
2209     }
2210 
2211       CHECK_RC_EVENT(event, reinterpret_cast<tBTA_AV*>(p_data));
2212 
2213     default:
2214       log_counter_metrics_btif(
2215               android::bluetooth::CodePathCounterKeyEnum::A2DP_CONNECTION_UNKNOWN_EVENT, 1);
2216       log::warn("Peer {} : Unhandled event={}", peer_.PeerAddress(), BtifAvEvent::EventName(event));
2217       return false;
2218   }
2219   return true;
2220 }
2221 
OnEnter()2222 void BtifAvStateMachine::StateOpened::OnEnter() {
2223   log::info("state=Opened peer={}", peer_.PeerAddress());
2224 
2225   peer_.ClearFlags(BtifAvPeer::kFlagLocalSuspendPending | BtifAvPeer::kFlagPendingStart |
2226                    BtifAvPeer::kFlagPendingStop);
2227 
2228   // Set the active peer if the first connected device.
2229   // NOTE: This should be done only if we are A2DP Sink, because the A2DP Sink
2230   // implementation in Java doesn't support active devices (yet).
2231   // For A2DP Source, the setting of the Active device is done by the
2232   // ActiveDeviceManager in Java.
2233   if (peer_.IsSource() && btif_av_sink.ActivePeer().IsEmpty()) {
2234     std::promise<void> peer_ready_promise;
2235     if (!btif_av_sink.SetActivePeer(peer_.PeerAddress(), std::move(peer_ready_promise))) {
2236       log::error("Error setting {} as active Source peer", peer_.PeerAddress());
2237     }
2238   }
2239 }
2240 
OnExit()2241 void BtifAvStateMachine::StateOpened::OnExit() {
2242   log::info("state=Opened peer={}", peer_.PeerAddress());
2243 
2244   peer_.ClearFlags(BtifAvPeer::kFlagPendingStart);
2245 }
2246 
ProcessEvent(uint32_t event,void * p_data)2247 bool BtifAvStateMachine::StateOpened::ProcessEvent(uint32_t event, void* p_data) {
2248   tBTA_AV* p_av = reinterpret_cast<tBTA_AV*>(p_data);
2249 
2250   log::info("state=Opened peer={} event={} flags={} active_peer={}", peer_.PeerAddress(),
2251             BtifAvEvent::EventName(event), peer_.FlagsToString(), peer_.IsActivePeer());
2252 
2253   if ((event == BTA_AV_REMOTE_CMD_EVT) && peer_.CheckFlags(BtifAvPeer::kFlagRemoteSuspend) &&
2254       (p_av->remote_cmd.rc_id == AVRC_ID_PLAY)) {
2255     log::verbose("Peer {} : Resetting remote suspend flag on RC PLAY", peer_.PeerAddress());
2256     peer_.ClearFlags(BtifAvPeer::kFlagRemoteSuspend);
2257   }
2258 
2259   switch (event) {
2260     case BTIF_AV_STOP_STREAM_REQ_EVT:
2261     case BTIF_AV_SUSPEND_STREAM_REQ_EVT:
2262     case BTIF_AV_ACL_DISCONNECTED:
2263       break;  // Ignore
2264 
2265     // Event sent by the Bluetooth Audio HAL to a source A2DP stack
2266     // when a stream is ready to play. The stack shall send AVDTP Start to the
2267     // remote device to start the stream.
2268     case BTIF_AV_START_STREAM_REQ_EVT: {
2269       log::info("Peer {} : event={} flags={}", peer_.PeerAddress(), BtifAvEvent::EventName(event),
2270                 peer_.FlagsToString());
2271       if (p_data) {
2272         const btif_av_start_stream_req_t* p_start_steam_req =
2273                 static_cast<const btif_av_start_stream_req_t*>(p_data);
2274         log::info("Stream use_latency_mode={}", p_start_steam_req->use_latency_mode);
2275         peer_.SetUseLatencyMode(p_start_steam_req->use_latency_mode);
2276       }
2277 
2278       BTA_AvStart(peer_.BtaHandle(), peer_.UseLatencyMode());
2279       peer_.SetFlags(BtifAvPeer::kFlagPendingStart);
2280     } break;
2281 
2282     // Event sent by lower layer to indicate that the AVDTP stream is started.
2283     // May be initiated by the remote device to start a stream, in this case the
2284     // event is ignored by source A2DP, and the stack shall immediately suspend
2285     // the stream.
2286     case BTA_AV_START_EVT: {
2287       log::info("Peer {} : event={} status={} suspending={} initiator={} flags={}",
2288                 peer_.PeerAddress(), BtifAvEvent::EventName(event), p_av->start.status,
2289                 p_av->start.suspending, p_av->start.initiator, peer_.FlagsToString());
2290 
2291       if ((p_av->start.status == BTA_SUCCESS) && p_av->start.suspending) {
2292         return true;
2293       }
2294 
2295       // If remote tries to start A2DP when DUT is A2DP Source, then Suspend.
2296       // If A2DP is Sink and call is active, then disconnect the AVDTP
2297       // channel.
2298       bool should_suspend = false;
2299       if (peer_.IsSink()) {
2300         if (!peer_.CheckFlags(BtifAvPeer::kFlagPendingStart | BtifAvPeer::kFlagRemoteSuspend)) {
2301           log::warn("Peer {} : trigger Suspend as remote initiated", peer_.PeerAddress());
2302           should_suspend = true;
2303         } else if (!peer_.IsActivePeer()) {
2304           log::warn("Peer {} : trigger Suspend as non-active", peer_.PeerAddress());
2305           should_suspend = true;
2306         }
2307 
2308         // Invoke the started handler only when initiator.
2309         if (!com::android::bluetooth::flags::a2dp_ignore_started_when_responder() ||
2310             peer_.CheckFlags(BtifAvPeer::kFlagPendingStart)) {
2311           if (btif_a2dp_on_started(peer_.PeerAddress(), &p_av->start, A2dpType::kSource)) {
2312             // Only clear pending flag after acknowledgement
2313             peer_.ClearFlags(BtifAvPeer::kFlagPendingStart);
2314           }
2315         }
2316       }
2317 
2318       // Remain in Open state if status failed
2319       if (p_av->start.status != BTA_AV_SUCCESS) {
2320         return false;
2321       }
2322 
2323       if (peer_.IsSource() && peer_.IsActivePeer()) {
2324         // Remove flush state, ready for streaming
2325         btif_a2dp_sink_set_rx_flush(false);
2326         btif_a2dp_sink_on_start();
2327       }
2328 
2329       if (should_suspend) {
2330         btif_av_source_dispatch_sm_event(peer_.PeerAddress(), BTIF_AV_SUSPEND_STREAM_REQ_EVT);
2331       }
2332 
2333       if (com::android::bluetooth::flags::av_stream_reconfigure_fix() &&
2334           peer_.CheckFlags(BtifAvPeer::kFlagPendingReconfigure)) {
2335         log::info(
2336                 "Peer {} : Stream started but reconfiguration pending. "
2337                 "Reconfiguring stream",
2338                 peer_.PeerAddress());
2339         btif_av_source_dispatch_sm_event(peer_.PeerAddress(), BTIF_AV_RECONFIGURE_REQ_EVT);
2340       }
2341 
2342       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateStarted);
2343       break;
2344     }
2345 
2346     case BTIF_AV_DISCONNECT_REQ_EVT:
2347       BTA_AvClose(peer_.BtaHandle());
2348       if (peer_.IsSource()) {
2349         BTA_AvCloseRc(peer_.BtaHandle());
2350       }
2351 
2352       // Inform the application that we are disconnecting
2353       btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_DISCONNECTING,
2354                                    bt_status_t::BT_STATUS_SUCCESS, BTA_AV_SUCCESS,
2355                                    peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2356 
2357       // Wait in closing state until fully closed
2358       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateClosing);
2359       break;
2360 
2361     case BTA_AV_CLOSE_EVT:
2362       // AVDTP link is closed
2363       // Inform the application that we are disconnecting
2364       btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_DISCONNECTING,
2365                                    bt_status_t::BT_STATUS_SUCCESS, BTA_AV_SUCCESS,
2366                                    peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2367       // Change state to Idle, send acknowledgement if start is pending
2368       if (peer_.CheckFlags(BtifAvPeer::kFlagPendingStart)) {
2369         log::warn("Peer {} : failed pending start request", peer_.PeerAddress());
2370         tBTA_AV_START av_start = {.chnl = p_av->close.chnl,
2371                                   .hndl = p_av->close.hndl,
2372                                   .status = BTA_AV_FAIL_STREAM,
2373                                   .initiator = true,
2374                                   .suspending = true};
2375         btif_a2dp_on_started(peer_.PeerAddress(), &av_start,
2376                              peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2377         // Pending start flag will be cleared when exit current state
2378       } else if (peer_.IsActivePeer()) {
2379         btif_a2dp_on_stopped(nullptr, peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2380       }
2381 
2382       // Inform the application that we are disconnected
2383       btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_DISCONNECTED,
2384                                    bt_status_t::BT_STATUS_SUCCESS, BTA_AV_SUCCESS,
2385                                    peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2386       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle);
2387       break;
2388 
2389     case BTA_AV_RECONFIG_EVT:
2390       if (p_av->reconfig.status != BTA_AV_SUCCESS) {
2391         log::warn("Peer {} : failed reconfiguration", peer_.PeerAddress());
2392         if (peer_.CheckFlags(BtifAvPeer::kFlagPendingStart)) {
2393           log::error("Peer {} : cannot proceed to do AvStart", peer_.PeerAddress());
2394           peer_.ClearFlags(BtifAvPeer::kFlagPendingStart);
2395           bluetooth::audio::a2dp::ack_stream_started(bluetooth::audio::a2dp::Status::FAILURE);
2396         }
2397         if (peer_.IsSink()) {
2398           btif_av_source_disconnect(peer_.PeerAddress());
2399         } else if (peer_.IsSource()) {
2400           btif_av_sink_disconnect(peer_.PeerAddress());
2401         }
2402         break;
2403       }
2404 
2405       if (peer_.IsActivePeer()) {
2406         log::info("Peer {} : Reconfig done - calling startSession() to audio HAL",
2407                   peer_.PeerAddress());
2408         std::promise<void> peer_ready_promise;
2409         std::future<void> peer_ready_future = peer_ready_promise.get_future();
2410 
2411         if (com::android::bluetooth::flags::a2dp_clear_pending_start_on_session_restart()) {
2412           // The stream may not be restarted without an explicit request from the
2413           // Bluetooth Audio HAL. Any start request that was pending before the
2414           // reconfiguration is invalidated when the session is ended.
2415           peer_.ClearFlags(BtifAvPeer::kFlagPendingStart);
2416         }
2417 
2418         btif_a2dp_source_start_session(peer_.PeerAddress(), std::move(peer_ready_promise));
2419       }
2420       if (peer_.CheckFlags(BtifAvPeer::kFlagPendingStart)) {
2421         log::info("Peer {} : Reconfig done - calling BTA_AvStart(0x{:x})", peer_.PeerAddress(),
2422                   peer_.BtaHandle());
2423         BTA_AvStart(peer_.BtaHandle(), peer_.UseLatencyMode());
2424       }
2425       break;
2426 
2427     case BTIF_AV_CONNECT_REQ_EVT: {
2428       log::warn("Peer {} : Ignore {} for same device", peer_.PeerAddress(),
2429                 BtifAvEvent::EventName(event));
2430       btif_queue_advance();
2431     } break;
2432 
2433     case BTIF_AV_OFFLOAD_START_REQ_EVT:
2434       log::error("Peer {} : event={}: stream is not Started", peer_.PeerAddress(),
2435                  BtifAvEvent::EventName(event));
2436       btif_a2dp_on_offload_started(peer_.PeerAddress(), BTA_AV_FAIL);
2437       break;
2438 
2439     case BTIF_AV_AVRCP_REMOTE_PLAY_EVT:
2440       if (peer_.CheckFlags(BtifAvPeer::kFlagRemoteSuspend)) {
2441         log::verbose("Peer {} : Resetting remote suspend flag on RC PLAY", peer_.PeerAddress());
2442         peer_.ClearFlags(BtifAvPeer::kFlagRemoteSuspend);
2443       }
2444       break;
2445 
2446       CHECK_RC_EVENT(event, reinterpret_cast<tBTA_AV*>(p_data));
2447 
2448     case BTIF_AV_SET_LATENCY_REQ_EVT: {
2449       const btif_av_set_latency_req_t* p_set_latency_req =
2450               static_cast<const btif_av_set_latency_req_t*>(p_data);
2451       log::info("Peer {} : event={} flags={} is_low_latency={}", peer_.PeerAddress(),
2452                 BtifAvEvent::EventName(event), peer_.FlagsToString(),
2453                 p_set_latency_req->is_low_latency);
2454 
2455       BTA_AvSetLatency(peer_.BtaHandle(), p_set_latency_req->is_low_latency);
2456     } break;
2457 
2458     case BTIF_AV_RECONFIGURE_REQ_EVT: {
2459       log::info("Peer {} : event={} flags={}", peer_.PeerAddress(), BtifAvEvent::EventName(event),
2460                 peer_.FlagsToString());
2461       if (!peer_.IsSink()) {
2462         log::verbose("Peer {} is not sink", peer_.PeerAddress());
2463         break;
2464       }
2465 
2466       if (peer_.CheckFlags(BtifAvPeer::kFlagPendingStart)) {
2467         // The start stream request was sent but we wait for response.
2468         // Enable the reconfigure pending flag to schedule reconfiguration
2469         // after start stream response.
2470         peer_.SetFlags(BtifAvPeer::kFlagPendingReconfigure);
2471       } else {
2472         // Reconfigure
2473         peer_.ClearFlags(BtifAvPeer::kFlagPendingReconfigure);
2474         if (btif_av_source.Enabled()) {
2475           auto req_data = peer_.GetReconfigureStreamData();
2476           if (req_data) {
2477             btif_av_source.UpdateCodecConfig(peer_.PeerAddress(),
2478                                              req_data.value().codec_preferences,
2479                                              std::move(req_data.value().reconf_ready_promise));
2480           }
2481         }
2482       }
2483     } break;
2484 
2485     default:
2486       log::warn("Peer {} : Unhandled event={}", peer_.PeerAddress(), BtifAvEvent::EventName(event));
2487       return false;
2488   }
2489   return true;
2490 }
2491 
OnEnter()2492 void BtifAvStateMachine::StateStarted::OnEnter() {
2493   log::info("state=Started peer={}", peer_.PeerAddress());
2494 
2495   // We are again in started state, clear any remote suspend flags
2496   peer_.ClearFlags(BtifAvPeer::kFlagRemoteSuspend);
2497 
2498   btif_a2dp_sink_set_rx_flush(false);
2499 
2500   // Report that we have entered the Streaming stage. Usually, this should
2501   // be followed by focus grant. See set_audio_focus_state()
2502   btif_report_audio_state(peer_.PeerAddress(), BTAV_AUDIO_STATE_STARTED,
2503                           peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2504 }
2505 
OnExit()2506 void BtifAvStateMachine::StateStarted::OnExit() {
2507   log::info("state=Started peer={}", peer_.PeerAddress());
2508 }
2509 
ProcessEvent(uint32_t event,void * p_data)2510 bool BtifAvStateMachine::StateStarted::ProcessEvent(uint32_t event, void* p_data) {
2511   tBTA_AV* p_av = reinterpret_cast<tBTA_AV*>(p_data);
2512 
2513   log::info("state=Started peer={} event={} flags={} active_peer={}", peer_.PeerAddress(),
2514             BtifAvEvent::EventName(event), peer_.FlagsToString(), peer_.IsActivePeer());
2515 
2516   switch (event) {
2517     case BTIF_AV_ACL_DISCONNECTED:
2518       break;  // Ignore
2519 
2520     case BTIF_AV_START_STREAM_REQ_EVT:
2521       log::info("Peer {} : event={} flags={}", peer_.PeerAddress(), BtifAvEvent::EventName(event),
2522                 peer_.FlagsToString());
2523       // We were started remotely, just ACK back the local request
2524       if (peer_.IsSink()) {
2525         btif_a2dp_on_started(peer_.PeerAddress(), nullptr,
2526                              peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2527       }
2528       break;
2529 
2530     // FIXME -- use suspend = true always to work around issue with BTA AV
2531     case BTIF_AV_STOP_STREAM_REQ_EVT:
2532     case BTIF_AV_SUSPEND_STREAM_REQ_EVT:
2533       log::info("Peer {} : event={} flags={}", peer_.PeerAddress(), BtifAvEvent::EventName(event),
2534                 peer_.FlagsToString());
2535 
2536       // There is a pending LocalSuspend already, ignore.
2537       if (peer_.CheckFlags(BtifAvPeer::kFlagLocalSuspendPending)) {
2538         break;
2539       }
2540 
2541       // Set pending flag to ensure the BTIF task is not trying to restart
2542       // the stream while suspend is in progress.
2543       peer_.SetFlags(BtifAvPeer::kFlagLocalSuspendPending);
2544 
2545       // If we were remotely suspended but suspend locally, local suspend
2546       // always overrides.
2547       peer_.ClearFlags(BtifAvPeer::kFlagRemoteSuspend);
2548 
2549       if (peer_.IsSink() &&
2550           (peer_.IsActivePeer() || !btif_av_stream_started_ready(A2dpType::kSource))) {
2551         // Immediately stop transmission of frames while suspend is pending
2552         if (event == BTIF_AV_STOP_STREAM_REQ_EVT) {
2553           btif_a2dp_on_stopped(nullptr, peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2554         } else {
2555           // ensure tx frames are immediately suspended
2556           btif_a2dp_source_set_tx_flush(true);
2557         }
2558       } else if (peer_.IsSource()) {
2559         btif_a2dp_on_stopped(nullptr, peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2560       }
2561       BTA_AvStop(peer_.BtaHandle(), true);
2562       break;
2563 
2564     case BTIF_AV_DISCONNECT_REQ_EVT:
2565       log::info("Peer {} : event={} flags={}", peer_.PeerAddress(), BtifAvEvent::EventName(event),
2566                 peer_.FlagsToString());
2567 
2568       // Request AVDTP to close
2569       BTA_AvClose(peer_.BtaHandle());
2570       if (peer_.IsSource()) {
2571         BTA_AvCloseRc(peer_.BtaHandle());
2572       }
2573 
2574       // Inform the application that we are disconnecting
2575       btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_DISCONNECTING,
2576                                    bt_status_t::BT_STATUS_SUCCESS, BTA_AV_SUCCESS,
2577                                    peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2578 
2579       // Wait in closing state until fully closed
2580       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateClosing);
2581       break;
2582 
2583     case BTA_AV_SUSPEND_EVT: {
2584       log::info("Peer {} : event={} status={} initiator={} flags={}", peer_.PeerAddress(),
2585                 BtifAvEvent::EventName(event), p_av->suspend.status, p_av->suspend.initiator,
2586                 peer_.FlagsToString());
2587 
2588       // A2DP suspended, stop A2DP encoder / decoder until resumed
2589       if (peer_.IsActivePeer() ||
2590           !btif_av_stream_started_ready(peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource)) {
2591         btif_a2dp_on_suspended(&p_av->suspend,
2592                                peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2593       }
2594 
2595       // If not successful, remain in current state
2596       if (p_av->suspend.status != BTA_AV_SUCCESS) {
2597         peer_.ClearFlags(BtifAvPeer::kFlagLocalSuspendPending);
2598 
2599         if (peer_.IsSink() && peer_.IsActivePeer()) {
2600           // Suspend failed, reset back tx flush state
2601           btif_a2dp_source_set_tx_flush(false);
2602         }
2603         return false;
2604       }
2605 
2606       btav_audio_state_t state = BTAV_AUDIO_STATE_REMOTE_SUSPEND;
2607       if (p_av->suspend.initiator != true) {
2608         // Remote suspend, notify HAL and await audioflinger to
2609         // suspend/stop stream.
2610         //
2611         // Set remote suspend flag to block media task from restarting
2612         // stream only if we did not already initiate a local suspend.
2613         if (!peer_.CheckFlags(BtifAvPeer::kFlagLocalSuspendPending)) {
2614           peer_.SetFlags(BtifAvPeer::kFlagRemoteSuspend);
2615         }
2616       } else {
2617         state = BTAV_AUDIO_STATE_STOPPED;
2618       }
2619 
2620       btif_report_audio_state(peer_.PeerAddress(), state,
2621                               peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2622       // Suspend completed, clear local pending flags while entering Opened
2623       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateOpened);
2624     } break;
2625 
2626     case BTA_AV_STOP_EVT:
2627       log::info("Peer {} : event={} flags={}", peer_.PeerAddress(), BtifAvEvent::EventName(event),
2628                 peer_.FlagsToString());
2629 
2630       peer_.SetFlags(BtifAvPeer::kFlagPendingStop);
2631       peer_.ClearFlags(BtifAvPeer::kFlagLocalSuspendPending);
2632 
2633       // Don't change the encoder and audio provider state by a non-active
2634       // peer since they are shared between peers
2635       if (peer_.IsActivePeer() ||
2636           !btif_av_stream_started_ready(peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource)) {
2637         btif_a2dp_on_stopped(&p_av->suspend,
2638                              peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2639       }
2640 
2641       btif_report_audio_state(peer_.PeerAddress(), BTAV_AUDIO_STATE_STOPPED,
2642                               peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2643 
2644       // If stop was successful, change state to Open
2645       if (p_av->suspend.status == BTA_AV_SUCCESS) {
2646         peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateOpened);
2647       }
2648 
2649       break;
2650 
2651     case BTA_AV_CLOSE_EVT:
2652       log::info("Peer {} : event={} flags={}", peer_.PeerAddress(), BtifAvEvent::EventName(event),
2653                 peer_.FlagsToString());
2654       // Inform the application that we are disconnecting
2655       btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_DISCONNECTING,
2656                                    bt_status_t::BT_STATUS_SUCCESS, BTA_AV_SUCCESS,
2657                                    peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2658 
2659       peer_.SetFlags(BtifAvPeer::kFlagPendingStop);
2660 
2661       // AVDTP link is closed
2662       if (peer_.IsActivePeer()) {
2663         btif_a2dp_on_stopped(nullptr, peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2664       }
2665 
2666       // Inform the application that we are disconnected
2667       btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_DISCONNECTED,
2668                                    bt_status_t::BT_STATUS_SUCCESS, BTA_AV_SUCCESS,
2669                                    peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2670 
2671       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle);
2672       break;
2673 
2674     case BTIF_AV_OFFLOAD_START_REQ_EVT:
2675       if (peer_.CheckFlags(BtifAvPeer::kFlagLocalSuspendPending | BtifAvPeer::kFlagRemoteSuspend |
2676                            BtifAvPeer::kFlagPendingStop)) {
2677         log::warn("Peer {} : event={} flags={}: stream is Suspending", peer_.PeerAddress(),
2678                   BtifAvEvent::EventName(event), peer_.FlagsToString());
2679         btif_a2dp_on_offload_started(peer_.PeerAddress(), BTA_AV_FAIL);
2680         break;
2681       }
2682       BTA_AvOffloadStart(peer_.BtaHandle());
2683       break;
2684 
2685     case BTA_AV_OFFLOAD_START_RSP_EVT:
2686       btif_a2dp_on_offload_started(peer_.PeerAddress(), p_av->status);
2687       break;
2688 
2689     case BTIF_AV_SET_LATENCY_REQ_EVT: {
2690       const btif_av_set_latency_req_t* p_set_latency_req =
2691               static_cast<const btif_av_set_latency_req_t*>(p_data);
2692       log::info("Peer {} : event={} flags={} is_low_latency={}", peer_.PeerAddress(),
2693                 BtifAvEvent::EventName(event), peer_.FlagsToString(),
2694                 p_set_latency_req->is_low_latency);
2695 
2696       BTA_AvSetLatency(peer_.BtaHandle(), p_set_latency_req->is_low_latency);
2697     } break;
2698 
2699       CHECK_RC_EVENT(event, reinterpret_cast<tBTA_AV*>(p_data));
2700 
2701     case BTIF_AV_RECONFIGURE_REQ_EVT: {
2702       log::info("Peer {} : event={} flags={}", peer_.PeerAddress(), BtifAvEvent::EventName(event),
2703                 peer_.FlagsToString());
2704       peer_.ClearFlags(BtifAvPeer::kFlagPendingReconfigure);
2705       if (btif_av_source.Enabled()) {
2706         auto req_data = peer_.GetReconfigureStreamData();
2707         if (req_data) {
2708           btif_av_source.UpdateCodecConfig(peer_.PeerAddress(), req_data.value().codec_preferences,
2709                                            std::move(req_data.value().reconf_ready_promise));
2710         }
2711       }
2712     } break;
2713 
2714     default:
2715       log::warn("Peer {} : Unhandled event={}", peer_.PeerAddress(), BtifAvEvent::EventName(event));
2716       return false;
2717   }
2718 
2719   return true;
2720 }
2721 
OnEnter()2722 void BtifAvStateMachine::StateClosing::OnEnter() {
2723   log::info("state=Closing peer={}", peer_.PeerAddress());
2724 
2725   if (peer_.IsActivePeer()) {
2726     if (peer_.IsSink()) {
2727       // Immediately stop transmission of frames
2728       btif_a2dp_source_set_tx_flush(true);
2729       // Wait for Audio Flinger to stop A2DP
2730     } else if (peer_.IsSource()) {
2731       btif_a2dp_sink_set_rx_flush(true);
2732     }
2733   }
2734 }
2735 
OnExit()2736 void BtifAvStateMachine::StateClosing::OnExit() {
2737   log::info("state=Closing peer={}", peer_.PeerAddress());
2738 }
2739 
ProcessEvent(uint32_t event,void * p_data)2740 bool BtifAvStateMachine::StateClosing::ProcessEvent(uint32_t event, void* p_data) {
2741   log::info("state=Closing peer={} event={} flags={} active_peer={}", peer_.PeerAddress(),
2742             BtifAvEvent::EventName(event), peer_.FlagsToString(), peer_.IsActivePeer());
2743 
2744   switch (event) {
2745     case BTIF_AV_SUSPEND_STREAM_REQ_EVT:
2746     case BTIF_AV_ACL_DISCONNECTED:
2747       break;  // Ignore
2748 
2749     case BTA_AV_STOP_EVT:
2750     case BTIF_AV_STOP_STREAM_REQ_EVT:
2751       if (peer_.IsActivePeer()) {
2752         btif_a2dp_on_stopped(nullptr, peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2753       }
2754       break;
2755 
2756     case BTA_AV_CLOSE_EVT:
2757       // Inform the application that we are disconnecting
2758       btif_report_connection_state(peer_.PeerAddress(), BTAV_CONNECTION_STATE_DISCONNECTED,
2759                                    bt_status_t::BT_STATUS_SUCCESS, BTA_AV_SUCCESS,
2760                                    peer_.IsSource() ? A2dpType::kSink : A2dpType::kSource);
2761 
2762       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle);
2763       break;
2764 
2765     // Handle the RC_CLOSE event for the cleanup
2766     case BTA_AV_RC_CLOSE_EVT:
2767       btif_rc_handler(event, reinterpret_cast<tBTA_AV*>(p_data));
2768       break;
2769 
2770     // Handle the RC_BROWSE_CLOSE event for testing
2771     case BTA_AV_RC_BROWSE_CLOSE_EVT:
2772       btif_rc_handler(event, reinterpret_cast<tBTA_AV*>(p_data));
2773       break;
2774 
2775     case BTIF_AV_OFFLOAD_START_REQ_EVT:
2776       log::error("Peer {} : event={}: stream is not Opened", peer_.PeerAddress(),
2777                  BtifAvEvent::EventName(event));
2778       btif_a2dp_on_offload_started(peer_.PeerAddress(), BTA_AV_FAIL);
2779       break;
2780 
2781     case BTIF_AV_CONNECT_REQ_EVT:
2782       log::warn("Peer {} : Ignore {} in StateClosing", peer_.PeerAddress(),
2783                 BtifAvEvent::EventName(event));
2784       btif_queue_advance();
2785       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle);
2786       break;
2787 
2788     case BTIF_AV_RECONFIGURE_REQ_EVT: {
2789       // Unlock JNI thread only
2790       auto req_data = peer_.GetReconfigureStreamData();
2791       if (req_data) {
2792         req_data.value().reconf_ready_promise.set_value();
2793       }
2794       break;
2795     }
2796 
2797     default:
2798       log::warn("Peer {} : Unhandled event={}", peer_.PeerAddress(), BtifAvEvent::EventName(event));
2799       return false;
2800   }
2801   return true;
2802 }
2803 
2804 /**
2805  * Timer to trigger AV Open on the Source if the remote Sink device
2806  * establishes AVRCP connection without AV connection. The timer is needed to
2807  * interoperate with headsets that do establish AV after AVRCP connection.
2808  */
btif_av_source_initiate_av_open_timer_timeout(void * data)2809 static void btif_av_source_initiate_av_open_timer_timeout(void* data) {
2810   BtifAvPeer* peer = reinterpret_cast<BtifAvPeer*>(data);
2811   bool device_connected = false;
2812 
2813   if (com::android::bluetooth::flags::avrcp_connect_a2dp_with_delay() && is_new_avrcp_enabled()) {
2814     // check if device is connected
2815     if (bluetooth::avrcp::AvrcpService::Get() != nullptr) {
2816       device_connected =
2817               bluetooth::avrcp::AvrcpService::Get()->IsDeviceConnected(peer->PeerAddress());
2818     }
2819   } else {
2820     device_connected = btif_rc_is_connected_peer(peer->PeerAddress());
2821   }
2822 
2823   log::verbose("Peer {}", peer->PeerAddress());
2824 
2825   // Check if AVRCP is connected to the peer
2826   if (!device_connected) {
2827     log::error("AVRCP peer {} is not connected", peer->PeerAddress());
2828     return;
2829   }
2830 
2831   // Connect to the AVRCP peer
2832   if (btif_av_source.Enabled() && btif_av_source.FindPeer(peer->PeerAddress()) == peer) {
2833     log::verbose("Connecting to AVRCP peer {}", peer->PeerAddress());
2834     btif_av_source_dispatch_sm_event(peer->PeerAddress(), BTIF_AV_CONNECT_REQ_EVT);
2835   }
2836 }
2837 
2838 /**
2839  * Timer to trigger AV Open on the Sink if the remote Source device
2840  * establishes AVRCP connection without AV connection.
2841  */
btif_av_sink_initiate_av_open_timer_timeout(void * data)2842 static void btif_av_sink_initiate_av_open_timer_timeout(void* data) {
2843   BtifAvPeer* peer = reinterpret_cast<BtifAvPeer*>(data);
2844 
2845   log::verbose("Peer {}", peer->PeerAddress());
2846 
2847   // Check if AVRCP is connected to the peer
2848   if (!btif_rc_is_connected_peer(peer->PeerAddress())) {
2849     log::error("AVRCP peer {} is not connected", peer->PeerAddress());
2850     return;
2851   }
2852 
2853   // Connect to the AVRCP peer
2854   if (btif_av_sink.Enabled() && btif_av_sink.FindPeer(peer->PeerAddress()) == peer) {
2855     log::verbose("Connecting to AVRCP peer {}", peer->PeerAddress());
2856     btif_av_sink_dispatch_sm_event(peer->PeerAddress(), BTIF_AV_CONNECT_REQ_EVT);
2857   }
2858 }
2859 
2860 /**
2861  * Report the A2DP connection state
2862  *
2863  * @param peer_address the peer address
2864  * @param state the connection state
2865  */
btif_report_connection_state(const RawAddress & peer_address,btav_connection_state_t state,bt_status_t status,uint8_t error_code,const A2dpType local_a2dp_type)2866 static void btif_report_connection_state(const RawAddress& peer_address,
2867                                          btav_connection_state_t state, bt_status_t status,
2868                                          uint8_t error_code, const A2dpType local_a2dp_type) {
2869   log::info("peer={} state={}", peer_address, state);
2870   if (btif_av_src_sink_coexist_enabled() && btif_av_both_enable()) {
2871     BtifAvPeer* peer = btif_av_find_peer(peer_address, local_a2dp_type);
2872     if (peer == nullptr) {
2873       log::error("peer is null");
2874       return;
2875     }
2876 
2877     if (peer->IsSink()) {
2878       do_in_jni_thread(base::BindOnce(btif_av_source.Callbacks()->connection_state_cb, peer_address,
2879                                       state, btav_error_t{}));
2880     } else if (peer->IsSource()) {
2881       do_in_jni_thread(base::BindOnce(btif_av_sink.Callbacks()->connection_state_cb, peer_address,
2882                                       state, btav_error_t{}));
2883     }
2884     return;
2885   }
2886 
2887   if (btif_av_source.Enabled()) {
2888     do_in_jni_thread(base::BindOnce(btif_av_source.Callbacks()->connection_state_cb, peer_address,
2889                                     state,
2890                                     btav_error_t{.status = status, .error_code = error_code}));
2891   } else if (btif_av_sink.Enabled()) {
2892     do_in_jni_thread(base::BindOnce(btif_av_sink.Callbacks()->connection_state_cb, peer_address,
2893                                     state,
2894                                     btav_error_t{.status = status, .error_code = error_code}));
2895   }
2896 }
2897 
2898 /**
2899  * Report the audio state of the A2DP connection.
2900  * The state is updated when either the remote ends starts streaming
2901  * (Started state) or whenever it transitions out of Started state
2902  * (to Opened or Streaming state).
2903  *
2904  * @param peer_address the peer address
2905  * @param state the audio state
2906  */
btif_report_audio_state(const RawAddress & peer_address,btav_audio_state_t state,const A2dpType local_a2dp_type)2907 static void btif_report_audio_state(const RawAddress& peer_address, btav_audio_state_t state,
2908                                     const A2dpType local_a2dp_type) {
2909   log::info("peer={} state={}", peer_address, state);
2910 
2911   if (btif_av_both_enable()) {
2912     BtifAvPeer* peer = btif_av_find_peer(peer_address, local_a2dp_type);
2913     if (peer->IsSink()) {
2914       do_in_jni_thread(
2915               base::BindOnce(btif_av_source.Callbacks()->audio_state_cb, peer_address, state));
2916     } else if (peer->IsSource()) {
2917       do_in_jni_thread(
2918               base::BindOnce(btif_av_sink.Callbacks()->audio_state_cb, peer_address, state));
2919     }
2920     return;
2921   }
2922   if (btif_av_source.Enabled()) {
2923     do_in_jni_thread(
2924             base::BindOnce(btif_av_source.Callbacks()->audio_state_cb, peer_address, state));
2925   } else if (btif_av_sink.Enabled()) {
2926     do_in_jni_thread(base::BindOnce(btif_av_sink.Callbacks()->audio_state_cb, peer_address, state));
2927   }
2928 
2929   using android::bluetooth::a2dp::AudioCodingModeEnum;
2930   using android::bluetooth::a2dp::PlaybackStateEnum;
2931   PlaybackStateEnum playback_state = PlaybackStateEnum::PLAYBACK_STATE_UNKNOWN;
2932   switch (state) {
2933     case BTAV_AUDIO_STATE_STARTED:
2934       playback_state = PlaybackStateEnum::PLAYBACK_STATE_PLAYING;
2935       break;
2936     case BTAV_AUDIO_STATE_STOPPED:
2937       playback_state = PlaybackStateEnum::PLAYBACK_STATE_NOT_PLAYING;
2938       break;
2939     default:
2940       break;
2941   }
2942   AudioCodingModeEnum audio_coding_mode = btif_av_is_a2dp_offload_running()
2943                                                   ? AudioCodingModeEnum::AUDIO_CODING_MODE_HARDWARE
2944                                                   : AudioCodingModeEnum::AUDIO_CODING_MODE_SOFTWARE;
2945 
2946   log_a2dp_playback_event(peer_address, playback_state, audio_coding_mode);
2947 }
2948 
btif_av_report_source_codec_state(const RawAddress & peer_address,const btav_a2dp_codec_config_t & codec_config,const std::vector<btav_a2dp_codec_config_t> & codecs_local_capabilities,const std::vector<btav_a2dp_codec_config_t> & codecs_selectable_capabilities)2949 void btif_av_report_source_codec_state(
2950         const RawAddress& peer_address, const btav_a2dp_codec_config_t& codec_config,
2951         const std::vector<btav_a2dp_codec_config_t>& codecs_local_capabilities,
2952         const std::vector<btav_a2dp_codec_config_t>& codecs_selectable_capabilities) {
2953   log::verbose("peer={}", peer_address);
2954   if (btif_av_source.Enabled()) {
2955     do_in_jni_thread(base::BindOnce(btif_av_source.Callbacks()->audio_config_cb, peer_address,
2956                                     codec_config, codecs_local_capabilities,
2957                                     codecs_selectable_capabilities));
2958   }
2959 }
2960 
2961 /**
2962  * Report the audio config state of the A2DP Sink connection.
2963  *
2964  * @param peer_address the peer address
2965  * @param sample_rate the sample rate (in samples per second)
2966  * @param channel_count the channel count (1 for Mono, 2 for Stereo)
2967  */
btif_av_report_sink_audio_config_state(const RawAddress & peer_address,int sample_rate,int channel_count)2968 static void btif_av_report_sink_audio_config_state(const RawAddress& peer_address, int sample_rate,
2969                                                    int channel_count) {
2970   log::info("peer={} sample_rate={} channel_count={}", peer_address, sample_rate, channel_count);
2971   if (btif_av_sink.Enabled()) {
2972     do_in_jni_thread(base::BindOnce(btif_av_sink.Callbacks()->audio_config_cb, peer_address,
2973                                     sample_rate, channel_count));
2974   }
2975 }
2976 
2977 /**
2978  * Call out to JNI / JAVA layers to retrieve whether the mandatory codec is
2979  * more preferred than others.
2980  *
2981  * @param peer_address the peer address
2982  */
btif_av_query_mandatory_codec_priority(const RawAddress & peer_address)2983 static void btif_av_query_mandatory_codec_priority(const RawAddress& peer_address) {
2984   auto query_priority = [](const RawAddress& peer_address) {
2985     if (!btif_av_source.Enabled()) {
2986       log::warn("BTIF AV Source is not enabled");
2987       return;
2988     }
2989     btav_source_callbacks_t* callbacks = btif_av_source.Callbacks();
2990     bool preferred = callbacks != nullptr && callbacks->mandatory_codec_preferred_cb(peer_address);
2991     if (preferred) {
2992       auto apply_priority = [](const RawAddress& peer_address, bool preferred) {
2993         BtifAvPeer* peer = btif_av_find_peer(peer_address, A2dpType::kSource);
2994         if (peer == nullptr) {
2995           log::warn("btif_av_query_mandatory_codec_priority: peer is null");
2996           return;
2997         }
2998         peer->SetMandatoryCodecPreferred(preferred);
2999       };
3000       do_in_main_thread(base::BindOnce(apply_priority, peer_address, preferred));
3001     }
3002   };
3003   if (btif_av_source.Enabled()) {
3004     do_in_jni_thread(base::BindOnce(query_priority, peer_address));
3005   }
3006 }
3007 
btif_av_handle_both_peer(uint8_t peer_sep,const RawAddress & peer_address,tBTA_AV_HNDL bta_handle)3008 static BtifAvPeer* btif_av_handle_both_peer(uint8_t peer_sep, const RawAddress& peer_address,
3009                                             tBTA_AV_HNDL bta_handle) {
3010   BtifAvPeer* peer = nullptr;
3011 
3012   if (peer_address != RawAddress::kEmpty) {
3013     if (btif_av_both_enable()) {
3014       peer = btif_av_find_peer(peer_address, A2dpType::kUnknown);
3015       /* if no this peer, default it's sink device */
3016       if (peer == nullptr) {
3017         if (peer_sep == AVDT_TSEP_SRC) {
3018           log::verbose("peer_sep({}), create a new source peer", peer_sep);
3019           peer = btif_av_sink.FindOrCreatePeer(peer_address, bta_handle);
3020         } else if (peer_sep == AVDT_TSEP_SNK) {
3021           log::verbose("peer_sep({}), create a new sink peer", peer_sep);
3022           peer = btif_av_source.FindOrCreatePeer(peer_address, bta_handle);
3023         } else {
3024           if (btif_av_source.GetPeersCount() != 0) {
3025             log::verbose(
3026                     "peer_sep invalid, and already has sink peer, so try create a "
3027                     "new sink peer");
3028             peer = btif_av_source.FindOrCreatePeer(peer_address, bta_handle);
3029           } else if (btif_av_sink.GetPeersCount() != 0) {
3030             log::verbose(
3031                     "peer_sep invalid, and already has source peer, so try create "
3032                     "a new source peer");
3033             peer = btif_av_sink.FindOrCreatePeer(peer_address, bta_handle);
3034           } else {
3035             log::verbose(
3036                     "peer_sep invalid, and no active peer, so try create a new "
3037                     "sink peer");
3038             peer = btif_av_source.FindOrCreatePeer(peer_address, bta_handle);
3039           }
3040         }
3041       }
3042     } else {
3043       if (peer_sep == AVDT_TSEP_SNK) {
3044         log::verbose("peer_sep({}), only init src create a new source peer", peer_sep);
3045         peer = btif_av_source.FindOrCreatePeer(peer_address, bta_handle);
3046       } else if (peer_sep == AVDT_TSEP_SRC) {
3047         log::verbose("peer_sep({}), only init sink create a new source peer", peer_sep);
3048         peer = btif_av_sink.FindOrCreatePeer(peer_address, bta_handle);
3049       }
3050     }
3051     if (peer == NULL && bta_handle != 0) {
3052       if (peer_sep == AVDT_TSEP_SNK) {
3053         peer = btif_av_source.FindPeerByHandle(bta_handle);
3054       } else if (peer_sep == AVDT_TSEP_SRC) {
3055         peer = btif_av_sink.FindPeerByHandle(bta_handle);
3056       }
3057       log::verbose("peer is check 3");
3058     }
3059   } else if (bta_handle != 0) {
3060     if (peer_sep == AVDT_TSEP_INVALID) {
3061       peer = btif_av_source.FindPeerByHandle(bta_handle);
3062       /* if no this peer, default it's sink device */
3063       if (peer == nullptr) {
3064         peer = btif_av_sink.FindPeerByHandle(bta_handle);
3065       }
3066     } else if (peer_sep == AVDT_TSEP_SNK) {
3067       peer = btif_av_source.FindPeerByHandle(bta_handle);
3068     } else if (peer_sep == AVDT_TSEP_SRC) {
3069       peer = btif_av_sink.FindPeerByHandle(bta_handle);
3070     }
3071   }
3072   return peer;
3073 }
3074 
3075 /**
3076  * Process BTIF or BTA AV or BTA AVRCP events. The processing is done on the
3077  * JNI thread.
3078  *
3079  * @param peer_sep the corresponding peer's SEP: AVDT_TSEP_SRC if the peer
3080  * is A2DP Source, or AVDT_TSEP_SNK if the peer is A2DP Sink.
3081  * @param peer_address the peer address if known, otherwise RawAddress::kEmpty
3082  * @param bta_handle the BTA handle for the peer if known, otherwise
3083  * kBtaHandleUnknown
3084  * @param btif_av_event the corresponding event
3085  */
btif_av_handle_event(uint8_t peer_sep,const RawAddress & peer_address,tBTA_AV_HNDL bta_handle,const BtifAvEvent & btif_av_event)3086 static void btif_av_handle_event(uint8_t peer_sep, const RawAddress& peer_address,
3087                                  tBTA_AV_HNDL bta_handle, const BtifAvEvent& btif_av_event) {
3088   log::info("peer={} handle=0x{:x} event={}", peer_address, bta_handle, btif_av_event.ToString());
3089 
3090   BtifAvPeer* peer = nullptr;
3091 
3092   // Find the peer
3093   if (btif_av_src_sink_coexist_enabled()) {
3094     peer = btif_av_handle_both_peer(peer_sep, peer_address, bta_handle);
3095   } else {
3096     if (peer_address != RawAddress::kEmpty) {
3097       if (peer_sep == AVDT_TSEP_SNK) {
3098         peer = btif_av_source.FindOrCreatePeer(peer_address, bta_handle);
3099       } else if (peer_sep == AVDT_TSEP_SRC) {
3100         peer = btif_av_sink.FindOrCreatePeer(peer_address, bta_handle);
3101       }
3102     } else if (bta_handle != kBtaHandleUnknown) {
3103       if (peer_sep == AVDT_TSEP_SNK) {
3104         peer = btif_av_source.FindPeerByHandle(bta_handle);
3105       } else if (peer_sep == AVDT_TSEP_SRC) {
3106         peer = btif_av_sink.FindPeerByHandle(bta_handle);
3107       }
3108     }
3109   }
3110   if (peer == nullptr) {
3111     log::error(
3112             "Cannot find or create {} peer for peer={}  "
3113             "bta_handle=0x{:x} : event dropped: {}",
3114             peer_stream_endpoint_text(peer_sep), peer_address, bta_handle,
3115             btif_av_event.ToString());
3116     return;
3117   }
3118 
3119   peer->StateMachine().ProcessEvent(btif_av_event.Event(), btif_av_event.Data());
3120 }
3121 
3122 /**
3123  * Process BTA AV or BTA AVRCP events. The processing is done on the JNI
3124  * thread.
3125  *
3126  * @param peer_sep the corresponding peer's SEP: AVDT_TSEP_SRC if the peer
3127  * is A2DP Source, or AVDT_TSEP_SNK if the peer is A2DP Sink.
3128  * @param btif_av_event the corresponding event
3129  */
btif_av_handle_bta_av_event(uint8_t peer_sep,const BtifAvEvent & btif_av_event)3130 static void btif_av_handle_bta_av_event(uint8_t peer_sep, const BtifAvEvent& btif_av_event) {
3131   RawAddress peer_address = RawAddress::kEmpty;
3132   tBTA_AV_HNDL bta_handle = kBtaHandleUnknown;
3133   tBTA_AV_EVT event = btif_av_event.Event();
3134   tBTA_AV* p_data = reinterpret_cast<tBTA_AV*>(btif_av_event.Data());
3135   std::string msg;
3136 
3137   log::verbose("peer_sep={} event={}", peer_stream_endpoint_text(peer_sep),
3138                btif_av_event.ToString());
3139 
3140   switch (event) {
3141     case BTA_AV_ENABLE_EVT: {
3142       const tBTA_AV_ENABLE& enable = p_data->enable;
3143       log::verbose("Enable features=0x{:x}", enable.features);
3144       return;  // Nothing to do
3145     }
3146     case BTA_AV_REGISTER_EVT: {
3147       const tBTA_AV_REGISTER& reg = p_data->reg;
3148       bta_handle = reg.hndl;
3149       uint8_t peer_id = reg.app_id;  // The PeerId is used as AppId
3150       log::verbose("Register bta_handle=0x{:x} app_id={}", bta_handle, reg.app_id);
3151       if (btif_av_src_sink_coexist_enabled()) {
3152         if (peer_sep == AVDT_TSEP_INVALID) {
3153           if (reg.peer_sep == AVDT_TSEP_SNK) {
3154             peer_sep = AVDT_TSEP_SNK;
3155           } else {
3156             peer_sep = AVDT_TSEP_SRC;
3157           }
3158         }
3159       }
3160       if (peer_sep == AVDT_TSEP_SNK) {
3161         btif_av_source.BtaHandleRegistered(peer_id, bta_handle);
3162       } else if (peer_sep == AVDT_TSEP_SRC) {
3163         btif_av_sink.BtaHandleRegistered(peer_id, bta_handle);
3164       }
3165       return;  // Nothing else to do
3166     }
3167     case BTA_AV_OPEN_EVT: {
3168       const tBTA_AV_OPEN& open = p_data->open;
3169       peer_address = open.bd_addr;
3170       bta_handle = open.hndl;
3171       msg = "Stream opened";
3172       break;
3173     }
3174     case BTA_AV_CLOSE_EVT: {
3175       const tBTA_AV_CLOSE& close = p_data->close;
3176       bta_handle = close.hndl;
3177       msg = "Stream closed";
3178       break;
3179     }
3180     case BTA_AV_START_EVT: {
3181       const tBTA_AV_START& start = p_data->start;
3182       bta_handle = start.hndl;
3183       msg = "Stream started";
3184       break;
3185     }
3186     case BTA_AV_SUSPEND_EVT:
3187     case BTA_AV_STOP_EVT: {
3188       const tBTA_AV_SUSPEND& suspend = p_data->suspend;
3189       bta_handle = suspend.hndl;
3190       msg = "Stream stopped";
3191       break;
3192     }
3193     case BTA_AV_PROTECT_REQ_EVT: {
3194       const tBTA_AV_PROTECT_REQ& protect_req = p_data->protect_req;
3195       bta_handle = protect_req.hndl;
3196       break;
3197     }
3198     case BTA_AV_PROTECT_RSP_EVT: {
3199       const tBTA_AV_PROTECT_RSP& protect_rsp = p_data->protect_rsp;
3200       bta_handle = protect_rsp.hndl;
3201       break;
3202     }
3203     case BTA_AV_RC_OPEN_EVT: {
3204       const tBTA_AV_RC_OPEN& rc_open = p_data->rc_open;
3205       peer_address = rc_open.peer_addr;
3206       break;
3207     }
3208     case BTA_AV_RC_CLOSE_EVT: {
3209       const tBTA_AV_RC_CLOSE& rc_close = p_data->rc_close;
3210       peer_address = rc_close.peer_addr;
3211       break;
3212     }
3213     case BTA_AV_RC_BROWSE_OPEN_EVT: {
3214       const tBTA_AV_RC_BROWSE_OPEN& rc_browse_open = p_data->rc_browse_open;
3215       peer_address = rc_browse_open.peer_addr;
3216       break;
3217     }
3218     case BTA_AV_RC_BROWSE_CLOSE_EVT: {
3219       const tBTA_AV_RC_BROWSE_CLOSE& rc_browse_close = p_data->rc_browse_close;
3220       peer_address = rc_browse_close.peer_addr;
3221       break;
3222     }
3223     case BTA_AV_REMOTE_CMD_EVT:
3224     case BTA_AV_REMOTE_RSP_EVT:
3225     case BTA_AV_VENDOR_CMD_EVT:
3226     case BTA_AV_VENDOR_RSP_EVT:
3227     case BTA_AV_META_MSG_EVT: {
3228       if (btif_av_src_sink_coexist_enabled()) {
3229         if (peer_sep == AVDT_TSEP_INVALID) {
3230           const tBTA_AV_REMOTE_CMD& rc_rmt_cmd = p_data->remote_cmd;
3231           btif_rc_get_addr_by_handle(rc_rmt_cmd.rc_handle, peer_address);
3232           if (peer_address == RawAddress::kEmpty) {
3233             peer_address = btif_av_source.ActivePeer();
3234             if (peer_address == RawAddress::kEmpty) {
3235               peer_address = btif_av_sink.ActivePeer();
3236             }
3237           }
3238         } else if (peer_sep == AVDT_TSEP_SNK) {
3239           peer_address = btif_av_source.ActivePeer();
3240         } else if (peer_sep == AVDT_TSEP_SRC) {
3241           peer_address = btif_av_sink.ActivePeer();
3242         }
3243         break;
3244       } else {
3245         [[fallthrough]];
3246       }
3247     }
3248     case BTA_AV_OFFLOAD_START_RSP_EVT: {
3249       // TODO: Might be wrong - this code will be removed once those
3250       // events are received from the AVRCP module.
3251       if (peer_sep == AVDT_TSEP_SNK) {
3252         peer_address = btif_av_source.ActivePeer();
3253         msg = "Stream sink offloaded";
3254       } else if (peer_sep == AVDT_TSEP_SRC) {
3255         peer_address = btif_av_sink.ActivePeer();
3256         msg = "Stream source offloaded";
3257       }
3258       break;
3259     }
3260     case BTA_AV_RECONFIG_EVT: {
3261       const tBTA_AV_RECONFIG& reconfig = p_data->reconfig;
3262       bta_handle = reconfig.hndl;
3263       break;
3264     }
3265     case BTA_AV_PENDING_EVT: {
3266       const tBTA_AV_PEND& pend = p_data->pend;
3267       peer_address = pend.bd_addr;
3268       break;
3269     }
3270     case BTA_AV_REJECT_EVT: {
3271       const tBTA_AV_REJECT& reject = p_data->reject;
3272       peer_address = reject.bd_addr;
3273       bta_handle = reject.hndl;
3274       break;
3275     }
3276     case BTA_AV_RC_FEAT_EVT: {
3277       const tBTA_AV_RC_FEAT& rc_feat = p_data->rc_feat;
3278       peer_address = rc_feat.peer_addr;
3279       break;
3280     }
3281     case BTA_AV_RC_PSM_EVT: {
3282       const tBTA_AV_RC_PSM& rc_psm = p_data->rc_cover_art_psm;
3283       peer_address = rc_psm.peer_addr;
3284       break;
3285     }
3286   }
3287 
3288   if (!msg.empty()) {
3289     BTM_LogHistory(kBtmLogHistoryTag, peer_address, msg, btif_av_event.ToString());
3290   }
3291   btif_av_handle_event(peer_sep, peer_address, bta_handle, btif_av_event);
3292 }
3293 
btif_av_both_enable(void)3294 bool btif_av_both_enable(void) { return btif_av_sink.Enabled() && btif_av_source.Enabled(); }
3295 
is_a2dp_source_property_enabled(void)3296 static bool is_a2dp_source_property_enabled(void) {
3297 #ifdef __ANDROID__
3298   return android::sysprop::BluetoothProperties::isProfileA2dpSourceEnabled().value_or(false);
3299 #else
3300   return false;
3301 #endif
3302 }
3303 
is_a2dp_sink_property_enabled(void)3304 static bool is_a2dp_sink_property_enabled(void) {
3305 #ifdef __ANDROID__
3306   return android::sysprop::BluetoothProperties::isProfileA2dpSinkEnabled().value_or(false);
3307 #else
3308   return false;
3309 #endif
3310 }
btif_av_src_sink_coexist_enabled(void)3311 bool btif_av_src_sink_coexist_enabled(void) {
3312   return is_a2dp_sink_property_enabled() && is_a2dp_source_property_enabled();
3313 }
3314 
bta_av_source_callback(tBTA_AV_EVT event,tBTA_AV * p_data)3315 static void bta_av_source_callback(tBTA_AV_EVT event, tBTA_AV* p_data) {
3316   BtifAvEvent btif_av_event(event, p_data, sizeof(tBTA_AV));
3317   log::verbose("event={}", btif_av_event.ToString());
3318 
3319   do_in_main_thread(base::BindOnce(&btif_av_handle_bta_av_event, AVDT_TSEP_SNK /* peer_sep */,
3320                                    btif_av_event));
3321 }
3322 
bta_av_sink_callback(tBTA_AV_EVT event,tBTA_AV * p_data)3323 static void bta_av_sink_callback(tBTA_AV_EVT event, tBTA_AV* p_data) {
3324   BtifAvEvent btif_av_event(event, p_data, sizeof(tBTA_AV));
3325   do_in_main_thread(base::BindOnce(&btif_av_handle_bta_av_event, AVDT_TSEP_SRC /* peer_sep */,
3326                                    btif_av_event));
3327 }
3328 
bta_av_event_callback(tBTA_AV_EVT event,tBTA_AV * p_data)3329 static void bta_av_event_callback(tBTA_AV_EVT event, tBTA_AV* p_data) {
3330   if (btif_av_both_enable()) {
3331     BtifAvEvent btif_av_event(event, p_data, sizeof(tBTA_AV));
3332     do_in_main_thread(base::BindOnce(&btif_av_handle_bta_av_event, AVDT_TSEP_INVALID /* peer_sep */,
3333                                      btif_av_event));
3334     return;
3335   }
3336 
3337   if (btif_av_is_sink_enabled()) {
3338     return bta_av_sink_callback(event, p_data);
3339   }
3340 
3341   return bta_av_source_callback(event, p_data);
3342 }
3343 
3344 // TODO: All processing should be done on the JNI thread
bta_av_sink_media_callback(const RawAddress & peer_address,tBTA_AV_EVT event,tBTA_AV_MEDIA * p_data)3345 static void bta_av_sink_media_callback(const RawAddress& peer_address, tBTA_AV_EVT event,
3346                                        tBTA_AV_MEDIA* p_data) {
3347   log::verbose("event={} peer {}", event, peer_address);
3348 
3349   switch (event) {
3350     case BTA_AV_SINK_MEDIA_DATA_EVT: {
3351       BtifAvPeer* peer = btif_av_sink_find_peer(peer_address);
3352       if (peer != nullptr && peer->IsActivePeer()) {
3353         int state = peer->StateMachine().StateId();
3354         if ((state == BtifAvStateMachine::kStateStarted) ||
3355             (state == BtifAvStateMachine::kStateOpened)) {
3356           uint8_t queue_len = btif_a2dp_sink_enqueue_buf(reinterpret_cast<BT_HDR*>(p_data));
3357           log::verbose("Packets in Sink queue {}", queue_len);
3358         }
3359       }
3360       break;
3361     }
3362     case BTA_AV_SINK_MEDIA_CFG_EVT: {
3363       btif_av_sink_config_req_t config_req;
3364 
3365       log::verbose("address={}", p_data->avk_config.bd_addr);
3366 
3367       // Update the codec info of the A2DP Sink decoder
3368       btif_a2dp_sink_update_decoder(p_data->avk_config.bd_addr,
3369                                     reinterpret_cast<uint8_t*>(p_data->avk_config.codec_info));
3370 
3371       config_req.sample_rate = A2DP_GetTrackSampleRate(p_data->avk_config.codec_info);
3372       if (config_req.sample_rate == -1) {
3373         log::error("Cannot get the track frequency");
3374         break;
3375       }
3376       config_req.channel_count = A2DP_GetTrackChannelCount(p_data->avk_config.codec_info);
3377       if (config_req.channel_count == -1) {
3378         log::error("Cannot get the channel count");
3379         break;
3380       }
3381       config_req.peer_address = p_data->avk_config.bd_addr;
3382       BtifAvEvent btif_av_event(BTIF_AV_SINK_CONFIG_REQ_EVT, &config_req, sizeof(config_req));
3383       do_in_main_thread(base::BindOnce(&btif_av_handle_event,
3384                                        AVDT_TSEP_SRC,  // peer_sep
3385                                        config_req.peer_address, kBtaHandleUnknown, btif_av_event));
3386       break;
3387     }
3388     default:
3389       break;
3390   }
3391 }
3392 
3393 // Initializes the AV interface for source mode
btif_av_source_init(btav_source_callbacks_t * callbacks,int max_connected_audio_devices,const std::vector<btav_a2dp_codec_config_t> & codec_priorities,const std::vector<btav_a2dp_codec_config_t> & offloading_preference,std::vector<btav_a2dp_codec_info_t> * supported_codecs)3394 bt_status_t btif_av_source_init(btav_source_callbacks_t* callbacks, int max_connected_audio_devices,
3395                                 const std::vector<btav_a2dp_codec_config_t>& codec_priorities,
3396                                 const std::vector<btav_a2dp_codec_config_t>& offloading_preference,
3397                                 std::vector<btav_a2dp_codec_info_t>* supported_codecs) {
3398   log::info("");
3399   std::promise<bt_status_t> init_complete_promise;
3400   std::future<bt_status_t> init_complete_promise_future = init_complete_promise.get_future();
3401   const auto& status = do_in_main_thread(
3402           base::BindOnce(&BtifAvSource::Init, base::Unretained(&btif_av_source), callbacks,
3403                          max_connected_audio_devices, codec_priorities, offloading_preference,
3404                          supported_codecs, std::move(init_complete_promise)));
3405   if (status == BT_STATUS_SUCCESS) {
3406     init_complete_promise_future.wait();
3407     return init_complete_promise_future.get();
3408   } else {
3409     log::warn("Failed to init source profile");
3410     return status;
3411   }
3412 }
3413 
3414 // Initializes the AV interface for sink mode
btif_av_sink_init(btav_sink_callbacks_t * callbacks,int max_connected_audio_devices)3415 bt_status_t btif_av_sink_init(btav_sink_callbacks_t* callbacks, int max_connected_audio_devices) {
3416   log::info("");
3417   std::promise<bt_status_t> init_complete_promise;
3418   std::future<bt_status_t> init_complete_promise_future = init_complete_promise.get_future();
3419   const auto status = do_in_main_thread(
3420           base::BindOnce(&BtifAvSink::Init, base::Unretained(&btif_av_sink), callbacks,
3421                          max_connected_audio_devices, std::move(init_complete_promise)));
3422   if (status == BT_STATUS_SUCCESS) {
3423     init_complete_promise_future.wait();
3424     return init_complete_promise_future.get();
3425   } else {
3426     log::warn("Failed to init sink");
3427     return status;
3428   }
3429 }
3430 
3431 // Updates the final focus state reported by components calling this module
btif_av_sink_set_audio_focus_state(int state)3432 void btif_av_sink_set_audio_focus_state(int state) {
3433   log::info("state={}", state);
3434   btif_a2dp_sink_set_focus_state_req((btif_a2dp_sink_focus_state_t)state);
3435 }
3436 
3437 // Updates the track gain (used for ducking).
btif_av_sink_set_audio_track_gain(float gain)3438 void btif_av_sink_set_audio_track_gain(float gain) {
3439   log::info("gain={:f}", gain);
3440   btif_a2dp_sink_set_audio_track_gain(gain);
3441 }
3442 
3443 // Establishes the AV signalling channel with the remote headset
connect_int(RawAddress * peer_address,uint16_t uuid)3444 static bt_status_t connect_int(RawAddress* peer_address, uint16_t uuid) {
3445   log::info("peer={} uuid=0x{:x}", *peer_address, uuid);
3446 
3447   if (btif_av_both_enable()) {
3448     const RawAddress tmp = *peer_address;
3449     if (uuid == UUID_SERVCLASS_AUDIO_SOURCE) {
3450       btif_av_source_dispatch_sm_event(tmp, BTIF_AV_CONNECT_REQ_EVT);
3451     } else if (uuid == UUID_SERVCLASS_AUDIO_SINK) {
3452       btif_av_sink_dispatch_sm_event(tmp, BTIF_AV_CONNECT_REQ_EVT);
3453     }
3454     return BT_STATUS_SUCCESS;
3455   }
3456 
3457   auto connection_task = [](RawAddress* peer_address, uint16_t uuid) {
3458     BtifAvPeer* peer = nullptr;
3459     if (uuid == UUID_SERVCLASS_AUDIO_SOURCE) {
3460       peer = btif_av_source.FindOrCreatePeer(*peer_address, kBtaHandleUnknown);
3461     } else if (uuid == UUID_SERVCLASS_AUDIO_SINK) {
3462       peer = btif_av_sink.FindOrCreatePeer(*peer_address, kBtaHandleUnknown);
3463     }
3464     if (peer == nullptr) {
3465       btif_queue_advance();
3466       return;
3467     }
3468     peer->StateMachine().ProcessEvent(BTIF_AV_CONNECT_REQ_EVT, nullptr);
3469   };
3470   bt_status_t status = do_in_main_thread(base::BindOnce(connection_task, peer_address, uuid));
3471   if (status != BT_STATUS_SUCCESS) {
3472     log::error("can't post connection task to main_thread");
3473   }
3474   return status;
3475 }
3476 
set_source_silence_peer_int(const RawAddress & peer_address,bool silence)3477 static void set_source_silence_peer_int(const RawAddress& peer_address, bool silence) {
3478   log::info("peer={} silence={}", peer_address, silence);
3479 
3480   if (!btif_av_source.SetSilencePeer(peer_address, silence)) {
3481     log::error("Error setting silence state to {}", peer_address);
3482   }
3483 }
3484 
3485 // Set the active peer
set_active_peer_int(uint8_t peer_sep,const RawAddress & peer_address,std::promise<void> peer_ready_promise)3486 static void set_active_peer_int(uint8_t peer_sep, const RawAddress& peer_address,
3487                                 std::promise<void> peer_ready_promise) {
3488   log::info("peer_sep={} peer={}", peer_sep == AVDT_TSEP_SRC ? "Source" : "Sink", peer_address);
3489 
3490   BtifAvPeer* peer = nullptr;
3491   if (peer_sep == AVDT_TSEP_SNK) {
3492     if (!btif_av_src_sink_coexist_enabled() ||
3493         (btif_av_src_sink_coexist_enabled() && btif_av_both_enable() &&
3494          (btif_av_sink.FindPeer(peer_address) == nullptr))) {
3495       if (!btif_av_source.SetActivePeer(peer_address, std::move(peer_ready_promise))) {
3496         log::error("Error setting {} as active Sink peer", peer_address);
3497       }
3498     }
3499     return;
3500   }
3501   if (peer_sep == AVDT_TSEP_SRC) {
3502     if (!btif_av_src_sink_coexist_enabled() ||
3503         (btif_av_src_sink_coexist_enabled() && btif_av_both_enable() &&
3504          (btif_av_source.FindPeer(peer_address) == nullptr))) {
3505       if (!btif_av_sink.SetActivePeer(peer_address, std::move(peer_ready_promise))) {
3506         log::error("Error setting {} as active Source peer", peer_address);
3507       }
3508     }
3509     return;
3510   }
3511   // If reached here, we could not set the active peer
3512   log::error("Cannot set active {} peer to {}: peer not {}",
3513              (peer_sep == AVDT_TSEP_SRC) ? "Source" : "Sink", peer_address,
3514              (peer == nullptr) ? "found" : "connected");
3515   peer_ready_promise.set_value();
3516 }
3517 
btif_av_source_connect(const RawAddress & peer_address)3518 bt_status_t btif_av_source_connect(const RawAddress& peer_address) {
3519   log::info("peer={}", peer_address);
3520 
3521   if (!btif_av_source.Enabled()) {
3522     log::warn("BTIF AV Source is not enabled");
3523     return BT_STATUS_NOT_READY;
3524   }
3525 
3526   RawAddress peer_address_copy(peer_address);
3527   return btif_queue_connect(UUID_SERVCLASS_AUDIO_SOURCE, &peer_address_copy, connect_int);
3528 }
3529 
btif_av_sink_connect(const RawAddress & peer_address)3530 bt_status_t btif_av_sink_connect(const RawAddress& peer_address) {
3531   log::info("peer={}", peer_address);
3532 
3533   if (!btif_av_sink.Enabled()) {
3534     log::warn("BTIF AV Sink is not enabled");
3535     return BT_STATUS_NOT_READY;
3536   }
3537 
3538   RawAddress peer_address_copy(peer_address);
3539   return btif_queue_connect(UUID_SERVCLASS_AUDIO_SINK, &peer_address_copy, connect_int);
3540 }
3541 
btif_av_source_disconnect(const RawAddress & peer_address)3542 bt_status_t btif_av_source_disconnect(const RawAddress& peer_address) {
3543   log::info("peer={}", peer_address);
3544 
3545   if (!btif_av_source.Enabled()) {
3546     log::warn("BTIF AV Source is not enabled");
3547     return BT_STATUS_NOT_READY;
3548   }
3549 
3550   BtifAvEvent btif_av_event(BTIF_AV_DISCONNECT_REQ_EVT, &peer_address, sizeof(peer_address));
3551   return do_in_main_thread(base::BindOnce(&btif_av_handle_event,
3552                                           AVDT_TSEP_SNK,  // peer_sep
3553                                           peer_address, kBtaHandleUnknown, btif_av_event));
3554 }
3555 
btif_av_sink_disconnect(const RawAddress & peer_address)3556 bt_status_t btif_av_sink_disconnect(const RawAddress& peer_address) {
3557   log::info("peer={}", peer_address);
3558 
3559   if (!btif_av_sink.Enabled()) {
3560     log::warn("BTIF AV Sink is not enabled");
3561     return BT_STATUS_NOT_READY;
3562   }
3563 
3564   BtifAvEvent btif_av_event(BTIF_AV_DISCONNECT_REQ_EVT, &peer_address, sizeof(peer_address));
3565   return do_in_main_thread(base::BindOnce(&btif_av_handle_event,
3566                                           AVDT_TSEP_SRC,  // peer_sep
3567                                           peer_address, kBtaHandleUnknown, btif_av_event));
3568 }
3569 
btif_av_sink_set_active_device(const RawAddress & peer_address)3570 bt_status_t btif_av_sink_set_active_device(const RawAddress& peer_address) {
3571   log::info("peer={}", peer_address);
3572 
3573   if (!btif_av_sink.Enabled()) {
3574     log::warn("BTIF AV Source is not enabled");
3575     return BT_STATUS_NOT_READY;
3576   }
3577 
3578   std::promise<void> peer_ready_promise;
3579   std::future<void> peer_ready_future = peer_ready_promise.get_future();
3580   bt_status_t status =
3581           do_in_main_thread(base::BindOnce(&set_active_peer_int,
3582                                            AVDT_TSEP_SRC,  // peer_sep
3583                                            peer_address, std::move(peer_ready_promise)));
3584   if (status == BT_STATUS_SUCCESS) {
3585     peer_ready_future.wait();
3586   } else {
3587     log::warn("BTIF AV Sink fails to change peer");
3588   }
3589   return status;
3590 }
3591 
btif_av_source_set_silence_device(const RawAddress & peer_address,bool silence)3592 bt_status_t btif_av_source_set_silence_device(const RawAddress& peer_address, bool silence) {
3593   log::info("peer={} silence={}", peer_address, silence);
3594 
3595   if (!btif_av_source.Enabled()) {
3596     log::warn("BTIF AV Source is not enabled");
3597     return BT_STATUS_NOT_READY;
3598   }
3599 
3600   return do_in_main_thread(base::BindOnce(&set_source_silence_peer_int, peer_address, silence));
3601 }
3602 
btif_av_source_set_active_device(const RawAddress & peer_address)3603 bt_status_t btif_av_source_set_active_device(const RawAddress& peer_address) {
3604   log::info("peer={}", peer_address);
3605 
3606   if (!btif_av_source.Enabled()) {
3607     log::warn("BTIF AV Source is not enabled");
3608     return BT_STATUS_NOT_READY;
3609   }
3610 
3611   std::promise<void> peer_ready_promise;
3612   std::future<void> peer_ready_future = peer_ready_promise.get_future();
3613   bt_status_t status =
3614           do_in_main_thread(base::BindOnce(&set_active_peer_int,
3615                                            AVDT_TSEP_SNK,  // peer_sep
3616                                            peer_address, std::move(peer_ready_promise)));
3617   if (status == BT_STATUS_SUCCESS) {
3618     peer_ready_future.wait();
3619   } else {
3620     log::warn("BTIF AV Source fails to change peer");
3621   }
3622   return status;
3623 }
3624 
btif_av_source_set_codec_config_preference(const RawAddress & peer_address,std::vector<btav_a2dp_codec_config_t> codec_preferences)3625 bt_status_t btif_av_source_set_codec_config_preference(
3626         const RawAddress& peer_address, std::vector<btav_a2dp_codec_config_t> codec_preferences) {
3627   log::info("peer={} codec_preferences=[{}]", peer_address, codec_preferences.size());
3628 
3629   if (!btif_av_source.Enabled()) {
3630     log::warn("BTIF AV Source is not enabled");
3631     return BT_STATUS_NOT_READY;
3632   }
3633 
3634   if (peer_address.IsEmpty()) {
3635     log::warn("BTIF AV Source needs peer to config");
3636     return BT_STATUS_PARM_INVALID;
3637   }
3638 
3639   std::promise<void> peer_ready_promise;
3640   std::future<void> peer_ready_future = peer_ready_promise.get_future();
3641   bt_status_t status = BT_STATUS_FAIL;
3642 
3643   if (com::android::bluetooth::flags::av_stream_reconfigure_fix()) {
3644     status = btif_av_source.SetPeerReconfigureStreamData(peer_address, codec_preferences,
3645                                                          std::move(peer_ready_promise));
3646     if (status != BT_STATUS_SUCCESS) {
3647       log::error("SetPeerReconfigureStreamData failed, status: {}", status);
3648       return status;
3649     }
3650 
3651     BtifAvEvent btif_av_event(BTIF_AV_RECONFIGURE_REQ_EVT, nullptr, 0);
3652     status = do_in_main_thread(base::BindOnce(&btif_av_handle_event,
3653                                               AVDT_TSEP_SNK,  // peer_sep
3654                                               peer_address, kBtaHandleUnknown, btif_av_event));
3655   } else {
3656     status = do_in_main_thread(base::BindOnce(&BtifAvSource::UpdateCodecConfig,
3657                                               base::Unretained(&btif_av_source), peer_address,
3658                                               codec_preferences, std::move(peer_ready_promise)));
3659   }
3660 
3661   if (status != BT_STATUS_SUCCESS) {
3662     log::error("do_in_main_thread failed, status: {}", status);
3663     return status;
3664   }
3665 
3666   if (peer_ready_future.wait_for(std::chrono::seconds(10)) != std::future_status::ready) {
3667     log::error("BTIF AV Source fails to config codec");
3668     return BT_STATUS_FAIL;
3669   }
3670 
3671   return status;
3672 }
3673 
btif_av_source_cleanup(void)3674 void btif_av_source_cleanup(void) {
3675   log::info("");
3676   do_in_main_thread(base::BindOnce(&BtifAvSource::Cleanup, base::Unretained(&btif_av_source)));
3677 }
3678 
btif_av_sink_cleanup(void)3679 void btif_av_sink_cleanup(void) {
3680   log::info("");
3681   do_in_main_thread(base::BindOnce(&BtifAvSink::Cleanup, base::Unretained(&btif_av_sink)));
3682 }
3683 
btif_av_source_active_peer(void)3684 RawAddress btif_av_source_active_peer(void) { return btif_av_source.ActivePeer(); }
btif_av_sink_active_peer(void)3685 RawAddress btif_av_sink_active_peer(void) { return btif_av_sink.ActivePeer(); }
3686 
btif_av_is_sink_enabled(void)3687 bool btif_av_is_sink_enabled(void) { return btif_av_sink.Enabled(); }
3688 
btif_av_is_source_enabled(void)3689 bool btif_av_is_source_enabled(void) { return btif_av_source.Enabled(); }
3690 
btif_av_stream_start(const A2dpType)3691 void btif_av_stream_start(const A2dpType /*local_a2dp_type*/) {
3692   log::info("");
3693 
3694   btif_av_source_dispatch_sm_event(btif_av_source_active_peer(), BTIF_AV_START_STREAM_REQ_EVT);
3695 }
3696 
btif_av_stream_start_with_latency(bool use_latency_mode)3697 void btif_av_stream_start_with_latency(bool use_latency_mode) {
3698   log::info("peer={} use_latency_mode={}", btif_av_source_active_peer(), use_latency_mode);
3699 
3700   btif_av_start_stream_req_t start_stream_req;
3701   start_stream_req.use_latency_mode = use_latency_mode;
3702   BtifAvEvent btif_av_event(BTIF_AV_START_STREAM_REQ_EVT, &start_stream_req,
3703                             sizeof(start_stream_req));
3704 
3705   do_in_main_thread(base::BindOnce(&btif_av_handle_event,
3706                                    AVDT_TSEP_SNK,  // peer_sep
3707                                    btif_av_source_active_peer(), kBtaHandleUnknown, btif_av_event));
3708 }
3709 
btif_av_stream_stop(const RawAddress & peer_address)3710 void btif_av_stream_stop(const RawAddress& peer_address) {
3711   log::info("peer={}", peer_address);
3712 
3713   if (!peer_address.IsEmpty()) {
3714     btif_av_source_dispatch_sm_event(peer_address, BTIF_AV_STOP_STREAM_REQ_EVT);
3715     return;
3716   }
3717 
3718   // The active peer might have changed and we might be in the process
3719   // of reconfiguring the stream. We need to stop the appropriate peer(s).
3720   btif_av_source.DispatchSuspendStreamEvent(BTIF_AV_STOP_STREAM_REQ_EVT);
3721 }
3722 
btif_av_stream_suspend(void)3723 void btif_av_stream_suspend(void) {
3724   log::info("");
3725 
3726   // The active peer might have changed and we might be in the process
3727   // of reconfiguring the stream. We need to suspend the appropriate peer(s).
3728   btif_av_source.DispatchSuspendStreamEvent(BTIF_AV_SUSPEND_STREAM_REQ_EVT);
3729 }
3730 
btif_av_stream_start_offload(void)3731 void btif_av_stream_start_offload(void) {
3732   log::info("");
3733 
3734   btif_av_source_dispatch_sm_event(btif_av_source_active_peer(), BTIF_AV_OFFLOAD_START_REQ_EVT);
3735 }
3736 
btif_av_stream_ready(const A2dpType local_a2dp_type)3737 bool btif_av_stream_ready(const A2dpType local_a2dp_type) {
3738   // Make sure the main adapter is enabled
3739   if (btif_is_enabled() == 0) {
3740     log::verbose("Main adapter is not enabled");
3741     return false;
3742   }
3743 
3744   BtifAvPeer* peer = btif_av_find_active_peer(local_a2dp_type);
3745   if (peer == nullptr) {
3746     log::warn("No active peer found");
3747     return false;
3748   }
3749 
3750   int state = peer->StateMachine().StateId();
3751   log::info("active_peer={} state={} flags={}", peer->PeerAddress(), state, peer->FlagsToString());
3752 
3753   // check if we are remotely suspended or stop is pending
3754   if (peer->CheckFlags(BtifAvPeer::kFlagRemoteSuspend | BtifAvPeer::kFlagPendingStop)) {
3755     return false;
3756   }
3757 
3758   return state == BtifAvStateMachine::kStateOpened;
3759 }
3760 
btif_av_stream_started_ready(const A2dpType local_a2dp_type)3761 bool btif_av_stream_started_ready(const A2dpType local_a2dp_type) {
3762   BtifAvPeer* peer = btif_av_find_active_peer(local_a2dp_type);
3763   if (peer == nullptr) {
3764     log::warn("No active peer found");
3765     return false;
3766   }
3767 
3768   int state = peer->StateMachine().StateId();
3769   bool ready = false;
3770   if (peer->CheckFlags(BtifAvPeer::kFlagLocalSuspendPending | BtifAvPeer::kFlagRemoteSuspend |
3771                        BtifAvPeer::kFlagPendingStop)) {
3772     // Disallow media task to start if we have pending actions
3773     ready = false;
3774   } else {
3775     ready = (state == BtifAvStateMachine::kStateStarted);
3776   }
3777 
3778   log::info("active_peer={} state={} flags={} ready={}", peer->PeerAddress(), state,
3779             peer->FlagsToString(), ready);
3780 
3781   return ready;
3782 }
3783 
btif_av_source_dispatch_sm_event(const RawAddress & peer_address,btif_av_sm_event_t event)3784 static void btif_av_source_dispatch_sm_event(const RawAddress& peer_address,
3785                                              btif_av_sm_event_t event) {
3786   BtifAvEvent btif_av_event(event, nullptr, 0);
3787   log::verbose("peer={} event={}", peer_address, btif_av_event.ToString());
3788 
3789   do_in_main_thread(base::BindOnce(&btif_av_handle_event,
3790                                    AVDT_TSEP_SNK,  // peer_sep
3791                                    peer_address, kBtaHandleUnknown, btif_av_event));
3792 }
3793 
btif_av_sink_dispatch_sm_event(const RawAddress & peer_address,btif_av_sm_event_t event)3794 static void btif_av_sink_dispatch_sm_event(const RawAddress& peer_address,
3795                                            btif_av_sm_event_t event) {
3796   BtifAvEvent btif_av_event(event, nullptr, 0);
3797   log::verbose("peer={} event={}", peer_address, btif_av_event.ToString());
3798 
3799   do_in_main_thread(base::BindOnce(&btif_av_handle_event,
3800                                    AVDT_TSEP_SRC,  // peer_sep
3801                                    peer_address, kBtaHandleUnknown, btif_av_event));
3802 }
3803 
btif_av_source_execute_service(bool enable)3804 bt_status_t btif_av_source_execute_service(bool enable) {
3805   log::info("enable={}", enable);
3806 
3807   if (enable) {
3808     // Added BTA_AV_FEAT_NO_SCO_SSPD - this ensures that the BTA does not
3809     // auto-suspend av streaming on AG events(SCO or Call). The suspend shall
3810     // be initiated by the app/audioflinger layers.
3811     // Support for browsing for SDP record should work only if we enable
3812     // BROWSE while registering.
3813     tBTA_AV_FEAT features =
3814             BTA_AV_FEAT_RCTG | BTA_AV_FEAT_METADATA | BTA_AV_FEAT_VENDOR | BTA_AV_FEAT_NO_SCO_SSPD;
3815 
3816     if (delay_reporting_enabled()) {
3817       features |= BTA_AV_FEAT_DELAY_RPT;
3818     }
3819 
3820     if (avrcp_absolute_volume_is_enabled()) {
3821       features |= BTA_AV_FEAT_RCCT | BTA_AV_FEAT_ADV_CTRL | BTA_AV_FEAT_BROWSE;
3822     }
3823 
3824     if (btif_av_src_sink_coexist_enabled()) {
3825       features |= BTA_AV_FEAT_SRC;
3826       BTA_AvEnable(features, bta_av_event_callback);
3827     } else {
3828       BTA_AvEnable(features, bta_av_source_callback);
3829     }
3830     btif_av_source.RegisterAllBtaHandles();
3831     return BT_STATUS_SUCCESS;
3832   }
3833 
3834   // Disable the service
3835   btif_av_source.DeregisterAllBtaHandles();
3836   BTA_AvDisable();
3837   return BT_STATUS_SUCCESS;
3838 }
3839 
btif_av_sink_execute_service(bool enable)3840 bt_status_t btif_av_sink_execute_service(bool enable) {
3841   log::info("enable={}", enable);
3842 
3843   if (enable) {
3844     // Added BTA_AV_FEAT_NO_SCO_SSPD - this ensures that the BTA does not
3845     // auto-suspend AV streaming on AG events (SCO or Call). The suspend shall
3846     // be initiated by the app/audioflinger layers.
3847     tBTA_AV_FEAT features = BTA_AV_FEAT_NO_SCO_SSPD | BTA_AV_FEAT_RCCT | BTA_AV_FEAT_METADATA |
3848                             BTA_AV_FEAT_VENDOR | BTA_AV_FEAT_ADV_CTRL | BTA_AV_FEAT_RCTG |
3849                             BTA_AV_FEAT_BROWSE | BTA_AV_FEAT_COVER_ARTWORK;
3850 
3851     if (delay_reporting_enabled()) {
3852       features |= BTA_AV_FEAT_DELAY_RPT;
3853     }
3854 
3855     if (btif_av_src_sink_coexist_enabled()) {
3856       BTA_AvEnable(features, bta_av_event_callback);
3857     } else {
3858       BTA_AvEnable(features, bta_av_sink_callback);
3859     }
3860     btif_av_sink.RegisterAllBtaHandles();
3861     return BT_STATUS_SUCCESS;
3862   }
3863 
3864   // Disable the service
3865   btif_av_sink.DeregisterAllBtaHandles();
3866   BTA_AvDisable();
3867   return BT_STATUS_SUCCESS;
3868 }
3869 
btif_av_is_connected(const A2dpType local_a2dp_type)3870 bool btif_av_is_connected(const A2dpType local_a2dp_type) {
3871   BtifAvPeer* peer = btif_av_find_active_peer(local_a2dp_type);
3872   if (peer == nullptr) {
3873     log::warn("No active peer found");
3874     return false;
3875   }
3876 
3877   bool connected = peer->IsConnected();
3878   log::verbose("active_peer={} connected={}", peer->PeerAddress(), connected);
3879   return peer->IsConnected();
3880 }
3881 
btif_av_get_peer_sep(const A2dpType local_a2dp_type)3882 uint8_t btif_av_get_peer_sep(const A2dpType local_a2dp_type) {
3883   BtifAvPeer* peer = btif_av_find_active_peer(local_a2dp_type);
3884   if (peer == nullptr) {
3885     log::warn("No active peer found");
3886     return AVDT_TSEP_INVALID;
3887   }
3888 
3889   uint8_t peer_sep = peer->PeerSep();
3890   log::verbose("active_peer={} sep={}", peer->PeerAddress(),
3891                peer_sep == AVDT_TSEP_SRC ? "Source" : "Sink");
3892   return peer_sep;
3893 }
3894 
btif_av_clear_remote_suspend_flag(const A2dpType local_a2dp_type)3895 void btif_av_clear_remote_suspend_flag(const A2dpType local_a2dp_type) {
3896   auto clear_remote_suspend_flag = [](const A2dpType local_a2dp_type) {
3897     BtifAvPeer* peer = btif_av_find_active_peer(local_a2dp_type);
3898     if (peer == nullptr) {
3899       log::warn("No active peer found");
3900       return;
3901     }
3902     log::verbose("active_peer={} flags={}", peer->PeerAddress(), peer->FlagsToString());
3903     peer->ClearFlags(BtifAvPeer::kFlagRemoteSuspend);
3904   };
3905   // switch to main thread to prevent a race condition of accessing peers
3906   do_in_main_thread(base::BindOnce(clear_remote_suspend_flag, local_a2dp_type));
3907 }
3908 
btif_av_is_peer_edr(const RawAddress & peer_address,const A2dpType local_a2dp_type)3909 bool btif_av_is_peer_edr(const RawAddress& peer_address, const A2dpType local_a2dp_type) {
3910   BtifAvPeer* peer = btif_av_find_peer(peer_address, local_a2dp_type);
3911   if (peer == nullptr) {
3912     log::warn("peer={} not found", peer_address);
3913     return false;
3914   }
3915   if (!peer->IsConnected()) {
3916     log::warn("peer={} not connected", peer_address);
3917     return false;
3918   }
3919 
3920   bool is_edr = peer->IsEdr();
3921   log::verbose("peer={} is_edr={}", peer_address, is_edr);
3922   return is_edr;
3923 }
3924 
btif_av_peer_supports_3mbps(const RawAddress & peer_address,const A2dpType local_a2dp_type)3925 bool btif_av_peer_supports_3mbps(const RawAddress& peer_address, const A2dpType local_a2dp_type) {
3926   BtifAvPeer* peer = btif_av_find_peer(peer_address, local_a2dp_type);
3927   if (peer == nullptr) {
3928     log::warn("peer={} not found", peer_address);
3929     return false;
3930   }
3931 
3932   bool is_3mbps = peer->Is3Mbps();
3933   bool is_connected = peer->IsConnected();
3934   log::verbose("peer={} connected={}, edr_3mbps={}", peer_address, is_connected, is_3mbps);
3935   return is_connected && is_3mbps;
3936 }
3937 
btif_av_peer_prefers_mandatory_codec(const RawAddress & peer_address,const A2dpType local_a2dp_type)3938 bool btif_av_peer_prefers_mandatory_codec(const RawAddress& peer_address,
3939                                           const A2dpType local_a2dp_type) {
3940   BtifAvPeer* peer = btif_av_find_peer(peer_address, local_a2dp_type);
3941   if (peer == nullptr) {
3942     log::warn("peer={} not found", peer_address);
3943     return false;
3944   }
3945   return peer->IsMandatoryCodecPreferred();
3946 }
3947 
btif_av_acl_disconnected(const RawAddress & peer_address,const A2dpType local_a2dp_type)3948 void btif_av_acl_disconnected(const RawAddress& peer_address, const A2dpType local_a2dp_type) {
3949   log::info("peer={}", peer_address);
3950 
3951   // Inform the application that ACL is disconnected and move to idle state
3952   if (btif_av_both_enable()) {
3953     BtifAvPeer* peer = btif_av_find_peer(peer_address, local_a2dp_type);
3954     if (peer != nullptr) {
3955       if (peer->IsSource()) {
3956         btif_av_sink_dispatch_sm_event(peer_address, BTIF_AV_ACL_DISCONNECTED);
3957       } else {
3958         btif_av_source_dispatch_sm_event(peer_address, BTIF_AV_ACL_DISCONNECTED);
3959       }
3960     }
3961     return;
3962   }
3963 
3964   if (btif_av_source.Enabled()) {
3965     btif_av_source_dispatch_sm_event(peer_address, BTIF_AV_ACL_DISCONNECTED);
3966   } else if (btif_av_sink.Enabled()) {
3967     btif_av_sink_dispatch_sm_event(peer_address, BTIF_AV_ACL_DISCONNECTED);
3968   }
3969 }
3970 
btif_debug_av_peer_dump(int fd,const BtifAvPeer & peer)3971 static void btif_debug_av_peer_dump(int fd, const BtifAvPeer& peer) {
3972   std::string state_str;
3973   int state = peer.StateMachine().StateId();
3974   switch (state) {
3975     case BtifAvStateMachine::kStateIdle:
3976       state_str = "Idle";
3977       break;
3978     case BtifAvStateMachine::kStateOpening:
3979       state_str = "Opening";
3980       break;
3981     case BtifAvStateMachine::kStateOpened:
3982       state_str = "Opened";
3983       break;
3984     case BtifAvStateMachine::kStateStarted:
3985       state_str = "Started";
3986       break;
3987     case BtifAvStateMachine::kStateClosing:
3988       state_str = "Closing";
3989       break;
3990     default:
3991       state_str = "Unknown(" + std::to_string(state) + ")";
3992       break;
3993   }
3994 
3995   dprintf(fd, "  Peer: %s\n", ADDRESS_TO_LOGGABLE_CSTR(peer.PeerAddress()));
3996   dprintf(fd, "    Connected: %s\n", peer.IsConnected() ? "true" : "false");
3997   dprintf(fd, "    Streaming: %s\n", peer.IsStreaming() ? "true" : "false");
3998   dprintf(fd, "    SEP: %d(%s)\n", peer.PeerSep(), (peer.IsSource()) ? "Source" : "Sink");
3999   dprintf(fd, "    State Machine: %s\n", state_str.c_str());
4000   dprintf(fd, "    Flags: %s\n", peer.FlagsToString().c_str());
4001   dprintf(fd, "    OpenOnRcTimer: %s\n",
4002           alarm_is_scheduled(peer.AvOpenOnRcTimer()) ? "Scheduled" : "Not scheduled");
4003   dprintf(fd, "    BTA Handle: 0x%x\n", peer.BtaHandle());
4004   dprintf(fd, "    Peer ID: %d\n", peer.PeerId());
4005   dprintf(fd, "    EDR: %s\n", peer.IsEdr() ? "true" : "false");
4006   dprintf(fd, "    Support 3Mbps: %s\n", peer.Is3Mbps() ? "true" : "false");
4007   dprintf(fd, "    Self Initiated Connection: %s\n",
4008           peer.SelfInitiatedConnection() ? "true" : "false");
4009   dprintf(fd, "    Delay Reporting: %u (in 1/10 milliseconds) \n", peer.GetDelayReport());
4010   dprintf(fd, "    Codec Preferred: %s\n",
4011           peer.IsMandatoryCodecPreferred() ? "Mandatory" : "Optional");
4012 }
4013 
btif_debug_av_source_dump(int fd)4014 static void btif_debug_av_source_dump(int fd) {
4015   bool enabled = btif_av_source.Enabled();
4016 
4017   dprintf(fd, "\nA2DP Source State: %s\n", (enabled) ? "Enabled" : "Disabled");
4018   if (!enabled) {
4019     return;
4020   }
4021   dprintf(fd, "  Active peer: %s\n", ADDRESS_TO_LOGGABLE_CSTR(btif_av_source.ActivePeer()));
4022   dprintf(fd, "  Peers:\n");
4023   btif_av_source.DumpPeersInfo(fd);
4024 }
4025 
btif_debug_av_sink_dump(int fd)4026 static void btif_debug_av_sink_dump(int fd) {
4027   bool enabled = btif_av_sink.Enabled();
4028 
4029   dprintf(fd, "\nA2DP Sink State: %s\n", (enabled) ? "Enabled" : "Disabled");
4030   if (!enabled) {
4031     return;
4032   }
4033   dprintf(fd, "  Active peer: %s\n", ADDRESS_TO_LOGGABLE_CSTR(btif_av_sink.ActivePeer()));
4034   dprintf(fd, "  Peers:\n");
4035   btif_av_sink.DumpPeersInfo(fd);
4036 }
4037 
btif_debug_av_dump(int fd)4038 void btif_debug_av_dump(int fd) {
4039   btif_debug_av_source_dump(fd);
4040   btif_debug_av_sink_dump(fd);
4041 }
4042 
btif_av_set_audio_delay(const RawAddress & peer_address,uint16_t delay,const A2dpType local_a2dp_type)4043 void btif_av_set_audio_delay(const RawAddress& peer_address, uint16_t delay,
4044                              const A2dpType local_a2dp_type) {
4045   log::info("peer={} delay={}", peer_address, delay);
4046 
4047   BtifAvPeer* peer = btif_av_find_peer(peer_address, local_a2dp_type);
4048   if (peer != nullptr && peer->IsSink()) {
4049     peer->SetDelayReport(delay);
4050     if (peer->IsActivePeer()) {
4051       bluetooth::audio::a2dp::set_remote_delay(peer->GetDelayReport());
4052     }
4053   }
4054 }
4055 
btif_av_get_audio_delay(const A2dpType local_a2dp_type)4056 uint16_t btif_av_get_audio_delay(const A2dpType local_a2dp_type) {
4057   BtifAvPeer* peer = btif_av_find_active_peer(local_a2dp_type);
4058   if (peer != nullptr && peer->IsSink()) {
4059     return peer->GetDelayReport();
4060   }
4061   return 0;
4062 }
4063 
btif_av_is_a2dp_offload_enabled()4064 bool btif_av_is_a2dp_offload_enabled() { return btif_av_source.A2dpOffloadEnabled(); }
4065 
btif_av_is_a2dp_offload_running()4066 bool btif_av_is_a2dp_offload_running() {
4067   if (!btif_av_is_a2dp_offload_enabled()) {
4068     return false;
4069   }
4070   if (!bluetooth::audio::a2dp::is_hal_enabled()) {
4071     return false;
4072   }
4073   return bluetooth::audio::a2dp::is_hal_offloading();
4074 }
4075 
btif_av_is_peer_silenced(const RawAddress & peer_address)4076 bool btif_av_is_peer_silenced(const RawAddress& peer_address) {
4077   return btif_av_source.IsPeerSilenced(peer_address);
4078 }
4079 
btif_av_set_dynamic_audio_buffer_size(uint8_t dynamic_audio_buffer_size)4080 void btif_av_set_dynamic_audio_buffer_size(uint8_t dynamic_audio_buffer_size) {
4081   btif_a2dp_source_set_dynamic_audio_buffer_size(dynamic_audio_buffer_size);
4082 }
4083 
btif_av_set_low_latency(bool is_low_latency)4084 void btif_av_set_low_latency(bool is_low_latency) {
4085   log::info("active_peer={} is_low_latency={}", btif_av_source_active_peer(), is_low_latency);
4086 
4087   btif_av_set_latency_req_t set_latency_req;
4088   set_latency_req.is_low_latency = is_low_latency;
4089   BtifAvEvent btif_av_event(BTIF_AV_SET_LATENCY_REQ_EVT, &set_latency_req, sizeof(set_latency_req));
4090 
4091   do_in_main_thread(base::BindOnce(&btif_av_handle_event,
4092                                    AVDT_TSEP_SNK,  // peer_sep
4093                                    btif_av_source_active_peer(), kBtaHandleUnknown, btif_av_event));
4094 }
4095 
btif_av_is_connected_addr(const RawAddress & peer_address,const A2dpType local_a2dp_type)4096 bool btif_av_is_connected_addr(const RawAddress& peer_address, const A2dpType local_a2dp_type) {
4097   BtifAvPeer* peer = btif_av_find_peer(peer_address, local_a2dp_type);
4098   if (peer == nullptr) {
4099     log::warn("No active peer found");
4100     return false;
4101   }
4102 
4103   bool connected = peer->IsConnected();
4104   log::verbose("active_peer={} connected={}", peer->PeerAddress(), connected);
4105   return connected;
4106 }
4107 
btif_av_peer_is_connected_sink(const RawAddress & peer_address)4108 bool btif_av_peer_is_connected_sink(const RawAddress& peer_address) {
4109   BtifAvPeer* peer = btif_av_source_find_peer(peer_address);
4110   if (peer == nullptr) {
4111     log::warn("No active peer found");
4112     return false;
4113   }
4114 
4115   bool connected = peer->IsConnected();
4116   log::verbose("active_peer={} connected={}", peer->PeerAddress(), connected);
4117   return connected;
4118 }
4119 
btif_av_peer_is_connected_source(const RawAddress & peer_address)4120 bool btif_av_peer_is_connected_source(const RawAddress& peer_address) {
4121   BtifAvPeer* peer = btif_av_sink_find_peer(peer_address);
4122   if (peer == nullptr) {
4123     log::warn("No active peer found");
4124     return false;
4125   }
4126 
4127   bool connected = peer->IsConnected();
4128   log::verbose("active_peer={} connected={}", peer->PeerAddress(), connected);
4129   return connected;
4130 }
4131 
btif_av_peer_is_sink(const RawAddress & peer_address)4132 bool btif_av_peer_is_sink(const RawAddress& peer_address) {
4133   BtifAvPeer* peer = btif_av_source_find_peer(peer_address);
4134   if (peer == nullptr) {
4135     log::warn("No active peer found");
4136     return false;
4137   }
4138 
4139   return true;
4140 }
4141 
btif_av_peer_is_source(const RawAddress & peer_address)4142 bool btif_av_peer_is_source(const RawAddress& peer_address) {
4143   BtifAvPeer* peer = btif_av_sink_find_peer(peer_address);
4144   if (peer == nullptr) {
4145     log::warn("No active peer found");
4146     return false;
4147   }
4148 
4149   return true;
4150 }
4151 
btif_av_connect_sink_delayed(uint8_t handle,const RawAddress & peer_address)4152 void btif_av_connect_sink_delayed(uint8_t handle, const RawAddress& peer_address) {
4153   log::info("peer={} handle=0x{:x}", peer_address, handle);
4154 
4155   if (btif_av_source.Enabled()) {
4156     btif_av_source_dispatch_sm_event(peer_address, BTIF_AV_AVRCP_OPEN_EVT);
4157   }
4158 }
4159