summaryrefslogtreecommitdiffstats
path: root/btif
diff options
context:
space:
mode:
Diffstat (limited to 'btif')
-rw-r--r--btif/include/btif_av.h1
-rw-r--r--btif/include/btif_media.h2
-rw-r--r--btif/src/btif_av.c31
-rw-r--r--btif/src/btif_media_task.c46
4 files changed, 77 insertions, 3 deletions
diff --git a/btif/include/btif_av.h b/btif/include/btif_av.h
index cedc1b7fe..4b116eeb2 100644
--- a/btif/include/btif_av.h
+++ b/btif/include/btif_av.h
@@ -45,6 +45,7 @@ typedef enum {
BTIF_AV_STOP_STREAM_REQ_EVT,
BTIF_AV_SUSPEND_STREAM_REQ_EVT,
BTIF_AV_SINK_CONFIG_REQ_EVT,
+ BTIF_AV_OFFLOAD_START_REQ_EVT,
} btif_av_sm_event_t;
diff --git a/btif/include/btif_media.h b/btif/include/btif_media.h
index 2ec19cbdf..01fdf7372 100644
--- a/btif/include/btif_media.h
+++ b/btif/include/btif_media.h
@@ -274,6 +274,8 @@ void btif_a2dp_set_tx_flush(BOOLEAN enable);
void btif_a2dp_set_rx_flush(BOOLEAN enable);
void btif_media_check_iop_exceptions(UINT8 *peer_bda);
void btif_reset_decoder(UINT8 *p_av);
+void btif_a2dp_on_offload_started(tBTA_AV_STATUS status);
+
int btif_a2dp_get_track_frequency(UINT8 frequency);
int btif_a2dp_get_track_channel_count(UINT8 channeltype);
diff --git a/btif/src/btif_av.c b/btif/src/btif_av.c
index 5715748fc..0d87c5750 100644
--- a/btif/src/btif_av.c
+++ b/btif/src/btif_av.c
@@ -194,6 +194,7 @@ const char *dump_av_sm_event_name(btif_av_sm_event_t event)
CASE_RETURN_STR(BTA_AV_META_MSG_EVT)
CASE_RETURN_STR(BTA_AV_REJECT_EVT)
CASE_RETURN_STR(BTA_AV_RC_FEAT_EVT)
+ CASE_RETURN_STR(BTA_AV_OFFLOAD_START_RSP_EVT)
CASE_RETURN_STR(BTIF_SM_ENTER_EVT)
CASE_RETURN_STR(BTIF_SM_EXIT_EVT)
CASE_RETURN_STR(BTIF_AV_CONNECT_REQ_EVT)
@@ -202,6 +203,7 @@ const char *dump_av_sm_event_name(btif_av_sm_event_t event)
CASE_RETURN_STR(BTIF_AV_STOP_STREAM_REQ_EVT)
CASE_RETURN_STR(BTIF_AV_SUSPEND_STREAM_REQ_EVT)
CASE_RETURN_STR(BTIF_AV_SINK_CONFIG_REQ_EVT)
+ CASE_RETURN_STR(BTIF_AV_OFFLOAD_START_REQ_EVT)
default: return "UNKNOWN_EVENT";
}
}
@@ -351,6 +353,11 @@ static BOOLEAN btif_av_state_idle_handler(btif_sm_event_t event, void *p_data)
btif_rc_handler(event, p_data);
break;
+ case BTIF_AV_OFFLOAD_START_REQ_EVT:
+ BTIF_TRACE_ERROR("BTIF_AV_OFFLOAD_START_REQ_EVT: Stream not Started IDLE");
+ btif_a2dp_on_offload_started(BTA_AV_FAIL);
+ break;
+
default:
BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__,
dump_av_sm_event_name(event));
@@ -483,6 +490,11 @@ static BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *p_data
break;
}
+ case BTIF_AV_OFFLOAD_START_REQ_EVT:
+ btif_a2dp_on_offload_started(BTA_AV_FAIL);
+ BTIF_TRACE_ERROR("BTIF_AV_OFFLOAD_START_REQ_EVT: Stream not Started OPENING");
+ break;
+
CHECK_RC_EVENT(event, p_data);
default:
@@ -557,6 +569,11 @@ static BOOLEAN btif_av_state_closing_handler(btif_sm_event_t event, void *p_data
btif_rc_handler(event, (tBTA_AV*)p_data);
break;
+ case BTIF_AV_OFFLOAD_START_REQ_EVT:
+ btif_a2dp_on_offload_started(BTA_AV_FAIL);
+ BTIF_TRACE_ERROR("BTIF_AV_OFFLOAD_START_REQ_EVT: Stream not Started Closing");
+ break;
+
default:
BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__,
dump_av_sm_event_name(event));
@@ -713,6 +730,11 @@ static BOOLEAN btif_av_state_opened_handler(btif_sm_event_t event, void *p_data)
btif_queue_advance();
break;
+ case BTIF_AV_OFFLOAD_START_REQ_EVT:
+ btif_a2dp_on_offload_started(BTA_AV_FAIL);
+ BTIF_TRACE_ERROR("BTIF_AV_OFFLOAD_START_REQ_EVT: Stream not Started Opened");
+ break;
+
CHECK_RC_EVENT(event, p_data);
default:
@@ -879,6 +901,15 @@ static BOOLEAN btif_av_state_started_handler(btif_sm_event_t event, void *p_data
btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE);
break;
+ case BTIF_AV_OFFLOAD_START_REQ_EVT:
+ BTA_AvOffloadStart(btif_av_cb.bta_handle);
+ break;
+
+ case BTA_AV_OFFLOAD_START_RSP_EVT:
+
+ btif_a2dp_on_offload_started(p_av->status);
+ break;
+
CHECK_RC_EVENT(event, p_data);
default:
diff --git a/btif/src/btif_media_task.c b/btif/src/btif_media_task.c
index b6f3f0cce..5e64290a7 100644
--- a/btif/src/btif_media_task.c
+++ b/btif/src/btif_media_task.c
@@ -40,6 +40,8 @@
#include <sys/time.h>
#include <errno.h>
+#define LOG_TAG "BTIF-MEDIA"
+
#include "bt_target.h"
#include "osi/include/fixed_queue.h"
#include "gki.h"
@@ -372,6 +374,8 @@ static const char* dump_a2dp_ctrl_event(UINT8 event)
CASE_RETURN_STR(A2DP_CTRL_CMD_START)
CASE_RETURN_STR(A2DP_CTRL_CMD_STOP)
CASE_RETURN_STR(A2DP_CTRL_CMD_SUSPEND)
+ CASE_RETURN_STR(A2DP_CTRL_CMD_OFFLOAD_START)
+
default:
return "UNKNOWN MSG ID";
}
@@ -531,6 +535,10 @@ static void btif_recv_ctrl_data(void)
break;
}
+ case A2DP_CTRL_CMD_OFFLOAD_START:
+ btif_dispatch_sm_event(BTIF_AV_OFFLOAD_START_REQ_EVT, NULL, 0);
+ break;
+
default:
APPL_TRACE_ERROR("UNSUPPORTED CMD (%d)", cmd);
a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
@@ -801,9 +809,9 @@ void btif_a2dp_setup_codec(void)
GKI_disable();
/* for now hardcode 44.1 khz 16 bit stereo PCM format */
- media_feeding.cfg.pcm.sampling_freq = 44100;
- media_feeding.cfg.pcm.bit_per_sample = 16;
- media_feeding.cfg.pcm.num_channel = 2;
+ media_feeding.cfg.pcm.sampling_freq = BTIF_A2DP_SRC_SAMPLING_RATE;
+ media_feeding.cfg.pcm.bit_per_sample = BTIF_A2DP_SRC_BIT_DEPTH;
+ media_feeding.cfg.pcm.num_channel = BTIF_A2DP_SRC_NUM_CHANNELS;
media_feeding.format = BTIF_AV_CODEC_PCM;
if (bta_av_co_audio_set_codec(&media_feeding, &status))
@@ -1080,6 +1088,38 @@ void btif_a2dp_on_suspended(tBTA_AV_SUSPEND *p_av)
btif_media_task_stop_aa_req();
}
+
+/*****************************************************************************
+**
+** Function btif_a2dp_on_offload_started
+**
+** Description
+**
+** Returns
+**
+*******************************************************************************/
+void btif_a2dp_on_offload_started(tBTA_AV_STATUS status)
+{
+ tA2DP_CTRL_ACK ack;
+ APPL_TRACE_EVENT("%s status %d", __func__, status);
+
+ switch (status) {
+ case BTA_AV_SUCCESS:
+ ack = A2DP_CTRL_ACK_SUCCESS;
+ break;
+
+ case BTA_AV_FAIL_RESOURCES:
+ APPL_TRACE_ERROR("%s FAILED UNSUPPORTED", __func__);
+ ack = A2DP_CTRL_ACK_UNSUPPORTED;
+ break;
+ default:
+ APPL_TRACE_ERROR("%s FAILED", __func__);
+ ack = A2DP_CTRL_ACK_FAILURE;
+ break;
+ }
+ a2dp_cmd_acknowledge(ack);
+}
+
/* when true media task discards any rx frames */
void btif_a2dp_set_rx_flush(BOOLEAN enable)
{