blob: 043d923c839c4abf93e8aa323a646440f105ff5b [file] [log] [blame]
Josh Wu6ab53e72021-12-29 23:53:33 -08001/*
2 * Copyright (C) 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
Bao Do6112bda2023-11-15 03:57:59 +000019#include <map>
20
Josh Wu6ab53e72021-12-29 23:53:33 -080021#include "BluetoothAudioProvider.h"
Bao Do6112bda2023-11-15 03:57:59 +000022#include "aidl/android/hardware/bluetooth/audio/LeAudioAseConfiguration.h"
23#include "aidl/android/hardware/bluetooth/audio/MetadataLtv.h"
Bao Do5b2fdab2023-11-20 08:02:55 +000024#include "aidl/android/hardware/bluetooth/audio/SessionType.h"
Josh Wu6ab53e72021-12-29 23:53:33 -080025
26namespace aidl {
27namespace android {
28namespace hardware {
29namespace bluetooth {
30namespace audio {
31
Bao Do6112bda2023-11-15 03:57:59 +000032using LeAudioAseConfigurationSetting =
33 IBluetoothAudioProvider::LeAudioAseConfigurationSetting;
34using AseDirectionRequirement = IBluetoothAudioProvider::
35 LeAudioConfigurationRequirement::AseDirectionRequirement;
36using AseDirectionConfiguration = IBluetoothAudioProvider::
37 LeAudioAseConfigurationSetting::AseDirectionConfiguration;
Bao Doc4adf242023-11-15 08:03:20 +000038using AseQosDirectionRequirement = IBluetoothAudioProvider::
39 LeAudioAseQosConfigurationRequirement::AseQosDirectionRequirement;
40using LeAudioAseQosConfiguration =
41 IBluetoothAudioProvider::LeAudioAseQosConfiguration;
Bao Do5b2fdab2023-11-20 08:02:55 +000042using LeAudioBroadcastConfigurationSetting =
43 IBluetoothAudioProvider::LeAudioBroadcastConfigurationSetting;
Bao Do6112bda2023-11-15 03:57:59 +000044
Josh Wu6ab53e72021-12-29 23:53:33 -080045class LeAudioOffloadAudioProvider : public BluetoothAudioProvider {
46 public:
47 LeAudioOffloadAudioProvider();
48
49 bool isValid(const SessionType& sessionType) override;
50
51 ndk::ScopedAStatus startSession(
52 const std::shared_ptr<IBluetoothAudioPort>& host_if,
Chen Chenc92270e2022-02-14 18:29:52 -080053 const AudioConfiguration& audio_config,
Bao Do6112bda2023-11-15 03:57:59 +000054 const std::vector<LatencyMode>& latency_modes, DataMQDesc* _aidl_return);
55 ndk::ScopedAStatus setCodecPriority(const CodecId& in_codecId,
56 int32_t in_priority) override;
57 ndk::ScopedAStatus getLeAudioAseConfiguration(
58 const std::optional<std::vector<
59 std::optional<IBluetoothAudioProvider::LeAudioDeviceCapabilities>>>&
60 in_remoteSinkAudioCapabilities,
61 const std::optional<std::vector<
62 std::optional<IBluetoothAudioProvider::LeAudioDeviceCapabilities>>>&
63 in_remoteSourceAudioCapabilities,
64 const std::vector<
65 IBluetoothAudioProvider::LeAudioConfigurationRequirement>&
66 in_requirements,
67 std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>*
68 _aidl_return) override;
69 ndk::ScopedAStatus getLeAudioAseQosConfiguration(
70 const IBluetoothAudioProvider::LeAudioAseQosConfigurationRequirement&
71 in_qosRequirement,
72 IBluetoothAudioProvider::LeAudioAseQosConfigurationPair* _aidl_return)
73 override;
Bao Do5b2fdab2023-11-20 08:02:55 +000074 ndk::ScopedAStatus onSourceAseMetadataChanged(
75 IBluetoothAudioProvider::AseState in_state, int32_t in_cigId,
76 int32_t in_cisId,
Bao Do6112bda2023-11-15 03:57:59 +000077 const std::optional<std::vector<std::optional<MetadataLtv>>>& in_metadata)
78 override;
Bao Do5b2fdab2023-11-20 08:02:55 +000079 ndk::ScopedAStatus onSinkAseMetadataChanged(
80 IBluetoothAudioProvider::AseState in_state, int32_t in_cigId,
81 int32_t in_cisId,
Bao Do6112bda2023-11-15 03:57:59 +000082 const std::optional<std::vector<std::optional<MetadataLtv>>>& in_metadata)
83 override;
84 ndk::ScopedAStatus getLeAudioBroadcastConfiguration(
85 const std::optional<std::vector<
86 std::optional<IBluetoothAudioProvider::LeAudioDeviceCapabilities>>>&
87 in_remoteSinkAudioCapabilities,
88 const IBluetoothAudioProvider::LeAudioBroadcastConfigurationRequirement&
89 in_requirement,
Bao Do5b2fdab2023-11-20 08:02:55 +000090 LeAudioBroadcastConfigurationSetting* _aidl_return) override;
Josh Wu6ab53e72021-12-29 23:53:33 -080091
92 private:
93 ndk::ScopedAStatus onSessionReady(DataMQDesc* _aidl_return) override;
Bao Do6112bda2023-11-15 03:57:59 +000094 std::map<CodecId, uint32_t> codec_priority_map_;
Bao Do5b2fdab2023-11-20 08:02:55 +000095 std::vector<LeAudioBroadcastConfigurationSetting> broadcast_settings;
Bao Do6112bda2023-11-15 03:57:59 +000096
97 // Private matching function definitions
98 bool isMatchedValidCodec(CodecId cfg_codec, CodecId req_codec);
Bao Do91d7ca22024-05-09 14:21:01 +080099 bool filterCapabilitiesMatchedContext(
100 AudioContext& setting_context,
Bao Do6112bda2023-11-15 03:57:59 +0000101 const IBluetoothAudioProvider::LeAudioDeviceCapabilities& capabilities);
102 bool isMatchedSamplingFreq(
103 CodecSpecificConfigurationLtv::SamplingFrequency& cfg_freq,
104 CodecSpecificCapabilitiesLtv::SupportedSamplingFrequencies&
105 capability_freq);
106 bool isMatchedFrameDuration(
107 CodecSpecificConfigurationLtv::FrameDuration& cfg_fduration,
108 CodecSpecificCapabilitiesLtv::SupportedFrameDurations&
109 capability_fduration);
110 bool isMatchedAudioChannel(
111 CodecSpecificConfigurationLtv::AudioChannelAllocation& cfg_channel,
112 CodecSpecificCapabilitiesLtv::SupportedAudioChannelCounts&
113 capability_channel);
114 bool isMatchedCodecFramesPerSDU(
115 CodecSpecificConfigurationLtv::CodecFrameBlocksPerSDU& cfg_frame_sdu,
116 CodecSpecificCapabilitiesLtv::SupportedMaxCodecFramesPerSDU&
117 capability_frame_sdu);
118 bool isMatchedOctetsPerCodecFrame(
119 CodecSpecificConfigurationLtv::OctetsPerCodecFrame& cfg_octets,
120 CodecSpecificCapabilitiesLtv::SupportedOctetsPerCodecFrame&
121 capability_octets);
122 bool isCapabilitiesMatchedCodecConfiguration(
123 std::vector<CodecSpecificConfigurationLtv>& codec_cfg,
124 std::vector<CodecSpecificCapabilitiesLtv> codec_capabilities);
Bao Do57861bd2024-05-23 17:02:54 +0800125 bool filterMatchedAseConfiguration(
126 LeAudioAseConfiguration& setting_cfg,
127 const LeAudioAseConfiguration& requirement_cfg);
Bao Do5b2fdab2023-11-20 08:02:55 +0000128 bool isMatchedBISConfiguration(
129 LeAudioBisConfiguration bis_cfg,
130 const IBluetoothAudioProvider::LeAudioDeviceCapabilities& capabilities);
Bao Do6112bda2023-11-15 03:57:59 +0000131 void filterCapabilitiesAseDirectionConfiguration(
132 std::vector<std::optional<AseDirectionConfiguration>>&
133 direction_configurations,
134 const IBluetoothAudioProvider::LeAudioDeviceCapabilities& capabilities,
135 std::vector<std::optional<AseDirectionConfiguration>>&
136 valid_direction_configurations);
137 void filterRequirementAseDirectionConfiguration(
Bao Do91d7ca22024-05-09 14:21:01 +0800138 std::optional<std::vector<std::optional<AseDirectionConfiguration>>>&
Bao Do6112bda2023-11-15 03:57:59 +0000139 direction_configurations,
Bao Do91d7ca22024-05-09 14:21:01 +0800140 const std::vector<std::optional<AseDirectionRequirement>>& requirements,
141 std::optional<std::vector<std::optional<AseDirectionConfiguration>>>&
Bao Do81092bb2024-05-30 21:27:10 +0800142 valid_direction_configurations,
143 bool is_exact);
Bao Do6112bda2023-11-15 03:57:59 +0000144 std::optional<LeAudioAseConfigurationSetting>
145 getCapabilitiesMatchedAseConfigurationSettings(
146 IBluetoothAudioProvider::LeAudioAseConfigurationSetting& setting,
147 const IBluetoothAudioProvider::LeAudioDeviceCapabilities& capabilities,
148 uint8_t direction);
149 std::optional<LeAudioAseConfigurationSetting>
150 getRequirementMatchedAseConfigurationSettings(
151 IBluetoothAudioProvider::LeAudioAseConfigurationSetting& setting,
152 const IBluetoothAudioProvider::LeAudioConfigurationRequirement&
Bao Do81092bb2024-05-30 21:27:10 +0800153 requirement,
154 bool is_exact);
Bao Doc4adf242023-11-15 08:03:20 +0000155 bool isMatchedQosRequirement(LeAudioAseQosConfiguration setting_qos,
156 AseQosDirectionRequirement requirement_qos);
Bao Do5b2fdab2023-11-20 08:02:55 +0000157 std::optional<LeAudioBroadcastConfigurationSetting>
158 getCapabilitiesMatchedBroadcastConfigurationSettings(
159 LeAudioBroadcastConfigurationSetting& setting,
160 const IBluetoothAudioProvider::LeAudioDeviceCapabilities& capabilities);
161 void getBroadcastSettings();
Bao Do91d7ca22024-05-09 14:21:01 +0800162 std::optional<LeAudioAseQosConfiguration> getDirectionQosConfiguration(
163 uint8_t direction,
164 const IBluetoothAudioProvider::LeAudioAseQosConfigurationRequirement&
165 qosRequirement,
Bao Do81092bb2024-05-30 21:27:10 +0800166 std::vector<LeAudioAseConfigurationSetting>& ase_configuration_settings,
167 bool is_exact);
Bao Do91d7ca22024-05-09 14:21:01 +0800168 bool isSubgroupConfigurationMatchedContext(
169 AudioContext requirement_context,
Bao Do81092bb2024-05-30 21:27:10 +0800170 IBluetoothAudioProvider::BroadcastQuality quality,
Bao Do91d7ca22024-05-09 14:21:01 +0800171 LeAudioBroadcastSubgroupConfiguration configuration);
Bao Do57861bd2024-05-23 17:02:54 +0800172 std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>
173 matchWithRequirement(
174 std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>&
175 matched_ase_configuration_settings,
176 const std::vector<
177 IBluetoothAudioProvider::LeAudioConfigurationRequirement>&
Bao Do81092bb2024-05-30 21:27:10 +0800178 in_requirements,
179 bool is_exact);
Josh Wu6ab53e72021-12-29 23:53:33 -0800180};
181
182class LeAudioOffloadOutputAudioProvider : public LeAudioOffloadAudioProvider {
183 public:
184 LeAudioOffloadOutputAudioProvider();
185};
186
187class LeAudioOffloadInputAudioProvider : public LeAudioOffloadAudioProvider {
188 public:
189 LeAudioOffloadInputAudioProvider();
190};
191
Alice Kuoe80a5762022-02-09 14:44:29 +0800192class LeAudioOffloadBroadcastAudioProvider
193 : public LeAudioOffloadAudioProvider {
194 public:
195 LeAudioOffloadBroadcastAudioProvider();
196};
197
Josh Wu6ab53e72021-12-29 23:53:33 -0800198} // namespace audio
199} // namespace bluetooth
200} // namespace hardware
201} // namespace android
202} // namespace aidl