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

Commit fb6b13ac authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge changes Ibfaa0438,I3655237b into tm-d1-dev

* changes:
  le_audio: Add TMAP 48_3/2/1 compatible scenarios
  le_audio: Initial implementation of TMAP
parents 21468f28 e0174d20
Loading
Loading
Loading
Loading
+1052 −113

File changed.

Preview size limit exceeded, changes collapsed.

+26 −0
Original line number Diff line number Diff line
@@ -84,6 +84,12 @@
            "configurations": [
                "DualDev_OneChanStereoSnk_48_4_Server_Preferred",
                "DualDev_OneChanStereoSnk_48_4_2",
                "DualDev_OneChanStereoSnk_48_3_Server_Preferred",
                "DualDev_OneChanStereoSnk_48_3_2",
                "DualDev_OneChanStereoSnk_48_2_Server_Preferred",
                "DualDev_OneChanStereoSnk_48_2_2",
                "DualDev_OneChanStereoSnk_48_1_Server_Preferred",
                "DualDev_OneChanStereoSnk_48_1_2",
                "DualDev_OneChanStereoSnk_24_2_Server_Preferred",
                "DualDev_OneChanStereoSnk_24_2_2",
                "DualDev_OneChanStereoSnk_16_2_Server_Preferred",
@@ -92,6 +98,12 @@
                "DualDev_OneChanStereoSnk_16_1_2",
                "SingleDev_OneChanStereoSnk_48_4_Server_Preferred",
                "SingleDev_OneChanStereoSnk_48_4_2",
                "SingleDev_OneChanStereoSnk_48_3_Server_Preferred",
                "SingleDev_OneChanStereoSnk_48_3_2",
                "SingleDev_OneChanStereoSnk_48_2_Server_Preferred",
                "SingleDev_OneChanStereoSnk_48_2_2",
                "SingleDev_OneChanStereoSnk_48_1_Server_Preferred",
                "SingleDev_OneChanStereoSnk_48_1_2",
                "SingleDev_OneChanStereoSnk_24_2_Server_Preferred",
                "SingleDev_OneChanStereoSnk_24_2_2",
                "SingleDev_OneChanStereoSnk_16_2_Server_Preferred",
@@ -100,6 +112,14 @@
                "SingleDev_OneChanStereoSnk_16_1_2",
                "SingleDev_TwoChanStereoSnk_48_4_Server_Preferred",
                "SingleDev_TwoChanStereoSnk_48_4_2",
                "SingleDev_TwoChanStereoSnk_48_4_Server_Preferred",
                "SingleDev_TwoChanStereoSnk_48_4_2",
                "SingleDev_TwoChanStereoSnk_48_3_Server_Preferred",
                "SingleDev_TwoChanStereoSnk_48_3_2",
                "SingleDev_TwoChanStereoSnk_48_2_Server_Preferred",
                "SingleDev_TwoChanStereoSnk_48_2_2",
                "SingleDev_TwoChanStereoSnk_48_1_Server_Preferred",
                "SingleDev_TwoChanStereoSnk_48_1_2",
                "SingleDev_TwoChanStereoSnk_24_2_Server_Preferred",
                "SingleDev_TwoChanStereoSnk_24_2_2",
                "SingleDev_TwoChanStereoSnk_16_2_Server_Preferred",
@@ -108,6 +128,12 @@
                "SingleDev_TwoChanStereoSnk_16_1_2",
                "SingleDev_OneChanMonoSnk_48_4_Server_Preferred",
                "SingleDev_OneChanMonoSnk_48_4_2",
                "SingleDev_OneChanMonoSnk_48_3_Server_Preferred",
                "SingleDev_OneChanMonoSnk_48_3_2",
                "SingleDev_OneChanMonoSnk_48_2_Server_Preferred",
                "SingleDev_OneChanMonoSnk_48_2_2",
                "SingleDev_OneChanMonoSnk_48_1_Server_Preferred",
                "SingleDev_OneChanMonoSnk_48_1_2",
                "SingleDev_OneChanMonoSnk_24_2_Server_Preferred",
                "SingleDev_OneChanMonoSnk_24_2_2",
                "SingleDev_OneChanMonoSnk_16_2_Server_Preferred",
+27 −0
Original line number Diff line number Diff line
@@ -1278,6 +1278,9 @@ class LeAudioClientImpl : public LeAudioClient {

      if (ParseAseCtpNotification(*ntf, len, value))
        ControlPointNotificationHandler(*ntf);
    } else if (hdl == leAudioDevice->tmap_role_hdl_) {
      le_audio::client_parser::tmap::ParseTmapRole(leAudioDevice->tmap_role_,
                                                   len, value);
    } else {
      LOG(ERROR) << __func__ << ", Unknown attribute read: " << loghex(hdl);
    }
@@ -1573,6 +1576,7 @@ class LeAudioClientImpl : public LeAudioClient {

    const gatt::Service* pac_svc = nullptr;
    const gatt::Service* ase_svc = nullptr;
    const gatt::Service* tmas_svc = nullptr;

    std::vector<uint16_t> csis_primary_handles;
    uint16_t cas_csis_included_handle = 0;
@@ -1603,6 +1607,10 @@ class LeAudioClientImpl : public LeAudioClient {
            break;
          }
        }
      } else if (tmp.uuid == le_audio::uuid::kTelephonyMediaAudioServiceUuid) {
        LOG_INFO(", Found Telephony and Media Audio service, handle: %04x",
                 tmp.handle);
        tmas_svc = &tmp;
      }
    }

@@ -1859,6 +1867,25 @@ class LeAudioClientImpl : public LeAudioClient {
      }
    }

    if (tmas_svc) {
      for (const gatt::Characteristic& charac : tmas_svc->characteristics) {
        if (charac.uuid ==
            le_audio::uuid::kTelephonyMediaAudioProfileRoleCharacteristicUuid) {
          leAudioDevice->tmap_role_hdl_ = charac.value_handle;

          /* Obtain initial state of TMAP role */
          BtaGattQueue::ReadCharacteristic(conn_id,
                                           leAudioDevice->tmap_role_hdl_,
                                           OnGattReadRspStatic, NULL);

          LOG_INFO(
              ", Found Telephony and Media Profile characteristic, "
              "handle: %04x",
              leAudioDevice->tmap_role_hdl_);
        }
      }
    }

    leAudioDevice->known_service_handles_ = true;
    leAudioDevice->notify_connected_after_read_ = true;

+21 −0
Original line number Diff line number Diff line
@@ -657,5 +657,26 @@ bool ParseAvailableAudioContexts(struct acs_available_audio_contexts& contexts,
}
}  // namespace pacs

namespace tmap {

bool ParseTmapRole(std::bitset<16>& role, uint16_t len, const uint8_t* value) {
  if (len != kTmapRoleLen) {
    LOG_ERROR(
        ", Wrong len of Telephony Media Audio Profile Role, "
        "characteristic");
    return false;
  }

  STREAM_TO_UINT16(role, value);

  LOG_INFO(
      ", Telephony Media Audio Profile Role:"
      "\n\tRole: %s",
      role.to_string().c_str());

  return true;
}
}  // namespace tmap

}  // namespace client_parser
}  // namespace le_audio
+8 −0
Original line number Diff line number Diff line
@@ -240,5 +240,13 @@ bool ParseAvailableAudioContexts(struct acs_available_audio_contexts& rsp,
bool ParseSupportedAudioContexts(struct acs_supported_audio_contexts& rsp,
                                 uint16_t len, const uint8_t* value);
}  // namespace pacs

namespace tmap {

constexpr uint16_t kTmapRoleLen = 2;

bool ParseTmapRole(std::bitset<16>& role, uint16_t len, const uint8_t* value);

}  // namespace tmap
}  // namespace client_parser
}  // namespace le_audio
Loading