Bluetooth: A2DP offload HIDL

Interface for Bluetooth A2DP offload feature.

Bug: 72242910
Test: Manual; TestTracker/148125
Change-Id: I3649800dfe3e1a2d66b76859be87e01ee58d2de0
This commit is contained in:
Sunny Kapdi
2018-02-07 15:08:01 -08:00
committed by Petri Gynther
parent a9ee578b87
commit 4e95d81ef0
7 changed files with 420 additions and 0 deletions

View File

@@ -0,0 +1,27 @@
// This file is autogenerated by hidl-gen -Landroidbp.
hidl_interface {
name: "android.hardware.bluetooth.a2dp@1.0",
root: "android.hardware",
vndk: {
enabled: true,
},
srcs: [
"types.hal",
"IBluetoothAudioHost.hal",
"IBluetoothAudioOffload.hal",
],
interfaces: [
"android.hidl.base@1.0",
],
types: [
"BitsPerSample",
"ChannelMode",
"CodecConfiguration",
"CodecType",
"SampleRate",
"Status",
],
gen_java: false,
}

View File

@@ -0,0 +1,61 @@
/*
* Copyright (C) 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 android.hardware.bluetooth.a2dp@1.0;
/**
* HAL interface for Bluetooth A2DP Offload functionality where
* the encoding of the A2DP data packets is offloaded to platform
* specific encoders. The A2DP control path is maintained in the
* Bluetooth stack.
*
* This interface is from HAL server to HAL client.
*
* The HAL server must call into the IBluetoothAudioHost to initiate
* the start, suspend and stop of the streaming operation. These
* calls return immediately and the results, if any, are send over
* the IBluetoothAudioOffload interface.
*/
interface IBluetoothAudioHost {
/**
* Invoked when the start stream is requested from HAL server
* to HAL client. This indicates that the HAL server
* has initialized the platform for streaming use case, and the
* HAL client can proceed with the streaming procedure. The
* result of the operation must be provided by the HAL
* client using the IBluetoothAudioOffload interface.
*/
oneway startStream();
/**
* Invoked when the suspend stream is requested from HAL server
* to HAL client. This indicates that the HAL server
* wants to suspend the streaming procedure. The result of the
* operation must be provided by the HAL client using the
* IBluetoothAudioOffload interface.
*/
oneway suspendStream();
/**
* Invoked when the stop stream is requested from HAL server
* to HAL client. This indicates that the HAL server wants to
* stop and reset the streaming procedure. There is no result
* provided by the HAL client for this call.
*/
oneway stopStream();
};

View File

@@ -0,0 +1,85 @@
/*
* Copyright (C) 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 android.hardware.bluetooth.a2dp@1.0;
import IBluetoothAudioHost;
/**
* HAL interface for Bluetooth A2DP Offload functionality where
* the encoding of the A2DP data packets is offloaded to platform
* specific encoders. The A2DP control path is maintained in the
* Bluetooth stack.
*
* This interface is from HAL client to HAL server.
*
* The HAL client must provide the handle of IBluetoothAudioHost as well
* as codec configuration to the HAL server, when its connected to an
* active A2DP Sink device. HAL Server, based on the feedback from the Audio
* framework must call into the commands provided by the IBluetoothAudioHost.
* HAL client must call into IBluetoothAudioOffload to provide the status of
* these commands. Once the device becomes inactive, the HAL client must
* call the endSession to terminate the session with the HAL server.
*/
interface IBluetoothAudioOffload {
/**
* Indicates that the HAL client is connected to an A2DP Sink device
* and is ready to stream audio. This function is also used to register
* the BluetoothAudioHost interface and the provide the current negotiated
* codec.
*
* |endSession| must be called to unregister the interface.
*
* @param hostIf interface used to request stream control
* @param codecConfig Codec configuration as negotiated with the A2DP Sink
* device
* @return status one of the following
* SUCCESS if HAL server successfully initializes the platform with the
* given codec configuration
* UNSUPPORTED_CODEC_CONFIGURATION if HAL server cannot initialize the
* platform with the given codec configuration
* FAILURE if HAL server cannot initialize the platform for any other
* reason
*/
startSession(IBluetoothAudioHost hostIf, CodecConfiguration codecConfig) generates (Status status);
/**
* Updates status for start stream request. The HAL client may need
* to communicate to Bluetooth Controller and remote Sink device, in which
* case it must update with PENDING status. Once the operation is
* completed, it must return with either SUCCESS or FAILURE.
*
* @param status SUCCESS, FAILURE or PENDING
*/
oneway streamStarted(Status status);
/**
* Updates status for suspend stream request. The HAL client may need
* to communicate to Bluetooth Controller and remote device, in which case
* it must update with PENDING status. Once the operation is completed, it
* must return with either SUCCESS or FAILURE.
*
* @param status SUCCESS, FAILURE or PENDING
*/
oneway streamSuspended(Status status);
/**
* Ends the current A2DP offload session and unregisters the
* BluetoothAudioHost interface.
*/
oneway endSession();
};

View File

@@ -0,0 +1,14 @@
cc_library_shared {
name: "android.hardware.bluetooth.a2dp@1.0-impl",
relative_install_path: "hw",
vendor: true,
srcs: [
"BluetoothAudioOffload.cpp",
],
shared_libs: [
"libhidlbase",
"libhidltransport",
"libutils",
"android.hardware.bluetooth.a2dp@1.0",
],
}

View File

@@ -0,0 +1,74 @@
/*
* Copyright (C) 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.
*/
#include "BluetoothAudioOffload.h"
namespace android {
namespace hardware {
namespace bluetooth {
namespace a2dp {
namespace V1_0 {
namespace implementation {
IBluetoothAudioOffload* HIDL_FETCH_IBluetoothAudioOffload(const char* /* name */) {
return new BluetoothAudioOffload();
}
// Methods from ::android::hardware::bluetooth::a2dp::V1_0::IBluetoothAudioOffload follow.
Return<::android::hardware::bluetooth::a2dp::V1_0::Status> BluetoothAudioOffload::startSession(
const sp<::android::hardware::bluetooth::a2dp::V1_0::IBluetoothAudioHost>& hostIf __unused,
const ::android::hardware::bluetooth::a2dp::V1_0::CodecConfiguration& codecConfig __unused) {
/**
* Initialize the audio platform if codecConfiguration is supported.
* Save the the IBluetoothAudioHost interface, so that it can be used
* later to send stream control commands to the HAL client, based on
* interaction with Audio framework.
*/
return ::android::hardware::bluetooth::a2dp::V1_0::Status::FAILURE;
}
Return<void> BluetoothAudioOffload::streamStarted(
::android::hardware::bluetooth::a2dp::V1_0::Status status __unused) {
/**
* Streaming on control path has started,
* HAL server should start the streaming on data path.
*/
return Void();
}
Return<void> BluetoothAudioOffload::streamSuspended(
::android::hardware::bluetooth::a2dp::V1_0::Status status __unused) {
/**
* Streaming on control path has suspend,
* HAL server should suspend the streaming on data path.
*/
return Void();
}
Return<void> BluetoothAudioOffload::endSession() {
/**
* Cleanup the audio platform as remote A2DP Sink device is no
* longer active
*/
return Void();
}
} // namespace implementation
} // namespace V1_0
} // namespace a2dp
} // namespace bluetooth
} // namespace hardware
} // namespace android

View File

@@ -0,0 +1,60 @@
/*
* Copyright (C) 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.
*/
#ifndef ANDROID_HARDWARE_BLUETOOTH_A2DP_V1_0_BLUETOOTHAUDIOOFFLOAD_H
#define ANDROID_HARDWARE_BLUETOOTH_A2DP_V1_0_BLUETOOTHAUDIOOFFLOAD_H
#include <android/hardware/bluetooth/a2dp/1.0/IBluetoothAudioOffload.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>
namespace android {
namespace hardware {
namespace bluetooth {
namespace a2dp {
namespace V1_0 {
namespace implementation {
using ::android::hardware::hidl_array;
using ::android::hardware::hidl_memory;
using ::android::hardware::hidl_string;
using ::android::hardware::hidl_vec;
using ::android::hardware::Return;
using ::android::hardware::Void;
using ::android::sp;
struct BluetoothAudioOffload : public IBluetoothAudioOffload {
BluetoothAudioOffload() {}
// Methods from ::android::hardware::bluetooth::a2dp::V1_0::IBluetoothAudioOffload follow.
Return<::android::hardware::bluetooth::a2dp::V1_0::Status> startSession(
const sp<::android::hardware::bluetooth::a2dp::V1_0::IBluetoothAudioHost>& hostIf,
const ::android::hardware::bluetooth::a2dp::V1_0::CodecConfiguration& codecConfig) override;
Return<void> streamStarted(::android::hardware::bluetooth::a2dp::V1_0::Status status) override;
Return<void> streamSuspended(
::android::hardware::bluetooth::a2dp::V1_0::Status status) override;
Return<void> endSession() override;
};
extern "C" IBluetoothAudioOffload* HIDL_FETCH_IBluetoothAudioOffload(const char* name);
} // namespace implementation
} // namespace V1_0
} // namespace a2dp
} // namespace bluetooth
} // namespace hardware
} // namespace android
#endif // ANDROID_HARDWARE_BLUETOOTH_A2DP_V1_0_BLUETOOTHAUDIOOFFLOAD_H

View File

@@ -0,0 +1,99 @@
/*
* Copyright (C) 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 android.hardware.bluetooth.a2dp@1.0;
enum Status : uint8_t {
SUCCESS,
FAILURE,
/** codec configuration not supported by the audio platform */
UNSUPPORTED_CODEC_CONFIGURATION ,
/** operation is pending */
PENDING,
};
enum CodecType : uint32_t {
UNKNOWN = 0x00,
SBC = 0x01,
AAC = 0x02,
APTX = 0x04,
APTX_HD = 0x08,
LDAC = 0x10,
};
enum SampleRate : uint32_t {
RATE_UNKNOWN = 0x00,
RATE_44100 = 0x01,
RATE_48000 = 0x02,
RATE_88200 = 0x04,
RATE_96000 = 0x08,
RATE_176400 = 0x10,
RATE_192000 = 0x20,
};
enum BitsPerSample : uint8_t {
BITS_UNKNOWN = 0x00,
BITS_16 = 0x01,
BITS_24 = 0x02,
BITS_32 = 0x04,
};
enum ChannelMode : uint8_t {
UNKNOWN = 0x00,
MONO = 0x01,
STEREO = 0x02,
};
struct CodecConfiguration {
/** Bluetooth A2DP codec */
CodecType codecType;
/** Sampling rate for encoder */
SampleRate sampleRate;
/** Bits per sample for encoder */
BitsPerSample bitsPerSample;
/** Channel mode for encoder */
ChannelMode channelMode;
/**
* 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
*/
uint32_t encodedAudioBitrate;
/** Peer MTU (in octets) */
uint16_t peerMtu;
union CodecSpecific {
/**
* SBC Codec specific information
* Refer to SBC Codec specific information elements in A2DP v1.3
* Profile Specification.
*/
struct SbcData {
/** Block length: 4 bits | Subbands: 2 bits | Allocation Method: 2 bits */
uint8_t codecParameters;
/** Minimum bitpool value */
uint8_t minBitpool;
/** Maximum bitpool value */
uint8_t maxBitpool;
} sbcData;
struct LdacData {
/**
* LDAC bitrate index value:
* 0x00 - High
* 0x01 - Mid
* 0x02 - Low
* 0x7F - ABR (Adaptive Bit Rate)
*/
uint8_t bitrateIndex;
} ldacData;
} codecSpecific;
};