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

Commit adcceec9 authored by Alice Kuo's avatar Alice Kuo
Browse files

Add A2dp decode software and offload session type

1. Add the interface
2. Add the default implementation
3. Add VTS

Bug: 206601670
Test: atest VtsHalBluetoothAudioTargetTest
Change-Id: I54d8037eeb09312c9f1fb75d2167cc50ac7cae8c
parent 950b7b80
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -44,4 +44,6 @@ enum SessionType {
  LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH = 7,
  LE_AUDIO_BROADCAST_SOFTWARE_ENCODING_DATAPATH = 8,
  LE_AUDIO_BROADCAST_HARDWARE_OFFLOAD_ENCODING_DATAPATH = 9,
  A2DP_SOFTWARE_DECODING_DATAPATH = 10,
  A2DP_HARDWARE_OFFLOAD_DECODING_DATAPATH = 11,
}
+8 −0
Original line number Diff line number Diff line
@@ -62,4 +62,12 @@ enum SessionType {
     * Audio broadcast channels. This is a control path only.
     */
    LE_AUDIO_BROADCAST_HARDWARE_OFFLOAD_ENCODING_DATAPATH,
    /**
     * A2DP legacy that AVDTP media is decoded by Bluetooth Stack
     */
    A2DP_SOFTWARE_DECODING_DATAPATH,
    /**
     * The decoding of AVDTP media is done by HW and there is control only
     */
    A2DP_HARDWARE_OFFLOAD_DECODING_DATAPATH,
}
+9 −1
Original line number Diff line number Diff line
@@ -28,10 +28,18 @@ namespace hardware {
namespace bluetooth {
namespace audio {

A2dpOffloadAudioProvider::A2dpOffloadAudioProvider() {
A2dpOffloadEncodingAudioProvider::A2dpOffloadEncodingAudioProvider()
    : A2dpOffloadAudioProvider() {
  session_type_ = SessionType::A2DP_HARDWARE_OFFLOAD_ENCODING_DATAPATH;
}

A2dpOffloadDecodingAudioProvider::A2dpOffloadDecodingAudioProvider()
    : A2dpOffloadAudioProvider() {
  session_type_ = SessionType::A2DP_HARDWARE_OFFLOAD_DECODING_DATAPATH;
}

A2dpOffloadAudioProvider::A2dpOffloadAudioProvider() {}

bool A2dpOffloadAudioProvider::isValid(const SessionType& session_type) {
  return (session_type == session_type_);
}
+10 −0
Original line number Diff line number Diff line
@@ -40,6 +40,16 @@ class A2dpOffloadAudioProvider : public BluetoothAudioProvider {
  ndk::ScopedAStatus onSessionReady(DataMQDesc* _aidl_return) override;
};

class A2dpOffloadEncodingAudioProvider : public A2dpOffloadAudioProvider {
 public:
  A2dpOffloadEncodingAudioProvider();
};

class A2dpOffloadDecodingAudioProvider : public A2dpOffloadAudioProvider {
 public:
  A2dpOffloadDecodingAudioProvider();
};

}  // namespace audio
}  // namespace bluetooth
}  // namespace hardware
+10 −1
Original line number Diff line number Diff line
@@ -40,6 +40,16 @@ static constexpr uint32_t kBufferSize = kRtpFrameSize * kRtpFrameCount;
static constexpr uint32_t kBufferCount = 2;  // double buffer
static constexpr uint32_t kDataMqSize = kBufferSize * kBufferCount;

A2dpSoftwareEncodingAudioProvider::A2dpSoftwareEncodingAudioProvider()
    : A2dpSoftwareAudioProvider() {
  session_type_ = SessionType::A2DP_SOFTWARE_ENCODING_DATAPATH;
}

A2dpSoftwareDecodingAudioProvider::A2dpSoftwareDecodingAudioProvider()
    : A2dpSoftwareAudioProvider() {
  session_type_ = SessionType::A2DP_SOFTWARE_DECODING_DATAPATH;
}

A2dpSoftwareAudioProvider::A2dpSoftwareAudioProvider()
    : BluetoothAudioProvider(), data_mq_(nullptr) {
  LOG(INFO) << __func__ << " - size of audio buffer " << kDataMqSize
@@ -48,7 +58,6 @@ A2dpSoftwareAudioProvider::A2dpSoftwareAudioProvider()
      new DataMQ(kDataMqSize, /* EventFlag */ true));
  if (data_mq && data_mq->isValid()) {
    data_mq_ = std::move(data_mq);
    session_type_ = SessionType::A2DP_SOFTWARE_ENCODING_DATAPATH;
  } else {
    ALOGE_IF(!data_mq, "failed to allocate data MQ");
    ALOGE_IF(data_mq && !data_mq->isValid(), "data MQ is invalid");
Loading