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 {