Home | History | Annotate | Download | only in src
      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 "btif_av"
     20 
     21 #include "btif_av.h"
     22 
     23 #include <base/bind.h>
     24 #include <base/logging.h>
     25 #include <base/strings/stringprintf.h>
     26 #include <string.h>
     27 #include <map>
     28 
     29 #include <hardware/bluetooth.h>
     30 #include <hardware/bt_av.h>
     31 #include <hardware/bt_rc.h>
     32 
     33 #include "audio_a2dp_hw/include/audio_a2dp_hw.h"
     34 #include "bt_common.h"
     35 #include "bt_utils.h"
     36 #include "bta/include/bta_api.h"
     37 #include "bta/include/bta_closure_api.h"
     38 #include "btif/include/btif_a2dp_source.h"
     39 #include "btif_a2dp.h"
     40 #include "btif_a2dp_audio_interface.h"
     41 #include "btif_a2dp_control.h"
     42 #include "btif_a2dp_sink.h"
     43 #include "btif_av_co.h"
     44 #include "btif_profile_queue.h"
     45 #include "btif_rc.h"
     46 #include "btif_state_machine.h"
     47 #include "btif_util.h"
     48 #include "btu.h"
     49 #include "osi/include/allocator.h"
     50 #include "osi/include/osi.h"
     51 #include "osi/include/properties.h"
     52 
     53 /*****************************************************************************
     54  *  Constants & Macros
     55  *****************************************************************************/
     56 static const std::string kBtifAvSourceServiceName = "Advanced Audio Source";
     57 static const std::string kBtifAvSinkServiceName = "Advanced Audio Sink";
     58 static constexpr int kDefaultMaxConnectedAudioDevices = 1;
     59 static constexpr tBTA_AV_HNDL kBtaHandleUnknown = 0;
     60 
     61 /*****************************************************************************
     62  *  Local type definitions
     63  *****************************************************************************/
     64 
     65 typedef struct {
     66   int sample_rate;
     67   int channel_count;
     68   RawAddress peer_address;
     69 } btif_av_sink_config_req_t;
     70 
     71 /**
     72  * BTIF AV events
     73  */
     74 typedef enum {
     75   /* Reuse BTA_AV_XXX_EVT - No need to redefine them here */
     76   BTIF_AV_CONNECT_REQ_EVT = BTA_AV_MAX_EVT,
     77   BTIF_AV_DISCONNECT_REQ_EVT,
     78   BTIF_AV_START_STREAM_REQ_EVT,
     79   BTIF_AV_STOP_STREAM_REQ_EVT,
     80   BTIF_AV_SUSPEND_STREAM_REQ_EVT,
     81   BTIF_AV_SINK_CONFIG_REQ_EVT,
     82   BTIF_AV_ACL_DISCONNECTED,
     83   BTIF_AV_OFFLOAD_START_REQ_EVT,
     84   BTIF_AV_AVRCP_OPEN_EVT,
     85   BTIF_AV_AVRCP_CLOSE_EVT,
     86   BTIF_AV_AVRCP_REMOTE_PLAY_EVT,
     87 } btif_av_sm_event_t;
     88 
     89 class BtifAvEvent {
     90  public:
     91   BtifAvEvent(uint32_t event, const void* p_data, size_t data_length);
     92   BtifAvEvent(const BtifAvEvent& other);
     93   BtifAvEvent() = delete;
     94   ~BtifAvEvent();
     95   BtifAvEvent& operator=(const BtifAvEvent& other);
     96 
     97   uint32_t Event() const { return event_; }
     98   void* Data() const { return data_; }
     99   size_t DataLength() const { return data_length_; }
    100   std::string ToString() const;
    101   static std::string EventName(uint32_t event);
    102 
    103  private:
    104   void DeepCopy(uint32_t event, const void* p_data, size_t data_length);
    105   void DeepFree();
    106 
    107   uint32_t event_;
    108   void* data_;
    109   size_t data_length_;
    110 };
    111 
    112 class BtifAvPeer;
    113 
    114 // Should not need dedicated Suspend state as actual actions are no
    115 // different than Open state. Suspend flags are needed however to prevent
    116 // media task from trying to restart stream during remote Suspend or while
    117 // we are in the process of a local Suspend.
    118 class BtifAvStateMachine : public BtifStateMachine {
    119  public:
    120   enum {
    121     kStateIdle,     // AVDTP disconnected
    122     kStateOpening,  // Opening AVDTP connection
    123     kStateOpened,   // AVDTP is in OPEN state
    124     kStateStarted,  // A2DP stream started
    125     kStateClosing,  // Closing AVDTP connection
    126   };
    127 
    128   class StateIdle : public State {
    129    public:
    130     StateIdle(BtifAvStateMachine& sm)
    131         : State(sm, kStateIdle), peer_(sm.Peer()) {}
    132     void OnEnter() override;
    133     void OnExit() override;
    134     bool ProcessEvent(uint32_t event, void* p_data) override;
    135 
    136    private:
    137     BtifAvPeer& peer_;
    138   };
    139 
    140   class StateOpening : public State {
    141    public:
    142     StateOpening(BtifAvStateMachine& sm)
    143         : State(sm, kStateOpening), peer_(sm.Peer()) {}
    144     void OnEnter() override;
    145     void OnExit() override;
    146     bool ProcessEvent(uint32_t event, void* p_data) override;
    147 
    148    private:
    149     BtifAvPeer& peer_;
    150   };
    151 
    152   class StateOpened : public State {
    153    public:
    154     StateOpened(BtifAvStateMachine& sm)
    155         : State(sm, kStateOpened), peer_(sm.Peer()) {}
    156     void OnEnter() override;
    157     void OnExit() override;
    158     bool ProcessEvent(uint32_t event, void* p_data) override;
    159 
    160    private:
    161     BtifAvPeer& peer_;
    162   };
    163 
    164   class StateStarted : public State {
    165    public:
    166     StateStarted(BtifAvStateMachine& sm)
    167         : State(sm, kStateStarted), peer_(sm.Peer()) {}
    168     void OnEnter() override;
    169     void OnExit() override;
    170     bool ProcessEvent(uint32_t event, void* p_data) override;
    171 
    172    private:
    173     BtifAvPeer& peer_;
    174   };
    175 
    176   class StateClosing : public State {
    177    public:
    178     StateClosing(BtifAvStateMachine& sm)
    179         : State(sm, kStateClosing), peer_(sm.Peer()) {}
    180     void OnEnter() override;
    181     void OnExit() override;
    182     bool ProcessEvent(uint32_t event, void* p_data) override;
    183 
    184    private:
    185     BtifAvPeer& peer_;
    186   };
    187 
    188   BtifAvStateMachine(BtifAvPeer& btif_av_peer) : peer_(btif_av_peer) {
    189     state_idle_ = new StateIdle(*this);
    190     state_opening_ = new StateOpening(*this);
    191     state_opened_ = new StateOpened(*this);
    192     state_started_ = new StateStarted(*this);
    193     state_closing_ = new StateClosing(*this);
    194 
    195     AddState(state_idle_);
    196     AddState(state_opening_);
    197     AddState(state_opened_);
    198     AddState(state_started_);
    199     AddState(state_closing_);
    200     SetInitialState(state_idle_);
    201   }
    202 
    203   BtifAvPeer& Peer() { return peer_; }
    204 
    205  private:
    206   BtifAvPeer& peer_;
    207   StateIdle* state_idle_;
    208   StateOpening* state_opening_;
    209   StateOpened* state_opened_;
    210   StateStarted* state_started_;
    211   StateClosing* state_closing_;
    212 };
    213 
    214 class BtifAvPeer {
    215  public:
    216   enum {
    217     kFlagLocalSuspendPending = 0x1,
    218     kFlagRemoteSuspend = 0x2,
    219     kFlagPendingStart = 0x4,
    220     kFlagPendingStop = 0x8,
    221   };
    222   static constexpr period_ms_t kTimeoutAvOpenOnRcMs = 2 * 1000;  // 2s
    223 
    224   BtifAvPeer(const RawAddress& peer_address, uint8_t peer_sep,
    225              tBTA_AV_HNDL bta_handle, uint8_t peer_id);
    226   ~BtifAvPeer();
    227 
    228   bt_status_t Init();
    229   void Cleanup();
    230 
    231   /**
    232    * Check whether the peer can be deleted.
    233    *
    234    * @return true if the pair can be deleted, otherwise false
    235    */
    236   bool CanBeDeleted() const;
    237 
    238   /**
    239    * Check whether the peer is the active one.
    240    *
    241    * @return true if this peer is the active one
    242    */
    243   bool IsActivePeer() const { return (PeerAddress() == ActivePeerAddress()); }
    244 
    245   /**
    246    * Get the address of the active peer.
    247    *
    248    * @return the address of the active peer
    249    */
    250   const RawAddress& ActivePeerAddress() const;
    251 
    252   const RawAddress& PeerAddress() const { return peer_address_; }
    253   bool IsSource() const { return (peer_sep_ == AVDT_TSEP_SRC); }
    254   bool IsSink() const { return (peer_sep_ == AVDT_TSEP_SNK); }
    255   uint8_t PeerSep() const { return peer_sep_; }
    256   /**
    257    * Get the local device's Service Class UUID
    258    *
    259    * @return the local device's Service Class UUID: UUID_SERVCLASS_AUDIO_SOURCE
    260    * or UUID_SERVCLASS_AUDIO_SINK
    261    */
    262   uint16_t LocalUuidServiceClass() const {
    263     return (IsSink() ? UUID_SERVCLASS_AUDIO_SOURCE : UUID_SERVCLASS_AUDIO_SINK);
    264   }
    265   tBTA_AV_HNDL BtaHandle() const { return bta_handle_; }
    266   void SetBtaHandle(tBTA_AV_HNDL bta_handle) { bta_handle_ = bta_handle; }
    267   uint8_t PeerId() const { return peer_id_; }
    268 
    269   BtifAvStateMachine& StateMachine() { return state_machine_; }
    270   const BtifAvStateMachine& StateMachine() const { return state_machine_; }
    271   alarm_t* AvOpenOnRcTimer() { return av_open_on_rc_timer_; }
    272   const alarm_t* AvOpenOnRcTimer() const { return av_open_on_rc_timer_; }
    273 
    274   void SetEdr(tBTA_AV_EDR edr) { edr_ = edr; }
    275   bool IsEdr() const { return (edr_ != 0); }
    276   bool Is3Mbps() const { return ((edr_ & BTA_AV_EDR_3MBPS) != 0); }
    277 
    278   bool IsConnected() const;
    279   bool IsStreaming() const;
    280 
    281   /**
    282    * Check whether any of the flags specified by the bitlags mask is set.
    283    *
    284    * @param bitflags_mask the bitflags to check
    285    * @return true if any of the flags to check is set, otherwise false.
    286    */
    287   bool CheckFlags(uint8_t bitflags_mask) const {
    288     return ((flags_ & bitflags_mask) != 0);
    289   }
    290 
    291   /**
    292    * Set only the flags as specified by the bitflags mask.
    293    *
    294    * @param bitflags_mask the bitflags to set
    295    */
    296   void SetFlags(uint8_t bitflags_mask) { flags_ |= bitflags_mask; }
    297 
    298   /**
    299    * Clear only the flags as specified by the bitflags mask.
    300    *
    301    * @param bitflags_mask the bitflags to clear
    302    */
    303   void ClearFlags(uint8_t bitflags_mask) { flags_ &= ~bitflags_mask; }
    304 
    305   /**
    306    * Clear all flags.
    307    */
    308   void ClearAllFlags() { flags_ = 0; }
    309 
    310   /**
    311    * Get a string representation of the flags that are set.
    312    */
    313   std::string FlagsToString() const;
    314 
    315   bool SelfInitiatedConnection() const { return self_initiated_connection_; }
    316   void SetSelfInitiatedConnection(bool v) { self_initiated_connection_ = v; }
    317 
    318  private:
    319   const RawAddress peer_address_;
    320   const uint8_t peer_sep_;  // SEP type of peer device
    321   tBTA_AV_HNDL bta_handle_;
    322   const uint8_t peer_id_;
    323   BtifAvStateMachine state_machine_;
    324   alarm_t* av_open_on_rc_timer_;
    325   tBTA_AV_EDR edr_;
    326   uint8_t flags_;
    327   bool self_initiated_connection_;
    328 };
    329 
    330 class BtifAvSource {
    331  public:
    332   // The PeerId is used as AppId for BTA_AvRegister() purpose
    333   static constexpr uint8_t kPeerIdMin = 0;
    334   static constexpr uint8_t kPeerIdMax = BTA_AV_NUM_STRS;
    335 
    336   BtifAvSource()
    337       : callbacks_(nullptr),
    338         enabled_(false),
    339         a2dp_offload_enabled_(false),
    340         max_connected_peers_(kDefaultMaxConnectedAudioDevices) {}
    341   ~BtifAvSource();
    342 
    343   bt_status_t Init(
    344       btav_source_callbacks_t* callbacks, int max_connected_audio_devices,
    345       const std::vector<btav_a2dp_codec_config_t>& codec_priorities);
    346   void Cleanup();
    347 
    348   btav_source_callbacks_t* Callbacks() { return callbacks_; }
    349   bool Enabled() const { return enabled_; }
    350   bool A2dpOffloadEnabled() const { return a2dp_offload_enabled_; }
    351 
    352   BtifAvPeer* FindPeer(const RawAddress& peer_address);
    353   BtifAvPeer* FindPeerByHandle(tBTA_AV_HNDL bta_handle);
    354   BtifAvPeer* FindPeerByPeerId(uint8_t peer_id);
    355   BtifAvPeer* FindOrCreatePeer(const RawAddress& peer_address,
    356                                tBTA_AV_HNDL bta_handle);
    357 
    358   /**
    359    * Check whether a connection to a peer is allowed.
    360    * The check considers the maximum number of connected peers.
    361    *
    362    * @param peer_address the peer address to connect to
    363    * @return true if connection is allowed, otherwise false
    364    */
    365   bool AllowedToConnect(const RawAddress& peer_address) const;
    366 
    367   /**
    368    * Delete a peer.
    369    *
    370    * @param peer_address the peer to delete
    371    * @return true on success, otherwise false
    372    */
    373   bool DeletePeer(const RawAddress& peer_address);
    374 
    375   /**
    376    * Delete all peers that have transitioned to Idle state and can be deleted.
    377    * If a peer was just created/initialized, then it cannot be deleted yet.
    378    */
    379   void DeleteIdlePeers();
    380 
    381   /**
    382    * Get the active peer.
    383    *
    384    * @return the active peer
    385    */
    386   const RawAddress& ActivePeer() const { return active_peer_; }
    387 
    388   /**
    389    * Set the active peer.
    390    *
    391    * @param peer_address the active peer address or RawAddress::kEmpty to
    392    * reset the active peer
    393    * @return true on success, otherwise false
    394    */
    395   bool SetActivePeer(const RawAddress& peer_address) {
    396     LOG_INFO(LOG_TAG, "%s: peer: %s", __PRETTY_FUNCTION__,
    397              peer_address.ToString().c_str());
    398 
    399     if (active_peer_ == peer_address) return true;  // Nothing has changed
    400     if (peer_address.IsEmpty()) {
    401       BTIF_TRACE_EVENT("%s: peer address is empty, shutdown the Audio source",
    402                        __func__);
    403       if (!bta_av_co_set_active_peer(peer_address)) {
    404         BTIF_TRACE_WARNING("%s: unable to set active peer to empty in BtaAvCo",
    405                            __func__);
    406       }
    407       btif_a2dp_source_end_session(active_peer_);
    408       btif_a2dp_source_shutdown();
    409       active_peer_ = peer_address;
    410       return true;
    411     }
    412 
    413     BtifAvPeer* peer = FindPeer(peer_address);
    414     if (peer != nullptr && !peer->IsConnected()) {
    415       BTIF_TRACE_ERROR("%s: Error setting %s as active Source peer", __func__,
    416                        peer->PeerAddress().ToString().c_str());
    417       return false;
    418     }
    419 
    420     if (!btif_a2dp_source_restart_session(active_peer_, peer_address)) {
    421       return false;
    422     }
    423     active_peer_ = peer_address;
    424     return true;
    425   }
    426 
    427   /**
    428    * Update source codec configuration for a peer.
    429    *
    430    * @param peer_address the address of the peer to update
    431    * @param codec_preferences the updated codec preferences
    432    */
    433   void UpdateCodecConfig(
    434       const RawAddress& peer_address,
    435       const std::vector<btav_a2dp_codec_config_t>& codec_preferences) {
    436     // Restart the session if the codec for the active peer is updated
    437     bool restart_session =
    438         ((active_peer_ == peer_address) && !active_peer_.IsEmpty());
    439     if (restart_session) {
    440       btif_a2dp_source_end_session(active_peer_);
    441     }
    442 
    443     for (auto cp : codec_preferences) {
    444       BTIF_TRACE_DEBUG("%s: codec_preference=%s", __func__,
    445                        cp.ToString().c_str());
    446       btif_a2dp_source_encoder_user_config_update_req(peer_address, cp);
    447     }
    448     if (restart_session) {
    449       btif_a2dp_source_start_session(active_peer_);
    450     }
    451   }
    452 
    453   const std::map<RawAddress, BtifAvPeer*>& Peers() const { return peers_; }
    454 
    455   void RegisterAllBtaHandles();
    456   void DeregisterAllBtaHandles();
    457   void BtaHandleRegistered(uint8_t peer_id, tBTA_AV_HNDL bta_handle);
    458 
    459  private:
    460   void CleanupAllPeers();
    461 
    462   btav_source_callbacks_t* callbacks_;
    463   bool enabled_;
    464   bool a2dp_offload_enabled_;
    465   int max_connected_peers_;
    466   std::map<RawAddress, BtifAvPeer*> peers_;
    467   RawAddress active_peer_;
    468   std::map<uint8_t, tBTA_AV_HNDL> peer_id2bta_handle_;
    469 };
    470 
    471 class BtifAvSink {
    472  public:
    473   // The PeerId is used as AppId for BTA_AvRegister() purpose
    474   static constexpr uint8_t kPeerIdMin = 0;
    475   static constexpr uint8_t kPeerIdMax = BTA_AV_NUM_STRS;
    476 
    477   BtifAvSink()
    478       : callbacks_(nullptr),
    479         enabled_(false),
    480         max_connected_peers_(kDefaultMaxConnectedAudioDevices) {}
    481   ~BtifAvSink();
    482 
    483   bt_status_t Init(btav_sink_callbacks_t* callbacks);
    484   void Cleanup();
    485 
    486   btav_sink_callbacks_t* Callbacks() { return callbacks_; }
    487   bool Enabled() const { return enabled_; }
    488 
    489   BtifAvPeer* FindPeer(const RawAddress& peer_address);
    490   BtifAvPeer* FindPeerByHandle(tBTA_AV_HNDL bta_handle);
    491   BtifAvPeer* FindPeerByPeerId(uint8_t peer_id);
    492   BtifAvPeer* FindOrCreatePeer(const RawAddress& peer_address,
    493                                tBTA_AV_HNDL bta_handle);
    494 
    495   /**
    496    * Check whether a connection to a peer is allowed.
    497    * The check considers the maximum number of connected peers.
    498    *
    499    * @param peer_address the peer address to connect to
    500    * @return true if connection is allowed, otherwise false
    501    */
    502   bool AllowedToConnect(const RawAddress& peer_address) const;
    503 
    504   /**
    505    * Delete a peer.
    506    *
    507    * @param peer_address the peer to delete
    508    * @return true on success, otherwise false
    509    */
    510   bool DeletePeer(const RawAddress& peer_address);
    511 
    512   /**
    513    * Delete all peers that have transitioned to Idle state and can be deleted.
    514    * If a peer was just created/initialized, then it cannot be deleted yet.
    515    */
    516   void DeleteIdlePeers();
    517 
    518   /**
    519    * Get the active peer.
    520    *
    521    * @return the active peer
    522    */
    523   const RawAddress& ActivePeer() const { return active_peer_; }
    524 
    525   /**
    526    * Set the active peer.
    527    *
    528    * @param peer_address the active peer address or RawAddress::kEmpty to
    529    * reset the active peer
    530    * @return true on success, otherwise false
    531    */
    532   bool SetActivePeer(const RawAddress& peer_address) {
    533     LOG_INFO(LOG_TAG, "%s: peer: %s", __PRETTY_FUNCTION__,
    534              peer_address.ToString().c_str());
    535 
    536     if (active_peer_ == peer_address) return true;  // Nothing has changed
    537     if (peer_address.IsEmpty()) {
    538       BTIF_TRACE_EVENT("%s: peer address is empty, shutdown the Audio sink",
    539                        __func__);
    540       if (!bta_av_co_set_active_peer(peer_address)) {
    541         BTIF_TRACE_WARNING("%s: unable to set active peer to empty in BtaAvCo",
    542                            __func__);
    543       }
    544       btif_a2dp_sink_end_session(active_peer_);
    545       btif_a2dp_sink_shutdown();
    546       active_peer_ = peer_address;
    547       return true;
    548     }
    549 
    550     BtifAvPeer* peer = FindPeer(peer_address);
    551     if (peer != nullptr && !peer->IsConnected()) {
    552       BTIF_TRACE_ERROR("%s: Error setting %s as active Sink peer", __func__,
    553                        peer->PeerAddress().ToString().c_str());
    554       return false;
    555     }
    556 
    557     if (!btif_a2dp_sink_restart_session(active_peer_, peer_address)) {
    558       return false;
    559     }
    560     active_peer_ = peer_address;
    561     return true;
    562   }
    563 
    564   const std::map<RawAddress, BtifAvPeer*>& Peers() const { return peers_; }
    565 
    566   void RegisterAllBtaHandles();
    567   void DeregisterAllBtaHandles();
    568   void BtaHandleRegistered(uint8_t peer_id, tBTA_AV_HNDL bta_handle);
    569 
    570  private:
    571   void CleanupAllPeers();
    572 
    573   btav_sink_callbacks_t* callbacks_;
    574   bool enabled_;
    575   int max_connected_peers_;
    576   std::map<RawAddress, BtifAvPeer*> peers_;
    577   RawAddress active_peer_;
    578   std::map<uint8_t, tBTA_AV_HNDL> peer_id2bta_handle_;
    579 };
    580 
    581 /*****************************************************************************
    582  *  Static variables
    583  *****************************************************************************/
    584 static BtifAvSource btif_av_source;
    585 static BtifAvSink btif_av_sink;
    586 
    587 /* Helper macro to avoid code duplication in the state machine handlers */
    588 #define CHECK_RC_EVENT(e, d)       \
    589   case BTA_AV_RC_OPEN_EVT:         \
    590   case BTA_AV_RC_BROWSE_OPEN_EVT:  \
    591   case BTA_AV_RC_CLOSE_EVT:        \
    592   case BTA_AV_RC_BROWSE_CLOSE_EVT: \
    593   case BTA_AV_REMOTE_CMD_EVT:      \
    594   case BTA_AV_VENDOR_CMD_EVT:      \
    595   case BTA_AV_META_MSG_EVT:        \
    596   case BTA_AV_RC_FEAT_EVT:         \
    597   case BTA_AV_REMOTE_RSP_EVT: {    \
    598     btif_rc_handler(e, d);         \
    599   } break;
    600 
    601 static bt_status_t src_disconnect_sink(const RawAddress& peer_address);
    602 static bt_status_t sink_disconnect_src(const RawAddress& peer_address);
    603 static void btif_av_source_dispatch_sm_event(const RawAddress& peer_address,
    604                                              btif_av_sm_event_t event);
    605 static void btif_av_sink_dispatch_sm_event(const RawAddress& peer_address,
    606                                            btif_av_sm_event_t event);
    607 static void btif_av_handle_event(uint8_t peer_sep,
    608                                  const RawAddress& peer_address,
    609                                  tBTA_AV_HNDL bta_handle,
    610                                  const BtifAvEvent& btif_av_event);
    611 static void btif_report_connection_state(const RawAddress& peer_address,
    612                                          btav_connection_state_t state);
    613 static void btif_report_audio_state(const RawAddress& peer_address,
    614                                     btav_audio_state_t state);
    615 static void btif_av_report_sink_audio_config_state(
    616     const RawAddress& peer_address, int sample_rate, int channel_count);
    617 static void btif_av_source_initiate_av_open_timer_timeout(void* data);
    618 static void btif_av_sink_initiate_av_open_timer_timeout(void* data);
    619 static void bta_av_sink_media_callback(tBTA_AV_EVT event,
    620                                        tBTA_AV_MEDIA* p_data);
    621 
    622 static BtifAvPeer* btif_av_source_find_peer(const RawAddress& peer_address) {
    623   return btif_av_source.FindPeer(peer_address);
    624 }
    625 static BtifAvPeer* btif_av_sink_find_peer(const RawAddress& peer_address) {
    626   return btif_av_sink.FindPeer(peer_address);
    627 }
    628 static BtifAvPeer* btif_av_find_peer(const RawAddress& peer_address) {
    629   if (btif_av_source.Enabled()) return btif_av_source_find_peer(peer_address);
    630   if (btif_av_sink.Enabled()) return btif_av_sink_find_peer(peer_address);
    631   return nullptr;
    632 }
    633 static BtifAvPeer* btif_av_find_active_peer() {
    634   if (btif_av_source.Enabled())
    635     return btif_av_source_find_peer(btif_av_source.ActivePeer());
    636   if (btif_av_sink.Enabled())
    637     return btif_av_sink_find_peer(btif_av_sink.ActivePeer());
    638   return nullptr;
    639 }
    640 
    641 /*****************************************************************************
    642  * Local helper functions
    643  *****************************************************************************/
    644 
    645 const char* dump_av_sm_event_name(btif_av_sm_event_t event) {
    646   switch ((int)event) {
    647     CASE_RETURN_STR(BTA_AV_ENABLE_EVT)
    648     CASE_RETURN_STR(BTA_AV_REGISTER_EVT)
    649     CASE_RETURN_STR(BTA_AV_OPEN_EVT)
    650     CASE_RETURN_STR(BTA_AV_CLOSE_EVT)
    651     CASE_RETURN_STR(BTA_AV_START_EVT)
    652     CASE_RETURN_STR(BTA_AV_STOP_EVT)
    653     CASE_RETURN_STR(BTA_AV_PROTECT_REQ_EVT)
    654     CASE_RETURN_STR(BTA_AV_PROTECT_RSP_EVT)
    655     CASE_RETURN_STR(BTA_AV_RC_OPEN_EVT)
    656     CASE_RETURN_STR(BTA_AV_RC_CLOSE_EVT)
    657     CASE_RETURN_STR(BTA_AV_RC_BROWSE_OPEN_EVT)
    658     CASE_RETURN_STR(BTA_AV_RC_BROWSE_CLOSE_EVT)
    659     CASE_RETURN_STR(BTA_AV_REMOTE_CMD_EVT)
    660     CASE_RETURN_STR(BTA_AV_REMOTE_RSP_EVT)
    661     CASE_RETURN_STR(BTA_AV_VENDOR_CMD_EVT)
    662     CASE_RETURN_STR(BTA_AV_VENDOR_RSP_EVT)
    663     CASE_RETURN_STR(BTA_AV_RECONFIG_EVT)
    664     CASE_RETURN_STR(BTA_AV_SUSPEND_EVT)
    665     CASE_RETURN_STR(BTA_AV_PENDING_EVT)
    666     CASE_RETURN_STR(BTA_AV_META_MSG_EVT)
    667     CASE_RETURN_STR(BTA_AV_REJECT_EVT)
    668     CASE_RETURN_STR(BTA_AV_RC_FEAT_EVT)
    669     CASE_RETURN_STR(BTA_AV_OFFLOAD_START_RSP_EVT)
    670     CASE_RETURN_STR(BTIF_AV_CONNECT_REQ_EVT)
    671     CASE_RETURN_STR(BTIF_AV_DISCONNECT_REQ_EVT)
    672     CASE_RETURN_STR(BTIF_AV_START_STREAM_REQ_EVT)
    673     CASE_RETURN_STR(BTIF_AV_STOP_STREAM_REQ_EVT)
    674     CASE_RETURN_STR(BTIF_AV_SUSPEND_STREAM_REQ_EVT)
    675     CASE_RETURN_STR(BTIF_AV_SINK_CONFIG_REQ_EVT)
    676     CASE_RETURN_STR(BTIF_AV_ACL_DISCONNECTED)
    677     CASE_RETURN_STR(BTIF_AV_OFFLOAD_START_REQ_EVT)
    678     CASE_RETURN_STR(BTIF_AV_AVRCP_OPEN_EVT)
    679     CASE_RETURN_STR(BTIF_AV_AVRCP_CLOSE_EVT)
    680     CASE_RETURN_STR(BTIF_AV_AVRCP_REMOTE_PLAY_EVT)
    681     default:
    682       return "UNKNOWN_EVENT";
    683   }
    684 }
    685 
    686 BtifAvEvent::BtifAvEvent(uint32_t event, const void* p_data, size_t data_length)
    687     : event_(event), data_(nullptr), data_length_(0) {
    688   DeepCopy(event, p_data, data_length);
    689 }
    690 
    691 BtifAvEvent::BtifAvEvent(const BtifAvEvent& other)
    692     : event_(0), data_(nullptr), data_length_(0) {
    693   *this = other;
    694 }
    695 
    696 BtifAvEvent& BtifAvEvent::operator=(const BtifAvEvent& other) {
    697   DeepFree();
    698   DeepCopy(other.Event(), other.Data(), other.DataLength());
    699   return *this;
    700 }
    701 
    702 BtifAvEvent::~BtifAvEvent() { DeepFree(); }
    703 
    704 std::string BtifAvEvent::ToString() const {
    705   return BtifAvEvent::EventName(event_);
    706 }
    707 
    708 std::string BtifAvEvent::EventName(uint32_t event) {
    709   std::string name = dump_av_sm_event_name((btif_av_sm_event_t)event);
    710   std::stringstream ss_value;
    711   ss_value << "(0x" << std::hex << event << ")";
    712   return name + ss_value.str();
    713 }
    714 
    715 void BtifAvEvent::DeepCopy(uint32_t event, const void* p_data,
    716                            size_t data_length) {
    717   event_ = event;
    718   data_length_ = data_length;
    719   if (data_length == 0) {
    720     data_ = nullptr;
    721   } else {
    722     data_ = osi_malloc(data_length_);
    723     memcpy(data_, p_data, data_length);
    724   }
    725 
    726   switch (event) {
    727     case BTA_AV_META_MSG_EVT: {
    728       CHECK(data_length >= sizeof(tBTA_AV));
    729       const tBTA_AV* av_src = (const tBTA_AV*)p_data;
    730       tBTA_AV* av_dest = (tBTA_AV*)data_;
    731       if (av_src->meta_msg.p_data && av_src->meta_msg.len) {
    732         av_dest->meta_msg.p_data = (uint8_t*)osi_calloc(av_src->meta_msg.len);
    733         memcpy(av_dest->meta_msg.p_data, av_src->meta_msg.p_data,
    734                av_src->meta_msg.len);
    735       }
    736 
    737       if (av_src->meta_msg.p_msg) {
    738         av_dest->meta_msg.p_msg = (tAVRC_MSG*)osi_calloc(sizeof(tAVRC_MSG));
    739         memcpy(av_dest->meta_msg.p_msg, av_src->meta_msg.p_msg,
    740                sizeof(tAVRC_MSG));
    741 
    742         tAVRC_MSG* p_msg_src = av_src->meta_msg.p_msg;
    743         tAVRC_MSG* p_msg_dest = av_dest->meta_msg.p_msg;
    744 
    745         if ((p_msg_src->hdr.opcode == AVRC_OP_VENDOR) &&
    746             (p_msg_src->vendor.p_vendor_data && p_msg_src->vendor.vendor_len)) {
    747           p_msg_dest->vendor.p_vendor_data =
    748               (uint8_t*)osi_calloc(p_msg_src->vendor.vendor_len);
    749           memcpy(p_msg_dest->vendor.p_vendor_data,
    750                  p_msg_src->vendor.p_vendor_data, p_msg_src->vendor.vendor_len);
    751         }
    752         if ((p_msg_src->hdr.opcode == AVRC_OP_BROWSE) &&
    753             p_msg_src->browse.p_browse_data && p_msg_src->browse.browse_len) {
    754           p_msg_dest->browse.p_browse_data =
    755               (uint8_t*)osi_calloc(p_msg_src->browse.browse_len);
    756           memcpy(p_msg_dest->browse.p_browse_data,
    757                  p_msg_src->browse.p_browse_data, p_msg_src->browse.browse_len);
    758         }
    759       }
    760     } break;
    761 
    762     default:
    763       break;
    764   }
    765 }
    766 
    767 void BtifAvEvent::DeepFree() {
    768   switch (event_) {
    769     case BTA_AV_META_MSG_EVT: {
    770       tBTA_AV* av = (tBTA_AV*)data_;
    771       osi_free_and_reset((void**)&av->meta_msg.p_data);
    772 
    773       if (av->meta_msg.p_msg) {
    774         if (av->meta_msg.p_msg->hdr.opcode == AVRC_OP_VENDOR) {
    775           osi_free(av->meta_msg.p_msg->vendor.p_vendor_data);
    776         }
    777         if (av->meta_msg.p_msg->hdr.opcode == AVRC_OP_BROWSE) {
    778           osi_free(av->meta_msg.p_msg->browse.p_browse_data);
    779         }
    780         osi_free_and_reset((void**)&av->meta_msg.p_msg);
    781       }
    782     } break;
    783 
    784     default:
    785       break;
    786   }
    787 
    788   osi_free_and_reset((void**)&data_);
    789   data_length_ = 0;
    790 }
    791 
    792 BtifAvPeer::BtifAvPeer(const RawAddress& peer_address, uint8_t peer_sep,
    793                        tBTA_AV_HNDL bta_handle, uint8_t peer_id)
    794     : peer_address_(peer_address),
    795       peer_sep_(peer_sep),
    796       bta_handle_(bta_handle),
    797       peer_id_(peer_id),
    798       state_machine_(*this),
    799       av_open_on_rc_timer_(nullptr),
    800       edr_(0),
    801       flags_(0),
    802       self_initiated_connection_(false) {}
    803 
    804 BtifAvPeer::~BtifAvPeer() { alarm_free(av_open_on_rc_timer_); }
    805 
    806 std::string BtifAvPeer::FlagsToString() const {
    807   std::string result;
    808 
    809   if (flags_ & BtifAvPeer::kFlagLocalSuspendPending) {
    810     if (!result.empty()) result += "|";
    811     result += "LOCAL_SUSPEND_PENDING";
    812   }
    813   if (flags_ & BtifAvPeer::kFlagRemoteSuspend) {
    814     if (!result.empty()) result += "|";
    815     result += "REMOTE_SUSPEND";
    816   }
    817   if (flags_ & BtifAvPeer::kFlagPendingStart) {
    818     if (!result.empty()) result += "|";
    819     result += "PENDING_START";
    820   }
    821   if (flags_ & BtifAvPeer::kFlagPendingStop) {
    822     if (!result.empty()) result += "|";
    823     result += "PENDING_STOP";
    824   }
    825   if (result.empty()) result = "None";
    826 
    827   return base::StringPrintf("0x%x(%s)", flags_, result.c_str());
    828 }
    829 
    830 bt_status_t BtifAvPeer::Init() {
    831   alarm_free(av_open_on_rc_timer_);
    832   av_open_on_rc_timer_ = alarm_new("btif_av_peer.av_open_on_rc_timer");
    833 
    834   state_machine_.Start();
    835   return BT_STATUS_SUCCESS;
    836 }
    837 
    838 void BtifAvPeer::Cleanup() {
    839   state_machine_.Quit();
    840   alarm_free(av_open_on_rc_timer_);
    841   av_open_on_rc_timer_ = nullptr;
    842 }
    843 
    844 bool BtifAvPeer::CanBeDeleted() const {
    845   return (
    846       (state_machine_.StateId() == BtifAvStateMachine::kStateIdle) &&
    847       (state_machine_.PreviousStateId() != BtifAvStateMachine::kStateInvalid));
    848 }
    849 
    850 const RawAddress& BtifAvPeer::ActivePeerAddress() const {
    851   if (IsSource()) {
    852     return btif_av_sink.ActivePeer();
    853   }
    854   if (IsSink()) {
    855     return btif_av_source.ActivePeer();
    856   }
    857   LOG(FATAL) << __PRETTY_FUNCTION__ << ": A2DP peer " << PeerAddress()
    858              << " is neither Source nor Sink";
    859   return RawAddress::kEmpty;
    860 }
    861 
    862 bool BtifAvPeer::IsConnected() const {
    863   int state = state_machine_.StateId();
    864   return ((state == BtifAvStateMachine::kStateOpened) ||
    865           (state == BtifAvStateMachine::kStateStarted));
    866 }
    867 
    868 bool BtifAvPeer::IsStreaming() const {
    869   int state = state_machine_.StateId();
    870   return (state == BtifAvStateMachine::kStateStarted);
    871 }
    872 
    873 BtifAvSource::~BtifAvSource() { CleanupAllPeers(); }
    874 
    875 bt_status_t BtifAvSource::Init(
    876     btav_source_callbacks_t* callbacks, int max_connected_audio_devices,
    877     const std::vector<btav_a2dp_codec_config_t>& codec_priorities) {
    878   LOG_INFO(LOG_TAG, "%s: max_connected_audio_devices=%d", __PRETTY_FUNCTION__,
    879            max_connected_audio_devices);
    880   if (enabled_) return BT_STATUS_SUCCESS;
    881   CleanupAllPeers();
    882   max_connected_peers_ = max_connected_audio_devices;
    883 
    884   /* A2DP OFFLOAD */
    885   char value_sup[PROPERTY_VALUE_MAX] = {'\0'};
    886   char value_dis[PROPERTY_VALUE_MAX] = {'\0'};
    887   osi_property_get("ro.bluetooth.a2dp_offload.supported", value_sup, "false");
    888   osi_property_get("persist.bluetooth.a2dp_offload.disabled", value_dis,
    889                    "false");
    890   a2dp_offload_enabled_ =
    891       (strcmp(value_sup, "true") == 0) && (strcmp(value_dis, "false") == 0);
    892   BTIF_TRACE_DEBUG("a2dp_offload.enable = %d", a2dp_offload_enabled_);
    893 
    894   callbacks_ = callbacks;
    895   bta_av_co_init(codec_priorities);
    896 
    897   if (!btif_a2dp_source_init()) {
    898     return BT_STATUS_FAIL;
    899   }
    900   btif_enable_service(BTA_A2DP_SOURCE_SERVICE_ID);
    901   enabled_ = true;
    902   return BT_STATUS_SUCCESS;
    903 }
    904 
    905 void BtifAvSource::Cleanup() {
    906   LOG_INFO(LOG_TAG, "%s", __PRETTY_FUNCTION__);
    907   if (!enabled_) return;
    908 
    909   btif_queue_cleanup(UUID_SERVCLASS_AUDIO_SOURCE);
    910 
    911   do_in_bta_thread(
    912       FROM_HERE,
    913       base::Bind(base::IgnoreResult(&BtifAvSource::SetActivePeer),
    914                  base::Unretained(&btif_av_source), RawAddress::kEmpty));
    915   do_in_bta_thread(FROM_HERE, base::Bind(&btif_a2dp_source_cleanup));
    916 
    917   btif_disable_service(BTA_A2DP_SOURCE_SERVICE_ID);
    918   CleanupAllPeers();
    919 
    920   callbacks_ = nullptr;
    921   enabled_ = false;
    922 }
    923 
    924 BtifAvPeer* BtifAvSource::FindPeer(const RawAddress& peer_address) {
    925   auto it = peers_.find(peer_address);
    926   if (it != peers_.end()) return it->second;
    927   return nullptr;
    928 }
    929 
    930 BtifAvPeer* BtifAvSource::FindPeerByHandle(tBTA_AV_HNDL bta_handle) {
    931   for (auto it : peers_) {
    932     BtifAvPeer* peer = it.second;
    933     if (peer->BtaHandle() == bta_handle) {
    934       return peer;
    935     }
    936   }
    937   return nullptr;
    938 }
    939 
    940 BtifAvPeer* BtifAvSource::FindPeerByPeerId(uint8_t peer_id) {
    941   for (auto it : peers_) {
    942     BtifAvPeer* peer = it.second;
    943     if (peer->PeerId() == peer_id) {
    944       return peer;
    945     }
    946   }
    947   return nullptr;
    948 }
    949 
    950 BtifAvPeer* BtifAvSource::FindOrCreatePeer(const RawAddress& peer_address,
    951                                            tBTA_AV_HNDL bta_handle) {
    952   BTIF_TRACE_DEBUG("%s: peer_address=%s bta_handle=0x%x", __PRETTY_FUNCTION__,
    953                    peer_address.ToString().c_str(), bta_handle);
    954 
    955   BtifAvPeer* peer = FindPeer(peer_address);
    956   if (peer != nullptr) return peer;
    957 
    958   // Find next availabie Peer ID to use
    959   uint8_t peer_id;
    960   for (peer_id = kPeerIdMin; peer_id < kPeerIdMax; peer_id++) {
    961     if (FindPeerByPeerId(peer_id) == nullptr) break;
    962   }
    963   if (peer_id == kPeerIdMax) {
    964     BTIF_TRACE_ERROR(
    965         "%s: Cannot create peer for peer_address=%s : "
    966         "cannot allocate unique Peer ID",
    967         __PRETTY_FUNCTION__, peer_address.ToString().c_str());
    968     return nullptr;
    969   }
    970   // Get the BTA Handle (if known)
    971   if (bta_handle == kBtaHandleUnknown) {
    972     auto it = peer_id2bta_handle_.find(peer_id);
    973     if (it != peer_id2bta_handle_.end()) {
    974       bta_handle = it->second;
    975     }
    976   }
    977 
    978   LOG_INFO(LOG_TAG,
    979            "%s: Create peer: peer_address=%s bta_handle=0x%x peer_id=%d",
    980            __PRETTY_FUNCTION__, peer_address.ToString().c_str(), bta_handle,
    981            peer_id);
    982   peer = new BtifAvPeer(peer_address, AVDT_TSEP_SNK, bta_handle, peer_id);
    983   peers_.insert(std::make_pair(peer_address, peer));
    984   peer->Init();
    985   return peer;
    986 }
    987 
    988 bool BtifAvSource::AllowedToConnect(const RawAddress& peer_address) const {
    989   int connected = 0;
    990 
    991   // Count peers that are in the process of connecting or already connected
    992   for (auto it : peers_) {
    993     const BtifAvPeer* peer = it.second;
    994     switch (peer->StateMachine().StateId()) {
    995       case BtifAvStateMachine::kStateOpening:
    996       case BtifAvStateMachine::kStateOpened:
    997       case BtifAvStateMachine::kStateStarted:
    998         if (peer->PeerAddress() == peer_address) {
    999           return true;  // Already connected or accounted for
   1000         }
   1001         connected++;
   1002         break;
   1003       default:
   1004         break;
   1005     }
   1006   }
   1007   return (connected < max_connected_peers_);
   1008 }
   1009 
   1010 bool BtifAvSource::DeletePeer(const RawAddress& peer_address) {
   1011   auto it = peers_.find(peer_address);
   1012   if (it == peers_.end()) return false;
   1013   BtifAvPeer* peer = it->second;
   1014   peer->Cleanup();
   1015   peers_.erase(it);
   1016   delete peer;
   1017   return true;
   1018 }
   1019 
   1020 void BtifAvSource::DeleteIdlePeers() {
   1021   for (auto it = peers_.begin(); it != peers_.end();) {
   1022     BtifAvPeer* peer = it->second;
   1023     auto prev_it = it++;
   1024     if (!peer->CanBeDeleted()) continue;
   1025     LOG_INFO(LOG_TAG, "%s: Deleting idle peer: %s bta_handle=0x%x", __func__,
   1026              peer->PeerAddress().ToString().c_str(), peer->BtaHandle());
   1027     peer->Cleanup();
   1028     peers_.erase(prev_it);
   1029     delete peer;
   1030   }
   1031 }
   1032 
   1033 void BtifAvSource::CleanupAllPeers() {
   1034   while (!peers_.empty()) {
   1035     auto it = peers_.begin();
   1036     BtifAvPeer* peer = it->second;
   1037     peer->Cleanup();
   1038     peers_.erase(it);
   1039     delete peer;
   1040   }
   1041 }
   1042 
   1043 void BtifAvSource::RegisterAllBtaHandles() {
   1044   for (int peer_id = kPeerIdMin; peer_id < kPeerIdMax; peer_id++) {
   1045     BTA_AvRegister(BTA_AV_CHNL_AUDIO, kBtifAvSourceServiceName.c_str(), peer_id,
   1046                    nullptr, UUID_SERVCLASS_AUDIO_SOURCE);
   1047   }
   1048 }
   1049 
   1050 void BtifAvSource::DeregisterAllBtaHandles() {
   1051   for (auto it : peer_id2bta_handle_) {
   1052     tBTA_AV_HNDL bta_handle = it.second;
   1053     BTA_AvDeregister(bta_handle);
   1054   }
   1055   peer_id2bta_handle_.clear();
   1056 }
   1057 
   1058 void BtifAvSource::BtaHandleRegistered(uint8_t peer_id,
   1059                                        tBTA_AV_HNDL bta_handle) {
   1060   peer_id2bta_handle_.insert(std::make_pair(peer_id, bta_handle));
   1061 
   1062   // Set the BTA Handle for the Peer (if exists)
   1063   BtifAvPeer* peer = FindPeerByPeerId(peer_id);
   1064   if (peer != nullptr) {
   1065     peer->SetBtaHandle(bta_handle);
   1066   }
   1067 }
   1068 
   1069 BtifAvSink::~BtifAvSink() { CleanupAllPeers(); }
   1070 
   1071 bt_status_t BtifAvSink::Init(btav_sink_callbacks_t* callbacks) {
   1072   LOG_INFO(LOG_TAG, "%s", __PRETTY_FUNCTION__);
   1073   if (enabled_) return BT_STATUS_SUCCESS;
   1074 
   1075   CleanupAllPeers();
   1076   max_connected_peers_ = kDefaultMaxConnectedAudioDevices;
   1077   callbacks_ = callbacks;
   1078 
   1079   std::vector<btav_a2dp_codec_config_t> codec_priorities;  // Default priorities
   1080   bta_av_co_init(codec_priorities);
   1081 
   1082   if (!btif_a2dp_sink_init()) {
   1083     return BT_STATUS_FAIL;
   1084   }
   1085   btif_enable_service(BTA_A2DP_SINK_SERVICE_ID);
   1086   enabled_ = true;
   1087   return BT_STATUS_SUCCESS;
   1088 }
   1089 
   1090 void BtifAvSink::Cleanup() {
   1091   LOG_INFO(LOG_TAG, "%s", __PRETTY_FUNCTION__);
   1092   if (!enabled_) return;
   1093 
   1094   btif_queue_cleanup(UUID_SERVCLASS_AUDIO_SINK);
   1095 
   1096   do_in_bta_thread(
   1097       FROM_HERE,
   1098       base::Bind(base::IgnoreResult(&BtifAvSink::SetActivePeer),
   1099                  base::Unretained(&btif_av_sink), RawAddress::kEmpty));
   1100   do_in_bta_thread(FROM_HERE, base::Bind(&btif_a2dp_sink_cleanup));
   1101 
   1102   btif_disable_service(BTA_A2DP_SINK_SERVICE_ID);
   1103   CleanupAllPeers();
   1104 
   1105   callbacks_ = nullptr;
   1106   enabled_ = false;
   1107 }
   1108 
   1109 BtifAvPeer* BtifAvSink::FindPeer(const RawAddress& peer_address) {
   1110   auto it = peers_.find(peer_address);
   1111   if (it != peers_.end()) return it->second;
   1112   return nullptr;
   1113 }
   1114 
   1115 BtifAvPeer* BtifAvSink::FindPeerByHandle(tBTA_AV_HNDL bta_handle) {
   1116   for (auto it : peers_) {
   1117     BtifAvPeer* peer = it.second;
   1118     if (peer->BtaHandle() == bta_handle) {
   1119       return peer;
   1120     }
   1121   }
   1122   return nullptr;
   1123 }
   1124 
   1125 BtifAvPeer* BtifAvSink::FindPeerByPeerId(uint8_t peer_id) {
   1126   for (auto it : peers_) {
   1127     BtifAvPeer* peer = it.second;
   1128     if (peer->PeerId() == peer_id) {
   1129       return peer;
   1130     }
   1131   }
   1132   return nullptr;
   1133 }
   1134 
   1135 BtifAvPeer* BtifAvSink::FindOrCreatePeer(const RawAddress& peer_address,
   1136                                          tBTA_AV_HNDL bta_handle) {
   1137   BTIF_TRACE_DEBUG("%s: peer_address=%s bta_handle=0x%x", __PRETTY_FUNCTION__,
   1138                    peer_address.ToString().c_str(), bta_handle);
   1139 
   1140   BtifAvPeer* peer = FindPeer(peer_address);
   1141   if (peer != nullptr) return peer;
   1142 
   1143   // Find next availabie Peer ID to use
   1144   uint8_t peer_id;
   1145   for (peer_id = kPeerIdMin; peer_id < kPeerIdMax; peer_id++) {
   1146     if (FindPeerByPeerId(peer_id) == nullptr) break;
   1147   }
   1148   if (peer_id == kPeerIdMax) {
   1149     BTIF_TRACE_ERROR(
   1150         "%s: Cannot create peer for peer_address=%s : "
   1151         "cannot allocate unique Peer ID",
   1152         __PRETTY_FUNCTION__, peer_address.ToString().c_str());
   1153     return nullptr;
   1154   }
   1155 
   1156   // Get the BTA Handle (if known)
   1157   if (bta_handle == kBtaHandleUnknown) {
   1158     auto it = peer_id2bta_handle_.find(peer_id);
   1159     if (it != peer_id2bta_handle_.end()) {
   1160       bta_handle = it->second;
   1161     }
   1162   }
   1163 
   1164   LOG_INFO(LOG_TAG,
   1165            "%s: Create peer: peer_address=%s bta_handle=0x%x peer_id=%d",
   1166            __PRETTY_FUNCTION__, peer_address.ToString().c_str(), bta_handle,
   1167            peer_id);
   1168   peer = new BtifAvPeer(peer_address, AVDT_TSEP_SRC, bta_handle, peer_id);
   1169   peers_.insert(std::make_pair(peer_address, peer));
   1170   peer->Init();
   1171   return peer;
   1172 }
   1173 
   1174 bool BtifAvSink::AllowedToConnect(const RawAddress& peer_address) const {
   1175   int connected = 0;
   1176 
   1177   // Count peers that are in the process of connecting or already connected
   1178   for (auto it : peers_) {
   1179     const BtifAvPeer* peer = it.second;
   1180     switch (peer->StateMachine().StateId()) {
   1181       case BtifAvStateMachine::kStateOpening:
   1182       case BtifAvStateMachine::kStateOpened:
   1183       case BtifAvStateMachine::kStateStarted:
   1184         if (peer->PeerAddress() == peer_address) {
   1185           return true;  // Already connected or accounted for
   1186         }
   1187         connected++;
   1188         break;
   1189       default:
   1190         break;
   1191     }
   1192   }
   1193   return (connected < max_connected_peers_);
   1194 }
   1195 
   1196 bool BtifAvSink::DeletePeer(const RawAddress& peer_address) {
   1197   auto it = peers_.find(peer_address);
   1198   if (it == peers_.end()) return false;
   1199   BtifAvPeer* peer = it->second;
   1200   peer->Cleanup();
   1201   peers_.erase(it);
   1202   delete peer;
   1203   return true;
   1204 }
   1205 
   1206 void BtifAvSink::DeleteIdlePeers() {
   1207   for (auto it = peers_.begin(); it != peers_.end();) {
   1208     BtifAvPeer* peer = it->second;
   1209     auto prev_it = it++;
   1210     if (!peer->CanBeDeleted()) continue;
   1211     LOG_INFO(LOG_TAG, "%s: Deleting idle peer: %s bta_handle=0x%x", __func__,
   1212              peer->PeerAddress().ToString().c_str(), peer->BtaHandle());
   1213     peer->Cleanup();
   1214     peers_.erase(prev_it);
   1215     delete peer;
   1216   }
   1217 }
   1218 
   1219 void BtifAvSink::CleanupAllPeers() {
   1220   while (!peers_.empty()) {
   1221     auto it = peers_.begin();
   1222     BtifAvPeer* peer = it->second;
   1223     peer->Cleanup();
   1224     peers_.erase(it);
   1225     delete peer;
   1226   }
   1227 }
   1228 
   1229 void BtifAvSink::RegisterAllBtaHandles() {
   1230   for (int peer_id = kPeerIdMin; peer_id < kPeerIdMax; peer_id++) {
   1231     BTA_AvRegister(BTA_AV_CHNL_AUDIO, kBtifAvSinkServiceName.c_str(), peer_id,
   1232                    bta_av_sink_media_callback, UUID_SERVCLASS_AUDIO_SINK);
   1233   }
   1234 }
   1235 
   1236 void BtifAvSink::DeregisterAllBtaHandles() {
   1237   for (auto it : peer_id2bta_handle_) {
   1238     tBTA_AV_HNDL bta_handle = it.second;
   1239     BTA_AvDeregister(bta_handle);
   1240   }
   1241   peer_id2bta_handle_.clear();
   1242 }
   1243 
   1244 void BtifAvSink::BtaHandleRegistered(uint8_t peer_id, tBTA_AV_HNDL bta_handle) {
   1245   peer_id2bta_handle_.insert(std::make_pair(peer_id, bta_handle));
   1246 
   1247   // Set the BTA Handle for the Peer (if exists)
   1248   BtifAvPeer* peer = FindPeerByPeerId(peer_id);
   1249   if (peer != nullptr) {
   1250     peer->SetBtaHandle(bta_handle);
   1251   }
   1252 }
   1253 
   1254 void BtifAvStateMachine::StateIdle::OnEnter() {
   1255   BTIF_TRACE_DEBUG("%s: Peer %s", __PRETTY_FUNCTION__,
   1256                    peer_.PeerAddress().ToString().c_str());
   1257 
   1258   peer_.SetEdr(0);
   1259   peer_.ClearAllFlags();
   1260 
   1261   // Stop A2DP if this is the active peer
   1262   if (peer_.IsActivePeer() || peer_.ActivePeerAddress().IsEmpty()) {
   1263     btif_a2dp_on_idle();
   1264   }
   1265 
   1266   // Reset the active peer if this was the active peer and
   1267   // the Idle state was reentered
   1268   if (peer_.IsActivePeer() && peer_.CanBeDeleted()) {
   1269     if (peer_.IsSink()) {
   1270       btif_av_source.SetActivePeer(RawAddress::kEmpty);
   1271     } else if (peer_.IsSource()) {
   1272       btif_av_sink.SetActivePeer(RawAddress::kEmpty);
   1273     }
   1274   }
   1275 
   1276   // Delete peers that are re-entering the Idle state
   1277   if (peer_.IsSink()) {
   1278     do_in_bta_thread(FROM_HERE, base::Bind(&BtifAvSource::DeleteIdlePeers,
   1279                                            base::Unretained(&btif_av_source)));
   1280   } else if (peer_.IsSource()) {
   1281     do_in_bta_thread(FROM_HERE, base::Bind(&BtifAvSink::DeleteIdlePeers,
   1282                                            base::Unretained(&btif_av_sink)));
   1283   }
   1284 }
   1285 
   1286 void BtifAvStateMachine::StateIdle::OnExit() {
   1287   BTIF_TRACE_DEBUG("%s: Peer %s", __PRETTY_FUNCTION__,
   1288                    peer_.PeerAddress().ToString().c_str());
   1289 }
   1290 
   1291 bool BtifAvStateMachine::StateIdle::ProcessEvent(uint32_t event, void* p_data) {
   1292   BTIF_TRACE_DEBUG("%s: Peer %s : event=%s flags=%s active_peer=%s",
   1293                    __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str(),
   1294                    BtifAvEvent::EventName(event).c_str(),
   1295                    peer_.FlagsToString().c_str(),
   1296                    logbool(peer_.IsActivePeer()).c_str());
   1297 
   1298   switch (event) {
   1299     case BTA_AV_ENABLE_EVT:
   1300       break;
   1301 
   1302     case BTIF_AV_STOP_STREAM_REQ_EVT:
   1303     case BTIF_AV_SUSPEND_STREAM_REQ_EVT:
   1304     case BTIF_AV_ACL_DISCONNECTED:
   1305       // Ignore. Just re-enter Idle so the peer can be deleted
   1306       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle);
   1307       break;
   1308 
   1309     case BTIF_AV_DISCONNECT_REQ_EVT:
   1310       if (peer_.BtaHandle() != kBtaHandleUnknown) {
   1311         BTA_AvClose(peer_.BtaHandle());
   1312         if (peer_.IsSource()) {
   1313           BTA_AvCloseRc(peer_.BtaHandle());
   1314         }
   1315       }
   1316       // Re-enter Idle so the peer can be deleted
   1317       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle);
   1318       break;
   1319 
   1320     case BTIF_AV_CONNECT_REQ_EVT:
   1321     case BTA_AV_PENDING_EVT: {
   1322       bool can_connect = true;
   1323       peer_.SetSelfInitiatedConnection(event == BTIF_AV_CONNECT_REQ_EVT);
   1324       // Check whether connection is allowed
   1325       if (peer_.IsSink()) {
   1326         can_connect = btif_av_source.AllowedToConnect(peer_.PeerAddress());
   1327         if (!can_connect) src_disconnect_sink(peer_.PeerAddress());
   1328       } else if (peer_.IsSource()) {
   1329         can_connect = btif_av_sink.AllowedToConnect(peer_.PeerAddress());
   1330         if (!can_connect) sink_disconnect_src(peer_.PeerAddress());
   1331       }
   1332       if (!can_connect) {
   1333         BTIF_TRACE_ERROR(
   1334             "%s: Cannot connect to peer %s: too many connected "
   1335             "peers",
   1336             __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str());
   1337         if (peer_.SelfInitiatedConnection()) {
   1338           btif_queue_advance();
   1339         }
   1340         break;
   1341       }
   1342       BTA_AvOpen(peer_.PeerAddress(), peer_.BtaHandle(), true,
   1343                  BTA_SEC_AUTHENTICATE, peer_.LocalUuidServiceClass());
   1344       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateOpening);
   1345     } break;
   1346     case BTIF_AV_AVRCP_OPEN_EVT:
   1347     case BTA_AV_RC_OPEN_EVT: {
   1348       // IOP_FIX: Jabra 620 only does AVRCP Open without AV Open whenever it
   1349       // connects. So as per the AV WP, an AVRCP connection cannot exist
   1350       // without an AV connection. Therefore, we initiate an AV connection
   1351       // if an RC_OPEN_EVT is received when we are in AV_CLOSED state.
   1352       // We initiate the AV connection after a small 3s timeout to avoid any
   1353       // collisions from the headsets, as some headsets initiate the AVRCP
   1354       // connection first and then immediately initiate the AV connection
   1355       //
   1356       // TODO: We may need to do this only on an AVRCP Play. FixMe
   1357       BTIF_TRACE_WARNING("%s: Peer %s : event=%s received without AV",
   1358                          __PRETTY_FUNCTION__,
   1359                          peer_.PeerAddress().ToString().c_str(),
   1360                          BtifAvEvent::EventName(event).c_str());
   1361 
   1362       bool can_connect = true;
   1363       // Check whether connection is allowed
   1364       if (peer_.IsSink()) {
   1365         can_connect = btif_av_source.AllowedToConnect(peer_.PeerAddress());
   1366         if (!can_connect) src_disconnect_sink(peer_.PeerAddress());
   1367       } else if (peer_.IsSource()) {
   1368         can_connect = btif_av_sink.AllowedToConnect(peer_.PeerAddress());
   1369         if (!can_connect) sink_disconnect_src(peer_.PeerAddress());
   1370       }
   1371       if (!can_connect) {
   1372         BTIF_TRACE_ERROR(
   1373             "%s: Cannot connect to peer %s: too many connected "
   1374             "peers",
   1375             __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str());
   1376         break;
   1377       }
   1378       if (btif_av_source.Enabled()) {
   1379         alarm_set_on_mloop(
   1380             peer_.AvOpenOnRcTimer(), BtifAvPeer::kTimeoutAvOpenOnRcMs,
   1381             btif_av_source_initiate_av_open_timer_timeout, &peer_);
   1382       } else if (btif_av_sink.Enabled()) {
   1383         alarm_set_on_mloop(peer_.AvOpenOnRcTimer(),
   1384                            BtifAvPeer::kTimeoutAvOpenOnRcMs,
   1385                            btif_av_sink_initiate_av_open_timer_timeout, &peer_);
   1386       }
   1387       if (event == BTA_AV_RC_OPEN_EVT) {
   1388         btif_rc_handler(event, (tBTA_AV*)p_data);
   1389       }
   1390     } break;
   1391 
   1392     case BTA_AV_RC_BROWSE_OPEN_EVT:
   1393       btif_rc_handler(event, (tBTA_AV*)p_data);
   1394       break;
   1395 
   1396     // In case Signalling channel is not down and remote started Streaming
   1397     // Procedure, we have to handle Config and Open event in Idle state.
   1398     // We hit these scenarios while running PTS test case for AVRCP Controller.
   1399     case BTIF_AV_SINK_CONFIG_REQ_EVT: {
   1400       const btif_av_sink_config_req_t* p_config_req =
   1401           static_cast<const btif_av_sink_config_req_t*>(p_data);
   1402       btif_av_report_sink_audio_config_state(p_config_req->peer_address,
   1403                                              p_config_req->sample_rate,
   1404                                              p_config_req->channel_count);
   1405     } break;
   1406 
   1407     case BTA_AV_OPEN_EVT: {
   1408       tBTA_AV* p_bta_data = (tBTA_AV*)p_data;
   1409       btav_connection_state_t state;
   1410       int av_state;
   1411       tBTA_AV_STATUS status = p_bta_data->open.status;
   1412       bool can_connect = true;
   1413 
   1414       LOG_INFO(
   1415           LOG_TAG, "%s: Peer %s : event=%s flags=%s status=%d(%s) edr=0x%x",
   1416           __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str(),
   1417           BtifAvEvent::EventName(event).c_str(), peer_.FlagsToString().c_str(),
   1418           status, (status == BTA_AV_SUCCESS) ? "SUCCESS" : "FAILED",
   1419           p_bta_data->open.edr);
   1420 
   1421       if (p_bta_data->open.status == BTA_AV_SUCCESS) {
   1422         state = BTAV_CONNECTION_STATE_CONNECTED;
   1423         av_state = BtifAvStateMachine::kStateOpened;
   1424         peer_.SetEdr(p_bta_data->open.edr);
   1425         CHECK(peer_.PeerSep() == p_bta_data->open.sep);
   1426         // Check whether connection is allowed
   1427         if (peer_.IsSink()) {
   1428           can_connect = btif_av_source.AllowedToConnect(peer_.PeerAddress());
   1429           if (!can_connect) src_disconnect_sink(peer_.PeerAddress());
   1430         } else if (peer_.IsSource()) {
   1431           can_connect = btif_av_sink.AllowedToConnect(peer_.PeerAddress());
   1432           if (!can_connect) sink_disconnect_src(peer_.PeerAddress());
   1433         }
   1434       } else {
   1435         state = BTAV_CONNECTION_STATE_DISCONNECTED;
   1436         av_state = BtifAvStateMachine::kStateIdle;
   1437       }
   1438 
   1439       if (!can_connect) {
   1440         BTIF_TRACE_ERROR(
   1441             "%s: Cannot connect to peer %s: too many connected "
   1442             "peers",
   1443             __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str());
   1444       } else {
   1445         // Report the connection state to the application
   1446         btif_report_connection_state(peer_.PeerAddress(), state);
   1447         // Change state to Open/Idle based on the status
   1448         peer_.StateMachine().TransitionTo(av_state);
   1449         if (peer_.IsSink()) {
   1450           // If queued PLAY command, send it now
   1451           btif_rc_check_handle_pending_play(
   1452               p_bta_data->open.bd_addr,
   1453               (p_bta_data->open.status == BTA_AV_SUCCESS));
   1454         } else if (peer_.IsSource() &&
   1455                    (p_bta_data->open.status == BTA_AV_SUCCESS)) {
   1456           // Bring up AVRCP connection as well
   1457           BTA_AvOpenRc(peer_.BtaHandle());
   1458         }
   1459       }
   1460       btif_queue_advance();
   1461     } break;
   1462 
   1463     case BTA_AV_REMOTE_CMD_EVT:
   1464     case BTA_AV_VENDOR_CMD_EVT:
   1465     case BTA_AV_META_MSG_EVT:
   1466     case BTA_AV_RC_FEAT_EVT:
   1467     case BTA_AV_REMOTE_RSP_EVT:
   1468       btif_rc_handler(event, (tBTA_AV*)p_data);
   1469       break;
   1470 
   1471     case BTIF_AV_AVRCP_CLOSE_EVT:
   1472     case BTA_AV_RC_CLOSE_EVT: {
   1473       BTIF_TRACE_DEBUG("%s: Peer %s : event=%s : Stopping AV timer",
   1474                        __PRETTY_FUNCTION__,
   1475                        peer_.PeerAddress().ToString().c_str(),
   1476                        BtifAvEvent::EventName(event).c_str());
   1477       alarm_cancel(peer_.AvOpenOnRcTimer());
   1478 
   1479       if (event == BTA_AV_RC_CLOSE_EVT) {
   1480         btif_rc_handler(event, (tBTA_AV*)p_data);
   1481       }
   1482     } break;
   1483 
   1484     case BTIF_AV_OFFLOAD_START_REQ_EVT:
   1485       BTIF_TRACE_ERROR("%s: Peer %s : event=%s: stream is not Opened",
   1486                        __PRETTY_FUNCTION__,
   1487                        peer_.PeerAddress().ToString().c_str(),
   1488                        BtifAvEvent::EventName(event).c_str());
   1489       btif_a2dp_on_offload_started(peer_.PeerAddress(), BTA_AV_FAIL);
   1490       break;
   1491 
   1492     default:
   1493       BTIF_TRACE_WARNING("%s: Peer %s : Unhandled event=%s",
   1494                          __PRETTY_FUNCTION__,
   1495                          peer_.PeerAddress().ToString().c_str(),
   1496                          BtifAvEvent::EventName(event).c_str());
   1497       return false;
   1498   }
   1499 
   1500   return true;
   1501 }
   1502 
   1503 void BtifAvStateMachine::StateOpening::OnEnter() {
   1504   BTIF_TRACE_DEBUG("%s: Peer %s", __PRETTY_FUNCTION__,
   1505                    peer_.PeerAddress().ToString().c_str());
   1506 
   1507   // Inform the application that we are entering connecting state
   1508   btif_report_connection_state(peer_.PeerAddress(),
   1509                                BTAV_CONNECTION_STATE_CONNECTING);
   1510 }
   1511 
   1512 void BtifAvStateMachine::StateOpening::OnExit() {
   1513   BTIF_TRACE_DEBUG("%s: Peer %s", __PRETTY_FUNCTION__,
   1514                    peer_.PeerAddress().ToString().c_str());
   1515 }
   1516 
   1517 bool BtifAvStateMachine::StateOpening::ProcessEvent(uint32_t event,
   1518                                                     void* p_data) {
   1519   BTIF_TRACE_DEBUG("%s: Peer %s : event=%s flags=%s active_peer=%s",
   1520                    __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str(),
   1521                    BtifAvEvent::EventName(event).c_str(),
   1522                    peer_.FlagsToString().c_str(),
   1523                    logbool(peer_.IsActivePeer()).c_str());
   1524 
   1525   switch (event) {
   1526     case BTIF_AV_STOP_STREAM_REQ_EVT:
   1527     case BTIF_AV_SUSPEND_STREAM_REQ_EVT:
   1528       break;  // Ignore
   1529 
   1530     case BTIF_AV_ACL_DISCONNECTED:
   1531       // ACL Disconnected needs to be handled only in Opening state, because
   1532       // it is in an intermediate state. In other states we can handle
   1533       // incoming/outgoing connect/disconnect requests.
   1534       BTIF_TRACE_WARNING(
   1535           "%s: Peer %s : event=%s: transitioning to Idle due to ACL Disconnect",
   1536           __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str(),
   1537           BtifAvEvent::EventName(event).c_str());
   1538       btif_report_connection_state(peer_.PeerAddress(),
   1539                                    BTAV_CONNECTION_STATE_DISCONNECTED);
   1540       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle);
   1541       if (peer_.SelfInitiatedConnection()) {
   1542         btif_queue_advance();
   1543       }
   1544       break;
   1545     case BTA_AV_REJECT_EVT:
   1546       BTIF_TRACE_WARNING("%s: Peer %s : event=%s flags=%s", __PRETTY_FUNCTION__,
   1547                          peer_.PeerAddress().ToString().c_str(),
   1548                          BtifAvEvent::EventName(event).c_str(),
   1549                          peer_.FlagsToString().c_str());
   1550       btif_report_connection_state(peer_.PeerAddress(),
   1551                                    BTAV_CONNECTION_STATE_DISCONNECTED);
   1552       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle);
   1553       if (peer_.SelfInitiatedConnection()) {
   1554         btif_queue_advance();
   1555       }
   1556       break;
   1557 
   1558     case BTA_AV_OPEN_EVT: {
   1559       tBTA_AV* p_bta_data = (tBTA_AV*)p_data;
   1560       btav_connection_state_t state;
   1561       int av_state;
   1562       tBTA_AV_STATUS status = p_bta_data->open.status;
   1563 
   1564       LOG_INFO(
   1565           LOG_TAG, "%s: Peer %s : event=%s flags=%s status=%d(%s) edr=0x%x",
   1566           __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str(),
   1567           BtifAvEvent::EventName(event).c_str(), peer_.FlagsToString().c_str(),
   1568           status, (status == BTA_AV_SUCCESS) ? "SUCCESS" : "FAILED",
   1569           p_bta_data->open.edr);
   1570 
   1571       if (p_bta_data->open.status == BTA_AV_SUCCESS) {
   1572         state = BTAV_CONNECTION_STATE_CONNECTED;
   1573         av_state = BtifAvStateMachine::kStateOpened;
   1574         peer_.SetEdr(p_bta_data->open.edr);
   1575         CHECK(peer_.PeerSep() == p_bta_data->open.sep);
   1576       } else {
   1577         if (btif_rc_is_connected_peer(peer_.PeerAddress())) {
   1578           // Disconnect the AVRCP connection, in case the A2DP connectiton
   1579           // failed for any reason.
   1580           BTIF_TRACE_WARNING("%s: Peer %s : Disconnecting AVRCP",
   1581                              __PRETTY_FUNCTION__,
   1582                              peer_.PeerAddress().ToString().c_str());
   1583           uint8_t peer_handle =
   1584               btif_rc_get_connected_peer_handle(peer_.PeerAddress());
   1585           if (peer_handle != BTRC_HANDLE_NONE) {
   1586             BTA_AvCloseRc(peer_handle);
   1587           }
   1588         }
   1589         state = BTAV_CONNECTION_STATE_DISCONNECTED;
   1590         av_state = BtifAvStateMachine::kStateIdle;
   1591       }
   1592 
   1593       // Report the connection state to the application
   1594       btif_report_connection_state(peer_.PeerAddress(), state);
   1595       // Change state to Open/Idle based on the status
   1596       peer_.StateMachine().TransitionTo(av_state);
   1597       if (peer_.IsSink()) {
   1598         // If queued PLAY command, send it now
   1599         btif_rc_check_handle_pending_play(
   1600             p_bta_data->open.bd_addr,
   1601             (p_bta_data->open.status == BTA_AV_SUCCESS));
   1602       } else if (peer_.IsSource() &&
   1603                  (p_bta_data->open.status == BTA_AV_SUCCESS)) {
   1604         // Bring up AVRCP connection as well
   1605         BTA_AvOpenRc(peer_.BtaHandle());
   1606       }
   1607       if (peer_.SelfInitiatedConnection()) {
   1608         btif_queue_advance();
   1609       }
   1610     } break;
   1611 
   1612     case BTIF_AV_SINK_CONFIG_REQ_EVT: {
   1613       const btif_av_sink_config_req_t* p_config_req =
   1614           static_cast<const btif_av_sink_config_req_t*>(p_data);
   1615       if (peer_.IsSource()) {
   1616         btif_av_report_sink_audio_config_state(p_config_req->peer_address,
   1617                                                p_config_req->sample_rate,
   1618                                                p_config_req->channel_count);
   1619       }
   1620     } break;
   1621 
   1622     case BTIF_AV_CONNECT_REQ_EVT: {
   1623       // The device has moved already to Opening, hence don't report the
   1624       // connection state.
   1625       BTIF_TRACE_WARNING(
   1626           "%s: Peer %s : event=%s : device is already connecting, "
   1627           "ignore Connect request",
   1628           __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str(),
   1629           BtifAvEvent::EventName(event).c_str());
   1630       btif_queue_advance();
   1631     } break;
   1632 
   1633     case BTA_AV_PENDING_EVT: {
   1634       // The device has moved already to Opening, hence don't report the
   1635       // connection state.
   1636       BTIF_TRACE_WARNING(
   1637           "%s: Peer %s : event=%s : device is already connecting, "
   1638           "ignore incoming request",
   1639           __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str(),
   1640           BtifAvEvent::EventName(event).c_str());
   1641     } break;
   1642 
   1643     case BTIF_AV_OFFLOAD_START_REQ_EVT:
   1644       BTIF_TRACE_ERROR("%s: Peer %s : event=%s: stream is not Opened",
   1645                        __PRETTY_FUNCTION__,
   1646                        peer_.PeerAddress().ToString().c_str(),
   1647                        BtifAvEvent::EventName(event).c_str());
   1648       btif_a2dp_on_offload_started(peer_.PeerAddress(), BTA_AV_FAIL);
   1649       break;
   1650 
   1651     case BTA_AV_CLOSE_EVT:
   1652       btif_a2dp_on_stopped(nullptr);
   1653       btif_report_connection_state(peer_.PeerAddress(),
   1654                                    BTAV_CONNECTION_STATE_DISCONNECTED);
   1655       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle);
   1656       if (peer_.SelfInitiatedConnection()) {
   1657         btif_queue_advance();
   1658       }
   1659       break;
   1660 
   1661     case BTIF_AV_DISCONNECT_REQ_EVT:
   1662       BTA_AvClose(peer_.BtaHandle());
   1663       btif_report_connection_state(peer_.PeerAddress(),
   1664                                    BTAV_CONNECTION_STATE_DISCONNECTED);
   1665       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle);
   1666       if (peer_.SelfInitiatedConnection()) {
   1667         btif_queue_advance();
   1668       }
   1669       break;
   1670 
   1671       CHECK_RC_EVENT(event, (tBTA_AV*)p_data);
   1672 
   1673     default:
   1674       BTIF_TRACE_WARNING("%s: Peer %s : Unhandled event=%s",
   1675                          __PRETTY_FUNCTION__,
   1676                          peer_.PeerAddress().ToString().c_str(),
   1677                          BtifAvEvent::EventName(event).c_str());
   1678       return false;
   1679   }
   1680   return true;
   1681 }
   1682 
   1683 void BtifAvStateMachine::StateOpened::OnEnter() {
   1684   BTIF_TRACE_DEBUG("%s: Peer %s", __PRETTY_FUNCTION__,
   1685                    peer_.PeerAddress().ToString().c_str());
   1686 
   1687   peer_.ClearFlags(BtifAvPeer::kFlagPendingStart |
   1688                    BtifAvPeer::kFlagPendingStop);
   1689 
   1690   // Set the active peer if the first connected device.
   1691   // NOTE: This should be done only if we are A2DP Sink, because the A2DP Sink
   1692   // implementation in Java doesn't support active devices (yet).
   1693   // For A2DP Source, the setting of the Active device is done by the
   1694   // ActiveDeviceManager in Java.
   1695   if (peer_.IsSource() && btif_av_sink.ActivePeer().IsEmpty()) {
   1696     if (!btif_av_sink.SetActivePeer(peer_.PeerAddress())) {
   1697       BTIF_TRACE_ERROR("%s: Error setting %s as active Source peer", __func__,
   1698                        peer_.PeerAddress().ToString().c_str());
   1699     }
   1700   }
   1701 }
   1702 
   1703 void BtifAvStateMachine::StateOpened::OnExit() {
   1704   BTIF_TRACE_DEBUG("%s: Peer %s", __PRETTY_FUNCTION__,
   1705                    peer_.PeerAddress().ToString().c_str());
   1706 
   1707   peer_.ClearFlags(BtifAvPeer::kFlagPendingStart);
   1708 }
   1709 
   1710 bool BtifAvStateMachine::StateOpened::ProcessEvent(uint32_t event,
   1711                                                    void* p_data) {
   1712   tBTA_AV* p_av = (tBTA_AV*)p_data;
   1713 
   1714   BTIF_TRACE_DEBUG("%s: Peer %s : event=%s flags=%s active_peer=%s",
   1715                    __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str(),
   1716                    BtifAvEvent::EventName(event).c_str(),
   1717                    peer_.FlagsToString().c_str(),
   1718                    logbool(peer_.IsActivePeer()).c_str());
   1719 
   1720   if ((event == BTA_AV_REMOTE_CMD_EVT) &&
   1721       peer_.CheckFlags(BtifAvPeer::kFlagRemoteSuspend) &&
   1722       (p_av->remote_cmd.rc_id == AVRC_ID_PLAY)) {
   1723     BTIF_TRACE_EVENT("%s: Peer %s : Resetting remote suspend flag on RC PLAY",
   1724                      __PRETTY_FUNCTION__,
   1725                      peer_.PeerAddress().ToString().c_str());
   1726     peer_.ClearFlags(BtifAvPeer::kFlagRemoteSuspend);
   1727   }
   1728 
   1729   switch (event) {
   1730     case BTIF_AV_STOP_STREAM_REQ_EVT:
   1731     case BTIF_AV_SUSPEND_STREAM_REQ_EVT:
   1732     case BTIF_AV_ACL_DISCONNECTED:
   1733       break;  // Ignore
   1734 
   1735     case BTIF_AV_START_STREAM_REQ_EVT:
   1736       LOG_INFO(LOG_TAG, "%s: Peer %s : event=%s flags=%s", __PRETTY_FUNCTION__,
   1737                peer_.PeerAddress().ToString().c_str(),
   1738                BtifAvEvent::EventName(event).c_str(),
   1739                peer_.FlagsToString().c_str());
   1740       BTA_AvStart(peer_.BtaHandle());
   1741       peer_.SetFlags(BtifAvPeer::kFlagPendingStart);
   1742       break;
   1743 
   1744     case BTA_AV_START_EVT: {
   1745       LOG_INFO(LOG_TAG,
   1746                "%s: Peer %s : event=%s status=%d suspending=%d "
   1747                "initiator=%d flags=%s",
   1748                __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str(),
   1749                BtifAvEvent::EventName(event).c_str(), p_av->start.status,
   1750                p_av->start.suspending, p_av->start.initiator,
   1751                peer_.FlagsToString().c_str());
   1752 
   1753       if ((p_av->start.status == BTA_SUCCESS) && p_av->start.suspending)
   1754         return true;
   1755 
   1756       // If remote tries to start A2DP when DUT is A2DP Source, then Suspend.
   1757       // If A2DP is Sink and call is active, then disconnect the AVDTP channel.
   1758       if (peer_.IsSink() && !peer_.CheckFlags(BtifAvPeer::kFlagPendingStart)) {
   1759         BTIF_TRACE_WARNING("%s: Peer %s : trigger Suspend as remote initiated",
   1760                            __PRETTY_FUNCTION__,
   1761                            peer_.PeerAddress().ToString().c_str());
   1762         btif_av_source_dispatch_sm_event(peer_.PeerAddress(),
   1763                                          BTIF_AV_SUSPEND_STREAM_REQ_EVT);
   1764       }
   1765 
   1766       // If peer is A2DP Source, we do not want to ACK commands on UIPC
   1767       if (peer_.IsSink() &&
   1768           btif_a2dp_on_started(
   1769               peer_.PeerAddress(), &p_av->start,
   1770               peer_.CheckFlags(BtifAvPeer::kFlagPendingStart))) {
   1771         // Only clear pending flag after acknowledgement
   1772         peer_.ClearFlags(BtifAvPeer::kFlagPendingStart);
   1773       }
   1774 
   1775       // Remain in Open state if status failed
   1776       if (p_av->start.status != BTA_AV_SUCCESS) return false;
   1777 
   1778       if (peer_.IsSource() && peer_.IsActivePeer()) {
   1779         // Remove flush state, ready for streaming
   1780         btif_a2dp_sink_set_rx_flush(false);
   1781       }
   1782 
   1783       // Change state to Started, send acknowledgement if start is pending
   1784       if (peer_.IsSink() && peer_.CheckFlags(BtifAvPeer::kFlagPendingStart)) {
   1785         btif_a2dp_on_started(peer_.PeerAddress(), nullptr, true);
   1786         // Pending start flag will be cleared when exit current state
   1787       }
   1788       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateStarted);
   1789 
   1790     } break;
   1791 
   1792     case BTIF_AV_DISCONNECT_REQ_EVT:
   1793       BTA_AvClose(peer_.BtaHandle());
   1794       if (peer_.IsSource()) {
   1795         BTA_AvCloseRc(peer_.BtaHandle());
   1796       }
   1797 
   1798       // Inform the application that we are disconnecting
   1799       btif_report_connection_state(peer_.PeerAddress(),
   1800                                    BTAV_CONNECTION_STATE_DISCONNECTING);
   1801 
   1802       // Wait in closing state until fully closed
   1803       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateClosing);
   1804       break;
   1805 
   1806     case BTA_AV_CLOSE_EVT:
   1807       // AVDTP link is closed
   1808       if (peer_.IsActivePeer()) {
   1809         btif_a2dp_on_stopped(nullptr);
   1810       }
   1811 
   1812       // Change state to Idle, send acknowledgement if start is pending
   1813       if (peer_.CheckFlags(BtifAvPeer::kFlagPendingStart)) {
   1814         BTIF_TRACE_WARNING("%s: Peer %s : failed pending start request",
   1815                            __PRETTY_FUNCTION__,
   1816                            peer_.PeerAddress().ToString().c_str());
   1817         btif_a2dp_command_ack(A2DP_CTRL_ACK_FAILURE);
   1818         // Pending start flag will be cleared when exit current state
   1819       }
   1820 
   1821       // Inform the application that we are disconnected
   1822       btif_report_connection_state(peer_.PeerAddress(),
   1823                                    BTAV_CONNECTION_STATE_DISCONNECTED);
   1824       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle);
   1825       break;
   1826 
   1827     case BTA_AV_RECONFIG_EVT:
   1828       if (peer_.CheckFlags(BtifAvPeer::kFlagPendingStart) &&
   1829           (p_av->reconfig.status == BTA_AV_SUCCESS)) {
   1830         LOG_INFO(LOG_TAG,
   1831                  "%s : Peer %s : Reconfig done - calling BTA_AvStart()",
   1832                  __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str());
   1833         BTA_AvStart(peer_.BtaHandle());
   1834       } else if (peer_.CheckFlags(BtifAvPeer::kFlagPendingStart)) {
   1835         BTIF_TRACE_WARNING("%s: Peer %s : failed reconfiguration",
   1836                            __PRETTY_FUNCTION__,
   1837                            peer_.PeerAddress().ToString().c_str());
   1838         peer_.ClearFlags(BtifAvPeer::kFlagPendingStart);
   1839         btif_a2dp_command_ack(A2DP_CTRL_ACK_FAILURE);
   1840       }
   1841       break;
   1842 
   1843     case BTIF_AV_CONNECT_REQ_EVT: {
   1844       BTIF_TRACE_WARNING("%s: Peer %s : Ignore %s for same device",
   1845                          __PRETTY_FUNCTION__,
   1846                          peer_.PeerAddress().ToString().c_str(),
   1847                          BtifAvEvent::EventName(event).c_str());
   1848       btif_queue_advance();
   1849     } break;
   1850 
   1851     case BTIF_AV_OFFLOAD_START_REQ_EVT:
   1852       BTIF_TRACE_ERROR("%s: Peer %s : event=%s: stream is not Opened",
   1853                        __PRETTY_FUNCTION__,
   1854                        peer_.PeerAddress().ToString().c_str(),
   1855                        BtifAvEvent::EventName(event).c_str());
   1856       btif_a2dp_on_offload_started(peer_.PeerAddress(), BTA_AV_FAIL);
   1857       break;
   1858 
   1859     case BTIF_AV_AVRCP_REMOTE_PLAY_EVT:
   1860       if (peer_.CheckFlags(BtifAvPeer::kFlagRemoteSuspend)) {
   1861         BTIF_TRACE_EVENT(
   1862             "%s: Peer %s : Resetting remote suspend flag on RC PLAY",
   1863             __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str());
   1864         peer_.ClearFlags(BtifAvPeer::kFlagRemoteSuspend);
   1865       }
   1866       break;
   1867 
   1868       CHECK_RC_EVENT(event, (tBTA_AV*)p_data);
   1869 
   1870     default:
   1871       BTIF_TRACE_WARNING("%s: Peer %s : Unhandled event=%s",
   1872                          __PRETTY_FUNCTION__,
   1873                          peer_.PeerAddress().ToString().c_str(),
   1874                          BtifAvEvent::EventName(event).c_str());
   1875       return false;
   1876   }
   1877   return true;
   1878 }
   1879 
   1880 void BtifAvStateMachine::StateStarted::OnEnter() {
   1881   BTIF_TRACE_DEBUG("%s: Peer %s", __PRETTY_FUNCTION__,
   1882                    peer_.PeerAddress().ToString().c_str());
   1883 
   1884   // We are again in started state, clear any remote suspend flags
   1885   peer_.ClearFlags(BtifAvPeer::kFlagRemoteSuspend);
   1886 
   1887   // Report that we have entered the Streaming stage. Usually, this should
   1888   // be followed by focus grant. See update_audio_focus_state()
   1889   btif_report_audio_state(peer_.PeerAddress(), BTAV_AUDIO_STATE_STARTED);
   1890 }
   1891 
   1892 void BtifAvStateMachine::StateStarted::OnExit() {
   1893   BTIF_TRACE_DEBUG("%s: Peer %s", __PRETTY_FUNCTION__,
   1894                    peer_.PeerAddress().ToString().c_str());
   1895 }
   1896 
   1897 bool BtifAvStateMachine::StateStarted::ProcessEvent(uint32_t event,
   1898                                                     void* p_data) {
   1899   tBTA_AV* p_av = (tBTA_AV*)p_data;
   1900 
   1901   BTIF_TRACE_DEBUG("%s: Peer %s : event=%s flags=%s active_peer=%s",
   1902                    __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str(),
   1903                    BtifAvEvent::EventName(event).c_str(),
   1904                    peer_.FlagsToString().c_str(),
   1905                    logbool(peer_.IsActivePeer()).c_str());
   1906 
   1907   switch (event) {
   1908     case BTIF_AV_ACL_DISCONNECTED:
   1909       break;  // Ignore
   1910 
   1911     case BTIF_AV_START_STREAM_REQ_EVT:
   1912       LOG_INFO(LOG_TAG, "%s: Peer %s : event=%s flags=%s", __PRETTY_FUNCTION__,
   1913                peer_.PeerAddress().ToString().c_str(),
   1914                BtifAvEvent::EventName(event).c_str(),
   1915                peer_.FlagsToString().c_str());
   1916       // We were started remotely, just ACK back the local request
   1917       if (peer_.IsSink())
   1918         btif_a2dp_on_started(peer_.PeerAddress(), nullptr, true);
   1919       break;
   1920 
   1921     // FIXME -- use suspend = true always to work around issue with BTA AV
   1922     case BTIF_AV_STOP_STREAM_REQ_EVT:
   1923     case BTIF_AV_SUSPEND_STREAM_REQ_EVT:
   1924       LOG_INFO(LOG_TAG, "%s: Peer %s : event=%s flags=%s", __PRETTY_FUNCTION__,
   1925                peer_.PeerAddress().ToString().c_str(),
   1926                BtifAvEvent::EventName(event).c_str(),
   1927                peer_.FlagsToString().c_str());
   1928       // Set pending flag to ensure the BTIF task is not trying to restart
   1929       // the stream while suspend is in progress.
   1930       peer_.SetFlags(BtifAvPeer::kFlagLocalSuspendPending);
   1931 
   1932       // If we were remotely suspended but suspend locally, local suspend
   1933       // always overrides.
   1934       peer_.ClearFlags(BtifAvPeer::kFlagRemoteSuspend);
   1935 
   1936       if (peer_.IsSink()) {
   1937         // Immediately stop transmission of frames while suspend is pending
   1938         if (peer_.IsActivePeer()) {
   1939           if (event == BTIF_AV_STOP_STREAM_REQ_EVT) {
   1940             btif_a2dp_on_stopped(nullptr);
   1941           } else {
   1942             // (event == BTIF_AV_SUSPEND_STREAM_REQ_EVT)
   1943             btif_a2dp_source_set_tx_flush(true);
   1944           }
   1945         }
   1946       } else if (peer_.IsSource()) {
   1947         btif_a2dp_on_stopped(nullptr);
   1948       }
   1949       BTA_AvStop(peer_.BtaHandle(), true);
   1950       break;
   1951 
   1952     case BTIF_AV_DISCONNECT_REQ_EVT:
   1953       LOG_INFO(LOG_TAG, "%s: Peer %s : event=%s flags=%s", __PRETTY_FUNCTION__,
   1954                peer_.PeerAddress().ToString().c_str(),
   1955                BtifAvEvent::EventName(event).c_str(),
   1956                peer_.FlagsToString().c_str());
   1957 
   1958       // Request AVDTP to close
   1959       BTA_AvClose(peer_.BtaHandle());
   1960       if (peer_.IsSource()) {
   1961         BTA_AvCloseRc(peer_.BtaHandle());
   1962       }
   1963 
   1964       // Inform the application that we are disconnecting
   1965       btif_report_connection_state(peer_.PeerAddress(),
   1966                                    BTAV_CONNECTION_STATE_DISCONNECTING);
   1967 
   1968       // Wait in closing state until fully closed
   1969       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateClosing);
   1970       break;
   1971 
   1972     case BTA_AV_SUSPEND_EVT: {
   1973       LOG_INFO(LOG_TAG,
   1974                "%s: Peer %s : event=%s status=%d initiator=%d flags=%s",
   1975                __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str(),
   1976                BtifAvEvent::EventName(event).c_str(), p_av->suspend.status,
   1977                p_av->suspend.initiator, peer_.FlagsToString().c_str());
   1978 
   1979       // A2DP suspended, stop A2DP encoder/decoder until resumed
   1980       btif_a2dp_on_suspended(&p_av->suspend);
   1981 
   1982       // If not successful, remain in current state
   1983       if (p_av->suspend.status != BTA_AV_SUCCESS) {
   1984         peer_.ClearFlags(BtifAvPeer::kFlagLocalSuspendPending);
   1985 
   1986         if (peer_.IsSink() && peer_.IsActivePeer()) {
   1987           // Suspend failed, reset back tx flush state
   1988           btif_a2dp_source_set_tx_flush(false);
   1989         }
   1990         return false;
   1991       }
   1992 
   1993       btav_audio_state_t state = BTAV_AUDIO_STATE_REMOTE_SUSPEND;
   1994       if (p_av->suspend.initiator != true) {
   1995         // Remote suspend, notify HAL and await audioflinger to
   1996         // suspend/stop stream.
   1997         //
   1998         // Set remote suspend flag to block media task from restarting
   1999         // stream only if we did not already initiate a local suspend.
   2000         if (!peer_.CheckFlags(BtifAvPeer::kFlagLocalSuspendPending))
   2001           peer_.SetFlags(BtifAvPeer::kFlagRemoteSuspend);
   2002       } else {
   2003         state = BTAV_AUDIO_STATE_STOPPED;
   2004       }
   2005 
   2006       // Suspend completed, clear pending status
   2007       peer_.ClearFlags(BtifAvPeer::kFlagLocalSuspendPending);
   2008 
   2009       btif_report_audio_state(peer_.PeerAddress(), state);
   2010       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateOpened);
   2011     } break;
   2012 
   2013     case BTA_AV_STOP_EVT:
   2014       LOG_INFO(LOG_TAG, "%s: Peer %s : event=%s flags=%s", __PRETTY_FUNCTION__,
   2015                peer_.PeerAddress().ToString().c_str(),
   2016                BtifAvEvent::EventName(event).c_str(),
   2017                peer_.FlagsToString().c_str());
   2018 
   2019       peer_.SetFlags(BtifAvPeer::kFlagPendingStop);
   2020       btif_a2dp_on_stopped(&p_av->suspend);
   2021 
   2022       btif_report_audio_state(peer_.PeerAddress(), BTAV_AUDIO_STATE_STOPPED);
   2023 
   2024       // If stop was successful, change state to Open
   2025       if (p_av->suspend.status == BTA_AV_SUCCESS)
   2026         peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateOpened);
   2027 
   2028       break;
   2029 
   2030     case BTA_AV_CLOSE_EVT:
   2031       LOG_INFO(LOG_TAG, "%s: Peer %s : event=%s flags=%s", __PRETTY_FUNCTION__,
   2032                peer_.PeerAddress().ToString().c_str(),
   2033                BtifAvEvent::EventName(event).c_str(),
   2034                peer_.FlagsToString().c_str());
   2035 
   2036       peer_.SetFlags(BtifAvPeer::kFlagPendingStop);
   2037 
   2038       // AVDTP link is closed
   2039       if (peer_.IsActivePeer()) {
   2040         btif_a2dp_on_stopped(nullptr);
   2041       }
   2042 
   2043       // Inform the application that we are disconnected
   2044       btif_report_connection_state(peer_.PeerAddress(),
   2045                                    BTAV_CONNECTION_STATE_DISCONNECTED);
   2046 
   2047       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle);
   2048       break;
   2049 
   2050     case BTIF_AV_OFFLOAD_START_REQ_EVT:
   2051       BTA_AvOffloadStart(peer_.BtaHandle());
   2052       break;
   2053 
   2054     case BTA_AV_OFFLOAD_START_RSP_EVT:
   2055       btif_a2dp_on_offload_started(peer_.PeerAddress(), p_av->status);
   2056       break;
   2057 
   2058       CHECK_RC_EVENT(event, (tBTA_AV*)p_data);
   2059 
   2060     default:
   2061       BTIF_TRACE_WARNING("%s: Peer %s : Unhandled event=%s",
   2062                          __PRETTY_FUNCTION__,
   2063                          peer_.PeerAddress().ToString().c_str(),
   2064                          BtifAvEvent::EventName(event).c_str());
   2065       return false;
   2066   }
   2067 
   2068   return true;
   2069 }
   2070 
   2071 void BtifAvStateMachine::StateClosing::OnEnter() {
   2072   BTIF_TRACE_DEBUG("%s: Peer %s", __PRETTY_FUNCTION__,
   2073                    peer_.PeerAddress().ToString().c_str());
   2074 
   2075   if (peer_.IsActivePeer()) {
   2076     if (peer_.IsSink()) {
   2077       // Immediately stop transmission of frames
   2078       btif_a2dp_source_set_tx_flush(true);
   2079       // Wait for Audio Flinger to stop A2DP
   2080     } else if (peer_.IsSource()) {
   2081       btif_a2dp_sink_set_rx_flush(true);
   2082     }
   2083   }
   2084 }
   2085 
   2086 void BtifAvStateMachine::StateClosing::OnExit() {
   2087   BTIF_TRACE_DEBUG("%s: Peer %s", __PRETTY_FUNCTION__,
   2088                    peer_.PeerAddress().ToString().c_str());
   2089 }
   2090 
   2091 bool BtifAvStateMachine::StateClosing::ProcessEvent(uint32_t event,
   2092                                                     void* p_data) {
   2093   BTIF_TRACE_DEBUG("%s: Peer %s : event=%s flags=%s active_peer=%s",
   2094                    __PRETTY_FUNCTION__, peer_.PeerAddress().ToString().c_str(),
   2095                    BtifAvEvent::EventName(event).c_str(),
   2096                    peer_.FlagsToString().c_str(),
   2097                    logbool(peer_.IsActivePeer()).c_str());
   2098 
   2099   switch (event) {
   2100     case BTIF_AV_SUSPEND_STREAM_REQ_EVT:
   2101     case BTIF_AV_ACL_DISCONNECTED:
   2102       break;  // Ignore
   2103 
   2104     case BTA_AV_STOP_EVT:
   2105     case BTIF_AV_STOP_STREAM_REQ_EVT:
   2106       if (peer_.IsActivePeer()) {
   2107         btif_a2dp_on_stopped(nullptr);
   2108       }
   2109       break;
   2110 
   2111     case BTA_AV_CLOSE_EVT:
   2112       // Inform the application that we are disconnecting
   2113       btif_report_connection_state(peer_.PeerAddress(),
   2114                                    BTAV_CONNECTION_STATE_DISCONNECTED);
   2115 
   2116       peer_.StateMachine().TransitionTo(BtifAvStateMachine::kStateIdle);
   2117       break;
   2118 
   2119     // Handle the RC_CLOSE event for the cleanup
   2120     case BTA_AV_RC_CLOSE_EVT:
   2121       btif_rc_handler(event, (tBTA_AV*)p_data);
   2122       break;
   2123 
   2124     // Handle the RC_BROWSE_CLOSE event for testing
   2125     case BTA_AV_RC_BROWSE_CLOSE_EVT:
   2126       btif_rc_handler(event, (tBTA_AV*)p_data);
   2127       break;
   2128 
   2129     case BTIF_AV_OFFLOAD_START_REQ_EVT:
   2130       BTIF_TRACE_ERROR("%s: Peer %s : event=%s: stream is not Opened",
   2131                        __PRETTY_FUNCTION__,
   2132                        peer_.PeerAddress().ToString().c_str(),
   2133                        BtifAvEvent::EventName(event).c_str());
   2134       btif_a2dp_on_offload_started(peer_.PeerAddress(), BTA_AV_FAIL);
   2135       break;
   2136 
   2137     default:
   2138       BTIF_TRACE_WARNING("%s: Peer %s : Unhandled event=%s",
   2139                          __PRETTY_FUNCTION__,
   2140                          peer_.PeerAddress().ToString().c_str(),
   2141                          BtifAvEvent::EventName(event).c_str());
   2142       return false;
   2143   }
   2144   return true;
   2145 }
   2146 
   2147 /**
   2148  * Timer to trigger AV Open on the Source if the remote Sink device establishes
   2149  * AVRCP connection without AV connection. The timer is needed to interoperate
   2150  * with headsets that do establish AV after AVRCP connection.
   2151  */
   2152 static void btif_av_source_initiate_av_open_timer_timeout(void* data) {
   2153   BtifAvPeer* peer = (BtifAvPeer*)data;
   2154 
   2155   BTIF_TRACE_DEBUG("%s: Peer %s", __func__,
   2156                    peer->PeerAddress().ToString().c_str());
   2157 
   2158   // Check if AVRCP is connected to the peer
   2159   if (!btif_rc_is_connected_peer(peer->PeerAddress())) {
   2160     BTIF_TRACE_ERROR("%s: AVRCP peer %s is not connected", __func__,
   2161                      peer->PeerAddress().ToString().c_str());
   2162     return;
   2163   }
   2164 
   2165   // Connect to the AVRCP peer
   2166   if (btif_av_source.Enabled() &&
   2167       btif_av_source.FindPeer(peer->PeerAddress()) == peer) {
   2168     BTIF_TRACE_DEBUG("%s: Connecting to AVRCP peer %s", __func__,
   2169                      peer->PeerAddress().ToString().c_str());
   2170     btif_av_source_dispatch_sm_event(peer->PeerAddress(),
   2171                                      BTIF_AV_CONNECT_REQ_EVT);
   2172   }
   2173 }
   2174 
   2175 /**
   2176  * Timer to trigger AV Open on the Sink if the remote Source device establishes
   2177  * AVRCP connection without AV connection.
   2178  */
   2179 static void btif_av_sink_initiate_av_open_timer_timeout(void* data) {
   2180   BtifAvPeer* peer = (BtifAvPeer*)data;
   2181 
   2182   BTIF_TRACE_DEBUG("%s: Peer %s", __func__,
   2183                    peer->PeerAddress().ToString().c_str());
   2184 
   2185   // Check if AVRCP is connected to the peer
   2186   if (!btif_rc_is_connected_peer(peer->PeerAddress())) {
   2187     BTIF_TRACE_ERROR("%s: AVRCP peer %s is not connected", __func__,
   2188                      peer->PeerAddress().ToString().c_str());
   2189     return;
   2190   }
   2191 
   2192   // Connect to the AVRCP peer
   2193   if (btif_av_sink.Enabled() &&
   2194       btif_av_sink.FindPeer(peer->PeerAddress()) == peer) {
   2195     BTIF_TRACE_DEBUG("%s: Connecting to AVRCP peer %s", __func__,
   2196                      peer->PeerAddress().ToString().c_str());
   2197     btif_av_sink_dispatch_sm_event(peer->PeerAddress(),
   2198                                    BTIF_AV_CONNECT_REQ_EVT);
   2199   }
   2200 }
   2201 
   2202 /**
   2203  * Report the A2DP connection state
   2204  *
   2205  * @param peer_address the peer address
   2206  * @param state the connection state
   2207  */
   2208 static void btif_report_connection_state(const RawAddress& peer_address,
   2209                                          btav_connection_state_t state) {
   2210   LOG_INFO(LOG_TAG, "%s: peer_address=%s state=%d", __func__,
   2211            peer_address.ToString().c_str(), state);
   2212 
   2213   if (btif_av_source.Enabled()) {
   2214     do_in_jni_thread(FROM_HERE,
   2215                      base::Bind(btif_av_source.Callbacks()->connection_state_cb,
   2216                                 peer_address, state));
   2217   } else if (btif_av_sink.Enabled()) {
   2218     do_in_jni_thread(FROM_HERE,
   2219                      base::Bind(btif_av_sink.Callbacks()->connection_state_cb,
   2220                                 peer_address, state));
   2221   }
   2222 }
   2223 
   2224 /**
   2225  * Report the audio state of the A2DP connection.
   2226  * The state is updated when either the remote ends starts streaming
   2227  * (Started state) or whenever it transitions out of Started state
   2228  * (to Opened or Streaming state).
   2229  *
   2230  * @param peer_address the peer address
   2231  * @param state the audio state
   2232  */
   2233 static void btif_report_audio_state(const RawAddress& peer_address,
   2234                                     btav_audio_state_t state) {
   2235   LOG_INFO(LOG_TAG, "%s: peer_address=%s state=%d", __func__,
   2236            peer_address.ToString().c_str(), state);
   2237 
   2238   if (btif_av_source.Enabled()) {
   2239     do_in_jni_thread(FROM_HERE,
   2240                      base::Bind(btif_av_source.Callbacks()->audio_state_cb,
   2241                                 peer_address, state));
   2242   } else if (btif_av_sink.Enabled()) {
   2243     do_in_jni_thread(FROM_HERE,
   2244                      base::Bind(btif_av_sink.Callbacks()->audio_state_cb,
   2245                                 peer_address, state));
   2246   }
   2247 }
   2248 
   2249 void btif_av_report_source_codec_state(
   2250     const RawAddress& peer_address,
   2251     const btav_a2dp_codec_config_t& codec_config,
   2252     const std::vector<btav_a2dp_codec_config_t>& codecs_local_capabilities,
   2253     const std::vector<btav_a2dp_codec_config_t>&
   2254         codecs_selectable_capabilities) {
   2255   BTIF_TRACE_EVENT("%s: peer_address=%s", __func__,
   2256                    peer_address.ToString().c_str());
   2257   if (btif_av_source.Enabled()) {
   2258     do_in_jni_thread(
   2259         FROM_HERE,
   2260         base::Bind(btif_av_source.Callbacks()->audio_config_cb, peer_address,
   2261                    codec_config, codecs_local_capabilities,
   2262                    codecs_selectable_capabilities));
   2263   }
   2264 }
   2265 
   2266 /**
   2267  * Report the audio config state of the A2DP Sink connection.
   2268  *
   2269  * @param peer_address the peer address
   2270  * @param sample_rate the sample rate (in samples per second)
   2271  * @param channel_count the channel count (1 for Mono, 2 for Stereo)
   2272  */
   2273 static void btif_av_report_sink_audio_config_state(
   2274     const RawAddress& peer_address, int sample_rate, int channel_count) {
   2275   LOG_INFO(LOG_TAG, "%s: Peer %s : sample_rate=%d channel_count=%d", __func__,
   2276            peer_address.ToString().c_str(), sample_rate, channel_count);
   2277   if (btif_av_sink.Enabled()) {
   2278     do_in_jni_thread(FROM_HERE,
   2279                      base::Bind(btif_av_sink.Callbacks()->audio_config_cb,
   2280                                 peer_address, sample_rate, channel_count));
   2281   }
   2282 }
   2283 
   2284 /**
   2285  * Process BTIF or BTA AV or BTA AVRCP events. The processing is done on the
   2286  * JNI thread.
   2287  *
   2288  * @param peer_sep the corresponding peer's SEP: AVDT_TSEP_SRC if the peer
   2289  * is A2DP Source, or AVDT_TSEP_SNK if the peer is A2DP Sink.
   2290  * @param peer_address the peer address if known, otherwise RawAddress::kEmpty
   2291  * @param bta_handle the BTA handle for the peer if known, otherwise
   2292  * kBtaHandleUnknown
   2293  * @param btif_av_event the corresponding event
   2294  */
   2295 static void btif_av_handle_event(uint8_t peer_sep,
   2296                                  const RawAddress& peer_address,
   2297                                  tBTA_AV_HNDL bta_handle,
   2298                                  const BtifAvEvent& btif_av_event) {
   2299   BtifAvPeer* peer = nullptr;
   2300   BTIF_TRACE_EVENT("%s: peer_sep=%s (%d) peer_address=%s handle=0x%x event=%s",
   2301                    __func__, (peer_sep == AVDT_TSEP_SRC) ? "Source" : "Sink",
   2302                    peer_sep, peer_address.ToString().c_str(), bta_handle,
   2303                    btif_av_event.ToString().c_str());
   2304 
   2305   // Find the peer
   2306   if (peer_address != RawAddress::kEmpty) {
   2307     if (peer_sep == AVDT_TSEP_SNK) {
   2308       peer = btif_av_source.FindOrCreatePeer(peer_address, bta_handle);
   2309     } else if (peer_sep == AVDT_TSEP_SRC) {
   2310       peer = btif_av_sink.FindOrCreatePeer(peer_address, bta_handle);
   2311     }
   2312   } else if (bta_handle != kBtaHandleUnknown) {
   2313     if (peer_sep == AVDT_TSEP_SNK) {
   2314       peer = btif_av_source.FindPeerByHandle(bta_handle);
   2315     } else if (peer_sep == AVDT_TSEP_SRC) {
   2316       peer = btif_av_sink.FindPeerByHandle(bta_handle);
   2317     }
   2318   }
   2319   if (peer == nullptr) {
   2320     BTIF_TRACE_ERROR(
   2321         "%s: Cannot find or create %s peer for peer_address=%s handle=0x%x : "
   2322         "event dropped: %s",
   2323         __func__, (peer_sep == AVDT_TSEP_SRC) ? "Source" : "Sink",
   2324         peer_address.ToString().c_str(), bta_handle,
   2325         btif_av_event.ToString().c_str());
   2326     return;
   2327   }
   2328 
   2329   peer->StateMachine().ProcessEvent(btif_av_event.Event(),
   2330                                     btif_av_event.Data());
   2331 }
   2332 
   2333 /**
   2334  * Process BTA AV or BTA AVRCP events. The processing is done on the JNI
   2335  * thread.
   2336  *
   2337  * @param peer_sep the corresponding peer's SEP: AVDT_TSEP_SRC if the peer
   2338  * is A2DP Source, or AVDT_TSEP_SNK if the peer is A2DP Sink.
   2339  * @param btif_av_event the corresponding event
   2340  */
   2341 static void btif_av_handle_bta_av_event(uint8_t peer_sep,
   2342                                         const BtifAvEvent& btif_av_event) {
   2343   RawAddress peer_address = RawAddress::kEmpty;
   2344   tBTA_AV_HNDL bta_handle = kBtaHandleUnknown;
   2345   tBTA_AV_EVT event = btif_av_event.Event();
   2346   tBTA_AV* p_data = (tBTA_AV*)btif_av_event.Data();
   2347 
   2348   BTIF_TRACE_DEBUG("%s: peer_sep=%s (%d) event=%s", __func__,
   2349                    (peer_sep == AVDT_TSEP_SRC) ? "Source" : "Sink", peer_sep,
   2350                    btif_av_event.ToString().c_str());
   2351 
   2352   switch (event) {
   2353     case BTA_AV_ENABLE_EVT: {
   2354       const tBTA_AV_ENABLE& enable = p_data->enable;
   2355       BTIF_TRACE_DEBUG("%s: features=0x%x", __func__, enable.features);
   2356       return;  // Nothing to do
   2357     }
   2358     case BTA_AV_REGISTER_EVT: {
   2359       const tBTA_AV_REGISTER& registr = p_data->registr;
   2360       bta_handle = registr.hndl;
   2361       uint8_t peer_id = registr.app_id;  // The PeerId is used as AppId
   2362       BTIF_TRACE_DEBUG("%s: handle=0x%x app_id=%d", __func__, bta_handle,
   2363                        registr.app_id);
   2364       if (peer_sep == AVDT_TSEP_SNK) {
   2365         btif_av_source.BtaHandleRegistered(peer_id, bta_handle);
   2366       } else if (peer_sep == AVDT_TSEP_SRC) {
   2367         btif_av_sink.BtaHandleRegistered(peer_id, bta_handle);
   2368       }
   2369       return;  // Nothing else to do
   2370     }
   2371     case BTA_AV_OPEN_EVT: {
   2372       const tBTA_AV_OPEN& open = p_data->open;
   2373       peer_address = open.bd_addr;
   2374       bta_handle = open.hndl;
   2375       break;
   2376     }
   2377     case BTA_AV_CLOSE_EVT: {
   2378       const tBTA_AV_CLOSE& close = p_data->close;
   2379       bta_handle = close.hndl;
   2380       break;
   2381     }
   2382     case BTA_AV_START_EVT: {
   2383       const tBTA_AV_START& start = p_data->start;
   2384       bta_handle = start.hndl;
   2385       break;
   2386     }
   2387     case BTA_AV_SUSPEND_EVT:
   2388     case BTA_AV_STOP_EVT: {
   2389       const tBTA_AV_SUSPEND& suspend = p_data->suspend;
   2390       bta_handle = suspend.hndl;
   2391       break;
   2392     }
   2393     case BTA_AV_PROTECT_REQ_EVT: {
   2394       const tBTA_AV_PROTECT_REQ& protect_req = p_data->protect_req;
   2395       bta_handle = protect_req.hndl;
   2396       break;
   2397     }
   2398     case BTA_AV_PROTECT_RSP_EVT: {
   2399       const tBTA_AV_PROTECT_RSP& protect_rsp = p_data->protect_rsp;
   2400       bta_handle = protect_rsp.hndl;
   2401       break;
   2402     }
   2403     case BTA_AV_RC_OPEN_EVT: {
   2404       const tBTA_AV_RC_OPEN& rc_open = p_data->rc_open;
   2405       peer_address = rc_open.peer_addr;
   2406       break;
   2407     }
   2408     case BTA_AV_RC_CLOSE_EVT: {
   2409       const tBTA_AV_RC_CLOSE& rc_close = p_data->rc_close;
   2410       peer_address = rc_close.peer_addr;
   2411       break;
   2412     }
   2413     case BTA_AV_RC_BROWSE_OPEN_EVT: {
   2414       const tBTA_AV_RC_BROWSE_OPEN& rc_browse_open = p_data->rc_browse_open;
   2415       peer_address = rc_browse_open.peer_addr;
   2416       break;
   2417     }
   2418     case BTA_AV_RC_BROWSE_CLOSE_EVT: {
   2419       const tBTA_AV_RC_BROWSE_CLOSE& rc_browse_close = p_data->rc_browse_close;
   2420       peer_address = rc_browse_close.peer_addr;
   2421       break;
   2422     }
   2423     case BTA_AV_REMOTE_CMD_EVT:
   2424     case BTA_AV_REMOTE_RSP_EVT:
   2425     case BTA_AV_VENDOR_CMD_EVT:
   2426     case BTA_AV_VENDOR_RSP_EVT:
   2427     case BTA_AV_META_MSG_EVT:
   2428     case BTA_AV_OFFLOAD_START_RSP_EVT: {
   2429       // TODO: Might be wrong - this code will be removed once those
   2430       // events are received from the AVRCP module.
   2431       if (peer_sep == AVDT_TSEP_SNK) {
   2432         peer_address = btif_av_source.ActivePeer();
   2433       } else if (peer_sep == AVDT_TSEP_SRC) {
   2434         peer_address = btif_av_sink.ActivePeer();
   2435       }
   2436       break;
   2437     }
   2438     case BTA_AV_RECONFIG_EVT: {
   2439       const tBTA_AV_RECONFIG& reconfig = p_data->reconfig;
   2440       bta_handle = reconfig.hndl;
   2441       break;
   2442     }
   2443     case BTA_AV_PENDING_EVT: {
   2444       const tBTA_AV_PEND& pend = p_data->pend;
   2445       peer_address = pend.bd_addr;
   2446       break;
   2447     }
   2448     case BTA_AV_REJECT_EVT: {
   2449       const tBTA_AV_REJECT& reject = p_data->reject;
   2450       peer_address = reject.bd_addr;
   2451       bta_handle = reject.hndl;
   2452       break;
   2453     }
   2454     case BTA_AV_RC_FEAT_EVT: {
   2455       const tBTA_AV_RC_FEAT& rc_feat = p_data->rc_feat;
   2456       peer_address = rc_feat.peer_addr;
   2457       break;
   2458     }
   2459   }
   2460   BTIF_TRACE_DEBUG("%s: peer_address=%s handle=0x%x", __func__,
   2461                    peer_address.ToString().c_str(), bta_handle);
   2462 
   2463   btif_av_handle_event(peer_sep, peer_address, bta_handle, btif_av_event);
   2464 }
   2465 
   2466 static void bta_av_source_callback(tBTA_AV_EVT event, tBTA_AV* p_data) {
   2467   BtifAvEvent btif_av_event(event, p_data, sizeof(tBTA_AV));
   2468   BTIF_TRACE_EVENT("%s: event=%s", __func__, btif_av_event.ToString().c_str());
   2469 
   2470   do_in_bta_thread(FROM_HERE,
   2471                    base::Bind(&btif_av_handle_bta_av_event,
   2472                               AVDT_TSEP_SNK /* peer_sep */, btif_av_event));
   2473 }
   2474 
   2475 static void bta_av_sink_callback(tBTA_AV_EVT event, tBTA_AV* p_data) {
   2476   BtifAvEvent btif_av_event(event, p_data, sizeof(tBTA_AV));
   2477   do_in_bta_thread(FROM_HERE,
   2478                    base::Bind(&btif_av_handle_bta_av_event,
   2479                               AVDT_TSEP_SRC /* peer_sep */, btif_av_event));
   2480 }
   2481 
   2482 // TODO: All processing should be done on the JNI thread
   2483 static void bta_av_sink_media_callback(tBTA_AV_EVT event,
   2484                                        tBTA_AV_MEDIA* p_data) {
   2485   BTIF_TRACE_EVENT("%s: event=%d", __func__, event);
   2486 
   2487   switch (event) {
   2488     case BTA_AV_SINK_MEDIA_DATA_EVT: {
   2489       BtifAvPeer* peer = btif_av_sink_find_peer(btif_av_sink.ActivePeer());
   2490       if (peer != nullptr) {
   2491         int state = peer->StateMachine().StateId();
   2492         if ((state == BtifAvStateMachine::kStateStarted) ||
   2493             (state == BtifAvStateMachine::kStateOpened)) {
   2494           uint8_t queue_len = btif_a2dp_sink_enqueue_buf((BT_HDR*)p_data);
   2495           BTIF_TRACE_DEBUG("%s: Packets in Sink queue %d", __func__, queue_len);
   2496         }
   2497       }
   2498       break;
   2499     }
   2500     case BTA_AV_SINK_MEDIA_CFG_EVT: {
   2501       btif_av_sink_config_req_t config_req;
   2502 
   2503       // Update the codec info of the A2DP Sink decoder
   2504       btif_a2dp_sink_update_decoder((uint8_t*)(p_data->avk_config.codec_info));
   2505 
   2506       config_req.sample_rate =
   2507           A2DP_GetTrackSampleRate(p_data->avk_config.codec_info);
   2508       if (config_req.sample_rate == -1) {
   2509         APPL_TRACE_ERROR("%s: Cannot get the track frequency", __func__);
   2510         break;
   2511       }
   2512       config_req.channel_count =
   2513           A2DP_GetTrackChannelCount(p_data->avk_config.codec_info);
   2514       if (config_req.channel_count == -1) {
   2515         APPL_TRACE_ERROR("%s: Cannot get the channel count", __func__);
   2516         break;
   2517       }
   2518       config_req.peer_address = p_data->avk_config.bd_addr;
   2519       BtifAvEvent btif_av_event(BTIF_AV_SINK_CONFIG_REQ_EVT, &config_req,
   2520                                 sizeof(config_req));
   2521       do_in_bta_thread(FROM_HERE, base::Bind(&btif_av_handle_event,
   2522                                              AVDT_TSEP_SRC,  // peer_sep
   2523                                              config_req.peer_address,
   2524                                              kBtaHandleUnknown, btif_av_event));
   2525       break;
   2526     }
   2527     default:
   2528       break;
   2529   }
   2530 }
   2531 
   2532 // Initializes the AV interface for source mode
   2533 static bt_status_t init_src(
   2534     btav_source_callbacks_t* callbacks, int max_connected_audio_devices,
   2535     std::vector<btav_a2dp_codec_config_t> codec_priorities) {
   2536   BTIF_TRACE_EVENT("%s", __func__);
   2537   return btif_av_source.Init(callbacks, max_connected_audio_devices,
   2538                              codec_priorities);
   2539 }
   2540 
   2541 // Initializes the AV interface for sink mode
   2542 static bt_status_t init_sink(btav_sink_callbacks_t* callbacks) {
   2543   BTIF_TRACE_EVENT("%s", __func__);
   2544   return btif_av_sink.Init(callbacks);
   2545 }
   2546 
   2547 // Updates the final focus state reported by components calling this module
   2548 static void update_audio_focus_state(int state) {
   2549   BTIF_TRACE_DEBUG("%s: state=%d", __func__, state);
   2550   btif_a2dp_sink_set_focus_state_req((btif_a2dp_sink_focus_state_t)state);
   2551 }
   2552 
   2553 // Updates the track gain (used for ducking).
   2554 static void update_audio_track_gain(float gain) {
   2555   BTIF_TRACE_DEBUG("%s: gain=%f", __func__, gain);
   2556   btif_a2dp_sink_set_audio_track_gain(gain);
   2557 }
   2558 
   2559 // Establishes the AV signalling channel with the remote headset
   2560 static bt_status_t connect_int(RawAddress* peer_address, uint16_t uuid) {
   2561   BTIF_TRACE_EVENT("%s: peer_address=%s uuid=0x%x", __func__,
   2562                    peer_address->ToString().c_str(), uuid);
   2563 
   2564   BtifAvPeer* peer = nullptr;
   2565   if (uuid == UUID_SERVCLASS_AUDIO_SOURCE) {
   2566     peer = btif_av_source.FindOrCreatePeer(*peer_address, kBtaHandleUnknown);
   2567     if (peer == nullptr) {
   2568       return BT_STATUS_FAIL;
   2569     }
   2570   } else if (uuid == UUID_SERVCLASS_AUDIO_SINK) {
   2571     peer = btif_av_sink.FindOrCreatePeer(*peer_address, kBtaHandleUnknown);
   2572     if (peer == nullptr) {
   2573       return BT_STATUS_FAIL;
   2574     }
   2575   }
   2576   peer->StateMachine().ProcessEvent(BTIF_AV_CONNECT_REQ_EVT, nullptr);
   2577   return BT_STATUS_SUCCESS;
   2578 }
   2579 
   2580 // Set the active peer
   2581 static void set_active_peer_int(uint8_t peer_sep,
   2582                                 const RawAddress& peer_address) {
   2583   BTIF_TRACE_EVENT("%s: peer_sep=%s (%d) peer_address=%s", __func__,
   2584                    (peer_sep == AVDT_TSEP_SRC) ? "Source" : "Sink", peer_sep,
   2585                    peer_address.ToString().c_str());
   2586   BtifAvPeer* peer = nullptr;
   2587   if (peer_sep == AVDT_TSEP_SNK) {
   2588     if (!btif_av_source.SetActivePeer(peer_address)) {
   2589       BTIF_TRACE_ERROR("%s: Error setting %s as active Sink peer", __func__,
   2590                        peer_address.ToString().c_str());
   2591     }
   2592     return;
   2593   }
   2594   if (peer_sep == AVDT_TSEP_SRC) {
   2595     if (!btif_av_sink.SetActivePeer(peer_address)) {
   2596       BTIF_TRACE_ERROR("%s: Error setting %s as active Source peer", __func__,
   2597                        peer_address.ToString().c_str());
   2598     }
   2599     return;
   2600   }
   2601   // If reached here, we could not set the active peer
   2602   BTIF_TRACE_ERROR("%s: Cannot set active %s peer to %s: peer not %s", __func__,
   2603                    (peer_sep == AVDT_TSEP_SRC) ? "Source" : "Sink",
   2604                    peer_address.ToString().c_str(),
   2605                    (peer == nullptr) ? "found" : "connected");
   2606 }
   2607 
   2608 static bt_status_t src_connect_sink(const RawAddress& peer_address) {
   2609   BTIF_TRACE_EVENT("%s: Peer %s", __func__, peer_address.ToString().c_str());
   2610 
   2611   if (!btif_av_source.Enabled()) {
   2612     BTIF_TRACE_WARNING("%s: BTIF AV Source is not enabled", __func__);
   2613     return BT_STATUS_NOT_READY;
   2614   }
   2615 
   2616   RawAddress peer_address_copy(peer_address);
   2617   return btif_queue_connect(UUID_SERVCLASS_AUDIO_SOURCE, &peer_address_copy,
   2618                             connect_int);
   2619 }
   2620 
   2621 static bt_status_t sink_connect_src(const RawAddress& peer_address) {
   2622   LOG_INFO(LOG_TAG, "%s: Peer %s", __func__, peer_address.ToString().c_str());
   2623 
   2624   if (!btif_av_sink.Enabled()) {
   2625     BTIF_TRACE_WARNING("%s: BTIF AV Sink is not enabled", __func__);
   2626     return BT_STATUS_NOT_READY;
   2627   }
   2628 
   2629   RawAddress peer_address_copy(peer_address);
   2630   return btif_queue_connect(UUID_SERVCLASS_AUDIO_SINK, &peer_address_copy,
   2631                             connect_int);
   2632 }
   2633 
   2634 static bt_status_t src_disconnect_sink(const RawAddress& peer_address) {
   2635   LOG_INFO(LOG_TAG, "%s: Peer %s", __func__, peer_address.ToString().c_str());
   2636 
   2637   if (!btif_av_source.Enabled()) {
   2638     BTIF_TRACE_WARNING("%s: BTIF AV Source is not enabled", __func__);
   2639     return BT_STATUS_NOT_READY;
   2640   }
   2641 
   2642   BtifAvEvent btif_av_event(BTIF_AV_DISCONNECT_REQ_EVT, &peer_address,
   2643                             sizeof(peer_address));
   2644   return do_in_bta_thread(
   2645       FROM_HERE, base::Bind(&btif_av_handle_event,
   2646                             AVDT_TSEP_SNK,  // peer_sep
   2647                             peer_address, kBtaHandleUnknown, btif_av_event));
   2648 }
   2649 
   2650 static bt_status_t sink_disconnect_src(const RawAddress& peer_address) {
   2651   LOG_INFO(LOG_TAG, "%s: Peer %s", __func__, peer_address.ToString().c_str());
   2652 
   2653   if (!btif_av_sink.Enabled()) {
   2654     BTIF_TRACE_WARNING("%s: BTIF AV Sink is not enabled", __func__);
   2655     return BT_STATUS_NOT_READY;
   2656   }
   2657 
   2658   BtifAvEvent btif_av_event(BTIF_AV_DISCONNECT_REQ_EVT, &peer_address,
   2659                             sizeof(peer_address));
   2660   return do_in_bta_thread(
   2661       FROM_HERE, base::Bind(&btif_av_handle_event,
   2662                             AVDT_TSEP_SRC,  // peer_sep
   2663                             peer_address, kBtaHandleUnknown, btif_av_event));
   2664 }
   2665 
   2666 static bt_status_t src_set_active_sink(const RawAddress& peer_address) {
   2667   BTIF_TRACE_EVENT("%s: Peer %s", __func__, peer_address.ToString().c_str());
   2668 
   2669   if (!btif_av_source.Enabled()) {
   2670     BTIF_TRACE_WARNING("%s: BTIF AV Source is not enabled", __func__);
   2671     return BT_STATUS_NOT_READY;
   2672   }
   2673 
   2674   return do_in_bta_thread(FROM_HERE, base::Bind(&set_active_peer_int,
   2675                                                 AVDT_TSEP_SNK,  // peer_sep
   2676                                                 peer_address));
   2677 }
   2678 
   2679 static bt_status_t codec_config_src(
   2680     const RawAddress& peer_address,
   2681     std::vector<btav_a2dp_codec_config_t> codec_preferences) {
   2682   BTIF_TRACE_EVENT("%s", __func__);
   2683 
   2684   if (!btif_av_source.Enabled()) {
   2685     BTIF_TRACE_WARNING("%s: BTIF AV Source is not enabled", __func__);
   2686     return BT_STATUS_NOT_READY;
   2687   }
   2688 
   2689   return do_in_bta_thread(
   2690       FROM_HERE, base::Bind(&BtifAvSource::UpdateCodecConfig,
   2691                             base::Unretained(&btif_av_source), peer_address,
   2692                             codec_preferences));
   2693 }
   2694 
   2695 static void cleanup_src(void) {
   2696   BTIF_TRACE_EVENT("%s", __func__);
   2697   do_in_bta_thread(FROM_HERE, base::Bind(&BtifAvSource::Cleanup,
   2698                                          base::Unretained(&btif_av_source)));
   2699 }
   2700 
   2701 static void cleanup_sink(void) {
   2702   BTIF_TRACE_EVENT("%s", __func__);
   2703   do_in_bta_thread(FROM_HERE, base::Bind(&BtifAvSink::Cleanup,
   2704                                          base::Unretained(&btif_av_sink)));
   2705 }
   2706 
   2707 static const btav_source_interface_t bt_av_src_interface = {
   2708     sizeof(btav_source_interface_t),
   2709     init_src,
   2710     src_connect_sink,
   2711     src_disconnect_sink,
   2712     src_set_active_sink,
   2713     codec_config_src,
   2714     cleanup_src,
   2715 };
   2716 
   2717 static const btav_sink_interface_t bt_av_sink_interface = {
   2718     sizeof(btav_sink_interface_t), init_sink,    sink_connect_src,
   2719     sink_disconnect_src,           cleanup_sink, update_audio_focus_state,
   2720     update_audio_track_gain,
   2721 };
   2722 
   2723 RawAddress btif_av_source_active_peer(void) {
   2724   return btif_av_source.ActivePeer();
   2725 }
   2726 RawAddress btif_av_sink_active_peer(void) { return btif_av_sink.ActivePeer(); }
   2727 
   2728 bool btif_av_is_sink_enabled(void) { return btif_av_sink.Enabled(); }
   2729 
   2730 void btif_av_stream_start(void) {
   2731   LOG_INFO(LOG_TAG, "%s", __func__);
   2732   btif_av_source_dispatch_sm_event(btif_av_source_active_peer(),
   2733                                    BTIF_AV_START_STREAM_REQ_EVT);
   2734 }
   2735 
   2736 void btif_av_stream_stop(const RawAddress& peer_address) {
   2737   LOG_INFO(LOG_TAG, "%s peer %s", __func__, peer_address.ToString().c_str());
   2738 
   2739   if (!peer_address.IsEmpty()) {
   2740     btif_av_source_dispatch_sm_event(peer_address, BTIF_AV_STOP_STREAM_REQ_EVT);
   2741     return;
   2742   }
   2743 
   2744   // The active peer might have changed and we might be in the process
   2745   // of reconfiguring the stream. We need to stop the appopriate peer(s).
   2746   for (auto it : btif_av_source.Peers()) {
   2747     const BtifAvPeer* peer = it.second;
   2748     btif_av_source_dispatch_sm_event(peer->PeerAddress(),
   2749                                      BTIF_AV_STOP_STREAM_REQ_EVT);
   2750   }
   2751 }
   2752 
   2753 void btif_av_stream_suspend(void) {
   2754   LOG_INFO(LOG_TAG, "%s", __func__);
   2755   // The active peer might have changed and we might be in the process
   2756   // of reconfiguring the stream. We need to suspend the appropriate peer(s).
   2757   for (auto it : btif_av_source.Peers()) {
   2758     const BtifAvPeer* peer = it.second;
   2759     btif_av_source_dispatch_sm_event(peer->PeerAddress(),
   2760                                      BTIF_AV_SUSPEND_STREAM_REQ_EVT);
   2761   }
   2762 }
   2763 
   2764 void btif_av_stream_start_offload(void) {
   2765   LOG_INFO(LOG_TAG, "%s", __func__);
   2766   btif_av_source_dispatch_sm_event(btif_av_source_active_peer(),
   2767                                    BTIF_AV_OFFLOAD_START_REQ_EVT);
   2768 }
   2769 
   2770 void btif_av_src_disconnect_sink(const RawAddress& peer_address) {
   2771   LOG_INFO(LOG_TAG, "%s: peer %s", __func__, peer_address.ToString().c_str());
   2772   src_disconnect_sink(peer_address);
   2773 }
   2774 
   2775 bool btif_av_stream_ready(void) {
   2776   // Make sure the main adapter is enabled
   2777   if (btif_is_enabled() == 0) {
   2778     BTIF_TRACE_EVENT("%s: Main adapter is not enabled", __func__);
   2779     return false;
   2780   }
   2781 
   2782   BtifAvPeer* peer = btif_av_find_active_peer();
   2783   if (peer == nullptr) {
   2784     BTIF_TRACE_WARNING("%s: No active peer found", __func__);
   2785     return false;
   2786   }
   2787 
   2788   int state = peer->StateMachine().StateId();
   2789   LOG_INFO(LOG_TAG, "%s: Peer %s : state=%d, flags=%s", __func__,
   2790            peer->PeerAddress().ToString().c_str(), state,
   2791            peer->FlagsToString().c_str());
   2792   // check if we are remotely suspended or stop is pending
   2793   if (peer->CheckFlags(BtifAvPeer::kFlagRemoteSuspend |
   2794                        BtifAvPeer::kFlagPendingStop)) {
   2795     return false;
   2796   }
   2797 
   2798   return (state == BtifAvStateMachine::kStateOpened);
   2799 }
   2800 
   2801 bool btif_av_stream_started_ready(void) {
   2802   BtifAvPeer* peer = btif_av_find_active_peer();
   2803   if (peer == nullptr) {
   2804     BTIF_TRACE_WARNING("%s: No active peer found", __func__);
   2805     return false;
   2806   }
   2807 
   2808   int state = peer->StateMachine().StateId();
   2809   bool ready = false;
   2810   if (peer->CheckFlags(BtifAvPeer::kFlagLocalSuspendPending |
   2811                        BtifAvPeer::kFlagRemoteSuspend |
   2812                        BtifAvPeer::kFlagPendingStop)) {
   2813     // Disallow media task to start if we have pending actions
   2814     ready = false;
   2815   } else {
   2816     ready = (state == BtifAvStateMachine::kStateStarted);
   2817   }
   2818   LOG_INFO(LOG_TAG, "%s: Peer %s : state=%d flags=%s ready=%d", __func__,
   2819            peer->PeerAddress().ToString().c_str(), state,
   2820            peer->FlagsToString().c_str(), ready);
   2821 
   2822   return ready;
   2823 }
   2824 
   2825 static void btif_av_source_dispatch_sm_event(const RawAddress& peer_address,
   2826                                              btif_av_sm_event_t event) {
   2827   BtifAvEvent btif_av_event(event, nullptr, 0);
   2828   BTIF_TRACE_EVENT("%s: peer_address=%s event=%s", __func__,
   2829                    peer_address.ToString().c_str(),
   2830                    btif_av_event.ToString().c_str());
   2831 
   2832   do_in_bta_thread(FROM_HERE,
   2833                    base::Bind(&btif_av_handle_event,
   2834                               AVDT_TSEP_SNK,  // peer_sep
   2835                               peer_address, kBtaHandleUnknown, btif_av_event));
   2836 }
   2837 
   2838 static void btif_av_sink_dispatch_sm_event(const RawAddress& peer_address,
   2839                                            btif_av_sm_event_t event) {
   2840   BtifAvEvent btif_av_event(event, nullptr, 0);
   2841   BTIF_TRACE_EVENT("%s: peer_address=%s event=%s", __func__,
   2842                    peer_address.ToString().c_str(),
   2843                    btif_av_event.ToString().c_str());
   2844 
   2845   do_in_bta_thread(FROM_HERE,
   2846                    base::Bind(&btif_av_handle_event,
   2847                               AVDT_TSEP_SRC,  // peer_sep
   2848                               peer_address, kBtaHandleUnknown, btif_av_event));
   2849 }
   2850 
   2851 bt_status_t btif_av_source_execute_service(bool enable) {
   2852   BTIF_TRACE_EVENT("%s: Source service: %s", __func__,
   2853                    (enable) ? "enable" : "disable");
   2854 
   2855   if (enable) {
   2856     // TODO: Removed BTA_SEC_AUTHORIZE since the Java/App does not
   2857     // handle this request in order to allow incoming connections to succeed.
   2858     // We need to put this back once support for this is added.
   2859 
   2860     // Added BTA_AV_FEAT_NO_SCO_SSPD - this ensures that the BTA does not
   2861     // auto-suspend av streaming on AG events(SCO or Call). The suspend shall
   2862     // be initiated by the app/audioflinger layers.
   2863     // Support for browsing for SDP record should work only if we enable BROWSE
   2864     // while registering.
   2865     tBTA_AV_FEAT features = BTA_AV_FEAT_RCTG | BTA_AV_FEAT_METADATA |
   2866                             BTA_AV_FEAT_VENDOR | BTA_AV_FEAT_NO_SCO_SSPD;
   2867 
   2868     if (delay_reporting_enabled()) {
   2869       features |= BTA_AV_FEAT_DELAY_RPT;
   2870     }
   2871 
   2872 #if (AVRC_ADV_CTRL_INCLUDED == TRUE)
   2873     features |= BTA_AV_FEAT_RCCT | BTA_AV_FEAT_ADV_CTRL | BTA_AV_FEAT_BROWSE;
   2874 #endif
   2875     BTA_AvEnable(BTA_SEC_AUTHENTICATE, features, bta_av_source_callback);
   2876     btif_av_source.RegisterAllBtaHandles();
   2877     return BT_STATUS_SUCCESS;
   2878   }
   2879 
   2880   // Disable the service
   2881   btif_av_source.DeregisterAllBtaHandles();
   2882   BTA_AvDisable();
   2883   return BT_STATUS_SUCCESS;
   2884 }
   2885 
   2886 bt_status_t btif_av_sink_execute_service(bool enable) {
   2887   BTIF_TRACE_EVENT("%s: Sink service: %s", __func__,
   2888                    (enable) ? "enable" : "disable");
   2889 
   2890   if (enable) {
   2891     // Added BTA_AV_FEAT_NO_SCO_SSPD - this ensures that the BTA does not
   2892     // auto-suspend AV streaming on AG events (SCO or Call). The suspend shall
   2893     // be initiated by the app/audioflinger layers.
   2894     tBTA_AV_FEAT features = BTA_AV_FEAT_NO_SCO_SSPD | BTA_AV_FEAT_RCCT |
   2895                             BTA_AV_FEAT_METADATA | BTA_AV_FEAT_VENDOR |
   2896                             BTA_AV_FEAT_ADV_CTRL | BTA_AV_FEAT_RCTG |
   2897                             BTA_AV_FEAT_BROWSE;
   2898     BTA_AvEnable(BTA_SEC_AUTHENTICATE, features, bta_av_sink_callback);
   2899     btif_av_sink.RegisterAllBtaHandles();
   2900     return BT_STATUS_SUCCESS;
   2901   }
   2902 
   2903   // Disable the service
   2904   btif_av_sink.DeregisterAllBtaHandles();
   2905   BTA_AvDisable();
   2906   return BT_STATUS_SUCCESS;
   2907 }
   2908 
   2909 // Get the AV callback interface for A2DP source profile
   2910 const btav_source_interface_t* btif_av_get_src_interface(void) {
   2911   BTIF_TRACE_EVENT("%s", __func__);
   2912   return &bt_av_src_interface;
   2913 }
   2914 
   2915 // Get the AV callback interface for A2DP sink profile
   2916 const btav_sink_interface_t* btif_av_get_sink_interface(void) {
   2917   BTIF_TRACE_EVENT("%s", __func__);
   2918   return &bt_av_sink_interface;
   2919 }
   2920 
   2921 bool btif_av_is_connected(void) {
   2922   BtifAvPeer* peer = btif_av_find_active_peer();
   2923   if (peer == nullptr) {
   2924     BTIF_TRACE_WARNING("%s: No active peer found", __func__);
   2925     return false;
   2926   }
   2927 
   2928   bool connected = peer->IsConnected();
   2929   BTIF_TRACE_DEBUG("%s: Peer %s is %s", __func__,
   2930                    peer->PeerAddress().ToString().c_str(),
   2931                    (connected) ? "connected" : "not connected");
   2932   return connected;
   2933 }
   2934 
   2935 uint8_t btif_av_get_peer_sep(void) {
   2936   BtifAvPeer* peer = btif_av_find_active_peer();
   2937   if (peer == nullptr) {
   2938     BTIF_TRACE_WARNING("%s: No active peer found", __func__);
   2939     return AVDT_TSEP_SNK;
   2940   }
   2941 
   2942   uint8_t peer_sep = peer->PeerSep();
   2943   BTIF_TRACE_DEBUG("%s: Peer %s SEP is %s (%d)", __func__,
   2944                    peer->PeerAddress().ToString().c_str(),
   2945                    (peer_sep == AVDT_TSEP_SRC) ? "Source" : "Sink", peer_sep);
   2946   return peer_sep;
   2947 }
   2948 
   2949 void btif_av_clear_remote_suspend_flag(void) {
   2950   BtifAvPeer* peer = btif_av_find_active_peer();
   2951   if (peer == nullptr) {
   2952     BTIF_TRACE_WARNING("%s: No active peer found", __func__);
   2953     return;
   2954   }
   2955 
   2956   BTIF_TRACE_DEBUG("%s: Peer %s : flags=%s are cleared", __func__,
   2957                    peer->PeerAddress().ToString().c_str(),
   2958                    peer->FlagsToString().c_str());
   2959   peer->ClearFlags(BtifAvPeer::kFlagRemoteSuspend);
   2960 }
   2961 
   2962 void btif_av_avrcp_event_open(const RawAddress& peer_address) {
   2963   // TODO: We need a better demultipexing mechanism whether the remote device
   2964   // is an A2DP Source or a Sink.
   2965   if (btif_av_source.Enabled()) {
   2966     BtifAvPeer* peer =
   2967         btif_av_source.FindOrCreatePeer(peer_address, kBtaHandleUnknown);
   2968     if (peer != nullptr) {
   2969       btif_av_source_dispatch_sm_event(peer_address, BTIF_AV_AVRCP_OPEN_EVT);
   2970       return;
   2971     }
   2972   } else if (btif_av_sink.Enabled()) {
   2973     BtifAvPeer* peer =
   2974         btif_av_sink.FindOrCreatePeer(peer_address, kBtaHandleUnknown);
   2975     if (peer != nullptr) {
   2976       btif_av_sink_dispatch_sm_event(peer_address, BTIF_AV_AVRCP_OPEN_EVT);
   2977       return;
   2978     }
   2979   }
   2980   BTIF_TRACE_ERROR("%s: event ignored: cannot find or create peer state for %s",
   2981                    __func__, peer_address.ToString().c_str());
   2982 }
   2983 
   2984 void btif_av_avrcp_event_close(const RawAddress& peer_address) {
   2985   // TODO: We need a better demultipexing mechanism whether the remote device
   2986   // is an A2DP Source or a Sink.
   2987   if (btif_av_source.Enabled()) {
   2988     btif_av_source_dispatch_sm_event(peer_address, BTIF_AV_AVRCP_CLOSE_EVT);
   2989   } else if (btif_av_sink.Enabled()) {
   2990     btif_av_sink_dispatch_sm_event(peer_address, BTIF_AV_AVRCP_CLOSE_EVT);
   2991   }
   2992 }
   2993 
   2994 void btif_av_avrcp_event_remote_play(const RawAddress& peer_address) {
   2995   // TODO: We need a better demultipexing mechanism whether the remote device
   2996   // is an A2DP Source or a Sink.
   2997   if (btif_av_source.Enabled()) {
   2998     btif_av_source_dispatch_sm_event(peer_address,
   2999                                      BTIF_AV_AVRCP_REMOTE_PLAY_EVT);
   3000   } else if (btif_av_sink.Enabled()) {
   3001     btif_av_sink_dispatch_sm_event(peer_address, BTIF_AV_AVRCP_REMOTE_PLAY_EVT);
   3002   }
   3003 }
   3004 
   3005 bool btif_av_is_peer_edr(const RawAddress& peer_address) {
   3006   BtifAvPeer* peer = btif_av_find_peer(peer_address);
   3007   if (peer == nullptr) {
   3008     BTIF_TRACE_WARNING("%s: No peer found for peer_address=%s", __func__,
   3009                        peer_address.ToString().c_str());
   3010     return false;
   3011   }
   3012   if (!peer->IsConnected()) {
   3013     BTIF_TRACE_WARNING("%s: Peer %s is not connected", __func__,
   3014                        peer_address.ToString().c_str());
   3015     return false;
   3016   }
   3017 
   3018   bool is_edr = peer->IsEdr();
   3019   BTIF_TRACE_DEBUG("%s: Peer %s : is_edr=%d", __func__,
   3020                    peer_address.ToString().c_str(), is_edr);
   3021   return is_edr;
   3022 }
   3023 
   3024 bool btif_av_peer_supports_3mbps(const RawAddress& peer_address) {
   3025   BtifAvPeer* peer = btif_av_find_peer(peer_address);
   3026   if (peer == nullptr) {
   3027     BTIF_TRACE_WARNING("%s: No peer found for peer_address=%s", __func__,
   3028                        peer_address.ToString().c_str());
   3029     return false;
   3030   }
   3031 
   3032   bool is3mbps = peer->Is3Mbps();
   3033   bool is_connected = peer->IsConnected();
   3034   BTIF_TRACE_DEBUG("%s: Peer %s : connected=%d, edr_3mbps=%d", __func__,
   3035                    peer_address.ToString().c_str(), is_connected, is3mbps);
   3036   return (is_connected && is3mbps);
   3037 }
   3038 
   3039 void btif_av_acl_disconnected(const RawAddress& peer_address) {
   3040   // Inform the application that ACL is disconnected and move to idle state
   3041   LOG_INFO(LOG_TAG, "%s: Peer %s : ACL Disconnected", __func__,
   3042            peer_address.ToString().c_str());
   3043 
   3044   if (btif_av_source.Enabled()) {
   3045     btif_av_source_dispatch_sm_event(peer_address, BTIF_AV_ACL_DISCONNECTED);
   3046   } else if (btif_av_sink.Enabled()) {
   3047     btif_av_sink_dispatch_sm_event(peer_address, BTIF_AV_ACL_DISCONNECTED);
   3048   }
   3049 }
   3050 
   3051 static void btif_debug_av_peer_dump(int fd, const BtifAvPeer& peer) {
   3052   std::string state_str;
   3053   int state = peer.StateMachine().StateId();
   3054   switch (state) {
   3055     case BtifAvStateMachine::kStateIdle:
   3056       state_str = "Idle";
   3057       break;
   3058     case BtifAvStateMachine::kStateOpening:
   3059       state_str = "Opening";
   3060       break;
   3061     case BtifAvStateMachine::kStateOpened:
   3062       state_str = "Opened";
   3063       break;
   3064     case BtifAvStateMachine::kStateStarted:
   3065       state_str = "Started";
   3066       break;
   3067     case BtifAvStateMachine::kStateClosing:
   3068       state_str = "Closing";
   3069       break;
   3070     default:
   3071       state_str = "Unknown(" + std::to_string(state) + ")";
   3072       break;
   3073   }
   3074 
   3075   dprintf(fd, "  Peer: %s\n", peer.PeerAddress().ToString().c_str());
   3076   dprintf(fd, "    Connected: %s\n", peer.IsConnected() ? "true" : "false");
   3077   dprintf(fd, "    Streaming: %s\n", peer.IsStreaming() ? "true" : "false");
   3078   dprintf(fd, "    SEP: %d(%s)\n", peer.PeerSep(),
   3079           (peer.IsSource()) ? "Source" : "Sink");
   3080   dprintf(fd, "    State Machine: %s\n", state_str.c_str());
   3081   dprintf(fd, "    Flags: %s\n", peer.FlagsToString().c_str());
   3082   dprintf(fd, "    OpenOnRcTimer: %s\n",
   3083           alarm_is_scheduled(peer.AvOpenOnRcTimer()) ? "Scheduled"
   3084                                                      : "Not scheduled");
   3085   dprintf(fd, "    BTA Handle: 0x%x\n", peer.BtaHandle());
   3086   dprintf(fd, "    Peer ID: %d\n", peer.PeerId());
   3087   dprintf(fd, "    EDR: %s\n", peer.IsEdr() ? "true" : "false");
   3088   dprintf(fd, "    Support 3Mbps: %s\n", peer.Is3Mbps() ? "true" : "false");
   3089   dprintf(fd, "    Self Initiated Connection: %s\n",
   3090           peer.SelfInitiatedConnection() ? "true" : "false");
   3091 }
   3092 
   3093 static void btif_debug_av_source_dump(int fd) {
   3094   bool enabled = btif_av_source.Enabled();
   3095 
   3096   dprintf(fd, "\nA2DP Source State: %s\n", (enabled) ? "Enabled" : "Disabled");
   3097   if (!enabled) return;
   3098   dprintf(fd, "  Active peer: %s\n",
   3099           btif_av_source.ActivePeer().ToString().c_str());
   3100   for (auto it : btif_av_source.Peers()) {
   3101     const BtifAvPeer* peer = it.second;
   3102     btif_debug_av_peer_dump(fd, *peer);
   3103   }
   3104 }
   3105 
   3106 static void btif_debug_av_sink_dump(int fd) {
   3107   bool enabled = btif_av_sink.Enabled();
   3108 
   3109   dprintf(fd, "\nA2DP Sink State: %s\n", (enabled) ? "Enabled" : "Disabled");
   3110   if (!enabled) return;
   3111   dprintf(fd, "  Active peer: %s\n",
   3112           btif_av_sink.ActivePeer().ToString().c_str());
   3113   dprintf(fd, "  Peers:\n");
   3114   for (auto it : btif_av_sink.Peers()) {
   3115     const BtifAvPeer* peer = it.second;
   3116     btif_debug_av_peer_dump(fd, *peer);
   3117   }
   3118 }
   3119 
   3120 void btif_debug_av_dump(int fd) {
   3121   btif_debug_av_source_dump(fd);
   3122   btif_debug_av_sink_dump(fd);
   3123 }
   3124 
   3125 void btif_av_set_audio_delay(uint16_t delay) {
   3126   btif_a2dp_control_set_audio_delay(delay);
   3127 }
   3128 
   3129 void btif_av_reset_audio_delay(void) { btif_a2dp_control_reset_audio_delay(); }
   3130 
   3131 bool btif_av_is_a2dp_offload_enabled() {
   3132   return btif_av_source.A2dpOffloadEnabled();
   3133 }
   3134