blob: 38af1ff62d9c502560b8b2f99f109dabecde3305 [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 Do64956922024-07-04 11:12:49 +0800142 valid_direction_configurations);
Bao Do6112bda2023-11-15 03:57:59 +0000143 std::optional<LeAudioAseConfigurationSetting>
144 getCapabilitiesMatchedAseConfigurationSettings(
145 IBluetoothAudioProvider::LeAudioAseConfigurationSetting& setting,
146 const IBluetoothAudioProvider::LeAudioDeviceCapabilities& capabilities,
147 uint8_t direction);
148 std::optional<LeAudioAseConfigurationSetting>
149 getRequirementMatchedAseConfigurationSettings(
150 IBluetoothAudioProvider::LeAudioAseConfigurationSetting& setting,
151 const IBluetoothAudioProvider::LeAudioConfigurationRequirement&
Bao Do64956922024-07-04 11:12:49 +0800152 requirement);
Bao Doc4adf242023-11-15 08:03:20 +0000153 bool isMatchedQosRequirement(LeAudioAseQosConfiguration setting_qos,
154 AseQosDirectionRequirement requirement_qos);
Bao Do5b2fdab2023-11-20 08:02:55 +0000155 std::optional<LeAudioBroadcastConfigurationSetting>
156 getCapabilitiesMatchedBroadcastConfigurationSettings(
157 LeAudioBroadcastConfigurationSetting& setting,
158 const IBluetoothAudioProvider::LeAudioDeviceCapabilities& capabilities);
159 void getBroadcastSettings();
Bao Do91d7ca22024-05-09 14:21:01 +0800160 std::optional<LeAudioAseQosConfiguration> getDirectionQosConfiguration(
161 uint8_t direction,
162 const IBluetoothAudioProvider::LeAudioAseQosConfigurationRequirement&
163 qosRequirement,
Bao Do81092bb2024-05-30 21:27:10 +0800164 std::vector<LeAudioAseConfigurationSetting>& ase_configuration_settings,
165 bool is_exact);
Bao Do91d7ca22024-05-09 14:21:01 +0800166 bool isSubgroupConfigurationMatchedContext(
167 AudioContext requirement_context,
Bao Do81092bb2024-05-30 21:27:10 +0800168 IBluetoothAudioProvider::BroadcastQuality quality,
Bao Do91d7ca22024-05-09 14:21:01 +0800169 LeAudioBroadcastSubgroupConfiguration configuration);
Bao Do57861bd2024-05-23 17:02:54 +0800170 std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>
171 matchWithRequirement(
172 std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>&
173 matched_ase_configuration_settings,
174 const std::vector<
175 IBluetoothAudioProvider::LeAudioConfigurationRequirement>&
Bao Do64956922024-07-04 11:12:49 +0800176 in_requirements);
Josh Wu6ab53e72021-12-29 23:53:33 -0800177};
178
179class LeAudioOffloadOutputAudioProvider : public LeAudioOffloadAudioProvider {
180 public:
181 LeAudioOffloadOutputAudioProvider();
182};
183
184class LeAudioOffloadInputAudioProvider : public LeAudioOffloadAudioProvider {
185 public:
186 LeAudioOffloadInputAudioProvider();
187};
188
Alice Kuoe80a5762022-02-09 14:44:29 +0800189class LeAudioOffloadBroadcastAudioProvider
190 : public LeAudioOffloadAudioProvider {
191 public:
192 LeAudioOffloadBroadcastAudioProvider();
193};
194
Josh Wu6ab53e72021-12-29 23:53:33 -0800195} // namespace audio
196} // namespace bluetooth
197} // namespace hardware
198} // namespace android
199} // namespace aidl