Add Opus to BT Audio HAL and update version to V2
This CL adds Opus as a supported A2DP codec to the BT Audio HAL and
updates HAL compatibility matrix.
Bug: 226441860
Test: A2DP sink device using bds-dev
Change-Id: I21249e3e7e76412af7ed62a3fc9ec133434cf963
diff --git a/bluetooth/audio/utils/Android.bp b/bluetooth/audio/utils/Android.bp
index 42f9455..d08cb0a 100644
--- a/bluetooth/audio/utils/Android.bp
+++ b/bluetooth/audio/utils/Android.bp
@@ -51,7 +51,7 @@
"libbinder_ndk",
"libfmq",
"liblog",
- "android.hardware.bluetooth.audio-V1-ndk",
+ "android.hardware.bluetooth.audio-V2-ndk",
"libhidlbase",
],
}
diff --git a/bluetooth/audio/utils/aidl_session/BluetoothAudioCodecs.cpp b/bluetooth/audio/utils/aidl_session/BluetoothAudioCodecs.cpp
index f3ca279..7debfab 100644
--- a/bluetooth/audio/utils/aidl_session/BluetoothAudioCodecs.cpp
+++ b/bluetooth/audio/utils/aidl_session/BluetoothAudioCodecs.cpp
@@ -26,6 +26,8 @@
#include <aidl/android/hardware/bluetooth/audio/LdacChannelMode.h>
#include <aidl/android/hardware/bluetooth/audio/LdacQualityIndex.h>
#include <aidl/android/hardware/bluetooth/audio/LeAudioConfiguration.h>
+#include <aidl/android/hardware/bluetooth/audio/OpusCapabilities.h>
+#include <aidl/android/hardware/bluetooth/audio/OpusConfiguration.h>
#include <aidl/android/hardware/bluetooth/audio/SbcCapabilities.h>
#include <aidl/android/hardware/bluetooth/audio/SbcChannelMode.h>
#include <android-base/logging.h>
@@ -78,9 +80,9 @@
.bitsPerSample = {24},
};
-static const Lc3Capabilities kDefaultA2dpOffloadLc3Capability = {
- .samplingFrequencyHz = {44100, 48000},
- .frameDurationUs = {7500, 10000},
+static const OpusCapabilities kDefaultOffloadOpusCapability = {
+ .samplingFrequencyHz = {48000},
+ .frameDurationUs = {10000, 20000},
.channelMode = {ChannelMode::MONO, ChannelMode::STEREO},
};
@@ -90,7 +92,7 @@
{.codecType = CodecType::LDAC, .capabilities = {}},
{.codecType = CodecType::APTX, .capabilities = {}},
{.codecType = CodecType::APTX_HD, .capabilities = {}},
- {.codecType = CodecType::LC3, .capabilities = {}}};
+ {.codecType = CodecType::OPUS, .capabilities = {}}};
std::vector<LeAudioCodecCapabilitiesSetting> kDefaultOffloadLeAudioCapabilities;
@@ -294,22 +296,24 @@
return false;
}
-bool BluetoothAudioCodecs::IsOffloadLc3ConfigurationValid(
+bool BluetoothAudioCodecs::IsOffloadOpusConfigurationValid(
const CodecConfiguration::CodecSpecific& codec_specific) {
- if (codec_specific.getTag() != CodecConfiguration::CodecSpecific::lc3Config) {
+ if (codec_specific.getTag() !=
+ CodecConfiguration::CodecSpecific::opusConfig) {
LOG(WARNING) << __func__
<< ": Invalid CodecSpecific=" << codec_specific.toString();
return false;
}
- const Lc3Configuration lc3_data =
- codec_specific.get<CodecConfiguration::CodecSpecific::lc3Config>();
+ std::optional<OpusConfiguration> opus_data =
+ codec_specific.get<CodecConfiguration::CodecSpecific::opusConfig>();
- if (ContainedInVector(kDefaultA2dpOffloadLc3Capability.samplingFrequencyHz,
- lc3_data.samplingFrequencyHz) &&
- ContainedInVector(kDefaultA2dpOffloadLc3Capability.frameDurationUs,
- lc3_data.frameDurationUs) &&
- ContainedInVector(kDefaultA2dpOffloadLc3Capability.channelMode,
- lc3_data.channelMode)) {
+ if (opus_data.has_value() &&
+ ContainedInVector(kDefaultOffloadOpusCapability.samplingFrequencyHz,
+ opus_data->samplingFrequencyHz) &&
+ ContainedInVector(kDefaultOffloadOpusCapability.frameDurationUs,
+ opus_data->frameDurationUs) &&
+ ContainedInVector(kDefaultOffloadOpusCapability.channelMode,
+ opus_data->channelMode)) {
return true;
}
LOG(WARNING) << __func__
@@ -371,13 +375,14 @@
.set<CodecCapabilities::Capabilities::aptxCapabilities>(
kDefaultOffloadAptxHdCapability);
break;
- case CodecType::LC3:
+ case CodecType::OPUS:
codec_capability.capabilities
- .set<CodecCapabilities::Capabilities::lc3Capabilities>(
- kDefaultA2dpOffloadLc3Capability);
+ .set<CodecCapabilities::Capabilities::opusCapabilities>(
+ kDefaultOffloadOpusCapability);
break;
case CodecType::UNKNOWN:
case CodecType::VENDOR:
+ case CodecType::LC3:
case CodecType::APTX_ADAPTIVE:
break;
}
@@ -438,12 +443,13 @@
return true;
}
break;
- case CodecType::LC3:
- if (IsOffloadLc3ConfigurationValid(codec_specific)) {
+ case CodecType::OPUS:
+ if (IsOffloadOpusConfigurationValid(codec_specific)) {
return true;
}
break;
case CodecType::APTX_ADAPTIVE:
+ case CodecType::LC3:
case CodecType::UNKNOWN:
case CodecType::VENDOR:
break;
diff --git a/bluetooth/audio/utils/aidl_session/BluetoothAudioCodecs.h b/bluetooth/audio/utils/aidl_session/BluetoothAudioCodecs.h
index 0259a7e..ed0598b 100644
--- a/bluetooth/audio/utils/aidl_session/BluetoothAudioCodecs.h
+++ b/bluetooth/audio/utils/aidl_session/BluetoothAudioCodecs.h
@@ -18,9 +18,9 @@
#include <aidl/android/hardware/bluetooth/audio/CodecCapabilities.h>
#include <aidl/android/hardware/bluetooth/audio/CodecConfiguration.h>
-#include <aidl/android/hardware/bluetooth/audio/Lc3Configuration.h>
#include <aidl/android/hardware/bluetooth/audio/LeAudioCodecCapabilitiesSetting.h>
#include <aidl/android/hardware/bluetooth/audio/LeAudioConfiguration.h>
+#include <aidl/android/hardware/bluetooth/audio/OpusConfiguration.h>
#include <aidl/android/hardware/bluetooth/audio/PcmCapabilities.h>
#include <aidl/android/hardware/bluetooth/audio/PcmConfiguration.h>
#include <aidl/android/hardware/bluetooth/audio/SessionType.h>
@@ -71,7 +71,7 @@
const CodecConfiguration::CodecSpecific& codec_specific);
static bool IsOffloadAptxHdConfigurationValid(
const CodecConfiguration::CodecSpecific& codec_specific);
- static bool IsOffloadLc3ConfigurationValid(
+ static bool IsOffloadOpusConfigurationValid(
const CodecConfiguration::CodecSpecific& codec_specific);
};