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