1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ANDROID_INCLUDE_BT_AV_H 18 #define ANDROID_INCLUDE_BT_AV_H 19 20 #include <vector> 21 22 #include <hardware/bluetooth.h> 23 24 __BEGIN_DECLS 25 26 /* Bluetooth AV connection states */ 27 typedef enum { 28 BTAV_CONNECTION_STATE_DISCONNECTED = 0, 29 BTAV_CONNECTION_STATE_CONNECTING, 30 BTAV_CONNECTION_STATE_CONNECTED, 31 BTAV_CONNECTION_STATE_DISCONNECTING 32 } btav_connection_state_t; 33 34 /* Bluetooth AV datapath states */ 35 typedef enum { 36 BTAV_AUDIO_STATE_REMOTE_SUSPEND = 0, 37 BTAV_AUDIO_STATE_STOPPED, 38 BTAV_AUDIO_STATE_STARTED, 39 } btav_audio_state_t; 40 41 /* 42 * Enum values for each A2DP supported codec. 43 * There should be a separate entry for each A2DP codec that is supported 44 * for encoding (SRC), and for decoding purpose (SINK). 45 */ 46 typedef enum { 47 BTAV_A2DP_CODEC_INDEX_SOURCE_MIN = 0, 48 49 // Add an entry for each source codec here. 50 // NOTE: The values should be same as those listed in the following file: 51 // BluetoothCodecConfig.java 52 BTAV_A2DP_CODEC_INDEX_SOURCE_SBC = 0, 53 BTAV_A2DP_CODEC_INDEX_SOURCE_AAC, 54 BTAV_A2DP_CODEC_INDEX_SOURCE_APTX, 55 BTAV_A2DP_CODEC_INDEX_SOURCE_APTX_HD, 56 BTAV_A2DP_CODEC_INDEX_SOURCE_LDAC, 57 58 BTAV_A2DP_CODEC_INDEX_SOURCE_MAX, 59 60 BTAV_A2DP_CODEC_INDEX_SINK_MIN = BTAV_A2DP_CODEC_INDEX_SOURCE_MAX, 61 62 // Add an entry for each sink codec here 63 BTAV_A2DP_CODEC_INDEX_SINK_SBC = BTAV_A2DP_CODEC_INDEX_SINK_MIN, 64 65 BTAV_A2DP_CODEC_INDEX_SINK_MAX, 66 67 BTAV_A2DP_CODEC_INDEX_MIN = BTAV_A2DP_CODEC_INDEX_SOURCE_MIN, 68 BTAV_A2DP_CODEC_INDEX_MAX = BTAV_A2DP_CODEC_INDEX_SINK_MAX 69 } btav_a2dp_codec_index_t; 70 71 typedef enum { 72 // Disable the codec. 73 // NOTE: This value can be used only during initialization when 74 // function btav_source_interface_t::init() is called. 75 BTAV_A2DP_CODEC_PRIORITY_DISABLED = -1, 76 77 // Reset the codec priority to its default value. 78 BTAV_A2DP_CODEC_PRIORITY_DEFAULT = 0, 79 80 // Highest codec priority. 81 BTAV_A2DP_CODEC_PRIORITY_HIGHEST = 1000 * 1000 82 } btav_a2dp_codec_priority_t; 83 84 typedef enum { 85 BTAV_A2DP_CODEC_SAMPLE_RATE_NONE = 0x0, 86 BTAV_A2DP_CODEC_SAMPLE_RATE_44100 = 0x1 << 0, 87 BTAV_A2DP_CODEC_SAMPLE_RATE_48000 = 0x1 << 1, 88 BTAV_A2DP_CODEC_SAMPLE_RATE_88200 = 0x1 << 2, 89 BTAV_A2DP_CODEC_SAMPLE_RATE_96000 = 0x1 << 3, 90 BTAV_A2DP_CODEC_SAMPLE_RATE_176400 = 0x1 << 4, 91 BTAV_A2DP_CODEC_SAMPLE_RATE_192000 = 0x1 << 5 92 } btav_a2dp_codec_sample_rate_t; 93 94 typedef enum { 95 BTAV_A2DP_CODEC_BITS_PER_SAMPLE_NONE = 0x0, 96 BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16 = 0x1 << 0, 97 BTAV_A2DP_CODEC_BITS_PER_SAMPLE_24 = 0x1 << 1, 98 BTAV_A2DP_CODEC_BITS_PER_SAMPLE_32 = 0x1 << 2 99 } btav_a2dp_codec_bits_per_sample_t; 100 101 typedef enum { 102 BTAV_A2DP_CODEC_CHANNEL_MODE_NONE = 0x0, 103 BTAV_A2DP_CODEC_CHANNEL_MODE_MONO = 0x1 << 0, 104 BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO = 0x1 << 1 105 } btav_a2dp_codec_channel_mode_t; 106 107 /* 108 * Structure for representing codec capability or configuration. 109 * It is used for configuring A2DP codec preference, and for reporting back 110 * current configuration or codec capability. 111 * For codec capability, fields "sample_rate", "bits_per_sample" and 112 * "channel_mode" can contain bit-masks with all supported features. 113 */ 114 typedef struct { 115 btav_a2dp_codec_index_t codec_type; 116 btav_a2dp_codec_priority_t codec_priority; // Codec selection priority 117 // relative to other codecs: larger value 118 // means higher priority. If 0, reset to 119 // default. 120 btav_a2dp_codec_sample_rate_t sample_rate; 121 btav_a2dp_codec_bits_per_sample_t bits_per_sample; 122 btav_a2dp_codec_channel_mode_t channel_mode; 123 int64_t codec_specific_1; // Codec-specific value 1 124 int64_t codec_specific_2; // Codec-specific value 2 125 int64_t codec_specific_3; // Codec-specific value 3 126 int64_t codec_specific_4; // Codec-specific value 4 127 } btav_a2dp_codec_config_t; 128 129 /** Callback for connection state change. 130 * state will have one of the values from btav_connection_state_t 131 */ 132 typedef void (* btav_connection_state_callback)(btav_connection_state_t state, 133 bt_bdaddr_t *bd_addr); 134 135 /** Callback for audiopath state change. 136 * state will have one of the values from btav_audio_state_t 137 */ 138 typedef void (* btav_audio_state_callback)(btav_audio_state_t state, 139 bt_bdaddr_t *bd_addr); 140 141 /** Callback for audio configuration change. 142 * Used only for the A2DP Source interface. 143 */ 144 typedef void (* btav_audio_source_config_callback)( 145 btav_a2dp_codec_config_t codec_config, 146 std::vector<btav_a2dp_codec_config_t> codecs_local_capabilities, 147 std::vector<btav_a2dp_codec_config_t> codecs_selectable_capabilities); 148 149 /** Callback for audio configuration change. 150 * Used only for the A2DP Sink interface. 151 * sample_rate: sample rate in Hz 152 * channel_count: number of channels (1 for mono, 2 for stereo) 153 */ 154 typedef void (* btav_audio_sink_config_callback)(bt_bdaddr_t *bd_addr, 155 uint32_t sample_rate, 156 uint8_t channel_count); 157 158 /** BT-AV A2DP Source callback structure. */ 159 typedef struct { 160 /** set to sizeof(btav_source_callbacks_t) */ 161 size_t size; 162 btav_connection_state_callback connection_state_cb; 163 btav_audio_state_callback audio_state_cb; 164 btav_audio_source_config_callback audio_config_cb; 165 } btav_source_callbacks_t; 166 167 /** BT-AV A2DP Sink callback structure. */ 168 typedef struct { 169 /** set to sizeof(btav_sink_callbacks_t) */ 170 size_t size; 171 btav_connection_state_callback connection_state_cb; 172 btav_audio_state_callback audio_state_cb; 173 btav_audio_sink_config_callback audio_config_cb; 174 } btav_sink_callbacks_t; 175 176 /** 177 * NOTE: 178 * 179 * 1. AVRCP 1.0 shall be supported initially. AVRCP passthrough commands 180 * shall be handled internally via uinput 181 * 182 * 2. A2DP data path shall be handled via a socket pipe between the AudioFlinger 183 * android_audio_hw library and the Bluetooth stack. 184 * 185 */ 186 187 /** Represents the standard BT-AV A2DP Source interface. 188 */ 189 typedef struct { 190 191 /** set to sizeof(btav_source_interface_t) */ 192 size_t size; 193 /** 194 * Register the BtAv callbacks. 195 */ 196 bt_status_t (*init)(btav_source_callbacks_t* callbacks, 197 std::vector<btav_a2dp_codec_config_t> codec_priorities); 198 199 /** connect to headset */ 200 bt_status_t (*connect)( bt_bdaddr_t *bd_addr ); 201 202 /** dis-connect from headset */ 203 bt_status_t (*disconnect)( bt_bdaddr_t *bd_addr ); 204 205 /** configure the codecs settings preferences */ 206 bt_status_t (*config_codec)(std::vector<btav_a2dp_codec_config_t> codec_preferences); 207 208 /** Closes the interface. */ 209 void (*cleanup)( void ); 210 211 } btav_source_interface_t; 212 213 /** Represents the standard BT-AV A2DP Sink interface. 214 */ 215 typedef struct { 216 217 /** set to sizeof(btav_sink_interface_t) */ 218 size_t size; 219 /** 220 * Register the BtAv callbacks 221 */ 222 bt_status_t (*init)( btav_sink_callbacks_t* callbacks ); 223 224 /** connect to headset */ 225 bt_status_t (*connect)( bt_bdaddr_t *bd_addr ); 226 227 /** dis-connect from headset */ 228 bt_status_t (*disconnect)( bt_bdaddr_t *bd_addr ); 229 230 /** Closes the interface. */ 231 void (*cleanup)( void ); 232 233 /** Sends Audio Focus State. */ 234 void (*set_audio_focus_state)( int focus_state ); 235 236 /** Sets the audio track gain. */ 237 void (*set_audio_track_gain)( float gain ); 238 } btav_sink_interface_t; 239 240 __END_DECLS 241 242 #endif /* ANDROID_INCLUDE_BT_AV_H */ 243