summaryrefslogtreecommitdiffstats
path: root/btif/src/btif_media_task.c
diff options
context:
space:
mode:
Diffstat (limited to 'btif/src/btif_media_task.c')
-rw-r--r--btif/src/btif_media_task.c118
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);