diff options
Diffstat (limited to 'btif/src/btif_media_task.c')
-rw-r--r-- | btif/src/btif_media_task.c | 118 |
1 files changed, 109 insertions, 9 deletions
diff --git a/btif/src/btif_media_task.c b/btif/src/btif_media_task.c index 18a0c1b0a..d68811982 100644 --- a/btif/src/btif_media_task.c +++ b/btif/src/btif_media_task.c @@ -80,6 +80,9 @@ #include "oi_codec_sbc.h" #include "oi_status.h" #endif +#ifdef USE_AUDIO_TRACK +#include "bluetoothTrack.h" +#endif #include "stdio.h" #include <dlfcn.h> @@ -123,6 +126,9 @@ enum BTIF_MEDIA_AUDIO_RECEIVING_INIT, BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE, BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK +#ifdef USE_AUDIO_TRACK + ,BTIF_MEDIA_AUDIO_SINK_SET_FOCUS_STATE +#endif }; enum { @@ -261,6 +267,9 @@ typedef struct UINT32 sample_rate; UINT8 channel_count; +#ifdef USE_AUDIO_TRACK + btif_media_audio_focus_state rx_audio_focus_state; +#endif alarm_t *media_alarm; alarm_t *decode_alarm; UINT8 TxNumSBCFrames; @@ -388,7 +397,9 @@ UNUSED_ATTR static const char *dump_media_event(UINT16 event) CASE_RETURN_STR(BTIF_MEDIA_AUDIO_RECEIVING_INIT) CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE) CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK) - +#ifdef USE_AUDIO_TRACK + CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_SET_FOCUS_STATE) +#endif default: return "UNKNOWN MEDIA EVENT"; } @@ -902,6 +913,9 @@ void btif_a2dp_on_idle(void) btif_media_task_aa_rx_flush_req(); btif_media_task_aa_handle_stop_decoding(); btif_media_task_clear_track(); +#ifdef USE_AUDIO_TRACK + btif_media_cb.rx_audio_focus_state = BTIF_MEDIA_FOCUS_IDLE; +#endif APPL_TRACE_DEBUG("Stopped BT track"); } #endif @@ -1066,7 +1080,9 @@ void btif_a2dp_on_stopped(tBTA_AV_SUSPEND *p_av) btif_media_cb.rx_flush = TRUE; btif_media_task_aa_rx_flush_req(); btif_media_task_aa_handle_stop_decoding(); +#ifndef USE_AUDIO_TRACK UIPC_Close(UIPC_CH_ID_AV_AUDIO); +#endif btif_media_cb.data_channel_open = FALSE; return; } @@ -1112,7 +1128,9 @@ void btif_a2dp_on_suspended(tBTA_AV_SUSPEND *p_av) btif_media_cb.rx_flush = TRUE; btif_media_task_aa_rx_flush_req(); btif_media_task_aa_handle_stop_decoding(); +#ifndef USE_AUDIO_TRACK UIPC_Close(UIPC_CH_ID_AV_AUDIO); +#endif return; } @@ -1145,7 +1163,22 @@ void btif_a2dp_set_tx_flush(BOOLEAN enable) APPL_TRACE_EVENT("## DROP TX %d ##", enable); btif_media_cb.tx_flush = enable; } +#ifdef USE_AUDIO_TRACK +void btif_a2dp_set_audio_focus_state(btif_media_audio_focus_state state) +{ + APPL_TRACE_EVENT("btif_a2dp_set_audio_focus_state"); + tBTIF_MEDIA_SINK_FOCUS_UPDATE *p_buf; + if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_SINK_FOCUS_UPDATE)))) + { + APPL_TRACE_EVENT("btif_a2dp_set_audio_focus_state No Buffer "); + return; + } + p_buf->focus_state = state; + p_buf->hdr.event = BTIF_MEDIA_AUDIO_SINK_SET_FOCUS_STATE; + fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf); +} +#endif #if (BTA_AV_SINK_INCLUDED == TRUE) static void btif_media_task_avk_handle_timer(UNUSED_ATTR void *context) { @@ -1161,6 +1194,25 @@ static void btif_media_task_avk_handle_timer(UNUSED_ATTR void *context) } else { +#ifdef USE_AUDIO_TRACK + switch(btif_media_cb.rx_audio_focus_state) + { + /* Don't Do anything in case of Idle, Requested */ + case BTIF_MEIDA_FOCUS_REQUESTED: + case BTIF_MEDIA_FOCUS_IDLE: + return; + break; + /* In case of Ready, request for focus and wait to move in granted */ + case BTIF_MEIDA_FOCUS_READY: + btif_queue_focus_rquest(); + btif_media_cb.rx_audio_focus_state = BTIF_MEIDA_FOCUS_REQUESTED; + return; + break; + /* play only in this case */ + case BTIF_MEIDA_FOCUS_GRANTED: + break; + } +#endif if (btif_media_cb.rx_flush == TRUE) { btif_media_flush_q(&(btif_media_cb.RxSbcQ)); @@ -1330,6 +1382,14 @@ static void btif_media_thread_handle_cmd(fixed_queue_t *queue, UNUSED_ATTR void case BTIF_MEDIA_UIPC_RX_RDY: btif_media_task_aa_handle_uipc_rx_rdy(); break; +#ifdef USE_AUDIO_TRACK + case BTIF_MEDIA_AUDIO_SINK_SET_FOCUS_STATE: + if(!btif_av_is_connected()) + break; + btif_media_cb.rx_audio_focus_state = ((tBTIF_MEDIA_SINK_FOCUS_UPDATE *)p_msg)->focus_state; + APPL_TRACE_DEBUG("Setting focus state to %d ",btif_media_cb.rx_audio_focus_state); + break; +#endif case BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE: #if (BTA_AV_SINK_INCLUDED == TRUE) btif_media_task_aa_handle_decoder_reset(p_msg); @@ -1370,21 +1430,24 @@ static void btif_media_task_handle_inc_media(tBT_SBC_HDR*p_msg) OI_STATUS status; int num_sbc_frames = p_msg->num_frames_to_be_processed; UINT32 sbc_frame_len = p_msg->len - 1; - availPcmBytes = 2*sizeof(pcmData); + availPcmBytes = sizeof(pcmData); +#ifdef USE_AUDIO_TRACK + int retwriteAudioTrack = 0; +#endif if ((btif_media_cb.peer_sep == AVDT_TSEP_SNK) || (btif_media_cb.rx_flush)) { APPL_TRACE_DEBUG(" State Changed happened in this tick "); return; } - +#ifndef USE_AUDIO_TRACK // ignore data if no one is listening if (!btif_media_cb.data_channel_open) { APPL_TRACE_ERROR(" btif_media_task_handle_inc_media Channel not open, returning"); return; } - +#endif APPL_TRACE_DEBUG("Number of sbc frames %d, frame_len %d", num_sbc_frames, sbc_frame_len); for(count = 0; count < num_sbc_frames && sbc_frame_len != 0; count ++) @@ -1404,9 +1467,12 @@ static void btif_media_task_handle_inc_media(tBT_SBC_HDR*p_msg) p_msg->len = sbc_frame_len + 1; } - - UIPC_Send(UIPC_CH_ID_AV_AUDIO, 0, (UINT8 *)pcmData, (2*sizeof(pcmData) - availPcmBytes)); - +#ifdef USE_AUDIO_TRACK + retwriteAudioTrack = btWriteData((void*)pcmData, (sizeof(pcmData) - availPcmBytes)); +#else + UIPC_Send(UIPC_CH_ID_AV_AUDIO, 0, (UINT8 *)pcmData, (sizeof(pcmData) - availPcmBytes)); +#endif + APPL_TRACE_LATENCY_AUDIO("Written to audio, seq number %d", p_msg->layer_specific); } #endif @@ -2001,6 +2067,22 @@ int btif_a2dp_get_track_channel_count(UINT8 channeltype) { } return count; } +#ifdef USE_AUDIO_TRACK + int a2dp_get_track_channel_type(UINT8 channeltype) { + int count = 1; + switch (channeltype) { + case A2D_SBC_IE_CH_MD_MONO: + count = 1; + break; + case A2D_SBC_IE_CH_MD_DUAL: + case A2D_SBC_IE_CH_MD_STEREO: + case A2D_SBC_IE_CH_MD_JOINT: + count = 3; + break; + } + return count; + } +#endif void btif_a2dp_set_peer_sep(UINT8 sep) { btif_media_cb.peer_sep = sep; @@ -2014,12 +2096,17 @@ static void btif_decode_alarm_cb(UNUSED_ATTR void *context) { static void btif_media_task_aa_handle_stop_decoding(void) { alarm_free(btif_media_cb.decode_alarm); btif_media_cb.decode_alarm = NULL; +#ifdef USE_AUDIO_TRACK + btPauseTrack(); +#endif } static void btif_media_task_aa_handle_start_decoding(void) { if (btif_media_cb.decode_alarm) return; - +#ifdef USE_AUDIO_TRACK + btStartTrack(); +#endif btif_media_cb.decode_alarm = alarm_new(); if (!btif_media_cb.decode_alarm) { LOG_ERROR("%s unable to allocate decode alarm.", __func__); @@ -2034,6 +2121,10 @@ static void btif_media_task_aa_handle_start_decoding(void) { static void btif_media_task_aa_handle_clear_track (void) { APPL_TRACE_DEBUG("btif_media_task_aa_handle_clear_track"); +#ifdef USE_AUDIO_TRACK + btStopTrack(); + btDeleteTrack(); +#endif } /******************************************************************************* @@ -2076,7 +2167,15 @@ static void btif_media_task_aa_handle_decoder_reset(BT_HDR *p_msg) APPL_TRACE_ERROR("OI_CODEC_SBC_DecoderReset failed with error code %d\n", status); } +#ifdef USE_AUDIO_TRACK + APPL_TRACE_DEBUG("A2dpSink: sbc Create Track"); + if (btCreateTrack(btif_a2dp_get_track_frequency(sbc_cie.samp_freq), a2dp_get_track_channel_type(sbc_cie.ch_mode)) == -1) { + APPL_TRACE_ERROR("A2dpSink: Track creation fails!!!"); + return; + } +#else UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb); +#endif switch(sbc_cie.samp_freq) { @@ -2525,7 +2624,7 @@ UINT8 btif_media_sink_enque_buf(BT_HDR *p_pkt) return GKI_queue_length(&btif_media_cb.RxSbcQ); if(GKI_queue_length(&btif_media_cb.RxSbcQ) >= MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ) { - btif_media_flush_q(&(btif_media_cb.RxSbcQ)); + return GKI_queue_length(&btif_media_cb.RxSbcQ); } BTIF_TRACE_VERBOSE("btif_media_sink_enque_buf + "); @@ -2540,6 +2639,7 @@ UINT8 btif_media_sink_enque_buf(BT_HDR *p_pkt) p_msg->num_frames_to_be_processed = p_dest[0] & 0x0f; p_msg->len = p_pkt->len; p_msg->offset = 0; + p_msg->layer_specific = p_pkt->layer_specific; BTIF_TRACE_VERBOSE("btif_media_sink_enque_buf + ", p_msg->num_frames_to_be_processed); GKI_enqueue(&(btif_media_cb.RxSbcQ), p_msg); |