blob: b6037c3c888ec3d3bc636b2bb4d3a63279449b85 [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"
Josh Wu6ab53e72021-12-29 23:53:33 -080024
25namespace aidl {
26namespace android {
27namespace hardware {
28namespace bluetooth {
29namespace audio {
30
Bao Do6112bda2023-11-15 03:57:59 +000031using LeAudioAseConfigurationSetting =
32 IBluetoothAudioProvider::LeAudioAseConfigurationSetting;
33using AseDirectionRequirement = IBluetoothAudioProvider::
34 LeAudioConfigurationRequirement::AseDirectionRequirement;
35using AseDirectionConfiguration = IBluetoothAudioProvider::
36 LeAudioAseConfigurationSetting::AseDirectionConfiguration;
Bao Doc4adf242023-11-15 08:03:20 +000037using AseQosDirectionRequirement = IBluetoothAudioProvider::
38 LeAudioAseQosConfigurationRequirement::AseQosDirectionRequirement;
39using LeAudioAseQosConfiguration =
40 IBluetoothAudioProvider::LeAudioAseQosConfiguration;
Bao Do6112bda2023-11-15 03:57:59 +000041
Josh Wu6ab53e72021-12-29 23:53:33 -080042class LeAudioOffloadAudioProvider : public BluetoothAudioProvider {
43 public:
44 LeAudioOffloadAudioProvider();
45
46 bool isValid(const SessionType& sessionType) override;
47
48 ndk::ScopedAStatus startSession(
49 const std::shared_ptr<IBluetoothAudioPort>& host_if,
Chen Chenc92270e2022-02-14 18:29:52 -080050 const AudioConfiguration& audio_config,
Bao Do6112bda2023-11-15 03:57:59 +000051 const std::vector<LatencyMode>& latency_modes, DataMQDesc* _aidl_return);
52 ndk::ScopedAStatus setCodecPriority(const CodecId& in_codecId,
53 int32_t in_priority) override;
54 ndk::ScopedAStatus getLeAudioAseConfiguration(
55 const std::optional<std::vector<
56 std::optional<IBluetoothAudioProvider::LeAudioDeviceCapabilities>>>&
57 in_remoteSinkAudioCapabilities,
58 const std::optional<std::vector<
59 std::optional<IBluetoothAudioProvider::LeAudioDeviceCapabilities>>>&
60 in_remoteSourceAudioCapabilities,
61 const std::vector<
62 IBluetoothAudioProvider::LeAudioConfigurationRequirement>&
63 in_requirements,
64 std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>*
65 _aidl_return) override;
66 ndk::ScopedAStatus getLeAudioAseQosConfiguration(
67 const IBluetoothAudioProvider::LeAudioAseQosConfigurationRequirement&
68 in_qosRequirement,
69 IBluetoothAudioProvider::LeAudioAseQosConfigurationPair* _aidl_return)
70 override;
71 ndk::ScopedAStatus onSinkAseMetadataChanged(
72 IBluetoothAudioProvider::AseState in_state,
73 const std::optional<std::vector<std::optional<MetadataLtv>>>& in_metadata)
74 override;
75 ndk::ScopedAStatus onSourceAseMetadataChanged(
76 IBluetoothAudioProvider::AseState in_state,
77 const std::optional<std::vector<std::optional<MetadataLtv>>>& in_metadata)
78 override;
79 ndk::ScopedAStatus getLeAudioBroadcastConfiguration(
80 const std::optional<std::vector<
81 std::optional<IBluetoothAudioProvider::LeAudioDeviceCapabilities>>>&
82 in_remoteSinkAudioCapabilities,
83 const IBluetoothAudioProvider::LeAudioBroadcastConfigurationRequirement&
84 in_requirement,
85 IBluetoothAudioProvider::LeAudioBroadcastConfigurationSetting*
86 _aidl_return) override;
Josh Wu6ab53e72021-12-29 23:53:33 -080087
88 private:
89 ndk::ScopedAStatus onSessionReady(DataMQDesc* _aidl_return) override;
Bao Do6112bda2023-11-15 03:57:59 +000090 std::map<CodecId, uint32_t> codec_priority_map_;
91
92 // Private matching function definitions
93 bool isMatchedValidCodec(CodecId cfg_codec, CodecId req_codec);
Bao Do867af602023-11-15 05:41:12 +000094 bool isCapabilitiesMatchedContext(
Bao Do6112bda2023-11-15 03:57:59 +000095 AudioContext setting_context,
96 const IBluetoothAudioProvider::LeAudioDeviceCapabilities& capabilities);
97 bool isMatchedSamplingFreq(
98 CodecSpecificConfigurationLtv::SamplingFrequency& cfg_freq,
99 CodecSpecificCapabilitiesLtv::SupportedSamplingFrequencies&
100 capability_freq);
101 bool isMatchedFrameDuration(
102 CodecSpecificConfigurationLtv::FrameDuration& cfg_fduration,
103 CodecSpecificCapabilitiesLtv::SupportedFrameDurations&
104 capability_fduration);
105 bool isMatchedAudioChannel(
106 CodecSpecificConfigurationLtv::AudioChannelAllocation& cfg_channel,
107 CodecSpecificCapabilitiesLtv::SupportedAudioChannelCounts&
108 capability_channel);
109 bool isMatchedCodecFramesPerSDU(
110 CodecSpecificConfigurationLtv::CodecFrameBlocksPerSDU& cfg_frame_sdu,
111 CodecSpecificCapabilitiesLtv::SupportedMaxCodecFramesPerSDU&
112 capability_frame_sdu);
113 bool isMatchedOctetsPerCodecFrame(
114 CodecSpecificConfigurationLtv::OctetsPerCodecFrame& cfg_octets,
115 CodecSpecificCapabilitiesLtv::SupportedOctetsPerCodecFrame&
116 capability_octets);
117 bool isCapabilitiesMatchedCodecConfiguration(
118 std::vector<CodecSpecificConfigurationLtv>& codec_cfg,
119 std::vector<CodecSpecificCapabilitiesLtv> codec_capabilities);
Bao Do867af602023-11-15 05:41:12 +0000120 bool isMatchedAseConfiguration(LeAudioAseConfiguration setting_cfg,
121 LeAudioAseConfiguration requirement_cfg);
Bao Do6112bda2023-11-15 03:57:59 +0000122 void filterCapabilitiesAseDirectionConfiguration(
123 std::vector<std::optional<AseDirectionConfiguration>>&
124 direction_configurations,
125 const IBluetoothAudioProvider::LeAudioDeviceCapabilities& capabilities,
126 std::vector<std::optional<AseDirectionConfiguration>>&
127 valid_direction_configurations);
128 void filterRequirementAseDirectionConfiguration(
129 std::vector<std::optional<AseDirectionConfiguration>>&
130 direction_configurations,
131 const std::optional<std::vector<std::optional<AseDirectionRequirement>>>&
132 requirements,
133 std::vector<std::optional<AseDirectionConfiguration>>&
134 valid_direction_configurations);
135 std::optional<LeAudioAseConfigurationSetting>
136 getCapabilitiesMatchedAseConfigurationSettings(
137 IBluetoothAudioProvider::LeAudioAseConfigurationSetting& setting,
138 const IBluetoothAudioProvider::LeAudioDeviceCapabilities& capabilities,
139 uint8_t direction);
140 std::optional<LeAudioAseConfigurationSetting>
141 getRequirementMatchedAseConfigurationSettings(
142 IBluetoothAudioProvider::LeAudioAseConfigurationSetting& setting,
143 const IBluetoothAudioProvider::LeAudioConfigurationRequirement&
144 requirement);
Bao Doc4adf242023-11-15 08:03:20 +0000145 bool isMatchedQosRequirement(LeAudioAseQosConfiguration setting_qos,
146 AseQosDirectionRequirement requirement_qos);
Josh Wu6ab53e72021-12-29 23:53:33 -0800147};
148
149class LeAudioOffloadOutputAudioProvider : public LeAudioOffloadAudioProvider {
150 public:
151 LeAudioOffloadOutputAudioProvider();
152};
153
154class LeAudioOffloadInputAudioProvider : public LeAudioOffloadAudioProvider {
155 public:
156 LeAudioOffloadInputAudioProvider();
157};
158
Alice Kuoe80a5762022-02-09 14:44:29 +0800159class LeAudioOffloadBroadcastAudioProvider
160 : public LeAudioOffloadAudioProvider {
161 public:
162 LeAudioOffloadBroadcastAudioProvider();
163};
164
Josh Wu6ab53e72021-12-29 23:53:33 -0800165} // namespace audio
166} // namespace bluetooth
167} // namespace hardware
168} // namespace android
169} // namespace aidl