From f33cea94ce3e65cfbe4aa5eea1acdb6e4dddbe93 Mon Sep 17 00:00:00 2001 From: Alice Kuo Date: Tue, 21 Dec 2021 09:56:35 +0800 Subject: [PATCH] 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 --- .../BluetoothAudioSessionControl_2_2.h | 6 ++ .../session/BluetoothAudioSessionReport_2_2.h | 2 +- .../session/BluetoothAudioSession_2_2.cpp | 74 +++++++++++++++++-- .../utils/session/BluetoothAudioSession_2_2.h | 10 +++ 4 files changed, 86 insertions(+), 6 deletions(-) diff --git a/bluetooth/audio/utils/session/BluetoothAudioSessionControl_2_2.h b/bluetooth/audio/utils/session/BluetoothAudioSessionControl_2_2.h index dbdf24765d..71ab4645a8 100644 --- a/bluetooth/audio/utils/session/BluetoothAudioSessionControl_2_2.h +++ b/bluetooth/audio/utils/session/BluetoothAudioSessionControl_2_2.h @@ -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; } diff --git a/bluetooth/audio/utils/session/BluetoothAudioSessionReport_2_2.h b/bluetooth/audio/utils/session/BluetoothAudioSessionReport_2_2.h index 194259ae67..79121cc8f9 100644 --- a/bluetooth/audio/utils/session/BluetoothAudioSessionReport_2_2.h +++ b/bluetooth/audio/utils/session/BluetoothAudioSessionReport_2_2.h @@ -48,7 +48,7 @@ class BluetoothAudioSessionReport_2_2 { std::shared_ptr 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 diff --git a/bluetooth/audio/utils/session/BluetoothAudioSession_2_2.cpp b/bluetooth/audio/utils/session/BluetoothAudioSession_2_2.cpp index ee2096b179..db1619b5fc 100644 --- a/bluetooth/audio/utils/session/BluetoothAudioSession_2_2.cpp +++ b/bluetooth/audio/utils/session/BluetoothAudioSession_2_2.cpp @@ -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 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 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::instance_ptr = std::unique_ptr( diff --git a/bluetooth/audio/utils/session/BluetoothAudioSession_2_2.h b/bluetooth/audio/utils/session/BluetoothAudioSession_2_2.h index 3f1f0e009b..6ac0188bfd 100644 --- a/bluetooth/audio/utils/session/BluetoothAudioSession_2_2.h +++ b/bluetooth/audio/utils/session/BluetoothAudioSession_2_2.h @@ -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 {