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