diff options
Diffstat (limited to 'btif')
-rw-r--r-- | btif/include/btif_av.h | 1 | ||||
-rw-r--r-- | btif/include/btif_media.h | 2 | ||||
-rw-r--r-- | btif/src/btif_av.c | 31 | ||||
-rw-r--r-- | btif/src/btif_media_task.c | 46 |
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) { |