/* * 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. */ #pragma once #include #include "BluetoothAudioProvider.h" #include "aidl/android/hardware/bluetooth/audio/LeAudioAseConfiguration.h" #include "aidl/android/hardware/bluetooth/audio/MetadataLtv.h" #include "aidl/android/hardware/bluetooth/audio/SessionType.h" namespace aidl { namespace android { namespace hardware { namespace bluetooth { namespace audio { using LeAudioAseConfigurationSetting = IBluetoothAudioProvider::LeAudioAseConfigurationSetting; using AseDirectionRequirement = IBluetoothAudioProvider:: LeAudioConfigurationRequirement::AseDirectionRequirement; using AseDirectionConfiguration = IBluetoothAudioProvider:: LeAudioAseConfigurationSetting::AseDirectionConfiguration; using AseQosDirectionRequirement = IBluetoothAudioProvider:: LeAudioAseQosConfigurationRequirement::AseQosDirectionRequirement; using LeAudioAseQosConfiguration = IBluetoothAudioProvider::LeAudioAseQosConfiguration; using LeAudioBroadcastConfigurationSetting = IBluetoothAudioProvider::LeAudioBroadcastConfigurationSetting; class LeAudioOffloadAudioProvider : public BluetoothAudioProvider { public: LeAudioOffloadAudioProvider(); bool isValid(const SessionType& sessionType) override; ndk::ScopedAStatus startSession( const std::shared_ptr& host_if, const AudioConfiguration& audio_config, const std::vector& latency_modes, DataMQDesc* _aidl_return); ndk::ScopedAStatus setCodecPriority(const CodecId& in_codecId, int32_t in_priority) override; ndk::ScopedAStatus getLeAudioAseConfiguration( const std::optional>>& in_remoteSinkAudioCapabilities, const std::optional>>& in_remoteSourceAudioCapabilities, const std::vector< IBluetoothAudioProvider::LeAudioConfigurationRequirement>& in_requirements, std::vector* _aidl_return) override; ndk::ScopedAStatus getLeAudioAseQosConfiguration( const IBluetoothAudioProvider::LeAudioAseQosConfigurationRequirement& in_qosRequirement, IBluetoothAudioProvider::LeAudioAseQosConfigurationPair* _aidl_return) override; ndk::ScopedAStatus onSourceAseMetadataChanged( IBluetoothAudioProvider::AseState in_state, int32_t in_cigId, int32_t in_cisId, const std::optional>>& in_metadata) override; ndk::ScopedAStatus onSinkAseMetadataChanged( IBluetoothAudioProvider::AseState in_state, int32_t in_cigId, int32_t in_cisId, const std::optional>>& in_metadata) override; ndk::ScopedAStatus getLeAudioBroadcastConfiguration( const std::optional>>& in_remoteSinkAudioCapabilities, const IBluetoothAudioProvider::LeAudioBroadcastConfigurationRequirement& in_requirement, LeAudioBroadcastConfigurationSetting* _aidl_return) override; private: ndk::ScopedAStatus onSessionReady(DataMQDesc* _aidl_return) override; std::map codec_priority_map_; std::vector broadcast_settings; // Private matching function definitions bool isMatchedValidCodec(CodecId cfg_codec, CodecId req_codec); bool isCapabilitiesMatchedContext( AudioContext setting_context, const IBluetoothAudioProvider::LeAudioDeviceCapabilities& capabilities); bool isMatchedSamplingFreq( CodecSpecificConfigurationLtv::SamplingFrequency& cfg_freq, CodecSpecificCapabilitiesLtv::SupportedSamplingFrequencies& capability_freq); bool isMatchedFrameDuration( CodecSpecificConfigurationLtv::FrameDuration& cfg_fduration, CodecSpecificCapabilitiesLtv::SupportedFrameDurations& capability_fduration); bool isMatchedAudioChannel( CodecSpecificConfigurationLtv::AudioChannelAllocation& cfg_channel, CodecSpecificCapabilitiesLtv::SupportedAudioChannelCounts& capability_channel); bool isMatchedCodecFramesPerSDU( CodecSpecificConfigurationLtv::CodecFrameBlocksPerSDU& cfg_frame_sdu, CodecSpecificCapabilitiesLtv::SupportedMaxCodecFramesPerSDU& capability_frame_sdu); bool isMatchedOctetsPerCodecFrame( CodecSpecificConfigurationLtv::OctetsPerCodecFrame& cfg_octets, CodecSpecificCapabilitiesLtv::SupportedOctetsPerCodecFrame& capability_octets); bool isCapabilitiesMatchedCodecConfiguration( std::vector& codec_cfg, std::vector codec_capabilities); bool isMatchedAseConfiguration(LeAudioAseConfiguration setting_cfg, LeAudioAseConfiguration requirement_cfg); bool isMatchedBISConfiguration( LeAudioBisConfiguration bis_cfg, const IBluetoothAudioProvider::LeAudioDeviceCapabilities& capabilities); void filterCapabilitiesAseDirectionConfiguration( std::vector>& direction_configurations, const IBluetoothAudioProvider::LeAudioDeviceCapabilities& capabilities, std::vector>& valid_direction_configurations); void filterRequirementAseDirectionConfiguration( std::vector>& direction_configurations, const std::optional>>& requirements, std::vector>& valid_direction_configurations); std::optional getCapabilitiesMatchedAseConfigurationSettings( IBluetoothAudioProvider::LeAudioAseConfigurationSetting& setting, const IBluetoothAudioProvider::LeAudioDeviceCapabilities& capabilities, uint8_t direction); std::optional getRequirementMatchedAseConfigurationSettings( IBluetoothAudioProvider::LeAudioAseConfigurationSetting& setting, const IBluetoothAudioProvider::LeAudioConfigurationRequirement& requirement); bool isMatchedQosRequirement(LeAudioAseQosConfiguration setting_qos, AseQosDirectionRequirement requirement_qos); std::optional getCapabilitiesMatchedBroadcastConfigurationSettings( LeAudioBroadcastConfigurationSetting& setting, const IBluetoothAudioProvider::LeAudioDeviceCapabilities& capabilities); void getBroadcastSettings(); }; class LeAudioOffloadOutputAudioProvider : public LeAudioOffloadAudioProvider { public: LeAudioOffloadOutputAudioProvider(); }; class LeAudioOffloadInputAudioProvider : public LeAudioOffloadAudioProvider { public: LeAudioOffloadInputAudioProvider(); }; class LeAudioOffloadBroadcastAudioProvider : public LeAudioOffloadAudioProvider { public: LeAudioOffloadBroadcastAudioProvider(); }; } // namespace audio } // namespace bluetooth } // namespace hardware } // namespace android } // namespace aidl