Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 80c1d1ac authored by Mudumba Ananth's avatar Mudumba Ananth Committed by Chris Manton
Browse files

Resolved hardware error observed during SCO Connection setup

Hardware error was caused due to a faulty HCI command formed in the
process of vendor specific pre-SCO setup in the stack(set_audio_state)

Fixed the above problem and also added back the vendor (interface)
mapping for the set_audio_state functionality to facilitate the
sending of the pre-SCO vendor specific commands.

Made common vendor library audio setting by moving to hci subsystem.

General cleanup around this functionality.

Bug: 19923226
Change-Id: I4a743f6725459f360bd2a90e0a46f08fcca2292d
parent 1b24cb02
Loading
Loading
Loading
Loading
+10 −11
Original line number Diff line number Diff line
@@ -559,7 +559,7 @@ static void bta_ag_create_sco(tBTA_AG_SCB *p_scb, BOOLEAN is_orig)

#if (BTM_WBS_INCLUDED == TRUE )
        /* Allow any platform specific pre-SCO set up to take place */
        bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_SETUP,\
        bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, SCO_STATE_SETUP,
                esco_codec);

        /* This setting may not be necessary */
@@ -572,7 +572,7 @@ static void bta_ag_create_sco(tBTA_AG_SCB *p_scb, BOOLEAN is_orig)
        p_scb->inuse_codec = esco_codec;
#else
        /* Allow any platform specific pre-SCO set up to take place */
        bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_SETUP);
        bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, SCO_STATE_SETUP);
#endif

#if (BTM_SCO_HCI_INCLUDED == TRUE )
@@ -1456,10 +1456,10 @@ void bta_ag_sco_conn_open(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data)
    bta_sys_sco_open(BTA_ID_AG, p_scb->app_id, p_scb->peer_addr);

#if (BTM_WBS_INCLUDED == TRUE)
    bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_ON,
    bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, SCO_STATE_ON,
                          p_scb->inuse_codec);
#else
    bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_ON);
    bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, SCO_STATE_ON);
#endif

#if (BTM_SCO_HCI_INCLUDED == TRUE )
@@ -1519,14 +1519,13 @@ void bta_ag_sco_conn_close(tBTA_AG_SCB *p_scb, tBTA_AG_DATA *p_data)
#endif
    else
    {
        sco_state_t sco_state = bta_ag_cb.sco.p_xfer_scb ? SCO_STATE_OFF_TRANSFER : SCO_STATE_OFF;
#if (BTM_WBS_INCLUDED == TRUE)
        /* Indicate if the closing of audio is because of transfer */
        bta_ag_co_audio_state(handle, p_scb->app_id,(bta_ag_cb.sco.p_xfer_scb)?\
        BTA_AG_CO_AUD_STATE_OFF_XFER:BTA_AG_CO_AUD_STATE_OFF,p_scb->inuse_codec);
        bta_ag_co_audio_state(handle, p_scb->app_id, sco_state, p_scb->inuse_codec);
#else
        /* Indicate if the closing of audio is because of transfer */
        bta_ag_co_audio_state(handle, p_scb->app_id,(bta_ag_cb.sco.p_xfer_scb)?\
        BTA_AG_CO_AUD_STATE_OFF_XFER:BTA_AG_CO_AUD_STATE_OFF);
        bta_ag_co_audio_state(handle, p_scb->app_id, sco_state);
#endif
        bta_ag_sco_event(p_scb, BTA_AG_SCO_CONN_CLOSE_E);

@@ -1606,11 +1605,11 @@ void bta_ag_sco_conn_rsp(tBTA_AG_SCB *p_scb, tBTM_ESCO_CONN_REQ_EVT_DATA *p_data

#if (BTM_WBS_INCLUDED == FALSE )
        /* Allow any platform specific pre-SCO set up to take place */
        bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_SETUP);
        bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, SCO_STATE_SETUP);
#else
        /* When HS initiated SCO, it cannot be WBS. */
        /* Allow any platform specific pre-SCO set up to take place */
        bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, BTA_AG_CO_AUD_STATE_SETUP,
        bta_ag_co_audio_state(bta_ag_scb_to_idx(p_scb), p_scb->app_id, SCO_STATE_SETUP,
                              BTA_AG_CODEC_CVSD);
#endif

+2 −0
Original line number Diff line number Diff line
@@ -114,6 +114,8 @@ typedef UINT8 tBTA_AG_RES;
typedef UINT16 tBTA_AG_PEER_FEAT;

/* HFP peer supported codec masks */
// TODO(google) This should use common definitions
// in hci/include/hci_audio.h
#define BTA_AG_CODEC_NONE           BTM_SCO_CODEC_NONE
#define BTA_AG_CODEC_CVSD           BTM_SCO_CODEC_CVSD      /* CVSD */
#define BTA_AG_CODEC_MSBC           BTM_SCO_CODEC_MSBC      /* mSBC */
+2 −11
Original line number Diff line number Diff line
@@ -25,12 +25,7 @@
#define BTA_AG_CO_H

#include "bta_ag_api.h"

/* Definitions for audio state callout function "state" parameter */
#define BTA_AG_CO_AUD_STATE_OFF         0
#define BTA_AG_CO_AUD_STATE_OFF_XFER    1   /* Closed pending transfer of audio */
#define BTA_AG_CO_AUD_STATE_ON          2
#define BTA_AG_CO_AUD_STATE_SETUP       3
#include "hci/include/hci_audio.h"

/*******************************************************************************
**
@@ -56,12 +51,8 @@ extern void bta_ag_co_init(void);
**
** Parameters       handle - handle of the AG instance
**                  state - Audio state
**                      BTA_AG_CO_AUD_STATE_OFF      - Audio has been turned off
**                      BTA_AG_CO_AUD_STATE_OFF_XFER - Audio is closed pending transfer
**                      BTA_AG_CO_AUD_STATE_ON       - Audio has been turned on
**                      BTA_AG_CO_AUD_STATE_SETUP    - Audio is about to be turned on
**                  codec - if WBS support is compiled in, codec to going to be used is provided
**                      and when in BTA_AG_CO_AUD_STATE_SETUP, BTM_I2SPCMConfig() must be called with
**                      and when in SCO_STATE_SETUP, BTM_I2SPCMConfig() must be called with
**                      the correct platform parameters.
**                      in the other states codec type should not be ignored
**
+10 −34
Original line number Diff line number Diff line
@@ -18,28 +18,10 @@

#define LOG_TAG "bt_btif_bta_ag"

#include "gki.h"
#include "bta_api.h"
#include "bta_sys.h"
#include "bta_ag_api.h"
#include "bta_ag_co.h"
#include "bt_utils.h"

#ifndef LINUX_NATIVE
#include <cutils/properties.h>
#else
#include <stdio.h>
#define LOGI(format, ...)  fprintf (stdout, LOG_TAG format"\n", ## __VA_ARGS__)
#define LOGD(format, ...)  fprintf (stdout, LOG_TAG format"\n", ## __VA_ARGS__)
#define LOGV(format, ...)  fprintf (stdout, LOG_TAG format"\n", ## __VA_ARGS__)
#define LOGE(format, ...)  fprintf (stderr, LOG_TAG format"\n", ## __VA_ARGS__)
#endif


/************************************************************************************
**  Externs
************************************************************************************/
extern int set_audio_state(UINT16 handle, UINT16 codec, UINT8 state, void *param);
#include "hci/include/hci_audio.h"
#include "osi/include/osi.h"

/*******************************************************************************
**
@@ -69,12 +51,8 @@ void bta_ag_co_init(void)
**
** Parameters       handle - handle of the AG instance
**                  state - Audio state
**                      BTA_AG_CO_AUD_STATE_OFF     - Audio has been turned off
**                      BTA_AG_CO_AUD_STATE_OFF_XFER - Audio has been turned off (xfer)
**                      BTA_AG_CO_AUD_STATE_ON      - Audio has been turned on
**                      BTA_AG_CO_AUD_STATE_SETUP   - Audio is about to be turned on
**                  codec - if WBS support is compiled in, codec to going to be used is provided
**                      and when in BTA_AG_CO_AUD_STATE_SETUP, BTM_I2SPCMConfig() must be called with
**                      and when in SCO_STATE_SETUP, BTM_I2SPCMConfig() must be called with
**                      the correct platform parameters.
**                      in the other states codec type should not be ignored
**
@@ -90,24 +68,24 @@ void bta_ag_co_audio_state(UINT16 handle, UINT8 app_id, UINT8 state)
    BTIF_TRACE_DEBUG("bta_ag_co_audio_state: handle %d, state %d", handle, state);
    switch (state)
    {
    case BTA_AG_CO_AUD_STATE_OFF:
    case SCO_STATE_OFF:
#if (BTM_WBS_INCLUDED == TRUE )
        BTIF_TRACE_DEBUG("bta_ag_co_audio_state(handle %d)::Closed (OFF), codec: 0x%x",
                        handle, codec);
        set_audio_state(handle, codec, state, NULL);
        set_audio_state(handle, codec, state);
#else
        BTIF_TRACE_DEBUG("bta_ag_co_audio_state(handle %d)::Closed (OFF)",
                        handle);
#endif
        break;
    case BTA_AG_CO_AUD_STATE_OFF_XFER:
    case SCO_STATE_OFF_TRANSFER:
        BTIF_TRACE_DEBUG("bta_ag_co_audio_state(handle %d)::Closed (XFERRING)", handle);
        break;
    case BTA_AG_CO_AUD_STATE_SETUP:
    case SCO_STATE_SETUP:
#if (BTM_WBS_INCLUDED == TRUE )
        set_audio_state(handle, codec, state, NULL);
        set_audio_state(handle, codec, state);
#else
        set_audio_state(handle, BTA_AG_CODEC_CVSD, state, NULL);
        set_audio_state(handle, BTA_AG_CODEC_CVSD, state);
#endif
        break;
    default:
@@ -170,9 +148,7 @@ void bta_ag_co_data_close(UINT16 handle)
 ** Returns          void
 **
 *******************************************************************************/
void bta_ag_co_tx_write(UINT16 handle, UINT8 * p_data, UINT16 len)
void bta_ag_co_tx_write(UINT16 handle, UNUSED_ATTR UINT8 * p_data, UINT16 len)
{
    UNUSED(p_data);
    BTIF_TRACE_DEBUG( "bta_ag_co_tx_write: handle: %d, len: %d", handle, len );
}
+1 −0
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@ LOCAL_SRC_FILES := \
    src/btsnoop.c \
    src/btsnoop_net.c \
    src/buffer_allocator.c \
    src/hci_audio.c \
    src/hci_hal.c \
    src/hci_hal_h4.c \
    src/hci_hal_mct.c \
Loading