mirror of
https://github.com/Evolution-X/hardware_interfaces
synced 2026-02-01 16:50:18 +00:00
Merge "Get default provider codec from HAL" am: d563e5bc9e
Original change: https://android-review.googlesource.com/c/platform/hardware/interfaces/+/1906371 Change-Id: I23d76f49fb759fb03faa23691e62f9173e44a406
This commit is contained in:
@@ -48,4 +48,26 @@ interface IBluetoothAudioProvidersFactory extends @2.1::IBluetoothAudioProviders
|
|||||||
*/
|
*/
|
||||||
openProvider_2_2(SessionType sessionType)
|
openProvider_2_2(SessionType sessionType)
|
||||||
generates (Status status, IBluetoothAudioProvider provider);
|
generates (Status status, IBluetoothAudioProvider provider);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a list of audio capabilities for a session type.
|
||||||
|
*
|
||||||
|
* For software encoding, the PCM capabilities are returned.
|
||||||
|
* For hardware encoding, the supported codecs and their capabilities are
|
||||||
|
* returned.
|
||||||
|
*
|
||||||
|
* @param sessionType The session type (e.g.
|
||||||
|
* A2DP_SOFTWARE_ENCODING_DATAPATH).
|
||||||
|
* @return audioCapabilities A list containing all the capabilities
|
||||||
|
* supported by the sesson type. The capabilities is a list of
|
||||||
|
* available options when configuring the codec for the session.
|
||||||
|
* For software encoding it is the PCM data rate.
|
||||||
|
* For hardware encoding it is the list of supported codecs and their
|
||||||
|
* capabilities.
|
||||||
|
* If a provider isn't supported, an empty list should be returned.
|
||||||
|
* Note: Only one entry should exist per codec when using hardware
|
||||||
|
* encoding.
|
||||||
|
*/
|
||||||
|
getProviderCapabilities_2_2(SessionType sessionType)
|
||||||
|
generates (vec<AudioCapabilities> audioCapabilities);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -221,6 +221,47 @@ Return<void> BluetoothAudioProvidersFactory::getProviderCapabilities_2_1(
|
|||||||
return Void();
|
return Void();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Return<void> BluetoothAudioProvidersFactory::getProviderCapabilities_2_2(
|
||||||
|
const V2_1::SessionType sessionType,
|
||||||
|
getProviderCapabilities_2_2_cb _hidl_cb) {
|
||||||
|
hidl_vec<V2_2::AudioCapabilities> audio_capabilities =
|
||||||
|
hidl_vec<V2_2::AudioCapabilities>(0);
|
||||||
|
if (sessionType == V2_1::SessionType::A2DP_HARDWARE_OFFLOAD_DATAPATH) {
|
||||||
|
std::vector<CodecCapabilities> db_codec_capabilities =
|
||||||
|
android::bluetooth::audio::GetOffloadCodecCapabilities(sessionType);
|
||||||
|
if (db_codec_capabilities.size()) {
|
||||||
|
audio_capabilities.resize(db_codec_capabilities.size());
|
||||||
|
for (int i = 0; i < db_codec_capabilities.size(); ++i) {
|
||||||
|
audio_capabilities[i].codecCapabilities(db_codec_capabilities[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (sessionType == V2_1::SessionType::
|
||||||
|
LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH ||
|
||||||
|
sessionType == V2_1::SessionType::
|
||||||
|
LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH) {
|
||||||
|
std::vector<LeAudioCodecCapabilitiesPair> db_codec_capabilities =
|
||||||
|
android::bluetooth::audio::GetLeAudioOffloadCodecCapabilities(
|
||||||
|
sessionType);
|
||||||
|
if (db_codec_capabilities.size()) {
|
||||||
|
audio_capabilities.resize(db_codec_capabilities.size());
|
||||||
|
for (int i = 0; i < db_codec_capabilities.size(); ++i) {
|
||||||
|
audio_capabilities[i].leAudioCapabilities(db_codec_capabilities[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (sessionType != V2_1::SessionType::UNKNOWN) {
|
||||||
|
std::vector<V2_1::PcmParameters> db_pcm_capabilities =
|
||||||
|
android::bluetooth::audio::GetSoftwarePcmCapabilities_2_1();
|
||||||
|
if (db_pcm_capabilities.size() == 1) {
|
||||||
|
audio_capabilities.resize(1);
|
||||||
|
audio_capabilities[0].pcmCapabilities(db_pcm_capabilities[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LOG(INFO) << __func__ << " - SessionType=" << toString(sessionType)
|
||||||
|
<< " supports " << audio_capabilities.size() << " codecs";
|
||||||
|
_hidl_cb(audio_capabilities);
|
||||||
|
return Void();
|
||||||
|
}
|
||||||
|
|
||||||
IBluetoothAudioProvidersFactory* HIDL_FETCH_IBluetoothAudioProvidersFactory(
|
IBluetoothAudioProvidersFactory* HIDL_FETCH_IBluetoothAudioProvidersFactory(
|
||||||
const char* /* name */) {
|
const char* /* name */) {
|
||||||
return new BluetoothAudioProvidersFactory();
|
return new BluetoothAudioProvidersFactory();
|
||||||
|
|||||||
@@ -53,6 +53,10 @@ class BluetoothAudioProvidersFactory : public IBluetoothAudioProvidersFactory {
|
|||||||
const V2_1::SessionType sessionType,
|
const V2_1::SessionType sessionType,
|
||||||
getProviderCapabilities_2_1_cb _hidl_cb) override;
|
getProviderCapabilities_2_1_cb _hidl_cb) override;
|
||||||
|
|
||||||
|
Return<void> getProviderCapabilities_2_2(
|
||||||
|
const V2_1::SessionType sessionType,
|
||||||
|
getProviderCapabilities_2_2_cb _hidl_cb) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static A2dpSoftwareAudioProvider a2dp_software_provider_instance_;
|
static A2dpSoftwareAudioProvider a2dp_software_provider_instance_;
|
||||||
static A2dpOffloadAudioProvider a2dp_offload_provider_instance_;
|
static A2dpOffloadAudioProvider a2dp_offload_provider_instance_;
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ package android.hardware.bluetooth.audio@2.2;
|
|||||||
import @2.1::Lc3Parameters;
|
import @2.1::Lc3Parameters;
|
||||||
import @2.1::PcmParameters;
|
import @2.1::PcmParameters;
|
||||||
import @2.0::CodecConfiguration;
|
import @2.0::CodecConfiguration;
|
||||||
|
import @2.0::CodecCapabilities;
|
||||||
|
import @2.1::CodecType;
|
||||||
|
|
||||||
enum LeAudioMode : uint8_t {
|
enum LeAudioMode : uint8_t {
|
||||||
UNKNOWN = 0x00,
|
UNKNOWN = 0x00,
|
||||||
@@ -26,6 +28,12 @@ enum LeAudioMode : uint8_t {
|
|||||||
BROADCAST = 0x02,
|
BROADCAST = 0x02,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum AudioLocation : uint8_t {
|
||||||
|
UNKNOWN = 0,
|
||||||
|
FRONT_LEFT = 1,
|
||||||
|
FRONT_RIGHT = 2,
|
||||||
|
};
|
||||||
|
|
||||||
struct UnicastStreamMap {
|
struct UnicastStreamMap {
|
||||||
/* The connection handle used for a unicast or a broadcast group. */
|
/* The connection handle used for a unicast or a broadcast group. */
|
||||||
uint16_t streamHandle;
|
uint16_t streamHandle;
|
||||||
@@ -70,3 +78,37 @@ safe_union AudioConfiguration {
|
|||||||
CodecConfiguration codecConfig;
|
CodecConfiguration codecConfig;
|
||||||
LeAudioConfiguration leAudioConfig;
|
LeAudioConfiguration leAudioConfig;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Used to specify the capabilities of the different session types */
|
||||||
|
safe_union AudioCapabilities {
|
||||||
|
PcmParameters pcmCapabilities;
|
||||||
|
CodecCapabilities codecCapabilities;
|
||||||
|
LeAudioCodecCapabilitiesPair leAudioCapabilities;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to specify th le audio capabilities pair of the Hardware offload encode and decode.
|
||||||
|
*/
|
||||||
|
struct LeAudioCodecCapabilitiesPair{
|
||||||
|
LeAudioMode mode;
|
||||||
|
LeAudioCodecCapability encodeCapability;
|
||||||
|
LeAudioCodecCapability decodeCapability;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to specify the le audio capabilities of the codecs supported by Hardware offload
|
||||||
|
* for encode or decode.
|
||||||
|
*/
|
||||||
|
struct LeAudioCodecCapability {
|
||||||
|
CodecType codecType;
|
||||||
|
AudioLocation supportedChannel;
|
||||||
|
|
||||||
|
// The number of connected device
|
||||||
|
uint8_t deviceCount;
|
||||||
|
|
||||||
|
// Supported channel count for each device
|
||||||
|
uint8_t channelCountPerDevice;
|
||||||
|
|
||||||
|
// Should use safe union when there is more than one codec
|
||||||
|
Lc3Parameters capabilities;
|
||||||
|
};
|
||||||
|
|||||||
@@ -24,9 +24,59 @@ namespace android {
|
|||||||
namespace bluetooth {
|
namespace bluetooth {
|
||||||
namespace audio {
|
namespace audio {
|
||||||
|
|
||||||
|
using ::android::hardware::bluetooth::audio::V2_0::BitsPerSample;
|
||||||
|
using ::android::hardware::bluetooth::audio::V2_1::CodecType;
|
||||||
|
using ::android::hardware::bluetooth::audio::V2_1::Lc3FrameDuration;
|
||||||
|
using ::android::hardware::bluetooth::audio::V2_1::Lc3Parameters;
|
||||||
|
using ::android::hardware::bluetooth::audio::V2_1::SampleRate;
|
||||||
|
using ::android::hardware::bluetooth::audio::V2_2::AudioLocation;
|
||||||
|
using ::android::hardware::bluetooth::audio::V2_2::LeAudioCodecCapabilitiesPair;
|
||||||
|
using ::android::hardware::bluetooth::audio::V2_2::LeAudioCodecCapability;
|
||||||
|
using ::android::hardware::bluetooth::audio::V2_2::LeAudioMode;
|
||||||
using SessionType_2_1 =
|
using SessionType_2_1 =
|
||||||
::android::hardware::bluetooth::audio::V2_1::SessionType;
|
::android::hardware::bluetooth::audio::V2_1::SessionType;
|
||||||
|
|
||||||
|
// Stores the list of offload supported capability
|
||||||
|
std::vector<LeAudioCodecCapabilitiesPair> kDefaultOffloadLeAudioCapabilities;
|
||||||
|
|
||||||
|
static const LeAudioCodecCapability kInvalidLc3Capability = {
|
||||||
|
.codecType = CodecType::UNKNOWN};
|
||||||
|
|
||||||
|
// Default Supported Codecs
|
||||||
|
// LC3 16_1: sample rate: 16 kHz, frame duration: 7.5 ms, octets per frame: 30
|
||||||
|
static const Lc3Parameters kLc3Capability_16_1 = {
|
||||||
|
.samplingFrequency = SampleRate::RATE_16000,
|
||||||
|
.frameDuration = Lc3FrameDuration::DURATION_7500US,
|
||||||
|
.octetsPerFrame = 30};
|
||||||
|
|
||||||
|
// Default Supported Codecs
|
||||||
|
// LC3 16_2: sample rate: 16 kHz, frame duration: 10 ms, octets per frame: 40
|
||||||
|
static const Lc3Parameters kLc3Capability_16_2 = {
|
||||||
|
.samplingFrequency = SampleRate::RATE_16000,
|
||||||
|
.frameDuration = Lc3FrameDuration::DURATION_10000US,
|
||||||
|
.octetsPerFrame = 40};
|
||||||
|
|
||||||
|
// Default Supported Codecs
|
||||||
|
// LC3 48_4: sample rate: 48 kHz, frame duration: 10 ms, octets per frame: 120
|
||||||
|
static const Lc3Parameters kLc3Capability_48_4 = {
|
||||||
|
.samplingFrequency = SampleRate::RATE_48000,
|
||||||
|
.frameDuration = Lc3FrameDuration::DURATION_10000US,
|
||||||
|
.octetsPerFrame = 120};
|
||||||
|
|
||||||
|
static const std::vector<Lc3Parameters> supportedLc3CapabilityList = {
|
||||||
|
kLc3Capability_48_4, kLc3Capability_16_2, kLc3Capability_16_1};
|
||||||
|
|
||||||
|
static AudioLocation stereoAudio = static_cast<AudioLocation>(
|
||||||
|
AudioLocation::FRONT_LEFT | AudioLocation::FRONT_RIGHT);
|
||||||
|
static AudioLocation monoAudio = AudioLocation::UNKNOWN;
|
||||||
|
|
||||||
|
// Stores the supported setting of audio location, connected device, and the
|
||||||
|
// channel count for each device
|
||||||
|
std::vector<std::tuple<AudioLocation, uint8_t, uint8_t>>
|
||||||
|
supportedDeviceSetting = {std::make_tuple(stereoAudio, 2, 1),
|
||||||
|
std::make_tuple(monoAudio, 1, 2),
|
||||||
|
std::make_tuple(monoAudio, 1, 1)};
|
||||||
|
|
||||||
bool IsOffloadLeAudioConfigurationValid(
|
bool IsOffloadLeAudioConfigurationValid(
|
||||||
const ::android::hardware::bluetooth::audio::V2_1::SessionType&
|
const ::android::hardware::bluetooth::audio::V2_1::SessionType&
|
||||||
session_type,
|
session_type,
|
||||||
@@ -44,6 +94,60 @@ bool IsOffloadLeAudioConfigurationValid(
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LeAudioCodecCapability composeLc3Capability(AudioLocation audioLocation,
|
||||||
|
uint8_t deviceCnt,
|
||||||
|
uint8_t channelCount,
|
||||||
|
Lc3Parameters capability) {
|
||||||
|
return LeAudioCodecCapability{.codecType = CodecType::LC3,
|
||||||
|
.supportedChannel = audioLocation,
|
||||||
|
.deviceCount = deviceCnt,
|
||||||
|
.channelCountPerDevice = channelCount,
|
||||||
|
.capabilities = capability};
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<LeAudioCodecCapabilitiesPair> GetLeAudioOffloadCodecCapabilities(
|
||||||
|
const SessionType_2_1& session_type) {
|
||||||
|
if (session_type !=
|
||||||
|
SessionType_2_1::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH &&
|
||||||
|
session_type !=
|
||||||
|
SessionType_2_1::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH) {
|
||||||
|
return std::vector<LeAudioCodecCapabilitiesPair>(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (kDefaultOffloadLeAudioCapabilities.empty()) {
|
||||||
|
for (auto [audioLocation, deviceCnt, channelCount] :
|
||||||
|
supportedDeviceSetting) {
|
||||||
|
for (auto capability : supportedLc3CapabilityList) {
|
||||||
|
LeAudioCodecCapability lc3Capability = composeLc3Capability(
|
||||||
|
audioLocation, deviceCnt, channelCount, capability);
|
||||||
|
LeAudioCodecCapability lc3MonoCapability =
|
||||||
|
composeLc3Capability(monoAudio, 1, 1, capability);
|
||||||
|
|
||||||
|
// Adds the capability for encode only
|
||||||
|
kDefaultOffloadLeAudioCapabilities.push_back(
|
||||||
|
{.mode = LeAudioMode::UNICAST,
|
||||||
|
.encodeCapability = lc3Capability,
|
||||||
|
.decodeCapability = kInvalidLc3Capability});
|
||||||
|
|
||||||
|
// Adds the capability for decode only
|
||||||
|
kDefaultOffloadLeAudioCapabilities.push_back(
|
||||||
|
{.mode = LeAudioMode::UNICAST,
|
||||||
|
.encodeCapability = kInvalidLc3Capability,
|
||||||
|
.decodeCapability = lc3Capability});
|
||||||
|
|
||||||
|
// Adds the capability for the case that encode and decode exist at the
|
||||||
|
// same time
|
||||||
|
kDefaultOffloadLeAudioCapabilities.push_back(
|
||||||
|
{.mode = LeAudioMode::UNICAST,
|
||||||
|
.encodeCapability = lc3Capability,
|
||||||
|
.decodeCapability = lc3MonoCapability});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return kDefaultOffloadLeAudioCapabilities;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace audio
|
} // namespace audio
|
||||||
} // namespace bluetooth
|
} // namespace bluetooth
|
||||||
} // namespace android
|
} // namespace android
|
||||||
|
|||||||
@@ -30,6 +30,11 @@ bool IsOffloadLeAudioConfigurationValid(
|
|||||||
session_type,
|
session_type,
|
||||||
const ::android::hardware::bluetooth::audio::V2_2::LeAudioConfiguration&
|
const ::android::hardware::bluetooth::audio::V2_2::LeAudioConfiguration&
|
||||||
le_audio_codec_config);
|
le_audio_codec_config);
|
||||||
|
|
||||||
|
std::vector<hardware::bluetooth::audio::V2_2::LeAudioCodecCapabilitiesPair>
|
||||||
|
GetLeAudioOffloadCodecCapabilities(
|
||||||
|
const ::android::hardware::bluetooth::audio::V2_1::SessionType&
|
||||||
|
session_type);
|
||||||
} // namespace audio
|
} // namespace audio
|
||||||
} // namespace bluetooth
|
} // namespace bluetooth
|
||||||
} // namespace android
|
} // namespace android
|
||||||
|
|||||||
Reference in New Issue
Block a user