From 15874b1b33cf4fa95949c10a4ecea838f3db8b11 Mon Sep 17 00:00:00 2001 From: pramod kotreshappa Date: Fri, 3 Jan 2020 16:04:13 -0800 Subject: [PATCH] Bluetooth Audio HIDL 2.1 rev up BluetoothAudio HIDL rev-up for LC3 codec support Change-Id: I3339520267d56c988242fcb9b5b07d342a8fb9e3 --- bluetooth_audio/2.1/Android.bp | 18 +++ bluetooth_audio/2.1/IBluetoothAudioPort.hal | 39 +++++ .../2.1/IBluetoothAudioProvider.hal | 68 +++++++++ .../2.1/IBluetoothAudioProvidersFactory.hal | 79 ++++++++++ bluetooth_audio/2.1/types.hal | 143 ++++++++++++++++++ 5 files changed, 347 insertions(+) create mode 100644 bluetooth_audio/2.1/Android.bp create mode 100644 bluetooth_audio/2.1/IBluetoothAudioPort.hal create mode 100644 bluetooth_audio/2.1/IBluetoothAudioProvider.hal create mode 100644 bluetooth_audio/2.1/IBluetoothAudioProvidersFactory.hal create mode 100644 bluetooth_audio/2.1/types.hal diff --git a/bluetooth_audio/2.1/Android.bp b/bluetooth_audio/2.1/Android.bp new file mode 100644 index 0000000..c421ce2 --- /dev/null +++ b/bluetooth_audio/2.1/Android.bp @@ -0,0 +1,18 @@ +// This file is autogenerated by hidl-gen -Landroidbp. + +hidl_interface { + name: "vendor.qti.hardware.bluetooth_audio@2.1", + root: "vendor.qti.hardware.bluetooth_audio", + system_ext_specific: true, + srcs: [ + "types.hal", + "IBluetoothAudioPort.hal", + "IBluetoothAudioProvider.hal", + "IBluetoothAudioProvidersFactory.hal", + ], + interfaces: [ + "android.hidl.base@1.0", + "vendor.qti.hardware.bluetooth_audio@2.0", + ], + gen_java: false, +} diff --git a/bluetooth_audio/2.1/IBluetoothAudioPort.hal b/bluetooth_audio/2.1/IBluetoothAudioPort.hal new file mode 100644 index 0000000..896c8b6 --- /dev/null +++ b/bluetooth_audio/2.1/IBluetoothAudioPort.hal @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2019 The Linux Foundation. All rights reserved. + * Not a contribution. + */ + +/* + * Copyright 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package vendor.qti.hardware.bluetooth_audio@2.1; + +import @2.0::IBluetoothAudioPort; +/** + * HAL interface from the Audio HAL to the Bluetooth stack + * + * The Audio HAL calls methods in this interface to start, suspend, and stop + * an audio stream. These calls return immediately and the results, if any, + * are sent over the IBluetoothAudioProvider interface. + * + * Moreover, the Audio HAL can also get the presentation position of the stream + * and provide stream metadata. + * + * Note: For HIDL APIs with a "generates" statement, the callback parameter used + * for return value must be invoked synchronously before the API call returns. + */ +interface IBluetoothAudioPort extends @2.0::IBluetoothAudioPort { +}; diff --git a/bluetooth_audio/2.1/IBluetoothAudioProvider.hal b/bluetooth_audio/2.1/IBluetoothAudioProvider.hal new file mode 100644 index 0000000..ec174df --- /dev/null +++ b/bluetooth_audio/2.1/IBluetoothAudioProvider.hal @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2019 The Linux Foundation. All rights reserved. + * Not a contribution. + */ + +/* + * Copyright 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package vendor.qti.hardware.bluetooth_audio@2.1; + +import @2.0::IBluetoothAudioProvider; +import @2.1::IBluetoothAudioPort; +import @2.1::AudioConfiguration; +import @2.0::Status; +import @2.0::SessionParams; +/** + * HAL interface from the Bluetooth stack to the Audio HAL + * + * The Bluetooth stack calls methods in this interface to start and end audio + * sessions and sends callback events to the Audio HAL. + * + * Note: For HIDL APIs with a "generates" statement, the callback parameter used + * for return value must be invoked synchronously before the API call returns. + */ +interface IBluetoothAudioProvider extends @2.0::IBluetoothAudioProvider { + + /** + * This method indicates that the Bluetooth stack is ready to stream audio. + * It registers an instance of IBluetoothAudioPort with and provides the + * current negotiated codec to the Audio HAL. After this method is called, + * the Audio HAL can invoke IBluetoothAudioPort.startStream(). + * + * Note: endSession() must be called to unregister this IBluetoothAudioPort + * + * @param hostIf An instance of IBluetoothAudioPort for stream control + * @param audioConfig The audio configuration negotiated with the remote + * device. The PCM parameters are set if software based encoding, + * otherwise the correct codec configuration is used for hardware + * encoding. + * + * @return status One of the following + * SUCCESS if this IBluetoothAudioPort was successfully registered with + * the Audio HAL + * UNSUPPORTED_CODEC_CONFIGURATION if the Audio HAL cannot register this + * IBluetoothAudioPort with the given codec configuration + * FAILURE if the Audio HAL cannot register this IBluetoothAudioPort for + * any other reason + * @return dataMQ The fast message queue for audio data from this provider. + * Audio data will be in PCM format as specified by the + * audioConfig.pcmConfig parameter. + * Invalid if streaming is offloaded to hardware or on failure. + */ + startSession_2_1(IBluetoothAudioPort hostIf, AudioConfiguration audioConfig) + generates (Status status, fmq_sync dataMQ); +}; diff --git a/bluetooth_audio/2.1/IBluetoothAudioProvidersFactory.hal b/bluetooth_audio/2.1/IBluetoothAudioProvidersFactory.hal new file mode 100644 index 0000000..4573d38 --- /dev/null +++ b/bluetooth_audio/2.1/IBluetoothAudioProvidersFactory.hal @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2019 The Linux Foundation. All rights reserved. + * Not a contribution. + */ + +/* + * Copyright 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package vendor.qti.hardware.bluetooth_audio@2.1; + +import @2.0::IBluetoothAudioProvidersFactory; +import @2.1::IBluetoothAudioProvider; +import @2.1::AudioCapabilities; +import @2.0::SessionType; +import @2.0::Status; +/** + * This factory allows a HAL implementation to be split into multiple + * independent providers. + * + * When the Bluetooth stack is ready to create an audio session, it must first + * obtain the IBluetoothAudioProvider for that session type by calling + * openProvider(). + * + * Note: For HIDL APIs with a "generates" statement, the callback parameter used + * for return value must be invoked synchronously before the API call returns. + */ +interface IBluetoothAudioProvidersFactory extends @2.0::IBluetoothAudioProvidersFactory { + + /** + * Opens an audio provider for a session type. To close the provider, it is + * necessary to release references to the returned provider object. + * + * @param sessionType The session type (e.g. + * A2DP_SOFTWARE_ENCODING_DATAPATH). + * + * @return status One of the following + * SUCCESS if the Audio HAL successfully opens the provider with the + * given session type + * FAILURE if the Audio HAL cannot open the provider + * @return provider The provider of the specified session type + */ + openProvider_2_1(SessionType sessionType) + generates (Status status, IBluetoothAudioProvider provider); + + /** + * Gets a list of audio capabilities for a session type. + * + * For software encoding, the PCM capabilities are returned. + * For hardware encoding, the supported codecs and their capabilities are + * returned. + * + * @param sessionType The session type (e.g. + * A2DP_SOFTWARE_ENCODING_DATAPATH). + * @return audioCapabilities A list containing all the capabilities + * supported by the sesson type. The capabilities is a list of + * available options when configuring the codec for the session. + * For software encoding it is the PCM data rate. + * For hardware encoding it is the list of supported codecs and their + * capabilities. + * If a provider isn't supported, an empty list should be returned. + * Note: Only one entry should exist per codec when using hardware + * encoding. + */ + getProviderCapabilities_2_1(SessionType sessionType) + generates (vec audioCapabilities); +}; diff --git a/bluetooth_audio/2.1/types.hal b/bluetooth_audio/2.1/types.hal new file mode 100644 index 0000000..3bf47e5 --- /dev/null +++ b/bluetooth_audio/2.1/types.hal @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2019 The Linux Foundation. All rights reserved. + * Not a contribution. + */ + +/* + * Copyright 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package vendor.qti.hardware.bluetooth_audio@2.1; + +import @2.0::CodecType; +import @2.0::SampleRate; +import @2.0::ChannelMode; +import @2.0::SbcParameters; +import @2.0::AacParameters; +import @2.0::LdacParameters; +import @2.0::AptxParameters; +import @2.0::AptxAdaptiveParameters; +import @2.0::AptxTwsParameters; +import @2.0::BaCeltParameters; +import @2.0::PcmParameters; +import @2.0::BitsPerSample; + + +enum CodecType : @2.0::CodecType { + LC3 = 0x18, +}; + +enum ExtSampleRate : @2.0::SampleRate { + RATE_24000_2 = 0x100, + RATE_8000 = 0x200, +}; + +enum LC3ChannelMode : uint8_t { + UNKNOWN = 0x00, + STEREO = 0x01, + JOINT_STEREO = 0x02, + DUAL = 0x04, + MONO = 0x08, + CH_5_1 = 0x10, +}; +/** Used for Hardware Encoding LC3 codec parameters */ +struct lc3CodecConfig { + ExtSampleRate sampleRate; + LC3ChannelMode channelMode; + uint16_t octetsPerFrame; //Octets Per Codec Frame + uint16_t frameDuration; //7.5msec, 10msec + uint32_t bitrate; + BitsPerSample bitsPerSample; + uint8_t numBlocks; +}; + +/** Used for Hardware Encoding LC3 codec parameters */ +struct LC3Parameters { + lc3CodecConfig txConfig; + lc3CodecConfig rxConfig; + uint8_t rxConfigSet; //this shall be set if fromAirConfig Config is present + uint16_t rxLatency; + uint8_t decoderOuputChannels; + uint8_t mode; //0x01-Connected, 0x02-Broadcast, 0x03-Simulcast + uint8_t[16] codecSpecific; + uint8_t defaultQlevel; + uint8_t NumStreamIDGroup; + uint32_t[48] streamMap;//upto 16 stream id support +}; + +/** + * Used to specify the capabilities of the codecs supported by Hardware Encoding. + * AptX and AptX-HD both use the AptxParameters field. + */ +struct CodecCapabilities { + CodecType codecType; + + union Capabilities { + SbcParameters sbcCapabilities; + AacParameters aacCapabilities; + LdacParameters ldacCapabilities; + AptxParameters aptxCapabilities; + AptxAdaptiveParameters aptxAdaptiveCapabilities; + AptxTwsParameters aptxTwsCapabilities; + BaCeltParameters baCeltCapabilities; + LC3Parameters lc3Capabilities; + } capabilities; +}; + + +/** Used to specify the capabilities of the different session types. */ +union AudioCapabilities { + PcmParameters pcmCapabilities; + CodecCapabilities codecCapabilities; +}; + +/** + * Used to configure a Hardware Encoding session. + * AptX and AptX-HD both use the AptxParameters field. + */ +struct CodecConfiguration { + CodecType codecType; + /** + * The encoded audio bitrate in bits / second. + * 0x00000000 - The audio bitrate is not specified / unused + * 0x00000001 - 0x00FFFFFF - Encoded audio bitrate in bits/second + * 0x01000000 - 0xFFFFFFFF - Reserved + * + * The HAL needs to support all legal bitrates for the selected codec. + */ + uint32_t encodedAudioBitrate; + /** Peer MTU (in octets) */ + uint16_t peerMtu; + /** Content protection by SCMS-T */ + bool isScmstEnabled; + /** Scrambling Requirement */ + bool isScramblingEnabled; + union CodecSpecific { + SbcParameters sbcConfig; + AacParameters aacConfig; + LdacParameters ldacConfig; + AptxParameters aptxConfig; + AptxAdaptiveParameters aptxAdaptiveConfig; + AptxTwsParameters aptxTwsConfig; + BaCeltParameters baCeltConfig; + LC3Parameters lc3Config; + } config; +}; + +/** Used to configure either a Hardware or Software Encoding session based on session type */ +union AudioConfiguration { + PcmParameters pcmConfig; + CodecConfiguration codecConfig; +};