Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 28991645 authored by weichinweng's avatar weichinweng
Browse files

Hearing Aid: Add clear conn_id and close ctrl UIPC when BT turn off

* On some condition, BT will stay on BLE_ON state when BT turn off. For
the case, Hearing Aid should be correctly disconnected and ctrl UIPC
close until next BT turn on.
* This CL add clear BtaGATTQueue and Close GATTC to make sure Queue
clean and HA enter disconnected state. And don't restart ctrl UIPC if
HearingAid is shutdown.

Bug: 118803637
Test: make, BT off/on when play A2DP and an app registered.
Change-Id: I1c52307637ee6b34222de9308dcfe1392ad170e8
parent a0a4c3e7
Loading
Loading
Loading
Loading
+16 −21
Original line number Diff line number Diff line
@@ -1195,26 +1195,15 @@ class HearingAidImpl : public HearingAid {
    VLOG(2) << __func__ << ": " << address;

    bool connected = hearingDevice->accepting_audio;
    hearingDevice->accepting_audio = false;

    LOG(INFO) << "GAP_EVT_CONN_CLOSED: " << hearingDevice->address
              << ", playback_started=" << hearingDevice->playback_started;
    hearingDevice->playback_started = false;

    if (hearingDevice->connecting_actively) {
      // cancel pending direct connect
      BTA_GATTC_CancelOpen(gatt_if, address, true);
    }

    if (hearingDevice->conn_id) {
      BTA_GATTC_Close(hearingDevice->conn_id);
    }

    if (hearingDevice->gap_handle) {
      GAP_ConnClose(hearingDevice->gap_handle);
      hearingDevice->gap_handle = 0;
    }

    // cancel autoconnect
    BTA_GATTC_CancelOpen(gatt_if, address, false);

@@ -1253,10 +1242,18 @@ class HearingAidImpl : public HearingAid {
      hearingDevice->connection_update_status = NONE;
    }

    if (hearingDevice->conn_id) {
      BtaGattQueue::Clean(hearingDevice->conn_id);
      BTA_GATTC_Close(hearingDevice->conn_id);
      hearingDevice->conn_id = 0;
    }

    if (hearingDevice->gap_handle) {
      GAP_ConnClose(hearingDevice->gap_handle);
      hearingDevice->gap_handle = 0;
    }

    hearingDevice->accepting_audio = false;
    hearingDevice->conn_id = 0;
    LOG(INFO) << __func__ << ": device=" << hearingDevice->address
              << ", playback_started=" << hearingDevice->playback_started;
    hearingDevice->playback_started = false;
@@ -1278,14 +1275,10 @@ class HearingAidImpl : public HearingAid {
  void CleanUp() {
    BTA_GATTC_AppDeregister(gatt_if);
    for (HearingDevice& device : hearingDevices.devices) {
      if (!device.gap_handle) continue;

      GAP_ConnClose(device.gap_handle);
      device.gap_handle = 0;
      DoDisconnectCleanUp(&device);
    }

    hearingDevices.devices.clear();
    HearingAidAudioSource::Stop();
  }

 private:
@@ -1390,7 +1383,7 @@ void HearingAid::Initialize(
  HearingAidAudioSource::Initialize();
}

bool HearingAid::IsInitialized() { return instance; }
bool HearingAid::IsHearingAidRunning() { return instance; }

HearingAid* HearingAid::Get() {
  CHECK(instance);
@@ -1426,11 +1419,13 @@ void HearingAid::CleanUp() {
  // Must stop audio source to make sure it doesn't call any of callbacks on our
  // soon to be  null instance
  HearingAidAudioSource::Stop();
  HearingAidAudioSource::CleanUp();

  instance->CleanUp();
  HearingAidImpl* ptr = instance;
  instance = nullptr;
  HearingAidAudioSource::CleanUp();

  ptr->CleanUp();

  delete ptr;
};

+5 −2
Original line number Diff line number Diff line
@@ -306,8 +306,11 @@ void hearing_aid_ctrl_cb(tUIPC_CH_ID, tUIPC_EVENT event) {
    case UIPC_OPEN_EVT:
      break;
    case UIPC_CLOSE_EVT:
      /* restart ctrl server unless we are shutting down */
      if (HearingAid::IsHearingAidRunning()) {
        UIPC_Open(*uipc_hearing_aid, UIPC_CH_ID_AV_CTRL, hearing_aid_ctrl_cb,
                  HEARING_AID_CTRL_PATH);
      }
      break;
    case UIPC_RX_DATA_READY_EVT:
      hearing_aid_recv_ctrl_data();
+1 −1
Original line number Diff line number Diff line
@@ -41,7 +41,7 @@ class HearingAid {
  static void Initialize(bluetooth::hearing_aid::HearingAidCallbacks* callbacks,
                         base::Closure initCb);
  static void CleanUp();
  static bool IsInitialized();
  static bool IsHearingAidRunning();
  static HearingAid* Get();
  static void DebugDump(int fd);

+1 −1
Original line number Diff line number Diff line
@@ -106,7 +106,7 @@ class HearingAidInterfaceImpl
    DVLOG(2) << __func__ << " address: " << address;

    // RemoveDevice can be called on devices that don't have HA enabled
    if (HearingAid::IsInitialized()) {
    if (HearingAid::IsHearingAidRunning()) {
      do_in_main_thread(FROM_HERE,
                        Bind(&HearingAid::Disconnect,
                             Unretained(HearingAid::Get()), address));