Add onSessionEnded handle for HIDL 2.2

1. The audio driver need to get the session status callback as the
sessionEnded
2. Update the invalid audio configuration based on the session type

Bug: 197296692
Bug: 150670922
Test: HAL 2.1/2.2 work for A2DP software/hardware media, and LE audio
software media/voip call
Test: Turn on/off bluetooth to make sure the onSessionEnded work well

Change-Id: Id758b556e8f5c9b63052a408154f02082515091c
This commit is contained in:
Alice Kuo 2021-12-21 09:56:35 +08:00
parent ceb3a960ed
commit f33cea94ce
4 changed files with 86 additions and 6 deletions

View file

@ -76,6 +76,12 @@ class BluetoothAudioSessionControl_2_2 {
} else if (session_type ==
SessionType_2_1::A2DP_HARDWARE_OFFLOAD_DATAPATH) {
return BluetoothAudioSession_2_2::kInvalidOffloadAudioConfiguration;
} else if (
session_type ==
SessionType_2_1::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH ||
session_type ==
SessionType_2_1::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH) {
return BluetoothAudioSession_2_2::kInvalidLeOffloadAudioConfiguration;
} else {
return BluetoothAudioSession_2_2::kInvalidSoftwareAudioConfiguration;
}

View file

@ -48,7 +48,7 @@ class BluetoothAudioSessionReport_2_2 {
std::shared_ptr<BluetoothAudioSession_2_2> session_ptr =
BluetoothAudioSessionInstance_2_2::GetSessionInstance(session_type);
if (session_ptr != nullptr) {
session_ptr->GetAudioSession()->OnSessionEnded();
session_ptr->OnSessionEnded();
}
}
// The API reports the Bluetooth stack has replied the result of startStream

View file

@ -29,6 +29,13 @@ namespace audio {
using ::android::hardware::audio::common::V5_0::AudioSource;
using ::android::hardware::audio::common::V5_0::RecordTrackMetadata;
using ::android::hardware::audio::common::V5_0::SinkMetadata;
using ::android::hardware::bluetooth::audio::V2_0::BitsPerSample;
using ::android::hardware::bluetooth::audio::V2_0::ChannelMode;
using ::android::hardware::bluetooth::audio::V2_2::LeAudioConfiguration;
using ::android::hardware::bluetooth::audio::V2_2::LeAudioMode;
using PcmParameters_2_1 =
::android::hardware::bluetooth::audio::V2_1::PcmParameters;
using SampleRate_2_1 = ::android::hardware::bluetooth::audio::V2_1::SampleRate;
using SessionType_2_1 =
::android::hardware::bluetooth::audio::V2_1::SessionType;
@ -38,10 +45,24 @@ using SessionType_2_0 =
using AudioConfiguration_2_1 =
::android::hardware::bluetooth::audio::V2_1::AudioConfiguration;
static constexpr PcmParameters_2_1 kInvalidPcmParameters = {
.sampleRate = SampleRate_2_1::RATE_UNKNOWN,
.channelMode = ChannelMode::UNKNOWN,
.bitsPerSample = BitsPerSample::BITS_UNKNOWN,
.dataIntervalUs = 0,
};
static LeAudioConfiguration kInvalidLeAudioConfig = {
.mode = LeAudioMode::UNKNOWN,
.config = {},
};
::android::hardware::bluetooth::audio::V2_2::AudioConfiguration
BluetoothAudioSession_2_2::invalidSoftwareAudioConfiguration = {};
::android::hardware::bluetooth::audio::V2_2::AudioConfiguration
BluetoothAudioSession_2_2::invalidOffloadAudioConfiguration = {};
::android::hardware::bluetooth::audio::V2_2::AudioConfiguration
BluetoothAudioSession_2_2::invalidLeOffloadAudioConfiguration = {};
using IBluetoothAudioPort_2_2 =
::android::hardware::bluetooth::audio::V2_2::IBluetoothAudioPort;
@ -72,6 +93,10 @@ BluetoothAudioSession_2_2::BluetoothAudioSession_2_2(
} else {
session_type_2_1_ = (session_type);
}
invalidSoftwareAudioConfiguration.pcmConfig(kInvalidPcmParameters);
invalidOffloadAudioConfiguration.codecConfig(
audio_session->kInvalidCodecConfiguration);
invalidLeOffloadAudioConfiguration.leAudioConfig(kInvalidLeAudioConfig);
}
bool BluetoothAudioSession_2_2::IsSessionReady() {
@ -149,9 +174,17 @@ const ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration
BluetoothAudioSession_2_2::GetAudioConfig() {
std::lock_guard<std::recursive_mutex> guard(audio_session->mutex_);
if (IsSessionReady()) {
auto audio_config_discriminator = audio_config_2_2_.getDiscriminator();
// If session is unknown it means it should be 2.0 type
if (session_type_2_1_ != SessionType_2_1::UNKNOWN) {
if (audio_config_2_2_ != invalidSoftwareAudioConfiguration)
if ((audio_config_discriminator ==
::android::hardware::bluetooth::audio::V2_2::AudioConfiguration::
hidl_discriminator::pcmConfig &&
audio_config_2_2_ != kInvalidSoftwareAudioConfiguration) ||
(audio_config_discriminator ==
::android::hardware::bluetooth::audio::V2_2::AudioConfiguration::
hidl_discriminator::leAudioConfig &&
audio_config_2_2_ != kInvalidLeOffloadAudioConfiguration))
return audio_config_2_2_;
::android::hardware::bluetooth::audio::V2_2::AudioConfiguration toConf;
@ -181,8 +214,10 @@ BluetoothAudioSession_2_2::GetAudioConfig() {
}
return toConf;
} else if (session_type_2_1_ ==
SessionType_2_1::A2DP_HARDWARE_OFFLOAD_DATAPATH) {
return kInvalidOffloadAudioConfiguration;
SessionType_2_1::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH ||
session_type_2_1_ ==
SessionType_2_1::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH) {
return kInvalidLeOffloadAudioConfiguration;
} else {
return kInvalidSoftwareAudioConfiguration;
}
@ -314,8 +349,11 @@ void BluetoothAudioSession_2_2::OnSessionStarted(
LOG(ERROR) << __func__ << " - SessionType=" << toString(session_type_2_1_)
<< " DataMQ Invalid";
audio_config_2_2_ =
(session_type_2_1_ == SessionType_2_1::A2DP_HARDWARE_OFFLOAD_DATAPATH
? kInvalidOffloadAudioConfiguration
((session_type_2_1_ ==
SessionType_2_1::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH ||
session_type_2_1_ ==
SessionType_2_1::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH)
? kInvalidLeOffloadAudioConfiguration
: kInvalidSoftwareAudioConfiguration);
} else {
audio_session->stack_iface_ = stack_iface;
@ -326,6 +364,32 @@ void BluetoothAudioSession_2_2::OnSessionStarted(
}
}
// The report function is used to report that the Bluetooth stack has ended the
// session, and will invoke session_changed_cb_ to notify registered
// bluetooth_audio outputs
void BluetoothAudioSession_2_2::OnSessionEnded() {
std::lock_guard<std::recursive_mutex> guard(audio_session->mutex_);
bool toggled = IsSessionReady();
LOG(INFO) << __func__ << " - SessionType=" << toString(session_type_2_1_);
if (session_type_2_1_ == SessionType_2_1::UNKNOWN) {
audio_session->OnSessionEnded();
return;
}
audio_config_2_2_ =
((session_type_2_1_ ==
SessionType_2_1::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH ||
session_type_2_1_ ==
SessionType_2_1::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH)
? kInvalidLeOffloadAudioConfiguration
: kInvalidSoftwareAudioConfiguration);
audio_session->stack_iface_ = nullptr;
audio_session->UpdateDataPath(nullptr);
if (toggled) {
audio_session->ReportSessionStatus();
}
}
std::unique_ptr<BluetoothAudioSessionInstance_2_2>
BluetoothAudioSessionInstance_2_2::instance_ptr =
std::unique_ptr<BluetoothAudioSessionInstance_2_2>(

View file

@ -47,6 +47,8 @@ class BluetoothAudioSession_2_2 {
invalidSoftwareAudioConfiguration;
static ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration
invalidOffloadAudioConfiguration;
static ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration
invalidLeOffloadAudioConfiguration;
public:
BluetoothAudioSession_2_2(
@ -69,6 +71,11 @@ class BluetoothAudioSession_2_2 {
const ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration&
audio_config);
// The report function is used to report that the Bluetooth stack has ended
// the session, and will invoke session_changed_cb_ to notify registered
// bluetooth_audio outputs
void OnSessionEnded();
// Those control functions are for the bluetooth_audio module to start,
// suspend, stop stream, to check position, and to update metadata.
bool StartStream();
@ -88,6 +95,9 @@ class BluetoothAudioSession_2_2 {
static constexpr ::android::hardware::bluetooth::audio::V2_2::
AudioConfiguration& kInvalidOffloadAudioConfiguration =
invalidOffloadAudioConfiguration;
static constexpr ::android::hardware::bluetooth::audio::V2_2::
AudioConfiguration& kInvalidLeOffloadAudioConfiguration =
invalidLeOffloadAudioConfiguration;
};
class BluetoothAudioSessionInstance_2_2 {