Merge "uwb(hal): Modify TLV value size for interleaving params" into tm-dev
diff --git a/bluetooth/audio/2.2/Android.bp b/bluetooth/audio/2.2/Android.bp
deleted file mode 100644
index d66e84e..0000000
--- a/bluetooth/audio/2.2/Android.bp
+++ /dev/null
@@ -1,33 +0,0 @@
-// This file is autogenerated by hidl-gen -Landroidbp.
-
-package {
- // See: http://go/android-license-faq
- // A large-scale-change added 'default_applicable_licenses' to import
- // all of the 'license_kinds' from "hardware_interfaces_license"
- // to get the below license kinds:
- // SPDX-license-identifier-Apache-2.0
- default_applicable_licenses: ["hardware_interfaces_license"],
-}
-
-hidl_interface {
- name: "android.hardware.bluetooth.audio@2.2",
- root: "android.hardware",
- srcs: [
- "types.hal",
- "IBluetoothAudioPort.hal",
- "IBluetoothAudioProvider.hal",
- "IBluetoothAudioProvidersFactory.hal",
- ],
- interfaces: [
- "android.hardware.audio.common@5.0",
- "android.hardware.bluetooth.audio@2.0",
- "android.hardware.bluetooth.audio@2.1",
- "android.hidl.base@1.0",
- "android.hidl.safe_union@1.0",
- ],
- apex_available: [
- "//apex_available:platform",
- "com.android.bluetooth",
- ],
- gen_java: false,
-}
diff --git a/bluetooth/audio/2.2/IBluetoothAudioPort.hal b/bluetooth/audio/2.2/IBluetoothAudioPort.hal
deleted file mode 100644
index 344899c..0000000
--- a/bluetooth/audio/2.2/IBluetoothAudioPort.hal
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.hardware.bluetooth.audio@2.2;
-
-import @2.0::IBluetoothAudioPort;
-import android.hardware.audio.common@5.0::SinkMetadata;
-
-interface IBluetoothAudioPort extends @2.0::IBluetoothAudioPort {
- /**
- * Called when the metadata of the stream's sink has been changed.
- *
- * @param sinkMetadata Description of the audio that is recorded by the
- * clients.
- */
- updateSinkMetadata(SinkMetadata sinkMetadata);
-};
diff --git a/bluetooth/audio/2.2/IBluetoothAudioProvider.hal b/bluetooth/audio/2.2/IBluetoothAudioProvider.hal
deleted file mode 100644
index 7c91805..0000000
--- a/bluetooth/audio/2.2/IBluetoothAudioProvider.hal
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.hardware.bluetooth.audio@2.2;
-
-import @2.1::IBluetoothAudioProvider;
-import @2.2::IBluetoothAudioPort;
-import @2.0::Status;
-
-/**
- * HAL interface from the Bluetooth stack to the Audio HAL
- *
- * The Bluetooth stack calls methods in this interface to start and end audio
- * sessions and sends callback events to the Audio HAL.
- *
- * Note: For HIDL APIs with a "generates" statement, the callback parameter used
- * for return value must be invoked synchronously before the API call returns.
- */
-interface IBluetoothAudioProvider extends @2.1::IBluetoothAudioProvider {
-
- /**
- * This method indicates that the Bluetooth stack is ready to stream audio.
- * It registers an instance of IBluetoothAudioPort with and provides the
- * current negotiated codec to the Audio HAL. After this method is called,
- * the Audio HAL can invoke IBluetoothAudioPort.startStream().
- *
- * Note: endSession() must be called to unregister this IBluetoothAudioPort
- *
- * @param hostIf An instance of IBluetoothAudioPort for stream control
- * @param audioConfig The audio configuration negotiated with the remote
- * device. The PCM parameters are set if software based encoding,
- * otherwise the correct codec configuration is used for hardware
- * encoding.
- *
- * @return status One of the following
- * SUCCESS if this IBluetoothAudioPort was successfully registered with
- * the Audio HAL
- * UNSUPPORTED_CODEC_CONFIGURATION if the Audio HAL cannot register this
- * IBluetoothAudioPort with the given codec configuration
- * FAILURE if the Audio HAL cannot register this IBluetoothAudioPort for
- * any other reason
- * @return dataMQ The fast message queue for audio data from/to this
- * provider. Audio data will be in PCM format as specified by the
- * audioConfig.pcmConfig parameter. Invalid if streaming is offloaded
- * from/to hardware or on failure.
- */
- startSession_2_2(IBluetoothAudioPort hostIf, AudioConfiguration audioConfig)
- generates (Status status, fmq_sync<uint8_t> dataMQ);
-
- /**
- * Called when the audio configuration of the stream has been changed.
- *
- * @param audioConfig The audio configuration negotiated with the remote
- * device. The PCM parameters are set if software based encoding,
- * otherwise the correct codec configuration is used for hardware
- * encoding.
- */
- updateAudioConfiguration(AudioConfiguration audioConfig);
-
- /**
- * Called when the supported latency mode is updated.
- *
- * @param allowed If the peripheral devices can't keep up with low latency
- * mode, the API will be called with supported is false.
- */
- setLowLatencyModeAllowed(bool allowed);
-};
diff --git a/bluetooth/audio/2.2/IBluetoothAudioProvidersFactory.hal b/bluetooth/audio/2.2/IBluetoothAudioProvidersFactory.hal
deleted file mode 100644
index ae9c598..0000000
--- a/bluetooth/audio/2.2/IBluetoothAudioProvidersFactory.hal
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.hardware.bluetooth.audio@2.2;
-
-import IBluetoothAudioProvider;
-import @2.1::IBluetoothAudioProvidersFactory;
-import @2.0::Status;
-import @2.1::SessionType;
-
-/**
- * This factory allows a HAL implementation to be split into multiple
- * independent providers.
- *
- * When the Bluetooth stack is ready to create an audio session, it must first
- * obtain the IBluetoothAudioProvider for that session type by calling
- * openProvider().
- *
- * Note: For HIDL APIs with a "generates" statement, the callback parameter used
- * for return value must be invoked synchronously before the API call returns.
- */
-interface IBluetoothAudioProvidersFactory extends @2.1::IBluetoothAudioProvidersFactory {
- /**
- * Opens an audio provider for a session type. To close the provider, it is
- * necessary to release references to the returned provider object.
- *
- * @param sessionType The session type (e.g.
- * LE_AUDIO_SOFTWARE_ENCODING_DATAPATH).
- *
- * @return status One of the following
- * SUCCESS if the Audio HAL successfully opens the provider with the
- * given session type
- * FAILURE if the Audio HAL cannot open the provider
- * @return provider The provider of the specified session type
- */
- openProvider_2_2(SessionType sessionType)
- 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);
-};
diff --git a/bluetooth/audio/2.2/OWNERS b/bluetooth/audio/2.2/OWNERS
deleted file mode 100644
index 84f5b1e..0000000
--- a/bluetooth/audio/2.2/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-aliceypkuo@google.com
-ugoyu@google.com
-sattiraju@google.com
diff --git a/bluetooth/audio/2.2/default/A2dpOffloadAudioProvider.cpp b/bluetooth/audio/2.2/default/A2dpOffloadAudioProvider.cpp
deleted file mode 100644
index 2a6d93a..0000000
--- a/bluetooth/audio/2.2/default/A2dpOffloadAudioProvider.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "BTAudioProviderA2dpOffload"
-
-#include "A2dpOffloadAudioProvider.h"
-
-#include <android-base/logging.h>
-#include <fmq/MessageQueue.h>
-#include <hidl/MQDescriptor.h>
-
-#include "BluetoothAudioSessionReport_2_2.h"
-#include "BluetoothAudioSupportedCodecsDB_2_1.h"
-
-namespace android {
-namespace hardware {
-namespace bluetooth {
-namespace audio {
-namespace V2_2 {
-namespace implementation {
-
-using ::android::bluetooth::audio::BluetoothAudioSessionReport_2_2;
-using ::android::hardware::kSynchronizedReadWrite;
-using ::android::hardware::MessageQueue;
-using ::android::hardware::Void;
-using ::android::hardware::bluetooth::audio::V2_0::AudioConfiguration;
-
-using DataMQ = MessageQueue<uint8_t, kSynchronizedReadWrite>;
-
-A2dpOffloadAudioProvider::A2dpOffloadAudioProvider()
- : BluetoothAudioProvider() {
- session_type_ = V2_1::SessionType::A2DP_HARDWARE_OFFLOAD_DATAPATH;
-}
-
-bool A2dpOffloadAudioProvider::isValid(const V2_0::SessionType& sessionType) {
- return isValid(static_cast<V2_1::SessionType>(sessionType));
-}
-
-bool A2dpOffloadAudioProvider::isValid(const V2_1::SessionType& sessionType) {
- return (sessionType == session_type_);
-}
-
-Return<void> A2dpOffloadAudioProvider::startSession(
- const sp<V2_0::IBluetoothAudioPort>& hostIf,
- const AudioConfiguration& audioConfig, startSession_cb _hidl_cb) {
- /**
- * Initialize the audio platform if audioConfiguration is supported.
- * Save the IBluetoothAudioPort interface, so that it can be used
- * later to send stream control commands to the HAL client, based on
- * interaction with Audio framework.
- */
- if (audioConfig.getDiscriminator() !=
- AudioConfiguration::hidl_discriminator::codecConfig) {
- LOG(WARNING) << __func__
- << " - Invalid Audio Configuration=" << toString(audioConfig);
- _hidl_cb(BluetoothAudioStatus::UNSUPPORTED_CODEC_CONFIGURATION,
- DataMQ::Descriptor());
- return Void();
- } else if (!android::bluetooth::audio::IsOffloadCodecConfigurationValid(
- session_type_, audioConfig.codecConfig())) {
- _hidl_cb(BluetoothAudioStatus::UNSUPPORTED_CODEC_CONFIGURATION,
- DataMQ::Descriptor());
- return Void();
- }
-
- return BluetoothAudioProvider::startSession(hostIf, audioConfig, _hidl_cb);
-}
-
-Return<void> A2dpOffloadAudioProvider::onSessionReady(
- startSession_cb _hidl_cb) {
- BluetoothAudioSessionReport_2_2::OnSessionStarted(session_type_, stack_iface_,
- nullptr, audio_config_);
- _hidl_cb(BluetoothAudioStatus::SUCCESS, DataMQ::Descriptor());
- return Void();
-}
-
-} // namespace implementation
-} // namespace V2_2
-} // namespace audio
-} // namespace bluetooth
-} // namespace hardware
-} // namespace android
diff --git a/bluetooth/audio/2.2/default/A2dpOffloadAudioProvider.h b/bluetooth/audio/2.2/default/A2dpOffloadAudioProvider.h
deleted file mode 100644
index 7ccdedc..0000000
--- a/bluetooth/audio/2.2/default/A2dpOffloadAudioProvider.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include "BluetoothAudioProvider.h"
-
-namespace android {
-namespace hardware {
-namespace bluetooth {
-namespace audio {
-namespace V2_2 {
-namespace implementation {
-
-class A2dpOffloadAudioProvider : public BluetoothAudioProvider {
- public:
- A2dpOffloadAudioProvider();
-
- bool isValid(const V2_1::SessionType& sessionType) override;
- bool isValid(const V2_0::SessionType& sessionType) override;
-
- Return<void> startSession(const sp<V2_0::IBluetoothAudioPort>& hostIf,
- const V2_0::AudioConfiguration& audioConfig,
- startSession_cb _hidl_cb) override;
-
- private:
- Return<void> onSessionReady(startSession_cb _hidl_cb) override;
-};
-
-} // namespace implementation
-} // namespace V2_2
-} // namespace audio
-} // namespace bluetooth
-} // namespace hardware
-} // namespace android
diff --git a/bluetooth/audio/2.2/default/A2dpSoftwareAudioProvider.cpp b/bluetooth/audio/2.2/default/A2dpSoftwareAudioProvider.cpp
deleted file mode 100644
index eb87178..0000000
--- a/bluetooth/audio/2.2/default/A2dpSoftwareAudioProvider.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "BTAudioProviderA2dpSoftware"
-
-#include "A2dpSoftwareAudioProvider.h"
-
-#include <android-base/logging.h>
-
-#include "BluetoothAudioSessionReport_2_2.h"
-#include "BluetoothAudioSupportedCodecsDB_2_2.h"
-
-namespace android {
-namespace hardware {
-namespace bluetooth {
-namespace audio {
-namespace V2_2 {
-namespace implementation {
-
-using ::android::bluetooth::audio::BluetoothAudioSessionReport_2_2;
-using ::android::hardware::Void;
-using ::android::hardware::bluetooth::audio::V2_0::AudioConfiguration;
-
-// Here the buffer size is based on SBC
-static constexpr uint32_t kPcmFrameSize = 4; // 16 bits per sample / stereo
-// SBC is 128, and here we choose the LCM of 16, 24, and 32
-static constexpr uint32_t kPcmFrameCount = 96;
-static constexpr uint32_t kRtpFrameSize = kPcmFrameSize * kPcmFrameCount;
-// The max counts by 1 tick (20ms) for SBC is about 7. Since using 96 for the
-// PCM counts, here we just choose a greater number
-static constexpr uint32_t kRtpFrameCount = 10;
-static constexpr uint32_t kBufferSize = kRtpFrameSize * kRtpFrameCount;
-static constexpr uint32_t kBufferCount = 2; // double buffer
-static constexpr uint32_t kDataMqSize = kBufferSize * kBufferCount;
-
-A2dpSoftwareAudioProvider::A2dpSoftwareAudioProvider()
- : BluetoothAudioProvider(), mDataMQ(nullptr) {
- LOG(INFO) << __func__ << " - size of audio buffer " << kDataMqSize
- << " byte(s)";
- std::unique_ptr<DataMQ> tempDataMQ(
- new DataMQ(kDataMqSize, /* EventFlag */ true));
- if (tempDataMQ && tempDataMQ->isValid()) {
- mDataMQ = std::move(tempDataMQ);
- session_type_ = V2_1::SessionType::A2DP_SOFTWARE_ENCODING_DATAPATH;
- } else {
- ALOGE_IF(!tempDataMQ, "failed to allocate data MQ");
- ALOGE_IF(tempDataMQ && !tempDataMQ->isValid(), "data MQ is invalid");
- }
-}
-
-bool A2dpSoftwareAudioProvider::isValid(const V2_0::SessionType& sessionType) {
- return isValid(static_cast<V2_1::SessionType>(sessionType));
-}
-
-bool A2dpSoftwareAudioProvider::isValid(const V2_1::SessionType& sessionType) {
- return (sessionType == session_type_ && mDataMQ && mDataMQ->isValid());
-}
-
-Return<void> A2dpSoftwareAudioProvider::startSession(
- const sp<V2_0::IBluetoothAudioPort>& hostIf,
- const AudioConfiguration& audioConfig, startSession_cb _hidl_cb) {
- /**
- * Initialize the audio platform if audioConfiguration is supported.
- * Save the IBluetoothAudioPort interface, so that it can be used
- * later to send stream control commands to the HAL client, based on
- * interaction with Audio framework.
- */
- if (audioConfig.getDiscriminator() !=
- AudioConfiguration::hidl_discriminator::pcmConfig) {
- LOG(WARNING) << __func__
- << " - Invalid Audio Configuration=" << toString(audioConfig);
- _hidl_cb(BluetoothAudioStatus::UNSUPPORTED_CODEC_CONFIGURATION,
- DataMQ::Descriptor());
- return Void();
- } else if (!android::bluetooth::audio::IsSoftwarePcmConfigurationValid(
- audioConfig.pcmConfig())) {
- LOG(WARNING) << __func__ << " - Unsupported PCM Configuration="
- << toString(audioConfig.pcmConfig());
- _hidl_cb(BluetoothAudioStatus::UNSUPPORTED_CODEC_CONFIGURATION,
- DataMQ::Descriptor());
- return Void();
- }
-
- return BluetoothAudioProvider::startSession(hostIf, audioConfig, _hidl_cb);
-}
-
-Return<void> A2dpSoftwareAudioProvider::onSessionReady(
- startSession_cb _hidl_cb) {
- if (mDataMQ && mDataMQ->isValid()) {
- BluetoothAudioSessionReport_2_2::OnSessionStarted(
- session_type_, stack_iface_, mDataMQ->getDesc(), audio_config_);
- _hidl_cb(BluetoothAudioStatus::SUCCESS, *mDataMQ->getDesc());
- } else {
- _hidl_cb(BluetoothAudioStatus::FAILURE, DataMQ::Descriptor());
- }
- return Void();
-}
-
-} // namespace implementation
-} // namespace V2_2
-} // namespace audio
-} // namespace bluetooth
-} // namespace hardware
-} // namespace android
diff --git a/bluetooth/audio/2.2/default/A2dpSoftwareAudioProvider.h b/bluetooth/audio/2.2/default/A2dpSoftwareAudioProvider.h
deleted file mode 100644
index ac3aece..0000000
--- a/bluetooth/audio/2.2/default/A2dpSoftwareAudioProvider.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <fmq/MessageQueue.h>
-#include <hidl/MQDescriptor.h>
-
-#include "BluetoothAudioProvider.h"
-
-namespace android {
-namespace hardware {
-namespace bluetooth {
-namespace audio {
-namespace V2_2 {
-namespace implementation {
-
-using ::android::hardware::kSynchronizedReadWrite;
-using ::android::hardware::MessageQueue;
-
-using DataMQ = MessageQueue<uint8_t, kSynchronizedReadWrite>;
-
-class A2dpSoftwareAudioProvider : public BluetoothAudioProvider {
- public:
- A2dpSoftwareAudioProvider();
-
- bool isValid(const V2_1::SessionType& sessionType) override;
- bool isValid(const V2_0::SessionType& sessionType) override;
-
- Return<void> startSession(const sp<V2_0::IBluetoothAudioPort>& hostIf,
- const V2_0::AudioConfiguration& audioConfig,
- startSession_cb _hidl_cb) override;
-
- private:
- // audio data queue for software encoding
- std::unique_ptr<DataMQ> mDataMQ;
-
- Return<void> onSessionReady(startSession_cb _hidl_cb) override;
-};
-
-} // namespace implementation
-} // namespace V2_2
-} // namespace audio
-} // namespace bluetooth
-} // namespace hardware
-} // namespace android
diff --git a/bluetooth/audio/2.2/default/Android.bp b/bluetooth/audio/2.2/default/Android.bp
deleted file mode 100644
index 7a5ae75..0000000
--- a/bluetooth/audio/2.2/default/Android.bp
+++ /dev/null
@@ -1,37 +0,0 @@
-package {
- // See: http://go/android-license-faq
- // A large-scale-change added 'default_applicable_licenses' to import
- // all of the 'license_kinds' from "hardware_interfaces_license"
- // to get the below license kinds:
- // SPDX-license-identifier-Apache-2.0
- default_applicable_licenses: ["hardware_interfaces_license"],
-}
-
-cc_library_shared {
- name: "android.hardware.bluetooth.audio@2.2-impl",
- defaults: ["hidl_defaults"],
- vendor: true,
- relative_install_path: "hw",
- srcs: [
- "BluetoothAudioProvidersFactory.cpp",
- "BluetoothAudioProvider.cpp",
- "A2dpOffloadAudioProvider.cpp",
- "A2dpSoftwareAudioProvider.cpp",
- "HearingAidAudioProvider.cpp",
- "LeAudioAudioProvider.cpp",
- "LeAudioOffloadAudioProvider.cpp",
- ],
- header_libs: ["libhardware_headers"],
- shared_libs: [
- "android.hardware.bluetooth.audio@2.0",
- "android.hardware.bluetooth.audio@2.1",
- "android.hardware.bluetooth.audio@2.2",
- "libbase",
- "libbluetooth_audio_session",
- "libcutils",
- "libfmq",
- "libhidlbase",
- "liblog",
- "libutils",
- ],
-}
diff --git a/bluetooth/audio/2.2/default/AudioPort_2_0_to_2_2_Wrapper.h b/bluetooth/audio/2.2/default/AudioPort_2_0_to_2_2_Wrapper.h
deleted file mode 100644
index c5613fb..0000000
--- a/bluetooth/audio/2.2/default/AudioPort_2_0_to_2_2_Wrapper.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <android/hardware/bluetooth/audio/2.2/types.h>
-
-namespace android {
-namespace hardware {
-namespace bluetooth {
-namespace audio {
-namespace V2_2 {
-namespace implementation {
-
-using ::android::sp;
-using ::android::hardware::Return;
-using ::android::hardware::Void;
-using ::android::hardware::audio::common::V5_0::SinkMetadata;
-using ::android::hardware::audio::common::V5_0::SourceMetadata;
-using ::android::hardware::bluetooth::audio::V2_2::IBluetoothAudioPort;
-
-class AudioPort_2_0_to_2_2_Wrapper : public V2_2::IBluetoothAudioPort {
- public:
- AudioPort_2_0_to_2_2_Wrapper(const sp<V2_0::IBluetoothAudioPort>& port) {
- this->port = port;
- }
-
- Return<void> startStream() override { return port->startStream(); }
- Return<void> suspendStream() override { return port->suspendStream(); }
- Return<void> stopStream() override { return port->stopStream(); }
- Return<void> getPresentationPosition(
- getPresentationPosition_cb _hidl_cb) override {
- return port->getPresentationPosition(_hidl_cb);
- }
- Return<void> updateMetadata(const SourceMetadata& sourceMetadata) override {
- return port->updateMetadata(sourceMetadata);
- }
- Return<void> updateSinkMetadata(const SinkMetadata&) override {
- // DO NOTHING, 2.0 AudioPort doesn't support sink metadata updates
- return Void();
- }
-
- sp<V2_0::IBluetoothAudioPort> port;
-};
-
-} // namespace implementation
-} // namespace V2_2
-} // namespace audio
-} // namespace bluetooth
-} // namespace hardware
-} // namespace android
\ No newline at end of file
diff --git a/bluetooth/audio/2.2/default/BluetoothAudioProvider.cpp b/bluetooth/audio/2.2/default/BluetoothAudioProvider.cpp
deleted file mode 100644
index 62511e9..0000000
--- a/bluetooth/audio/2.2/default/BluetoothAudioProvider.cpp
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "BTAudioProviderStub"
-
-#include "BluetoothAudioProvider.h"
-
-#include <android-base/logging.h>
-
-#include "AudioPort_2_0_to_2_2_Wrapper.h"
-#include "BluetoothAudioSessionReport_2_2.h"
-#include "BluetoothAudioSupportedCodecsDB_2_2.h"
-
-namespace android {
-namespace hardware {
-namespace bluetooth {
-namespace audio {
-namespace V2_2 {
-namespace implementation {
-
-using ::android::bluetooth::audio::BluetoothAudioSessionReport_2_2;
-using ::android::hardware::kSynchronizedReadWrite;
-using ::android::hardware::MessageQueue;
-using ::android::hardware::Void;
-
-using DataMQ = MessageQueue<uint8_t, kSynchronizedReadWrite>;
-
-void BluetoothAudioDeathRecipient::serviceDied(
- uint64_t cookie __unused,
- const wp<::android::hidl::base::V1_0::IBase>& who __unused) {
- LOG(ERROR) << "BluetoothAudioDeathRecipient::" << __func__
- << " - BluetoothAudio Service died";
- provider_->endSession();
-}
-
-BluetoothAudioProvider::BluetoothAudioProvider()
- : death_recipient_(new BluetoothAudioDeathRecipient(this)),
- session_type_(V2_1::SessionType::UNKNOWN),
- audio_config_({}) {}
-
-Return<void> BluetoothAudioProvider::startSession(
- const sp<V2_0::IBluetoothAudioPort>& hostIf,
- const V2_0::AudioConfiguration& audioConfig, startSession_cb _hidl_cb) {
- AudioConfiguration audioConfig_2_2;
-
- if (audioConfig.getDiscriminator() ==
- V2_0::AudioConfiguration::hidl_discriminator::pcmConfig) {
- audioConfig_2_2.pcmConfig(
- {.sampleRate =
- static_cast<V2_1::SampleRate>(audioConfig.pcmConfig().sampleRate),
- .channelMode = audioConfig.pcmConfig().channelMode,
- .bitsPerSample = audioConfig.pcmConfig().bitsPerSample,
- .dataIntervalUs = 0});
- } else {
- audioConfig_2_2.codecConfig(audioConfig.codecConfig());
- }
-
- sp<V2_2::IBluetoothAudioPort> hostIf_2_2 =
- new AudioPort_2_0_to_2_2_Wrapper(hostIf);
- return startSession_2_2(hostIf_2_2, audioConfig_2_2, _hidl_cb);
-}
-
-Return<void> BluetoothAudioProvider::startSession_2_1(
- const sp<V2_0::IBluetoothAudioPort>& hostIf,
- const V2_1::AudioConfiguration& audioConfig, startSession_cb _hidl_cb) {
- AudioConfiguration audioConfig_2_2;
- if (audioConfig.getDiscriminator() ==
- V2_1::AudioConfiguration::hidl_discriminator::leAudioCodecConfig) {
- audioConfig_2_2.leAudioConfig().mode = LeAudioMode::UNKNOWN;
- audioConfig_2_2.leAudioConfig().config.unicastConfig() = {
- .streamMap = {{
- .streamHandle = 0xFFFF,
- .audioChannelAllocation =
- audioConfig.leAudioCodecConfig().audioChannelAllocation,
- }},
- .peerDelay = 0,
- .lc3Config = audioConfig.leAudioCodecConfig().lc3Config};
- } else if (audioConfig.getDiscriminator() ==
- V2_1::AudioConfiguration::hidl_discriminator::pcmConfig) {
- audioConfig_2_2.pcmConfig(audioConfig.pcmConfig());
- } else {
- audioConfig_2_2.codecConfig(audioConfig.codecConfig());
- }
-
- sp<V2_2::IBluetoothAudioPort> hostIf_2_2 =
- new AudioPort_2_0_to_2_2_Wrapper(hostIf);
- return startSession_2_2(hostIf_2_2, audioConfig_2_2, _hidl_cb);
-}
-
-Return<void> BluetoothAudioProvider::startSession_2_2(
- const sp<V2_2::IBluetoothAudioPort>& hostIf,
- const AudioConfiguration& audioConfig, startSession_cb _hidl_cb) {
- if (hostIf == nullptr) {
- _hidl_cb(BluetoothAudioStatus::FAILURE, DataMQ::Descriptor());
- return Void();
- }
-
- /**
- * Initialize the audio platform if audioConfiguration is supported.
- * Save the IBluetoothAudioPort interface, so that it can be used
- * later to send stream control commands to the HAL client, based on
- * interaction with Audio framework.
- */
- audio_config_ = audioConfig;
- stack_iface_ = hostIf;
- stack_iface_->linkToDeath(death_recipient_, 0);
-
- LOG(INFO) << __func__ << " - SessionType=" << toString(session_type_)
- << ", AudioConfiguration=[" << toString(audio_config_) << "]";
-
- onSessionReady(_hidl_cb);
- return Void();
-}
-
-Return<void> BluetoothAudioProvider::streamStarted(
- BluetoothAudioStatus status) {
- LOG(INFO) << __func__ << " - SessionType=" << toString(session_type_)
- << ", status=" << toString(status);
-
- /**
- * Streaming on control path has started,
- * HAL server should start the streaming on data path.
- */
- if (stack_iface_) {
- BluetoothAudioSessionReport_2_2::ReportControlStatus(session_type_, true,
- status);
- } else {
- LOG(WARNING) << __func__ << " - SessionType=" << toString(session_type_)
- << ", status=" << toString(status) << " has NO session";
- }
-
- return Void();
-}
-
-Return<void> BluetoothAudioProvider::streamSuspended(
- BluetoothAudioStatus status) {
- LOG(INFO) << __func__ << " - SessionType=" << toString(session_type_)
- << ", status=" << toString(status);
-
- /**
- * Streaming on control path has suspend,
- * HAL server should suspend the streaming on data path.
- */
- if (stack_iface_) {
- BluetoothAudioSessionReport_2_2::ReportControlStatus(session_type_, false,
- status);
- } else {
- LOG(WARNING) << __func__ << " - SessionType=" << toString(session_type_)
- << ", status=" << toString(status) << " has NO session";
- }
-
- return Void();
-}
-
-Return<void> BluetoothAudioProvider::endSession() {
- LOG(INFO) << __func__ << " - SessionType=" << toString(session_type_);
-
- if (stack_iface_) {
- BluetoothAudioSessionReport_2_2::OnSessionEnded(session_type_);
- stack_iface_->unlinkToDeath(death_recipient_);
- } else {
- LOG(INFO) << __func__ << " - SessionType=" << toString(session_type_)
- << " has NO session";
- }
-
- /**
- * Clean up the audio platform as remote audio device is no
- * longer active
- */
- stack_iface_ = nullptr;
- audio_config_ = {};
-
- return Void();
-}
-
-Return<void> BluetoothAudioProvider::updateAudioConfiguration(
- const AudioConfiguration& audioConfig) {
- LOG(INFO) << __func__ << " - SessionType=" << toString(session_type_);
-
- if (stack_iface_ == nullptr) {
- LOG(INFO) << __func__ << " - SessionType=" << toString(session_type_)
- << " has NO session";
- return Void();
- }
-
- if (audioConfig.getDiscriminator() != audio_config_.getDiscriminator()) {
- LOG(INFO) << __func__ << " - SessionType=" << toString(session_type_)
- << " audio config type is not match";
- return Void();
- }
-
- audio_config_ = audioConfig;
- BluetoothAudioSessionReport_2_2::ReportAudioConfigChanged(session_type_,
- audio_config_);
-
- return Void();
-}
-
-Return<void> BluetoothAudioProvider::setLowLatencyModeAllowed(bool allowed) {
- LOG(INFO) << __func__ << " - SessionType=" << toString(session_type_);
-
- if (stack_iface_ == nullptr) {
- LOG(INFO) << __func__ << " - SessionType=" << toString(session_type_)
- << " has NO session";
- return Void();
- }
- LOG(INFO) << __func__ << " allowed: " << allowed;
- return Void();
-}
-
-} // namespace implementation
-} // namespace V2_2
-} // namespace audio
-} // namespace bluetooth
-} // namespace hardware
-} // namespace android
diff --git a/bluetooth/audio/2.2/default/BluetoothAudioProvider.h b/bluetooth/audio/2.2/default/BluetoothAudioProvider.h
deleted file mode 100644
index 90c158e..0000000
--- a/bluetooth/audio/2.2/default/BluetoothAudioProvider.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <android/hardware/bluetooth/audio/2.2/IBluetoothAudioProvider.h>
-
-namespace android {
-namespace hardware {
-namespace bluetooth {
-namespace audio {
-namespace V2_2 {
-namespace implementation {
-
-using ::android::sp;
-using ::android::hardware::bluetooth::audio::V2_2::IBluetoothAudioPort;
-
-using BluetoothAudioStatus =
- ::android::hardware::bluetooth::audio::V2_0::Status;
-
-class BluetoothAudioDeathRecipient;
-
-class BluetoothAudioProvider : public IBluetoothAudioProvider {
- public:
- BluetoothAudioProvider();
- ~BluetoothAudioProvider() = default;
-
- virtual bool isValid(const V2_1::SessionType& sessionType) = 0;
- virtual bool isValid(const V2_0::SessionType& sessionType) = 0;
-
- Return<void> startSession(const sp<V2_0::IBluetoothAudioPort>& hostIf,
- const V2_0::AudioConfiguration& audioConfig,
- startSession_cb _hidl_cb) override;
- Return<void> startSession_2_1(const sp<V2_0::IBluetoothAudioPort>& hostIf,
- const V2_1::AudioConfiguration& audioConfig,
- startSession_cb _hidl_cb) override;
- Return<void> startSession_2_2(const sp<V2_2::IBluetoothAudioPort>& hostIf,
- const AudioConfiguration& audioConfig,
- startSession_cb _hidl_cb) override;
- Return<void> streamStarted(BluetoothAudioStatus status) override;
- Return<void> streamSuspended(BluetoothAudioStatus status) override;
- Return<void> endSession() override;
- Return<void> updateAudioConfiguration(
- const AudioConfiguration& audioConfig) override;
-
- Return<void> setLowLatencyModeAllowed(bool allowed) override;
-
- protected:
- sp<BluetoothAudioDeathRecipient> death_recipient_;
-
- V2_1::SessionType session_type_;
- AudioConfiguration audio_config_;
- sp<V2_2::IBluetoothAudioPort> stack_iface_;
-
- virtual Return<void> onSessionReady(startSession_cb _hidl_cb) = 0;
-};
-
-class BluetoothAudioDeathRecipient : public hidl_death_recipient {
- public:
- BluetoothAudioDeathRecipient(const sp<BluetoothAudioProvider> provider)
- : provider_(provider) {}
-
- virtual void serviceDied(
- uint64_t cookie,
- const wp<::android::hidl::base::V1_0::IBase>& who) override;
-
- private:
- sp<BluetoothAudioProvider> provider_;
-};
-
-} // namespace implementation
-} // namespace V2_2
-} // namespace audio
-} // namespace bluetooth
-} // namespace hardware
-} // namespace android
diff --git a/bluetooth/audio/2.2/default/BluetoothAudioProvidersFactory.cpp b/bluetooth/audio/2.2/default/BluetoothAudioProvidersFactory.cpp
deleted file mode 100644
index 490a436..0000000
--- a/bluetooth/audio/2.2/default/BluetoothAudioProvidersFactory.cpp
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "BTAudioProvidersFactory"
-
-#include "BluetoothAudioProvidersFactory.h"
-
-#include <android-base/logging.h>
-
-#include "BluetoothAudioSupportedCodecsDB_2_2.h"
-
-namespace android {
-namespace hardware {
-namespace bluetooth {
-namespace audio {
-namespace V2_2 {
-namespace implementation {
-
-using ::android::hardware::hidl_vec;
-using ::android::hardware::Void;
-using ::android::hardware::bluetooth::audio::V2_0::CodecCapabilities;
-
-A2dpSoftwareAudioProvider
- BluetoothAudioProvidersFactory::a2dp_software_provider_instance_;
-A2dpOffloadAudioProvider
- BluetoothAudioProvidersFactory::a2dp_offload_provider_instance_;
-HearingAidAudioProvider
- BluetoothAudioProvidersFactory::hearing_aid_provider_instance_;
-LeAudioOutputAudioProvider
- BluetoothAudioProvidersFactory::leaudio_output_provider_instance_;
-LeAudioOffloadOutputAudioProvider
- BluetoothAudioProvidersFactory::leaudio_offload_output_provider_instance_;
-LeAudioInputAudioProvider
- BluetoothAudioProvidersFactory::leaudio_input_provider_instance_;
-LeAudioOffloadInputAudioProvider
- BluetoothAudioProvidersFactory::leaudio_offload_input_provider_instance_;
-
-Return<void> BluetoothAudioProvidersFactory::openProvider(
- const V2_0::SessionType sessionType, openProvider_cb _hidl_cb) {
- LOG(INFO) << __func__ << " - SessionType=" << toString(sessionType);
- BluetoothAudioStatus status = BluetoothAudioStatus::SUCCESS;
- BluetoothAudioProvider* provider = nullptr;
-
- switch (sessionType) {
- case V2_0::SessionType::A2DP_SOFTWARE_ENCODING_DATAPATH:
- provider = &a2dp_software_provider_instance_;
- break;
- case V2_0::SessionType::A2DP_HARDWARE_OFFLOAD_DATAPATH:
- provider = &a2dp_offload_provider_instance_;
- break;
- case V2_0::SessionType::HEARING_AID_SOFTWARE_ENCODING_DATAPATH:
- provider = &hearing_aid_provider_instance_;
- break;
- default:
- status = BluetoothAudioStatus::FAILURE;
- }
-
- if (provider == nullptr || !provider->isValid(sessionType)) {
- provider = nullptr;
- status = BluetoothAudioStatus::FAILURE;
- LOG(ERROR) << __func__ << " - SessionType=" << toString(sessionType)
- << ", status=" << toString(status);
- }
-
- _hidl_cb(status, provider);
- return Void();
-}
-
-Return<void> BluetoothAudioProvidersFactory::openProvider_2_1(
- const V2_1::SessionType sessionType, openProvider_2_1_cb _hidl_cb) {
- LOG(INFO) << __func__ << " - SessionType=" << toString(sessionType);
- BluetoothAudioStatus status = BluetoothAudioStatus::SUCCESS;
- BluetoothAudioProvider* provider = nullptr;
-
- switch (sessionType) {
- case V2_1::SessionType::A2DP_SOFTWARE_ENCODING_DATAPATH:
- provider = &a2dp_software_provider_instance_;
- break;
- case V2_1::SessionType::A2DP_HARDWARE_OFFLOAD_DATAPATH:
- provider = &a2dp_offload_provider_instance_;
- break;
- case V2_1::SessionType::HEARING_AID_SOFTWARE_ENCODING_DATAPATH:
- provider = &hearing_aid_provider_instance_;
- break;
- case V2_1::SessionType::LE_AUDIO_SOFTWARE_ENCODING_DATAPATH:
- provider = &leaudio_output_provider_instance_;
- break;
- case V2_1::SessionType::LE_AUDIO_SOFTWARE_DECODED_DATAPATH:
- provider = &leaudio_input_provider_instance_;
- break;
- default:
- status = BluetoothAudioStatus::FAILURE;
- }
-
- if (provider == nullptr || !provider->isValid(sessionType)) {
- provider = nullptr;
- status = BluetoothAudioStatus::FAILURE;
- LOG(ERROR) << __func__ << " - SessionType=" << toString(sessionType)
- << ", status=" << toString(status);
- }
-
- _hidl_cb(status, provider);
- return Void();
-}
-
-Return<void> BluetoothAudioProvidersFactory::openProvider_2_2(
- const V2_1::SessionType sessionType, openProvider_2_2_cb _hidl_cb) {
- LOG(INFO) << __func__ << " - SessionType=" << toString(sessionType);
- BluetoothAudioStatus status = BluetoothAudioStatus::SUCCESS;
- BluetoothAudioProvider* provider = nullptr;
-
- switch (sessionType) {
- case V2_1::SessionType::A2DP_SOFTWARE_ENCODING_DATAPATH:
- provider = &a2dp_software_provider_instance_;
- break;
- case V2_1::SessionType::A2DP_HARDWARE_OFFLOAD_DATAPATH:
- provider = &a2dp_offload_provider_instance_;
- break;
- case V2_1::SessionType::HEARING_AID_SOFTWARE_ENCODING_DATAPATH:
- provider = &hearing_aid_provider_instance_;
- break;
- case V2_1::SessionType::LE_AUDIO_SOFTWARE_ENCODING_DATAPATH:
- provider = &leaudio_output_provider_instance_;
- break;
- case V2_1::SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH:
- provider = &leaudio_offload_output_provider_instance_;
- break;
- case V2_1::SessionType::LE_AUDIO_SOFTWARE_DECODED_DATAPATH:
- provider = &leaudio_input_provider_instance_;
- break;
- case V2_1::SessionType::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH:
- provider = &leaudio_offload_input_provider_instance_;
- break;
- default:
- status = BluetoothAudioStatus::FAILURE;
- }
-
- if (provider == nullptr || !provider->isValid(sessionType)) {
- provider = nullptr;
- status = BluetoothAudioStatus::FAILURE;
- LOG(ERROR) << __func__ << " - SessionType=" << toString(sessionType)
- << ", status=" << toString(status);
- }
-
- _hidl_cb(status, provider);
- return Void();
-}
-
-Return<void> BluetoothAudioProvidersFactory::getProviderCapabilities(
- const V2_0::SessionType sessionType, getProviderCapabilities_cb _hidl_cb) {
- hidl_vec<V2_0::AudioCapabilities> audio_capabilities =
- hidl_vec<V2_0::AudioCapabilities>(0);
- if (sessionType == V2_0::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_0::SessionType::UNKNOWN) {
- std::vector<::android::hardware::bluetooth::audio::V2_0::PcmParameters>
- db_pcm_capabilities =
- android::bluetooth::audio::GetSoftwarePcmCapabilities();
- 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();
-}
-
-Return<void> BluetoothAudioProvidersFactory::getProviderCapabilities_2_1(
- const V2_1::SessionType sessionType,
- getProviderCapabilities_2_1_cb _hidl_cb) {
- hidl_vec<V2_1::AudioCapabilities> audio_capabilities =
- hidl_vec<V2_1::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::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();
-}
-
-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<LeAudioCodecCapabilitiesSetting> 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(
- const char* /* name */) {
- return new BluetoothAudioProvidersFactory();
-}
-
-} // namespace implementation
-} // namespace V2_2
-} // namespace audio
-} // namespace bluetooth
-} // namespace hardware
-} // namespace android
diff --git a/bluetooth/audio/2.2/default/BluetoothAudioProvidersFactory.h b/bluetooth/audio/2.2/default/BluetoothAudioProvidersFactory.h
deleted file mode 100644
index 4f549d9..0000000
--- a/bluetooth/audio/2.2/default/BluetoothAudioProvidersFactory.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <android/hardware/bluetooth/audio/2.2/IBluetoothAudioProvidersFactory.h>
-
-#include "A2dpOffloadAudioProvider.h"
-#include "A2dpSoftwareAudioProvider.h"
-#include "BluetoothAudioProvider.h"
-#include "HearingAidAudioProvider.h"
-#include "LeAudioAudioProvider.h"
-#include "LeAudioOffloadAudioProvider.h"
-
-namespace android {
-namespace hardware {
-namespace bluetooth {
-namespace audio {
-namespace V2_2 {
-namespace implementation {
-
-class BluetoothAudioProvidersFactory : public IBluetoothAudioProvidersFactory {
- public:
- BluetoothAudioProvidersFactory() {}
-
- Return<void> openProvider(const V2_0::SessionType sessionType,
- openProvider_cb _hidl_cb) override;
-
- Return<void> getProviderCapabilities(
- const V2_0::SessionType sessionType,
- getProviderCapabilities_cb _hidl_cb) override;
-
- Return<void> openProvider_2_1(const V2_1::SessionType sessionType,
- openProvider_2_1_cb _hidl_cb) override;
-
- Return<void> openProvider_2_2(const V2_1::SessionType sessionType,
- openProvider_2_2_cb _hidl_cb) override;
-
- Return<void> getProviderCapabilities_2_1(
- const V2_1::SessionType sessionType,
- 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:
- static A2dpSoftwareAudioProvider a2dp_software_provider_instance_;
- static A2dpOffloadAudioProvider a2dp_offload_provider_instance_;
- static HearingAidAudioProvider hearing_aid_provider_instance_;
- static LeAudioOutputAudioProvider leaudio_output_provider_instance_;
- static LeAudioInputAudioProvider leaudio_input_provider_instance_;
- static LeAudioOffloadOutputAudioProvider
- leaudio_offload_output_provider_instance_;
- static LeAudioOffloadInputAudioProvider
- leaudio_offload_input_provider_instance_;
-};
-
-extern "C" IBluetoothAudioProvidersFactory*
-HIDL_FETCH_IBluetoothAudioProvidersFactory(const char* name);
-
-} // namespace implementation
-} // namespace V2_2
-} // namespace audio
-} // namespace bluetooth
-} // namespace hardware
-} // namespace android
diff --git a/bluetooth/audio/2.2/default/HearingAidAudioProvider.cpp b/bluetooth/audio/2.2/default/HearingAidAudioProvider.cpp
deleted file mode 100644
index 25e49a1..0000000
--- a/bluetooth/audio/2.2/default/HearingAidAudioProvider.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "BTAudioProviderHearingAid"
-
-#include "HearingAidAudioProvider.h"
-
-#include <android-base/logging.h>
-
-#include "BluetoothAudioSessionReport_2_2.h"
-#include "BluetoothAudioSupportedCodecsDB_2_2.h"
-
-namespace android {
-namespace hardware {
-namespace bluetooth {
-namespace audio {
-namespace V2_2 {
-namespace implementation {
-
-using ::android::bluetooth::audio::BluetoothAudioSessionReport_2_2;
-using ::android::hardware::Void;
-using ::android::hardware::bluetooth::audio::V2_0::AudioConfiguration;
-
-static constexpr uint32_t kPcmFrameSize = 4; // 16 bits per sample / stereo
-static constexpr uint32_t kPcmFrameCount = 128;
-static constexpr uint32_t kRtpFrameSize = kPcmFrameSize * kPcmFrameCount;
-static constexpr uint32_t kRtpFrameCount = 7; // max counts by 1 tick (20ms)
-static constexpr uint32_t kBufferSize = kRtpFrameSize * kRtpFrameCount;
-static constexpr uint32_t kBufferCount = 1; // single buffer
-static constexpr uint32_t kDataMqSize = kBufferSize * kBufferCount;
-
-HearingAidAudioProvider::HearingAidAudioProvider()
- : BluetoothAudioProvider(), mDataMQ(nullptr) {
- LOG(INFO) << __func__ << " - size of audio buffer " << kDataMqSize
- << " byte(s)";
- std::unique_ptr<DataMQ> tempDataMQ(
- new DataMQ(kDataMqSize, /* EventFlag */ true));
- if (tempDataMQ && tempDataMQ->isValid()) {
- mDataMQ = std::move(tempDataMQ);
- session_type_ = V2_1::SessionType::HEARING_AID_SOFTWARE_ENCODING_DATAPATH;
- } else {
- ALOGE_IF(!tempDataMQ, "failed to allocate data MQ");
- ALOGE_IF(tempDataMQ && !tempDataMQ->isValid(), "data MQ is invalid");
- }
-}
-
-bool HearingAidAudioProvider::isValid(const V2_0::SessionType& sessionType) {
- return isValid(static_cast<V2_1::SessionType>(sessionType));
-}
-
-bool HearingAidAudioProvider::isValid(const V2_1::SessionType& sessionType) {
- return (sessionType == session_type_ && mDataMQ && mDataMQ->isValid());
-}
-
-Return<void> HearingAidAudioProvider::startSession(
- const sp<V2_0::IBluetoothAudioPort>& hostIf,
- const AudioConfiguration& audioConfig, startSession_cb _hidl_cb) {
- /**
- * Initialize the audio platform if audioConfiguration is supported.
- * Save the IBluetoothAudioPort interface, so that it can be used
- * later to send stream control commands to the HAL client, based on
- * interaction with Audio framework.
- */
- if (audioConfig.getDiscriminator() !=
- AudioConfiguration::hidl_discriminator::pcmConfig) {
- LOG(WARNING) << __func__
- << " - Invalid Audio Configuration=" << toString(audioConfig);
- _hidl_cb(BluetoothAudioStatus::UNSUPPORTED_CODEC_CONFIGURATION,
- DataMQ::Descriptor());
- return Void();
- } else if (!android::bluetooth::audio::IsSoftwarePcmConfigurationValid(
- audioConfig.pcmConfig())) {
- LOG(WARNING) << __func__ << " - Unsupported PCM Configuration="
- << toString(audioConfig.pcmConfig());
- _hidl_cb(BluetoothAudioStatus::UNSUPPORTED_CODEC_CONFIGURATION,
- DataMQ::Descriptor());
- return Void();
- }
-
- return BluetoothAudioProvider::startSession(hostIf, audioConfig, _hidl_cb);
-}
-
-Return<void> HearingAidAudioProvider::onSessionReady(startSession_cb _hidl_cb) {
- if (mDataMQ && mDataMQ->isValid()) {
- BluetoothAudioSessionReport_2_2::OnSessionStarted(
- session_type_, stack_iface_, mDataMQ->getDesc(), audio_config_);
- _hidl_cb(BluetoothAudioStatus::SUCCESS, *mDataMQ->getDesc());
- } else {
- _hidl_cb(BluetoothAudioStatus::FAILURE, DataMQ::Descriptor());
- }
- return Void();
-}
-
-} // namespace implementation
-} // namespace V2_2
-} // namespace audio
-} // namespace bluetooth
-} // namespace hardware
-} // namespace android
diff --git a/bluetooth/audio/2.2/default/HearingAidAudioProvider.h b/bluetooth/audio/2.2/default/HearingAidAudioProvider.h
deleted file mode 100644
index 63290b5..0000000
--- a/bluetooth/audio/2.2/default/HearingAidAudioProvider.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <fmq/MessageQueue.h>
-#include <hidl/MQDescriptor.h>
-
-#include "BluetoothAudioProvider.h"
-
-namespace android {
-namespace hardware {
-namespace bluetooth {
-namespace audio {
-namespace V2_2 {
-namespace implementation {
-
-using ::android::hardware::kSynchronizedReadWrite;
-using ::android::hardware::MessageQueue;
-
-using DataMQ = MessageQueue<uint8_t, kSynchronizedReadWrite>;
-
-class HearingAidAudioProvider : public BluetoothAudioProvider {
- public:
- HearingAidAudioProvider();
-
- bool isValid(const V2_1::SessionType& sessionType) override;
- bool isValid(const V2_0::SessionType& sessionType) override;
-
- Return<void> startSession(const sp<V2_0::IBluetoothAudioPort>& hostIf,
- const V2_0::AudioConfiguration& audioConfig,
- startSession_cb _hidl_cb) override;
-
- private:
- // audio data queue for software encoding
- std::unique_ptr<DataMQ> mDataMQ;
-
- Return<void> onSessionReady(startSession_cb _hidl_cb) override;
-};
-
-} // namespace implementation
-} // namespace V2_2
-} // namespace audio
-} // namespace bluetooth
-} // namespace hardware
-} // namespace android
diff --git a/bluetooth/audio/2.2/default/LeAudioAudioProvider.cpp b/bluetooth/audio/2.2/default/LeAudioAudioProvider.cpp
deleted file mode 100644
index a7a0023..0000000
--- a/bluetooth/audio/2.2/default/LeAudioAudioProvider.cpp
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "BTAudioProviderLeAudio"
-
-#include "LeAudioAudioProvider.h"
-
-#include <android-base/logging.h>
-
-#include "AudioPort_2_0_to_2_2_Wrapper.h"
-#include "BluetoothAudioSessionReport_2_2.h"
-#include "BluetoothAudioSupportedCodecsDB_2_2.h"
-
-namespace android {
-namespace hardware {
-namespace bluetooth {
-namespace audio {
-namespace V2_2 {
-namespace implementation {
-
-using ::android::bluetooth::audio::BluetoothAudioSessionReport_2_2;
-using ::android::hardware::Void;
-using ::android::hardware::bluetooth::audio::V2_0::BitsPerSample;
-using ::android::hardware::bluetooth::audio::V2_0::ChannelMode;
-using ::android::hardware::bluetooth::audio::V2_1::SampleRate;
-
-static constexpr uint32_t kBufferOutCount = 2; // two frame buffer
-static constexpr uint32_t kBufferInCount = 2; // two frame buffer
-
-LeAudioOutputAudioProvider::LeAudioOutputAudioProvider()
- : LeAudioAudioProvider() {
- session_type_ = V2_1::SessionType::LE_AUDIO_SOFTWARE_ENCODING_DATAPATH;
-}
-
-LeAudioInputAudioProvider::LeAudioInputAudioProvider()
- : LeAudioAudioProvider() {
- session_type_ = V2_1::SessionType::LE_AUDIO_SOFTWARE_DECODED_DATAPATH;
-}
-
-LeAudioAudioProvider::LeAudioAudioProvider()
- : BluetoothAudioProvider(), mDataMQ(nullptr) {}
-
-bool LeAudioAudioProvider::isValid(const V2_0::SessionType& sessionType) {
- LOG(ERROR) << __func__ << ", invalid session type for Le Audio provider: "
- << toString(sessionType);
-
- return false;
-}
-
-bool LeAudioAudioProvider::isValid(const V2_1::SessionType& sessionType) {
- return (sessionType == session_type_);
-}
-
-Return<void> LeAudioAudioProvider::startSession_2_1(
- const sp<V2_0::IBluetoothAudioPort>& hostIf,
- const V2_1::AudioConfiguration& audioConfig, startSession_cb _hidl_cb) {
- if (audioConfig.getDiscriminator() !=
- V2_1::AudioConfiguration::hidl_discriminator::pcmConfig) {
- LOG(WARNING) << __func__
- << " - Invalid Audio Configuration=" << toString(audioConfig);
- _hidl_cb(BluetoothAudioStatus::UNSUPPORTED_CODEC_CONFIGURATION,
- DataMQ::Descriptor());
- return Void();
- }
-
- AudioConfiguration audioConfig_2_2;
- audioConfig_2_2.pcmConfig(
- {.sampleRate =
- static_cast<V2_1::SampleRate>(audioConfig.pcmConfig().sampleRate),
- .channelMode = audioConfig.pcmConfig().channelMode,
- .bitsPerSample = audioConfig.pcmConfig().bitsPerSample,
- .dataIntervalUs = 0});
-
- sp<V2_2::IBluetoothAudioPort> hostIf_2_2 =
- new AudioPort_2_0_to_2_2_Wrapper(hostIf);
- return startSession_2_2(hostIf_2_2, audioConfig_2_2, _hidl_cb);
-}
-
-Return<void> LeAudioAudioProvider::startSession_2_2(
- const sp<V2_2::IBluetoothAudioPort>& hostIf,
- const AudioConfiguration& audioConfig, startSession_cb _hidl_cb) {
- /**
- * Initialize the audio platform if audioConfiguration is supported.
- * Save the IBluetoothAudioPort interface, so that it can be used
- * later to send stream control commands to the HAL client, based on
- * interaction with Audio framework.
- */
- if (audioConfig.getDiscriminator() !=
- AudioConfiguration::hidl_discriminator::pcmConfig) {
- LOG(WARNING) << __func__
- << " - Invalid Audio Configuration=" << toString(audioConfig);
- _hidl_cb(BluetoothAudioStatus::UNSUPPORTED_CODEC_CONFIGURATION,
- DataMQ::Descriptor());
- return Void();
- } else if (!android::bluetooth::audio::IsSoftwarePcmConfigurationValid_2_1(
- audioConfig.pcmConfig())) {
- LOG(WARNING) << __func__ << " - Unsupported PCM Configuration="
- << toString(audioConfig.pcmConfig());
- _hidl_cb(BluetoothAudioStatus::UNSUPPORTED_CODEC_CONFIGURATION,
- DataMQ::Descriptor());
- return Void();
- }
-
- uint32_t kDataMqSize = 0;
- switch (audioConfig.pcmConfig().sampleRate) {
- case SampleRate::RATE_8000:
- kDataMqSize = 8000;
- break;
- case SampleRate::RATE_16000:
- kDataMqSize = 16000;
- break;
- case SampleRate::RATE_24000:
- kDataMqSize = 24000;
- break;
- case SampleRate::RATE_32000:
- kDataMqSize = 32000;
- break;
- case SampleRate::RATE_44100:
- kDataMqSize = 44100;
- break;
- case SampleRate::RATE_48000:
- kDataMqSize = 48000;
- break;
- default:
- LOG(WARNING) << __func__ << " - Unsupported sampling frequency="
- << toString(audioConfig.pcmConfig());
- _hidl_cb(BluetoothAudioStatus::UNSUPPORTED_CODEC_CONFIGURATION,
- DataMQ::Descriptor());
- return Void();
- }
-
- /* Number of samples per millisecond */
- kDataMqSize = ceil(kDataMqSize / 1000);
-
- switch (audioConfig.pcmConfig().channelMode) {
- case ChannelMode::MONO:
- break;
- case ChannelMode::STEREO:
- kDataMqSize *= 2;
- break;
- default:
- /* This should never happen it would be caught while validating
- * parameters.
- */
- break;
- }
-
- switch (audioConfig.pcmConfig().bitsPerSample) {
- case BitsPerSample::BITS_16:
- kDataMqSize *= 2;
- break;
- case BitsPerSample::BITS_24:
- kDataMqSize *= 3;
- break;
- case BitsPerSample::BITS_32:
- kDataMqSize *= 4;
- break;
- default:
- /* This should never happen it would be caught while validating
- * parameters.
- */
- break;
- }
-
- if (session_type_ == V2_1::SessionType::LE_AUDIO_SOFTWARE_ENCODING_DATAPATH)
- kDataMqSize *= kBufferOutCount;
- else if (session_type_ ==
- V2_1::SessionType::LE_AUDIO_SOFTWARE_DECODED_DATAPATH)
- kDataMqSize *= kBufferInCount;
- else
- LOG(WARNING) << __func__ << ", default single buffer used";
-
- kDataMqSize *= audioConfig.pcmConfig().dataIntervalUs / 1000;
-
- LOG(INFO) << __func__ << " - size of audio buffer " << kDataMqSize
- << " byte(s)";
-
- std::unique_ptr<DataMQ> tempDataMQ(
- new DataMQ(kDataMqSize, /* EventFlag */ true));
- if (tempDataMQ && tempDataMQ->isValid()) {
- mDataMQ = std::move(tempDataMQ);
- } else {
- ALOGE_IF(!tempDataMQ, "failed to allocate data MQ");
- ALOGE_IF(tempDataMQ && !tempDataMQ->isValid(), "data MQ is invalid");
- _hidl_cb(BluetoothAudioStatus::FAILURE, DataMQ::Descriptor());
- return Void();
- }
-
- return BluetoothAudioProvider::startSession_2_2(hostIf, audioConfig,
- _hidl_cb);
-}
-
-Return<void> LeAudioAudioProvider::onSessionReady(startSession_cb _hidl_cb) {
- if (mDataMQ && mDataMQ->isValid()) {
- BluetoothAudioSessionReport_2_2::OnSessionStarted(
- session_type_, stack_iface_, mDataMQ->getDesc(), audio_config_);
- _hidl_cb(BluetoothAudioStatus::SUCCESS, *mDataMQ->getDesc());
- } else {
- _hidl_cb(BluetoothAudioStatus::FAILURE, DataMQ::Descriptor());
- }
- return Void();
-}
-
-} // namespace implementation
-} // namespace V2_2
-} // namespace audio
-} // namespace bluetooth
-} // namespace hardware
-} // namespace android
diff --git a/bluetooth/audio/2.2/default/LeAudioAudioProvider.h b/bluetooth/audio/2.2/default/LeAudioAudioProvider.h
deleted file mode 100644
index 3de1724..0000000
--- a/bluetooth/audio/2.2/default/LeAudioAudioProvider.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <android/hardware/bluetooth/audio/2.2/types.h>
-#include <fmq/MessageQueue.h>
-#include <hidl/MQDescriptor.h>
-
-#include "BluetoothAudioProvider.h"
-
-namespace android {
-namespace hardware {
-namespace bluetooth {
-namespace audio {
-namespace V2_2 {
-namespace implementation {
-
-using ::android::hardware::kSynchronizedReadWrite;
-using ::android::hardware::MessageQueue;
-
-using DataMQ = MessageQueue<uint8_t, kSynchronizedReadWrite>;
-
-class LeAudioAudioProvider : public BluetoothAudioProvider {
- public:
- LeAudioAudioProvider();
-
- bool isValid(const V2_1::SessionType& sessionType) override;
- bool isValid(const V2_0::SessionType& sessionType) override;
-
- Return<void> startSession_2_1(const sp<V2_0::IBluetoothAudioPort>& hostIf,
- const V2_1::AudioConfiguration& audioConfig,
- startSession_cb _hidl_cb) override;
-
- Return<void> startSession_2_2(const sp<V2_2::IBluetoothAudioPort>& hostIf,
- const AudioConfiguration& audioConfig,
- startSession_cb _hidl_cb) override;
-
- private:
- /** queue for software encodec/decoded audio data */
- std::unique_ptr<DataMQ> mDataMQ;
-
- Return<void> onSessionReady(startSession_cb _hidl_cb) override;
-};
-
-class LeAudioOutputAudioProvider : public LeAudioAudioProvider {
- public:
- LeAudioOutputAudioProvider();
-};
-
-class LeAudioInputAudioProvider : public LeAudioAudioProvider {
- public:
- LeAudioInputAudioProvider();
-};
-
-} // namespace implementation
-} // namespace V2_2
-} // namespace audio
-} // namespace bluetooth
-} // namespace hardware
-} // namespace android
diff --git a/bluetooth/audio/2.2/default/LeAudioOffloadAudioProvider.cpp b/bluetooth/audio/2.2/default/LeAudioOffloadAudioProvider.cpp
deleted file mode 100644
index 2b0c02f..0000000
--- a/bluetooth/audio/2.2/default/LeAudioOffloadAudioProvider.cpp
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "BTAudioProviderLeAudioOffload"
-
-#include "LeAudioOffloadAudioProvider.h"
-
-#include <android-base/logging.h>
-
-#include "AudioPort_2_0_to_2_2_Wrapper.h"
-#include "BluetoothAudioSessionReport_2_2.h"
-#include "BluetoothAudioSupportedCodecsDB_2_2.h"
-
-namespace android {
-namespace hardware {
-namespace bluetooth {
-namespace audio {
-namespace V2_2 {
-namespace implementation {
-
-using ::android::bluetooth::audio::BluetoothAudioSessionReport_2_2;
-using ::android::hardware::Void;
-using ::android::hardware::bluetooth::audio::V2_0::BitsPerSample;
-using ::android::hardware::bluetooth::audio::V2_0::ChannelMode;
-using ::android::hardware::bluetooth::audio::V2_1::SampleRate;
-
-using DataMQ = MessageQueue<uint8_t, kSynchronizedReadWrite>;
-
-LeAudioOffloadOutputAudioProvider::LeAudioOffloadOutputAudioProvider()
- : LeAudioOffloadAudioProvider() {
- session_type_ =
- V2_1::SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH;
-}
-
-LeAudioOffloadInputAudioProvider::LeAudioOffloadInputAudioProvider()
- : LeAudioOffloadAudioProvider() {
- session_type_ =
- V2_1::SessionType::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH;
-}
-
-LeAudioOffloadAudioProvider::LeAudioOffloadAudioProvider()
- : BluetoothAudioProvider() {}
-
-bool LeAudioOffloadAudioProvider::isValid(
- const V2_0::SessionType& sessionType) {
- LOG(ERROR) << __func__
- << ", invalid session type for Offloaded Le Audio provider: "
- << toString(sessionType);
-
- return false;
-}
-
-bool LeAudioOffloadAudioProvider::isValid(
- const V2_1::SessionType& sessionType) {
- return (sessionType == session_type_);
-}
-
-Return<void> LeAudioOffloadAudioProvider::startSession_2_1(
- const sp<V2_0::IBluetoothAudioPort>& hostIf,
- const V2_1::AudioConfiguration& audioConfig, startSession_cb _hidl_cb) {
- if (audioConfig.getDiscriminator() !=
- V2_1::AudioConfiguration::hidl_discriminator::leAudioCodecConfig) {
- LOG(WARNING) << __func__
- << " - Invalid Audio Configuration=" << toString(audioConfig);
- _hidl_cb(BluetoothAudioStatus::UNSUPPORTED_CODEC_CONFIGURATION,
- DataMQ::Descriptor());
- return Void();
- }
-
- AudioConfiguration audioConfig_2_2;
- audioConfig_2_2.leAudioConfig().mode = LeAudioMode::UNKNOWN;
- audioConfig_2_2.leAudioConfig().config.unicastConfig() = {
- .streamMap = {{
- .streamHandle = 0xFFFF,
- .audioChannelAllocation =
- audioConfig.leAudioCodecConfig().audioChannelAllocation,
- }},
- .peerDelay = 0,
- .lc3Config = audioConfig.leAudioCodecConfig().lc3Config};
-
- sp<V2_2::IBluetoothAudioPort> hostIf_2_2 =
- new AudioPort_2_0_to_2_2_Wrapper(hostIf);
- return startSession_2_2(hostIf_2_2, audioConfig_2_2, _hidl_cb);
-}
-
-Return<void> LeAudioOffloadAudioProvider::startSession_2_2(
- const sp<V2_2::IBluetoothAudioPort>& hostIf,
- const AudioConfiguration& audioConfig, startSession_cb _hidl_cb) {
- /**
- * Initialize the audio platform if audioConfiguration is supported.
- * Save the IBluetoothAudioPort interface, so that it can be used
- * later to send stream control commands to the HAL client, based on
- * interaction with Audio framework.
- */
- if (audioConfig.getDiscriminator() !=
- AudioConfiguration::hidl_discriminator::leAudioConfig) {
- LOG(WARNING) << __func__
- << " - Invalid Audio Configuration=" << toString(audioConfig);
- _hidl_cb(BluetoothAudioStatus::UNSUPPORTED_CODEC_CONFIGURATION,
- DataMQ::Descriptor());
- return Void();
- }
-
- if (!android::bluetooth::audio::IsOffloadLeAudioConfigurationValid(
- session_type_, audioConfig.leAudioConfig())) {
- LOG(WARNING) << __func__ << " - Unsupported LC3 Offloaded Configuration="
- << toString(audioConfig.leAudioConfig());
- _hidl_cb(BluetoothAudioStatus::UNSUPPORTED_CODEC_CONFIGURATION,
- DataMQ::Descriptor());
- return Void();
- }
-
- return BluetoothAudioProvider::startSession_2_2(hostIf, audioConfig,
- _hidl_cb);
-}
-
-Return<void> LeAudioOffloadAudioProvider::onSessionReady(
- startSession_cb _hidl_cb) {
- BluetoothAudioSessionReport_2_2::OnSessionStarted(session_type_, stack_iface_,
- nullptr, audio_config_);
- _hidl_cb(BluetoothAudioStatus::SUCCESS, DataMQ::Descriptor());
- return Void();
-}
-
-} // namespace implementation
-} // namespace V2_2
-} // namespace audio
-} // namespace bluetooth
-} // namespace hardware
-} // namespace android
diff --git a/bluetooth/audio/2.2/default/LeAudioOffloadAudioProvider.h b/bluetooth/audio/2.2/default/LeAudioOffloadAudioProvider.h
deleted file mode 100644
index fe58de5..0000000
--- a/bluetooth/audio/2.2/default/LeAudioOffloadAudioProvider.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <android/hardware/bluetooth/audio/2.2/types.h>
-
-#include "BluetoothAudioProvider.h"
-
-namespace android {
-namespace hardware {
-namespace bluetooth {
-namespace audio {
-namespace V2_2 {
-namespace implementation {
-
-class LeAudioOffloadAudioProvider : public BluetoothAudioProvider {
- public:
- LeAudioOffloadAudioProvider();
-
- bool isValid(const V2_1::SessionType& sessionType) override;
- bool isValid(const V2_0::SessionType& sessionType) override;
-
- Return<void> startSession_2_1(const sp<V2_0::IBluetoothAudioPort>& hostIf,
- const V2_1::AudioConfiguration& audioConfig,
- startSession_cb _hidl_cb) override;
-
- Return<void> startSession_2_2(const sp<V2_2::IBluetoothAudioPort>& hostIf,
- const AudioConfiguration& audioConfig,
- startSession_cb _hidl_cb) override;
-
- private:
- Return<void> onSessionReady(startSession_cb _hidl_cb) override;
-};
-
-class LeAudioOffloadOutputAudioProvider : public LeAudioOffloadAudioProvider {
- public:
- LeAudioOffloadOutputAudioProvider();
-};
-
-class LeAudioOffloadInputAudioProvider : public LeAudioOffloadAudioProvider {
- public:
- LeAudioOffloadInputAudioProvider();
-};
-
-} // namespace implementation
-} // namespace V2_2
-} // namespace audio
-} // namespace bluetooth
-} // namespace hardware
-} // namespace android
diff --git a/bluetooth/audio/2.2/default/OWNERS b/bluetooth/audio/2.2/default/OWNERS
deleted file mode 100644
index 17ea464..0000000
--- a/bluetooth/audio/2.2/default/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-include platform/packages/modules/Bluetooth:/OWNERS
-
-cheneyni@google.com
-aliceypkuo@google.com
\ No newline at end of file
diff --git a/bluetooth/audio/2.2/types.hal b/bluetooth/audio/2.2/types.hal
deleted file mode 100644
index 6755899..0000000
--- a/bluetooth/audio/2.2/types.hal
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.hardware.bluetooth.audio@2.2;
-
-import @2.1::Lc3Parameters;
-import @2.1::PcmParameters;
-import @2.0::CodecConfiguration;
-import @2.0::CodecCapabilities;
-import @2.1::CodecType;
-
-enum LeAudioMode : uint8_t {
- UNKNOWN = 0x00,
- UNICAST = 0x01,
- BROADCAST = 0x02,
-};
-
-enum AudioLocation : uint8_t {
- UNKNOWN = 0,
- FRONT_LEFT = 1,
- FRONT_RIGHT = 2,
-};
-
-struct UnicastStreamMap {
- /* The connection handle used for a unicast or a broadcast group. */
- uint16_t streamHandle;
- /* Audio channel allocation is a bit field, each enabled bit means that given audio direction,
- * i.e. "left", or "right" is used. Ordering of audio channels comes from the least significant
- * bit to the most significant bit. */
- uint32_t audioChannelAllocation;
-};
-
-struct BroadcastStreamMap {
- /* The connection handle used for a unicast or a broadcast group. */
- uint16_t streamHandle;
- /* Audio channel allocation is a bit field, each enabled bit means that given audio direction,
- * i.e. "left", or "right" is used. Ordering of audio channels comes from the least significant
- * bit to the most significant bit. */
- uint32_t audioChannelAllocation;
- Lc3Parameters lc3Config;
-};
-
-struct UnicastConfig {
- vec<UnicastStreamMap> streamMap;
- uint32_t peerDelay;
- Lc3Parameters lc3Config;
-};
-
-struct BroadcastConfig {
- vec<BroadcastStreamMap> streamMap;
-};
-
-struct LeAudioConfiguration {
- /* The mode of the LE audio */
- LeAudioMode mode;
- safe_union CodecConfig {
- UnicastConfig unicastConfig;
- BroadcastConfig broadcastConfig;
- } config;
-};
-
-/** Used to configure either a Hardware or Software Encoding session based on session type */
-safe_union AudioConfiguration {
- PcmParameters pcmConfig;
- CodecConfiguration codecConfig;
- LeAudioConfiguration leAudioConfig;
-};
-
-/** Used to specify the capabilities of the different session types */
-safe_union AudioCapabilities {
- PcmParameters pcmCapabilities;
- CodecCapabilities codecCapabilities;
- LeAudioCodecCapabilitiesSetting leAudioCapabilities;
-};
-
-/**
- * Used to specify the le audio capabilities for unicast and broadcast hardware offload.
- */
-struct LeAudioCodecCapabilitiesSetting{
- UnicastCapability unicastEncodeCapability;
- UnicastCapability unicastDecodeCapability;
- BroadcastCapability broadcastCapability;
-};
-
-/**
- * Used to specify the le audio unicast codec capabilities for hardware offload.
- */
-struct UnicastCapability {
- 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;
-};
-
-/**
- * Used to specify the le audio broadcast codec capabilities for hardware offload.
- */
-struct BroadcastCapability {
- CodecType codecType;
- AudioLocation supportedChannel;
-
- // Supported channel count for each stream
- uint8_t channelCountPerStream;
-
- // Should use safe union when there is more than one codec
- vec<Lc3Parameters> capabilities;
-};
diff --git a/bluetooth/audio/utils/Android.bp b/bluetooth/audio/utils/Android.bp
index 974357e..42f9455 100644
--- a/bluetooth/audio/utils/Android.bp
+++ b/bluetooth/audio/utils/Android.bp
@@ -14,10 +14,8 @@
srcs: [
"session/BluetoothAudioSession.cpp",
"session/BluetoothAudioSession_2_1.cpp",
- "session/BluetoothAudioSession_2_2.cpp",
"session/BluetoothAudioSupportedCodecsDB.cpp",
"session/BluetoothAudioSupportedCodecsDB_2_1.cpp",
- "session/BluetoothAudioSupportedCodecsDB_2_2.cpp",
],
export_include_dirs: ["session/"],
header_libs: ["libhardware_headers"],
@@ -25,7 +23,6 @@
"android.hardware.audio.common@5.0",
"android.hardware.bluetooth.audio@2.0",
"android.hardware.bluetooth.audio@2.1",
- "android.hardware.bluetooth.audio@2.2",
"libbase",
"libcutils",
"libfmq",
@@ -49,7 +46,6 @@
shared_libs: [
"android.hardware.bluetooth.audio@2.0",
"android.hardware.bluetooth.audio@2.1",
- "android.hardware.bluetooth.audio@2.2",
"libbase",
"libcutils",
"libbinder_ndk",
diff --git a/bluetooth/audio/utils/aidl_session/HidlToAidlMiddleware.cpp b/bluetooth/audio/utils/aidl_session/HidlToAidlMiddleware.cpp
index 1ef9365..a4664f1 100644
--- a/bluetooth/audio/utils/aidl_session/HidlToAidlMiddleware.cpp
+++ b/bluetooth/audio/utils/aidl_session/HidlToAidlMiddleware.cpp
@@ -28,7 +28,6 @@
#include "../aidl_session/BluetoothAudioSessionControl.h"
#include "HidlToAidlMiddleware_2_0.h"
#include "HidlToAidlMiddleware_2_1.h"
-#include "HidlToAidlMiddleware_2_2.h"
namespace aidl {
namespace android {
@@ -82,15 +81,10 @@
using Lc3FrameDuration_2_1 =
::android::hardware::bluetooth::audio::V2_1::Lc3FrameDuration;
-using LeAudioConfig_2_2 =
- ::android::hardware::bluetooth::audio::V2_2::LeAudioConfiguration;
-using LeAudioMode_2_2 =
- ::android::hardware::bluetooth::audio::V2_2::LeAudioMode;
-
std::mutex legacy_callback_lock;
std::unordered_map<
SessionType,
- std::unordered_map<uint16_t, std::shared_ptr<PortStatusCallbacks_2_2>>>
+ std::unordered_map<uint16_t, std::shared_ptr<PortStatusCallbacks_2_0>>>
legacy_callback_table;
const static std::unordered_map<SessionType_2_1, SessionType>
@@ -461,50 +455,6 @@
return hidl_lc3_codec_config;
}
-inline LeAudioConfig_2_2 to_hidl_leaudio_config_2_2(
- const LeAudioConfiguration& unicast_config) {
- LeAudioConfig_2_2 hidl_leaudio_config;
- hidl_leaudio_config.mode = LeAudioMode_2_2::UNICAST;
- ::android::hardware::bluetooth::audio::V2_2::UnicastConfig
- hidl_unicast_config;
- hidl_unicast_config.peerDelay =
- static_cast<uint32_t>(unicast_config.peerDelayUs / 1000);
-
- auto& lc3_config = unicast_config.leAudioCodecConfig
- .get<LeAudioCodecConfiguration::lc3Config>();
- hidl_unicast_config.lc3Config = to_hidl_lc3_config_2_1(lc3_config);
-
- hidl_unicast_config.streamMap.resize(unicast_config.streamMap.size());
- for (int i = 0; i < unicast_config.streamMap.size(); i++) {
- hidl_unicast_config.streamMap[i].audioChannelAllocation =
- static_cast<uint32_t>(
- unicast_config.streamMap[i].audioChannelAllocation);
- hidl_unicast_config.streamMap[i].streamHandle =
- static_cast<uint16_t>(unicast_config.streamMap[i].streamHandle);
- }
- return hidl_leaudio_config;
-}
-
-inline LeAudioConfig_2_2 to_hidl_leaudio_broadcast_config_2_2(
- const LeAudioBroadcastConfiguration& broadcast_config) {
- LeAudioConfig_2_2 hidl_leaudio_config;
- hidl_leaudio_config.mode = LeAudioMode_2_2::BROADCAST;
- ::android::hardware::bluetooth::audio::V2_2::BroadcastConfig
- hidl_bcast_config;
- hidl_bcast_config.streamMap.resize(broadcast_config.streamMap.size());
- for (int i = 0; i < broadcast_config.streamMap.size(); i++) {
- hidl_bcast_config.streamMap[i].audioChannelAllocation =
- static_cast<uint32_t>(
- broadcast_config.streamMap[i].audioChannelAllocation);
- hidl_bcast_config.streamMap[i].streamHandle =
- static_cast<uint16_t>(broadcast_config.streamMap[i].streamHandle);
- hidl_bcast_config.streamMap[i].lc3Config = to_hidl_lc3_config_2_1(
- broadcast_config.streamMap[i]
- .leAudioCodecConfig.get<LeAudioCodecConfiguration::lc3Config>());
- }
- return hidl_leaudio_config;
-}
-
inline AudioConfig_2_1 to_hidl_audio_config_2_1(
const AudioConfiguration& audio_config) {
AudioConfig_2_1 hidl_audio_config;
@@ -529,30 +479,6 @@
return hidl_audio_config;
}
-inline AudioConfig_2_2 to_hidl_audio_config_2_2(
- const AudioConfiguration& audio_config) {
- AudioConfig_2_2 hidl_audio_config;
- switch (audio_config.getTag()) {
- case AudioConfiguration::pcmConfig:
- hidl_audio_config.pcmConfig(to_hidl_pcm_config_2_1(
- audio_config.get<AudioConfiguration::pcmConfig>()));
- break;
- case AudioConfiguration::a2dpConfig:
- hidl_audio_config.codecConfig(to_hidl_codec_config_2_0(
- audio_config.get<AudioConfiguration::a2dpConfig>()));
- break;
- case AudioConfiguration::leAudioConfig:
- hidl_audio_config.leAudioConfig(to_hidl_leaudio_config_2_2(
- audio_config.get<AudioConfiguration::leAudioConfig>()));
- break;
- case AudioConfiguration::leAudioBroadcastConfig:
- hidl_audio_config.leAudioConfig(to_hidl_leaudio_broadcast_config_2_2(
- audio_config.get<AudioConfiguration::leAudioBroadcastConfig>()));
- break;
- }
- return hidl_audio_config;
-}
-
/***
*
* 2.0
@@ -568,18 +494,58 @@
uint16_t HidlToAidlMiddleware_2_0::RegisterControlResultCback(
const SessionType_2_0& session_type,
const PortStatusCallbacks_2_0& cbacks) {
- PortStatusCallbacks_2_2 callback_2_2{
- .control_result_cb_ = cbacks.control_result_cb_,
- .session_changed_cb_ = cbacks.session_changed_cb_,
+ LOG(INFO) << __func__ << ": " << toString(session_type);
+ auto aidl_session_type = from_session_type_2_0(session_type);
+ // Pass the exact reference to the lambda
+ auto& session_legacy_callback_table =
+ legacy_callback_table[aidl_session_type];
+ PortStatusCallbacks aidl_callbacks{};
+ if (cbacks.control_result_cb_) {
+ aidl_callbacks.control_result_cb_ =
+ [&session_legacy_callback_table](uint16_t cookie, bool start_resp,
+ const BluetoothAudioStatus& status) {
+ if (session_legacy_callback_table.find(cookie) ==
+ session_legacy_callback_table.end()) {
+ LOG(ERROR) << __func__ << ": Unknown callback invoked!";
+ return;
+ }
+ auto& cback = session_legacy_callback_table[cookie];
+ cback->control_result_cb_(cookie, start_resp, to_hidl_status(status));
+ };
+ }
+ if (cbacks.session_changed_cb_) {
+ aidl_callbacks.session_changed_cb_ =
+ [&session_legacy_callback_table](uint16_t cookie) {
+ if (session_legacy_callback_table.find(cookie) ==
+ session_legacy_callback_table.end()) {
+ LOG(ERROR) << __func__ << ": Unknown callback invoked!";
+ return;
+ }
+ auto& cback = session_legacy_callback_table[cookie];
+ cback->session_changed_cb_(cookie);
+ };
};
- return HidlToAidlMiddleware_2_2::RegisterControlResultCback(
- static_cast<SessionType_2_1>(session_type), callback_2_2);
+ auto cookie = BluetoothAudioSessionControl::RegisterControlResultCback(
+ aidl_session_type, aidl_callbacks);
+ {
+ std::lock_guard<std::mutex> guard(legacy_callback_lock);
+ session_legacy_callback_table[cookie] =
+ std::make_shared<PortStatusCallbacks_2_0>(cbacks);
+ }
+ return cookie;
}
void HidlToAidlMiddleware_2_0::UnregisterControlResultCback(
const SessionType_2_0& session_type, uint16_t cookie) {
- HidlToAidlMiddleware_2_2::UnregisterControlResultCback(
- static_cast<SessionType_2_1>(session_type), cookie);
+ LOG(INFO) << __func__ << ": " << toString(session_type);
+ auto aidl_session_type = from_session_type_2_0(session_type);
+ BluetoothAudioSessionControl::UnregisterControlResultCback(aidl_session_type,
+ cookie);
+ auto& session_callback_table = legacy_callback_table[aidl_session_type];
+ if (session_callback_table.find(cookie) != session_callback_table.end()) {
+ std::lock_guard<std::mutex> guard(legacy_callback_lock);
+ session_callback_table.erase(cookie);
+ }
}
const AudioConfig_2_0 HidlToAidlMiddleware_2_0::GetAudioConfig(
@@ -659,124 +625,6 @@
from_session_type_2_1(session_type)));
}
-/***
- *
- * 2.2
- *
- ***/
-
-bool HidlToAidlMiddleware_2_2::IsSessionReady(
- const SessionType_2_1& session_type) {
- return BluetoothAudioSessionControl::IsSessionReady(
- from_session_type_2_1(session_type));
-}
-
-uint16_t HidlToAidlMiddleware_2_2::RegisterControlResultCback(
- const SessionType_2_1& session_type,
- const PortStatusCallbacks_2_2& cbacks) {
- LOG(INFO) << __func__ << ": " << toString(session_type);
- auto aidl_session_type = from_session_type_2_1(session_type);
- // Pass the exact reference to the lambda
- auto& session_legacy_callback_table =
- legacy_callback_table[aidl_session_type];
- PortStatusCallbacks aidl_callbacks{};
- if (cbacks.control_result_cb_) {
- aidl_callbacks.control_result_cb_ =
- [&session_legacy_callback_table](uint16_t cookie, bool start_resp,
- const BluetoothAudioStatus& status) {
- if (session_legacy_callback_table.find(cookie) ==
- session_legacy_callback_table.end()) {
- LOG(ERROR) << __func__ << ": Unknown callback invoked!";
- return;
- }
- auto& cback = session_legacy_callback_table[cookie];
- cback->control_result_cb_(cookie, start_resp, to_hidl_status(status));
- };
- }
- if (cbacks.session_changed_cb_) {
- aidl_callbacks.session_changed_cb_ =
- [&session_legacy_callback_table](uint16_t cookie) {
- if (session_legacy_callback_table.find(cookie) ==
- session_legacy_callback_table.end()) {
- LOG(ERROR) << __func__ << ": Unknown callback invoked!";
- return;
- }
- auto& cback = session_legacy_callback_table[cookie];
- cback->session_changed_cb_(cookie);
- };
- };
- if (cbacks.audio_configuration_changed_cb_) {
- aidl_callbacks.audio_configuration_changed_cb_ =
- [&session_legacy_callback_table](uint16_t cookie) {
- if (session_legacy_callback_table.find(cookie) ==
- session_legacy_callback_table.end()) {
- LOG(ERROR) << __func__ << ": Unknown callback invoked!";
- return;
- }
- auto& cback = session_legacy_callback_table[cookie];
- cback->audio_configuration_changed_cb_(cookie);
- };
- };
- auto cookie = BluetoothAudioSessionControl::RegisterControlResultCback(
- aidl_session_type, aidl_callbacks);
- {
- std::lock_guard<std::mutex> guard(legacy_callback_lock);
- session_legacy_callback_table[cookie] =
- std::make_shared<PortStatusCallbacks_2_2>(cbacks);
- }
- return cookie;
-}
-
-void HidlToAidlMiddleware_2_2::UnregisterControlResultCback(
- const SessionType_2_1& session_type, uint16_t cookie) {
- LOG(INFO) << __func__ << ": " << toString(session_type);
- auto aidl_session_type = from_session_type_2_1(session_type);
- BluetoothAudioSessionControl::UnregisterControlResultCback(aidl_session_type,
- cookie);
- auto& session_callback_table = legacy_callback_table[aidl_session_type];
- if (session_callback_table.find(cookie) != session_callback_table.end()) {
- std::lock_guard<std::mutex> guard(legacy_callback_lock);
- session_callback_table.erase(cookie);
- }
-}
-
-const AudioConfig_2_2 HidlToAidlMiddleware_2_2::GetAudioConfig(
- const SessionType_2_1& session_type) {
- return to_hidl_audio_config_2_2(BluetoothAudioSessionControl::GetAudioConfig(
- from_session_type_2_1(session_type)));
-}
-
-bool HidlToAidlMiddleware_2_2::StartStream(
- const SessionType_2_1& session_type) {
- return BluetoothAudioSessionControl::StartStream(
- from_session_type_2_1(session_type));
-}
-
-bool HidlToAidlMiddleware_2_2::SuspendStream(
- const SessionType_2_1& session_type) {
- return BluetoothAudioSessionControl::SuspendStream(
- from_session_type_2_1(session_type));
-}
-
-void HidlToAidlMiddleware_2_2::StopStream(const SessionType_2_1& session_type) {
- return BluetoothAudioSessionControl::StopStream(
- from_session_type_2_1(session_type));
-}
-
-void HidlToAidlMiddleware_2_2::UpdateTracksMetadata(
- const SessionType_2_1& session_type,
- const struct source_metadata* source_metadata) {
- return BluetoothAudioSessionControl::UpdateSourceMetadata(
- from_session_type_2_1(session_type), *source_metadata);
-}
-
-void HidlToAidlMiddleware_2_2::UpdateSinkMetadata(
- const SessionType_2_1& session_type,
- const struct sink_metadata* sink_metadata) {
- return BluetoothAudioSessionControl::UpdateSinkMetadata(
- from_session_type_2_1(session_type), *sink_metadata);
-}
-
} // namespace audio
} // namespace bluetooth
} // namespace hardware
diff --git a/bluetooth/audio/utils/aidl_session/HidlToAidlMiddleware_2_2.h b/bluetooth/audio/utils/aidl_session/HidlToAidlMiddleware_2_2.h
deleted file mode 100644
index f6c3e5c..0000000
--- a/bluetooth/audio/utils/aidl_session/HidlToAidlMiddleware_2_2.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <android/hardware/bluetooth/audio/2.2/types.h>
-
-#include "../session/BluetoothAudioSession.h"
-#include "../session/BluetoothAudioSession_2_2.h"
-
-namespace aidl {
-namespace android {
-namespace hardware {
-namespace bluetooth {
-namespace audio {
-
-using SessionType_2_1 =
- ::android::hardware::bluetooth::audio::V2_1::SessionType;
-using PortStatusCallbacks_2_0 =
- ::android::bluetooth::audio::PortStatusCallbacks;
-using PortStatusCallbacks_2_2 =
- ::android::bluetooth::audio::PortStatusCallbacks_2_2;
-using AudioConfig_2_2 =
- ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration;
-
-class HidlToAidlMiddleware_2_2 {
- public:
- static bool IsSessionReady(const SessionType_2_1& session_type);
-
- static uint16_t RegisterControlResultCback(
- const SessionType_2_1& session_type,
- const PortStatusCallbacks_2_2& cbacks);
-
- static void UnregisterControlResultCback(const SessionType_2_1& session_type,
- uint16_t cookie);
-
- static const AudioConfig_2_2 GetAudioConfig(
- const SessionType_2_1& session_type);
-
- static bool StartStream(const SessionType_2_1& session_type);
-
- static bool SuspendStream(const SessionType_2_1& session_type);
-
- static void StopStream(const SessionType_2_1& session_type);
-
- static void UpdateTracksMetadata(
- const SessionType_2_1& session_type,
- const struct source_metadata* source_metadata);
-
- static void UpdateSinkMetadata(const SessionType_2_1& session_type,
- const struct sink_metadata* sink_metadata);
-};
-
-} // namespace audio
-} // namespace bluetooth
-} // namespace hardware
-} // namespace android
-} // namespace aidl
diff --git a/bluetooth/audio/utils/session/BluetoothAudioSessionControl_2_2.h b/bluetooth/audio/utils/session/BluetoothAudioSessionControl_2_2.h
deleted file mode 100644
index c270ef0..0000000
--- a/bluetooth/audio/utils/session/BluetoothAudioSessionControl_2_2.h
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include "BluetoothAudioSession_2_2.h"
-
-namespace android {
-namespace bluetooth {
-namespace audio {
-
-class BluetoothAudioSessionControl_2_2 {
- using SessionType_2_1 =
- ::android::hardware::bluetooth::audio::V2_1::SessionType;
- using AudioConfiguration_2_2 =
- ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration;
-
- public:
- // The control API helps to check if session is ready or not
- // @return: true if the Bluetooth stack has started th specified session
- static bool IsSessionReady(const SessionType_2_1& session_type) {
- std::shared_ptr<BluetoothAudioSession_2_2> session_ptr =
- BluetoothAudioSessionInstance_2_2::GetSessionInstance(session_type);
- if (session_ptr != nullptr) {
- return session_ptr->IsSessionReady();
- }
- return false;
- }
-
- // The control API helps the bluetooth_audio module to register
- // PortStatusCallbacks
- // @return: cookie - the assigned number to this bluetooth_audio output
- static uint16_t RegisterControlResultCback(
- const SessionType_2_1& session_type, const PortStatusCallbacks& cbacks) {
- std::shared_ptr<BluetoothAudioSession_2_2> session_ptr =
- BluetoothAudioSessionInstance_2_2::GetSessionInstance(session_type);
- if (session_ptr != nullptr) {
- PortStatusCallbacks_2_2 cb = {
- .control_result_cb_ = cbacks.control_result_cb_,
- .session_changed_cb_ = cbacks.session_changed_cb_,
- .audio_configuration_changed_cb_ = nullptr};
- return session_ptr->RegisterStatusCback(cb);
- }
- return kObserversCookieUndefined;
- }
-
- // The control API helps the bluetooth_audio module to register
- // PortStatusCallbacks_2_2
- // @return: cookie - the assigned number to this bluetooth_audio output
- static uint16_t RegisterControlResultCback(
- const SessionType_2_1& session_type,
- const PortStatusCallbacks_2_2& cbacks) {
- std::shared_ptr<BluetoothAudioSession_2_2> session_ptr =
- BluetoothAudioSessionInstance_2_2::GetSessionInstance(session_type);
- if (session_ptr != nullptr) {
- return session_ptr->RegisterStatusCback(cbacks);
- }
- return kObserversCookieUndefined;
- }
-
- // The control API helps the bluetooth_audio module to unregister
- // PortStatusCallbacks and PortStatusCallbacks_2_2
- // @param: cookie - indicates which bluetooth_audio output is
- static void UnregisterControlResultCback(const SessionType_2_1& session_type,
- uint16_t cookie) {
- std::shared_ptr<BluetoothAudioSession_2_2> session_ptr =
- BluetoothAudioSessionInstance_2_2::GetSessionInstance(session_type);
- if (session_ptr != nullptr) {
- session_ptr->UnregisterStatusCback(cookie);
- }
- }
-
- // The control API for the bluetooth_audio module to get current
- // AudioConfiguration
- static const AudioConfiguration_2_2 GetAudioConfig(
- const SessionType_2_1& session_type) {
- std::shared_ptr<BluetoothAudioSession_2_2> session_ptr =
- BluetoothAudioSessionInstance_2_2::GetSessionInstance(session_type);
- if (session_ptr != nullptr) {
- return session_ptr->GetAudioConfig();
- } 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;
- }
- }
-
- // Those control APIs for the bluetooth_audio module to start / suspend / stop
- // stream, to check position, and to update metadata.
- static bool StartStream(const SessionType_2_1& session_type) {
- std::shared_ptr<BluetoothAudioSession_2_2> session_ptr =
- BluetoothAudioSessionInstance_2_2::GetSessionInstance(session_type);
- if (session_ptr != nullptr) {
- return session_ptr->StartStream();
- }
- return false;
- }
-
- static bool SuspendStream(const SessionType_2_1& session_type) {
- std::shared_ptr<BluetoothAudioSession_2_2> session_ptr =
- BluetoothAudioSessionInstance_2_2::GetSessionInstance(session_type);
- if (session_ptr != nullptr) {
- return session_ptr->SuspendStream();
- }
- return false;
- }
-
- static void StopStream(const SessionType_2_1& session_type) {
- std::shared_ptr<BluetoothAudioSession_2_2> session_ptr =
- BluetoothAudioSessionInstance_2_2::GetSessionInstance(session_type);
- if (session_ptr != nullptr) {
- session_ptr->StopStream();
- }
- }
-
- static bool GetPresentationPosition(const SessionType_2_1& session_type,
- uint64_t* remote_delay_report_ns,
- uint64_t* total_bytes_readed,
- timespec* data_position) {
- std::shared_ptr<BluetoothAudioSession_2_2> session_ptr =
- BluetoothAudioSessionInstance_2_2::GetSessionInstance(session_type);
- if (session_ptr != nullptr) {
- return session_ptr->GetAudioSession()->GetPresentationPosition(
- remote_delay_report_ns, total_bytes_readed, data_position);
- }
- return false;
- }
-
- static void UpdateTracksMetadata(
- const SessionType_2_1& session_type,
- const struct source_metadata* source_metadata) {
- std::shared_ptr<BluetoothAudioSession_2_2> session_ptr =
- BluetoothAudioSessionInstance_2_2::GetSessionInstance(session_type);
- if (session_ptr != nullptr) {
- session_ptr->UpdateTracksMetadata(source_metadata);
- }
- }
-
- static void UpdateSinkMetadata(const SessionType_2_1& session_type,
- const struct sink_metadata* sink_metadata) {
- std::shared_ptr<BluetoothAudioSession_2_2> session_ptr =
- BluetoothAudioSessionInstance_2_2::GetSessionInstance(session_type);
- if (session_ptr != nullptr) {
- session_ptr->UpdateSinkMetadata(sink_metadata);
- }
- }
-
- // The control API writes stream to FMQ
- static size_t OutWritePcmData(const SessionType_2_1& session_type,
- const void* buffer, size_t bytes) {
- std::shared_ptr<BluetoothAudioSession_2_2> session_ptr =
- BluetoothAudioSessionInstance_2_2::GetSessionInstance(session_type);
- if (session_ptr != nullptr) {
- return session_ptr->GetAudioSession()->OutWritePcmData(buffer, bytes);
- }
- return 0;
- }
-
- // The control API reads stream from FMQ
- static size_t InReadPcmData(const SessionType_2_1& session_type, void* buffer,
- size_t bytes) {
- std::shared_ptr<BluetoothAudioSession_2_2> session_ptr =
- BluetoothAudioSessionInstance_2_2::GetSessionInstance(session_type);
- if (session_ptr != nullptr) {
- return session_ptr->GetAudioSession()->InReadPcmData(buffer, bytes);
- }
- return 0;
- }
-};
-
-} // namespace audio
-} // namespace bluetooth
-} // namespace android
diff --git a/bluetooth/audio/utils/session/BluetoothAudioSessionReport_2_2.h b/bluetooth/audio/utils/session/BluetoothAudioSessionReport_2_2.h
deleted file mode 100644
index 17e140e..0000000
--- a/bluetooth/audio/utils/session/BluetoothAudioSessionReport_2_2.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include "BluetoothAudioSession_2_2.h"
-
-namespace android {
-namespace bluetooth {
-namespace audio {
-
-class BluetoothAudioSessionReport_2_2 {
- public:
- // The API reports the Bluetooth stack has started the session, and will
- // inform registered bluetooth_audio outputs
- static void OnSessionStarted(
- const ::android::hardware::bluetooth::audio::V2_1::SessionType&
- session_type,
- const sp<IBluetoothAudioPort> host_iface,
- const DataMQ::Descriptor* dataMQ,
- const ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration&
- audio_config) {
- std::shared_ptr<BluetoothAudioSession_2_2> session_ptr =
- BluetoothAudioSessionInstance_2_2::GetSessionInstance(session_type);
- if (session_ptr != nullptr) {
- session_ptr->OnSessionStarted(host_iface, dataMQ, audio_config);
- }
- }
-
- // The API reports the Bluetooth stack has ended the session, and will
- // inform registered bluetooth_audio outputs
- static void OnSessionEnded(
- const ::android::hardware::bluetooth::audio::V2_1::SessionType&
- session_type) {
- std::shared_ptr<BluetoothAudioSession_2_2> session_ptr =
- BluetoothAudioSessionInstance_2_2::GetSessionInstance(session_type);
- if (session_ptr != nullptr) {
- session_ptr->OnSessionEnded();
- }
- }
- // The API reports the Bluetooth stack has replied the result of startStream
- // or suspendStream, and will inform registered bluetooth_audio outputs
- static void ReportControlStatus(
- const ::android::hardware::bluetooth::audio::V2_1::SessionType&
- session_type,
- const bool& start_resp, const BluetoothAudioStatus& status) {
- std::shared_ptr<BluetoothAudioSession_2_2> session_ptr =
- BluetoothAudioSessionInstance_2_2::GetSessionInstance(session_type);
- if (session_ptr != nullptr) {
- session_ptr->ReportControlStatus(start_resp, status);
- }
- }
- // The API reports the Bluetooth stack has replied the changed of the audio
- // configuration, and will inform registered bluetooth_audio outputs
- static void ReportAudioConfigChanged(
- const ::android::hardware::bluetooth::audio::V2_1::SessionType&
- session_type,
- const ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration&
- audio_config) {
- std::shared_ptr<BluetoothAudioSession_2_2> session_ptr =
- BluetoothAudioSessionInstance_2_2::GetSessionInstance(session_type);
- if (session_ptr != nullptr) {
- session_ptr->ReportAudioConfigChanged(audio_config);
- }
- }
-};
-
-} // namespace audio
-} // namespace bluetooth
-} // namespace android
diff --git a/bluetooth/audio/utils/session/BluetoothAudioSession_2_2.cpp b/bluetooth/audio/utils/session/BluetoothAudioSession_2_2.cpp
deleted file mode 100644
index ceb0662..0000000
--- a/bluetooth/audio/utils/session/BluetoothAudioSession_2_2.cpp
+++ /dev/null
@@ -1,636 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "BTAudioProviderSession_2_2"
-
-#include "BluetoothAudioSession_2_2.h"
-
-#include <android-base/logging.h>
-#include <android-base/stringprintf.h>
-#include <android/hardware/bluetooth/audio/2.2/IBluetoothAudioPort.h>
-
-#include "../aidl_session/HidlToAidlMiddleware_2_0.h"
-#include "../aidl_session/HidlToAidlMiddleware_2_2.h"
-
-namespace android {
-namespace bluetooth {
-namespace audio {
-
-using ::aidl::android::hardware::bluetooth::audio::HidlToAidlMiddleware_2_0;
-using ::aidl::android::hardware::bluetooth::audio::HidlToAidlMiddleware_2_2;
-using ::android::hardware::audio::common::V5_0::AudioContentType;
-using ::android::hardware::audio::common::V5_0::AudioSource;
-using ::android::hardware::audio::common::V5_0::AudioUsage;
-using ::android::hardware::audio::common::V5_0::PlaybackTrackMetadata;
-using ::android::hardware::audio::common::V5_0::RecordTrackMetadata;
-using ::android::hardware::audio::common::V5_0::SinkMetadata;
-using ::android::hardware::audio::common::V5_0::SourceMetadata;
-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;
-using SessionType_2_0 =
- ::android::hardware::bluetooth::audio::V2_0::SessionType;
-
-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;
-
-namespace {
-bool is_2_0_session_type(
- const ::android::hardware::bluetooth::audio::V2_1::SessionType&
- session_type) {
- if (session_type == SessionType_2_1::A2DP_SOFTWARE_ENCODING_DATAPATH ||
- session_type == SessionType_2_1::A2DP_HARDWARE_OFFLOAD_DATAPATH ||
- session_type == SessionType_2_1::HEARING_AID_SOFTWARE_ENCODING_DATAPATH) {
- return true;
- } else {
- return false;
- }
-}
-} // namespace
-
-BluetoothAudioSession_2_2::BluetoothAudioSession_2_2(
- const ::android::hardware::bluetooth::audio::V2_1::SessionType&
- session_type)
- : audio_session(BluetoothAudioSessionInstance::GetSessionInstance(
- static_cast<SessionType_2_0>(session_type))),
- audio_session_2_1(
- BluetoothAudioSessionInstance_2_1::GetSessionInstance(session_type)) {
- if (is_2_0_session_type(session_type)) {
- session_type_2_1_ = (SessionType_2_1::UNKNOWN);
- } else {
- session_type_2_1_ = (session_type);
- }
- raw_session_type_ = session_type;
- invalidSoftwareAudioConfiguration.pcmConfig(kInvalidPcmParameters);
- invalidOffloadAudioConfiguration.codecConfig(
- audio_session->kInvalidCodecConfiguration);
- invalidLeOffloadAudioConfiguration.leAudioConfig(kInvalidLeAudioConfig);
-}
-
-bool BluetoothAudioSession_2_2::IsSessionReady() {
- if (HidlToAidlMiddleware_2_0::IsAidlAvailable())
- return HidlToAidlMiddleware_2_2::IsSessionReady(raw_session_type_);
- if (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) {
- return audio_session->IsSessionReady();
- }
-
- std::lock_guard<std::recursive_mutex> guard(audio_session->mutex_);
- return audio_session->stack_iface_ != nullptr;
-}
-
-std::shared_ptr<BluetoothAudioSession>
-BluetoothAudioSession_2_2::GetAudioSession() {
- return audio_session;
-}
-std::shared_ptr<BluetoothAudioSession_2_1>
-BluetoothAudioSession_2_2::GetAudioSession_2_1() {
- return audio_session_2_1;
-}
-
-void BluetoothAudioSession_2_2::UpdateTracksMetadata(
- const struct source_metadata* source_metadata) {
- if (HidlToAidlMiddleware_2_0::IsAidlAvailable())
- return HidlToAidlMiddleware_2_2::UpdateTracksMetadata(raw_session_type_,
- source_metadata);
- std::lock_guard<std::recursive_mutex> guard(audio_session->mutex_);
- if (!IsSessionReady()) {
- LOG(DEBUG) << __func__ << " - SessionType=" << toString(session_type_2_1_)
- << " has NO session";
- return;
- }
-
- ssize_t track_count = source_metadata->track_count;
- LOG(INFO) << __func__ << " - SessionType=" << toString(session_type_2_1_)
- << ", " << track_count << " track(s)";
-
- if (session_type_2_1_ == SessionType_2_1::UNKNOWN) {
- audio_session->UpdateTracksMetadata(source_metadata);
- return;
- }
-
- struct playback_track_metadata* track = source_metadata->tracks;
- SourceMetadata sourceMetadata;
- PlaybackTrackMetadata* halMetadata;
-
- sourceMetadata.tracks.resize(track_count);
- halMetadata = sourceMetadata.tracks.data();
- while (track_count && track) {
- halMetadata->usage = static_cast<AudioUsage>(track->usage);
- halMetadata->contentType =
- static_cast<AudioContentType>(track->content_type);
- halMetadata->gain = track->gain;
- LOG(VERBOSE) << __func__ << " - SessionType=" << toString(session_type_2_1_)
- << ", usage=" << toString(halMetadata->usage)
- << ", content=" << toString(halMetadata->contentType)
- << ", gain=" << halMetadata->gain;
- --track_count;
- ++track;
- ++halMetadata;
- }
- auto hal_retval = audio_session->stack_iface_->updateMetadata(sourceMetadata);
- if (!hal_retval.isOk()) {
- LOG(WARNING) << __func__ << " - IBluetoothAudioPort SessionType="
- << toString(session_type_2_1_) << " failed";
- }
-}
-
-void BluetoothAudioSession_2_2::UpdateSinkMetadata(
- const struct sink_metadata* sink_metadata) {
- if (HidlToAidlMiddleware_2_0::IsAidlAvailable())
- return HidlToAidlMiddleware_2_2::UpdateSinkMetadata(raw_session_type_,
- sink_metadata);
- std::lock_guard<std::recursive_mutex> guard(audio_session->mutex_);
- if (!IsSessionReady()) {
- LOG(DEBUG) << __func__ << " - SessionType=" << toString(session_type_2_1_)
- << " has NO session";
- return;
- }
-
- ssize_t track_count = sink_metadata->track_count;
- LOG(INFO) << __func__ << " - SessionType=" << toString(session_type_2_1_)
- << ", " << track_count << " track(s)";
- if (session_type_2_1_ == SessionType_2_1::A2DP_SOFTWARE_ENCODING_DATAPATH ||
- session_type_2_1_ == SessionType_2_1::A2DP_HARDWARE_OFFLOAD_DATAPATH) {
- return;
- }
-
- struct record_track_metadata* track = sink_metadata->tracks;
- SinkMetadata sinkMetadata;
- RecordTrackMetadata* halMetadata;
-
- sinkMetadata.tracks.resize(track_count);
- halMetadata = sinkMetadata.tracks.data();
- while (track_count && track) {
- halMetadata->source = static_cast<AudioSource>(track->source);
- halMetadata->gain = track->gain;
- // halMetadata->destination leave unspecified
- LOG(INFO) << __func__
- << " - SessionType=" << toString(GetAudioSession()->session_type_)
- << ", source=" << track->source
- << ", dest_device=" << track->dest_device
- << ", gain=" << track->gain
- << ", dest_device_address=" << track->dest_device_address;
- --track_count;
- ++track;
- ++halMetadata;
- }
-
- /* This is called just for 2.2 sessions, so it's safe to do this casting*/
- IBluetoothAudioPort_2_2* stack_iface_2_2_ =
- static_cast<IBluetoothAudioPort_2_2*>(audio_session->stack_iface_.get());
- auto hal_retval = stack_iface_2_2_->updateSinkMetadata(sinkMetadata);
- if (!hal_retval.isOk()) {
- LOG(WARNING) << __func__ << " - IBluetoothAudioPort SessionType="
- << toString(session_type_2_1_) << " failed";
- }
-}
-
-// The control function is for the bluetooth_audio module to get the current
-// AudioConfiguration
-const ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration
-BluetoothAudioSession_2_2::GetAudioConfig() {
- if (HidlToAidlMiddleware_2_0::IsAidlAvailable())
- return HidlToAidlMiddleware_2_2::GetAudioConfig(raw_session_type_);
- 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_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;
- const AudioConfiguration_2_1 fromConf =
- GetAudioSession_2_1()->GetAudioConfig();
- if (fromConf.getDiscriminator() ==
- AudioConfiguration_2_1::hidl_discriminator::pcmConfig) {
- toConf.pcmConfig(fromConf.pcmConfig());
- return toConf;
- }
- }
-
- ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration toConf;
- const AudioConfiguration fromConf = GetAudioSession()->GetAudioConfig();
- // pcmConfig only differs between 2.0 and 2.1 in AudioConfiguration
- if (fromConf.getDiscriminator() ==
- AudioConfiguration::hidl_discriminator::codecConfig) {
- toConf.codecConfig(fromConf.codecConfig());
- } else {
- toConf.pcmConfig() = {
- .sampleRate = static_cast<
- ::android::hardware::bluetooth::audio::V2_1::SampleRate>(
- fromConf.pcmConfig().sampleRate),
- .channelMode = fromConf.pcmConfig().channelMode,
- .bitsPerSample = fromConf.pcmConfig().bitsPerSample,
- .dataIntervalUs = 0};
- }
- return toConf;
- } else if (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) {
- return kInvalidLeOffloadAudioConfiguration;
- } else {
- return kInvalidSoftwareAudioConfiguration;
- }
-}
-
-// Those control functions are for the bluetooth_audio module to start, suspend,
-// stop stream, to check position, and to update metadata.
-bool BluetoothAudioSession_2_2::StartStream() {
- if (HidlToAidlMiddleware_2_0::IsAidlAvailable())
- return HidlToAidlMiddleware_2_2::StartStream(raw_session_type_);
- std::lock_guard<std::recursive_mutex> guard(audio_session->mutex_);
- if (!IsSessionReady()) {
- LOG(DEBUG) << __func__ << " - SessionType=" << toString(session_type_2_1_)
- << " has NO session";
- return false;
- }
- auto hal_retval = audio_session->stack_iface_->startStream();
- if (!hal_retval.isOk()) {
- LOG(WARNING) << __func__ << " - IBluetoothAudioPort SessionType="
- << toString(session_type_2_1_) << " failed";
- return false;
- }
- return true;
-}
-
-bool BluetoothAudioSession_2_2::SuspendStream() {
- if (HidlToAidlMiddleware_2_0::IsAidlAvailable())
- return HidlToAidlMiddleware_2_2::SuspendStream(raw_session_type_);
- std::lock_guard<std::recursive_mutex> guard(audio_session->mutex_);
- if (!IsSessionReady()) {
- LOG(DEBUG) << __func__ << " - SessionType=" << toString(session_type_2_1_)
- << " has NO session";
- return false;
- }
- auto hal_retval = audio_session->stack_iface_->suspendStream();
- if (!hal_retval.isOk()) {
- LOG(WARNING) << __func__ << " - IBluetoothAudioPort SessionType="
- << toString(session_type_2_1_) << " failed";
- return false;
- }
- return true;
-}
-
-void BluetoothAudioSession_2_2::StopStream() {
- if (HidlToAidlMiddleware_2_0::IsAidlAvailable())
- return HidlToAidlMiddleware_2_2::StopStream(raw_session_type_);
- std::lock_guard<std::recursive_mutex> guard(audio_session->mutex_);
- if (!IsSessionReady()) {
- return;
- }
- auto hal_retval = audio_session->stack_iface_->stopStream();
- if (!hal_retval.isOk()) {
- LOG(WARNING) << __func__ << " - IBluetoothAudioPort SessionType="
- << toString(session_type_2_1_) << " failed";
- }
-}
-
-bool BluetoothAudioSession_2_2::UpdateAudioConfig(
- const ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration&
- audio_config) {
- bool is_software_session =
- (session_type_2_1_ == SessionType_2_1::A2DP_SOFTWARE_ENCODING_DATAPATH ||
- session_type_2_1_ ==
- SessionType_2_1::HEARING_AID_SOFTWARE_ENCODING_DATAPATH ||
- session_type_2_1_ ==
- SessionType_2_1::LE_AUDIO_SOFTWARE_ENCODING_DATAPATH ||
- session_type_2_1_ ==
- SessionType_2_1::LE_AUDIO_SOFTWARE_DECODED_DATAPATH);
- bool is_offload_a2dp_session =
- (session_type_2_1_ == SessionType_2_1::A2DP_HARDWARE_OFFLOAD_DATAPATH);
- bool is_offload_le_audio_session =
- (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);
- auto audio_config_discriminator = audio_config.getDiscriminator();
- bool is_software_audio_config =
- (is_software_session &&
- audio_config_discriminator ==
- ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration::
- hidl_discriminator::pcmConfig);
- bool is_a2dp_offload_audio_config =
- (is_offload_a2dp_session &&
- audio_config_discriminator ==
- ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration::
- hidl_discriminator::codecConfig);
- bool is_le_audio_offload_audio_config =
- (is_offload_le_audio_session &&
- audio_config_discriminator ==
- ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration::
- hidl_discriminator::leAudioConfig);
- if (!is_software_audio_config && !is_a2dp_offload_audio_config &&
- !is_le_audio_offload_audio_config) {
- return false;
- }
- audio_config_2_2_ = audio_config;
- return true;
-}
-
-// The report function is used to report that the Bluetooth stack has started
-// this session without any failure, and will invoke session_changed_cb_ to
-// notify those registered bluetooth_audio outputs
-void BluetoothAudioSession_2_2::OnSessionStarted(
- const sp<IBluetoothAudioPort> stack_iface, const DataMQ::Descriptor* dataMQ,
- const ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration&
- audio_config) {
- if (session_type_2_1_ == SessionType_2_1::UNKNOWN) {
- ::android::hardware::bluetooth::audio::V2_0::AudioConfiguration config;
- if (audio_config.getDiscriminator() ==
- ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration::
- hidl_discriminator::codecConfig) {
- config.codecConfig(audio_config.codecConfig());
- } else {
- auto& tmpPcm = audio_config.pcmConfig();
- config.pcmConfig(
- ::android::hardware::bluetooth::audio::V2_0::PcmParameters{
- .sampleRate = static_cast<SampleRate>(tmpPcm.sampleRate),
- .channelMode = tmpPcm.channelMode,
- .bitsPerSample = tmpPcm.bitsPerSample
- /*dataIntervalUs is not passed to 2.0 */
- });
- }
-
- audio_session->OnSessionStarted(stack_iface, dataMQ, config);
- } else {
- std::lock_guard<std::recursive_mutex> guard(audio_session->mutex_);
- if (stack_iface == nullptr) {
- LOG(ERROR) << __func__ << " - SessionType=" << toString(session_type_2_1_)
- << ", IBluetoothAudioPort Invalid";
- } else if (!UpdateAudioConfig(audio_config)) {
- LOG(ERROR) << __func__ << " - SessionType=" << toString(session_type_2_1_)
- << ", AudioConfiguration=" << toString(audio_config)
- << " Invalid";
- } else if (!audio_session->UpdateDataPath(dataMQ)) {
- LOG(ERROR) << __func__ << " - SessionType=" << toString(session_type_2_1_)
- << " DataMQ Invalid";
- 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);
- } else {
- audio_session->stack_iface_ = stack_iface;
- LOG(INFO) << __func__ << " - SessionType=" << toString(session_type_2_1_)
- << ", AudioConfiguration=" << toString(audio_config);
- ReportSessionStatus();
- };
- }
-}
-
-// 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) {
- ReportSessionStatus();
- }
-}
-
-// The control function helps the bluetooth_audio module to register
-// PortStatusCallbacks_2_2
-// @return: cookie - the assigned number to this bluetooth_audio output
-uint16_t BluetoothAudioSession_2_2::RegisterStatusCback(
- const PortStatusCallbacks_2_2& cbacks) {
- if (HidlToAidlMiddleware_2_0::IsAidlAvailable())
- return HidlToAidlMiddleware_2_2::RegisterControlResultCback(
- raw_session_type_, cbacks);
- if (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) {
- PortStatusCallbacks cb = {
- .control_result_cb_ = cbacks.control_result_cb_,
- .session_changed_cb_ = cbacks.session_changed_cb_};
- return audio_session->RegisterStatusCback(cb);
- }
-
- std::lock_guard<std::recursive_mutex> guard(audio_session->mutex_);
- uint16_t cookie = ObserversCookieGetInitValue(session_type_2_1_);
- uint16_t cookie_upper_bound = ObserversCookieGetUpperBound(session_type_2_1_);
-
- while (cookie < cookie_upper_bound) {
- if (observers_.find(cookie) == observers_.end()) {
- break;
- }
- ++cookie;
- }
- if (cookie >= cookie_upper_bound) {
- LOG(ERROR) << __func__ << " - SessionType=" << toString(session_type_2_1_)
- << " has " << observers_.size()
- << " observers already (No Resource)";
- return kObserversCookieUndefined;
- }
- std::shared_ptr<struct PortStatusCallbacks_2_2> cb =
- std::make_shared<struct PortStatusCallbacks_2_2>();
- *cb = cbacks;
- observers_[cookie] = cb;
- return cookie;
-}
-
-// The control function helps the bluetooth_audio module to unregister
-// PortStatusCallbacks_2_2
-// @param: cookie - indicates which bluetooth_audio output is
-void BluetoothAudioSession_2_2::UnregisterStatusCback(uint16_t cookie) {
- if (HidlToAidlMiddleware_2_0::IsAidlAvailable())
- return HidlToAidlMiddleware_2_2::UnregisterControlResultCback(
- raw_session_type_, cookie);
- std::lock_guard<std::recursive_mutex> guard(audio_session->mutex_);
- if (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) {
- audio_session->UnregisterStatusCback(cookie);
- return;
- }
- if (observers_.erase(cookie) != 1) {
- LOG(WARNING) << __func__ << " - SessionType=" << toString(session_type_2_1_)
- << " no such provider=0x"
- << android::base::StringPrintf("%04x", cookie);
- }
-}
-
-// invoking the registered session_changed_cb_
-void BluetoothAudioSession_2_2::ReportSessionStatus() {
- // This is locked already by OnSessionStarted / OnSessionEnded
- if (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) {
- audio_session->ReportSessionStatus();
- return;
- }
- if (observers_.empty()) {
- LOG(INFO) << __func__ << " - SessionType=" << toString(session_type_2_1_)
- << " has NO port state observer";
- return;
- }
- for (auto& observer : observers_) {
- uint16_t cookie = observer.first;
- std::shared_ptr<struct PortStatusCallbacks_2_2> cb = observer.second;
- LOG(INFO) << __func__ << " - SessionType=" << toString(session_type_2_1_)
- << " notify to bluetooth_audio=0x"
- << android::base::StringPrintf("%04x", cookie);
- cb->session_changed_cb_(cookie);
- }
-}
-
-// The report function is used to report that the Bluetooth stack has notified
-// the result of startStream or suspendStream, and will invoke
-// control_result_cb_ to notify registered bluetooth_audio outputs
-void BluetoothAudioSession_2_2::ReportControlStatus(
- bool start_resp, const BluetoothAudioStatus& status) {
- if (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) {
- audio_session->ReportControlStatus(start_resp, status);
- return;
- }
- std::lock_guard<std::recursive_mutex> guard(audio_session->mutex_);
- if (observers_.empty()) {
- LOG(WARNING) << __func__ << " - SessionType=" << toString(session_type_2_1_)
- << " has NO port state observer";
- return;
- }
- for (auto& observer : observers_) {
- uint16_t cookie = observer.first;
- std::shared_ptr<struct PortStatusCallbacks_2_2> cb = observer.second;
- LOG(INFO) << __func__ << " - status=" << toString(status)
- << " for SessionType=" << toString(session_type_2_1_)
- << ", bluetooth_audio=0x"
- << android::base::StringPrintf("%04x", cookie)
- << (start_resp ? " started" : " suspended");
- cb->control_result_cb_(cookie, start_resp, status);
- }
-}
-
-// The report function is used to report that the Bluetooth stack has notified
-// the result of startStream or suspendStream, and will invoke
-// control_result_cb_ to notify registered bluetooth_audio outputs
-void BluetoothAudioSession_2_2::ReportAudioConfigChanged(
- const ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration&
- audio_config) {
- if (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) {
- return;
- }
- std::lock_guard<std::recursive_mutex> guard(audio_session->mutex_);
- audio_config_2_2_ = audio_config;
- if (observers_.empty()) {
- LOG(WARNING) << __func__ << " - SessionType=" << toString(session_type_2_1_)
- << " has NO port state observer";
- return;
- }
- for (auto& observer : observers_) {
- uint16_t cookie = observer.first;
- std::shared_ptr<struct PortStatusCallbacks_2_2> cb = observer.second;
- LOG(INFO) << __func__ << " for SessionType=" << toString(session_type_2_1_)
- << ", bluetooth_audio=0x"
- << android::base::StringPrintf("%04x", cookie);
- if (cb->audio_configuration_changed_cb_ != nullptr) {
- cb->audio_configuration_changed_cb_(cookie);
- }
- }
-}
-
-std::unique_ptr<BluetoothAudioSessionInstance_2_2>
- BluetoothAudioSessionInstance_2_2::instance_ptr =
- std::unique_ptr<BluetoothAudioSessionInstance_2_2>(
- new BluetoothAudioSessionInstance_2_2());
-
-// API to fetch the session of A2DP / Hearing Aid
-std::shared_ptr<BluetoothAudioSession_2_2>
-BluetoothAudioSessionInstance_2_2::GetSessionInstance(
- const SessionType_2_1& session_type) {
- std::lock_guard<std::mutex> guard(instance_ptr->mutex_);
- if (!instance_ptr->sessions_map_.empty()) {
- auto entry = instance_ptr->sessions_map_.find(session_type);
- if (entry != instance_ptr->sessions_map_.end()) {
- return entry->second;
- }
- }
- std::shared_ptr<BluetoothAudioSession_2_2> session_ptr =
- std::make_shared<BluetoothAudioSession_2_2>(session_type);
- instance_ptr->sessions_map_[session_type] = session_ptr;
- return session_ptr;
-}
-
-} // namespace audio
-} // namespace bluetooth
-} // namespace android
diff --git a/bluetooth/audio/utils/session/BluetoothAudioSession_2_2.h b/bluetooth/audio/utils/session/BluetoothAudioSession_2_2.h
deleted file mode 100644
index e04ad80..0000000
--- a/bluetooth/audio/utils/session/BluetoothAudioSession_2_2.h
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <android/hardware/bluetooth/audio/2.2/types.h>
-
-#include <mutex>
-#include <unordered_map>
-
-#include "BluetoothAudioSession.h"
-#include "BluetoothAudioSession_2_1.h"
-
-namespace android {
-namespace bluetooth {
-namespace audio {
-
-inline uint16_t ObserversCookieGetInitValue(
- const ::android::hardware::bluetooth::audio::V2_1::SessionType&
- session_type) {
- return (static_cast<uint16_t>(session_type) << 8 & 0xff00);
-}
-inline uint16_t ObserversCookieGetUpperBound(
- const ::android::hardware::bluetooth::audio::V2_1::SessionType&
- session_type) {
- return (static_cast<uint16_t>(session_type) << 8 & 0xff00) +
- kObserversCookieSize;
-}
-
-struct PortStatusCallbacks_2_2 {
- // control_result_cb_ - when the Bluetooth stack reports results of
- // streamStarted or streamSuspended, the BluetoothAudioProvider will invoke
- // this callback to report to the bluetooth_audio module.
- // @param: cookie - indicates which bluetooth_audio output should handle
- // @param: start_resp - this report is for startStream or not
- // @param: status - the result of startStream
- std::function<void(uint16_t cookie, bool start_resp,
- const BluetoothAudioStatus& status)>
- control_result_cb_;
- // session_changed_cb_ - when the Bluetooth stack start / end session, the
- // BluetoothAudioProvider will invoke this callback to notify to the
- // bluetooth_audio module.
- // @param: cookie - indicates which bluetooth_audio output should handle
- std::function<void(uint16_t cookie)> session_changed_cb_;
- // audio_configuration_changed_cb_ - when the Bluetooth stack change the audio
- // configuration, the BluetoothAudioProvider will invoke this callback to
- // notify to the bluetooth_audio module.
- // @param: cookie - indicates which bluetooth_audio output should handle
- std::function<void(uint16_t cookie)> audio_configuration_changed_cb_;
-};
-
-class BluetoothAudioSession_2_2 {
- private:
- std::shared_ptr<BluetoothAudioSession> audio_session;
- std::shared_ptr<BluetoothAudioSession_2_1> audio_session_2_1;
-
- ::android::hardware::bluetooth::audio::V2_1::SessionType session_type_2_1_;
- ::android::hardware::bluetooth::audio::V2_1::SessionType raw_session_type_;
-
- // audio data configuration for both software and offloading
- ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration
- audio_config_2_2_;
-
- bool UpdateAudioConfig(
- const ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration&
- audio_config);
-
- static ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration
- invalidSoftwareAudioConfiguration;
- static ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration
- invalidOffloadAudioConfiguration;
- static ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration
- invalidLeOffloadAudioConfiguration;
-
- // saving those registered bluetooth_audio's callbacks
- std::unordered_map<uint16_t, std::shared_ptr<struct PortStatusCallbacks_2_2>>
- observers_;
-
- // invoking the registered session_changed_cb_
- void ReportSessionStatus();
-
- public:
- BluetoothAudioSession_2_2(
- const ::android::hardware::bluetooth::audio::V2_1::SessionType&
- session_type);
-
- // The function helps to check if this session is ready or not
- // @return: true if the Bluetooth stack has started the specified session
- bool IsSessionReady();
-
- std::shared_ptr<BluetoothAudioSession> GetAudioSession();
- std::shared_ptr<BluetoothAudioSession_2_1> GetAudioSession_2_1();
-
- // The report function is used to report that the Bluetooth stack has started
- // this session without any failure, and will invoke session_changed_cb_ to
- // notify those registered bluetooth_audio outputs
- void OnSessionStarted(
- const sp<IBluetoothAudioPort> stack_iface,
- const DataMQ::Descriptor* dataMQ,
- 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();
- bool SuspendStream();
- void StopStream();
-
- // The control function helps the bluetooth_audio module to register
- // PortStatusCallbacks_2_2
- // @return: cookie - the assigned number to this bluetooth_audio output
- uint16_t RegisterStatusCback(const PortStatusCallbacks_2_2& cbacks);
-
- // The control function helps the bluetooth_audio module to unregister
- // PortStatusCallbacks_2_2
- // @param: cookie - indicates which bluetooth_audio output is
- void UnregisterStatusCback(uint16_t cookie);
-
- // The report function is used to report that the Bluetooth stack has notified
- // the result of startStream or suspendStream, and will invoke
- // control_result_cb_ to notify registered bluetooth_audio outputs
- void ReportControlStatus(bool start_resp, const BluetoothAudioStatus& status);
-
- // The report function is used to report that the Bluetooth stack has notified
- // the audio configuration changed, and will invoke
- // audio_configuration_changed_cb_ to notify registered bluetooth_audio
- // outputs
- void ReportAudioConfigChanged(
- const ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration&
- audio_config);
-
- // The control function is for the bluetooth_audio module to get the current
- // AudioConfiguration
- const ::android::hardware::bluetooth::audio::V2_2::AudioConfiguration
- GetAudioConfig();
-
- void UpdateTracksMetadata(const struct source_metadata* source_metadata);
- void UpdateSinkMetadata(const struct sink_metadata* sink_metadata);
-
- static constexpr ::android::hardware::bluetooth::audio::V2_2::
- AudioConfiguration& kInvalidSoftwareAudioConfiguration =
- invalidSoftwareAudioConfiguration;
- 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 {
- public:
- // The API is to fetch the specified session of A2DP / Hearing Aid
- static std::shared_ptr<BluetoothAudioSession_2_2> GetSessionInstance(
- const ::android::hardware::bluetooth::audio::V2_1::SessionType&
- session_type);
-
- private:
- static std::unique_ptr<BluetoothAudioSessionInstance_2_2> instance_ptr;
- std::mutex mutex_;
- std::unordered_map<::android::hardware::bluetooth::audio::V2_1::SessionType,
- std::shared_ptr<BluetoothAudioSession_2_2>>
- sessions_map_;
-};
-
-} // namespace audio
-} // namespace bluetooth
-} // namespace android
diff --git a/bluetooth/audio/utils/session/BluetoothAudioSupportedCodecsDB_2_2.cpp b/bluetooth/audio/utils/session/BluetoothAudioSupportedCodecsDB_2_2.cpp
deleted file mode 100644
index decff70..0000000
--- a/bluetooth/audio/utils/session/BluetoothAudioSupportedCodecsDB_2_2.cpp
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define LOG_TAG "BTAudioProviderSessionCodecsDB_2_2"
-
-#include "BluetoothAudioSupportedCodecsDB_2_2.h"
-
-#include <android-base/logging.h>
-
-namespace android {
-namespace bluetooth {
-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::BroadcastCapability;
-using ::android::hardware::bluetooth::audio::V2_2::
- LeAudioCodecCapabilitiesSetting;
-using ::android::hardware::bluetooth::audio::V2_2::UnicastCapability;
-using SessionType_2_1 =
- ::android::hardware::bluetooth::audio::V2_1::SessionType;
-
-// Stores the list of offload supported capability
-std::vector<LeAudioCodecCapabilitiesSetting> kDefaultOffloadLeAudioCapabilities;
-
-static const UnicastCapability kInvalidUnicastCapability = {
- .codecType = CodecType::UNKNOWN};
-
-static const BroadcastCapability kInvalidBroadcastCapability = {
- .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 = {
- // Stereo, two connected device, one for L one for R
- std::make_tuple(stereoAudio, 2, 1),
- // Stereo, one connected device for both L and R
- std::make_tuple(stereoAudio, 1, 2),
- // Mono
- std::make_tuple(monoAudio, 1, 1)};
-
-bool IsOffloadLeAudioConfigurationValid(
- const ::android::hardware::bluetooth::audio::V2_1::SessionType&
- session_type,
- const ::android::hardware::bluetooth::audio::V2_2::LeAudioConfiguration&) {
- if (session_type !=
- SessionType_2_1::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH &&
- session_type !=
- SessionType_2_1::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH) {
- return false;
- }
-
- // TODO: perform checks on le_audio_codec_config once we know supported
- // parameters
-
- return true;
-}
-
-UnicastCapability composeUnicastLc3Capability(AudioLocation audioLocation,
- uint8_t deviceCnt,
- uint8_t channelCount,
- Lc3Parameters capability) {
- return UnicastCapability{.codecType = CodecType::LC3,
- .supportedChannel = audioLocation,
- .deviceCount = deviceCnt,
- .channelCountPerDevice = channelCount,
- .capabilities = capability};
-}
-
-std::vector<LeAudioCodecCapabilitiesSetting> 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<LeAudioCodecCapabilitiesSetting>(0);
- }
-
- if (kDefaultOffloadLeAudioCapabilities.empty()) {
- for (auto [audioLocation, deviceCnt, channelCount] :
- supportedDeviceSetting) {
- for (auto capability : supportedLc3CapabilityList) {
- UnicastCapability lc3Capability = composeUnicastLc3Capability(
- audioLocation, deviceCnt, channelCount, capability);
- UnicastCapability lc3MonoDecodeCapability =
- composeUnicastLc3Capability(monoAudio, 1, 1, capability);
-
- // Adds the capability for encode only
- kDefaultOffloadLeAudioCapabilities.push_back(
- {.unicastEncodeCapability = lc3Capability,
- .unicastDecodeCapability = kInvalidUnicastCapability,
- .broadcastCapability = kInvalidBroadcastCapability});
-
- // Adds the capability for decode only
- kDefaultOffloadLeAudioCapabilities.push_back(
- {.unicastEncodeCapability = kInvalidUnicastCapability,
- .unicastDecodeCapability = lc3Capability,
- .broadcastCapability = kInvalidBroadcastCapability});
-
- // Adds the capability for the case that encode and decode exist at the
- // same time
- kDefaultOffloadLeAudioCapabilities.push_back(
- {.unicastEncodeCapability = lc3Capability,
- .unicastDecodeCapability = lc3MonoDecodeCapability,
- .broadcastCapability = kInvalidBroadcastCapability});
- }
- }
- }
-
- return kDefaultOffloadLeAudioCapabilities;
-}
-
-} // namespace audio
-} // namespace bluetooth
-} // namespace android
diff --git a/bluetooth/audio/utils/session/BluetoothAudioSupportedCodecsDB_2_2.h b/bluetooth/audio/utils/session/BluetoothAudioSupportedCodecsDB_2_2.h
deleted file mode 100644
index 34bba5f..0000000
--- a/bluetooth/audio/utils/session/BluetoothAudioSupportedCodecsDB_2_2.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include <android/hardware/bluetooth/audio/2.2/types.h>
-
-#include "BluetoothAudioSupportedCodecsDB.h"
-#include "BluetoothAudioSupportedCodecsDB_2_1.h"
-
-namespace android {
-namespace bluetooth {
-namespace audio {
-
-bool IsOffloadLeAudioConfigurationValid(
- const ::android::hardware::bluetooth::audio::V2_1::SessionType&
- session_type,
- const ::android::hardware::bluetooth::audio::V2_2::LeAudioConfiguration&
- le_audio_codec_config);
-
-std::vector<hardware::bluetooth::audio::V2_2::LeAudioCodecCapabilitiesSetting>
-GetLeAudioOffloadCodecCapabilities(
- const ::android::hardware::bluetooth::audio::V2_1::SessionType&
- session_type);
-} // namespace audio
-} // namespace bluetooth
-} // namespace android
diff --git a/compatibility_matrices/compatibility_matrix.current.xml b/compatibility_matrices/compatibility_matrix.current.xml
index 18ff1fb..6171620 100644
--- a/compatibility_matrices/compatibility_matrix.current.xml
+++ b/compatibility_matrices/compatibility_matrix.current.xml
@@ -142,7 +142,7 @@
</hal>
<hal format="hidl" optional="true">
<name>android.hardware.bluetooth.audio</name>
- <version>2.0-2</version>
+ <version>2.0-1</version>
<interface>
<name>IBluetoothAudioProvidersFactory</name>
<instance>default</instance>
diff --git a/drm/aidl/OWNERS b/drm/aidl/OWNERS
new file mode 100644
index 0000000..fa8fd20
--- /dev/null
+++ b/drm/aidl/OWNERS
@@ -0,0 +1,4 @@
+# Bug component: 49079
+edwinwong@google.com
+kelzhan@google.com
+robertshih@google.com
diff --git a/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/SatellitePvt.aidl b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/SatellitePvt.aidl
index 21a2520..dc875fa 100644
--- a/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/SatellitePvt.aidl
+++ b/gnss/aidl/aidl_api/android.hardware.gnss/current/android/hardware/gnss/SatellitePvt.aidl
@@ -40,10 +40,10 @@
android.hardware.gnss.SatelliteClockInfo satClockInfo;
double ionoDelayMeters;
double tropoDelayMeters;
- int TOC;
- int IODC;
- int TOE;
- int IODE;
+ long timeOfClockSeconds;
+ int issueOfDataClock;
+ long timeOfEphemerisSeconds;
+ int issueOfDataEphemeris;
android.hardware.gnss.SatellitePvt.SatelliteEphemerisSource ephemerisSource = android.hardware.gnss.SatellitePvt.SatelliteEphemerisSource.OTHER;
const int HAS_POSITION_VELOCITY_CLOCK_INFO = 1;
const int HAS_IONO = 2;
diff --git a/gnss/aidl/android/hardware/gnss/SatellitePvt.aidl b/gnss/aidl/android/hardware/gnss/SatellitePvt.aidl
index e79249d..d9f767a 100644
--- a/gnss/aidl/android/hardware/gnss/SatellitePvt.aidl
+++ b/gnss/aidl/android/hardware/gnss/SatellitePvt.aidl
@@ -76,12 +76,13 @@
double tropoDelayMeters;
/**
- * Time of Clock.
+ * Time of Clock in seconds.
*
- * This is defined in GPS ICD200 documentation
- * (e.g., https://www.gps.gov/technical/icwg/IS-GPS-200H.pdf).
+ * This value is defined in seconds since GPS epoch, regardless of the constellation.
+ *
+ * The value must not be encoded as in GPS ICD200 documentation.
*/
- int TOC;
+ long timeOfClockSeconds;
/**
* Issue of Data, Clock.
@@ -91,15 +92,16 @@
*
* The field must be set to 0 if it is not supported.
*/
- int IODC;
+ int issueOfDataClock;
/**
- * Time of Ephemeris.
+ * Time of Ephemeris in seconds.
*
- * This is defined in GPS ICD200 documentation
- * (e.g., https://www.gps.gov/technical/icwg/IS-GPS-200H.pdf).
+ * This value is defined in seconds since GPS epoch, regardless of the constellation.
+ *
+ * The value must not be encoded as in GPS ICD200 documentation.
*/
- int TOE;
+ long timeOfEphemerisSeconds;
/**
* Issue of Data, Ephemeris.
@@ -109,7 +111,7 @@
*
* The field must be set to 0 if it is not supported.
*/
- int IODE;
+ int issueOfDataEphemeris;
/** Satellite's ephemeris source */
@VintfStability
diff --git a/gnss/aidl/vts/gnss_hal_test_cases.cpp b/gnss/aidl/vts/gnss_hal_test_cases.cpp
index 365f9d3..54946fb 100644
--- a/gnss/aidl/vts/gnss_hal_test_cases.cpp
+++ b/gnss/aidl/vts/gnss_hal_test_cases.cpp
@@ -366,12 +366,13 @@
ASSERT_TRUE(satellitePvt.tropoDelayMeters > 0 && satellitePvt.tropoDelayMeters < 100);
}
if (interfaceVersion >= 2) {
- ASSERT_TRUE(satellitePvt.TOC >= 0 && satellitePvt.TOC <= 604784);
- ASSERT_TRUE(satellitePvt.TOE >= 0 && satellitePvt.TOE <= 604784);
+ ASSERT_TRUE(satellitePvt.timeOfClockSeconds >= 0);
+ ASSERT_TRUE(satellitePvt.timeOfEphemerisSeconds >= 0);
// IODC has 10 bits
- ASSERT_TRUE(satellitePvt.IODC >= 0 && satellitePvt.IODC <= 1023);
+ ASSERT_TRUE(satellitePvt.issueOfDataClock >= 0 && satellitePvt.issueOfDataClock <= 1023);
// IODE has 8 bits
- ASSERT_TRUE(satellitePvt.IODE >= 0 && satellitePvt.IODE <= 255);
+ ASSERT_TRUE(satellitePvt.issueOfDataEphemeris >= 0 &&
+ satellitePvt.issueOfDataEphemeris <= 255);
}
}
diff --git a/gnss/common/utils/default/Utils.cpp b/gnss/common/utils/default/Utils.cpp
index a519d3a..4de49f3 100644
--- a/gnss/common/utils/default/Utils.cpp
+++ b/gnss/common/utils/default/Utils.cpp
@@ -201,10 +201,10 @@
.tropoDelayMeters = 3.882265204404031,
.ephemerisSource =
SatellitePvt::SatelliteEphemerisSource::SERVER_LONG_TERM,
- .TOC = 12345,
- .IODC = 143,
- .TOE = 9876,
- .IODE = 48,
+ .timeOfClockSeconds = 12345,
+ .issueOfDataClock = 143,
+ .timeOfEphemerisSeconds = 9876,
+ .issueOfDataEphemeris = 48,
},
.correlationVectors = {}};
diff --git a/neuralnetworks/utils/service/include/nnapi/hal/Service.h b/neuralnetworks/utils/service/include/nnapi/hal/Service.h
index e8b9c10..38d2a54 100644
--- a/neuralnetworks/utils/service/include/nnapi/hal/Service.h
+++ b/neuralnetworks/utils/service/include/nnapi/hal/Service.h
@@ -24,23 +24,16 @@
namespace android::hardware::neuralnetworks::service {
-struct SharedDeviceAndUpdatability {
- nn::SharedDevice device;
- bool isDeviceUpdatable = false;
-};
-
/**
* @brief Get the NNAPI sAIDL and HIDL services declared in the VINTF.
*
* @pre maxFeatureLevelAllowed >= Version::Level::FEATURE_LEVEL_5
*
- * @param includeUpdatableDrivers Allow updatable drivers to be used.
* @param maxFeatureLevelAllowed Maximum version of driver allowed to be used. Any driver version
* exceeding this must be clamped to `maxFeatureLevelAllowed`.
* @return A list of devices and whether each device is updatable or not.
*/
-std::vector<SharedDeviceAndUpdatability> getDevices(bool includeUpdatableDrivers,
- nn::Version::Level maxFeatureLevelAllowed);
+std::vector<nn::SharedDevice> getDevices(nn::Version::Level maxFeatureLevelAllowed);
} // namespace android::hardware::neuralnetworks::service
diff --git a/neuralnetworks/utils/service/src/Service.cpp b/neuralnetworks/utils/service/src/Service.cpp
index e0d5f82..dd37dae 100644
--- a/neuralnetworks/utils/service/src/Service.cpp
+++ b/neuralnetworks/utils/service/src/Service.cpp
@@ -51,7 +51,7 @@
using getDeviceFn = std::add_pointer_t<nn::GeneralResult<nn::SharedDevice>(const std::string&)>;
void getHidlDevicesForVersion(const std::string& descriptor, getDeviceFn getDevice,
- std::vector<SharedDeviceAndUpdatability>* devices,
+ std::vector<nn::SharedDevice>* devices,
std::unordered_set<std::string>* registeredDevices) {
CHECK(devices != nullptr);
CHECK(registeredDevices != nullptr);
@@ -63,7 +63,7 @@
if (maybeDevice.has_value()) {
auto device = std::move(maybeDevice).value();
CHECK(device != nullptr);
- devices->push_back({.device = std::move(device)});
+ devices->push_back(std::move(device));
} else {
LOG(ERROR) << "getDevice(" << name << ") failed with " << maybeDevice.error().code
<< ": " << maybeDevice.error().message;
@@ -72,9 +72,9 @@
}
}
-void getAidlDevices(std::vector<SharedDeviceAndUpdatability>* devices,
+void getAidlDevices(std::vector<nn::SharedDevice>* devices,
std::unordered_set<std::string>* registeredDevices,
- bool includeUpdatableDrivers, nn::Version::Level maxFeatureLevelAllowed) {
+ nn::Version::Level maxFeatureLevelAllowed) {
CHECK(devices != nullptr);
CHECK(registeredDevices != nullptr);
@@ -91,21 +91,12 @@
}
for (const auto& name : names) {
- bool isDeviceUpdatable = false;
- if (__builtin_available(android __NNAPI_AIDL_MIN_ANDROID_API__, *)) {
- const auto instance = std::string(aidl_hal::IDevice::descriptor) + '/' + name;
- isDeviceUpdatable = AServiceManager_isUpdatableViaApex(instance.c_str());
- }
- if (isDeviceUpdatable && !includeUpdatableDrivers) {
- continue;
- }
if (const auto [it, unregistered] = registeredDevices->insert(name); unregistered) {
auto maybeDevice = aidl_hal::utils::getDevice(name, maxFeatureLevelAllowed);
if (maybeDevice.has_value()) {
auto device = std::move(maybeDevice).value();
CHECK(device != nullptr);
- devices->push_back(
- {.device = std::move(device), .isDeviceUpdatable = isDeviceUpdatable});
+ devices->push_back(std::move(device));
} else {
LOG(ERROR) << "getDevice(" << name << ") failed with " << maybeDevice.error().code
<< ": " << maybeDevice.error().message;
@@ -116,14 +107,13 @@
} // namespace
-std::vector<SharedDeviceAndUpdatability> getDevices(bool includeUpdatableDrivers,
- nn::Version::Level maxFeatureLevelAllowed) {
- std::vector<SharedDeviceAndUpdatability> devices;
+std::vector<nn::SharedDevice> getDevices(nn::Version::Level maxFeatureLevelAllowed) {
+ std::vector<nn::SharedDevice> devices;
std::unordered_set<std::string> registeredDevices;
CHECK_GE(maxFeatureLevelAllowed, nn::Version::Level::FEATURE_LEVEL_5);
- getAidlDevices(&devices, ®isteredDevices, includeUpdatableDrivers, maxFeatureLevelAllowed);
+ getAidlDevices(&devices, ®isteredDevices, maxFeatureLevelAllowed);
getHidlDevicesForVersion(V1_3::IDevice::descriptor, &V1_3::utils::getDevice, &devices,
®isteredDevices);
diff --git a/wifi/1.4/vts/functional/wifi_rtt_controller_hidl_test.cpp b/wifi/1.4/vts/functional/wifi_rtt_controller_hidl_test.cpp
index 72cde3c..8918997 100644
--- a/wifi/1.4/vts/functional/wifi_rtt_controller_hidl_test.cpp
+++ b/wifi/1.4/vts/functional/wifi_rtt_controller_hidl_test.cpp
@@ -66,7 +66,9 @@
stopWifi(GetInstanceName());
wifi_rtt_controller_ = getWifiRttController();
- ASSERT_NE(nullptr, wifi_rtt_controller_.get());
+ if (wifi_rtt_controller_.get() == nullptr) {
+ GTEST_SKIP() << "Skipping this test since API is deprecated.";
+ }
// Check RTT support before we run the test.
std::pair<WifiStatus, RttCapabilities> status_and_caps;
@@ -79,7 +81,7 @@
virtual void TearDown() override { stopWifi(GetInstanceName()); }
- // A simple test implementation of WifiChipEventCallback.
+ // A simple test implementation of WifiRttControllerEventCallback.
class WifiRttControllerEventCallback
: public ::testing::VtsHalHidlTargetCallbackBase<
WifiRttControllerHidlTest>,
@@ -122,6 +124,11 @@
const auto& status_and_controller =
HIDL_INVOKE(wifi_chip, createRttController_1_4, wifi_sta_iface);
+
+ if (status_and_controller.first.code == WifiStatusCode::ERROR_NOT_SUPPORTED) {
+ return nullptr;
+ }
+
EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_controller.first.code);
EXPECT_NE(nullptr, status_and_controller.second.get());
diff --git a/wifi/1.5/vts/functional/wifi_sta_iface_hidl_test.cpp b/wifi/1.5/vts/functional/wifi_sta_iface_hidl_test.cpp
index 399307e..7a0eb1f 100644
--- a/wifi/1.5/vts/functional/wifi_sta_iface_hidl_test.cpp
+++ b/wifi/1.5/vts/functional/wifi_sta_iface_hidl_test.cpp
@@ -94,6 +94,11 @@
// Retrieve link layer stats.
const auto& status_and_stats =
HIDL_INVOKE(wifi_sta_iface_, getLinkLayerStats_1_5);
+
+ if (status_and_stats.first.code == WifiStatusCode::ERROR_NOT_SUPPORTED) {
+ GTEST_SKIP() << "Skipping this test since API is deprecated.";
+ }
+
EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_stats.first.code);
EXPECT_GT(status_and_stats.second.timeStampInMs, 0u);
// Try to create 2nd iface. If yes, it should fill in the duty cycle field.
diff --git a/wifi/1.6/default/tests/mock_wifi_legacy_hal.h b/wifi/1.6/default/tests/mock_wifi_legacy_hal.h
index b1f5327..85dbf0f 100644
--- a/wifi/1.6/default/tests/mock_wifi_legacy_hal.h
+++ b/wifi/1.6/default/tests/mock_wifi_legacy_hal.h
@@ -56,6 +56,10 @@
wifi_error(const std::string& ifname, wifi_interface_type iftype));
MOCK_METHOD1(deleteVirtualInterface, wifi_error(const std::string& ifname));
MOCK_METHOD0(waitForDriverReady, wifi_error());
+ MOCK_METHOD2(getSupportedIfaceName, wifi_error(uint32_t, std::string&));
+ MOCK_METHOD1(registerSubsystemRestartCallbackHandler,
+ wifi_error(const on_subsystem_restart_callback&));
+ MOCK_METHOD1(getSupportedFeatureSet, std::pair<wifi_error, uint64_t>(const std::string&));
};
} // namespace legacy_hal
} // namespace implementation
diff --git a/wifi/1.6/default/tests/wifi_chip_unit_tests.cpp b/wifi/1.6/default/tests/wifi_chip_unit_tests.cpp
index 48c0065..eaab211 100644
--- a/wifi/1.6/default/tests/wifi_chip_unit_tests.cpp
+++ b/wifi/1.6/default/tests/wifi_chip_unit_tests.cpp
@@ -278,6 +278,9 @@
.WillRepeatedly(testing::Return(true));
EXPECT_CALL(*legacy_hal_, start())
.WillRepeatedly(testing::Return(legacy_hal::WIFI_SUCCESS));
+ // Vendor HAL does not override the name by default.
+ EXPECT_CALL(*legacy_hal_, getSupportedIfaceName(testing::_, testing::_))
+ .WillRepeatedly(testing::Return(legacy_hal::WIFI_ERROR_UNKNOWN));
}
void TearDown() override {
diff --git a/wifi/1.6/default/wifi_chip.cpp b/wifi/1.6/default/wifi_chip.cpp
index 0e2accf..6cc1235 100644
--- a/wifi/1.6/default/wifi_chip.cpp
+++ b/wifi/1.6/default/wifi_chip.cpp
@@ -791,8 +791,57 @@
std::pair<WifiStatus, std::vector<V1_0::IWifiChip::ChipMode>>
WifiChip::getAvailableModesInternal() {
- // Deprecated support -- use getAvailableModes_1_6.
- return {createWifiStatus(WifiStatusCode::ERROR_NOT_SUPPORTED), {}};
+ // Deprecated support -- use getAvailableModes_1_6 for more granular concurrency combinations.
+ std::vector<V1_0::IWifiChip::ChipMode> modes_1_0 = {};
+ for (const auto& mode_1_6 : modes_) {
+ std::vector<V1_0::IWifiChip::ChipIfaceCombination> combos_1_0;
+ for (const auto& combo_1_6 : mode_1_6.availableCombinations) {
+ std::vector<V1_0::IWifiChip::ChipIfaceCombinationLimit> limits_1_0;
+ for (const auto& limit_1_6 : combo_1_6.limits) {
+ std::vector<IfaceType> types_1_0;
+ for (IfaceConcurrencyType type_1_6 : limit_1_6.types) {
+ switch (type_1_6) {
+ case IfaceConcurrencyType::STA:
+ types_1_0.push_back(IfaceType::STA);
+ break;
+ case IfaceConcurrencyType::AP:
+ types_1_0.push_back(IfaceType::AP);
+ break;
+ case IfaceConcurrencyType::AP_BRIDGED:
+ // Ignore AP_BRIDGED
+ break;
+ case IfaceConcurrencyType::P2P:
+ types_1_0.push_back(IfaceType::P2P);
+ break;
+ case IfaceConcurrencyType::NAN:
+ types_1_0.push_back(IfaceType::NAN);
+ break;
+ }
+ }
+ if (types_1_0.empty()) {
+ continue;
+ }
+ V1_0::IWifiChip::ChipIfaceCombinationLimit limit_1_0;
+ limit_1_0.types = hidl_vec(types_1_0);
+ limit_1_0.maxIfaces = limit_1_6.maxIfaces;
+ limits_1_0.push_back(limit_1_0);
+ }
+ if (limits_1_0.empty()) {
+ continue;
+ }
+ V1_0::IWifiChip::ChipIfaceCombination combo_1_0;
+ combo_1_0.limits = hidl_vec(limits_1_0);
+ combos_1_0.push_back(combo_1_0);
+ }
+ if (combos_1_0.empty()) {
+ continue;
+ }
+ V1_0::IWifiChip::ChipMode mode_1_0;
+ mode_1_0.id = mode_1_6.id;
+ mode_1_0.availableCombinations = hidl_vec(combos_1_0);
+ modes_1_0.push_back(mode_1_0);
+ }
+ return {createWifiStatus(WifiStatusCode::SUCCESS), modes_1_0};
}
WifiStatus WifiChip::configureChipInternal(
diff --git a/wifi/1.6/default/wifi_legacy_hal.h b/wifi/1.6/default/wifi_legacy_hal.h
index ab21e8e..6f42f70 100644
--- a/wifi/1.6/default/wifi_legacy_hal.h
+++ b/wifi/1.6/default/wifi_legacy_hal.h
@@ -496,7 +496,7 @@
const std::string& iface_name);
std::pair<wifi_error, std::vector<uint8_t>> requestFirmwareMemoryDump(
const std::string& iface_name);
- std::pair<wifi_error, uint64_t> getSupportedFeatureSet(const std::string& iface_name);
+ virtual std::pair<wifi_error, uint64_t> getSupportedFeatureSet(const std::string& iface_name);
// APF functions.
std::pair<wifi_error, PacketFilterCapabilities> getPacketFilterCapabilities(
const std::string& iface_name);
@@ -564,7 +564,7 @@
wifi_error registerRingBufferCallbackHandler(
const std::string& iface_name, const on_ring_buffer_data_callback& on_data_callback);
wifi_error deregisterRingBufferCallbackHandler(const std::string& iface_name);
- wifi_error registerSubsystemRestartCallbackHandler(
+ virtual wifi_error registerSubsystemRestartCallbackHandler(
const on_subsystem_restart_callback& on_restart_callback);
std::pair<wifi_error, std::vector<wifi_ring_buffer_status>> getRingBuffersStatus(
const std::string& iface_name);
@@ -637,7 +637,7 @@
virtual wifi_error createVirtualInterface(const std::string& ifname,
wifi_interface_type iftype);
virtual wifi_error deleteVirtualInterface(const std::string& ifname);
- wifi_error getSupportedIfaceName(uint32_t iface_type, std::string& ifname);
+ virtual wifi_error getSupportedIfaceName(uint32_t iface_type, std::string& ifname);
// STA + STA functions
virtual wifi_error multiStaSetPrimaryConnection(const std::string& ifname);
diff --git a/wifi/1.6/vts/OWNERS b/wifi/1.6/vts/OWNERS
new file mode 100644
index 0000000..294fc82
--- /dev/null
+++ b/wifi/1.6/vts/OWNERS
@@ -0,0 +1,2 @@
+# Bug component: 33618
+include ../../1.0/vts/OWNERS
diff --git a/wifi/1.6/vts/functional/Android.bp b/wifi/1.6/vts/functional/Android.bp
new file mode 100644
index 0000000..2d126c7
--- /dev/null
+++ b/wifi/1.6/vts/functional/Android.bp
@@ -0,0 +1,98 @@
+//
+// Copyright (C) 2022 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+package {
+ // See: http://go/android-license-faq
+ // A large-scale-change added 'default_applicable_licenses' to import
+ // all of the 'license_kinds' from "hardware_interfaces_license"
+ // to get the below license kinds:
+ // SPDX-license-identifier-Apache-2.0
+ default_applicable_licenses: ["hardware_interfaces_license"],
+}
+
+cc_test {
+ name: "VtsHalWifiV1_6TargetTest",
+ defaults: ["VtsHalTargetTestDefaults"],
+ srcs: [
+ "wifi_chip_hidl_test.cpp",
+ "wifi_sta_iface_hidl_test.cpp",
+ ],
+ static_libs: [
+ "VtsHalWifiV1_0TargetTestUtil",
+ "android.hardware.wifi@1.0",
+ "android.hardware.wifi@1.1",
+ "android.hardware.wifi@1.2",
+ "android.hardware.wifi@1.3",
+ "android.hardware.wifi@1.4",
+ "android.hardware.wifi@1.5",
+ "android.hardware.wifi@1.6",
+ "libwifi-system-iface",
+ ],
+ test_suites: [
+ "general-tests",
+ "vts",
+ ],
+}
+
+// These tests are split out so that they can be conditioned on presence of the
+// "android.hardware.wifi.rtt" feature.
+cc_test {
+ name: "VtsHalWifiRttV1_6TargetTest",
+ defaults: ["VtsHalTargetTestDefaults"],
+ srcs: [
+ "wifi_rtt_controller_hidl_test.cpp",
+ ],
+ static_libs: [
+ "VtsHalWifiV1_0TargetTestUtil",
+ "android.hardware.wifi@1.0",
+ "android.hardware.wifi@1.1",
+ "android.hardware.wifi@1.2",
+ "android.hardware.wifi@1.3",
+ "android.hardware.wifi@1.4",
+ "android.hardware.wifi@1.5",
+ "android.hardware.wifi@1.6",
+ "libwifi-system-iface",
+ ],
+ test_suites: [
+ "general-tests",
+ "vts",
+ ],
+}
+
+// These tests are split out so that they can be conditioned on presence of the
+// "android.hardware.wifi.aware" feature.
+cc_test {
+ name: "VtsHalWifiNanV1_6TargetTest",
+ defaults: ["VtsHalTargetTestDefaults"],
+ srcs: [
+ "wifi_nan_iface_hidl_test.cpp",
+ ],
+ static_libs: [
+ "VtsHalWifiV1_0TargetTestUtil",
+ "android.hardware.wifi@1.0",
+ "android.hardware.wifi@1.1",
+ "android.hardware.wifi@1.2",
+ "android.hardware.wifi@1.3",
+ "android.hardware.wifi@1.4",
+ "android.hardware.wifi@1.5",
+ "android.hardware.wifi@1.6",
+ "libwifi-system-iface",
+ ],
+ test_suites: [
+ "general-tests",
+ "vts",
+ ],
+}
diff --git a/wifi/1.6/vts/functional/wifi_chip_hidl_test.cpp b/wifi/1.6/vts/functional/wifi_chip_hidl_test.cpp
new file mode 100644
index 0000000..54fb721
--- /dev/null
+++ b/wifi/1.6/vts/functional/wifi_chip_hidl_test.cpp
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <VtsHalHidlTargetCallbackBase.h>
+#include <android-base/logging.h>
+
+#undef NAN // NAN is defined in bionic/libc/include/math.h:38
+
+#include <android/hardware/wifi/1.4/IWifiChipEventCallback.h>
+#include <android/hardware/wifi/1.6/IWifi.h>
+#include <android/hardware/wifi/1.6/IWifiChip.h>
+#include <android/hardware/wifi/1.6/IWifiStaIface.h>
+#include <gtest/gtest.h>
+#include <hidl/GtestPrinter.h>
+#include <hidl/ServiceManagement.h>
+
+#include "wifi_hidl_call_util.h"
+#include "wifi_hidl_test_utils.h"
+
+using ::android::sp;
+using ::android::hardware::hidl_string;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+using ::android::hardware::wifi::V1_0::ChipModeId;
+using ::android::hardware::wifi::V1_0::IfaceType;
+using ::android::hardware::wifi::V1_0::IWifiIface;
+using ::android::hardware::wifi::V1_0::IWifiStaIface;
+using ::android::hardware::wifi::V1_0::WifiDebugRingBufferStatus;
+using ::android::hardware::wifi::V1_0::WifiStatus;
+using ::android::hardware::wifi::V1_0::WifiStatusCode;
+using ::android::hardware::wifi::V1_4::IWifiChipEventCallback;
+using ::android::hardware::wifi::V1_5::WifiBand;
+using ::android::hardware::wifi::V1_5::WifiIfaceMode;
+using ::android::hardware::wifi::V1_6::IWifiChip;
+
+/**
+ * Fixture to use for all Wifi chip HIDL interface tests.
+ */
+class WifiChipHidlTest : public ::testing::TestWithParam<std::string> {
+ public:
+ virtual void SetUp() override {
+ // Make sure to start with a clean state
+ stopWifi(GetInstanceName());
+
+ wifi_chip_ = IWifiChip::castFrom(getWifiChip(GetInstanceName()));
+ ASSERT_NE(nullptr, wifi_chip_.get());
+ }
+
+ virtual void TearDown() override { stopWifi(GetInstanceName()); }
+
+ protected:
+ // Helper function to configure the Chip in one of the supported modes.
+ // Most of the non-mode-configuration-related methods require chip
+ // to be first configured.
+ ChipModeId configureChipForIfaceType(IfaceType type, bool expectSuccess) {
+ ChipModeId mode_id;
+ EXPECT_EQ(expectSuccess, configureChipToSupportIfaceType(wifi_chip_, type, &mode_id));
+ return mode_id;
+ }
+
+ sp<IWifiChip> wifi_chip_;
+
+ private:
+ std::string GetInstanceName() { return GetParam(); }
+};
+
+/* getUsableChannels_1_6:
+ * Ensure that a call to getUsableChannels_1_6 will return with a success
+ * status for valid inputs.
+ */
+TEST_P(WifiChipHidlTest, getUsableChannels_1_6) {
+ uint32_t ifaceModeMask =
+ WifiIfaceMode::IFACE_MODE_P2P_CLIENT | WifiIfaceMode::IFACE_MODE_P2P_GO;
+ uint32_t filterMask = IWifiChip::UsableChannelFilter::CELLULAR_COEXISTENCE |
+ IWifiChip::UsableChannelFilter::CONCURRENCY;
+ configureChipForIfaceType(IfaceType::STA, true);
+ WifiBand band = WifiBand::BAND_24GHZ_5GHZ_6GHZ;
+ const auto& statusNonEmpty =
+ HIDL_INVOKE(wifi_chip_, getUsableChannels_1_6, band, ifaceModeMask, filterMask);
+
+ EXPECT_EQ(WifiStatusCode::SUCCESS, statusNonEmpty.first.code);
+}
+
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(WifiChipHidlTest);
+INSTANTIATE_TEST_SUITE_P(PerInstance, WifiChipHidlTest,
+ testing::ValuesIn(android::hardware::getAllHalInstanceNames(
+ ::android::hardware::wifi::V1_6::IWifi::descriptor)),
+ android::hardware::PrintInstanceNameToString);
diff --git a/wifi/1.6/vts/functional/wifi_nan_iface_hidl_test.cpp b/wifi/1.6/vts/functional/wifi_nan_iface_hidl_test.cpp
new file mode 100644
index 0000000..bf9e230
--- /dev/null
+++ b/wifi/1.6/vts/functional/wifi_nan_iface_hidl_test.cpp
@@ -0,0 +1,611 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Nanache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <android-base/logging.h>
+
+#include <VtsCoreUtil.h>
+#include <android/hardware/wifi/1.6/IWifi.h>
+#include <android/hardware/wifi/1.6/IWifiNanIface.h>
+#include <android/hardware/wifi/1.6/IWifiNanIfaceEventCallback.h>
+#include <gtest/gtest.h>
+#include <hidl/GtestPrinter.h>
+#include <hidl/ServiceManagement.h>
+#include <chrono>
+#include <condition_variable>
+#include <mutex>
+
+#include "wifi_hidl_call_util.h"
+#include "wifi_hidl_test_utils.h"
+
+using namespace ::android::hardware::wifi::V1_0;
+using namespace ::android::hardware::wifi::V1_2;
+using namespace ::android::hardware::wifi::V1_4;
+using namespace ::android::hardware::wifi::V1_5;
+using namespace ::android::hardware::wifi::V1_6;
+
+using ::android::sp;
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+
+#define TIMEOUT_PERIOD 10
+
+android::sp<android::hardware::wifi::V1_6::IWifiNanIface> getWifiNanIface_1_6(
+ const std::string& instance_name) {
+ return android::hardware::wifi::V1_6::IWifiNanIface::castFrom(getWifiNanIface(instance_name));
+}
+
+/**
+ * Fixture to use for all NAN Iface HIDL interface tests.
+ */
+class WifiNanIfaceHidlTest : public ::testing::TestWithParam<std::string> {
+ public:
+ virtual void SetUp() override {
+ if (!::testing::deviceSupportsFeature("android.hardware.wifi.aware"))
+ GTEST_SKIP() << "Skipping this test since NAN is not supported.";
+ // Make sure to start with a clean state
+ stopWifi(GetInstanceName());
+
+ iwifiNanIface = getWifiNanIface_1_6(GetInstanceName());
+ ASSERT_NE(nullptr, iwifiNanIface.get());
+ ASSERT_EQ(WifiStatusCode::SUCCESS, HIDL_INVOKE(iwifiNanIface, registerEventCallback_1_6,
+ new WifiNanIfaceEventCallback(*this))
+ .code);
+ }
+
+ virtual void TearDown() override { stopWifi(GetInstanceName()); }
+
+ /* Used as a mechanism to inform the test about data/event callback */
+ inline void notify() {
+ std::unique_lock<std::mutex> lock(mtx_);
+ count_++;
+ cv_.notify_one();
+ }
+
+ enum CallbackType {
+ INVALID = -2,
+ ANY_CALLBACK = -1,
+
+ NOTIFY_CAPABILITIES_RESPONSE = 0,
+ NOTIFY_ENABLE_RESPONSE,
+ NOTIFY_CONFIG_RESPONSE,
+ NOTIFY_DISABLE_RESPONSE,
+ NOTIFY_START_PUBLISH_RESPONSE,
+ NOTIFY_STOP_PUBLISH_RESPONSE,
+ NOTIFY_START_SUBSCRIBE_RESPONSE,
+ NOTIFY_STOP_SUBSCRIBE_RESPONSE,
+ NOTIFY_TRANSMIT_FOLLOWUP_RESPONSE,
+ NOTIFY_CREATE_DATA_INTERFACE_RESPONSE,
+ NOTIFY_DELETE_DATA_INTERFACE_RESPONSE,
+ NOTIFY_INITIATE_DATA_PATH_RESPONSE,
+ NOTIFY_RESPOND_TO_DATA_PATH_INDICATION_RESPONSE,
+ NOTIFY_TERMINATE_DATA_PATH_RESPONSE,
+ NOTIFY_CAPABILITIES_RESPONSE_1_5,
+ NOTIFY_CAPABILITIES_RESPONSE_1_6,
+
+ EVENT_CLUSTER_EVENT,
+ EVENT_DISABLED,
+ EVENT_PUBLISH_TERMINATED,
+ EVENT_SUBSCRIBE_TERMINATED,
+ EVENT_MATCH,
+ EVENT_MATCH_EXPIRED,
+ EVENT_FOLLOWUP_RECEIVED,
+ EVENT_TRANSMIT_FOLLOWUP,
+ EVENT_DATA_PATH_REQUEST,
+ EVENT_DATA_PATH_CONFIRM,
+ EVENT_DATA_PATH_TERMINATED,
+ EVENT_DATA_PATH_CONFIRM_1_2,
+ EVENT_DATA_PATH_SCHEDULE_UPDATE,
+ EVENT_MATCH_1_6,
+ EVENT_DATA_PATH_SCHEDULE_UPDATE_1_6,
+ EVENT_DATA_PATH_CONFIRM_1_6,
+ };
+
+ /* Test code calls this function to wait for data/event callback */
+ /* Must set callbackType = INVALID before call this function */
+ inline std::cv_status wait(CallbackType waitForCallbackType) {
+ std::unique_lock<std::mutex> lock(mtx_);
+
+ EXPECT_NE(INVALID, waitForCallbackType); // can't ASSERT in a
+ // non-void-returning method
+
+ std::cv_status status = std::cv_status::no_timeout;
+ auto now = std::chrono::system_clock::now();
+ while (count_ == 0) {
+ status = cv_.wait_until(lock, now + std::chrono::seconds(TIMEOUT_PERIOD));
+ if (status == std::cv_status::timeout) return status;
+ if (waitForCallbackType != ANY_CALLBACK && callbackType != INVALID &&
+ callbackType != waitForCallbackType) {
+ count_--;
+ }
+ }
+ count_--;
+ return status;
+ }
+
+ class WifiNanIfaceEventCallback
+ : public ::android::hardware::wifi::V1_6::IWifiNanIfaceEventCallback {
+ WifiNanIfaceHidlTest& parent_;
+
+ public:
+ WifiNanIfaceEventCallback(WifiNanIfaceHidlTest& parent) : parent_(parent){};
+
+ virtual ~WifiNanIfaceEventCallback() = default;
+
+ Return<void> notifyCapabilitiesResponse(
+ uint16_t id, const WifiNanStatus& status,
+ const ::android::hardware::wifi::V1_0::NanCapabilities& capabilities) override {
+ parent_.callbackType = NOTIFY_CAPABILITIES_RESPONSE;
+
+ parent_.id = id;
+ parent_.status = status;
+ parent_.capabilities = capabilities;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> notifyCapabilitiesResponse_1_5(
+ uint16_t id, const WifiNanStatus& status,
+ const ::android::hardware::wifi::V1_5::NanCapabilities& capabilities) override {
+ parent_.callbackType = NOTIFY_CAPABILITIES_RESPONSE_1_5;
+
+ parent_.id = id;
+ parent_.status = status;
+ parent_.capabilities_1_5 = capabilities;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> notifyEnableResponse(uint16_t id, const WifiNanStatus& status) override {
+ parent_.callbackType = NOTIFY_ENABLE_RESPONSE;
+
+ parent_.id = id;
+ parent_.status = status;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> notifyConfigResponse(uint16_t id, const WifiNanStatus& status) override {
+ parent_.callbackType = NOTIFY_CONFIG_RESPONSE;
+
+ parent_.id = id;
+ parent_.status = status;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> notifyDisableResponse(uint16_t id, const WifiNanStatus& status) override {
+ parent_.callbackType = NOTIFY_DISABLE_RESPONSE;
+
+ parent_.id = id;
+ parent_.status = status;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> notifyStartPublishResponse(uint16_t id, const WifiNanStatus& status,
+ uint8_t sessionId) override {
+ parent_.callbackType = NOTIFY_START_PUBLISH_RESPONSE;
+
+ parent_.id = id;
+ parent_.status = status;
+ parent_.sessionId = sessionId;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> notifyStopPublishResponse(uint16_t id, const WifiNanStatus& status) override {
+ parent_.callbackType = NOTIFY_STOP_PUBLISH_RESPONSE;
+
+ parent_.id = id;
+ parent_.status = status;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> notifyStartSubscribeResponse(uint16_t id, const WifiNanStatus& status,
+ uint8_t sessionId) override {
+ parent_.callbackType = NOTIFY_START_SUBSCRIBE_RESPONSE;
+
+ parent_.id = id;
+ parent_.status = status;
+ parent_.sessionId = sessionId;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> notifyStopSubscribeResponse(uint16_t id,
+ const WifiNanStatus& status) override {
+ parent_.callbackType = NOTIFY_STOP_SUBSCRIBE_RESPONSE;
+
+ parent_.id = id;
+ parent_.status = status;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> notifyTransmitFollowupResponse(uint16_t id,
+ const WifiNanStatus& status) override {
+ parent_.callbackType = NOTIFY_TRANSMIT_FOLLOWUP_RESPONSE;
+
+ parent_.id = id;
+ parent_.status = status;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> notifyCreateDataInterfaceResponse(uint16_t id,
+ const WifiNanStatus& status) override {
+ parent_.callbackType = NOTIFY_CREATE_DATA_INTERFACE_RESPONSE;
+
+ parent_.id = id;
+ parent_.status = status;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> notifyDeleteDataInterfaceResponse(uint16_t id,
+ const WifiNanStatus& status) override {
+ parent_.callbackType = NOTIFY_DELETE_DATA_INTERFACE_RESPONSE;
+
+ parent_.id = id;
+ parent_.status = status;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> notifyInitiateDataPathResponse(uint16_t id, const WifiNanStatus& status,
+ uint32_t ndpInstanceId) override {
+ parent_.callbackType = NOTIFY_INITIATE_DATA_PATH_RESPONSE;
+
+ parent_.id = id;
+ parent_.status = status;
+ parent_.ndpInstanceId = ndpInstanceId;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> notifyRespondToDataPathIndicationResponse(
+ uint16_t id, const WifiNanStatus& status) override {
+ parent_.callbackType = NOTIFY_RESPOND_TO_DATA_PATH_INDICATION_RESPONSE;
+
+ parent_.id = id;
+ parent_.status = status;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> notifyTerminateDataPathResponse(uint16_t id,
+ const WifiNanStatus& status) override {
+ parent_.callbackType = NOTIFY_TERMINATE_DATA_PATH_RESPONSE;
+
+ parent_.id = id;
+ parent_.status = status;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> eventClusterEvent(const NanClusterEventInd& event) override {
+ parent_.callbackType = EVENT_CLUSTER_EVENT;
+
+ parent_.nanClusterEventInd = event;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> eventDisabled(const WifiNanStatus& status) override {
+ parent_.callbackType = EVENT_DISABLED;
+
+ parent_.status = status;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> eventPublishTerminated(uint8_t sessionId,
+ const WifiNanStatus& status) override {
+ parent_.callbackType = EVENT_PUBLISH_TERMINATED;
+
+ parent_.sessionId = sessionId;
+ parent_.status = status;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> eventSubscribeTerminated(uint8_t sessionId,
+ const WifiNanStatus& status) override {
+ parent_.callbackType = EVENT_SUBSCRIBE_TERMINATED;
+
+ parent_.sessionId = sessionId;
+ parent_.status = status;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> eventMatch(
+ const ::android::hardware::wifi::V1_0::NanMatchInd& event) override {
+ parent_.callbackType = EVENT_MATCH;
+
+ parent_.nanMatchInd = event;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> eventMatchExpired(uint8_t discoverySessionId, uint32_t peerId) override {
+ parent_.callbackType = EVENT_MATCH_EXPIRED;
+
+ parent_.sessionId = discoverySessionId;
+ parent_.peerId = peerId;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> eventFollowupReceived(const NanFollowupReceivedInd& event) override {
+ parent_.callbackType = EVENT_FOLLOWUP_RECEIVED;
+
+ parent_.nanFollowupReceivedInd = event;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> eventTransmitFollowup(uint16_t id, const WifiNanStatus& status) override {
+ parent_.callbackType = EVENT_TRANSMIT_FOLLOWUP;
+
+ parent_.id = id;
+ parent_.status = status;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> eventDataPathRequest(const NanDataPathRequestInd& event) override {
+ parent_.callbackType = EVENT_DATA_PATH_REQUEST;
+
+ parent_.nanDataPathRequestInd = event;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> eventDataPathConfirm(
+ const ::android::hardware::wifi::V1_0::NanDataPathConfirmInd& event) override {
+ parent_.callbackType = EVENT_DATA_PATH_CONFIRM;
+
+ parent_.nanDataPathConfirmInd = event;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> eventDataPathTerminated(uint32_t ndpInstanceId) override {
+ parent_.callbackType = EVENT_DATA_PATH_TERMINATED;
+
+ parent_.ndpInstanceId = ndpInstanceId;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> eventDataPathConfirm_1_2(
+ const ::android::hardware::wifi::V1_2::NanDataPathConfirmInd& event) override {
+ parent_.callbackType = EVENT_DATA_PATH_CONFIRM_1_2;
+
+ parent_.nanDataPathConfirmInd_1_2 = event;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> eventDataPathScheduleUpdate(
+ const ::android::hardware::wifi::V1_2::NanDataPathScheduleUpdateInd& event)
+ override {
+ parent_.callbackType = EVENT_DATA_PATH_SCHEDULE_UPDATE;
+
+ parent_.nanDataPathScheduleUpdateInd_1_2 = event;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> eventMatch_1_6(
+ const ::android::hardware::wifi::V1_6::NanMatchInd& event) override {
+ parent_.callbackType = EVENT_MATCH_1_6;
+
+ parent_.nanMatchInd_1_6 = event;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> notifyCapabilitiesResponse_1_6(
+ uint16_t id, const WifiNanStatus& status,
+ const ::android::hardware::wifi::V1_6::NanCapabilities& capabilities) override {
+ parent_.callbackType = NOTIFY_CAPABILITIES_RESPONSE_1_6;
+
+ parent_.id = id;
+ parent_.status = status;
+ parent_.capabilities_1_6 = capabilities;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> eventDataPathScheduleUpdate_1_6(
+ const ::android::hardware::wifi::V1_6::NanDataPathScheduleUpdateInd& event)
+ override {
+ parent_.callbackType = EVENT_DATA_PATH_SCHEDULE_UPDATE_1_6;
+
+ parent_.nanDataPathScheduleUpdateInd_1_6 = event;
+
+ parent_.notify();
+ return Void();
+ }
+
+ Return<void> eventDataPathConfirm_1_6(
+ const ::android::hardware::wifi::V1_6::NanDataPathConfirmInd& event) override {
+ parent_.callbackType = EVENT_DATA_PATH_CONFIRM_1_6;
+
+ parent_.nanDataPathConfirmInd_1_6 = event;
+
+ parent_.notify();
+ return Void();
+ }
+ };
+
+ private:
+ // synchronization objects
+ std::mutex mtx_;
+ std::condition_variable cv_;
+ int count_ = 0;
+
+ protected:
+ android::sp<::android::hardware::wifi::V1_6::IWifiNanIface> iwifiNanIface;
+
+ // Data from IWifiNanIfaceEventCallback callbacks: this is the collection of
+ // all arguments to all callbacks. They are set by the callback
+ // (notifications or events) and can be retrieved by tests.
+ CallbackType callbackType;
+ uint16_t id;
+ WifiNanStatus status;
+ uint8_t sessionId;
+ uint32_t ndpInstanceId;
+ NanClusterEventInd nanClusterEventInd;
+ ::android::hardware::wifi::V1_0::NanMatchInd nanMatchInd;
+ ::android::hardware::wifi::V1_6::NanMatchInd nanMatchInd_1_6;
+ uint32_t peerId;
+ NanFollowupReceivedInd nanFollowupReceivedInd;
+ NanDataPathRequestInd nanDataPathRequestInd;
+ ::android::hardware::wifi::V1_0::NanCapabilities capabilities;
+ ::android::hardware::wifi::V1_5::NanCapabilities capabilities_1_5;
+ ::android::hardware::wifi::V1_6::NanCapabilities capabilities_1_6;
+ ::android::hardware::wifi::V1_0::NanDataPathConfirmInd nanDataPathConfirmInd;
+ ::android::hardware::wifi::V1_2::NanDataPathConfirmInd nanDataPathConfirmInd_1_2;
+ ::android::hardware::wifi::V1_6::NanDataPathConfirmInd nanDataPathConfirmInd_1_6;
+ ::android::hardware::wifi::V1_2::NanDataPathScheduleUpdateInd nanDataPathScheduleUpdateInd_1_2;
+ ::android::hardware::wifi::V1_6::NanDataPathScheduleUpdateInd nanDataPathScheduleUpdateInd_1_6;
+
+ std::string GetInstanceName() { return GetParam(); }
+};
+
+/*
+ * Create:
+ * Ensures that an instance of the IWifiNanIface proxy object is
+ * successfully created.
+ */
+TEST_P(WifiNanIfaceHidlTest, Create) {
+ // The creation of a proxy object is tested as part of SetUp method.
+}
+
+/*
+ * enableRequest_1_6InvalidArgs: validate that fails with invalid arguments
+ */
+TEST_P(WifiNanIfaceHidlTest, enableRequest_1_6InvalidArgs) {
+ uint16_t inputCmdId = 10;
+ callbackType = INVALID;
+ ::android::hardware::wifi::V1_4::NanEnableRequest nanEnableRequest = {};
+ ::android::hardware::wifi::V1_6::NanConfigRequestSupplemental nanConfigRequestSupp = {};
+ const auto& halStatus = HIDL_INVOKE(iwifiNanIface, enableRequest_1_6, inputCmdId,
+ nanEnableRequest, nanConfigRequestSupp);
+ if (halStatus.code != WifiStatusCode::ERROR_NOT_SUPPORTED) {
+ ASSERT_EQ(WifiStatusCode::SUCCESS, halStatus.code);
+
+ // wait for a callback
+ ASSERT_EQ(std::cv_status::no_timeout, wait(NOTIFY_ENABLE_RESPONSE));
+ ASSERT_EQ(NOTIFY_ENABLE_RESPONSE, callbackType);
+ ASSERT_EQ(id, inputCmdId);
+ ASSERT_EQ(status.status, NanStatusType::INVALID_ARGS);
+ }
+}
+
+/*
+ * enableRequest_1_6ShimInvalidArgs: validate that fails with invalid arguments
+ * to the shim
+ */
+TEST_P(WifiNanIfaceHidlTest, enableRequest_1_6ShimInvalidArgs) {
+ uint16_t inputCmdId = 10;
+ ::android::hardware::wifi::V1_4::NanEnableRequest nanEnableRequest = {};
+ nanEnableRequest.configParams.numberOfPublishServiceIdsInBeacon = 128; // must be <= 127
+ ::android::hardware::wifi::V1_6::NanConfigRequestSupplemental nanConfigRequestSupp = {};
+ const auto& halStatus = HIDL_INVOKE(iwifiNanIface, enableRequest_1_6, inputCmdId,
+ nanEnableRequest, nanConfigRequestSupp);
+ if (halStatus.code != WifiStatusCode::ERROR_NOT_SUPPORTED) {
+ ASSERT_EQ(WifiStatusCode::ERROR_INVALID_ARGS, halStatus.code);
+ }
+}
+
+/*
+ * configRequest_1_6InvalidArgs: validate that fails with invalid arguments
+ */
+TEST_P(WifiNanIfaceHidlTest, configRequest_1_6InvalidArgs) {
+ uint16_t inputCmdId = 10;
+ callbackType = INVALID;
+ ::android::hardware::wifi::V1_4::NanConfigRequest nanConfigRequest = {};
+ ::android::hardware::wifi::V1_6::NanConfigRequestSupplemental nanConfigRequestSupp = {};
+ const auto& halStatus = HIDL_INVOKE(iwifiNanIface, configRequest_1_6, inputCmdId,
+ nanConfigRequest, nanConfigRequestSupp);
+
+ if (halStatus.code != WifiStatusCode::ERROR_NOT_SUPPORTED) {
+ ASSERT_EQ(WifiStatusCode::SUCCESS, halStatus.code);
+
+ // wait for a callback
+ ASSERT_EQ(std::cv_status::no_timeout, wait(NOTIFY_CONFIG_RESPONSE));
+ ASSERT_EQ(NOTIFY_CONFIG_RESPONSE, callbackType);
+ ASSERT_EQ(id, inputCmdId);
+ ASSERT_EQ(status.status, NanStatusType::INVALID_ARGS);
+ }
+}
+
+/*
+ * configRequest_1_6ShimInvalidArgs: validate that fails with invalid arguments
+ * to the shim
+ */
+TEST_P(WifiNanIfaceHidlTest, configRequest_1_6ShimInvalidArgs) {
+ uint16_t inputCmdId = 10;
+ ::android::hardware::wifi::V1_4::NanConfigRequest nanConfigRequest = {};
+ nanConfigRequest.numberOfPublishServiceIdsInBeacon = 128; // must be <= 127
+ ::android::hardware::wifi::V1_6::NanConfigRequestSupplemental nanConfigRequestSupp = {};
+ const auto& halStatus = HIDL_INVOKE(iwifiNanIface, configRequest_1_6, inputCmdId,
+ nanConfigRequest, nanConfigRequestSupp);
+ if (halStatus.code != WifiStatusCode::ERROR_NOT_SUPPORTED) {
+ ASSERT_EQ(WifiStatusCode::ERROR_INVALID_ARGS, halStatus.code);
+ }
+}
+
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(WifiNanIfaceHidlTest);
+INSTANTIATE_TEST_SUITE_P(PerInstance, WifiNanIfaceHidlTest,
+ testing::ValuesIn(android::hardware::getAllHalInstanceNames(
+ ::android::hardware::wifi::V1_6::IWifi::descriptor)),
+ android::hardware::PrintInstanceNameToString);
diff --git a/wifi/1.6/vts/functional/wifi_rtt_controller_hidl_test.cpp b/wifi/1.6/vts/functional/wifi_rtt_controller_hidl_test.cpp
new file mode 100644
index 0000000..5b5e623
--- /dev/null
+++ b/wifi/1.6/vts/functional/wifi_rtt_controller_hidl_test.cpp
@@ -0,0 +1,295 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <VtsHalHidlTargetCallbackBase.h>
+#include <android-base/logging.h>
+
+#undef NAN // NAN is defined in bionic/libc/include/math.h:38
+
+#include <VtsCoreUtil.h>
+#include <android/hardware/wifi/1.6/IWifi.h>
+#include <android/hardware/wifi/1.6/IWifiChip.h>
+#include <android/hardware/wifi/1.6/IWifiRttController.h>
+#include <android/hardware/wifi/1.6/IWifiRttControllerEventCallback.h>
+#include <android/hardware/wifi/1.6/IWifiStaIface.h>
+#include <gtest/gtest.h>
+#include <hidl/GtestPrinter.h>
+#include <hidl/ServiceManagement.h>
+
+#include "wifi_hidl_call_util.h"
+#include "wifi_hidl_test_utils.h"
+
+using ::android::sp;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+using ::android::hardware::wifi::V1_0::CommandId;
+using ::android::hardware::wifi::V1_0::RttPeerType;
+using ::android::hardware::wifi::V1_0::RttType;
+using ::android::hardware::wifi::V1_0::WifiStatus;
+using ::android::hardware::wifi::V1_0::WifiStatusCode;
+using ::android::hardware::wifi::V1_6::IWifiChip;
+using ::android::hardware::wifi::V1_6::IWifiRttController;
+using ::android::hardware::wifi::V1_6::IWifiRttControllerEventCallback;
+using ::android::hardware::wifi::V1_6::IWifiStaIface;
+using ::android::hardware::wifi::V1_6::RttBw;
+using ::android::hardware::wifi::V1_6::RttCapabilities;
+using ::android::hardware::wifi::V1_6::RttConfig;
+using ::android::hardware::wifi::V1_6::RttPreamble;
+using ::android::hardware::wifi::V1_6::RttResponder;
+using ::android::hardware::wifi::V1_6::RttResult;
+using ::android::hardware::wifi::V1_6::WifiChannelInfo;
+using ::android::hardware::wifi::V1_6::WifiChannelWidthInMhz;
+
+/**
+ * Fixture to use for all RTT controller HIDL interface tests.
+ */
+class WifiRttControllerHidlTest : public ::testing::TestWithParam<std::string> {
+ public:
+ virtual void SetUp() override {
+ if (!::testing::deviceSupportsFeature("android.hardware.wifi.rtt"))
+ GTEST_SKIP() << "Skipping this test since RTT is not supported.";
+ // Make sure to start with a clean state
+ stopWifi(GetInstanceName());
+
+ wifi_rtt_controller_ = getWifiRttController();
+ ASSERT_NE(nullptr, wifi_rtt_controller_.get());
+
+ // Check RTT support before we run the test.
+ std::pair<WifiStatus, RttCapabilities> status_and_caps;
+ status_and_caps = HIDL_INVOKE(wifi_rtt_controller_, getCapabilities_1_6);
+ if (status_and_caps.first.code == WifiStatusCode::ERROR_NOT_SUPPORTED) {
+ GTEST_SKIP() << "Skipping this test since RTT is not supported.";
+ }
+ }
+
+ virtual void TearDown() override { stopWifi(GetInstanceName()); }
+
+ // A simple test implementation of WifiRttControllerEventCallback.
+ class WifiRttControllerEventCallback
+ : public ::testing::VtsHalHidlTargetCallbackBase<WifiRttControllerHidlTest>,
+ public IWifiRttControllerEventCallback {
+ public:
+ WifiRttControllerEventCallback(){};
+
+ virtual ~WifiRttControllerEventCallback() = default;
+
+ Return<void> onResults(CommandId cmdId __unused,
+ const hidl_vec<::android::hardware::wifi::V1_0::RttResult>& results
+ __unused) {
+ return Void();
+ };
+
+ Return<void> onResults_1_4(
+ CommandId cmdId __unused,
+ const hidl_vec<::android::hardware::wifi::V1_4::RttResult>& results __unused) {
+ return Void();
+ };
+
+ Return<void> onResults_1_6(CommandId cmdId __unused,
+ const hidl_vec<RttResult>& results __unused) {
+ return Void();
+ };
+ };
+
+ protected:
+ sp<IWifiRttController> wifi_rtt_controller_;
+
+ private:
+ std::string GetInstanceName() { return GetParam(); }
+
+ sp<IWifiRttController> getWifiRttController() {
+ const std::string& instance_name = GetInstanceName();
+
+ sp<IWifiChip> wifi_chip = IWifiChip::castFrom(getWifiChip(instance_name));
+ EXPECT_NE(nullptr, wifi_chip.get());
+
+ sp<IWifiStaIface> wifi_sta_iface = IWifiStaIface::castFrom(getWifiStaIface(instance_name));
+ EXPECT_NE(nullptr, wifi_sta_iface.get());
+
+ const auto& status_and_controller =
+ HIDL_INVOKE(wifi_chip, createRttController_1_6, wifi_sta_iface);
+ EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_controller.first.code);
+ EXPECT_NE(nullptr, status_and_controller.second.get());
+
+ return status_and_controller.second.get();
+ }
+};
+
+/*
+ * registerEventCallback_1_6
+ * This test case tests the registerEventCallback_1_6() API which registers
+ * a call back function with the hal implementation
+ *
+ * Note: it is not feasible to test the invocation of the call back function
+ * since event is triggered internally in the HAL implementation, and can not be
+ * triggered from the test case
+ */
+TEST_P(WifiRttControllerHidlTest, RegisterEventCallback_1_6) {
+ sp<WifiRttControllerEventCallback> wifiRttControllerEventCallback =
+ new WifiRttControllerEventCallback();
+ const auto& status = HIDL_INVOKE(wifi_rtt_controller_, registerEventCallback_1_6,
+ wifiRttControllerEventCallback);
+ EXPECT_EQ(WifiStatusCode::SUCCESS, status.code);
+}
+
+/*
+ * Request2SidedRangeMeasurement
+ * This test case tests the two sided ranging - 802.11mc FTM protocol.
+ */
+TEST_P(WifiRttControllerHidlTest, Request2SidedRangeMeasurement) {
+ std::pair<WifiStatus, RttCapabilities> status_and_caps;
+
+ // Get the Capabilities
+ status_and_caps = HIDL_INVOKE(wifi_rtt_controller_, getCapabilities_1_6);
+ EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_caps.first.code);
+ if (!status_and_caps.second.rttFtmSupported) {
+ GTEST_SKIP() << "Skipping two sided RTT since driver/fw doesn't support";
+ }
+ std::vector<RttConfig> configs;
+ RttConfig config;
+ int cmdId = 55;
+ // Set the config with test data
+ for (int i = 0; i < 6; i++) {
+ config.addr[i] = i;
+ }
+ config.type = RttType::TWO_SIDED;
+ config.peer = RttPeerType::AP;
+ config.channel.width = WifiChannelWidthInMhz::WIDTH_80;
+ config.channel.centerFreq = 5180;
+ config.channel.centerFreq0 = 5210;
+ config.channel.centerFreq1 = 0;
+ config.bw = RttBw::BW_20MHZ;
+ config.preamble = RttPreamble::HT;
+ config.mustRequestLci = false;
+ config.mustRequestLcr = false;
+ config.burstPeriod = 0;
+ config.numBurst = 0;
+ config.numFramesPerBurst = 8;
+ config.numRetriesPerRttFrame = 0;
+ config.numRetriesPerFtmr = 0;
+ config.burstDuration = 9;
+ // Insert config in the vector
+ configs.push_back(config);
+
+ // Invoke the call
+ const auto& status = HIDL_INVOKE(wifi_rtt_controller_, rangeRequest_1_6, cmdId, configs);
+ EXPECT_EQ(WifiStatusCode::SUCCESS, status.code);
+ // sleep for 2 seconds to wait for driver/firmware to complete RTT
+ sleep(2);
+}
+
+/*
+ * rangeRequest_1_6
+ */
+TEST_P(WifiRttControllerHidlTest, RangeRequest_1_6) {
+ std::pair<WifiStatus, RttCapabilities> status_and_caps;
+
+ // Get the Capabilities
+ status_and_caps = HIDL_INVOKE(wifi_rtt_controller_, getCapabilities_1_6);
+ EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_caps.first.code);
+ if (!status_and_caps.second.rttOneSidedSupported) {
+ GTEST_SKIP() << "Skipping one sided RTT since driver/fw doesn't support";
+ }
+ // Get the highest support preamble
+ int preamble = 1;
+ status_and_caps.second.preambleSupport >>= 1;
+ while (status_and_caps.second.preambleSupport != 0) {
+ status_and_caps.second.preambleSupport >>= 1;
+ preamble <<= 1;
+ }
+ std::vector<RttConfig> configs;
+ RttConfig config;
+ int cmdId = 55;
+ // Set the config with test data
+ for (int i = 0; i < 6; i++) {
+ config.addr[i] = i;
+ }
+ config.type = RttType::ONE_SIDED;
+ config.peer = RttPeerType::AP;
+ config.channel.width = WifiChannelWidthInMhz::WIDTH_80;
+ config.channel.centerFreq = 5765;
+ config.channel.centerFreq0 = 5775;
+ config.channel.centerFreq1 = 0;
+ config.bw = RttBw::BW_80MHZ;
+ config.preamble = (RttPreamble)preamble;
+ config.mustRequestLci = false;
+ config.mustRequestLcr = false;
+ config.burstPeriod = 0;
+ config.numBurst = 0;
+ config.numFramesPerBurst = 8;
+ config.numRetriesPerRttFrame = 3;
+ config.numRetriesPerFtmr = 3;
+ config.burstDuration = 9;
+ // Insert config in the vector
+ configs.push_back(config);
+
+ // Invoke the call
+ const auto& status = HIDL_INVOKE(wifi_rtt_controller_, rangeRequest_1_6, cmdId, configs);
+ EXPECT_EQ(WifiStatusCode::SUCCESS, status.code);
+ // sleep for 2 seconds to wait for driver/firmware to complete RTT
+ sleep(2);
+}
+
+/*
+ * getCapabilities_1_6
+ */
+TEST_P(WifiRttControllerHidlTest, GetCapabilities_1_6) {
+ std::pair<WifiStatus, RttCapabilities> status_and_caps;
+
+ // Invoke the call
+ status_and_caps = HIDL_INVOKE(wifi_rtt_controller_, getCapabilities_1_6);
+ EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_caps.first.code);
+}
+
+/*
+ * getResponderInfo_1_6
+ */
+TEST_P(WifiRttControllerHidlTest, GetResponderInfo_1_6) {
+ std::pair<WifiStatus, RttResponder> status_and_info;
+
+ // Invoke the call
+ status_and_info = HIDL_INVOKE(wifi_rtt_controller_, getResponderInfo_1_6);
+ EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_info.first.code);
+}
+
+/*
+ * enableResponder_1_6
+ */
+TEST_P(WifiRttControllerHidlTest, EnableResponder_1_6) {
+ std::pair<WifiStatus, RttResponder> status_and_info;
+ int cmdId = 55;
+ WifiChannelInfo channelInfo;
+ channelInfo.width = WifiChannelWidthInMhz::WIDTH_80;
+ channelInfo.centerFreq = 5660;
+ channelInfo.centerFreq0 = 5660;
+ channelInfo.centerFreq1 = 0;
+
+ // Get the responder first
+ status_and_info = HIDL_INVOKE(wifi_rtt_controller_, getResponderInfo_1_6);
+ EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_info.first.code);
+
+ // Invoke the call
+ const auto& status = HIDL_INVOKE(wifi_rtt_controller_, enableResponder_1_6, cmdId, channelInfo,
+ 10, status_and_info.second);
+ EXPECT_EQ(WifiStatusCode::SUCCESS, status.code);
+}
+
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(WifiRttControllerHidlTest);
+INSTANTIATE_TEST_SUITE_P(PerInstance, WifiRttControllerHidlTest,
+ testing::ValuesIn(android::hardware::getAllHalInstanceNames(
+ ::android::hardware::wifi::V1_6::IWifi::descriptor)),
+ android::hardware::PrintInstanceNameToString);
diff --git a/wifi/1.6/vts/functional/wifi_sta_iface_hidl_test.cpp b/wifi/1.6/vts/functional/wifi_sta_iface_hidl_test.cpp
new file mode 100644
index 0000000..4a6fd27
--- /dev/null
+++ b/wifi/1.6/vts/functional/wifi_sta_iface_hidl_test.cpp
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Staache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <numeric>
+#include <vector>
+
+#include <android-base/logging.h>
+
+#include <android/hardware/wifi/1.6/IWifi.h>
+#include <android/hardware/wifi/1.6/IWifiChip.h>
+#include <android/hardware/wifi/1.6/IWifiStaIface.h>
+#include <gtest/gtest.h>
+#include <hidl/GtestPrinter.h>
+#include <hidl/ServiceManagement.h>
+
+#include "wifi_hidl_call_util.h"
+#include "wifi_hidl_test_utils.h"
+
+using ::android::sp;
+using ::android::hardware::hidl_array;
+using ::android::hardware::wifi::V1_0::WifiStatus;
+using ::android::hardware::wifi::V1_0::WifiStatusCode;
+using ::android::hardware::wifi::V1_6::IWifiChip;
+using ::android::hardware::wifi::V1_6::IWifiStaIface;
+
+/**
+ * Fixture to use for all STA Iface HIDL interface tests.
+ */
+class WifiStaIfaceHidlTest : public ::testing::TestWithParam<std::string> {
+ public:
+ virtual void SetUp() override {
+ // Make sure to start with a clean state
+ stopWifi(GetInstanceName());
+
+ wifi_sta_iface_ = IWifiStaIface::castFrom(getWifiStaIface(GetInstanceName()));
+ ASSERT_NE(nullptr, wifi_sta_iface_.get());
+ }
+
+ virtual void TearDown() override { stopWifi(GetInstanceName()); }
+
+ protected:
+ bool isCapabilitySupported(IWifiStaIface::StaIfaceCapabilityMask cap_mask) {
+ const auto& status_and_caps = HIDL_INVOKE(wifi_sta_iface_, getCapabilities);
+ EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_caps.first.code);
+ return (status_and_caps.second & cap_mask) != 0;
+ }
+
+ WifiStatusCode createStaIface(sp<IWifiStaIface>* sta_iface) {
+ sp<IWifiChip> wifi_chip = IWifiChip::castFrom(getWifiChip(GetInstanceName()));
+ EXPECT_NE(nullptr, wifi_chip.get());
+ const auto& status_and_iface = HIDL_INVOKE(wifi_chip, createStaIface);
+ *sta_iface = IWifiStaIface::castFrom(status_and_iface.second);
+ return status_and_iface.first.code;
+ }
+
+ sp<IWifiStaIface> wifi_sta_iface_;
+
+ private:
+ std::string GetInstanceName() { return GetParam(); }
+};
+
+/*
+ * GetLinkLayerStats_1_6
+ * Ensures that calls to get link layer stats V1_6 will retrieve a non-empty
+ * StaLinkLayerStats after link layer stats collection is enabled.
+ */
+TEST_P(WifiStaIfaceHidlTest, GetLinkLayerStats_1_6) {
+ if (!isCapabilitySupported(IWifiStaIface::StaIfaceCapabilityMask::LINK_LAYER_STATS)) {
+ GTEST_SKIP() << "Skipping this test since link layer stats are not supported.";
+ }
+
+ // Enable link layer stats collection.
+ EXPECT_EQ(WifiStatusCode::SUCCESS,
+ HIDL_INVOKE(wifi_sta_iface_, enableLinkLayerStatsCollection, true).code);
+ // Retrieve link layer stats.
+ const auto& status_and_stats = HIDL_INVOKE(wifi_sta_iface_, getLinkLayerStats_1_6);
+ EXPECT_EQ(WifiStatusCode::SUCCESS, status_and_stats.first.code);
+ EXPECT_GT(status_and_stats.second.timeStampInMs, 0u);
+ // Try to create 2nd iface. If yes, it should fill in the duty cycle field.
+ sp<IWifiStaIface> iface;
+ auto status = createStaIface(&iface);
+ if (status == WifiStatusCode::SUCCESS) {
+ EXPECT_GT(status_and_stats.second.iface.timeSliceDutyCycleInPercent, 0u);
+ }
+ // Disable link layer stats collection.
+ EXPECT_EQ(WifiStatusCode::SUCCESS,
+ HIDL_INVOKE(wifi_sta_iface_, disableLinkLayerStatsCollection).code);
+}
+
+GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(WifiStaIfaceHidlTest);
+INSTANTIATE_TEST_SUITE_P(PerInstance, WifiStaIfaceHidlTest,
+ testing::ValuesIn(android::hardware::getAllHalInstanceNames(
+ ::android::hardware::wifi::V1_6::IWifi::descriptor)),
+ android::hardware::PrintInstanceNameToString);
diff --git a/wifi/hostapd/aidl/aidl_api/android.hardware.wifi.hostapd/current/android/hardware/wifi/hostapd/Generation.aidl b/wifi/hostapd/aidl/aidl_api/android.hardware.wifi.hostapd/current/android/hardware/wifi/hostapd/Generation.aidl
index af0e960..5bb0d32 100644
--- a/wifi/hostapd/aidl/aidl_api/android.hardware.wifi.hostapd/current/android/hardware/wifi/hostapd/Generation.aidl
+++ b/wifi/hostapd/aidl/aidl_api/android.hardware.wifi.hostapd/current/android/hardware/wifi/hostapd/Generation.aidl
@@ -38,7 +38,7 @@
WIFI_STANDARD_LEGACY = 0,
WIFI_STANDARD_11N = 1,
WIFI_STANDARD_11AC = 2,
- WIFI_STANDARD_11AX = 3,
- WIFI_STANDARD_11AD = 4,
+ WIFI_STANDARD_11AD = 3,
+ WIFI_STANDARD_11AX = 4,
WIFI_STANDARD_11BE = 5,
}
diff --git a/wifi/hostapd/aidl/android/hardware/wifi/hostapd/Generation.aidl b/wifi/hostapd/aidl/android/hardware/wifi/hostapd/Generation.aidl
index f4e3eb0..5b74732 100644
--- a/wifi/hostapd/aidl/android/hardware/wifi/hostapd/Generation.aidl
+++ b/wifi/hostapd/aidl/android/hardware/wifi/hostapd/Generation.aidl
@@ -25,8 +25,8 @@
* WIFI_STANDARD_11N = [hw_mode is HOSTAPD_MODE_IEEE80211G and (HT is 1 or HT40 is 1)] or
* [hw_mode is HOSTAPD_MODE_IEEE80211A and VHT is 0].
* WIFI_STANDARD_11AC = hw_mode is HOSTAPD_MODE_IEEE80211A and VHT is 1.
- * WIFI_STANDARD_11AX = hw_mode is HOSTAPD_MODE_IEEE80211A and High Efficiency supported.
* WIFI_STANDARD_11AD = hw_mode is HOSTAPD_MODE_IEEE80211AD.
+ * WIFI_STANDARD_11AX = hw_mode is HOSTAPD_MODE_IEEE80211A and High Efficiency supported.
* WIFI_STANDARD_11BE = hw_mode is HOSTAPD_MODE_IEEE80211A and Extreme High Throughput supported.
*/
@VintfStability
@@ -36,7 +36,7 @@
WIFI_STANDARD_LEGACY = 0,
WIFI_STANDARD_11N = 1,
WIFI_STANDARD_11AC = 2,
- WIFI_STANDARD_11AX = 3,
- WIFI_STANDARD_11AD = 4,
+ WIFI_STANDARD_11AD = 3,
+ WIFI_STANDARD_11AX = 4,
WIFI_STANDARD_11BE = 5,
}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/AuxiliarySupplicantEventCode.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/AuxiliarySupplicantEventCode.aidl
new file mode 100644
index 0000000..471cfff
--- /dev/null
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/AuxiliarySupplicantEventCode.aidl
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+///////////////////////////////////////////////////////////////////////////////
+// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. //
+///////////////////////////////////////////////////////////////////////////////
+
+// This file is a snapshot of an AIDL file. Do not edit it manually. There are
+// two cases:
+// 1). this is a frozen version file - do not edit this in any case.
+// 2). this is a 'current' file. If you make a backwards compatible change to
+// the interface (from the latest frozen version), the build system will
+// prompt you to update this file with `m <name>-update-api`.
+//
+// You must not make a backward incompatible change to any AIDL file built
+// with the aidl_interface module type with versions property set. The module
+// type is used to build AIDL files in a way that they can be used across
+// independently updatable components of the system. If a device is shipped
+// with such a backward incompatible change, it has a high risk of breaking
+// later when a module using the interface is updated, e.g., Mainline modules.
+
+package android.hardware.wifi.supplicant;
+@Backing(type="int") @VintfStability
+enum AuxiliarySupplicantEventCode {
+ EAP_METHOD_SELECTED = 0,
+ SSID_TEMP_DISABLED = 1,
+ OPEN_SSL_FAILURE = 2,
+}
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicant.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicant.aidl
index b4371fd..4b26ac3 100644
--- a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicant.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicant.aidl
@@ -34,11 +34,11 @@
package android.hardware.wifi.supplicant;
@VintfStability
interface ISupplicant {
- android.hardware.wifi.supplicant.ISupplicantP2pIface addP2pInterface(in String ifName);
- android.hardware.wifi.supplicant.ISupplicantStaIface addStaInterface(in String ifName);
+ @PropagateAllowBlocking android.hardware.wifi.supplicant.ISupplicantP2pIface addP2pInterface(in String ifName);
+ @PropagateAllowBlocking android.hardware.wifi.supplicant.ISupplicantStaIface addStaInterface(in String ifName);
android.hardware.wifi.supplicant.DebugLevel getDebugLevel();
- android.hardware.wifi.supplicant.ISupplicantP2pIface getP2pInterface(in String ifName);
- android.hardware.wifi.supplicant.ISupplicantStaIface getStaInterface(in String ifName);
+ @PropagateAllowBlocking android.hardware.wifi.supplicant.ISupplicantP2pIface getP2pInterface(in String ifName);
+ @PropagateAllowBlocking android.hardware.wifi.supplicant.ISupplicantStaIface getStaInterface(in String ifName);
boolean isDebugShowKeysEnabled();
boolean isDebugShowTimestampEnabled();
android.hardware.wifi.supplicant.IfaceInfo[] listInterfaces();
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantP2pIface.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantP2pIface.aidl
index d7eff76..e204184 100644
--- a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantP2pIface.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantP2pIface.aidl
@@ -37,7 +37,7 @@
void addBonjourService(in byte[] query, in byte[] response);
void addGroup(in boolean persistent, in int persistentNetworkId);
void addGroupWithConfig(in byte[] ssid, in String pskPassphrase, in boolean persistent, in int freq, in byte[] peerAddress, in boolean joinExistingGroup);
- android.hardware.wifi.supplicant.ISupplicantP2pNetwork addNetwork();
+ @PropagateAllowBlocking android.hardware.wifi.supplicant.ISupplicantP2pNetwork addNetwork();
void addUpnpService(in int version, in String serviceName);
void cancelConnect();
void cancelServiceDiscovery(in long identifier);
@@ -54,7 +54,7 @@
boolean getEdmg();
android.hardware.wifi.supplicant.P2pGroupCapabilityMask getGroupCapability(in byte[] peerAddress);
String getName();
- android.hardware.wifi.supplicant.ISupplicantP2pNetwork getNetwork(in int id);
+ @PropagateAllowBlocking android.hardware.wifi.supplicant.ISupplicantP2pNetwork getNetwork(in int id);
byte[] getSsid(in byte[] peerAddress);
android.hardware.wifi.supplicant.IfaceType getType();
void invite(in String groupIfName, in byte[] goDeviceAddress, in byte[] peerAddress);
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantStaIface.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantStaIface.aidl
index 9293bfd..53d5770 100644
--- a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantStaIface.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantStaIface.aidl
@@ -36,7 +36,7 @@
interface ISupplicantStaIface {
int addDppPeerUri(in String uri);
int addExtRadioWork(in String name, in int freqInMhz, in int timeoutInSec);
- android.hardware.wifi.supplicant.ISupplicantStaNetwork addNetwork();
+ @PropagateAllowBlocking android.hardware.wifi.supplicant.ISupplicantStaNetwork addNetwork();
void addRxFilter(in android.hardware.wifi.supplicant.RxFilterType type);
void cancelWps();
void disconnect();
@@ -50,7 +50,7 @@
android.hardware.wifi.supplicant.KeyMgmtMask getKeyMgmtCapabilities();
byte[] getMacAddress();
String getName();
- android.hardware.wifi.supplicant.ISupplicantStaNetwork getNetwork(in int id);
+ @PropagateAllowBlocking android.hardware.wifi.supplicant.ISupplicantStaNetwork getNetwork(in int id);
android.hardware.wifi.supplicant.IfaceType getType();
android.hardware.wifi.supplicant.WpaDriverCapabilitiesMask getWpaDriverCapabilities();
void initiateAnqpQuery(in byte[] macAddress, in android.hardware.wifi.supplicant.AnqpInfoId[] infoElements, in android.hardware.wifi.supplicant.Hs20AnqpSubtypes[] subTypes);
@@ -64,7 +64,7 @@
void reconnect();
void registerCallback(in android.hardware.wifi.supplicant.ISupplicantStaIfaceCallback callback);
void setQosPolicyFeatureEnabled(in boolean enable);
- void sendQosPolicyResponse(in boolean morePolicies, in android.hardware.wifi.supplicant.QosPolicyStatus[] qosPolicyStatusList);
+ void sendQosPolicyResponse(in int qosPolicyRequestId, in boolean morePolicies, in android.hardware.wifi.supplicant.QosPolicyStatus[] qosPolicyStatusList);
void removeAllQosPolicies();
void removeDppUri(in int id);
void removeExtRadioWork(in int id);
diff --git a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.aidl b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.aidl
index 8d11d41..46c8000 100644
--- a/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.aidl
+++ b/wifi/supplicant/aidl/aidl_api/android.hardware.wifi.supplicant/current/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.aidl
@@ -37,6 +37,7 @@
oneway void onAnqpQueryDone(in byte[] bssid, in android.hardware.wifi.supplicant.AnqpData data, in android.hardware.wifi.supplicant.Hs20AnqpData hs20Data);
oneway void onAssociationRejected(in android.hardware.wifi.supplicant.AssociationRejectionData assocRejectData);
oneway void onAuthenticationTimeout(in byte[] bssid);
+ oneway void onAuxiliarySupplicantEvent(in android.hardware.wifi.supplicant.AuxiliarySupplicantEventCode eventCode, in byte[] bssid, in String reasonString);
oneway void onBssTmHandlingDone(in android.hardware.wifi.supplicant.BssTmData tmData);
oneway void onBssidChanged(in android.hardware.wifi.supplicant.BssidChangeReason reason, in byte[] bssid);
oneway void onDisconnected(in byte[] bssid, in boolean locallyGenerated, in android.hardware.wifi.supplicant.StaIfaceReasonCode reasonCode);
@@ -61,5 +62,5 @@
oneway void onWpsEventPbcOverlap();
oneway void onWpsEventSuccess();
oneway void onQosPolicyReset();
- oneway void onQosPolicyRequest(in android.hardware.wifi.supplicant.QosPolicyData[] qosPolicyData);
+ oneway void onQosPolicyRequest(in int qosPolicyRequestId, in android.hardware.wifi.supplicant.QosPolicyData[] qosPolicyData);
}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/AuxiliarySupplicantEventCode.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/AuxiliarySupplicantEventCode.aidl
new file mode 100644
index 0000000..c0035c4
--- /dev/null
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/AuxiliarySupplicantEventCode.aidl
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.wifi.supplicant;
+
+/**
+ * Event codes for auxiliary events that can be generated by
+ * the supplicant. This includes events that are not major
+ * state changes (e.g. Connected, Disconnected), but that the
+ * client may still want to be alerted about.
+ */
+@VintfStability
+@Backing(type="int")
+enum AuxiliarySupplicantEventCode {
+ EAP_METHOD_SELECTED,
+ SSID_TEMP_DISABLED,
+ OPEN_SSL_FAILURE
+}
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicant.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicant.aidl
index 2ac1db7..c17289d 100644
--- a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicant.aidl
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicant.aidl
@@ -46,8 +46,8 @@
* |SupplicantStatusCode.FAILURE_UNKNOWN|,
* |SupplicantStatusCode.FAILURE_IFACE_EXISTS|
*/
- ISupplicantP2pIface addP2pInterface(in String ifName);
- ISupplicantStaIface addStaInterface(in String ifName);
+ @PropagateAllowBlocking ISupplicantP2pIface addP2pInterface(in String ifName);
+ @PropagateAllowBlocking ISupplicantStaIface addStaInterface(in String ifName);
/**
* Get the debug level set.
@@ -68,8 +68,8 @@
* |SupplicantStatusCode.FAILURE_UNKNOWN|,
* |SupplicantStatusCode.FAILURE_IFACE_UNKNOWN|
*/
- ISupplicantP2pIface getP2pInterface(in String ifName);
- ISupplicantStaIface getStaInterface(in String ifName);
+ @PropagateAllowBlocking ISupplicantP2pIface getP2pInterface(in String ifName);
+ @PropagateAllowBlocking ISupplicantStaIface getStaInterface(in String ifName);
/**
* Get whether the keys are shown in the debug logs or not.
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantP2pIface.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantP2pIface.aidl
index 9021bf5..313ee8b 100644
--- a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantP2pIface.aidl
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantP2pIface.aidl
@@ -104,7 +104,7 @@
* |SupplicantStatusCode.FAILURE_UNKNOWN|,
* |SupplicantStatusCode.FAILURE_IFACE_INVALID|
*/
- ISupplicantP2pNetwork addNetwork();
+ @PropagateAllowBlocking ISupplicantP2pNetwork addNetwork();
/**
* This command can be used to add a UPNP service.
@@ -321,7 +321,7 @@
* |SupplicantStatusCode.FAILURE_IFACE_INVALID|,
* |SupplicantStatusCode.FAILURE_NETWORK_UNKNOWN|
*/
- ISupplicantP2pNetwork getNetwork(in int id);
+ @PropagateAllowBlocking ISupplicantP2pNetwork getNetwork(in int id);
/**
* Gets the operational SSID of the device.
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantStaIface.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantStaIface.aidl
index 8ab0c82..9edf210 100644
--- a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantStaIface.aidl
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantStaIface.aidl
@@ -88,7 +88,7 @@
* |SupplicantStatusCode.FAILURE_UNKNOWN|,
* |SupplicantStatusCode.FAILURE_IFACE_INVALID|
*/
- ISupplicantStaNetwork addNetwork();
+ @PropagateAllowBlocking ISupplicantStaNetwork addNetwork();
/**
* Send driver command to add the specified RX filter.
@@ -260,7 +260,7 @@
* |SupplicantStatusCode.FAILURE_IFACE_INVALID|,
* |SupplicantStatusCode.FAILURE_NETWORK_UNKNOWN|
*/
- ISupplicantStaNetwork getNetwork(in int id);
+ @PropagateAllowBlocking ISupplicantStaNetwork getNetwork(in int id);
/**
* Retrieves the type of the network interface.
@@ -418,6 +418,7 @@
* sends a solicited (uses the ongoing DSCP request as dialog token) DSCP
* response. Otherwise, sends an unsolicited DSCP response.
*
+ * @param qosPolicyRequestId Dialog token to identify the request.
* @param morePolicies Flag to indicate more QoS policies can be accommodated.
* @param qosPolicyStatusList QoS policy status info for each QoS policy id.
* @throws ServiceSpecificException with one of the following values:
@@ -425,7 +426,8 @@
* |SupplicantStatusCode.FAILURE_UNKNOWN|,
* |SupplicantStatusCode.FAILURE_UNSUPPORTED|
*/
- void sendQosPolicyResponse(in boolean morePolicies, in QosPolicyStatus[] qosPolicyStatusList);
+ void sendQosPolicyResponse(in int qosPolicyRequestId, in boolean morePolicies,
+ in QosPolicyStatus[] qosPolicyStatusList);
/**
* Indicate removal of all active QoS policies configured by the AP.
diff --git a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.aidl b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.aidl
index ade68f0..895bc50 100644
--- a/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.aidl
+++ b/wifi/supplicant/aidl/android/hardware/wifi/supplicant/ISupplicantStaIfaceCallback.aidl
@@ -18,6 +18,7 @@
import android.hardware.wifi.supplicant.AnqpData;
import android.hardware.wifi.supplicant.AssociationRejectionData;
+import android.hardware.wifi.supplicant.AuxiliarySupplicantEventCode;
import android.hardware.wifi.supplicant.BssTmData;
import android.hardware.wifi.supplicant.BssidChangeReason;
import android.hardware.wifi.supplicant.DppAkm;
@@ -71,6 +72,16 @@
void onAuthenticationTimeout(in byte[] bssid);
/**
+ * Indicates that an auxiliary event was generated by the supplicant.
+ *
+ * @param eventCode |AuxiliarySupplicantEventCode| for the event that occurred.
+ * @param bssid BSSID of the AP which caused the event.
+ * @param reasonString Additional information about why the event occurred.
+ */
+ void onAuxiliarySupplicantEvent(
+ in AuxiliarySupplicantEventCode eventCode, in byte[] bssid, in String reasonString);
+
+ /**
* Indicates BTM request frame handling status.
*
* @param tmData Data retrieved from received BSS transition management
@@ -287,7 +298,8 @@
/**
* Used to indicate a DSCP request was received from the AP.
*
+ * @param qosPolicyRequestId Dialog token to identify the request.
* @param qosPolicyData QoS policies info requested by the AP.
*/
- void onQosPolicyRequest(in QosPolicyData[] qosPolicyData);
+ void onQosPolicyRequest(in int qosPolicyRequestId, in QosPolicyData[] qosPolicyData);
}
diff --git a/wifi/supplicant/aidl/vts/functional/supplicant_sta_iface_aidl_test.cpp b/wifi/supplicant/aidl/vts/functional/supplicant_sta_iface_aidl_test.cpp
index fdafe08..1c00ec7 100644
--- a/wifi/supplicant/aidl/vts/functional/supplicant_sta_iface_aidl_test.cpp
+++ b/wifi/supplicant/aidl/vts/functional/supplicant_sta_iface_aidl_test.cpp
@@ -79,6 +79,13 @@
const std::vector<uint8_t>& /* bssid */) override {
return ndk::ScopedAStatus::ok();
}
+ ::ndk::ScopedAStatus onAuxiliarySupplicantEvent(
+ ::aidl::android::hardware::wifi::supplicant ::
+ AuxiliarySupplicantEventCode /* eventCode */,
+ const std::vector<uint8_t>& /* bssid */,
+ const std::string& /* reasonString */) override {
+ return ndk::ScopedAStatus::ok();
+ }
::ndk::ScopedAStatus onBssTmHandlingDone(
const ::aidl::android::hardware::wifi::supplicant::
BssTmData& /* tmData */) override {
@@ -194,6 +201,7 @@
}
::ndk::ScopedAStatus onQosPolicyReset() override { return ndk::ScopedAStatus::ok(); }
::ndk::ScopedAStatus onQosPolicyRequest(
+ int32_t /* qosPolicyRequestId */,
const std::vector<::aidl::android::hardware::wifi::supplicant ::
QosPolicyData /* qosPolicyData */>&) override {
return ndk::ScopedAStatus::ok();