xref: /aosp_15_r20/hardware/interfaces/bluetooth/audio/aidl/default/BluetoothAudioProvider.h (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker #pragma once
17*4d7e907cSAndroid Build Coastguard Worker 
18*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/bluetooth/audio/BnBluetoothAudioProvider.h>
19*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/bluetooth/audio/LatencyMode.h>
20*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/bluetooth/audio/SessionType.h>
21*4d7e907cSAndroid Build Coastguard Worker #include <fmq/AidlMessageQueue.h>
22*4d7e907cSAndroid Build Coastguard Worker 
23*4d7e907cSAndroid Build Coastguard Worker using ::aidl::android::hardware::common::fmq::MQDescriptor;
24*4d7e907cSAndroid Build Coastguard Worker using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite;
25*4d7e907cSAndroid Build Coastguard Worker using ::android::AidlMessageQueue;
26*4d7e907cSAndroid Build Coastguard Worker 
27*4d7e907cSAndroid Build Coastguard Worker using MqDataType = int8_t;
28*4d7e907cSAndroid Build Coastguard Worker using MqDataMode = SynchronizedReadWrite;
29*4d7e907cSAndroid Build Coastguard Worker using DataMQ = AidlMessageQueue<MqDataType, MqDataMode>;
30*4d7e907cSAndroid Build Coastguard Worker using DataMQDesc = MQDescriptor<MqDataType, MqDataMode>;
31*4d7e907cSAndroid Build Coastguard Worker 
32*4d7e907cSAndroid Build Coastguard Worker namespace aidl {
33*4d7e907cSAndroid Build Coastguard Worker namespace android {
34*4d7e907cSAndroid Build Coastguard Worker namespace hardware {
35*4d7e907cSAndroid Build Coastguard Worker namespace bluetooth {
36*4d7e907cSAndroid Build Coastguard Worker namespace audio {
37*4d7e907cSAndroid Build Coastguard Worker 
38*4d7e907cSAndroid Build Coastguard Worker /// Enable flag for the reference implementation for A2dp Codec
39*4d7e907cSAndroid Build Coastguard Worker /// Extensibility.
40*4d7e907cSAndroid Build Coastguard Worker ///
41*4d7e907cSAndroid Build Coastguard Worker /// A2dp Codec extensibility cannot be enabled until the following
42*4d7e907cSAndroid Build Coastguard Worker /// requirements are fulfilled.
43*4d7e907cSAndroid Build Coastguard Worker ///
44*4d7e907cSAndroid Build Coastguard Worker ///  1. The Bluetooth controller must support the HCI Requirements
45*4d7e907cSAndroid Build Coastguard Worker ///     v1.04 or later, and must support the vendor HCI command
46*4d7e907cSAndroid Build Coastguard Worker ///     A2DP Offload Start (v2), A2DP Offload Stop (v2) as indicated
47*4d7e907cSAndroid Build Coastguard Worker ///     by the field a2dp_offload_v2 of the vendor capabilities.
48*4d7e907cSAndroid Build Coastguard Worker ///
49*4d7e907cSAndroid Build Coastguard Worker ///  2. The implementation of the provider must be completed with
50*4d7e907cSAndroid Build Coastguard Worker ///     DSP configuration for streaming.
51*4d7e907cSAndroid Build Coastguard Worker enum : bool {
52*4d7e907cSAndroid Build Coastguard Worker   kEnableA2dpCodecExtensibility = false,
53*4d7e907cSAndroid Build Coastguard Worker };
54*4d7e907cSAndroid Build Coastguard Worker 
55*4d7e907cSAndroid Build Coastguard Worker class BluetoothAudioProvider : public BnBluetoothAudioProvider {
56*4d7e907cSAndroid Build Coastguard Worker  public:
57*4d7e907cSAndroid Build Coastguard Worker   BluetoothAudioProvider();
58*4d7e907cSAndroid Build Coastguard Worker   ndk::ScopedAStatus startSession(
59*4d7e907cSAndroid Build Coastguard Worker       const std::shared_ptr<IBluetoothAudioPort>& host_if,
60*4d7e907cSAndroid Build Coastguard Worker       const AudioConfiguration& audio_config,
61*4d7e907cSAndroid Build Coastguard Worker       const std::vector<LatencyMode>& latency_modes, DataMQDesc* _aidl_return);
62*4d7e907cSAndroid Build Coastguard Worker   ndk::ScopedAStatus endSession();
63*4d7e907cSAndroid Build Coastguard Worker   ndk::ScopedAStatus streamStarted(BluetoothAudioStatus status);
64*4d7e907cSAndroid Build Coastguard Worker   ndk::ScopedAStatus streamSuspended(BluetoothAudioStatus status);
65*4d7e907cSAndroid Build Coastguard Worker   ndk::ScopedAStatus updateAudioConfiguration(
66*4d7e907cSAndroid Build Coastguard Worker       const AudioConfiguration& audio_config);
67*4d7e907cSAndroid Build Coastguard Worker   ndk::ScopedAStatus setLowLatencyModeAllowed(bool allowed);
68*4d7e907cSAndroid Build Coastguard Worker   ndk::ScopedAStatus setCodecPriority(
69*4d7e907cSAndroid Build Coastguard Worker       const ::aidl::android::hardware::bluetooth::audio::CodecId& in_codecId,
70*4d7e907cSAndroid Build Coastguard Worker       int32_t in_priority) override;
71*4d7e907cSAndroid Build Coastguard Worker   ndk::ScopedAStatus getLeAudioAseConfiguration(
72*4d7e907cSAndroid Build Coastguard Worker       const std::optional<std::vector<std::optional<
73*4d7e907cSAndroid Build Coastguard Worker           ::aidl::android::hardware::bluetooth::audio::IBluetoothAudioProvider::
74*4d7e907cSAndroid Build Coastguard Worker               LeAudioDeviceCapabilities>>>& in_remoteSinkAudioCapabilities,
75*4d7e907cSAndroid Build Coastguard Worker       const std::optional<std::vector<std::optional<
76*4d7e907cSAndroid Build Coastguard Worker           ::aidl::android::hardware::bluetooth::audio::IBluetoothAudioProvider::
77*4d7e907cSAndroid Build Coastguard Worker               LeAudioDeviceCapabilities>>>& in_remoteSourceAudioCapabilities,
78*4d7e907cSAndroid Build Coastguard Worker       const std::vector<
79*4d7e907cSAndroid Build Coastguard Worker           ::aidl::android::hardware::bluetooth::audio::IBluetoothAudioProvider::
80*4d7e907cSAndroid Build Coastguard Worker               LeAudioConfigurationRequirement>& in_requirements,
81*4d7e907cSAndroid Build Coastguard Worker       std::vector<::aidl::android::hardware::bluetooth::audio::
82*4d7e907cSAndroid Build Coastguard Worker                       IBluetoothAudioProvider::LeAudioAseConfigurationSetting>*
83*4d7e907cSAndroid Build Coastguard Worker           _aidl_return) override;
84*4d7e907cSAndroid Build Coastguard Worker   ndk::ScopedAStatus getLeAudioAseQosConfiguration(
85*4d7e907cSAndroid Build Coastguard Worker       const ::aidl::android::hardware::bluetooth::audio::
86*4d7e907cSAndroid Build Coastguard Worker           IBluetoothAudioProvider::LeAudioAseQosConfigurationRequirement&
87*4d7e907cSAndroid Build Coastguard Worker               in_qosRequirement,
88*4d7e907cSAndroid Build Coastguard Worker       ::aidl::android::hardware::bluetooth::audio::IBluetoothAudioProvider::
89*4d7e907cSAndroid Build Coastguard Worker           LeAudioAseQosConfigurationPair* _aidl_return) override;
90*4d7e907cSAndroid Build Coastguard Worker   ndk::ScopedAStatus getLeAudioAseDatapathConfiguration(
91*4d7e907cSAndroid Build Coastguard Worker       const std::optional<::aidl::android::hardware::bluetooth::audio::
92*4d7e907cSAndroid Build Coastguard Worker                               IBluetoothAudioProvider::StreamConfig>&
93*4d7e907cSAndroid Build Coastguard Worker           in_sinkConfig,
94*4d7e907cSAndroid Build Coastguard Worker       const std::optional<::aidl::android::hardware::bluetooth::audio::
95*4d7e907cSAndroid Build Coastguard Worker                               IBluetoothAudioProvider::StreamConfig>&
96*4d7e907cSAndroid Build Coastguard Worker           in_sourceConfig,
97*4d7e907cSAndroid Build Coastguard Worker       ::aidl::android::hardware::bluetooth::audio::IBluetoothAudioProvider::
98*4d7e907cSAndroid Build Coastguard Worker           LeAudioDataPathConfigurationPair* _aidl_return) override;
99*4d7e907cSAndroid Build Coastguard Worker   ndk::ScopedAStatus onSinkAseMetadataChanged(
100*4d7e907cSAndroid Build Coastguard Worker       ::aidl::android::hardware::bluetooth::audio::IBluetoothAudioProvider::
101*4d7e907cSAndroid Build Coastguard Worker           AseState in_state,
102*4d7e907cSAndroid Build Coastguard Worker       int32_t cigId, int32_t cisId,
103*4d7e907cSAndroid Build Coastguard Worker       const std::optional<std::vector<std::optional<
104*4d7e907cSAndroid Build Coastguard Worker           ::aidl::android::hardware::bluetooth::audio::MetadataLtv>>>&
105*4d7e907cSAndroid Build Coastguard Worker           in_metadata) override;
106*4d7e907cSAndroid Build Coastguard Worker   ndk::ScopedAStatus onSourceAseMetadataChanged(
107*4d7e907cSAndroid Build Coastguard Worker       ::aidl::android::hardware::bluetooth::audio::IBluetoothAudioProvider::
108*4d7e907cSAndroid Build Coastguard Worker           AseState in_state,
109*4d7e907cSAndroid Build Coastguard Worker       int32_t cigId, int32_t cisId,
110*4d7e907cSAndroid Build Coastguard Worker       const std::optional<std::vector<std::optional<
111*4d7e907cSAndroid Build Coastguard Worker           ::aidl::android::hardware::bluetooth::audio::MetadataLtv>>>&
112*4d7e907cSAndroid Build Coastguard Worker           in_metadata) override;
113*4d7e907cSAndroid Build Coastguard Worker   ndk::ScopedAStatus getLeAudioBroadcastConfiguration(
114*4d7e907cSAndroid Build Coastguard Worker       const std::optional<std::vector<std::optional<
115*4d7e907cSAndroid Build Coastguard Worker           ::aidl::android::hardware::bluetooth::audio::IBluetoothAudioProvider::
116*4d7e907cSAndroid Build Coastguard Worker               LeAudioDeviceCapabilities>>>& in_remoteSinkAudioCapabilities,
117*4d7e907cSAndroid Build Coastguard Worker       const ::aidl::android::hardware::bluetooth::audio::
118*4d7e907cSAndroid Build Coastguard Worker           IBluetoothAudioProvider::LeAudioBroadcastConfigurationRequirement&
119*4d7e907cSAndroid Build Coastguard Worker               in_requirement,
120*4d7e907cSAndroid Build Coastguard Worker       ::aidl::android::hardware::bluetooth::audio::IBluetoothAudioProvider::
121*4d7e907cSAndroid Build Coastguard Worker           LeAudioBroadcastConfigurationSetting* _aidl_return) override;
122*4d7e907cSAndroid Build Coastguard Worker   ndk::ScopedAStatus getLeAudioBroadcastDatapathConfiguration(
123*4d7e907cSAndroid Build Coastguard Worker       const ::aidl::android::hardware::bluetooth::audio::AudioContext&
124*4d7e907cSAndroid Build Coastguard Worker           in_context,
125*4d7e907cSAndroid Build Coastguard Worker       const std::vector<::aidl::android::hardware::bluetooth::audio::
126*4d7e907cSAndroid Build Coastguard Worker                             LeAudioBroadcastConfiguration::BroadcastStreamMap>&
127*4d7e907cSAndroid Build Coastguard Worker           in_streamMap,
128*4d7e907cSAndroid Build Coastguard Worker       ::aidl::android::hardware::bluetooth::audio::IBluetoothAudioProvider::
129*4d7e907cSAndroid Build Coastguard Worker           LeAudioDataPathConfiguration* _aidl_return) override;
130*4d7e907cSAndroid Build Coastguard Worker 
131*4d7e907cSAndroid Build Coastguard Worker   ndk::ScopedAStatus parseA2dpConfiguration(
132*4d7e907cSAndroid Build Coastguard Worker       const CodecId& codec_id, const std::vector<uint8_t>& configuration,
133*4d7e907cSAndroid Build Coastguard Worker       CodecParameters* codec_parameters, A2dpStatus* _aidl_return);
134*4d7e907cSAndroid Build Coastguard Worker   ndk::ScopedAStatus getA2dpConfiguration(
135*4d7e907cSAndroid Build Coastguard Worker       const std::vector<A2dpRemoteCapabilities>& remote_a2dp_capabilities,
136*4d7e907cSAndroid Build Coastguard Worker       const A2dpConfigurationHint& hint,
137*4d7e907cSAndroid Build Coastguard Worker       std::optional<audio::A2dpConfiguration>* _aidl_return);
138*4d7e907cSAndroid Build Coastguard Worker 
139*4d7e907cSAndroid Build Coastguard Worker   virtual bool isValid(const SessionType& sessionType) = 0;
140*4d7e907cSAndroid Build Coastguard Worker 
141*4d7e907cSAndroid Build Coastguard Worker  protected:
142*4d7e907cSAndroid Build Coastguard Worker   virtual ndk::ScopedAStatus onSessionReady(DataMQDesc* _aidl_return) = 0;
143*4d7e907cSAndroid Build Coastguard Worker 
144*4d7e907cSAndroid Build Coastguard Worker   ::ndk::ScopedAIBinder_DeathRecipient death_recipient_;
145*4d7e907cSAndroid Build Coastguard Worker 
146*4d7e907cSAndroid Build Coastguard Worker   std::shared_ptr<IBluetoothAudioPort> stack_iface_;
147*4d7e907cSAndroid Build Coastguard Worker   std::unique_ptr<AudioConfiguration> audio_config_ = nullptr;
148*4d7e907cSAndroid Build Coastguard Worker   SessionType session_type_;
149*4d7e907cSAndroid Build Coastguard Worker   std::vector<LatencyMode> latency_modes_;
150*4d7e907cSAndroid Build Coastguard Worker };
151*4d7e907cSAndroid Build Coastguard Worker }  // namespace audio
152*4d7e907cSAndroid Build Coastguard Worker }  // namespace bluetooth
153*4d7e907cSAndroid Build Coastguard Worker }  // namespace hardware
154*4d7e907cSAndroid Build Coastguard Worker }  // namespace android
155*4d7e907cSAndroid Build Coastguard Worker }  // namespace aidl
156