summaryrefslogtreecommitdiffstats
path: root/bta
diff options
context:
space:
mode:
authorKausik Sinnaswamy <kausik@broadcom.com>2012-03-07 19:30:20 -0800
committerMatthew Xie <mattx@google.com>2012-07-14 11:19:12 -0700
commit95fa11b3b2f19a382c7e3a744a6afb452fad86df (patch)
tree1019e123db4596f2b8bd1259da04b51f3c44d7b2 /bta
parente2197423bcf1a93c620be13d458a9da6693fa94d (diff)
downloadexternal_bluetooth_bluedroid-95fa11b3b2f19a382c7e3a744a6afb452fad86df.zip
external_bluetooth_bluedroid-95fa11b3b2f19a382c7e3a744a6afb452fad86df.tar.gz
external_bluetooth_bluedroid-95fa11b3b2f19a382c7e3a744a6afb452fad86df.tar.bz2
AV control and data path added
Change-Id: I88ec6084c140fa257154a98e23e075900e84cc8c
Diffstat (limited to 'bta')
-rw-r--r--bta/Android.mk3
-rw-r--r--bta/ar/bta_ar.c336
-rw-r--r--bta/ar/bta_ar_int.h51
-rw-r--r--bta/av/bta_av_aact.c4
-rw-r--r--bta/av/bta_av_act.c6
-rw-r--r--bta/av/bta_av_api.c4
-rw-r--r--bta/av/bta_av_cfg.c19
-rw-r--r--bta/av/bta_av_main.c13
-rw-r--r--bta/av/bta_av_sbc.c577
-rwxr-xr-xbta/dm/bta_dm_act.c8
-rwxr-xr-xbta/dm/bta_dm_api.c2
-rwxr-xr-xbta/include/bta_api.h2
-rw-r--r--bta/include/bta_ar_api.h127
-rw-r--r--bta/include/bta_av_api.h5
-rw-r--r--bta/include/bta_av_co.h28
-rw-r--r--bta/include/bta_av_sbc.h194
16 files changed, 1311 insertions, 68 deletions
diff --git a/bta/Android.mk b/bta/Android.mk
index bbada7e..9471187 100644
--- a/bta/Android.mk
+++ b/bta/Android.mk
@@ -104,6 +104,8 @@ LOCAL_SRC_FILES:= \
./av/bta_av_main.c \
./av/bta_av_cfg.c \
./av/bta_av_ssm.c \
+ ./av/bta_av_sbc.c \
+ ./ar/bta_ar.c \
./hl/bta_hl_act.c \
./hl/bta_hl_api.c \
./hl/bta_hl_main.c \
@@ -134,6 +136,7 @@ LOCAL_C_INCLUDES+= . \
$(LOCAL_PATH)/../hcis \
$(LOCAL_PATH)/../hcis/patchram \
$(LOCAL_PATH)/../udrv/include \
+ $(LOCAL_PATH)/../brcm/include \
include $(BUILD_STATIC_LIBRARY)
diff --git a/bta/ar/bta_ar.c b/bta/ar/bta_ar.c
new file mode 100644
index 0000000..b3e897c
--- /dev/null
+++ b/bta/ar/bta_ar.c
@@ -0,0 +1,336 @@
+/*****************************************************************************
+**
+** Name: bta_ar.c
+**
+** Description: This is the implementation for the
+** audio/video registration module.
+**
+** Copyright (c) 2008-2009, Broadcom Corp., All Rights Reserved.
+** Widcomm Bluetooth Core. Proprietary and confidential.
+**
+*****************************************************************************/
+
+#include <string.h>
+#include "bta_ar_api.h"
+#include "bta_ar_int.h"
+
+
+/* AV control block */
+#if BTA_DYNAMIC_MEMORY == FALSE
+tBTA_AR_CB bta_ar_cb;
+#endif
+
+/*******************************************************************************
+**
+** Function bta_ar_id
+**
+** Description This function maps sys_id to ar id mask.
+**
+** Returns void
+**
+*******************************************************************************/
+static UINT8 bta_ar_id(tBTA_SYS_ID sys_id)
+{
+ UINT8 mask = 0;
+ if (sys_id == BTA_ID_AV)
+ {
+ mask = BTA_AR_AV_MASK;
+ }
+ else if (sys_id == BTA_ID_AVK)
+ {
+ mask = BTA_AR_AVK_MASK;
+ }
+
+ return mask;
+}
+
+/*******************************************************************************
+**
+** Function bta_ar_init
+**
+** Description This function is called to register to AVDTP.
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_ar_init(void)
+{
+ /* initialize control block */
+ memset(&bta_ar_cb, 0, sizeof(tBTA_AR_CB));
+}
+
+/*******************************************************************************
+**
+** Function bta_ar_reg_avdt
+**
+** Description This function is called to register to AVDTP.
+**
+** Returns void
+**
+*******************************************************************************/
+static void bta_ar_avdt_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p_data)
+{
+ /* route the AVDT registration callback to av or avk */
+ if (bta_ar_cb.p_av_conn_cback)
+ (*bta_ar_cb.p_av_conn_cback)(handle, bd_addr, event, p_data);
+ if (bta_ar_cb.p_avk_conn_cback)
+ (*bta_ar_cb.p_avk_conn_cback)(handle, bd_addr, event, p_data);
+}
+
+/*******************************************************************************
+**
+** Function bta_ar_reg_avdt
+**
+** Description AR module registration to AVDT.
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_ar_reg_avdt(tAVDT_REG *p_reg, tAVDT_CTRL_CBACK *p_cback, tBTA_SYS_ID sys_id)
+{
+ UINT8 mask = 0;
+
+ if (sys_id == BTA_ID_AV)
+ {
+ bta_ar_cb.p_av_conn_cback = p_cback;
+ mask = BTA_AR_AV_MASK;
+ }
+ else if (sys_id == BTA_ID_AVK)
+ {
+ bta_ar_cb.p_avk_conn_cback = p_cback;
+ mask = BTA_AR_AVK_MASK;
+ }
+#if (BTA_AR_DEBUG == TRUE)
+ else
+ {
+ APPL_TRACE_ERROR1("bta_ar_reg_avdt: the registration is from wrong sys_id:%d", sys_id);
+ }
+#endif
+
+ if (mask)
+ {
+ if (bta_ar_cb.avdt_registered == 0)
+ {
+ AVDT_Register(p_reg, bta_ar_avdt_cback);
+ }
+ bta_ar_cb.avdt_registered |= mask;
+ }
+}
+
+/*******************************************************************************
+**
+** Function bta_ar_dereg_avdt
+**
+** Description This function is called to de-register from AVDTP.
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_ar_dereg_avdt(tBTA_SYS_ID sys_id)
+{
+ UINT8 mask = 0;
+
+ if (sys_id == BTA_ID_AV)
+ {
+ bta_ar_cb.p_av_conn_cback = NULL;
+ mask = BTA_AR_AV_MASK;
+ }
+ else if (sys_id == BTA_ID_AVK)
+ {
+ bta_ar_cb.p_avk_conn_cback = NULL;
+ mask = BTA_AR_AVK_MASK;
+ }
+ bta_ar_cb.avdt_registered &= ~mask;
+
+ if (bta_ar_cb.avdt_registered == 0)
+ AVDT_Deregister();
+}
+
+/*******************************************************************************
+**
+** Function bta_ar_avdt_conn
+**
+** Description This function is called to let ar know that some AVDTP profile
+** is connected for this sys_id.
+** If the other sys modules started a timer for PENDING_EVT,
+** the timer can be stopped now.
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_ar_avdt_conn(tBTA_SYS_ID sys_id, BD_ADDR bd_addr)
+{
+ UINT8 event = BTA_AR_AVDT_CONN_EVT;
+ tAVDT_CTRL data;
+
+ if (sys_id == BTA_ID_AV)
+ {
+ if (bta_ar_cb.p_avk_conn_cback)
+ {
+ (*bta_ar_cb.p_avk_conn_cback)(0, bd_addr, event, &data);
+ }
+ }
+ else if (sys_id == BTA_ID_AVK)
+ {
+ if (bta_ar_cb.p_av_conn_cback)
+ {
+ (*bta_ar_cb.p_av_conn_cback)(0, bd_addr, event, &data);
+ }
+ }
+}
+
+/*******************************************************************************
+**
+** Function bta_ar_reg_avct
+**
+** Description This function is called to register to AVCTP.
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_ar_reg_avct(UINT16 mtu, UINT16 mtu_br, UINT8 sec_mask, tBTA_SYS_ID sys_id)
+{
+ UINT8 mask = bta_ar_id (sys_id);
+
+ if (mask)
+ {
+ if (bta_ar_cb.avct_registered == 0)
+ {
+ AVCT_Register(mtu, mtu_br, sec_mask);
+ }
+ bta_ar_cb.avct_registered |= mask;
+ }
+}
+
+/*******************************************************************************
+**
+** Function bta_ar_dereg_avct
+**
+** Description This function is called to deregister from AVCTP.
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_ar_dereg_avct(tBTA_SYS_ID sys_id)
+{
+ UINT8 mask = bta_ar_id (sys_id);
+
+ bta_ar_cb.avct_registered &= ~mask;
+
+ if (bta_ar_cb.avct_registered == 0)
+ AVCT_Deregister();
+}
+
+/******************************************************************************
+**
+** Function bta_ar_reg_avrc
+**
+** Description This function is called to register an SDP record for AVRCP.
+**
+** Returns void
+**
+******************************************************************************/
+void bta_ar_reg_avrc(UINT16 service_uuid, char *service_name, char *provider_name,
+ UINT16 categories, tBTA_SYS_ID sys_id)
+{
+ UINT8 mask = bta_ar_id (sys_id);
+ UINT8 temp[8], *p;
+
+ if (!mask || !categories)
+ return;
+
+ if (service_uuid == UUID_SERVCLASS_AV_REM_CTRL_TARGET)
+ {
+ if (bta_ar_cb.sdp_tg_handle == 0)
+ {
+ bta_ar_cb.tg_registered = mask;
+ bta_ar_cb.sdp_tg_handle = SDP_CreateRecord();
+ AVRC_AddRecord(service_uuid, service_name, provider_name, categories, bta_ar_cb.sdp_tg_handle);
+#if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&(BTA_EIR_CANNED_UUID_LIST != TRUE)
+ bta_sys_add_uuid(service_uuid);
+#endif
+ }
+ /* only one TG is allowed (first-come, first-served).
+ * If sdp_tg_handle is non-0, ignore this request */
+ }
+ else if ((service_uuid == UUID_SERVCLASS_AV_REMOTE_CONTROL) || (service_uuid == UUID_SERVCLASS_AV_REM_CTRL_CONTROL))
+ {
+ bta_ar_cb.ct_categories [mask - 1] = categories;
+ categories = bta_ar_cb.ct_categories[0]|bta_ar_cb.ct_categories[1];
+ if (bta_ar_cb.sdp_ct_handle == 0)
+ {
+ bta_ar_cb.sdp_ct_handle = SDP_CreateRecord();
+ AVRC_AddRecord(service_uuid, service_name, provider_name, categories, bta_ar_cb.sdp_ct_handle);
+#if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&(BTA_EIR_CANNED_UUID_LIST != TRUE)
+ bta_sys_add_uuid(service_uuid);
+#endif
+ }
+ else
+ {
+ /* multiple CTs are allowed.
+ * Change supported categories on the second one */
+ p = temp;
+ UINT16_TO_BE_STREAM(p, categories);
+ SDP_AddAttribute(bta_ar_cb.sdp_ct_handle, ATTR_ID_SUPPORTED_FEATURES, UINT_DESC_TYPE,
+ (UINT32)2, (UINT8*)temp);
+ }
+ }
+}
+
+/******************************************************************************
+**
+** Function bta_ar_dereg_avrc
+**
+** Description This function is called to de-register/delete an SDP record for AVRCP.
+**
+** Returns void
+**
+******************************************************************************/
+void bta_ar_dereg_avrc(UINT16 service_uuid, tBTA_SYS_ID sys_id)
+{
+ UINT8 mask = bta_ar_id (sys_id);
+ UINT16 categories = 0;
+ UINT8 temp[8], *p;
+
+ if (!mask)
+ return;
+
+ if (service_uuid == UUID_SERVCLASS_AV_REM_CTRL_TARGET)
+ {
+ if (bta_ar_cb.sdp_tg_handle && mask == bta_ar_cb.tg_registered)
+ {
+ bta_ar_cb.tg_registered = 0;
+ SDP_DeleteRecord(bta_ar_cb.sdp_tg_handle);
+ bta_ar_cb.sdp_tg_handle = 0;
+#if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&(BTA_EIR_CANNED_UUID_LIST != TRUE)
+ bta_sys_remove_uuid(service_uuid);
+#endif
+ }
+ }
+ else if (service_uuid == UUID_SERVCLASS_AV_REMOTE_CONTROL)
+ {
+ if (bta_ar_cb.sdp_ct_handle)
+ {
+ bta_ar_cb.ct_categories [mask - 1] = 0;
+ categories = bta_ar_cb.ct_categories[0]|bta_ar_cb.ct_categories[1];
+ if (!categories)
+ {
+ /* no CT is still registered - cleaup */
+ SDP_DeleteRecord(bta_ar_cb.sdp_ct_handle);
+ bta_ar_cb.sdp_ct_handle = 0;
+#if ( BTM_EIR_SERVER_INCLUDED == TRUE )&&(BTA_EIR_CANNED_UUID_LIST != TRUE)
+ bta_sys_remove_uuid(service_uuid);
+#endif
+ }
+ else
+ {
+ /* change supported categories to the remaning one */
+ p = temp;
+ UINT16_TO_BE_STREAM(p, categories);
+ SDP_AddAttribute(bta_ar_cb.sdp_ct_handle, ATTR_ID_SUPPORTED_FEATURES, UINT_DESC_TYPE,
+ (UINT32)2, (UINT8*)temp);
+ }
+ }
+ }
+
+}
diff --git a/bta/ar/bta_ar_int.h b/bta/ar/bta_ar_int.h
new file mode 100644
index 0000000..a6c5c8b
--- /dev/null
+++ b/bta/ar/bta_ar_int.h
@@ -0,0 +1,51 @@
+/*****************************************************************************
+**
+** Name: bta_ar_int.h
+**
+** Description: This is the private interface file for the BTA
+** audio/video registration module.
+**
+** Copyright (c) 2008-2009, Broadcom Corp., All Rights Reserved.
+** Widcomm Bluetooth Core. Proprietary and confidential.
+**
+*****************************************************************************/
+#ifndef BTA_AR_INT_H
+#define BTA_AR_INT_H
+
+#include "bta_av_api.h"
+
+
+#ifndef BTA_AR_DEBUG
+#define BTA_AR_DEBUG FALSE
+#endif
+
+#define BTA_AR_AV_MASK 0x01
+#define BTA_AR_AVK_MASK 0x02
+
+/* data associated with BTA_AR */
+typedef struct
+{
+ tAVDT_CTRL_CBACK *p_av_conn_cback; /* av connection callback function */
+ tAVDT_CTRL_CBACK *p_avk_conn_cback; /* avk connection callback function */
+ UINT8 avdt_registered;
+ UINT8 avct_registered;
+ UINT32 sdp_tg_handle;
+ UINT32 sdp_ct_handle;
+ UINT16 ct_categories[2];
+ UINT8 tg_registered;
+ tBTA_AV_HNDL hndl; /* Handle associated with the stream that rejected the connection. */
+} tBTA_AR_CB;
+
+/*****************************************************************************
+** Global data
+*****************************************************************************/
+
+/* control block declaration */
+#if BTA_DYNAMIC_MEMORY == FALSE
+extern tBTA_AR_CB bta_ar_cb;
+#else
+extern tBTA_AR_CB *bta_ar_cb_ptr;
+#define bta_ar_cb (*bta_ar_cb_ptr)
+#endif
+
+#endif /* BTA_AR_INT_H */
diff --git a/bta/av/bta_av_aact.c b/bta/av/bta_av_aact.c
index aa154b3..423c322 100644
--- a/bta/av/bta_av_aact.c
+++ b/bta/av/bta_av_aact.c
@@ -12,7 +12,7 @@
*****************************************************************************/
#include "bt_target.h"
-#if defined(AV_INCLUDED) && (AV_INCLUDED == TRUE)
+#if defined(BTA_AV_INCLUDED) && (BTA_AV_INCLUDED == TRUE)
#include <string.h>
#include "bta_av_int.h"
@@ -2685,4 +2685,4 @@ void bta_av_open_at_inc (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data)
}
}
-#endif /* AV_INCLUDED */
+#endif /* BTA_AV_INCLUDED */
diff --git a/bta/av/bta_av_act.c b/bta/av/bta_av_act.c
index 472ed21..e501e52 100644
--- a/bta/av/bta_av_act.c
+++ b/bta/av/bta_av_act.c
@@ -11,7 +11,7 @@
*****************************************************************************/
#include "bt_target.h"
-#if defined(AV_INCLUDED) && (AV_INCLUDED == TRUE)
+#if defined(BTA_AV_INCLUDED) && (BTA_AV_INCLUDED == TRUE)
#include <string.h>
#include "bta_av_api.h"
@@ -767,6 +767,7 @@ tBTA_AV_EVT bta_av_proc_meta_cmd(tAVRC_RESPONSE *p_rc_rsp, tBTA_AV_RC_MSG *p_ms
p_vendor->hdr.ctype = BTA_AV_RSP_NOT_IMPL;
AVRC_VendorRsp(p_msg->handle, p_msg->label, &p_msg->msg.vendor);
}
+#if (AVRC_METADATA_INCLUDED == TRUE)
else if (!AVRC_IsValidAvcType(pdu, p_vendor->hdr.ctype) )
{
APPL_TRACE_DEBUG2("Invalid pdu/ctype: 0x%x, %d", pdu, p_vendor->hdr.ctype);
@@ -774,6 +775,7 @@ tBTA_AV_EVT bta_av_proc_meta_cmd(tAVRC_RESPONSE *p_rc_rsp, tBTA_AV_RC_MSG *p_ms
evt = 0;
p_rc_rsp->rsp.status = AVRC_STS_BAD_CMD;
}
+#endif
else
{
switch (pdu)
@@ -1997,4 +1999,4 @@ void bta_av_dereg_comp(tBTA_AV_DATA *p_data)
utl_set_device_class(&cod, BTA_UTL_CLR_COD_SERVICE_CLASS);
}
}
-#endif /* AV_INCLUDED */
+#endif /* BTA_AV_INCLUDED */
diff --git a/bta/av/bta_av_api.c b/bta/av/bta_av_api.c
index 3bb59f7..762692f 100644
--- a/bta/av/bta_av_api.c
+++ b/bta/av/bta_av_api.c
@@ -12,7 +12,7 @@
*****************************************************************************/
#include "bt_target.h"
-#if defined(AV_INCLUDED) && (AV_INCLUDED == TRUE)
+#if defined(BTA_AV_INCLUDED) && (BTA_AV_INCLUDED == TRUE)
#include "bta_api.h"
#include "bd.h"
@@ -565,4 +565,4 @@ void BTA_AvMetaCmd(UINT8 rc_handle, UINT8 label, tBTA_AV_CMD cmd_code, BT_HDR *p
}
}
-#endif /* AV_INCLUDED */
+#endif /* BTA_AV_INCLUDED */
diff --git a/bta/av/bta_av_cfg.c b/bta/av/bta_av_cfg.c
index bb01366..1c6d335 100644
--- a/bta/av/bta_av_cfg.c
+++ b/bta/av/bta_av_cfg.c
@@ -15,24 +15,12 @@
#include "bta_api.h"
#include "bta_av_int.h"
-#ifndef BTA_AV_VDP_INCLUDED
-#define BTA_AV_VDP_INCLUDED TRUE
-#endif
-#if ((VDP_INCLUDED == FALSE) && (BTA_AV_VDP_INCLUDED == TRUE))
-#undef BTA_AV_VDP_INCLUDED
-#define BTA_AV_VDP_INCLUDED FALSE
-#endif
#ifndef BTA_AV_RC_PASS_RSP_CODE
#define BTA_AV_RC_PASS_RSP_CODE BTA_AV_RSP_NOT_IMPL
#endif
-#if (BTA_AV_VDP_INCLUDED == TRUE)
-#define BTA_AV_NUM_A2DP_STRS (BTA_AV_NUM_STRS - 1)
-#else
-#define BTA_AV_NUM_A2DP_STRS (BTA_AV_NUM_STRS)
-#endif
const UINT32 bta_av_meta_caps_co_ids[] = {
AVRC_CO_METADATA,
@@ -175,13 +163,6 @@ const tBTA_AV_CFG bta_av_cfg =
BTA_AV_RC_PASS_RSP_CODE,/* the default response code for pass through commands */
bta_av_meta_caps_co_ids,/* the metadata Get Capabilities response for company id */
bta_av_meta_caps_evt_ids,/* the the metadata Get Capabilities response for event id */
-#if BTA_AV_VDP_INCLUDED == TRUE
- (const tBTA_AV_ACT *)bta_av_vdp_action,/* the action table for VDP */
- bta_av_reg_vdp /* action function to register VDP */
-#else
- (const tBTA_AV_ACT *)NULL,/* the action table for VDP */
- NULL /* action function to register VDP */
-#endif
};
tBTA_AV_CFG *p_bta_av_cfg = (tBTA_AV_CFG *) &bta_av_cfg;
diff --git a/bta/av/bta_av_main.c b/bta/av/bta_av_main.c
index 65c2cfe..ebf11b4 100644
--- a/bta/av/bta_av_main.c
+++ b/bta/av/bta_av_main.c
@@ -11,7 +11,7 @@
*****************************************************************************/
#include "bt_target.h"
-#if defined(AV_INCLUDED) && (AV_INCLUDED == TRUE)
+#if defined(BTA_AV_INCLUDED) && (BTA_AV_INCLUDED == TRUE)
#include <string.h>
#include "bta_av_int.h"
@@ -602,7 +602,6 @@ static void bta_av_api_register(tBTA_AV_DATA *p_data)
bta_av_rc_create(&bta_av_cb, AVCT_ACP, 0, BTA_AV_NUM_LINKS + 1);
/* if the AV and AVK are both supported, it cannot support the CT role */
-#if (BTA_AVK_INCLUDED == FALSE)
if (bta_av_cb.features & (BTA_AV_FEAT_RCCT))
{
/* if TG is not supported, we need to register to AVCT now */
@@ -624,7 +623,6 @@ static void bta_av_api_register(tBTA_AV_DATA *p_data)
p_bta_av_cfg->avrc_ct_cat, BTA_ID_AV);
#endif
}
-#endif
}
bta_av_cb.reg_audio |= BTA_AV_HNDL_TO_MSK(p_scb->hdi);
APPL_TRACE_DEBUG1("reg_audio: 0x%x",bta_av_cb.reg_audio);
@@ -705,14 +703,9 @@ static void bta_av_ci_data(tBTA_AV_DATA *p_data)
**
*******************************************************************************/
#if (AVDT_REPORTING == TRUE)
+
static void bta_av_rpc_conn(tBTA_AV_DATA *p_data)
{
- tBTA_AV_SCB *p_scb = bta_av_hndl_to_scb(p_data->hdr.layer_specific);
- if(p_scb)
- {
- bta_av_co_video_report_conn(p_data->str_msg.msg.report_conn.err_param,
- p_scb->avdt_handle);
- }
}
#endif
@@ -1315,4 +1308,4 @@ char *bta_av_evt_code(UINT16 evt_code)
}
#endif
-#endif /* AV_INCLUDED */
+#endif /* BTA_AV_INCLUDED */
diff --git a/bta/av/bta_av_sbc.c b/bta/av/bta_av_sbc.c
new file mode 100644
index 0000000..ba11752
--- /dev/null
+++ b/bta/av/bta_av_sbc.c
@@ -0,0 +1,577 @@
+/*****************************************************************************
+**
+** Name: bta_av_sbc.c
+**
+** Description: This module contains utility functions for dealing with
+** SBC data frames and codec capabilities.
+**
+** Copyright (c) 2004, Widcomm Inc., All Rights Reserved.
+** Widcomm Bluetooth Core. Proprietary and confidential.
+**
+*****************************************************************************/
+
+#include "a2d_api.h"
+#include "a2d_sbc.h"
+#include "bta_av_sbc.h"
+
+typedef int (tBTA_AV_SBC_ACT)(void *p_src, void *p_dst,
+ UINT32 src_samples, UINT32 dst_samples,
+ UINT32 *p_ret);
+
+typedef struct
+{
+ INT32 cur_pos; /* current position */
+ UINT32 src_sps; /* samples per second (source audio data) */
+ UINT32 dst_sps; /* samples per second (converted audio data) */
+ tBTA_AV_SBC_ACT *p_act; /* the action function to do the conversion */
+ UINT16 bits; /* number of bits per pcm sample */
+ UINT16 n_channels; /* number of channels (i.e. mono(1), stereo(2)...) */
+ INT16 worker1;
+ INT16 worker2;
+ UINT8 div;
+} tBTA_AV_SBC_UPS_CB;
+
+tBTA_AV_SBC_UPS_CB bta_av_sbc_ups_cb;
+
+/*******************************************************************************
+**
+** Function bta_av_sbc_init_up_sample
+**
+** Description initialize the up sample
+**
+** src_sps: samples per second (source audio data)
+** dst_sps: samples per second (converted audio data)
+** bits: number of bits per pcm sample
+** n_channels: number of channels (i.e. mono(1), stereo(2)...)
+**
+** Returns none
+**
+*******************************************************************************/
+void bta_av_sbc_init_up_sample (UINT32 src_sps, UINT32 dst_sps, UINT16 bits, UINT16 n_channels)
+{
+ bta_av_sbc_ups_cb.cur_pos = -1;
+ bta_av_sbc_ups_cb.src_sps = src_sps;
+ bta_av_sbc_ups_cb.dst_sps = dst_sps;
+ bta_av_sbc_ups_cb.bits = bits;
+ bta_av_sbc_ups_cb.n_channels= n_channels;
+
+ if(n_channels == 1)
+ {
+ /* mono */
+ if(bits == 8)
+ {
+ bta_av_sbc_ups_cb.p_act = bta_av_sbc_up_sample_8m;
+ bta_av_sbc_ups_cb.div = 1;
+ }
+ else
+ {
+ bta_av_sbc_ups_cb.p_act = bta_av_sbc_up_sample_16m;
+ bta_av_sbc_ups_cb.div = 2;
+ }
+ }
+ else
+ {
+ /* stereo */
+ if(bits == 8)
+ {
+ bta_av_sbc_ups_cb.p_act = bta_av_sbc_up_sample_8s;
+ bta_av_sbc_ups_cb.div = 2;
+ }
+ else
+ {
+ bta_av_sbc_ups_cb.p_act = bta_av_sbc_up_sample_16s;
+ bta_av_sbc_ups_cb.div = 4;
+ }
+ }
+}
+
+/*******************************************************************************
+**
+** Function bta_av_sbc_up_sample
+**
+** Description Given the source (p_src) audio data and
+** source speed (src_sps, samples per second),
+** This function converts it to audio data in the desired format
+**
+** p_src: the data buffer that holds the source audio data
+** p_dst: the data buffer to hold the converted audio data
+** src_samples: The number of source samples (number of bytes)
+** dst_samples: The size of p_dst (number of bytes)
+**
+** Note: An AE reported an issue with this function.
+** When called with bta_av_sbc_up_sample(src, uint8_array_dst..)
+** the byte before uint8_array_dst may get overwritten.
+** Using uint16_array_dst avoids the problem.
+** This issue is related to endian-ness and is hard to resolve
+** in a generic manner.
+** **************** Please use uint16 array as dst.
+**
+** Returns The number of bytes used in p_dst
+** The number of bytes used in p_src (in *p_ret)
+**
+*******************************************************************************/
+int bta_av_sbc_up_sample (void *p_src, void *p_dst,
+ UINT32 src_samples, UINT32 dst_samples,
+ UINT32 *p_ret)
+{
+ UINT32 src;
+ UINT32 dst;
+
+ if(bta_av_sbc_ups_cb.p_act)
+ {
+ src = src_samples/bta_av_sbc_ups_cb.div;
+ dst = dst_samples/bta_av_sbc_ups_cb.div;
+ return (*bta_av_sbc_ups_cb.p_act)(p_src, p_dst, src, dst, p_ret);
+ }
+ else
+ {
+ *p_ret = 0;
+ return 0;
+ }
+}
+
+/*******************************************************************************
+**
+** Function bta_av_sbc_up_sample_16s (16bits-stereo)
+**
+** Description Given the source (p_src) audio data and
+** source speed (src_sps, samples per second),
+** This function converts it to audio data in the desired format
+**
+** p_src: the data buffer that holds the source audio data
+** p_dst: the data buffer to hold the converted audio data
+** src_samples: The number of source samples (in uint of 4 bytes)
+** dst_samples: The size of p_dst (in uint of 4 bytes)
+**
+** Returns The number of bytes used in p_dst
+** The number of bytes used in p_src (in *p_ret)
+**
+*******************************************************************************/
+int bta_av_sbc_up_sample_16s (void *p_src, void *p_dst,
+ UINT32 src_samples, UINT32 dst_samples,
+ UINT32 *p_ret)
+{
+ INT16 *p_src_tmp = (INT16 *)p_src;
+ INT16 *p_dst_tmp = (INT16 *)p_dst;
+ INT16 *p_worker1 = &bta_av_sbc_ups_cb.worker1;
+ INT16 *p_worker2 = &bta_av_sbc_ups_cb.worker2;
+ UINT32 src_sps = bta_av_sbc_ups_cb.src_sps;
+ UINT32 dst_sps = bta_av_sbc_ups_cb.dst_sps;
+
+ while (bta_av_sbc_ups_cb.cur_pos > 0 && dst_samples)
+ {
+ *p_dst_tmp++ = *p_worker1;
+ *p_dst_tmp++ = *p_worker2;
+
+ bta_av_sbc_ups_cb.cur_pos -= src_sps;
+ dst_samples--;
+ }
+
+ bta_av_sbc_ups_cb.cur_pos = dst_sps;
+
+ while (src_samples-- && dst_samples)
+ {
+ *p_worker1 = *p_src_tmp++;
+ *p_worker2 = *p_src_tmp++;
+
+ do
+ {
+ *p_dst_tmp++ = *p_worker1;
+ *p_dst_tmp++ = *p_worker2;
+
+ bta_av_sbc_ups_cb.cur_pos -= src_sps;
+ dst_samples--;
+ } while (bta_av_sbc_ups_cb.cur_pos > 0 && dst_samples);
+
+ bta_av_sbc_ups_cb.cur_pos += dst_sps;
+ }
+
+ if (bta_av_sbc_ups_cb.cur_pos == (INT32)dst_sps)
+ bta_av_sbc_ups_cb.cur_pos = 0;
+
+ *p_ret = ((char *)p_src_tmp - (char *)p_src);
+ return ((char *)p_dst_tmp - (char *)p_dst);
+}
+
+/*******************************************************************************
+**
+** Function bta_av_sbc_up_sample_16m (16bits-mono)
+**
+** Description Given the source (p_src) audio data and
+** source speed (src_sps, samples per second),
+** This function converts it to audio data in the desired format
+**
+** p_src: the data buffer that holds the source audio data
+** p_dst: the data buffer to hold the converted audio data
+** src_samples: The number of source samples (in uint of 2 bytes)
+** dst_samples: The size of p_dst (in uint of 2 bytes)
+**
+** Returns The number of bytes used in p_dst
+** The number of bytes used in p_src (in *p_ret)
+**
+*******************************************************************************/
+int bta_av_sbc_up_sample_16m (void *p_src, void *p_dst,
+ UINT32 src_samples, UINT32 dst_samples,
+ UINT32 *p_ret)
+{
+ INT16 *p_src_tmp = (INT16 *)p_src;
+ INT16 *p_dst_tmp = (INT16 *)p_dst;
+ INT16 *p_worker = &bta_av_sbc_ups_cb.worker1;
+ UINT32 src_sps = bta_av_sbc_ups_cb.src_sps;
+ UINT32 dst_sps = bta_av_sbc_ups_cb.dst_sps;
+
+ while (bta_av_sbc_ups_cb.cur_pos > 0 && dst_samples)
+ {
+ *p_dst_tmp++ = *p_worker;
+ *p_dst_tmp++ = *p_worker;
+
+ bta_av_sbc_ups_cb.cur_pos -= src_sps;
+ dst_samples--;
+ dst_samples--;
+ }
+
+
+ bta_av_sbc_ups_cb.cur_pos = dst_sps;
+
+ while (src_samples-- && dst_samples)
+ {
+ *p_worker = *p_src_tmp++;
+
+ do
+ {
+ *p_dst_tmp++ = *p_worker;
+ *p_dst_tmp++ = *p_worker;
+
+ bta_av_sbc_ups_cb.cur_pos -= src_sps;
+ dst_samples--;
+ dst_samples--;
+
+ } while (bta_av_sbc_ups_cb.cur_pos > 0 && dst_samples);
+
+ bta_av_sbc_ups_cb.cur_pos += dst_sps;
+ }
+
+ if (bta_av_sbc_ups_cb.cur_pos == (INT32)dst_sps)
+ bta_av_sbc_ups_cb.cur_pos = 0;
+
+ *p_ret = ((char *)p_src_tmp - (char *)p_src);
+ return ((char *)p_dst_tmp - (char *)p_dst);
+}
+
+/*******************************************************************************
+**
+** Function bta_av_sbc_up_sample_8s (8bits-stereo)
+**
+** Description Given the source (p_src) audio data and
+** source speed (src_sps, samples per second),
+** This function converts it to audio data in the desired format
+**
+** p_src: the data buffer that holds the source audio data
+** p_dst: the data buffer to hold the converted audio data
+** src_samples: The number of source samples (in uint of 2 bytes)
+** dst_samples: The size of p_dst (in uint of 2 bytes)
+**
+** Returns The number of bytes used in p_dst
+** The number of bytes used in p_src (in *p_ret)
+**
+*******************************************************************************/
+int bta_av_sbc_up_sample_8s (void *p_src, void *p_dst,
+ UINT32 src_samples, UINT32 dst_samples,
+ UINT32 *p_ret)
+{
+ UINT8 *p_src_tmp = (UINT8 *)p_src;
+ INT16 *p_dst_tmp = (INT16 *)p_dst;
+ INT16 *p_worker1 = &bta_av_sbc_ups_cb.worker1;
+ INT16 *p_worker2 = &bta_av_sbc_ups_cb.worker2;
+ UINT32 src_sps = bta_av_sbc_ups_cb.src_sps;
+ UINT32 dst_sps = bta_av_sbc_ups_cb.dst_sps;
+
+ while (bta_av_sbc_ups_cb.cur_pos > 0 && dst_samples)
+ {
+ *p_dst_tmp++ = *p_worker1;
+ *p_dst_tmp++ = *p_worker2;
+
+ bta_av_sbc_ups_cb.cur_pos -= src_sps;
+ dst_samples--;
+ dst_samples--;
+ }
+
+ bta_av_sbc_ups_cb.cur_pos = dst_sps;
+
+ while (src_samples -- && dst_samples)
+ {
+ *p_worker1 = *(UINT8 *)p_src_tmp++;
+ *p_worker1 -= 0x80;
+ *p_worker1 <<= 8;
+ *p_worker2 = *(UINT8 *)p_src_tmp++;
+ *p_worker2 -= 0x80;
+ *p_worker2 <<= 8;
+
+ do
+ {
+ *p_dst_tmp++ = *p_worker1;
+ *p_dst_tmp++ = *p_worker2;
+
+ bta_av_sbc_ups_cb.cur_pos -= src_sps;
+ dst_samples--;
+ dst_samples--;
+ } while (bta_av_sbc_ups_cb.cur_pos > 0 && dst_samples);
+
+ bta_av_sbc_ups_cb.cur_pos += dst_sps;
+ }
+
+ if (bta_av_sbc_ups_cb.cur_pos == (INT32)dst_sps)
+ bta_av_sbc_ups_cb.cur_pos = 0;
+
+ *p_ret = ((char *)p_src_tmp - (char *)p_src);
+ return ((char *)p_dst_tmp - (char *)p_dst);
+}
+
+/*******************************************************************************
+**
+** Function bta_av_sbc_up_sample_8m (8bits-mono)
+**
+** Description Given the source (p_src) audio data and
+** source speed (src_sps, samples per second),
+** This function converts it to audio data in the desired format
+**
+** p_src: the data buffer that holds the source audio data
+** p_dst: the data buffer to hold the converted audio data
+** src_samples: The number of source samples (number of bytes)
+** dst_samples: The size of p_dst (number of bytes)
+**
+** Returns The number of bytes used in p_dst
+** The number of bytes used in p_src (in *p_ret)
+**
+*******************************************************************************/
+int bta_av_sbc_up_sample_8m (void *p_src, void *p_dst,
+ UINT32 src_samples, UINT32 dst_samples,
+ UINT32 *p_ret)
+{
+ UINT8 *p_src_tmp = (UINT8 *)p_src;
+ INT16 *p_dst_tmp = (INT16 *)p_dst;
+ INT16 *p_worker = &bta_av_sbc_ups_cb.worker1;
+ UINT32 src_sps = bta_av_sbc_ups_cb.src_sps;
+ UINT32 dst_sps = bta_av_sbc_ups_cb.dst_sps;
+
+ while (bta_av_sbc_ups_cb.cur_pos > 0 && dst_samples)
+ {
+ *p_dst_tmp++ = *p_worker;
+ *p_dst_tmp++ = *p_worker;
+
+ bta_av_sbc_ups_cb.cur_pos -= src_sps;
+ dst_samples -= 4;
+ }
+
+
+ bta_av_sbc_ups_cb.cur_pos = dst_sps;
+
+ while (src_samples-- && dst_samples)
+ {
+ *p_worker = *(UINT8 *)p_src_tmp++;
+ *p_worker -= 0x80;
+ *p_worker <<= 8;
+
+ do
+ {
+ *p_dst_tmp++ = *p_worker;
+ *p_dst_tmp++ = *p_worker;
+
+ bta_av_sbc_ups_cb.cur_pos -= src_sps;
+ dst_samples -= 4;
+
+ } while (bta_av_sbc_ups_cb.cur_pos > 0 && dst_samples);
+
+ bta_av_sbc_ups_cb.cur_pos += dst_sps;
+ }
+
+ if (bta_av_sbc_ups_cb.cur_pos == (INT32)dst_sps)
+ bta_av_sbc_ups_cb.cur_pos = 0;
+
+ *p_ret = ((char *)p_src_tmp - (char *)p_src);
+ return ((char *)p_dst_tmp - (char *)p_dst);
+}
+
+/*******************************************************************************
+**
+** Function bta_av_sbc_cfg_for_cap
+**
+** Description Determine the preferred SBC codec configuration for the
+** given codec capabilities. The function is passed the
+** preferred codec configuration and the peer codec
+** capabilities for the stream. The function attempts to
+** match the preferred capabilities with the configuration
+** as best it can. The resulting codec configuration is
+** returned in the same memory used for the capabilities.
+**
+** Returns 0 if ok, nonzero if error.
+** Codec configuration in p_cap.
+**
+*******************************************************************************/
+UINT8 bta_av_sbc_cfg_for_cap(UINT8 *p_peer, tA2D_SBC_CIE *p_cap, tA2D_SBC_CIE *p_pref)
+{
+ UINT8 status = A2D_SUCCESS;
+ tA2D_SBC_CIE peer_cie;
+
+ /* parse peer capabilities */
+ if ((status = A2D_ParsSbcInfo(&peer_cie, p_peer, TRUE)) != 0)
+ {
+ return status;
+ }
+
+ /* Check if the peer supports our channel mode */
+ if (peer_cie.ch_mode & p_pref->ch_mode)
+ {
+ peer_cie.ch_mode = p_pref->ch_mode;
+ }
+ else
+ {
+ APPL_TRACE_ERROR1("bta_av_sbc_cfg_for_cap: ch_mode(0x%02X) not supported", p_pref->ch_mode);
+ return A2D_FAIL;
+ }
+
+ /* Check if the peer supports our sampling freq */
+ if (peer_cie.samp_freq & p_pref->samp_freq)
+ {
+ peer_cie.samp_freq = p_pref->samp_freq;
+ }
+ else
+ {
+ APPL_TRACE_ERROR1("bta_av_sbc_cfg_for_cap: samp_freq(0x%02X) not supported", p_pref->samp_freq);
+ return A2D_FAIL;
+ }
+
+ /* Check if the peer supports our block len */
+ if (peer_cie.block_len & p_pref->block_len)
+ {
+ peer_cie.block_len = p_pref->block_len;
+ }
+ else
+ {
+ APPL_TRACE_ERROR1("bta_av_sbc_cfg_for_cap: block_len(0x%02X) not supported", p_pref->block_len);
+ return A2D_FAIL;
+ }
+
+ /* Check if the peer supports our num subbands */
+ if (peer_cie.num_subbands & p_pref->num_subbands)
+ {
+ peer_cie.num_subbands = p_pref->num_subbands;
+ }
+ else
+ {
+ APPL_TRACE_ERROR1("bta_av_sbc_cfg_for_cap: num_subbands(0x%02X) not supported", p_pref->num_subbands);
+ return A2D_FAIL;
+ }
+
+ /* Check if the peer supports our alloc method */
+ if (peer_cie.alloc_mthd & p_pref->alloc_mthd)
+ {
+ peer_cie.alloc_mthd = p_pref->alloc_mthd;
+ }
+ else
+ {
+ APPL_TRACE_ERROR1("bta_av_sbc_cfg_for_cap: alloc_mthd(0x%02X) not supported", p_pref->alloc_mthd);
+ return A2D_FAIL;
+ }
+
+ /* max bitpool */
+ if (p_pref->max_bitpool != 0 && p_pref->max_bitpool < peer_cie.max_bitpool)
+ {
+ peer_cie.max_bitpool = p_pref->max_bitpool;
+ }
+
+ /* min bitpool */
+ if (p_pref->min_bitpool != 0 && p_pref->min_bitpool > peer_cie.min_bitpool)
+ {
+ peer_cie.min_bitpool = p_pref->min_bitpool;
+ }
+
+ if (status == A2D_SUCCESS)
+ {
+ /* build configuration */
+ A2D_BldSbcInfo(A2D_MEDIA_TYPE_AUDIO, &peer_cie, p_peer);
+ }
+ return status;
+}
+
+/*******************************************************************************
+**
+** Function bta_av_sbc_cfg_in_cap
+**
+** Description This function checks whether an SBC codec configuration
+** is allowable for the given codec capabilities.
+**
+** Returns 0 if ok, nonzero if error.
+**
+*******************************************************************************/
+UINT8 bta_av_sbc_cfg_in_cap(UINT8 *p_cfg, tA2D_SBC_CIE *p_cap)
+{
+ UINT8 status = 0;
+ tA2D_SBC_CIE cfg_cie;
+
+ /* parse configuration */
+ if ((status = A2D_ParsSbcInfo(&cfg_cie, p_cfg, FALSE)) != 0)
+ {
+ return status;
+ }
+
+ /* verify that each parameter is in range */
+
+ /* sampling frequency */
+ if ((cfg_cie.samp_freq & p_cap->samp_freq) == 0)
+ {
+ status = A2D_NS_SAMP_FREQ;
+ }
+ /* channel mode */
+ else if ((cfg_cie.ch_mode & p_cap->ch_mode) == 0)
+ {
+ status = A2D_NS_CH_MODE;
+ }
+ /* block length */
+ else if ((cfg_cie.block_len & p_cap->block_len) == 0)
+ {
+ status = A2D_BAD_BLOCK_LEN;
+ }
+ /* subbands */
+ else if ((cfg_cie.num_subbands & p_cap->num_subbands) == 0)
+ {
+ status = A2D_NS_SUBBANDS;
+ }
+ /* allocation method */
+ else if ((cfg_cie.alloc_mthd & p_cap->alloc_mthd) == 0)
+ {
+ status = A2D_NS_ALLOC_MTHD;
+ }
+ /* max bitpool */
+ else if (cfg_cie.max_bitpool > p_cap->max_bitpool)
+ {
+ status = A2D_NS_MAX_BITPOOL;
+ }
+ /* min bitpool */
+ else if (cfg_cie.min_bitpool < p_cap->min_bitpool)
+ {
+ status = A2D_NS_MIN_BITPOOL;
+ }
+
+ return status;
+}
+
+/*******************************************************************************
+**
+** Function bta_av_sbc_bld_hdr
+**
+** Description This function builds the packet header for MPF1.
+**
+** Returns void
+**
+*******************************************************************************/
+void bta_av_sbc_bld_hdr(BT_HDR *p_buf, UINT16 fr_per_pkt)
+{
+ UINT8 *p;
+
+ p_buf->offset -= BTA_AV_SBC_HDR_SIZE;
+ p = (UINT8 *) (p_buf + 1) + p_buf->offset;
+ p_buf->len += BTA_AV_SBC_HDR_SIZE;
+ A2D_BldSbcMplHdr(p, FALSE, FALSE, FALSE, (UINT8) fr_per_pkt);
+}
+
diff --git a/bta/dm/bta_dm_act.c b/bta/dm/bta_dm_act.c
index 30a77e3..3b3f93b 100755
--- a/bta/dm/bta_dm_act.c
+++ b/bta/dm/bta_dm_act.c
@@ -95,8 +95,8 @@ const UINT16 bta_service_id_to_uuid_lkup_tbl [BTA_MAX_SERVICE_ID] =
UUID_SERVCLASS_DIALUP_NETWORKING, /* BTA_DUN_SERVICE_ID */
UUID_SERVCLASS_FAX, /* BTA_FAX_SERVICE_ID */
UUID_SERVCLASS_LAN_ACCESS_USING_PPP, /* BTA_LAP_SERVICE_ID */
- UUID_SERVCLASS_HEADSET_AUDIO_GATEWAY, /* BTA_HSP_SERVICE_ID */
- UUID_SERVCLASS_AG_HANDSFREE, /* BTA_HFP_SERVICE_ID */
+ UUID_SERVCLASS_HEADSET, /* BTA_HSP_HS_SERVICE_ID */
+ UUID_SERVCLASS_HF_HANDSFREE, /* BTA_HFP_HS_SERVICE_ID */
UUID_SERVCLASS_OBEX_OBJECT_PUSH, /* BTA_OPP_SERVICE_ID */
UUID_SERVCLASS_OBEX_FILE_TRANSFER, /* BTA_FTP_SERVICE_ID */
UUID_SERVCLASS_CORDLESS_TELEPHONY, /* BTA_CTP_SERVICE_ID */
@@ -113,8 +113,8 @@ const UINT16 bta_service_id_to_uuid_lkup_tbl [BTA_MAX_SERVICE_ID] =
UUID_SERVCLASS_HUMAN_INTERFACE, /* BTA_HID_SERVICE_ID */
UUID_SERVCLASS_VIDEO_SINK, /* BTA_VDP_SERVICE_ID */
UUID_SERVCLASS_PBAP_PSE, /* BTA_PBAP_SERVICE_ID */
- UUID_SERVCLASS_HEADSET, /* BTA_HSP_HS_SERVICE_ID */
- UUID_SERVCLASS_HF_HANDSFREE, /* BTA_HFP_HS_SERVICE_ID */
+ UUID_SERVCLASS_HEADSET_AUDIO_GATEWAY, /* BTA_HSP_SERVICE_ID */
+ UUID_SERVCLASS_AG_HANDSFREE, /* BTA_HFP_SERVICE_ID */
UUID_SERVCLASS_MESSAGE_ACCESS, /* BTA_MAP_SERVICE_ID */
UUID_SERVCLASS_MESSAGE_NOTIFICATION, /* BTA_MN_SERVICE_ID */
UUID_SERVCLASS_HDP_PROFILE, /* BTA_HDP_SERVICE_ID */
diff --git a/bta/dm/bta_dm_api.c b/bta/dm/bta_dm_api.c
index d798f5c..4c77f37 100755
--- a/bta/dm/bta_dm_api.c
+++ b/bta/dm/bta_dm_api.c
@@ -1191,7 +1191,7 @@ void BTA_SysFeatures (UINT16 sys_features)
**
** Description This function will request BTA to execute a call back in the context of BTU task
** This API was named in lower case because it is only intended
-** for the internal customers(like BSA).
+** for the internal customers(like BTIF).
**
** Returns void
**
diff --git a/bta/include/bta_api.h b/bta/include/bta_api.h
index e8f5892..57baa4d 100755
--- a/bta/include/bta_api.h
+++ b/bta/include/bta_api.h
@@ -1456,7 +1456,7 @@ BTA_API extern void BTA_SysFeatures (UINT16 sys_features);
**
** Description This function will request BTA to execute a call back in the context of BTU task
** This API was named in lower case because it is only intended
-** for the internal customers(like BSA).
+** for the internal customers(like BTIF).
**
** Returns void
**
diff --git a/bta/include/bta_ar_api.h b/bta/include/bta_ar_api.h
new file mode 100644
index 0000000..bf66dca
--- /dev/null
+++ b/bta/include/bta_ar_api.h
@@ -0,0 +1,127 @@
+/*****************************************************************************
+**
+** Name: bta_ar_api.h
+**
+** Description: This is the public interface file for the simulatenous
+** advanced audio/video streaming (AV) source and sink of BTA,
+** Widcomm's Bluetooth application layer for mobile phones.
+**
+** Copyright (c) 2004-2008, Widcomm Inc., All Rights Reserved.
+** Widcomm Bluetooth Core. Proprietary and confidential.
+**
+*****************************************************************************/
+#ifndef BTA_AR_API_H
+#define BTA_AR_API_H
+
+#include "avdt_api.h"
+#include "avct_api.h"
+#include "avrc_api.h"
+#include "sdp_api.h"
+#include "bta_av_api.h"
+#include "bta_sys.h"
+
+/*****************************************************************************
+** Constants and data types
+*****************************************************************************/
+/* This event signal to AR user that other profile is connected */
+#define BTA_AR_AVDT_CONN_EVT (AVDT_MAX_EVT + 1)
+
+/*******************************************************************************
+**
+** Function bta_ar_init
+**
+** Description This function is called from bta_sys_init().
+** to initialize the control block
+**
+** Returns void
+**
+*******************************************************************************/
+extern void bta_ar_init(void);
+
+/*******************************************************************************
+**
+** Function bta_ar_reg_avdt
+**
+** Description This function is called to register to AVDTP.
+**
+** Returns void
+**
+*******************************************************************************/
+extern void bta_ar_reg_avdt(tAVDT_REG *p_reg, tAVDT_CTRL_CBACK *p_cback, tBTA_SYS_ID sys_id);
+
+/*******************************************************************************
+**
+** Function bta_ar_dereg_avdt
+**
+** Description This function is called to de-register from AVDTP.
+**
+** Returns void
+**
+*******************************************************************************/
+extern void bta_ar_dereg_avdt(tBTA_SYS_ID sys_id);
+
+/*******************************************************************************
+**
+** Function bta_ar_avdt_conn
+**
+** Description This function is called to let ar know that some AVDTP profile
+** is connected for this sys_id.
+** If the other sys modules started a timer for PENDING_EVT,
+** the timer can be stopped now.
+**
+** Returns void
+**
+*******************************************************************************/
+extern void bta_ar_avdt_conn(tBTA_SYS_ID sys_id, BD_ADDR bd_addr);
+
+/*******************************************************************************
+**
+** Function bta_ar_reg_avct
+**
+** Description This function is called to register to AVCTP.
+**
+** Returns void
+**
+*******************************************************************************/
+extern void bta_ar_reg_avct(UINT16 mtu, UINT16 mtu_br, UINT8 sec_mask, tBTA_SYS_ID sys_id);
+
+/*******************************************************************************
+**
+** Function bta_ar_dereg_avct
+**
+** Description This function is called to deregister from AVCTP.
+**
+** Returns void
+**
+*******************************************************************************/
+extern void bta_ar_dereg_avct(tBTA_SYS_ID sys_id);
+
+/******************************************************************************
+**
+** Function bta_ar_reg_avrc
+**
+** Description This function is called to register an SDP record for AVRCP.
+**
+** Returns void
+**
+******************************************************************************/
+extern void bta_ar_reg_avrc(UINT16 service_uuid, char *p_service_name,
+ char *p_provider_name, UINT16 categories, tBTA_SYS_ID sys_id);
+
+/******************************************************************************
+**
+** Function bta_ar_dereg_avrc
+**
+** Description This function is called to de-register/delete an SDP record for AVRCP.
+**
+** Returns void
+**
+******************************************************************************/
+extern void bta_ar_dereg_avrc(UINT16 service_uuid, tBTA_SYS_ID sys_id);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* BTA_AR_API_H */
diff --git a/bta/include/bta_av_api.h b/bta/include/bta_av_api.h
index f639d22..02bc30c 100644
--- a/bta/include/bta_av_api.h
+++ b/bta/include/bta_av_api.h
@@ -17,9 +17,6 @@
#include "avdt_api.h"
#include "a2d_api.h"
#include "bta_api.h"
-#if( defined VDP_INCLUDED) && (VDP_INCLUDED == TRUE)
-#include "vdp_api.h"
-#endif
/*****************************************************************************
** Constants and data types
@@ -238,6 +235,8 @@ typedef UINT8 tBTA_AV_ERR;
#define BTA_AV_META_MSG_EVT 17 /* metadata messages */
#define BTA_AV_REJECT_EVT 18 /* incoming connection rejected */
#define BTA_AV_RC_FEAT_EVT 19 /* remote control channel peer supported features update */
+/* Max BTA event */
+#define BTA_AV_MAX_EVT 20
typedef UINT8 tBTA_AV_EVT;
diff --git a/bta/include/bta_av_co.h b/bta/include/bta_av_co.h
index 2f41180..f2fa83b 100644
--- a/bta/include/bta_av_co.h
+++ b/bta/include/bta_av_co.h
@@ -47,12 +47,6 @@ enum
BTA_AV_CO_ST_STREAM
};
-/* data type for the Video Codec Information Element*/
-typedef struct
-{
- UINT8 codec_type; /* Codec type */
- UINT8 levels; /* level mask */
-} tBTA_AV_VIDEO_CFG;
/* data type for the Audio Codec Information*/
typedef struct
@@ -83,22 +77,6 @@ BTA_API extern BOOLEAN bta_av_co_audio_init(UINT8 *p_codec_type, UINT8 *p_codec_
/*******************************************************************************
**
-** Function bta_av_co_video_init
-**
-** Description This callout function is executed by AV when it is
-** started by calling BTA_AvEnable(). This function can be
-** used by the phone to initialize video paths or for other
-** initialization purposes.
-**
-**
-** Returns Stream codec and content protection capabilities info.
-**
-*******************************************************************************/
-BTA_API extern BOOLEAN bta_av_co_video_init(UINT8 *p_codec_type, UINT8 *p_codec_info,
- UINT8 *p_num_protect, UINT8 *p_protect_info, UINT8 index);
-
-/*******************************************************************************
-**
** Function bta_av_co_audio_disc_res
**
** Description This callout function is executed by AV to report the
@@ -263,7 +241,8 @@ BTA_API extern void bta_av_co_video_close(tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec
** Returns void
**
*******************************************************************************/
-BTA_API extern void bta_av_co_audio_start(tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type);
+BTA_API extern void bta_av_co_audio_start(tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type,
+ UINT8 *p_codec_info, BOOLEAN *p_no_rtp_hdr);
/*******************************************************************************
**
@@ -276,7 +255,8 @@ BTA_API extern void bta_av_co_audio_start(tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec
** Returns void
**
*******************************************************************************/
-BTA_API extern void bta_av_co_video_start(tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type);
+BTA_API extern void bta_av_co_video_start(tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type,
+ UINT8 *p_codec_info, BOOLEAN *p_no_rtp_hdr);
/*******************************************************************************
**
diff --git a/bta/include/bta_av_sbc.h b/bta/include/bta_av_sbc.h
new file mode 100644
index 0000000..157ba08
--- /dev/null
+++ b/bta/include/bta_av_sbc.h
@@ -0,0 +1,194 @@
+/*****************************************************************************
+**
+** Name: bta_av_sbc.h
+**
+** Description: This is the interface to utility functions for dealing
+** with SBC data frames and codec capabilities.
+**
+** Copyright (c) 2004, Widcomm Inc., All Rights Reserved.
+** Widcomm Bluetooth Core. Proprietary and confidential.
+**
+*****************************************************************************/
+#ifndef BTA_AV_SBC_H
+#define BTA_AV_SBC_H
+
+/*****************************************************************************
+** constants
+*****************************************************************************/
+
+/* SBC packet header size */
+#define BTA_AV_SBC_HDR_SIZE A2D_SBC_MPL_HDR_LEN
+
+/*******************************************************************************
+**
+** Function bta_av_sbc_init_up_sample
+**
+** Description initialize the up sample
+**
+** src_sps: samples per second (source audio data)
+** dst_sps: samples per second (converted audio data)
+** bits: number of bits per pcm sample
+** n_channels: number of channels (i.e. mono(1), stereo(2)...)
+**
+** Returns none
+**
+*******************************************************************************/
+extern void bta_av_sbc_init_up_sample (UINT32 src_sps, UINT32 dst_sps,
+ UINT16 bits, UINT16 n_channels);
+
+/*******************************************************************************
+**
+** Function bta_av_sbc_up_sample
+**
+** Description Given the source (p_src) audio data and
+** source speed (src_sps, samples per second),
+** This function converts it to audio data in the desired format
+**
+** p_src: the data buffer that holds the source audio data
+** p_dst: the data buffer to hold the converted audio data
+** src_samples: The number of source samples (number of bytes)
+** dst_samples: The size of p_dst (number of bytes)
+**
+** Note: An AE reported an issue with this function.
+** When called with bta_av_sbc_up_sample(src, uint8_array_dst..)
+** the byte before uint8_array_dst may get overwritten.
+** Using uint16_array_dst avoids the problem.
+** This issue is related to endian-ness and is hard to resolve
+** in a generic manner.
+** **************** Please use uint16 array as dst.
+**
+** Returns The number of bytes used in p_dst
+** The number of bytes used in p_src (in *p_ret)
+**
+*******************************************************************************/
+extern int bta_av_sbc_up_sample (void *p_src, void *p_dst,
+ UINT32 src_samples, UINT32 dst_samples,
+ UINT32 *p_ret);
+
+/*******************************************************************************
+**
+** Function bta_av_sbc_up_sample_16s (16bits-stereo)
+**
+** Description Given the source (p_src) audio data and
+** source speed (src_sps, samples per second),
+** This function converts it to audio data in the desired format
+**
+** p_src: the data buffer that holds the source audio data
+** p_dst: the data buffer to hold the converted audio data
+** src_samples: The number of source samples (in uint of 4 bytes)
+** dst_samples: The size of p_dst (in uint of 4 bytes)
+**
+** Returns The number of bytes used in p_dst
+** The number of bytes used in p_src (in *p_ret)
+**
+*******************************************************************************/
+extern int bta_av_sbc_up_sample_16s (void *p_src, void *p_dst,
+ UINT32 src_samples, UINT32 dst_samples,
+ UINT32 *p_ret);
+
+/*******************************************************************************
+**
+** Function bta_av_sbc_up_sample_16m (16bits-mono)
+**
+** Description Given the source (p_src) audio data and
+** source speed (src_sps, samples per second),
+** This function converts it to audio data in the desired format
+**
+** p_src: the data buffer that holds the source audio data
+** p_dst: the data buffer to hold the converted audio data
+** src_samples: The number of source samples (in uint of 2 bytes)
+** dst_samples: The size of p_dst (in uint of 2 bytes)
+**
+** Returns The number of bytes used in p_dst
+** The number of bytes used in p_src (in *p_ret)
+**
+*******************************************************************************/
+extern int bta_av_sbc_up_sample_16m (void *p_src, void *p_dst,
+ UINT32 src_samples, UINT32 dst_samples,
+ UINT32 *p_ret);
+
+/*******************************************************************************
+**
+** Function bta_av_sbc_up_sample_8s (8bits-stereo)
+**
+** Description Given the source (p_src) audio data and
+** source speed (src_sps, samples per second),
+** This function converts it to audio data in the desired format
+**
+** p_src: the data buffer that holds the source audio data
+** p_dst: the data buffer to hold the converted audio data
+** src_samples: The number of source samples (in uint of 2 bytes)
+** dst_samples: The size of p_dst (in uint of 2 bytes)
+**
+** Returns The number of bytes used in p_dst
+** The number of bytes used in p_src (in *p_ret)
+**
+*******************************************************************************/
+extern int bta_av_sbc_up_sample_8s (void *p_src, void *p_dst,
+ UINT32 src_samples, UINT32 dst_samples,
+ UINT32 *p_ret);
+
+/*******************************************************************************
+**
+** Function bta_av_sbc_up_sample_8m (8bits-mono)
+**
+** Description Given the source (p_src) audio data and
+** source speed (src_sps, samples per second),
+** This function converts it to audio data in the desired format
+**
+** p_src: the data buffer that holds the source audio data
+** p_dst: the data buffer to hold the converted audio data
+** src_samples: The number of source samples (number of bytes)
+** dst_samples: The size of p_dst (number of bytes)
+**
+** Returns The number of bytes used in p_dst
+** The number of bytes used in p_src (in *p_ret)
+**
+*******************************************************************************/
+extern int bta_av_sbc_up_sample_8m (void *p_src, void *p_dst,
+ UINT32 src_samples, UINT32 dst_samples,
+ UINT32 *p_ret);
+
+/*******************************************************************************
+**
+** Function bta_av_sbc_cfg_for_cap
+**
+** Description Determine the preferred SBC codec configuration for the
+** given codec capabilities. The function is passed the
+** preferred codec configuration and the peer codec
+** capabilities for the stream. The function attempts to
+** match the preferred capabilities with the configuration
+** as best it can. The resulting codec configuration is
+** returned in the same memory used for the capabilities.
+**
+** Returns 0 if ok, nonzero if error.
+** Codec configuration in p_cap.
+**
+*******************************************************************************/
+extern UINT8 bta_av_sbc_cfg_for_cap(UINT8 *p_peer, tA2D_SBC_CIE *p_cap, tA2D_SBC_CIE *p_pref);
+
+/*******************************************************************************
+**
+** Function bta_av_sbc_cfg_in_cap
+**
+** Description This function checks whether an SBC codec configuration
+** is allowable for the given codec capabilities.
+**
+** Returns 0 if ok, nonzero if error.
+**
+*******************************************************************************/
+extern UINT8 bta_av_sbc_cfg_in_cap(UINT8 *p_cfg, tA2D_SBC_CIE *p_cap);
+
+/*******************************************************************************
+**
+** Function bta_av_sbc_bld_hdr
+**
+** Description This function builds the packet header for MPF1.
+**
+** Returns void
+**
+*******************************************************************************/
+extern void bta_av_sbc_bld_hdr(BT_HDR *p_buf, UINT16 fr_per_pkt);
+
+#endif /* BTA_AV_SBC_H */
+