From 3c6e4eb6595b7ee54c47d981cd1b7e4ad64e6ea8 Mon Sep 17 00:00:00 2001 From: Pavlin Radoslavov Date: Mon, 5 Dec 2016 12:07:32 -0800 Subject: [PATCH] Add a mechanism for configuring the A2DP Source codecs * Introduced new generic API for representing A2DP codec configuration or capability: codec type, priority, sample rate, bits per sample, channel mode, and codec-specific fields. The new structure is btav_a2dp_codec_config_t * Split the A2DP callback structure into two: one for A2DP Source callbacks, and one for A2DP Sink callbacks: OLD: btav_callbacks_t NEW: btav_source_callbacks_t and btav_sink_callbacks_t * Split the A2DP BT-AV interface into two: one for A2DP Source, and one for A2DP Sink: OLD: btav_interface_t NEW: btav_source_interface_t and btav_sink_interface_t Test: A2DP streaming to headsets, TestPlans/71390 Bug: 30958229 Change-Id: If6a10bb95eb0fa4106123283b934d372aebad2bc --- include/hardware/bt_av.h | 142 +++++++++++++++++++++++++++++++++++---- 1 file changed, 128 insertions(+), 14 deletions(-) diff --git a/include/hardware/bt_av.h b/include/hardware/bt_av.h index 9b32216f..d0db96df 100644 --- a/include/hardware/bt_av.h +++ b/include/hardware/bt_av.h @@ -17,6 +17,10 @@ #ifndef ANDROID_INCLUDE_BT_AV_H #define ANDROID_INCLUDE_BT_AV_H +#include + +#include + __BEGIN_DECLS /* Bluetooth AV connection states */ @@ -34,6 +38,76 @@ typedef enum { BTAV_AUDIO_STATE_STARTED, } btav_audio_state_t; +/* + * Enum values for each A2DP supported codec. + * There should be a separate entry for each A2DP codec that is supported + * for encoding (SRC), and for decoding purpose (SINK). + */ +typedef enum { + BTAV_A2DP_CODEC_INDEX_SOURCE_MIN = 0, + BTAV_A2DP_CODEC_INDEX_SOURCE_SBC = 0, + + /* Add an entry for each new source codec here */ + + BTAV_A2DP_CODEC_INDEX_SOURCE_MAX, + + BTAV_A2DP_CODEC_INDEX_SINK_MIN = BTAV_A2DP_CODEC_INDEX_SOURCE_MAX, + BTAV_A2DP_CODEC_INDEX_SINK_SBC = BTAV_A2DP_CODEC_INDEX_SINK_MIN, + + /* Add an entry for each new sink codec here */ + + BTAV_A2DP_CODEC_INDEX_SINK_MAX, + + BTAV_A2DP_CODEC_INDEX_MIN = BTAV_A2DP_CODEC_INDEX_SOURCE_MIN, + BTAV_A2DP_CODEC_INDEX_MAX = BTAV_A2DP_CODEC_INDEX_SINK_MAX +} btav_a2dp_codec_index_t; + +typedef uint32_t btav_a2dp_codec_priority_t; + +typedef enum { + BTAV_A2DP_CODEC_SAMPLE_RATE_NONE = 0x0, + BTAV_A2DP_CODEC_SAMPLE_RATE_44100 = 0x1 << 0, + BTAV_A2DP_CODEC_SAMPLE_RATE_48000 = 0x1 << 1, + BTAV_A2DP_CODEC_SAMPLE_RATE_88200 = 0x1 << 2, + BTAV_A2DP_CODEC_SAMPLE_RATE_96000 = 0x1 << 3, + BTAV_A2DP_CODEC_SAMPLE_RATE_176400 = 0x1 << 4, + BTAV_A2DP_CODEC_SAMPLE_RATE_192000 = 0x1 << 5 +} btav_a2dp_codec_sample_rate_t; + +typedef enum { + BTAV_A2DP_CODEC_BITS_PER_SAMPLE_NONE = 0x0, + BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16 = 0x1 << 0, + BTAV_A2DP_CODEC_BITS_PER_SAMPLE_24 = 0x1 << 1, + BTAV_A2DP_CODEC_BITS_PER_SAMPLE_32 = 0x1 << 2 +} btav_a2dp_codec_bits_per_sample_t; + +typedef enum { + BTAV_A2DP_CODEC_CHANNEL_MODE_NONE = 0x0, + BTAV_A2DP_CODEC_CHANNEL_MODE_MONO = 0x1 << 0, + BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO = 0x1 << 1 +} btav_a2dp_codec_channel_mode_t; + +/* + * Structure for representing codec capability or configuration. + * It is used for configuring A2DP codec preference, and for reporting back + * current configuration or codec capability. + * For codec capability, fields "sample_rate", "bits_per_sample" and + * "channel_mode" can contain bit-masks with all supported features. + */ +typedef struct { + btav_a2dp_codec_index_t codec_type; + btav_a2dp_codec_priority_t codec_priority; // Codec selection priority + // relative to other codecs: larger value + // means higher priority. If 0, reset to + // default. + btav_a2dp_codec_sample_rate_t sample_rate; + btav_a2dp_codec_bits_per_sample_t bits_per_sample; + btav_a2dp_codec_channel_mode_t channel_mode; + int64_t codec_specific_1; // Codec-specific value 1 + int64_t codec_specific_2; // Codec-specific value 2 + int64_t codec_specific_3; // Codec-specific value 3 + int64_t codec_specific_4; // Codec-specific value 4 +} btav_a2dp_codec_config_t; /** Callback for connection state change. * state will have one of the values from btav_connection_state_t @@ -48,23 +122,38 @@ typedef void (* btav_audio_state_callback)(btav_audio_state_t state, bt_bdaddr_t *bd_addr); /** Callback for audio configuration change. - * Used only for the A2DP sink interface. - * state will have one of the values from btav_audio_state_t + * Used only for the A2DP Source interface. + */ +typedef void (* btav_audio_source_config_callback)( + btav_a2dp_codec_config_t codec_config, + std::vector codec_capabilities); + +/** Callback for audio configuration change. + * Used only for the A2DP Sink interface. * sample_rate: sample rate in Hz * channel_count: number of channels (1 for mono, 2 for stereo) */ -typedef void (* btav_audio_config_callback)(bt_bdaddr_t *bd_addr, - uint32_t sample_rate, - uint8_t channel_count); +typedef void (* btav_audio_sink_config_callback)(bt_bdaddr_t *bd_addr, + uint32_t sample_rate, + uint8_t channel_count); -/** BT-AV callback structure. */ +/** BT-AV A2DP Source callback structure. */ typedef struct { - /** set to sizeof(btav_callbacks_t) */ + /** set to sizeof(btav_source_callbacks_t) */ size_t size; btav_connection_state_callback connection_state_cb; btav_audio_state_callback audio_state_cb; - btav_audio_config_callback audio_config_cb; -} btav_callbacks_t; + btav_audio_source_config_callback audio_config_cb; +} btav_source_callbacks_t; + +/** BT-AV A2DP Source callback structure. */ +typedef struct { + /** set to sizeof(btav_sink_callbacks_t) */ + size_t size; + btav_connection_state_callback connection_state_cb; + btav_audio_state_callback audio_state_cb; + btav_audio_sink_config_callback audio_config_cb; +} btav_sink_callbacks_t; /** * NOTE: @@ -76,17 +165,42 @@ typedef struct { * android_audio_hw library and the Bluetooth stack. * */ -/** Represents the standard BT-AV interface. - * Used for both the A2DP source and sink interfaces. + +/** Represents the standard BT-AV A2DP Source interface. */ typedef struct { - /** set to sizeof(btav_interface_t) */ + /** set to sizeof(btav_source_interface_t) */ size_t size; /** * Register the BtAv callbacks */ - bt_status_t (*init)( btav_callbacks_t* callbacks ); + bt_status_t (*init)( btav_source_callbacks_t* callbacks ); + + /** connect to headset */ + bt_status_t (*connect)( bt_bdaddr_t *bd_addr ); + + /** dis-connect from headset */ + bt_status_t (*disconnect)( bt_bdaddr_t *bd_addr ); + + /** configure the codecs settings preferences */ + bt_status_t (*config_codec)(std::vector codec_preferences); + + /** Closes the interface. */ + void (*cleanup)( void ); + +} btav_source_interface_t; + +/** Represents the standard BT-AV A2DP Sink interface. + */ +typedef struct { + + /** set to sizeof(btav_sink_interface_t) */ + size_t size; + /** + * Register the BtAv callbacks + */ + bt_status_t (*init)( btav_sink_callbacks_t* callbacks ); /** connect to headset */ bt_status_t (*connect)( bt_bdaddr_t *bd_addr ); @@ -102,7 +216,7 @@ typedef struct { /** Sets the audio track gain. */ void (*set_audio_track_gain)( float gain ); -} btav_interface_t; +} btav_sink_interface_t; __END_DECLS