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:
parent
ceb3a960ed
commit
f33cea94ce
4 changed files with 86 additions and 6 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>(
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue