Home | History | Annotate | Download | only in src
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2009-2012 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  **
     21  **  Name:          btif_media_task.c
     22  **
     23  **  Description:   This is the multimedia module for the BTIF system.  It
     24  **                 contains task implementations AV, HS and HF profiles
     25  **                 audio & video processing
     26  **
     27  ******************************************************************************/
     28 
     29 #define LOG_TAG "bt_btif_media"
     30 
     31 #include <assert.h>
     32 #include <fcntl.h>
     33 #include <limits.h>
     34 #include <pthread.h>
     35 #include <stdint.h>
     36 #include <stdio.h>
     37 #include <string.h>
     38 #include <sys/stat.h>
     39 #include <sys/time.h>
     40 #include <sys/types.h>
     41 #include <unistd.h>
     42 
     43 #include <hardware/bluetooth.h>
     44 
     45 #include "a2d_api.h"
     46 #include "a2d_int.h"
     47 #include "a2d_sbc.h"
     48 #include "audio_a2dp_hw.h"
     49 #include "bt_target.h"
     50 #include "bta_api.h"
     51 #include "bta_av_api.h"
     52 #include "bta_av_ci.h"
     53 #include "bta_av_sbc.h"
     54 #include "bta_sys.h"
     55 #include "bta_sys_int.h"
     56 #include "btif_av.h"
     57 #include "btif_av_co.h"
     58 #include "btif_media.h"
     59 #include "btif_sm.h"
     60 #include "btif_util.h"
     61 #include "btu.h"
     62 #include "bt_common.h"
     63 #include "device/include/controller.h"
     64 #include "l2c_api.h"
     65 #include "osi/include/alarm.h"
     66 #include "osi/include/fixed_queue.h"
     67 #include "osi/include/log.h"
     68 #include "osi/include/metrics.h"
     69 #include "osi/include/mutex.h"
     70 #include "osi/include/thread.h"
     71 
     72 #if (BTA_AV_INCLUDED == TRUE)
     73 #include "sbc_encoder.h"
     74 #endif
     75 
     76 #if (BTA_AV_SINK_INCLUDED == TRUE)
     77 #include "oi_codec_sbc.h"
     78 #include "oi_status.h"
     79 #endif
     80 
     81 #ifdef USE_AUDIO_TRACK
     82 #include "btif_avrcp_audio_track.h"
     83 #endif
     84 
     85 #if (BTA_AV_SINK_INCLUDED == TRUE)
     86 OI_CODEC_SBC_DECODER_CONTEXT context;
     87 OI_UINT32 contextData[CODEC_DATA_WORDS(2, SBC_CODEC_FAST_FILTER_BUFFERS)];
     88 OI_INT16 pcmData[15*SBC_MAX_SAMPLES_PER_FRAME*SBC_MAX_CHANNELS];
     89 #endif
     90 
     91 /*****************************************************************************
     92  **  Constants
     93  *****************************************************************************/
     94 #ifndef AUDIO_CHANNEL_OUT_MONO
     95 #define AUDIO_CHANNEL_OUT_MONO 0x01
     96 #endif
     97 
     98 #ifndef AUDIO_CHANNEL_OUT_STEREO
     99 #define AUDIO_CHANNEL_OUT_STEREO 0x03
    100 #endif
    101 
    102 /* BTIF media cmd event definition : BTIF_MEDIA_TASK_CMD */
    103 enum
    104 {
    105     BTIF_MEDIA_START_AA_TX = 1,
    106     BTIF_MEDIA_STOP_AA_TX,
    107     BTIF_MEDIA_AA_RX_RDY,
    108     BTIF_MEDIA_UIPC_RX_RDY,
    109     BTIF_MEDIA_SBC_ENC_INIT,
    110     BTIF_MEDIA_SBC_ENC_UPDATE,
    111     BTIF_MEDIA_SBC_DEC_INIT,
    112     BTIF_MEDIA_VIDEO_DEC_INIT,
    113     BTIF_MEDIA_FLUSH_AA_TX,
    114     BTIF_MEDIA_FLUSH_AA_RX,
    115     BTIF_MEDIA_AUDIO_FEEDING_INIT,
    116     BTIF_MEDIA_AUDIO_RECEIVING_INIT,
    117     BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE,
    118     BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK,
    119     BTIF_MEDIA_AUDIO_SINK_SET_FOCUS_STATE
    120 };
    121 
    122 enum {
    123     MEDIA_TASK_STATE_OFF = 0,
    124     MEDIA_TASK_STATE_ON = 1,
    125     MEDIA_TASK_STATE_SHUTTING_DOWN = 2
    126 };
    127 
    128 /* Macro to multiply the media task tick */
    129 #ifndef BTIF_MEDIA_NUM_TICK
    130 #define BTIF_MEDIA_NUM_TICK      1
    131 #endif
    132 
    133 /* Media task tick in milliseconds, must be set to multiple of
    134    (1000/TICKS_PER_SEC) (10) */
    135 
    136 #define BTIF_MEDIA_TIME_TICK                     (20 * BTIF_MEDIA_NUM_TICK)
    137 #define A2DP_DATA_READ_POLL_MS    (BTIF_MEDIA_TIME_TICK / 2)
    138 #define BTIF_SINK_MEDIA_TIME_TICK_MS             (20 * BTIF_MEDIA_NUM_TICK)
    139 
    140 
    141 /* buffer pool */
    142 #define BTIF_MEDIA_AA_BUF_SIZE  BT_DEFAULT_BUFFER_SIZE
    143 
    144 /* offset */
    145 #if (BTA_AV_CO_CP_SCMS_T == TRUE)
    146 #define BTIF_MEDIA_AA_SBC_OFFSET (AVDT_MEDIA_OFFSET + BTA_AV_SBC_HDR_SIZE + 1)
    147 #else
    148 #define BTIF_MEDIA_AA_SBC_OFFSET (AVDT_MEDIA_OFFSET + BTA_AV_SBC_HDR_SIZE)
    149 #endif
    150 
    151 /* Define the bitrate step when trying to match bitpool value */
    152 #ifndef BTIF_MEDIA_BITRATE_STEP
    153 #define BTIF_MEDIA_BITRATE_STEP 5
    154 #endif
    155 
    156 #ifndef BTIF_A2DP_DEFAULT_BITRATE
    157 /* High quality quality setting @ 44.1 khz */
    158 #define BTIF_A2DP_DEFAULT_BITRATE 328
    159 #endif
    160 
    161 #ifndef BTIF_A2DP_NON_EDR_MAX_RATE
    162 #define BTIF_A2DP_NON_EDR_MAX_RATE 229
    163 #endif
    164 
    165 #if (BTA_AV_CO_CP_SCMS_T == TRUE)
    166 /* A2DP header will contain a CP header of size 1 */
    167 #define A2DP_HDR_SIZE               2
    168 #else
    169 #define A2DP_HDR_SIZE               1
    170 #endif
    171 #define MAX_SBC_HQ_FRAME_SIZE_44_1  119
    172 #define MAX_SBC_HQ_FRAME_SIZE_48    115
    173 
    174 /* 2DH5 payload size of 679 bytes - (4 bytes L2CAP Header + 12 bytes AVDTP Header) */
    175 #define MAX_2MBPS_AVDTP_MTU         663
    176 #define USEC_PER_SEC 1000000L
    177 #define TPUT_STATS_INTERVAL_US (3000*1000)
    178 
    179 /**
    180  * CONGESTION COMPENSATION CTRL ::
    181  *
    182  * Thus setting controls how many buffers we will hold in media task
    183  * during temp link congestion. Together with the stack buffer queues
    184  * it controls much temporary a2dp link congestion we can
    185  * compensate for. It however also depends on the default run level of sinks
    186  * jitterbuffers. Depending on type of sink this would vary.
    187  * Ideally the (SRC) max tx buffer capacity should equal the sinks
    188  * jitterbuffer runlevel including any intermediate buffers on the way
    189  * towards the sinks codec.
    190  */
    191 #ifndef MAX_PCM_FRAME_NUM_PER_TICK
    192 #define MAX_PCM_FRAME_NUM_PER_TICK     14
    193 #endif
    194 #define MAX_PCM_ITER_NUM_PER_TICK      3
    195 
    196 /**
    197  * The typical runlevel of the tx queue size is ~1 buffer
    198  * but due to link flow control or thread preemption in lower
    199  * layers we might need to temporarily buffer up data.
    200  */
    201 #define MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ (MAX_PCM_FRAME_NUM_PER_TICK * 2)
    202 
    203 /* In case of A2DP SINK, we will delay start by 5 AVDTP Packets*/
    204 #define MAX_A2DP_DELAYED_START_FRAME_COUNT 5
    205 #define PACKET_PLAYED_PER_TICK_48 8
    206 #define PACKET_PLAYED_PER_TICK_44 7
    207 #define PACKET_PLAYED_PER_TICK_32 5
    208 #define PACKET_PLAYED_PER_TICK_16 3
    209 
    210 /* Readability constants */
    211 #define SBC_FRAME_HEADER_SIZE_BYTES 4 // A2DP Spec v1.3, 12.4, Table 12.12
    212 #define SBC_SCALE_FACTOR_BITS       4 // A2DP Spec v1.3, 12.4, Table 12.13
    213 
    214 typedef struct {
    215     // Counter for total updates
    216     size_t total_updates;
    217 
    218     // Last update timestamp (in us)
    219     uint64_t last_update_us;
    220 
    221     // Counter for overdue scheduling
    222     size_t overdue_scheduling_count;
    223 
    224     // Accumulated overdue scheduling deviations (in us)
    225     uint64_t total_overdue_scheduling_delta_us;
    226 
    227     // Max. overdue scheduling delta time (in us)
    228     uint64_t max_overdue_scheduling_delta_us;
    229 
    230     // Counter for premature scheduling
    231     size_t premature_scheduling_count;
    232 
    233     // Accumulated premature scheduling deviations (in us)
    234     uint64_t total_premature_scheduling_delta_us;
    235 
    236     // Max. premature scheduling delta time (in us)
    237     uint64_t max_premature_scheduling_delta_us;
    238 
    239     // Counter for exact scheduling
    240     size_t exact_scheduling_count;
    241 
    242     // Accumulated and counted scheduling time (in us)
    243     uint64_t total_scheduling_time_us;
    244 } scheduling_stats_t;
    245 
    246 typedef struct {
    247     uint64_t session_start_us;
    248 
    249     scheduling_stats_t tx_queue_enqueue_stats;
    250     scheduling_stats_t tx_queue_dequeue_stats;
    251 
    252     size_t tx_queue_total_frames;
    253     size_t tx_queue_max_frames_per_packet;
    254 
    255     uint64_t tx_queue_total_queueing_time_us;
    256     uint64_t tx_queue_max_queueing_time_us;
    257 
    258     size_t tx_queue_total_readbuf_calls;
    259     uint64_t tx_queue_last_readbuf_us;
    260 
    261     size_t tx_queue_total_flushed_messages;
    262     uint64_t tx_queue_last_flushed_us;
    263 
    264     size_t tx_queue_total_dropped_messages;
    265     size_t tx_queue_dropouts;
    266     uint64_t tx_queue_last_dropouts_us;
    267 
    268     size_t media_read_total_underflow_bytes;
    269     size_t media_read_total_underflow_count;
    270     uint64_t media_read_last_underflow_us;
    271 
    272     size_t media_read_total_underrun_bytes;
    273     size_t media_read_total_underrun_count;
    274     uint64_t media_read_last_underrun_us;
    275 
    276     size_t media_read_total_expected_frames;
    277     size_t media_read_max_expected_frames;
    278     size_t media_read_expected_count;
    279 
    280     size_t media_read_total_limited_frames;
    281     size_t media_read_max_limited_frames;
    282     size_t media_read_limited_count;
    283 } btif_media_stats_t;
    284 
    285 typedef struct
    286 {
    287     UINT16 num_frames_to_be_processed;
    288     UINT16 len;
    289     UINT16 offset;
    290     UINT16 layer_specific;
    291 } tBT_SBC_HDR;
    292 
    293 typedef struct
    294 {
    295     UINT32 aa_frame_counter;
    296     INT32  aa_feed_counter;
    297     INT32  aa_feed_residue;
    298     UINT32 counter;
    299     UINT32 bytes_per_tick;  /* pcm bytes read each media task tick */
    300 } tBTIF_AV_MEDIA_FEEDINGS_PCM_STATE;
    301 
    302 typedef union
    303 {
    304     tBTIF_AV_MEDIA_FEEDINGS_PCM_STATE pcm;
    305 } tBTIF_AV_MEDIA_FEEDINGS_STATE;
    306 
    307 typedef struct
    308 {
    309 #if (BTA_AV_INCLUDED == TRUE)
    310     fixed_queue_t *TxAaQ;
    311     fixed_queue_t *RxSbcQ;
    312     UINT16 TxAaMtuSize;
    313     UINT32 timestamp;
    314     UINT8 TxTranscoding;
    315     tBTIF_AV_FEEDING_MODE feeding_mode;
    316     tBTIF_AV_MEDIA_FEEDINGS media_feeding;
    317     tBTIF_AV_MEDIA_FEEDINGS_STATE media_feeding_state;
    318     SBC_ENC_PARAMS encoder;
    319     UINT8 busy_level;
    320     void* av_sm_hdl;
    321     UINT8 a2dp_cmd_pending; /* we can have max one command pending */
    322     BOOLEAN tx_flush; /* discards any outgoing data when true */
    323     BOOLEAN rx_flush; /* discards any incoming data when true */
    324     UINT8 peer_sep;
    325     BOOLEAN data_channel_open;
    326     UINT8 frames_to_process;
    327     UINT8 tx_sbc_frames;
    328 
    329     UINT32  sample_rate;
    330     UINT8   channel_count;
    331 #ifdef USE_AUDIO_TRACK
    332     btif_media_audio_focus_state rx_audio_focus_state;
    333     void *audio_track;
    334 #endif
    335     alarm_t *media_alarm;
    336     alarm_t *decode_alarm;
    337     btif_media_stats_t stats;
    338 #endif
    339 } tBTIF_MEDIA_CB;
    340 
    341 typedef struct {
    342     long long rx;
    343     long long rx_tot;
    344     long long tx;
    345     long long tx_tot;
    346     long long ts_prev_us;
    347 } t_stat;
    348 
    349 static UINT64 last_frame_us = 0;
    350 
    351 static void btif_a2dp_data_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event);
    352 static void btif_a2dp_ctrl_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event);
    353 static void btif_a2dp_encoder_update(void);
    354 #if (BTA_AV_SINK_INCLUDED == TRUE)
    355 extern OI_STATUS OI_CODEC_SBC_DecodeFrame(OI_CODEC_SBC_DECODER_CONTEXT *context,
    356                                           const OI_BYTE **frameData,
    357                                           unsigned long *frameBytes,
    358                                           OI_INT16 *pcmData,
    359                                           unsigned long *pcmBytes);
    360 extern OI_STATUS OI_CODEC_SBC_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context,
    361                                            unsigned long *decoderData,
    362                                            unsigned long decoderDataBytes,
    363                                            OI_UINT8 maxChannels,
    364                                            OI_UINT8 pcmStride,
    365                                            OI_BOOL enhanced);
    366 #endif
    367 static void btif_media_flush_q(fixed_queue_t *p_q);
    368 static void btif_media_task_aa_handle_stop_decoding(void );
    369 static void btif_media_task_aa_rx_flush(void);
    370 
    371 static UINT8 calculate_max_frames_per_packet();
    372 static const char *dump_media_event(UINT16 event);
    373 static void btif_media_thread_init(void *context);
    374 static void btif_media_thread_cleanup(void *context);
    375 static void btif_media_thread_handle_cmd(fixed_queue_t *queue, void *context);
    376 
    377 /* Handle incoming media packets A2DP SINK streaming*/
    378 #if (BTA_AV_SINK_INCLUDED == TRUE)
    379 static void btif_media_task_handle_inc_media(tBT_SBC_HDR*p_msg);
    380 #endif
    381 
    382 #if (BTA_AV_INCLUDED == TRUE)
    383 static void btif_media_send_aa_frame(uint64_t timestamp_us);
    384 static void btif_media_task_feeding_state_reset(void);
    385 static void btif_media_task_aa_start_tx(void);
    386 static void btif_media_task_aa_stop_tx(void);
    387 static void btif_media_task_enc_init(BT_HDR *p_msg);
    388 static void btif_media_task_enc_update(BT_HDR *p_msg);
    389 static void btif_media_task_audio_feeding_init(BT_HDR *p_msg);
    390 static void btif_media_task_aa_tx_flush(BT_HDR *p_msg);
    391 static void btif_media_aa_prep_2_send(UINT8 nb_frame, uint64_t timestamp_us);
    392 #if (BTA_AV_SINK_INCLUDED == TRUE)
    393 static void btif_media_task_aa_handle_decoder_reset(BT_HDR *p_msg);
    394 static void btif_media_task_aa_handle_clear_track(void);
    395 #endif
    396 static void btif_media_task_aa_handle_start_decoding(void);
    397 #endif
    398 BOOLEAN btif_media_task_clear_track(void);
    399 
    400 static void btif_media_task_aa_handle_timer(UNUSED_ATTR void *context);
    401 static void btif_media_task_avk_handle_timer(UNUSED_ATTR void *context);
    402 extern BOOLEAN btif_hf_is_call_idle();
    403 
    404 static tBTIF_MEDIA_CB btif_media_cb;
    405 static int media_task_running = MEDIA_TASK_STATE_OFF;
    406 
    407 static fixed_queue_t *btif_media_cmd_msg_queue;
    408 static thread_t *worker_thread;
    409 
    410 /*****************************************************************************
    411  **  Misc helper functions
    412  *****************************************************************************/
    413 
    414 static void update_scheduling_stats(scheduling_stats_t *stats,
    415                                     uint64_t now_us, uint64_t expected_delta)
    416 {
    417     uint64_t last_us = stats->last_update_us;
    418 
    419     stats->total_updates++;
    420     stats->last_update_us = now_us;
    421 
    422     if (last_us == 0)
    423       return;           // First update: expected delta doesn't apply
    424 
    425     uint64_t deadline_us = last_us + expected_delta;
    426     if (deadline_us < now_us) {
    427         // Overdue scheduling
    428         uint64_t delta_us = now_us - deadline_us;
    429         // Ignore extreme outliers
    430         if (delta_us < 10 * expected_delta) {
    431             if (stats->max_overdue_scheduling_delta_us < delta_us)
    432                 stats->max_overdue_scheduling_delta_us = delta_us;
    433             stats->total_overdue_scheduling_delta_us += delta_us;
    434             stats->overdue_scheduling_count++;
    435             stats->total_scheduling_time_us += now_us - last_us;
    436         }
    437     } else if (deadline_us > now_us) {
    438         // Premature scheduling
    439         uint64_t delta_us = deadline_us - now_us;
    440         // Ignore extreme outliers
    441         if (delta_us < 10 * expected_delta) {
    442             if (stats->max_premature_scheduling_delta_us < delta_us)
    443                 stats->max_premature_scheduling_delta_us = delta_us;
    444             stats->total_premature_scheduling_delta_us += delta_us;
    445             stats->premature_scheduling_count++;
    446             stats->total_scheduling_time_us += now_us - last_us;
    447         }
    448     } else {
    449         // On-time scheduling
    450         stats->exact_scheduling_count++;
    451         stats->total_scheduling_time_us += now_us - last_us;
    452     }
    453 }
    454 
    455 static UINT64 time_now_us()
    456 {
    457     struct timespec ts_now;
    458     clock_gettime(CLOCK_BOOTTIME, &ts_now);
    459     return ((UINT64)ts_now.tv_sec * USEC_PER_SEC) + ((UINT64)ts_now.tv_nsec / 1000);
    460 }
    461 
    462 static void log_tstamps_us(char *comment, uint64_t now_us)
    463 {
    464     static uint64_t prev_us = 0;
    465     APPL_TRACE_DEBUG("[%s] ts %08llu, diff : %08llu, queue sz %d", comment, now_us, now_us - prev_us,
    466                 fixed_queue_length(btif_media_cb.TxAaQ));
    467     prev_us = now_us;
    468 }
    469 
    470 UNUSED_ATTR static const char *dump_media_event(UINT16 event)
    471 {
    472     switch (event)
    473     {
    474         CASE_RETURN_STR(BTIF_MEDIA_START_AA_TX)
    475         CASE_RETURN_STR(BTIF_MEDIA_STOP_AA_TX)
    476         CASE_RETURN_STR(BTIF_MEDIA_AA_RX_RDY)
    477         CASE_RETURN_STR(BTIF_MEDIA_UIPC_RX_RDY)
    478         CASE_RETURN_STR(BTIF_MEDIA_SBC_ENC_INIT)
    479         CASE_RETURN_STR(BTIF_MEDIA_SBC_ENC_UPDATE)
    480         CASE_RETURN_STR(BTIF_MEDIA_SBC_DEC_INIT)
    481         CASE_RETURN_STR(BTIF_MEDIA_VIDEO_DEC_INIT)
    482         CASE_RETURN_STR(BTIF_MEDIA_FLUSH_AA_TX)
    483         CASE_RETURN_STR(BTIF_MEDIA_FLUSH_AA_RX)
    484         CASE_RETURN_STR(BTIF_MEDIA_AUDIO_FEEDING_INIT)
    485         CASE_RETURN_STR(BTIF_MEDIA_AUDIO_RECEIVING_INIT)
    486         CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE)
    487         CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK)
    488         CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_SET_FOCUS_STATE)
    489 
    490         default:
    491             return "UNKNOWN MEDIA EVENT";
    492     }
    493 }
    494 
    495 static void btm_read_rssi_cb(void *data)
    496 {
    497     assert(data);
    498 
    499     tBTM_RSSI_RESULTS *result = (tBTM_RSSI_RESULTS*)data;
    500     if (result->status != BTM_SUCCESS)
    501     {
    502         LOG_ERROR(LOG_TAG, "%s unable to read remote RSSI (status %d)",
    503             __func__, result->status);
    504         return;
    505     }
    506 
    507     char temp_buffer[20] = {0};
    508     LOG_WARN(LOG_TAG, "%s device: %s, rssi: %d", __func__,
    509         bdaddr_to_string((bt_bdaddr_t *)result->rem_bda, temp_buffer,
    510             sizeof(temp_buffer)),
    511         result->rssi);
    512 }
    513 
    514 /*****************************************************************************
    515  **  A2DP CTRL PATH
    516  *****************************************************************************/
    517 
    518 static const char* dump_a2dp_ctrl_event(UINT8 event)
    519 {
    520     switch (event)
    521     {
    522         CASE_RETURN_STR(A2DP_CTRL_CMD_NONE)
    523         CASE_RETURN_STR(A2DP_CTRL_CMD_CHECK_READY)
    524         CASE_RETURN_STR(A2DP_CTRL_CMD_START)
    525         CASE_RETURN_STR(A2DP_CTRL_CMD_STOP)
    526         CASE_RETURN_STR(A2DP_CTRL_CMD_SUSPEND)
    527         CASE_RETURN_STR(A2DP_CTRL_CMD_OFFLOAD_START)
    528 
    529         default:
    530             return "UNKNOWN MSG ID";
    531     }
    532 }
    533 
    534 static void btif_audiopath_detached(void)
    535 {
    536     APPL_TRACE_EVENT("## AUDIO PATH DETACHED ##");
    537 
    538     /*  send stop request only if we are actively streaming and haven't received
    539         a stop request. Potentially audioflinger detached abnormally */
    540     if (alarm_is_scheduled(btif_media_cb.media_alarm)) {
    541         /* post stop event and wait for audio path to stop */
    542         btif_dispatch_sm_event(BTIF_AV_STOP_STREAM_REQ_EVT, NULL, 0);
    543     }
    544 }
    545 
    546 static void a2dp_cmd_acknowledge(int status)
    547 {
    548     UINT8 ack = status;
    549 
    550     APPL_TRACE_EVENT("## a2dp ack : %s, status %d ##",
    551           dump_a2dp_ctrl_event(btif_media_cb.a2dp_cmd_pending), status);
    552 
    553     /* sanity check */
    554     if (btif_media_cb.a2dp_cmd_pending == A2DP_CTRL_CMD_NONE)
    555     {
    556         APPL_TRACE_ERROR("warning : no command pending, ignore ack");
    557         return;
    558     }
    559 
    560     /* clear pending */
    561     btif_media_cb.a2dp_cmd_pending = A2DP_CTRL_CMD_NONE;
    562 
    563     /* acknowledge start request */
    564     UIPC_Send(UIPC_CH_ID_AV_CTRL, 0, &ack, 1);
    565 }
    566 
    567 
    568 static void btif_recv_ctrl_data(void)
    569 {
    570     UINT8 cmd = 0;
    571     int n;
    572     n = UIPC_Read(UIPC_CH_ID_AV_CTRL, NULL, &cmd, 1);
    573 
    574     /* detach on ctrl channel means audioflinger process was terminated */
    575     if (n == 0)
    576     {
    577         APPL_TRACE_EVENT("CTRL CH DETACHED");
    578         UIPC_Close(UIPC_CH_ID_AV_CTRL);
    579         /* we can operate only on datachannel, if af client wants to
    580            do send additional commands the ctrl channel would be reestablished */
    581         //btif_audiopath_detached();
    582         return;
    583     }
    584 
    585     APPL_TRACE_DEBUG("a2dp-ctrl-cmd : %s", dump_a2dp_ctrl_event(cmd));
    586 
    587     btif_media_cb.a2dp_cmd_pending = cmd;
    588 
    589     switch (cmd)
    590     {
    591         case A2DP_CTRL_CMD_CHECK_READY:
    592 
    593             if (media_task_running == MEDIA_TASK_STATE_SHUTTING_DOWN)
    594             {
    595                 APPL_TRACE_WARNING("%s: A2DP command %s while media task shutting down",
    596                                    __func__, dump_a2dp_ctrl_event(cmd));
    597                 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
    598                 return;
    599             }
    600 
    601             /* check whether av is ready to setup a2dp datapath */
    602             if ((btif_av_stream_ready() == TRUE) || (btif_av_stream_started_ready() == TRUE))
    603             {
    604                 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
    605             }
    606             else
    607             {
    608                 APPL_TRACE_WARNING("%s: A2DP command %s while AV stream is not ready",
    609                                    __func__, dump_a2dp_ctrl_event(cmd));
    610                 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
    611             }
    612             break;
    613 
    614         case A2DP_CTRL_CMD_START:
    615             /* Don't sent START request to stack while we are in call.
    616                Some headsets like the Sony MW600, don't allow AVDTP START
    617                in call and respond BAD_STATE. */
    618             if (!btif_hf_is_call_idle())
    619             {
    620                 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_INCALL_FAILURE);
    621                 break;
    622             }
    623 
    624             if (alarm_is_scheduled(btif_media_cb.media_alarm))
    625             {
    626                 APPL_TRACE_WARNING("%s: A2DP command %s when media alarm already scheduled",
    627                                    __func__, dump_a2dp_ctrl_event(cmd));
    628                 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
    629                 break;
    630             }
    631 
    632             if (btif_av_stream_ready() == TRUE)
    633             {
    634                 /* setup audio data channel listener */
    635                 UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb);
    636 
    637                 /* post start event and wait for audio path to open */
    638                 btif_dispatch_sm_event(BTIF_AV_START_STREAM_REQ_EVT, NULL, 0);
    639 
    640 #if (BTA_AV_SINK_INCLUDED == TRUE)
    641                 if (btif_media_cb.peer_sep == AVDT_TSEP_SRC)
    642                     a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
    643 #endif
    644             }
    645             else if (btif_av_stream_started_ready())
    646             {
    647                 /* already started, setup audio data channel listener
    648                    and ack back immediately */
    649                 UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb);
    650 
    651                 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
    652             }
    653             else
    654             {
    655                 APPL_TRACE_WARNING("%s: A2DP command %s while AV stream is not ready",
    656                                    __func__, dump_a2dp_ctrl_event(cmd));
    657                 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
    658                 break;
    659             }
    660             break;
    661 
    662         case A2DP_CTRL_CMD_STOP:
    663             if (btif_media_cb.peer_sep == AVDT_TSEP_SNK &&
    664                 (!alarm_is_scheduled(btif_media_cb.media_alarm)))
    665             {
    666                 /* we are already stopped, just ack back */
    667                 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
    668                 break;
    669             }
    670 
    671             btif_dispatch_sm_event(BTIF_AV_STOP_STREAM_REQ_EVT, NULL, 0);
    672             a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
    673             break;
    674 
    675         case A2DP_CTRL_CMD_SUSPEND:
    676             /* local suspend */
    677             if (btif_av_stream_started_ready())
    678             {
    679                 btif_dispatch_sm_event(BTIF_AV_SUSPEND_STREAM_REQ_EVT, NULL, 0);
    680             }
    681             else
    682             {
    683                 /* if we are not in started state, just ack back ok and let
    684                    audioflinger close the channel. This can happen if we are
    685                    remotely suspended, clear REMOTE SUSPEND Flag */
    686                 btif_av_clear_remote_suspend_flag();
    687                 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
    688             }
    689             break;
    690 
    691         case A2DP_CTRL_GET_AUDIO_CONFIG:
    692         {
    693             uint32_t sample_rate = btif_media_cb.sample_rate;
    694             uint8_t channel_count = btif_media_cb.channel_count;
    695 
    696             a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
    697             UIPC_Send(UIPC_CH_ID_AV_CTRL, 0, (UINT8 *)&sample_rate, 4);
    698             UIPC_Send(UIPC_CH_ID_AV_CTRL, 0, &channel_count, 1);
    699             break;
    700         }
    701 
    702         case A2DP_CTRL_CMD_OFFLOAD_START:
    703                 btif_dispatch_sm_event(BTIF_AV_OFFLOAD_START_REQ_EVT, NULL, 0);
    704             break;
    705 
    706         default:
    707             APPL_TRACE_ERROR("UNSUPPORTED CMD (%d)", cmd);
    708             a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
    709             break;
    710     }
    711     APPL_TRACE_DEBUG("a2dp-ctrl-cmd : %s DONE", dump_a2dp_ctrl_event(cmd));
    712 }
    713 
    714 static void btif_a2dp_ctrl_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event)
    715 {
    716     UNUSED(ch_id);
    717 
    718     APPL_TRACE_DEBUG("A2DP-CTRL-CHANNEL EVENT %s", dump_uipc_event(event));
    719 
    720     switch (event)
    721     {
    722         case UIPC_OPEN_EVT:
    723             /* fetch av statemachine handle */
    724             btif_media_cb.av_sm_hdl = btif_av_get_sm_handle();
    725             break;
    726 
    727         case UIPC_CLOSE_EVT:
    728             /* restart ctrl server unless we are shutting down */
    729             if (media_task_running == MEDIA_TASK_STATE_ON)
    730                 UIPC_Open(UIPC_CH_ID_AV_CTRL , btif_a2dp_ctrl_cb);
    731             break;
    732 
    733         case UIPC_RX_DATA_READY_EVT:
    734             btif_recv_ctrl_data();
    735             break;
    736 
    737         default :
    738             APPL_TRACE_ERROR("### A2DP-CTRL-CHANNEL EVENT %d NOT HANDLED ###", event);
    739             break;
    740     }
    741 }
    742 
    743 static void btif_a2dp_data_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event)
    744 {
    745     UNUSED(ch_id);
    746 
    747     APPL_TRACE_DEBUG("BTIF MEDIA (A2DP-DATA) EVENT %s", dump_uipc_event(event));
    748 
    749     switch (event)
    750     {
    751         case UIPC_OPEN_EVT:
    752 
    753             /*  read directly from media task from here on (keep callback for
    754                 connection events */
    755             UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REG_REMOVE_ACTIVE_READSET, NULL);
    756             UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_SET_READ_POLL_TMO,
    757                        (void *)A2DP_DATA_READ_POLL_MS);
    758 
    759             if (btif_media_cb.peer_sep == AVDT_TSEP_SNK) {
    760                 /* Start the media task to encode SBC */
    761                 btif_media_task_start_aa_req();
    762 
    763                 /* make sure we update any changed sbc encoder params */
    764                 btif_a2dp_encoder_update();
    765             }
    766             btif_media_cb.data_channel_open = TRUE;
    767 
    768             /* ack back when media task is fully started */
    769             break;
    770 
    771         case UIPC_CLOSE_EVT:
    772             a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
    773             btif_audiopath_detached();
    774             btif_media_cb.data_channel_open = FALSE;
    775             break;
    776 
    777         default :
    778             APPL_TRACE_ERROR("### A2DP-DATA EVENT %d NOT HANDLED ###", event);
    779             break;
    780     }
    781 }
    782 
    783 
    784 /*****************************************************************************
    785  **  BTIF ADAPTATION
    786  *****************************************************************************/
    787 
    788 static UINT16 btif_media_task_get_sbc_rate(void)
    789 {
    790     UINT16 rate = BTIF_A2DP_DEFAULT_BITRATE;
    791 
    792     /* restrict bitrate if a2dp link is non-edr */
    793     if (!btif_av_is_peer_edr())
    794     {
    795         rate = BTIF_A2DP_NON_EDR_MAX_RATE;
    796         APPL_TRACE_DEBUG("non-edr a2dp sink detected, restrict rate to %d", rate);
    797     }
    798 
    799     return rate;
    800 }
    801 
    802 static void btif_a2dp_encoder_init(void)
    803 {
    804     UINT16 minmtu;
    805     tBTIF_MEDIA_INIT_AUDIO msg;
    806     tA2D_SBC_CIE sbc_config;
    807 
    808     /* lookup table for converting channel mode */
    809     UINT16 codec_mode_tbl[5] = { SBC_JOINT_STEREO, SBC_STEREO, SBC_DUAL, 0, SBC_MONO };
    810 
    811     /* lookup table for converting number of blocks */
    812     UINT16 codec_block_tbl[5] = { 16, 12, 8, 0, 4 };
    813 
    814     /* lookup table to convert freq */
    815     UINT16 freq_block_tbl[5] = { SBC_sf48000, SBC_sf44100, SBC_sf32000, 0, SBC_sf16000 };
    816 
    817     APPL_TRACE_DEBUG("btif_a2dp_encoder_init");
    818 
    819     /* Retrieve the current SBC configuration (default if currently not used) */
    820     bta_av_co_audio_get_sbc_config(&sbc_config, &minmtu);
    821     msg.NumOfSubBands = (sbc_config.num_subbands == A2D_SBC_IE_SUBBAND_4) ? 4 : 8;
    822     msg.NumOfBlocks = codec_block_tbl[sbc_config.block_len >> 5];
    823     msg.AllocationMethod = (sbc_config.alloc_mthd == A2D_SBC_IE_ALLOC_MD_L) ? SBC_LOUDNESS : SBC_SNR;
    824     msg.ChannelMode = codec_mode_tbl[sbc_config.ch_mode >> 1];
    825     msg.SamplingFreq = freq_block_tbl[sbc_config.samp_freq >> 5];
    826     msg.MtuSize = minmtu;
    827 
    828     APPL_TRACE_EVENT("msg.ChannelMode %x", msg.ChannelMode);
    829 
    830     /* Init the media task to encode SBC properly */
    831     btif_media_task_enc_init_req(&msg);
    832 }
    833 
    834 static void btif_a2dp_encoder_update(void)
    835 {
    836     UINT16 minmtu;
    837     tA2D_SBC_CIE sbc_config;
    838     tBTIF_MEDIA_UPDATE_AUDIO msg;
    839     UINT8 pref_min;
    840     UINT8 pref_max;
    841 
    842     APPL_TRACE_DEBUG("btif_a2dp_encoder_update");
    843 
    844     /* Retrieve the current SBC configuration (default if currently not used) */
    845     bta_av_co_audio_get_sbc_config(&sbc_config, &minmtu);
    846 
    847     APPL_TRACE_DEBUG("btif_a2dp_encoder_update: Common min_bitpool:%d(0x%x) max_bitpool:%d(0x%x)",
    848             sbc_config.min_bitpool, sbc_config.min_bitpool,
    849             sbc_config.max_bitpool, sbc_config.max_bitpool);
    850 
    851     if (sbc_config.min_bitpool > sbc_config.max_bitpool)
    852     {
    853         APPL_TRACE_ERROR("btif_a2dp_encoder_update: ERROR btif_a2dp_encoder_update min_bitpool > max_bitpool");
    854     }
    855 
    856     /* check if remote sink has a preferred bitpool range */
    857     if (bta_av_co_get_remote_bitpool_pref(&pref_min, &pref_max) == TRUE)
    858     {
    859         /* adjust our preferred bitpool with the remote preference if within
    860            our capable range */
    861 
    862         if (pref_min < sbc_config.min_bitpool)
    863             pref_min = sbc_config.min_bitpool;
    864 
    865         if (pref_max > sbc_config.max_bitpool)
    866             pref_max = sbc_config.max_bitpool;
    867 
    868         msg.MinBitPool = pref_min;
    869         msg.MaxBitPool = pref_max;
    870 
    871         if ((pref_min != sbc_config.min_bitpool) || (pref_max != sbc_config.max_bitpool))
    872         {
    873             APPL_TRACE_EVENT("## adjusted our bitpool range to peer pref [%d:%d] ##",
    874                 pref_min, pref_max);
    875         }
    876     }
    877     else
    878     {
    879         msg.MinBitPool = sbc_config.min_bitpool;
    880         msg.MaxBitPool = sbc_config.max_bitpool;
    881     }
    882 
    883     msg.MinMtuSize = minmtu;
    884 
    885     /* Update the media task to encode SBC properly */
    886     btif_media_task_enc_update_req(&msg);
    887 }
    888 
    889 bool btif_a2dp_start_media_task(void)
    890 {
    891     if (media_task_running != MEDIA_TASK_STATE_OFF)
    892     {
    893         APPL_TRACE_ERROR("warning : media task already running");
    894         return false;
    895     }
    896 
    897     APPL_TRACE_EVENT("## A2DP START MEDIA THREAD ##");
    898 
    899     btif_media_cmd_msg_queue = fixed_queue_new(SIZE_MAX);
    900 
    901     /* start a2dp media task */
    902     worker_thread = thread_new("media_worker");
    903     if (worker_thread == NULL)
    904         goto error_exit;
    905 
    906     fixed_queue_register_dequeue(btif_media_cmd_msg_queue,
    907         thread_get_reactor(worker_thread),
    908         btif_media_thread_handle_cmd,
    909         NULL);
    910 
    911     thread_post(worker_thread, btif_media_thread_init, NULL);
    912     APPL_TRACE_EVENT("## A2DP MEDIA THREAD STARTED ##");
    913 
    914     return true;
    915 
    916  error_exit:;
    917     APPL_TRACE_ERROR("%s unable to start up media thread", __func__);
    918     return false;
    919 }
    920 
    921 void btif_a2dp_stop_media_task(void)
    922 {
    923     APPL_TRACE_EVENT("## A2DP STOP MEDIA THREAD ##");
    924 
    925     // Stop timer
    926     alarm_free(btif_media_cb.media_alarm);
    927     btif_media_cb.media_alarm = NULL;
    928 
    929     // Exit thread
    930     fixed_queue_free(btif_media_cmd_msg_queue, NULL);
    931     btif_media_cmd_msg_queue = NULL;
    932     thread_post(worker_thread, btif_media_thread_cleanup, NULL);
    933     thread_free(worker_thread);
    934     worker_thread = NULL;
    935 }
    936 
    937 /*****************************************************************************
    938 **
    939 ** Function        btif_a2dp_on_init
    940 **
    941 ** Description
    942 **
    943 ** Returns
    944 **
    945 *******************************************************************************/
    946 
    947 void btif_a2dp_on_init(void)
    948 {
    949 #ifdef USE_AUDIO_TRACK
    950     btif_media_cb.rx_audio_focus_state = BTIF_MEDIA_FOCUS_NOT_GRANTED;
    951     btif_media_cb.audio_track = NULL;
    952 #endif
    953 }
    954 
    955 
    956 /*****************************************************************************
    957 **
    958 ** Function        btif_a2dp_setup_codec
    959 **
    960 ** Description
    961 **
    962 ** Returns
    963 **
    964 *******************************************************************************/
    965 
    966 void btif_a2dp_setup_codec(void)
    967 {
    968     tBTIF_AV_MEDIA_FEEDINGS media_feeding;
    969     tBTIF_STATUS status;
    970 
    971     APPL_TRACE_EVENT("## A2DP SETUP CODEC ##");
    972 
    973     mutex_global_lock();
    974 
    975     /* for now hardcode 44.1 khz 16 bit stereo PCM format */
    976     media_feeding.cfg.pcm.sampling_freq = BTIF_A2DP_SRC_SAMPLING_RATE;
    977     media_feeding.cfg.pcm.bit_per_sample = BTIF_A2DP_SRC_BIT_DEPTH;
    978     media_feeding.cfg.pcm.num_channel = BTIF_A2DP_SRC_NUM_CHANNELS;
    979     media_feeding.format = BTIF_AV_CODEC_PCM;
    980 
    981     if (bta_av_co_audio_set_codec(&media_feeding, &status))
    982     {
    983         tBTIF_MEDIA_INIT_AUDIO_FEEDING mfeed;
    984 
    985         /* Init the encoding task */
    986         btif_a2dp_encoder_init();
    987 
    988         /* Build the media task configuration */
    989         mfeed.feeding = media_feeding;
    990         mfeed.feeding_mode = BTIF_AV_FEEDING_ASYNCHRONOUS;
    991         /* Send message to Media task to configure transcoding */
    992         btif_media_task_audio_feeding_init_req(&mfeed);
    993     }
    994 
    995     mutex_global_unlock();
    996 }
    997 
    998 
    999 /*****************************************************************************
   1000 **
   1001 ** Function        btif_a2dp_on_idle
   1002 **
   1003 ** Description
   1004 **
   1005 ** Returns
   1006 **
   1007 *******************************************************************************/
   1008 
   1009 void btif_a2dp_on_idle(void)
   1010 {
   1011     APPL_TRACE_EVENT("## ON A2DP IDLE ## peer_sep = %d", btif_media_cb.peer_sep);
   1012     if (btif_media_cb.peer_sep == AVDT_TSEP_SNK)
   1013     {
   1014         /* Make sure media task is stopped */
   1015         btif_media_task_stop_aa_req();
   1016     }
   1017 
   1018     bta_av_co_init();
   1019 #if (BTA_AV_SINK_INCLUDED == TRUE)
   1020     if (btif_media_cb.peer_sep == AVDT_TSEP_SRC)
   1021     {
   1022         btif_media_cb.rx_flush = TRUE;
   1023         btif_media_task_aa_rx_flush_req();
   1024         btif_media_task_aa_handle_stop_decoding();
   1025         btif_media_task_clear_track();
   1026         APPL_TRACE_DEBUG("Stopped BT track");
   1027     }
   1028 #endif
   1029 }
   1030 
   1031 /*****************************************************************************
   1032 **
   1033 ** Function        btif_a2dp_on_open
   1034 **
   1035 ** Description
   1036 **
   1037 ** Returns
   1038 **
   1039 *******************************************************************************/
   1040 
   1041 void btif_a2dp_on_open(void)
   1042 {
   1043     APPL_TRACE_EVENT("## ON A2DP OPEN ##");
   1044 
   1045     /* always use callback to notify socket events */
   1046     UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb);
   1047 }
   1048 
   1049 /*******************************************************************************
   1050  **
   1051  ** Function         btif_media_task_clear_track
   1052  **
   1053  ** Description
   1054  **
   1055  ** Returns          TRUE is success
   1056  **
   1057  *******************************************************************************/
   1058 BOOLEAN btif_media_task_clear_track(void)
   1059 {
   1060     BT_HDR *p_buf = osi_malloc(sizeof(BT_HDR));
   1061 
   1062     p_buf->event = BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK;
   1063     fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
   1064 
   1065     return TRUE;
   1066 }
   1067 
   1068 /*****************************************************************************
   1069 **
   1070 ** Function        btif_reset_decoder
   1071 **
   1072 ** Description
   1073 **
   1074 ** Returns
   1075 **
   1076 *******************************************************************************/
   1077 
   1078 void btif_reset_decoder(UINT8 *p_av)
   1079 {
   1080     tBTIF_MEDIA_SINK_CFG_UPDATE *p_buf =
   1081         osi_malloc(sizeof(tBTIF_MEDIA_SINK_CFG_UPDATE));
   1082 
   1083     APPL_TRACE_EVENT("btif_reset_decoder");
   1084     APPL_TRACE_DEBUG("btif_reset_decoder p_codec_info[%x:%x:%x:%x:%x:%x]",
   1085             p_av[1], p_av[2], p_av[3],
   1086             p_av[4], p_av[5], p_av[6]);
   1087 
   1088     memcpy(p_buf->codec_info,p_av, AVDT_CODEC_SIZE);
   1089     p_buf->hdr.event = BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE;
   1090 
   1091     fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
   1092 }
   1093 
   1094 /*****************************************************************************
   1095 **
   1096 ** Function        btif_a2dp_on_started
   1097 **
   1098 ** Description
   1099 **
   1100 ** Returns
   1101 **
   1102 *******************************************************************************/
   1103 
   1104 BOOLEAN btif_a2dp_on_started(tBTA_AV_START *p_av, BOOLEAN pending_start)
   1105 {
   1106     BOOLEAN ack = FALSE;
   1107 
   1108     APPL_TRACE_EVENT("## ON A2DP STARTED ##");
   1109 
   1110     if (p_av == NULL)
   1111     {
   1112         /* ack back a local start request */
   1113         a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
   1114         return TRUE;
   1115     }
   1116 
   1117     if (p_av->status == BTA_AV_SUCCESS)
   1118     {
   1119         if (p_av->suspending == FALSE)
   1120         {
   1121             if (p_av->initiator)
   1122             {
   1123                 if (pending_start) {
   1124                     a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
   1125                     ack = TRUE;
   1126                 }
   1127             }
   1128             else
   1129             {
   1130                 /* we were remotely started,  make sure codec
   1131                    is setup before datapath is started */
   1132                 btif_a2dp_setup_codec();
   1133             }
   1134 
   1135             /* media task is autostarted upon a2dp audiopath connection */
   1136         }
   1137     }
   1138     else if (pending_start)
   1139     {
   1140         APPL_TRACE_WARNING("%s: A2DP start request failed: status = %d",
   1141                          __func__, p_av->status);
   1142         a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
   1143         ack = TRUE;
   1144     }
   1145     return ack;
   1146 }
   1147 
   1148 
   1149 /*****************************************************************************
   1150 **
   1151 ** Function        btif_a2dp_ack_fail
   1152 **
   1153 ** Description
   1154 **
   1155 ** Returns
   1156 **
   1157 *******************************************************************************/
   1158 
   1159 void btif_a2dp_ack_fail(void)
   1160 {
   1161     APPL_TRACE_EVENT("## A2DP_CTRL_ACK_FAILURE ##");
   1162     a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
   1163 }
   1164 
   1165 /*****************************************************************************
   1166 **
   1167 ** Function        btif_a2dp_on_stopped
   1168 **
   1169 ** Description
   1170 **
   1171 ** Returns
   1172 **
   1173 *******************************************************************************/
   1174 
   1175 void btif_a2dp_on_stopped(tBTA_AV_SUSPEND *p_av)
   1176 {
   1177     APPL_TRACE_EVENT("## ON A2DP STOPPED ##");
   1178     if (btif_media_cb.peer_sep == AVDT_TSEP_SRC) /*  Handling for A2DP SINK cases*/
   1179     {
   1180         btif_media_cb.rx_flush = TRUE;
   1181         btif_media_task_aa_rx_flush_req();
   1182         btif_media_task_aa_handle_stop_decoding();
   1183 #ifndef USE_AUDIO_TRACK
   1184         UIPC_Close(UIPC_CH_ID_AV_AUDIO);
   1185 #endif
   1186         btif_media_cb.data_channel_open = FALSE;
   1187         return;
   1188     }
   1189     /* allow using this api for other than suspend */
   1190     if (p_av != NULL)
   1191     {
   1192         if (p_av->status != BTA_AV_SUCCESS)
   1193         {
   1194             APPL_TRACE_EVENT("AV STOP FAILED (%d)", p_av->status);
   1195 
   1196             if (p_av->initiator) {
   1197                 APPL_TRACE_WARNING("%s: A2DP stop request failed: status = %d",
   1198                                    __func__, p_av->status);
   1199                 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
   1200             }
   1201             return;
   1202         }
   1203     }
   1204 
   1205     /* ensure tx frames are immediately suspended */
   1206     btif_media_cb.tx_flush = 1;
   1207 
   1208     /* request to stop media task  */
   1209     btif_media_task_aa_tx_flush_req();
   1210     btif_media_task_stop_aa_req();
   1211 
   1212     /* once stream is fully stopped we will ack back */
   1213 }
   1214 
   1215 
   1216 /*****************************************************************************
   1217 **
   1218 ** Function        btif_a2dp_on_suspended
   1219 **
   1220 ** Description
   1221 **
   1222 ** Returns
   1223 **
   1224 *******************************************************************************/
   1225 
   1226 void btif_a2dp_on_suspended(tBTA_AV_SUSPEND *p_av)
   1227 {
   1228     APPL_TRACE_EVENT("## ON A2DP SUSPENDED ##");
   1229     if (btif_media_cb.peer_sep == AVDT_TSEP_SRC)
   1230     {
   1231         btif_media_cb.rx_flush = TRUE;
   1232         btif_media_task_aa_rx_flush_req();
   1233         btif_media_task_aa_handle_stop_decoding();
   1234 #ifndef USE_AUDIO_TRACK
   1235         UIPC_Close(UIPC_CH_ID_AV_AUDIO);
   1236 #endif
   1237         return;
   1238     }
   1239 
   1240     /* check for status failures */
   1241     if (p_av->status != BTA_AV_SUCCESS)
   1242     {
   1243         if (p_av->initiator == TRUE) {
   1244             APPL_TRACE_WARNING("%s: A2DP suspend request failed: status = %d",
   1245                                __func__, p_av->status);
   1246             a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
   1247         }
   1248     }
   1249 
   1250     /* once stream is fully stopped we will ack back */
   1251 
   1252     /* ensure tx frames are immediately flushed */
   1253     btif_media_cb.tx_flush = 1;
   1254 
   1255     /* stop timer tick */
   1256     btif_media_task_stop_aa_req();
   1257 }
   1258 
   1259 
   1260 /*****************************************************************************
   1261 **
   1262 ** Function        btif_a2dp_on_offload_started
   1263 **
   1264 ** Description
   1265 **
   1266 ** Returns
   1267 **
   1268 *******************************************************************************/
   1269 void btif_a2dp_on_offload_started(tBTA_AV_STATUS status)
   1270 {
   1271     tA2DP_CTRL_ACK ack;
   1272     APPL_TRACE_EVENT("%s status %d", __func__, status);
   1273 
   1274     switch (status) {
   1275         case BTA_AV_SUCCESS:
   1276             ack = A2DP_CTRL_ACK_SUCCESS;
   1277             break;
   1278 
   1279         case BTA_AV_FAIL_RESOURCES:
   1280             APPL_TRACE_ERROR("%s FAILED UNSUPPORTED", __func__);
   1281             ack = A2DP_CTRL_ACK_UNSUPPORTED;
   1282             break;
   1283         default:
   1284             APPL_TRACE_ERROR("%s FAILED: status = %d", __func__, status);
   1285             ack = A2DP_CTRL_ACK_FAILURE;
   1286             break;
   1287     }
   1288     a2dp_cmd_acknowledge(ack);
   1289 }
   1290 
   1291 /* when true media task discards any rx frames */
   1292 void btif_a2dp_set_rx_flush(BOOLEAN enable)
   1293 {
   1294     APPL_TRACE_EVENT("## DROP RX %d ##", enable);
   1295     btif_media_cb.rx_flush = enable;
   1296 }
   1297 
   1298 /* when true media task discards any tx frames */
   1299 void btif_a2dp_set_tx_flush(BOOLEAN enable)
   1300 {
   1301     APPL_TRACE_EVENT("## DROP TX %d ##", enable);
   1302     btif_media_cb.tx_flush = enable;
   1303 }
   1304 
   1305 #ifdef USE_AUDIO_TRACK
   1306 void btif_a2dp_set_audio_focus_state(btif_media_audio_focus_state state)
   1307 {
   1308     tBTIF_MEDIA_SINK_FOCUS_UPDATE *p_buf =
   1309         osi_malloc(sizeof(tBTIF_MEDIA_SINK_FOCUS_UPDATE));
   1310 
   1311     APPL_TRACE_EVENT("%s", __func__);
   1312 
   1313     p_buf->focus_state = state;
   1314     p_buf->hdr.event = BTIF_MEDIA_AUDIO_SINK_SET_FOCUS_STATE;
   1315     fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
   1316 }
   1317 
   1318 void btif_a2dp_set_audio_track_gain(float gain)
   1319 {
   1320     APPL_TRACE_DEBUG("%s set gain to %f", __func__, gain);
   1321     BtifAvrcpSetAudioTrackGain(btif_media_cb.audio_track, gain);
   1322 }
   1323 #endif
   1324 
   1325 #if (BTA_AV_SINK_INCLUDED == TRUE)
   1326 static void btif_media_task_avk_handle_timer(UNUSED_ATTR void *context)
   1327 {
   1328     tBT_SBC_HDR *p_msg;
   1329     int num_sbc_frames;
   1330     int num_frames_to_process;
   1331 
   1332     if (fixed_queue_is_empty(btif_media_cb.RxSbcQ))
   1333     {
   1334         APPL_TRACE_DEBUG("  QUE  EMPTY ");
   1335     }
   1336     else
   1337     {
   1338 #ifdef USE_AUDIO_TRACK
   1339         /* Don't Do anything in case of Not granted */
   1340         if (btif_media_cb.rx_audio_focus_state == BTIF_MEDIA_FOCUS_NOT_GRANTED)
   1341         {
   1342             APPL_TRACE_DEBUG("%s skipping frames since focus is not present.", __func__);
   1343             return;
   1344         }
   1345         /* play only in BTIF_MEDIA_FOCUS_GRANTED case */
   1346 #endif
   1347         if (btif_media_cb.rx_flush == TRUE)
   1348         {
   1349             btif_media_flush_q(btif_media_cb.RxSbcQ);
   1350             return;
   1351         }
   1352 
   1353         num_frames_to_process = btif_media_cb.frames_to_process;
   1354         APPL_TRACE_DEBUG(" Process Frames + ");
   1355 
   1356         do
   1357         {
   1358             p_msg = (tBT_SBC_HDR *)fixed_queue_try_peek_first(btif_media_cb.RxSbcQ);
   1359             if (p_msg == NULL)
   1360                 return;
   1361             num_sbc_frames  = p_msg->num_frames_to_be_processed; /* num of frames in Que Packets */
   1362             APPL_TRACE_DEBUG(" Frames left in topmost packet %d", num_sbc_frames);
   1363             APPL_TRACE_DEBUG(" Remaining frames to process in tick %d", num_frames_to_process);
   1364             APPL_TRACE_DEBUG(" Num of Packets in Que %d",
   1365                              fixed_queue_length(btif_media_cb.RxSbcQ));
   1366 
   1367             if ( num_sbc_frames > num_frames_to_process) /*  Que Packet has more frames*/
   1368             {
   1369                  p_msg->num_frames_to_be_processed= num_frames_to_process;
   1370                  btif_media_task_handle_inc_media(p_msg);
   1371                  p_msg->num_frames_to_be_processed = num_sbc_frames - num_frames_to_process;
   1372                  num_frames_to_process = 0;
   1373                  break;
   1374             }
   1375             else                                        /*  Que packet has less frames */
   1376             {
   1377                 btif_media_task_handle_inc_media(p_msg);
   1378                 p_msg = (tBT_SBC_HDR *)fixed_queue_try_dequeue(btif_media_cb.RxSbcQ);
   1379                 if( p_msg == NULL )
   1380                 {
   1381                      APPL_TRACE_ERROR("Insufficient data in que ");
   1382                      break;
   1383                 }
   1384                 num_frames_to_process = num_frames_to_process - p_msg->num_frames_to_be_processed;
   1385                 osi_free(p_msg);
   1386             }
   1387         } while(num_frames_to_process > 0);
   1388 
   1389         APPL_TRACE_DEBUG(" Process Frames - ");
   1390     }
   1391 }
   1392 #else
   1393 static void btif_media_task_avk_handle_timer(UNUSED_ATTR void *context) {}
   1394 #endif
   1395 
   1396 static void btif_media_task_aa_handle_timer(UNUSED_ATTR void *context)
   1397 {
   1398     uint64_t timestamp_us = time_now_us();
   1399     log_tstamps_us("media task tx timer", timestamp_us);
   1400 
   1401 #if (BTA_AV_INCLUDED == TRUE)
   1402     if (alarm_is_scheduled(btif_media_cb.media_alarm))
   1403     {
   1404         btif_media_send_aa_frame(timestamp_us);
   1405     }
   1406     else
   1407     {
   1408         APPL_TRACE_ERROR("ERROR Media task Scheduled after Suspend");
   1409     }
   1410 #endif
   1411 }
   1412 
   1413 #if (BTA_AV_INCLUDED == TRUE)
   1414 static void btif_media_task_aa_handle_uipc_rx_rdy(void)
   1415 {
   1416     /* process all the UIPC data */
   1417     btif_media_aa_prep_2_send(0xFF, time_now_us());
   1418 
   1419     /* send it */
   1420     LOG_VERBOSE(LOG_TAG, "%s calls bta_av_ci_src_data_ready", __func__);
   1421     bta_av_ci_src_data_ready(BTA_AV_CHNL_AUDIO);
   1422 }
   1423 #endif
   1424 
   1425 static void btif_media_thread_init(UNUSED_ATTR void *context) {
   1426   // Check to make sure the platform has 8 bits/byte since
   1427   // we're using that in frame size calculations now.
   1428   assert(CHAR_BIT == 8);
   1429 
   1430   memset(&btif_media_cb, 0, sizeof(btif_media_cb));
   1431   btif_media_cb.stats.session_start_us = time_now_us();
   1432 
   1433   UIPC_Init(NULL);
   1434 
   1435 #if (BTA_AV_INCLUDED == TRUE)
   1436   btif_media_cb.TxAaQ = fixed_queue_new(SIZE_MAX);
   1437   btif_media_cb.RxSbcQ = fixed_queue_new(SIZE_MAX);
   1438   UIPC_Open(UIPC_CH_ID_AV_CTRL , btif_a2dp_ctrl_cb);
   1439 #endif
   1440 
   1441   raise_priority_a2dp(TASK_HIGH_MEDIA);
   1442   media_task_running = MEDIA_TASK_STATE_ON;
   1443 }
   1444 
   1445 static void btif_media_thread_cleanup(UNUSED_ATTR void *context) {
   1446   /* make sure no channels are restarted while shutting down */
   1447   media_task_running = MEDIA_TASK_STATE_SHUTTING_DOWN;
   1448 
   1449   /* this calls blocks until uipc is fully closed */
   1450   UIPC_Close(UIPC_CH_ID_ALL);
   1451 
   1452 #if (BTA_AV_INCLUDED == TRUE)
   1453   fixed_queue_free(btif_media_cb.TxAaQ, NULL);
   1454   btif_media_cb.TxAaQ = NULL;
   1455   fixed_queue_free(btif_media_cb.RxSbcQ, NULL);
   1456   btif_media_cb.RxSbcQ = NULL;
   1457 #endif
   1458 
   1459   /* Clear media task flag */
   1460   media_task_running = MEDIA_TASK_STATE_OFF;
   1461 }
   1462 
   1463 /*******************************************************************************
   1464  **
   1465  ** Function         btif_media_task_send_cmd_evt
   1466  **
   1467  ** Description
   1468  **
   1469  ** Returns          TRUE is success
   1470  **
   1471  *******************************************************************************/
   1472 BOOLEAN btif_media_task_send_cmd_evt(UINT16 Evt)
   1473 {
   1474     BT_HDR *p_buf = osi_malloc(sizeof(BT_HDR));
   1475 
   1476     p_buf->event = Evt;
   1477     fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
   1478 
   1479     return TRUE;
   1480 }
   1481 
   1482 /*******************************************************************************
   1483  **
   1484  ** Function         btif_media_flush_q
   1485  **
   1486  ** Description
   1487  **
   1488  ** Returns          void
   1489  **
   1490  *******************************************************************************/
   1491 static void btif_media_flush_q(fixed_queue_t *p_q)
   1492 {
   1493     while (! fixed_queue_is_empty(p_q))
   1494     {
   1495         osi_free(fixed_queue_try_dequeue(p_q));
   1496     }
   1497 }
   1498 
   1499 static void btif_media_thread_handle_cmd(fixed_queue_t *queue, UNUSED_ATTR void *context)
   1500 {
   1501     BT_HDR *p_msg = (BT_HDR *)fixed_queue_dequeue(queue);
   1502     LOG_VERBOSE(LOG_TAG, "btif_media_thread_handle_cmd : %d %s", p_msg->event,
   1503              dump_media_event(p_msg->event));
   1504 
   1505     switch (p_msg->event)
   1506     {
   1507 #if (BTA_AV_INCLUDED == TRUE)
   1508     case BTIF_MEDIA_START_AA_TX:
   1509         btif_media_task_aa_start_tx();
   1510         break;
   1511     case BTIF_MEDIA_STOP_AA_TX:
   1512         btif_media_task_aa_stop_tx();
   1513         break;
   1514     case BTIF_MEDIA_SBC_ENC_INIT:
   1515         btif_media_task_enc_init(p_msg);
   1516         break;
   1517     case BTIF_MEDIA_SBC_ENC_UPDATE:
   1518         btif_media_task_enc_update(p_msg);
   1519         break;
   1520     case BTIF_MEDIA_AUDIO_FEEDING_INIT:
   1521         btif_media_task_audio_feeding_init(p_msg);
   1522         break;
   1523     case BTIF_MEDIA_FLUSH_AA_TX:
   1524         btif_media_task_aa_tx_flush(p_msg);
   1525         break;
   1526     case BTIF_MEDIA_UIPC_RX_RDY:
   1527         btif_media_task_aa_handle_uipc_rx_rdy();
   1528         break;
   1529 #ifdef USE_AUDIO_TRACK
   1530     case BTIF_MEDIA_AUDIO_SINK_SET_FOCUS_STATE:
   1531         if(!btif_av_is_connected())
   1532             break;
   1533         btif_media_cb.rx_audio_focus_state = ((tBTIF_MEDIA_SINK_FOCUS_UPDATE *)p_msg)->focus_state;
   1534         APPL_TRACE_DEBUG("Setting focus state to %d ",btif_media_cb.rx_audio_focus_state);
   1535         break;
   1536 #endif
   1537     case BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE:
   1538 #if (BTA_AV_SINK_INCLUDED == TRUE)
   1539         btif_media_task_aa_handle_decoder_reset(p_msg);
   1540 #endif
   1541         break;
   1542     case BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK:
   1543 #if (BTA_AV_SINK_INCLUDED == TRUE)
   1544         btif_media_task_aa_handle_clear_track();
   1545 #endif
   1546         break;
   1547      case BTIF_MEDIA_FLUSH_AA_RX:
   1548         btif_media_task_aa_rx_flush();
   1549         break;
   1550 #endif
   1551     default:
   1552         APPL_TRACE_ERROR("ERROR in %s unknown event %d", __func__, p_msg->event);
   1553     }
   1554     osi_free(p_msg);
   1555     LOG_VERBOSE(LOG_TAG, "%s: %s DONE", __func__, dump_media_event(p_msg->event));
   1556 }
   1557 
   1558 #if (BTA_AV_SINK_INCLUDED == TRUE)
   1559 /*******************************************************************************
   1560  **
   1561  ** Function         btif_media_task_handle_inc_media
   1562  **
   1563  ** Description
   1564  **
   1565  ** Returns          void
   1566  **
   1567  *******************************************************************************/
   1568 static void btif_media_task_handle_inc_media(tBT_SBC_HDR*p_msg)
   1569 {
   1570     UINT8 *sbc_start_frame = ((UINT8*)(p_msg + 1) + p_msg->offset + 1);
   1571     int count;
   1572     UINT32 pcmBytes, availPcmBytes;
   1573     OI_INT16 *pcmDataPointer = pcmData; /*Will be overwritten on next packet receipt*/
   1574     OI_STATUS status;
   1575     int num_sbc_frames = p_msg->num_frames_to_be_processed;
   1576     UINT32 sbc_frame_len = p_msg->len - 1;
   1577     availPcmBytes = sizeof(pcmData);
   1578 
   1579     if ((btif_media_cb.peer_sep == AVDT_TSEP_SNK) || (btif_media_cb.rx_flush))
   1580     {
   1581         APPL_TRACE_DEBUG(" State Changed happened in this tick ");
   1582         return;
   1583     }
   1584 #ifndef USE_AUDIO_TRACK
   1585     // ignore data if no one is listening
   1586     if (!btif_media_cb.data_channel_open)
   1587     {
   1588         APPL_TRACE_ERROR("%s Channel not open, returning", __func__);
   1589         return;
   1590     }
   1591 #endif
   1592     APPL_TRACE_DEBUG("%s Number of sbc frames %d, frame_len %d",
   1593                      __func__, num_sbc_frames, sbc_frame_len);
   1594 
   1595     for(count = 0; count < num_sbc_frames && sbc_frame_len != 0; count ++)
   1596     {
   1597         pcmBytes = availPcmBytes;
   1598         status = OI_CODEC_SBC_DecodeFrame(&context, (const OI_BYTE**)&sbc_start_frame,
   1599                                                         (OI_UINT32 *)&sbc_frame_len,
   1600                                                         (OI_INT16 *)pcmDataPointer,
   1601                                                         (OI_UINT32 *)&pcmBytes);
   1602         if (!OI_SUCCESS(status)) {
   1603             APPL_TRACE_ERROR("Decoding failure: %d\n", status);
   1604             break;
   1605         }
   1606         availPcmBytes -= pcmBytes;
   1607         pcmDataPointer += pcmBytes/2;
   1608         p_msg->offset += (p_msg->len - 1) - sbc_frame_len;
   1609         p_msg->len = sbc_frame_len + 1;
   1610     }
   1611 
   1612 #ifdef USE_AUDIO_TRACK
   1613     BtifAvrcpAudioTrackWriteData(
   1614         btif_media_cb.audio_track, (void*)pcmData, (sizeof(pcmData) - availPcmBytes));
   1615 #else
   1616     UIPC_Send(UIPC_CH_ID_AV_AUDIO, 0, (UINT8 *)pcmData, (sizeof(pcmData) - availPcmBytes));
   1617 #endif
   1618 }
   1619 #endif
   1620 
   1621 #if (BTA_AV_INCLUDED == TRUE)
   1622 /*******************************************************************************
   1623  **
   1624  ** Function         btif_media_task_enc_init_req
   1625  **
   1626  ** Description
   1627  **
   1628  ** Returns          TRUE is success
   1629  **
   1630  *******************************************************************************/
   1631 BOOLEAN btif_media_task_enc_init_req(tBTIF_MEDIA_INIT_AUDIO *p_msg)
   1632 {
   1633     tBTIF_MEDIA_INIT_AUDIO *p_buf = osi_malloc(sizeof(tBTIF_MEDIA_INIT_AUDIO));
   1634 
   1635     memcpy(p_buf, p_msg, sizeof(tBTIF_MEDIA_INIT_AUDIO));
   1636     p_buf->hdr.event = BTIF_MEDIA_SBC_ENC_INIT;
   1637     fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
   1638 
   1639     return TRUE;
   1640 }
   1641 
   1642 /*******************************************************************************
   1643  **
   1644  ** Function         btif_media_task_enc_update_req
   1645  **
   1646  ** Description
   1647  **
   1648  ** Returns          TRUE is success
   1649  **
   1650  *******************************************************************************/
   1651 BOOLEAN btif_media_task_enc_update_req(tBTIF_MEDIA_UPDATE_AUDIO *p_msg)
   1652 {
   1653     tBTIF_MEDIA_UPDATE_AUDIO *p_buf =
   1654         osi_malloc(sizeof(tBTIF_MEDIA_UPDATE_AUDIO));
   1655 
   1656     memcpy(p_buf, p_msg, sizeof(tBTIF_MEDIA_UPDATE_AUDIO));
   1657     p_buf->hdr.event = BTIF_MEDIA_SBC_ENC_UPDATE;
   1658     fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
   1659 
   1660     return TRUE;
   1661 }
   1662 
   1663 /*******************************************************************************
   1664  **
   1665  ** Function         btif_media_task_audio_feeding_init_req
   1666  **
   1667  ** Description
   1668  **
   1669  ** Returns          TRUE is success
   1670  **
   1671  *******************************************************************************/
   1672 BOOLEAN btif_media_task_audio_feeding_init_req(tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_msg)
   1673 {
   1674     tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_buf =
   1675         osi_malloc(sizeof(tBTIF_MEDIA_INIT_AUDIO_FEEDING));
   1676 
   1677     memcpy(p_buf, p_msg, sizeof(tBTIF_MEDIA_INIT_AUDIO_FEEDING));
   1678     p_buf->hdr.event = BTIF_MEDIA_AUDIO_FEEDING_INIT;
   1679     fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
   1680 
   1681     return TRUE;
   1682 }
   1683 
   1684 /*******************************************************************************
   1685  **
   1686  ** Function         btif_media_task_start_aa_req
   1687  **
   1688  ** Description
   1689  **
   1690  ** Returns          TRUE is success
   1691  **
   1692  *******************************************************************************/
   1693 BOOLEAN btif_media_task_start_aa_req(void)
   1694 {
   1695     BT_HDR *p_buf = osi_malloc(sizeof(BT_HDR));
   1696 
   1697     p_buf->event = BTIF_MEDIA_START_AA_TX;
   1698     fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
   1699 
   1700     return TRUE;
   1701 }
   1702 
   1703 /*******************************************************************************
   1704  **
   1705  ** Function         btif_media_task_stop_aa_req
   1706  **
   1707  ** Description
   1708  **
   1709  ** Returns          TRUE is success
   1710  **
   1711  *******************************************************************************/
   1712 BOOLEAN btif_media_task_stop_aa_req(void)
   1713 {
   1714     BT_HDR *p_buf = osi_malloc(sizeof(BT_HDR));
   1715 
   1716     p_buf->event = BTIF_MEDIA_STOP_AA_TX;
   1717 
   1718     /*
   1719      * Explicitly check whether the btif_media_cmd_msg_queue is not NULL to
   1720      * avoid a race condition during shutdown of the Bluetooth stack.
   1721      * This race condition is triggered when A2DP audio is streaming on
   1722      * shutdown:
   1723      * "btif_a2dp_on_stopped() -> btif_media_task_stop_aa_req()" is called
   1724      * to stop the particular audio stream, and this happens right after
   1725      * the "cleanup() -> btif_a2dp_stop_media_task()" processing during
   1726      * the shutdown of the Bluetooth stack.
   1727      */
   1728     if (btif_media_cmd_msg_queue != NULL)
   1729         fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
   1730 
   1731     return TRUE;
   1732 }
   1733 /*******************************************************************************
   1734  **
   1735  ** Function         btif_media_task_aa_rx_flush_req
   1736  **
   1737  ** Description
   1738  **
   1739  ** Returns          TRUE is success
   1740  **
   1741  *******************************************************************************/
   1742 BOOLEAN btif_media_task_aa_rx_flush_req(void)
   1743 {
   1744     if (fixed_queue_is_empty(btif_media_cb.RxSbcQ)) /*  Que is already empty */
   1745         return TRUE;
   1746 
   1747     BT_HDR *p_buf = osi_malloc(sizeof(BT_HDR));
   1748     p_buf->event = BTIF_MEDIA_FLUSH_AA_RX;
   1749     fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
   1750 
   1751     return TRUE;
   1752 }
   1753 
   1754 /*******************************************************************************
   1755  **
   1756  ** Function         btif_media_task_aa_tx_flush_req
   1757  **
   1758  ** Description
   1759  **
   1760  ** Returns          TRUE is success
   1761  **
   1762  *******************************************************************************/
   1763 BOOLEAN btif_media_task_aa_tx_flush_req(void)
   1764 {
   1765     BT_HDR *p_buf = osi_malloc(sizeof(BT_HDR));
   1766 
   1767     p_buf->event = BTIF_MEDIA_FLUSH_AA_TX;
   1768 
   1769     /*
   1770      * Explicitly check whether the btif_media_cmd_msg_queue is not NULL to
   1771      * avoid a race condition during shutdown of the Bluetooth stack.
   1772      * This race condition is triggered when A2DP audio is streaming on
   1773      * shutdown:
   1774      * "btif_a2dp_on_stopped() -> btif_media_task_aa_tx_flush_req()" is called
   1775      * to stop the particular audio stream, and this happens right after
   1776      * the "cleanup() -> btif_a2dp_stop_media_task()" processing during
   1777      * the shutdown of the Bluetooth stack.
   1778      */
   1779     if (btif_media_cmd_msg_queue != NULL)
   1780         fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
   1781 
   1782     return TRUE;
   1783 }
   1784 /*******************************************************************************
   1785  **
   1786  ** Function         btif_media_task_aa_rx_flush
   1787  **
   1788  ** Description
   1789  **
   1790  ** Returns          void
   1791  **
   1792  *******************************************************************************/
   1793 static void btif_media_task_aa_rx_flush(void)
   1794 {
   1795     /* Flush all enqueued GKI SBC  buffers (encoded) */
   1796     APPL_TRACE_DEBUG("btif_media_task_aa_rx_flush");
   1797 
   1798     btif_media_flush_q(btif_media_cb.RxSbcQ);
   1799 }
   1800 
   1801 
   1802 /*******************************************************************************
   1803  **
   1804  ** Function         btif_media_task_aa_tx_flush
   1805  **
   1806  ** Description
   1807  **
   1808  ** Returns          void
   1809  **
   1810  *******************************************************************************/
   1811 static void btif_media_task_aa_tx_flush(BT_HDR *p_msg)
   1812 {
   1813     UNUSED(p_msg);
   1814 
   1815     /* Flush all enqueued GKI music buffers (encoded) */
   1816     APPL_TRACE_DEBUG("btif_media_task_aa_tx_flush");
   1817 
   1818     btif_media_cb.media_feeding_state.pcm.counter = 0;
   1819     btif_media_cb.media_feeding_state.pcm.aa_feed_residue = 0;
   1820 
   1821     btif_media_cb.stats.tx_queue_total_flushed_messages +=
   1822         fixed_queue_length(btif_media_cb.TxAaQ);
   1823     btif_media_cb.stats.tx_queue_last_flushed_us = time_now_us();
   1824     btif_media_flush_q(btif_media_cb.TxAaQ);
   1825 
   1826     UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REQ_RX_FLUSH, NULL);
   1827 }
   1828 
   1829 /*******************************************************************************
   1830  **
   1831  ** Function       btif_media_task_enc_init
   1832  **
   1833  ** Description    Initialize encoding task
   1834  **
   1835  ** Returns        void
   1836  **
   1837  *******************************************************************************/
   1838 static void btif_media_task_enc_init(BT_HDR *p_msg)
   1839 {
   1840     tBTIF_MEDIA_INIT_AUDIO *pInitAudio = (tBTIF_MEDIA_INIT_AUDIO *) p_msg;
   1841 
   1842     APPL_TRACE_DEBUG("btif_media_task_enc_init");
   1843 
   1844     btif_media_cb.timestamp = 0;
   1845 
   1846     /* SBC encoder config (enforced even if not used) */
   1847     btif_media_cb.encoder.s16ChannelMode = pInitAudio->ChannelMode;
   1848     btif_media_cb.encoder.s16NumOfSubBands = pInitAudio->NumOfSubBands;
   1849     btif_media_cb.encoder.s16NumOfBlocks = pInitAudio->NumOfBlocks;
   1850     btif_media_cb.encoder.s16AllocationMethod = pInitAudio->AllocationMethod;
   1851     btif_media_cb.encoder.s16SamplingFreq = pInitAudio->SamplingFreq;
   1852 
   1853     btif_media_cb.encoder.u16BitRate = btif_media_task_get_sbc_rate();
   1854 
   1855     /* Default transcoding is PCM to SBC, modified by feeding configuration */
   1856     btif_media_cb.TxTranscoding = BTIF_MEDIA_TRSCD_PCM_2_SBC;
   1857     btif_media_cb.TxAaMtuSize = ((BTIF_MEDIA_AA_BUF_SIZE-BTIF_MEDIA_AA_SBC_OFFSET-sizeof(BT_HDR))
   1858             < pInitAudio->MtuSize) ? (BTIF_MEDIA_AA_BUF_SIZE - BTIF_MEDIA_AA_SBC_OFFSET
   1859             - sizeof(BT_HDR)) : pInitAudio->MtuSize;
   1860 
   1861     APPL_TRACE_EVENT("btif_media_task_enc_init busy %d, mtu %d, peer mtu %d",
   1862                      btif_media_cb.busy_level, btif_media_cb.TxAaMtuSize, pInitAudio->MtuSize);
   1863     APPL_TRACE_EVENT("      ch mode %d, subnd %d, nb blk %d, alloc %d, rate %d, freq %d",
   1864             btif_media_cb.encoder.s16ChannelMode, btif_media_cb.encoder.s16NumOfSubBands,
   1865             btif_media_cb.encoder.s16NumOfBlocks,
   1866             btif_media_cb.encoder.s16AllocationMethod, btif_media_cb.encoder.u16BitRate,
   1867             btif_media_cb.encoder.s16SamplingFreq);
   1868 
   1869     /* Reset entirely the SBC encoder */
   1870     SBC_Encoder_Init(&(btif_media_cb.encoder));
   1871 
   1872     btif_media_cb.tx_sbc_frames = calculate_max_frames_per_packet();
   1873 
   1874     APPL_TRACE_DEBUG("%s bit pool %d", __func__, btif_media_cb.encoder.s16BitPool);
   1875 }
   1876 
   1877 /*******************************************************************************
   1878  **
   1879  ** Function       btif_media_task_enc_update
   1880  **
   1881  ** Description    Update encoding task
   1882  **
   1883  ** Returns        void
   1884  **
   1885  *******************************************************************************/
   1886 
   1887 static void btif_media_task_enc_update(BT_HDR *p_msg)
   1888 {
   1889     tBTIF_MEDIA_UPDATE_AUDIO * pUpdateAudio = (tBTIF_MEDIA_UPDATE_AUDIO *) p_msg;
   1890     SBC_ENC_PARAMS *pstrEncParams = &btif_media_cb.encoder;
   1891     UINT16 s16SamplingFreq;
   1892     SINT16 s16BitPool = 0;
   1893     SINT16 s16BitRate;
   1894     SINT16 s16FrameLen;
   1895     UINT8 protect = 0;
   1896 
   1897     APPL_TRACE_DEBUG("%s : minmtu %d, maxbp %d minbp %d", __func__,
   1898                      pUpdateAudio->MinMtuSize, pUpdateAudio->MaxBitPool,
   1899                      pUpdateAudio->MinBitPool);
   1900 
   1901     if (!pstrEncParams->s16NumOfSubBands)
   1902     {
   1903         APPL_TRACE_WARNING("%s SubBands are set to 0, resetting to max (%d)",
   1904           __func__, SBC_MAX_NUM_OF_SUBBANDS);
   1905         pstrEncParams->s16NumOfSubBands = SBC_MAX_NUM_OF_SUBBANDS;
   1906     }
   1907 
   1908     if (!pstrEncParams->s16NumOfBlocks)
   1909     {
   1910         APPL_TRACE_WARNING("%s Blocks are set to 0, resetting to max (%d)",
   1911           __func__, SBC_MAX_NUM_OF_BLOCKS);
   1912         pstrEncParams->s16NumOfBlocks = SBC_MAX_NUM_OF_BLOCKS;
   1913     }
   1914 
   1915     if (!pstrEncParams->s16NumOfChannels)
   1916     {
   1917         APPL_TRACE_WARNING("%s Channels are set to 0, resetting to max (%d)",
   1918           __func__, SBC_MAX_NUM_OF_CHANNELS);
   1919         pstrEncParams->s16NumOfChannels = SBC_MAX_NUM_OF_CHANNELS;
   1920     }
   1921 
   1922     btif_media_cb.TxAaMtuSize = ((BTIF_MEDIA_AA_BUF_SIZE -
   1923                                   BTIF_MEDIA_AA_SBC_OFFSET - sizeof(BT_HDR))
   1924             < pUpdateAudio->MinMtuSize) ? (BTIF_MEDIA_AA_BUF_SIZE - BTIF_MEDIA_AA_SBC_OFFSET
   1925             - sizeof(BT_HDR)) : pUpdateAudio->MinMtuSize;
   1926 
   1927     /* Set the initial target bit rate */
   1928     pstrEncParams->u16BitRate = btif_media_task_get_sbc_rate();
   1929 
   1930     if (pstrEncParams->s16SamplingFreq == SBC_sf16000)
   1931         s16SamplingFreq = 16000;
   1932     else if (pstrEncParams->s16SamplingFreq == SBC_sf32000)
   1933         s16SamplingFreq = 32000;
   1934     else if (pstrEncParams->s16SamplingFreq == SBC_sf44100)
   1935         s16SamplingFreq = 44100;
   1936     else
   1937         s16SamplingFreq = 48000;
   1938 
   1939     do {
   1940         if (pstrEncParams->s16NumOfBlocks == 0 ||
   1941             pstrEncParams->s16NumOfSubBands == 0 ||
   1942             pstrEncParams->s16NumOfChannels == 0) {
   1943             APPL_TRACE_ERROR("%s - Avoiding division by zero...", __func__);
   1944             APPL_TRACE_ERROR("%s - block=%d, subBands=%d, channels=%d",
   1945                              __func__,
   1946                              pstrEncParams->s16NumOfBlocks,
   1947                              pstrEncParams->s16NumOfSubBands,
   1948                              pstrEncParams->s16NumOfChannels);
   1949             break;
   1950         }
   1951 
   1952         if ((pstrEncParams->s16ChannelMode == SBC_JOINT_STEREO) ||
   1953             (pstrEncParams->s16ChannelMode == SBC_STEREO)) {
   1954             s16BitPool = (SINT16)((pstrEncParams->u16BitRate *
   1955                     pstrEncParams->s16NumOfSubBands * 1000 / s16SamplingFreq)
   1956                     - ((32 + (4 * pstrEncParams->s16NumOfSubBands *
   1957                     pstrEncParams->s16NumOfChannels)
   1958                     + ((pstrEncParams->s16ChannelMode - 2) *
   1959                     pstrEncParams->s16NumOfSubBands))
   1960                     / pstrEncParams->s16NumOfBlocks));
   1961 
   1962             s16FrameLen = 4 + (4*pstrEncParams->s16NumOfSubBands *
   1963                     pstrEncParams->s16NumOfChannels) / 8
   1964                     + (((pstrEncParams->s16ChannelMode - 2) *
   1965                     pstrEncParams->s16NumOfSubBands)
   1966                     + (pstrEncParams->s16NumOfBlocks * s16BitPool)) / 8;
   1967 
   1968             s16BitRate = (8 * s16FrameLen * s16SamplingFreq)
   1969                     / (pstrEncParams->s16NumOfSubBands *
   1970                     pstrEncParams->s16NumOfBlocks * 1000);
   1971 
   1972             if (s16BitRate > pstrEncParams->u16BitRate)
   1973                 s16BitPool--;
   1974 
   1975             if (pstrEncParams->s16NumOfSubBands == 8)
   1976                 s16BitPool = (s16BitPool > 255) ? 255 : s16BitPool;
   1977             else
   1978                 s16BitPool = (s16BitPool > 128) ? 128 : s16BitPool;
   1979         } else {
   1980             s16BitPool = (SINT16)(((pstrEncParams->s16NumOfSubBands *
   1981                     pstrEncParams->u16BitRate * 1000)
   1982                     / (s16SamplingFreq * pstrEncParams->s16NumOfChannels))
   1983                     - (((32 / pstrEncParams->s16NumOfChannels) +
   1984                     (4 * pstrEncParams->s16NumOfSubBands))
   1985                     / pstrEncParams->s16NumOfBlocks));
   1986 
   1987             pstrEncParams->s16BitPool =
   1988                 (s16BitPool > (16 * pstrEncParams->s16NumOfSubBands)) ?
   1989                         (16 * pstrEncParams->s16NumOfSubBands) : s16BitPool;
   1990         }
   1991 
   1992         if (s16BitPool < 0)
   1993             s16BitPool = 0;
   1994 
   1995         APPL_TRACE_EVENT("%s bitpool candidate : %d (%d kbps)", __func__,
   1996                          s16BitPool, pstrEncParams->u16BitRate);
   1997 
   1998         if (s16BitPool > pUpdateAudio->MaxBitPool) {
   1999             APPL_TRACE_DEBUG("%s computed bitpool too large (%d)", __func__,
   2000                              s16BitPool);
   2001             /* Decrease bitrate */
   2002             btif_media_cb.encoder.u16BitRate -= BTIF_MEDIA_BITRATE_STEP;
   2003             /* Record that we have decreased the bitrate */
   2004             protect |= 1;
   2005         } else if (s16BitPool < pUpdateAudio->MinBitPool) {
   2006             APPL_TRACE_WARNING("%s computed bitpool too small (%d)", __func__,
   2007                                s16BitPool);
   2008 
   2009             /* Increase bitrate */
   2010             UINT16 previous_u16BitRate = btif_media_cb.encoder.u16BitRate;
   2011             btif_media_cb.encoder.u16BitRate += BTIF_MEDIA_BITRATE_STEP;
   2012             /* Record that we have increased the bitrate */
   2013             protect |= 2;
   2014             /* Check over-flow */
   2015             if (btif_media_cb.encoder.u16BitRate < previous_u16BitRate)
   2016                 protect |= 3;
   2017         } else {
   2018             break;
   2019         }
   2020         /* In case we have already increased and decreased the bitrate, just stop */
   2021         if (protect == 3) {
   2022             APPL_TRACE_ERROR("%s could not find bitpool in range", __func__);
   2023             break;
   2024         }
   2025     } while (1);
   2026 
   2027     /* Finally update the bitpool in the encoder structure */
   2028     pstrEncParams->s16BitPool = s16BitPool;
   2029 
   2030     APPL_TRACE_DEBUG("%s final bit rate %d, final bit pool %d", __func__,
   2031                      btif_media_cb.encoder.u16BitRate,
   2032                      btif_media_cb.encoder.s16BitPool);
   2033 
   2034     /* make sure we reinitialize encoder with new settings */
   2035     SBC_Encoder_Init(&(btif_media_cb.encoder));
   2036 
   2037     btif_media_cb.tx_sbc_frames = calculate_max_frames_per_packet();
   2038 }
   2039 
   2040 /*******************************************************************************
   2041  **
   2042  ** Function         btif_media_task_pcm2sbc_init
   2043  **
   2044  ** Description      Init encoding task for PCM to SBC according to feeding
   2045  **
   2046  ** Returns          void
   2047  **
   2048  *******************************************************************************/
   2049 static void btif_media_task_pcm2sbc_init(tBTIF_MEDIA_INIT_AUDIO_FEEDING * p_feeding)
   2050 {
   2051     BOOLEAN reconfig_needed = FALSE;
   2052 
   2053     APPL_TRACE_DEBUG("PCM feeding:");
   2054     APPL_TRACE_DEBUG("sampling_freq:%d", p_feeding->feeding.cfg.pcm.sampling_freq);
   2055     APPL_TRACE_DEBUG("num_channel:%d", p_feeding->feeding.cfg.pcm.num_channel);
   2056     APPL_TRACE_DEBUG("bit_per_sample:%d", p_feeding->feeding.cfg.pcm.bit_per_sample);
   2057 
   2058     /* Check the PCM feeding sampling_freq */
   2059     switch (p_feeding->feeding.cfg.pcm.sampling_freq)
   2060     {
   2061         case  8000:
   2062         case 12000:
   2063         case 16000:
   2064         case 24000:
   2065         case 32000:
   2066         case 48000:
   2067             /* For these sampling_freq the AV connection must be 48000 */
   2068             if (btif_media_cb.encoder.s16SamplingFreq != SBC_sf48000)
   2069             {
   2070                 /* Reconfiguration needed at 48000 */
   2071                 APPL_TRACE_DEBUG("SBC Reconfiguration needed at 48000");
   2072                 btif_media_cb.encoder.s16SamplingFreq = SBC_sf48000;
   2073                 reconfig_needed = TRUE;
   2074             }
   2075             break;
   2076 
   2077         case 11025:
   2078         case 22050:
   2079         case 44100:
   2080             /* For these sampling_freq the AV connection must be 44100 */
   2081             if (btif_media_cb.encoder.s16SamplingFreq != SBC_sf44100)
   2082             {
   2083                 /* Reconfiguration needed at 44100 */
   2084                 APPL_TRACE_DEBUG("SBC Reconfiguration needed at 44100");
   2085                 btif_media_cb.encoder.s16SamplingFreq = SBC_sf44100;
   2086                 reconfig_needed = TRUE;
   2087             }
   2088             break;
   2089         default:
   2090             APPL_TRACE_DEBUG("Feeding PCM sampling_freq unsupported");
   2091             break;
   2092     }
   2093 
   2094     /* Some AV Headsets do not support Mono => always ask for Stereo */
   2095     if (btif_media_cb.encoder.s16ChannelMode == SBC_MONO)
   2096     {
   2097         APPL_TRACE_DEBUG("SBC Reconfiguration needed in Stereo");
   2098         btif_media_cb.encoder.s16ChannelMode = SBC_JOINT_STEREO;
   2099         reconfig_needed = TRUE;
   2100     }
   2101 
   2102     if (reconfig_needed != FALSE)
   2103     {
   2104         APPL_TRACE_DEBUG("btif_media_task_pcm2sbc_init :: mtu %d", btif_media_cb.TxAaMtuSize);
   2105         APPL_TRACE_DEBUG("ch mode %d, nbsubd %d, nb %d, alloc %d, rate %d, freq %d",
   2106                 btif_media_cb.encoder.s16ChannelMode,
   2107                 btif_media_cb.encoder.s16NumOfSubBands, btif_media_cb.encoder.s16NumOfBlocks,
   2108                 btif_media_cb.encoder.s16AllocationMethod, btif_media_cb.encoder.u16BitRate,
   2109                 btif_media_cb.encoder.s16SamplingFreq);
   2110 
   2111         SBC_Encoder_Init(&(btif_media_cb.encoder));
   2112     }
   2113     else
   2114     {
   2115         APPL_TRACE_DEBUG("btif_media_task_pcm2sbc_init no SBC reconfig needed");
   2116     }
   2117 }
   2118 
   2119 
   2120 /*******************************************************************************
   2121  **
   2122  ** Function         btif_media_task_audio_feeding_init
   2123  **
   2124  ** Description      Initialize the audio path according to the feeding format
   2125  **
   2126  ** Returns          void
   2127  **
   2128  *******************************************************************************/
   2129 static void btif_media_task_audio_feeding_init(BT_HDR *p_msg)
   2130 {
   2131     tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_feeding = (tBTIF_MEDIA_INIT_AUDIO_FEEDING *) p_msg;
   2132 
   2133     APPL_TRACE_DEBUG("btif_media_task_audio_feeding_init format:%d", p_feeding->feeding.format);
   2134 
   2135     /* Save Media Feeding information */
   2136     btif_media_cb.feeding_mode = p_feeding->feeding_mode;
   2137     btif_media_cb.media_feeding = p_feeding->feeding;
   2138 
   2139     /* Handle different feeding formats */
   2140     switch (p_feeding->feeding.format)
   2141     {
   2142         case BTIF_AV_CODEC_PCM:
   2143             btif_media_cb.TxTranscoding = BTIF_MEDIA_TRSCD_PCM_2_SBC;
   2144             btif_media_task_pcm2sbc_init(p_feeding);
   2145             break;
   2146 
   2147         default :
   2148             APPL_TRACE_ERROR("unknown feeding format %d", p_feeding->feeding.format);
   2149             break;
   2150     }
   2151 }
   2152 
   2153 int btif_a2dp_get_track_frequency(UINT8 frequency) {
   2154     int freq = 48000;
   2155     switch (frequency) {
   2156         case A2D_SBC_IE_SAMP_FREQ_16:
   2157             freq = 16000;
   2158             break;
   2159         case A2D_SBC_IE_SAMP_FREQ_32:
   2160             freq = 32000;
   2161             break;
   2162         case A2D_SBC_IE_SAMP_FREQ_44:
   2163             freq = 44100;
   2164             break;
   2165         case A2D_SBC_IE_SAMP_FREQ_48:
   2166             freq = 48000;
   2167             break;
   2168     }
   2169     return freq;
   2170 }
   2171 
   2172 int btif_a2dp_get_track_channel_count(UINT8 channeltype) {
   2173     int count = 1;
   2174     switch (channeltype) {
   2175         case A2D_SBC_IE_CH_MD_MONO:
   2176             count = 1;
   2177             break;
   2178         case A2D_SBC_IE_CH_MD_DUAL:
   2179         case A2D_SBC_IE_CH_MD_STEREO:
   2180         case A2D_SBC_IE_CH_MD_JOINT:
   2181             count = 2;
   2182             break;
   2183     }
   2184     return count;
   2185 }
   2186 
   2187 #ifdef USE_AUDIO_TRACK
   2188 int a2dp_get_track_channel_type(UINT8 channeltype) {
   2189     int count = 1;
   2190     switch (channeltype) {
   2191         case A2D_SBC_IE_CH_MD_MONO:
   2192             count = 1;
   2193             break;
   2194         case A2D_SBC_IE_CH_MD_DUAL:
   2195         case A2D_SBC_IE_CH_MD_STEREO:
   2196         case A2D_SBC_IE_CH_MD_JOINT:
   2197             count = 3;
   2198             break;
   2199     }
   2200     return count;
   2201 }
   2202 #endif
   2203 
   2204 void btif_a2dp_set_peer_sep(UINT8 sep) {
   2205     btif_media_cb.peer_sep = sep;
   2206 }
   2207 
   2208 static void btif_decode_alarm_cb(UNUSED_ATTR void *context) {
   2209   if(worker_thread != NULL)
   2210       thread_post(worker_thread, btif_media_task_avk_handle_timer, NULL);
   2211 }
   2212 
   2213 static void btif_media_task_aa_handle_stop_decoding(void) {
   2214   alarm_free(btif_media_cb.decode_alarm);
   2215   btif_media_cb.decode_alarm = NULL;
   2216 #ifdef USE_AUDIO_TRACK
   2217   BtifAvrcpAudioTrackPause(btif_media_cb.audio_track);
   2218 #endif
   2219 }
   2220 
   2221 static void btif_media_task_aa_handle_start_decoding(void) {
   2222   if (btif_media_cb.decode_alarm)
   2223     return;
   2224 #ifdef USE_AUDIO_TRACK
   2225   BtifAvrcpAudioTrackStart(btif_media_cb.audio_track);
   2226 #endif
   2227   btif_media_cb.decode_alarm = alarm_new_periodic("btif.media_decode");
   2228   if (!btif_media_cb.decode_alarm) {
   2229     LOG_ERROR(LOG_TAG, "%s unable to allocate decode alarm.", __func__);
   2230     return;
   2231   }
   2232 
   2233   alarm_set(btif_media_cb.decode_alarm, BTIF_SINK_MEDIA_TIME_TICK_MS,
   2234             btif_decode_alarm_cb, NULL);
   2235 }
   2236 
   2237 #if (BTA_AV_SINK_INCLUDED == TRUE)
   2238 
   2239 static void btif_media_task_aa_handle_clear_track (void)
   2240 {
   2241     APPL_TRACE_DEBUG("btif_media_task_aa_handle_clear_track");
   2242 #ifdef USE_AUDIO_TRACK
   2243     BtifAvrcpAudioTrackStop(btif_media_cb.audio_track);
   2244     BtifAvrcpAudioTrackDelete(btif_media_cb.audio_track);
   2245     btif_media_cb.audio_track = NULL;
   2246 #endif
   2247 }
   2248 
   2249 /*******************************************************************************
   2250  **
   2251  ** Function         btif_media_task_aa_handle_decoder_reset
   2252  **
   2253  ** Description
   2254  **
   2255  ** Returns          void
   2256  **
   2257  *******************************************************************************/
   2258 static void btif_media_task_aa_handle_decoder_reset(BT_HDR *p_msg)
   2259 {
   2260     tBTIF_MEDIA_SINK_CFG_UPDATE *p_buf = (tBTIF_MEDIA_SINK_CFG_UPDATE*) p_msg;
   2261     tA2D_STATUS a2d_status;
   2262     tA2D_SBC_CIE sbc_cie;
   2263     OI_STATUS       status;
   2264     UINT32          freq_multiple = 48*20; /* frequency multiple for 20ms of data , initialize with 48K*/
   2265     UINT32          num_blocks = 16;
   2266     UINT32          num_subbands = 8;
   2267 
   2268     APPL_TRACE_DEBUG("btif_media_task_aa_handle_decoder_reset p_codec_info[%x:%x:%x:%x:%x:%x]",
   2269             p_buf->codec_info[1], p_buf->codec_info[2], p_buf->codec_info[3],
   2270             p_buf->codec_info[4], p_buf->codec_info[5], p_buf->codec_info[6]);
   2271 
   2272     a2d_status = A2D_ParsSbcInfo(&sbc_cie, p_buf->codec_info, FALSE);
   2273     if (a2d_status != A2D_SUCCESS)
   2274     {
   2275         APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status);
   2276         return;
   2277     }
   2278 
   2279     btif_media_cb.sample_rate = btif_a2dp_get_track_frequency(sbc_cie.samp_freq);
   2280     btif_media_cb.channel_count = btif_a2dp_get_track_channel_count(sbc_cie.ch_mode);
   2281 
   2282     btif_media_cb.rx_flush = FALSE;
   2283     APPL_TRACE_DEBUG("Reset to sink role");
   2284     status = OI_CODEC_SBC_DecoderReset(&context, contextData, sizeof(contextData), 2, 2, FALSE);
   2285     if (!OI_SUCCESS(status)) {
   2286         APPL_TRACE_ERROR("OI_CODEC_SBC_DecoderReset failed with error code %d\n", status);
   2287     }
   2288 
   2289 #ifdef USE_AUDIO_TRACK
   2290     APPL_TRACE_DEBUG("%s A2dpSink: sbc Create Track", __func__);
   2291     btif_media_cb.audio_track =
   2292         BtifAvrcpAudioTrackCreate(btif_a2dp_get_track_frequency(sbc_cie.samp_freq),
   2293                                   a2dp_get_track_channel_type(sbc_cie.ch_mode));
   2294     if (btif_media_cb.audio_track == NULL) {
   2295         APPL_TRACE_ERROR("%s A2dpSink: Track creation fails!!!", __func__);
   2296         return;
   2297     }
   2298 #else
   2299     UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb);
   2300 #endif
   2301 
   2302     switch (sbc_cie.samp_freq)
   2303     {
   2304         case A2D_SBC_IE_SAMP_FREQ_16:
   2305             APPL_TRACE_DEBUG("\tsamp_freq:%d (16000)", sbc_cie.samp_freq);
   2306             freq_multiple = 16*20;
   2307             break;
   2308         case A2D_SBC_IE_SAMP_FREQ_32:
   2309             APPL_TRACE_DEBUG("\tsamp_freq:%d (32000)", sbc_cie.samp_freq);
   2310             freq_multiple = 32*20;
   2311             break;
   2312         case A2D_SBC_IE_SAMP_FREQ_44:
   2313             APPL_TRACE_DEBUG("\tsamp_freq:%d (44100)", sbc_cie.samp_freq);
   2314             freq_multiple = 441*2;
   2315             break;
   2316         case A2D_SBC_IE_SAMP_FREQ_48:
   2317             APPL_TRACE_DEBUG("\tsamp_freq:%d (48000)", sbc_cie.samp_freq);
   2318             freq_multiple = 48*20;
   2319             break;
   2320         default:
   2321             APPL_TRACE_DEBUG(" Unknown Frequency ");
   2322             break;
   2323     }
   2324 
   2325     switch (sbc_cie.ch_mode)
   2326     {
   2327         case A2D_SBC_IE_CH_MD_MONO:
   2328             APPL_TRACE_DEBUG("\tch_mode:%d (Mono)", sbc_cie.ch_mode);
   2329             break;
   2330         case A2D_SBC_IE_CH_MD_DUAL:
   2331             APPL_TRACE_DEBUG("\tch_mode:%d (DUAL)", sbc_cie.ch_mode);
   2332             break;
   2333         case A2D_SBC_IE_CH_MD_STEREO:
   2334             APPL_TRACE_DEBUG("\tch_mode:%d (STEREO)", sbc_cie.ch_mode);
   2335             break;
   2336         case A2D_SBC_IE_CH_MD_JOINT:
   2337             APPL_TRACE_DEBUG("\tch_mode:%d (JOINT)", sbc_cie.ch_mode);
   2338             break;
   2339         default:
   2340             APPL_TRACE_DEBUG(" Unknown Mode ");
   2341             break;
   2342     }
   2343 
   2344     switch (sbc_cie.block_len)
   2345     {
   2346         case A2D_SBC_IE_BLOCKS_4:
   2347             APPL_TRACE_DEBUG("\tblock_len:%d (4)", sbc_cie.block_len);
   2348             num_blocks = 4;
   2349             break;
   2350         case A2D_SBC_IE_BLOCKS_8:
   2351             APPL_TRACE_DEBUG("\tblock_len:%d (8)", sbc_cie.block_len);
   2352             num_blocks = 8;
   2353             break;
   2354         case A2D_SBC_IE_BLOCKS_12:
   2355             APPL_TRACE_DEBUG("\tblock_len:%d (12)", sbc_cie.block_len);
   2356             num_blocks = 12;
   2357             break;
   2358         case A2D_SBC_IE_BLOCKS_16:
   2359             APPL_TRACE_DEBUG("\tblock_len:%d (16)", sbc_cie.block_len);
   2360             num_blocks = 16;
   2361             break;
   2362         default:
   2363             APPL_TRACE_DEBUG(" Unknown BlockLen ");
   2364             break;
   2365     }
   2366 
   2367     switch (sbc_cie.num_subbands)
   2368     {
   2369         case A2D_SBC_IE_SUBBAND_4:
   2370             APPL_TRACE_DEBUG("\tnum_subbands:%d (4)", sbc_cie.num_subbands);
   2371             num_subbands = 4;
   2372             break;
   2373         case A2D_SBC_IE_SUBBAND_8:
   2374             APPL_TRACE_DEBUG("\tnum_subbands:%d (8)", sbc_cie.num_subbands);
   2375             num_subbands = 8;
   2376             break;
   2377         default:
   2378             APPL_TRACE_DEBUG(" Unknown SubBands ");
   2379             break;
   2380     }
   2381 
   2382     switch (sbc_cie.alloc_mthd)
   2383     {
   2384         case A2D_SBC_IE_ALLOC_MD_S:
   2385             APPL_TRACE_DEBUG("\talloc_mthd:%d (SNR)", sbc_cie.alloc_mthd);
   2386             break;
   2387         case A2D_SBC_IE_ALLOC_MD_L:
   2388             APPL_TRACE_DEBUG("\talloc_mthd:%d (Loudness)", sbc_cie.alloc_mthd);
   2389             break;
   2390         default:
   2391             APPL_TRACE_DEBUG(" Unknown Allocation Method");
   2392             break;
   2393     }
   2394 
   2395     APPL_TRACE_DEBUG("\tBit pool Min:%d Max:%d", sbc_cie.min_bitpool, sbc_cie.max_bitpool);
   2396 
   2397     btif_media_cb.frames_to_process = ((freq_multiple)/(num_blocks*num_subbands)) + 1;
   2398     APPL_TRACE_DEBUG(" Frames to be processed in 20 ms %d",btif_media_cb.frames_to_process);
   2399 }
   2400 #endif
   2401 
   2402 /*******************************************************************************
   2403  **
   2404  ** Function         btif_media_task_feeding_state_reset
   2405  **
   2406  ** Description      Reset the media feeding state
   2407  **
   2408  ** Returns          void
   2409  **
   2410  *******************************************************************************/
   2411 static void btif_media_task_feeding_state_reset(void)
   2412 {
   2413     /* By default, just clear the entire state */
   2414     memset(&btif_media_cb.media_feeding_state, 0, sizeof(btif_media_cb.media_feeding_state));
   2415 
   2416     if (btif_media_cb.TxTranscoding == BTIF_MEDIA_TRSCD_PCM_2_SBC)
   2417     {
   2418         btif_media_cb.media_feeding_state.pcm.bytes_per_tick =
   2419                 (btif_media_cb.media_feeding.cfg.pcm.sampling_freq *
   2420                  btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8 *
   2421                  btif_media_cb.media_feeding.cfg.pcm.num_channel *
   2422                  BTIF_MEDIA_TIME_TICK)/1000;
   2423 
   2424         APPL_TRACE_WARNING("pcm bytes per tick %d",
   2425                             (int)btif_media_cb.media_feeding_state.pcm.bytes_per_tick);
   2426     }
   2427 }
   2428 
   2429 static void btif_media_task_alarm_cb(UNUSED_ATTR void *context) {
   2430   thread_post(worker_thread, btif_media_task_aa_handle_timer, NULL);
   2431 }
   2432 
   2433 /*******************************************************************************
   2434  **
   2435  ** Function         btif_media_task_aa_start_tx
   2436  **
   2437  ** Description      Start media task encoding
   2438  **
   2439  ** Returns          void
   2440  **
   2441  *******************************************************************************/
   2442 static void btif_media_task_aa_start_tx(void)
   2443 {
   2444     APPL_TRACE_DEBUG("%s media_alarm %srunning, feeding mode %d", __func__,
   2445                      alarm_is_scheduled(btif_media_cb.media_alarm)? "" : "not ",
   2446                      btif_media_cb.feeding_mode);
   2447 
   2448     last_frame_us = 0;
   2449 
   2450     /* Reset the media feeding state */
   2451     btif_media_task_feeding_state_reset();
   2452 
   2453     APPL_TRACE_EVENT("starting timer %dms", BTIF_MEDIA_TIME_TICK);
   2454 
   2455     alarm_free(btif_media_cb.media_alarm);
   2456     btif_media_cb.media_alarm = alarm_new_periodic("btif.media_task");
   2457     if (!btif_media_cb.media_alarm) {
   2458       LOG_ERROR(LOG_TAG, "%s unable to allocate media alarm.", __func__);
   2459       return;
   2460     }
   2461 
   2462     alarm_set(btif_media_cb.media_alarm, BTIF_MEDIA_TIME_TICK,
   2463               btif_media_task_alarm_cb, NULL);
   2464 }
   2465 
   2466 /*******************************************************************************
   2467  **
   2468  ** Function         btif_media_task_aa_stop_tx
   2469  **
   2470  ** Description      Stop media task encoding
   2471  **
   2472  ** Returns          void
   2473  **
   2474  *******************************************************************************/
   2475 static void btif_media_task_aa_stop_tx(void)
   2476 {
   2477     APPL_TRACE_DEBUG("%s media_alarm is %srunning", __func__,
   2478                      alarm_is_scheduled(btif_media_cb.media_alarm)? "" : "not ");
   2479 
   2480     const bool send_ack = alarm_is_scheduled(btif_media_cb.media_alarm);
   2481 
   2482     /* Stop the timer first */
   2483     alarm_free(btif_media_cb.media_alarm);
   2484     btif_media_cb.media_alarm = NULL;
   2485 
   2486     UIPC_Close(UIPC_CH_ID_AV_AUDIO);
   2487 
   2488     /* Try to send acknowldegment once the media stream is
   2489        stopped. This will make sure that the A2DP HAL layer is
   2490        un-blocked on wait for acknowledgment for the sent command.
   2491        This resolves a corner cases AVDTP SUSPEND collision
   2492        when the DUT and the remote device issue SUSPEND simultaneously
   2493        and due to the processing of the SUSPEND request from the remote,
   2494        the media path is torn down. If the A2DP HAL happens to wait
   2495        for ACK for the initiated SUSPEND, it would never receive it casuing
   2496        a block/wait. Due to this acknowledgement, the A2DP HAL is guranteed
   2497        to get the ACK for any pending command in such cases. */
   2498 
   2499     if (send_ack)
   2500         a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
   2501 
   2502     /* audio engine stopped, reset tx suspended flag */
   2503     btif_media_cb.tx_flush = 0;
   2504     last_frame_us = 0;
   2505 
   2506     /* Reset the media feeding state */
   2507     btif_media_task_feeding_state_reset();
   2508 }
   2509 
   2510 static UINT32 get_frame_length()
   2511 {
   2512     UINT32 frame_len = 0;
   2513     APPL_TRACE_DEBUG("%s channel mode: %d, sub-band: %d, number of block: %d, \
   2514             bitpool: %d, sampling frequency: %d, num channels: %d",
   2515             __func__,
   2516             btif_media_cb.encoder.s16ChannelMode,
   2517             btif_media_cb.encoder.s16NumOfSubBands,
   2518             btif_media_cb.encoder.s16NumOfBlocks,
   2519             btif_media_cb.encoder.s16BitPool,
   2520             btif_media_cb.encoder.s16SamplingFreq,
   2521             btif_media_cb.encoder.s16NumOfChannels);
   2522 
   2523     switch (btif_media_cb.encoder.s16ChannelMode) {
   2524         case SBC_MONO:
   2525             /* FALLTHROUGH */
   2526         case SBC_DUAL:
   2527             frame_len = SBC_FRAME_HEADER_SIZE_BYTES +
   2528                 ((UINT32)(SBC_SCALE_FACTOR_BITS * btif_media_cb.encoder.s16NumOfSubBands *
   2529                 btif_media_cb.encoder.s16NumOfChannels) / CHAR_BIT) +
   2530                 ((UINT32)(btif_media_cb.encoder.s16NumOfBlocks *
   2531                 btif_media_cb.encoder.s16NumOfChannels *
   2532                 btif_media_cb.encoder.s16BitPool) / CHAR_BIT);
   2533             break;
   2534         case SBC_STEREO:
   2535             frame_len = SBC_FRAME_HEADER_SIZE_BYTES +
   2536                 ((UINT32)(SBC_SCALE_FACTOR_BITS * btif_media_cb.encoder.s16NumOfSubBands *
   2537                 btif_media_cb.encoder.s16NumOfChannels) / CHAR_BIT) +
   2538                 ((UINT32)(btif_media_cb.encoder.s16NumOfBlocks *
   2539                 btif_media_cb.encoder.s16BitPool) / CHAR_BIT);
   2540             break;
   2541         case SBC_JOINT_STEREO:
   2542             frame_len = SBC_FRAME_HEADER_SIZE_BYTES +
   2543                 ((UINT32)(SBC_SCALE_FACTOR_BITS * btif_media_cb.encoder.s16NumOfSubBands *
   2544                 btif_media_cb.encoder.s16NumOfChannels) / CHAR_BIT) +
   2545                 ((UINT32)(btif_media_cb.encoder.s16NumOfSubBands +
   2546                 (btif_media_cb.encoder.s16NumOfBlocks *
   2547                 btif_media_cb.encoder.s16BitPool)) / CHAR_BIT);
   2548             break;
   2549         default:
   2550             APPL_TRACE_DEBUG("%s Invalid channel number: %d",
   2551                 __func__, btif_media_cb.encoder.s16ChannelMode);
   2552             break;
   2553     }
   2554     APPL_TRACE_DEBUG("%s calculated frame length: %d", __func__, frame_len);
   2555     return frame_len;
   2556 }
   2557 
   2558 static UINT8 calculate_max_frames_per_packet()
   2559 {
   2560     UINT16 result = 0;
   2561     UINT16 effective_mtu_size = btif_media_cb.TxAaMtuSize;
   2562     UINT32 frame_len;
   2563 
   2564     APPL_TRACE_DEBUG("%s original AVDTP MTU size: %d", __func__, btif_media_cb.TxAaMtuSize);
   2565     if (btif_av_is_peer_edr() && (btif_av_peer_supports_3mbps() == FALSE)) {
   2566         // This condition would be satisfied only if the remote device is
   2567         // EDR and supports only 2 Mbps, but the effective AVDTP MTU size
   2568         // exceeds the 2DH5 packet size.
   2569         APPL_TRACE_DEBUG("%s The remote devce is EDR but does not support 3 Mbps", __func__);
   2570 
   2571         if (effective_mtu_size > MAX_2MBPS_AVDTP_MTU) {
   2572             APPL_TRACE_WARNING("%s Restricting AVDTP MTU size to %d",
   2573                 __func__, MAX_2MBPS_AVDTP_MTU);
   2574             effective_mtu_size = MAX_2MBPS_AVDTP_MTU;
   2575             btif_media_cb.TxAaMtuSize = effective_mtu_size;
   2576         }
   2577     }
   2578 
   2579     if (!btif_media_cb.encoder.s16NumOfSubBands) {
   2580         APPL_TRACE_ERROR("%s SubBands are set to 0, resetting to %d",
   2581             __func__, SBC_MAX_NUM_OF_SUBBANDS);
   2582         btif_media_cb.encoder.s16NumOfSubBands = SBC_MAX_NUM_OF_SUBBANDS;
   2583     }
   2584     if (!btif_media_cb.encoder.s16NumOfBlocks) {
   2585         APPL_TRACE_ERROR("%s Blocks are set to 0, resetting to %d",
   2586             __func__, SBC_MAX_NUM_OF_BLOCKS);
   2587         btif_media_cb.encoder.s16NumOfBlocks = SBC_MAX_NUM_OF_BLOCKS;
   2588     }
   2589     if (!btif_media_cb.encoder.s16NumOfChannels) {
   2590         APPL_TRACE_ERROR("%s Channels are set to 0, resetting to %d",
   2591             __func__, SBC_MAX_NUM_OF_CHANNELS);
   2592         btif_media_cb.encoder.s16NumOfChannels = SBC_MAX_NUM_OF_CHANNELS;
   2593     }
   2594 
   2595     frame_len = get_frame_length();
   2596 
   2597     APPL_TRACE_DEBUG("%s Effective Tx MTU to be considered: %d",
   2598         __func__, effective_mtu_size);
   2599 
   2600     switch (btif_media_cb.encoder.s16SamplingFreq) {
   2601         case SBC_sf44100:
   2602             if (frame_len == 0) {
   2603                 APPL_TRACE_ERROR("%s Calculating frame length, \
   2604                                         resetting it to default 119", __func__);
   2605                 frame_len = MAX_SBC_HQ_FRAME_SIZE_44_1;
   2606             }
   2607             result = (effective_mtu_size - A2DP_HDR_SIZE) / frame_len;
   2608             APPL_TRACE_DEBUG("%s Max number of SBC frames: %d", __func__, result);
   2609             break;
   2610 
   2611         case SBC_sf48000:
   2612             if (frame_len == 0) {
   2613                 APPL_TRACE_ERROR("%s Calculating frame length, \
   2614                                         resetting it to default 115", __func__);
   2615                 frame_len = MAX_SBC_HQ_FRAME_SIZE_48;
   2616             }
   2617             result = (effective_mtu_size - A2DP_HDR_SIZE) / frame_len;
   2618             APPL_TRACE_DEBUG("%s Max number of SBC frames: %d", __func__, result);
   2619             break;
   2620 
   2621         default:
   2622             APPL_TRACE_ERROR("%s Max number of SBC frames: %d", __func__, result);
   2623             break;
   2624 
   2625     }
   2626     return result;
   2627 }
   2628 
   2629 /*******************************************************************************
   2630  **
   2631  ** Function         btif_get_num_aa_frame_iteration
   2632  **
   2633  ** Description      returns number of frames to send and number of iterations
   2634  **                  to be used. num_of_ietrations and num_of_frames parameters
   2635  **                  are used as output param for returning the respective values
   2636  **
   2637  ** Returns          void
   2638  **
   2639  *******************************************************************************/
   2640 static void btif_get_num_aa_frame_iteration(UINT8 *num_of_iterations, UINT8 *num_of_frames)
   2641 {
   2642     UINT8 nof = 0;
   2643     UINT8 noi = 1;
   2644 
   2645     switch (btif_media_cb.TxTranscoding)
   2646     {
   2647         case BTIF_MEDIA_TRSCD_PCM_2_SBC:
   2648         {
   2649             UINT32 projected_nof = 0;
   2650             UINT32 pcm_bytes_per_frame = btif_media_cb.encoder.s16NumOfSubBands *
   2651                              btif_media_cb.encoder.s16NumOfBlocks *
   2652                              btif_media_cb.media_feeding.cfg.pcm.num_channel *
   2653                              btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8;
   2654             APPL_TRACE_DEBUG("%s pcm_bytes_per_frame %u", __func__, pcm_bytes_per_frame);
   2655 
   2656             UINT32 us_this_tick = BTIF_MEDIA_TIME_TICK * 1000;
   2657             UINT64 now_us = time_now_us();
   2658             if (last_frame_us != 0)
   2659                 us_this_tick = (now_us - last_frame_us);
   2660             last_frame_us = now_us;
   2661 
   2662             btif_media_cb.media_feeding_state.pcm.counter +=
   2663                                 btif_media_cb.media_feeding_state.pcm.bytes_per_tick *
   2664                                 us_this_tick / (BTIF_MEDIA_TIME_TICK * 1000);
   2665 
   2666             /* calculate nbr of frames pending for this media tick */
   2667             projected_nof = btif_media_cb.media_feeding_state.pcm.counter / pcm_bytes_per_frame;
   2668             if (projected_nof > btif_media_cb.stats.media_read_max_expected_frames)
   2669                 btif_media_cb.stats.media_read_max_expected_frames = projected_nof;
   2670             btif_media_cb.stats.media_read_total_expected_frames += projected_nof;
   2671             btif_media_cb.stats.media_read_expected_count++;
   2672             if (projected_nof > MAX_PCM_FRAME_NUM_PER_TICK)
   2673             {
   2674                 APPL_TRACE_WARNING("%s() - Limiting frames to be sent from %d to %d"
   2675                     , __FUNCTION__, projected_nof, MAX_PCM_FRAME_NUM_PER_TICK);
   2676                 size_t delta = projected_nof - MAX_PCM_FRAME_NUM_PER_TICK;
   2677                 btif_media_cb.stats.media_read_limited_count++;
   2678                 btif_media_cb.stats.media_read_total_limited_frames += delta;
   2679                 if (delta > btif_media_cb.stats.media_read_max_limited_frames)
   2680                     btif_media_cb.stats.media_read_max_limited_frames = delta;
   2681                 projected_nof = MAX_PCM_FRAME_NUM_PER_TICK;
   2682             }
   2683 
   2684             APPL_TRACE_DEBUG("%s frames for available PCM data %u", __func__, projected_nof);
   2685 
   2686             if (btif_av_is_peer_edr())
   2687             {
   2688                 if (!btif_media_cb.tx_sbc_frames)
   2689                 {
   2690                     APPL_TRACE_ERROR("%s tx_sbc_frames not updated, update from here", __func__);
   2691                     btif_media_cb.tx_sbc_frames = calculate_max_frames_per_packet();
   2692                 }
   2693 
   2694                 nof = btif_media_cb.tx_sbc_frames;
   2695                 if (!nof) {
   2696                     APPL_TRACE_ERROR("%s Number of frames not updated, set calculated values",
   2697                                                         __func__);
   2698                     nof = projected_nof;
   2699                     noi = 1;
   2700                 } else {
   2701                     if (nof < projected_nof)
   2702                     {
   2703                         noi = projected_nof / nof; // number of iterations would vary
   2704                         if (noi > MAX_PCM_ITER_NUM_PER_TICK)
   2705                         {
   2706                             APPL_TRACE_ERROR("%s ## Audio Congestion (iterations:%d > max (%d))",
   2707                                  __func__, noi, MAX_PCM_ITER_NUM_PER_TICK);
   2708                             noi = MAX_PCM_ITER_NUM_PER_TICK;
   2709                             btif_media_cb.media_feeding_state.pcm.counter
   2710                                 = noi * nof * pcm_bytes_per_frame;
   2711                         }
   2712                         projected_nof = nof;
   2713                     } else {
   2714                         noi = 1; // number of iterations is 1
   2715                         APPL_TRACE_DEBUG("%s reducing frames for available PCM data", __func__);
   2716                         nof = projected_nof;
   2717                     }
   2718                 }
   2719             } else {
   2720                 // For BR cases nof will be same as the value retrieved at projected_nof
   2721                 APPL_TRACE_DEBUG("%s headset BR, number of frames %u", __func__, nof);
   2722                 if (projected_nof > MAX_PCM_FRAME_NUM_PER_TICK)
   2723                 {
   2724                     APPL_TRACE_ERROR("%s ## Audio Congestion (frames: %d > max (%d))",
   2725                         __func__, projected_nof, MAX_PCM_FRAME_NUM_PER_TICK);
   2726                     projected_nof = MAX_PCM_FRAME_NUM_PER_TICK;
   2727                     btif_media_cb.media_feeding_state.pcm.counter =
   2728                         noi * projected_nof * pcm_bytes_per_frame;
   2729                 }
   2730                 nof = projected_nof;
   2731             }
   2732             btif_media_cb.media_feeding_state.pcm.counter -= noi * nof * pcm_bytes_per_frame;
   2733             APPL_TRACE_DEBUG("%s effective num of frames %u, iterations %u", __func__, nof, noi);
   2734         }
   2735         break;
   2736 
   2737         default:
   2738             APPL_TRACE_ERROR("%s Unsupported transcoding format 0x%x",
   2739                     __func__, btif_media_cb.TxTranscoding);
   2740             nof = 0;
   2741             noi = 0;
   2742             break;
   2743     }
   2744     *num_of_frames = nof;
   2745     *num_of_iterations = noi;
   2746 }
   2747 
   2748 /*******************************************************************************
   2749  **
   2750  ** Function         btif_media_sink_enque_buf
   2751  **
   2752  ** Description      This function is called by the av_co to fill A2DP Sink Queue
   2753  **
   2754  **
   2755  ** Returns          size of the queue
   2756  *******************************************************************************/
   2757 UINT8 btif_media_sink_enque_buf(BT_HDR *p_pkt)
   2758 {
   2759     if (btif_media_cb.rx_flush == TRUE) /* Flush enabled, do not enque */
   2760         return fixed_queue_length(btif_media_cb.RxSbcQ);
   2761     if (fixed_queue_length(btif_media_cb.RxSbcQ) == MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ)
   2762     {
   2763         UINT8 ret = fixed_queue_length(btif_media_cb.RxSbcQ);
   2764         osi_free(fixed_queue_try_dequeue(btif_media_cb.RxSbcQ));
   2765         return ret;
   2766     }
   2767 
   2768     BTIF_TRACE_VERBOSE("%s +", __func__);
   2769     /* allocate and Queue this buffer */
   2770     tBT_SBC_HDR *p_msg =
   2771         (tBT_SBC_HDR *)osi_malloc(sizeof(tBT_SBC_HDR) + p_pkt->offset +
   2772                                   p_pkt->len);
   2773     memcpy((UINT8 *)(p_msg + 1), (UINT8 *)(p_pkt + 1) + p_pkt->offset,
   2774            p_pkt->len);
   2775     p_msg->num_frames_to_be_processed = (*((UINT8 *)(p_pkt + 1) + p_pkt->offset))& 0x0f;
   2776     p_msg->len = p_pkt->len;
   2777     p_msg->offset = 0;
   2778     p_msg->layer_specific = p_pkt->layer_specific;
   2779     BTIF_TRACE_VERBOSE("%s frames to process %d, len %d  ",
   2780                        __func__, p_msg->num_frames_to_be_processed,p_msg->len);
   2781     fixed_queue_enqueue(btif_media_cb.RxSbcQ, p_msg);
   2782     if (fixed_queue_length(btif_media_cb.RxSbcQ) == MAX_A2DP_DELAYED_START_FRAME_COUNT) {
   2783         BTIF_TRACE_DEBUG(" Initiate Decoding ");
   2784         btif_media_task_aa_handle_start_decoding();
   2785     }
   2786 
   2787     return fixed_queue_length(btif_media_cb.RxSbcQ);
   2788 }
   2789 
   2790 /*******************************************************************************
   2791  **
   2792  ** Function         btif_media_aa_readbuf
   2793  **
   2794  ** Description      This function is called by the av_co to get the next buffer to send
   2795  **
   2796  **
   2797  ** Returns          void
   2798  *******************************************************************************/
   2799 BT_HDR *btif_media_aa_readbuf(void)
   2800 {
   2801     uint64_t now_us = time_now_us();
   2802     BT_HDR *p_buf = fixed_queue_try_dequeue(btif_media_cb.TxAaQ);
   2803 
   2804     btif_media_cb.stats.tx_queue_total_readbuf_calls++;
   2805     btif_media_cb.stats.tx_queue_last_readbuf_us = now_us;
   2806     if (p_buf != NULL) {
   2807         // Update the statistics
   2808         update_scheduling_stats(&btif_media_cb.stats.tx_queue_dequeue_stats,
   2809                                 now_us, BTIF_SINK_MEDIA_TIME_TICK_MS * 1000);
   2810     }
   2811 
   2812     return p_buf;
   2813 }
   2814 
   2815 /*******************************************************************************
   2816  **
   2817  ** Function         btif_media_aa_read_feeding
   2818  **
   2819  ** Description
   2820  **
   2821  ** Returns          void
   2822  **
   2823  *******************************************************************************/
   2824 
   2825 BOOLEAN btif_media_aa_read_feeding(tUIPC_CH_ID channel_id)
   2826 {
   2827     UINT16 event;
   2828     UINT16 blocm_x_subband = btif_media_cb.encoder.s16NumOfSubBands * \
   2829                              btif_media_cb.encoder.s16NumOfBlocks;
   2830     UINT32 read_size;
   2831     UINT16 sbc_sampling = 48000;
   2832     UINT32 src_samples;
   2833     UINT16 bytes_needed = blocm_x_subband * btif_media_cb.encoder.s16NumOfChannels * \
   2834                           btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8;
   2835     static UINT16 up_sampled_buffer[SBC_MAX_NUM_FRAME * SBC_MAX_NUM_OF_BLOCKS
   2836             * SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS * 2];
   2837     static UINT16 read_buffer[SBC_MAX_NUM_FRAME * SBC_MAX_NUM_OF_BLOCKS
   2838             * SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS];
   2839     UINT32 src_size_used;
   2840     UINT32 dst_size_used;
   2841     BOOLEAN fract_needed;
   2842     INT32   fract_max;
   2843     INT32   fract_threshold;
   2844     UINT32  nb_byte_read;
   2845 
   2846     /* Get the SBC sampling rate */
   2847     switch (btif_media_cb.encoder.s16SamplingFreq)
   2848     {
   2849     case SBC_sf48000:
   2850         sbc_sampling = 48000;
   2851         break;
   2852     case SBC_sf44100:
   2853         sbc_sampling = 44100;
   2854         break;
   2855     case SBC_sf32000:
   2856         sbc_sampling = 32000;
   2857         break;
   2858     case SBC_sf16000:
   2859         sbc_sampling = 16000;
   2860         break;
   2861     }
   2862 
   2863     if (sbc_sampling == btif_media_cb.media_feeding.cfg.pcm.sampling_freq) {
   2864         read_size = bytes_needed - btif_media_cb.media_feeding_state.pcm.aa_feed_residue;
   2865         nb_byte_read = UIPC_Read(channel_id, &event,
   2866                   ((UINT8 *)btif_media_cb.encoder.as16PcmBuffer) +
   2867                   btif_media_cb.media_feeding_state.pcm.aa_feed_residue,
   2868                   read_size);
   2869         if (nb_byte_read == read_size) {
   2870             btif_media_cb.media_feeding_state.pcm.aa_feed_residue = 0;
   2871             return TRUE;
   2872         } else {
   2873             APPL_TRACE_WARNING("### UNDERFLOW :: ONLY READ %d BYTES OUT OF %d ###",
   2874                 nb_byte_read, read_size);
   2875             btif_media_cb.media_feeding_state.pcm.aa_feed_residue += nb_byte_read;
   2876             btif_media_cb.stats.media_read_total_underflow_bytes += (read_size - nb_byte_read);
   2877             btif_media_cb.stats.media_read_total_underflow_count++;
   2878             btif_media_cb.stats.media_read_last_underflow_us = time_now_us();
   2879             return FALSE;
   2880         }
   2881     }
   2882 
   2883     /* Some Feeding PCM frequencies require to split the number of sample */
   2884     /* to read. */
   2885     /* E.g 128/6=21.3333 => read 22 and 21 and 21 => max = 2; threshold = 0*/
   2886     fract_needed = FALSE;   /* Default */
   2887     switch (btif_media_cb.media_feeding.cfg.pcm.sampling_freq)
   2888     {
   2889     case 32000:
   2890     case 8000:
   2891         fract_needed = TRUE;
   2892         fract_max = 2;          /* 0, 1 and 2 */
   2893         fract_threshold = 0;    /* Add one for the first */
   2894         break;
   2895     case 16000:
   2896         fract_needed = TRUE;
   2897         fract_max = 2;          /* 0, 1 and 2 */
   2898         fract_threshold = 1;    /* Add one for the first two frames*/
   2899         break;
   2900     }
   2901 
   2902     /* Compute number of sample to read from source */
   2903     src_samples = blocm_x_subband;
   2904     src_samples *= btif_media_cb.media_feeding.cfg.pcm.sampling_freq;
   2905     src_samples /= sbc_sampling;
   2906 
   2907     /* The previous division may have a remainder not null */
   2908     if (fract_needed)
   2909     {
   2910         if (btif_media_cb.media_feeding_state.pcm.aa_feed_counter <= fract_threshold)
   2911         {
   2912             src_samples++; /* for every read before threshold add one sample */
   2913         }
   2914 
   2915         /* do nothing if counter >= threshold */
   2916         btif_media_cb.media_feeding_state.pcm.aa_feed_counter++; /* one more read */
   2917         if (btif_media_cb.media_feeding_state.pcm.aa_feed_counter > fract_max)
   2918         {
   2919             btif_media_cb.media_feeding_state.pcm.aa_feed_counter = 0;
   2920         }
   2921     }
   2922 
   2923     /* Compute number of bytes to read from source */
   2924     read_size = src_samples;
   2925     read_size *= btif_media_cb.media_feeding.cfg.pcm.num_channel;
   2926     read_size *= (btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8);
   2927 
   2928     /* Read Data from UIPC channel */
   2929     nb_byte_read = UIPC_Read(channel_id, &event, (UINT8 *)read_buffer, read_size);
   2930 
   2931     //tput_mon(TRUE, nb_byte_read, FALSE);
   2932 
   2933     if (nb_byte_read < read_size)
   2934     {
   2935         APPL_TRACE_WARNING("### UNDERRUN :: ONLY READ %d BYTES OUT OF %d ###",
   2936                 nb_byte_read, read_size);
   2937         btif_media_cb.stats.media_read_total_underrun_bytes += (read_size - nb_byte_read);
   2938         btif_media_cb.stats.media_read_total_underrun_count++;
   2939         btif_media_cb.stats.media_read_last_underrun_us = time_now_us();
   2940 
   2941         if (nb_byte_read == 0)
   2942             return FALSE;
   2943 
   2944         if(btif_media_cb.feeding_mode == BTIF_AV_FEEDING_ASYNCHRONOUS)
   2945         {
   2946             /* Fill the unfilled part of the read buffer with silence (0) */
   2947             memset(((UINT8 *)read_buffer) + nb_byte_read, 0, read_size - nb_byte_read);
   2948             nb_byte_read = read_size;
   2949         }
   2950     }
   2951 
   2952     /* Initialize PCM up-sampling engine */
   2953     bta_av_sbc_init_up_sample(btif_media_cb.media_feeding.cfg.pcm.sampling_freq,
   2954             sbc_sampling, btif_media_cb.media_feeding.cfg.pcm.bit_per_sample,
   2955             btif_media_cb.media_feeding.cfg.pcm.num_channel);
   2956 
   2957     /* re-sample read buffer */
   2958     /* The output PCM buffer will be stereo, 16 bit per sample */
   2959     dst_size_used = bta_av_sbc_up_sample((UINT8 *)read_buffer,
   2960             (UINT8 *)up_sampled_buffer + btif_media_cb.media_feeding_state.pcm.aa_feed_residue,
   2961             nb_byte_read,
   2962             sizeof(up_sampled_buffer) - btif_media_cb.media_feeding_state.pcm.aa_feed_residue,
   2963             &src_size_used);
   2964 
   2965     /* update the residue */
   2966     btif_media_cb.media_feeding_state.pcm.aa_feed_residue += dst_size_used;
   2967 
   2968     /* only copy the pcm sample when we have up-sampled enough PCM */
   2969     if(btif_media_cb.media_feeding_state.pcm.aa_feed_residue >= bytes_needed)
   2970     {
   2971         /* Copy the output pcm samples in SBC encoding buffer */
   2972         memcpy((UINT8 *)btif_media_cb.encoder.as16PcmBuffer,
   2973                 (UINT8 *)up_sampled_buffer,
   2974                 bytes_needed);
   2975         /* update the residue */
   2976         btif_media_cb.media_feeding_state.pcm.aa_feed_residue -= bytes_needed;
   2977 
   2978         if (btif_media_cb.media_feeding_state.pcm.aa_feed_residue != 0)
   2979         {
   2980             memcpy((UINT8 *)up_sampled_buffer,
   2981                    (UINT8 *)up_sampled_buffer + bytes_needed,
   2982                    btif_media_cb.media_feeding_state.pcm.aa_feed_residue);
   2983         }
   2984         return TRUE;
   2985     }
   2986 
   2987     return FALSE;
   2988 }
   2989 
   2990 /*******************************************************************************
   2991  **
   2992  ** Function         btif_media_aa_prep_sbc_2_send
   2993  **
   2994  ** Description
   2995  **
   2996  ** Returns          void
   2997  **
   2998  *******************************************************************************/
   2999 static void btif_media_aa_prep_sbc_2_send(UINT8 nb_frame,
   3000                                           uint64_t timestamp_us)
   3001 {
   3002     uint8_t remain_nb_frame = nb_frame;
   3003     UINT16 blocm_x_subband = btif_media_cb.encoder.s16NumOfSubBands *
   3004                              btif_media_cb.encoder.s16NumOfBlocks;
   3005 
   3006     while (nb_frame) {
   3007         BT_HDR *p_buf = osi_malloc(BTIF_MEDIA_AA_BUF_SIZE);
   3008 
   3009         /* Init buffer */
   3010         p_buf->offset = BTIF_MEDIA_AA_SBC_OFFSET;
   3011         p_buf->len = 0;
   3012         p_buf->layer_specific = 0;
   3013 
   3014         do
   3015         {
   3016             /* Write @ of allocated buffer in encoder.pu8Packet */
   3017             btif_media_cb.encoder.pu8Packet = (UINT8 *) (p_buf + 1) + p_buf->offset + p_buf->len;
   3018             /* Fill allocated buffer with 0 */
   3019             memset(btif_media_cb.encoder.as16PcmBuffer, 0, blocm_x_subband
   3020                     * btif_media_cb.encoder.s16NumOfChannels);
   3021 
   3022             /* Read PCM data and upsample them if needed */
   3023             if (btif_media_aa_read_feeding(UIPC_CH_ID_AV_AUDIO))
   3024             {
   3025                 SBC_Encoder(&(btif_media_cb.encoder));
   3026 
   3027                 /* Update SBC frame length */
   3028                 p_buf->len += btif_media_cb.encoder.u16PacketLength;
   3029                 nb_frame--;
   3030                 p_buf->layer_specific++;
   3031             }
   3032             else
   3033             {
   3034                 APPL_TRACE_WARNING("btif_media_aa_prep_sbc_2_send underflow %d, %d",
   3035                     nb_frame, btif_media_cb.media_feeding_state.pcm.aa_feed_residue);
   3036                 btif_media_cb.media_feeding_state.pcm.counter += nb_frame *
   3037                      btif_media_cb.encoder.s16NumOfSubBands *
   3038                      btif_media_cb.encoder.s16NumOfBlocks *
   3039                      btif_media_cb.media_feeding.cfg.pcm.num_channel *
   3040                      btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8;
   3041                 /* no more pcm to read */
   3042                 nb_frame = 0;
   3043 
   3044                 /* break read loop if timer was stopped (media task stopped) */
   3045                 if (! alarm_is_scheduled(btif_media_cb.media_alarm))
   3046                 {
   3047                     osi_free(p_buf);
   3048                     return;
   3049                 }
   3050             }
   3051 
   3052         } while (((p_buf->len + btif_media_cb.encoder.u16PacketLength) < btif_media_cb.TxAaMtuSize)
   3053                 && (p_buf->layer_specific < 0x0F) && nb_frame);
   3054 
   3055         if(p_buf->len)
   3056         {
   3057             /* timestamp of the media packet header represent the TS of the first SBC frame
   3058                i.e the timestamp before including this frame */
   3059             *((UINT32 *) (p_buf + 1)) = btif_media_cb.timestamp;
   3060 
   3061             btif_media_cb.timestamp += p_buf->layer_specific * blocm_x_subband;
   3062 
   3063             if (btif_media_cb.tx_flush)
   3064             {
   3065                 APPL_TRACE_DEBUG("### tx suspended, discarded frame ###");
   3066 
   3067                 btif_media_cb.stats.tx_queue_total_flushed_messages +=
   3068                     fixed_queue_length(btif_media_cb.TxAaQ);
   3069                 btif_media_cb.stats.tx_queue_last_flushed_us =
   3070                     timestamp_us;
   3071                 btif_media_flush_q(btif_media_cb.TxAaQ);
   3072 
   3073                 osi_free(p_buf);
   3074                 return;
   3075             }
   3076 
   3077             /* Enqueue the encoded SBC frame in AA Tx Queue */
   3078             update_scheduling_stats(&btif_media_cb.stats.tx_queue_enqueue_stats,
   3079                                     timestamp_us,
   3080                                     BTIF_SINK_MEDIA_TIME_TICK_MS * 1000);
   3081             uint8_t done_nb_frame = remain_nb_frame - nb_frame;
   3082             remain_nb_frame = nb_frame;
   3083             btif_media_cb.stats.tx_queue_total_frames += done_nb_frame;
   3084             if (done_nb_frame > btif_media_cb.stats.tx_queue_max_frames_per_packet)
   3085                 btif_media_cb.stats.tx_queue_max_frames_per_packet = done_nb_frame;
   3086             fixed_queue_enqueue(btif_media_cb.TxAaQ, p_buf);
   3087         }
   3088         else
   3089         {
   3090             osi_free(p_buf);
   3091         }
   3092     }
   3093 }
   3094 
   3095 
   3096 /*******************************************************************************
   3097  **
   3098  ** Function         btif_media_aa_prep_2_send
   3099  **
   3100  ** Description
   3101  **
   3102  ** Returns          void
   3103  **
   3104  *******************************************************************************/
   3105 
   3106 static void btif_media_aa_prep_2_send(UINT8 nb_frame, uint64_t timestamp_us)
   3107 {
   3108     // Check for TX queue overflow
   3109 
   3110     if (nb_frame > MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ)
   3111         nb_frame = MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ;
   3112 
   3113     if (fixed_queue_length(btif_media_cb.TxAaQ) > (MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ - nb_frame))
   3114     {
   3115         APPL_TRACE_WARNING("%s() - TX queue buffer count %d/%d", __func__,
   3116                            fixed_queue_length(btif_media_cb.TxAaQ),
   3117                            MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ - nb_frame);
   3118         // Keep track of drop-outs
   3119         btif_media_cb.stats.tx_queue_dropouts++;
   3120         btif_media_cb.stats.tx_queue_last_dropouts_us = timestamp_us;
   3121 
   3122         // Flush all queued buffers...
   3123         while (fixed_queue_length(btif_media_cb.TxAaQ)) {
   3124             btif_media_cb.stats.tx_queue_total_dropped_messages++;
   3125             osi_free(fixed_queue_try_dequeue(btif_media_cb.TxAaQ));
   3126         }
   3127 
   3128         // Request RSSI for log purposes if we had to flush buffers
   3129         bt_bdaddr_t peer_bda = btif_av_get_addr();
   3130         BTM_ReadRSSI(peer_bda.address, btm_read_rssi_cb);
   3131     }
   3132 
   3133     // Transcode frame
   3134 
   3135     switch (btif_media_cb.TxTranscoding)
   3136     {
   3137     case BTIF_MEDIA_TRSCD_PCM_2_SBC:
   3138         btif_media_aa_prep_sbc_2_send(nb_frame, timestamp_us);
   3139         break;
   3140 
   3141     default:
   3142         APPL_TRACE_ERROR("%s unsupported transcoding format 0x%x", __func__, btif_media_cb.TxTranscoding);
   3143         break;
   3144     }
   3145 }
   3146 
   3147 /*******************************************************************************
   3148  **
   3149  ** Function         btif_media_send_aa_frame
   3150  **
   3151  ** Description
   3152  **
   3153  ** Returns          void
   3154  **
   3155  *******************************************************************************/
   3156 static void btif_media_send_aa_frame(uint64_t timestamp_us)
   3157 {
   3158     UINT8 nb_frame_2_send = 0;
   3159     UINT8 nb_iterations = 0;
   3160 
   3161     btif_get_num_aa_frame_iteration(&nb_iterations, &nb_frame_2_send);
   3162 
   3163     if (nb_frame_2_send != 0) {
   3164         for (UINT8 counter = 0; counter < nb_iterations; counter++)
   3165         {
   3166             /* format and queue buffer to send */
   3167             btif_media_aa_prep_2_send(nb_frame_2_send, timestamp_us);
   3168         }
   3169     }
   3170 
   3171     LOG_VERBOSE(LOG_TAG, "%s Sent %d frames per iteration, %d iterations",
   3172                         __func__, nb_frame_2_send, nb_iterations);
   3173     bta_av_ci_src_data_ready(BTA_AV_CHNL_AUDIO);
   3174 }
   3175 
   3176 #endif /* BTA_AV_INCLUDED == TRUE */
   3177 
   3178 /*******************************************************************************
   3179  **
   3180  ** Function         dump_codec_info
   3181  **
   3182  ** Description      Decode and display codec_info (for debug)
   3183  **
   3184  ** Returns          void
   3185  **
   3186  *******************************************************************************/
   3187 void dump_codec_info(unsigned char *p_codec)
   3188 {
   3189     tA2D_STATUS a2d_status;
   3190     tA2D_SBC_CIE sbc_cie;
   3191 
   3192     a2d_status = A2D_ParsSbcInfo(&sbc_cie, p_codec, FALSE);
   3193     if (a2d_status != A2D_SUCCESS)
   3194     {
   3195         APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status);
   3196         return;
   3197     }
   3198 
   3199     APPL_TRACE_DEBUG("dump_codec_info");
   3200 
   3201     if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_16)
   3202     {    APPL_TRACE_DEBUG("\tsamp_freq:%d (16000)", sbc_cie.samp_freq);}
   3203     else  if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_32)
   3204     {    APPL_TRACE_DEBUG("\tsamp_freq:%d (32000)", sbc_cie.samp_freq);}
   3205     else  if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_44)
   3206     {    APPL_TRACE_DEBUG("\tsamp_freq:%d (44.100)", sbc_cie.samp_freq);}
   3207     else  if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_48)
   3208     {    APPL_TRACE_DEBUG("\tsamp_freq:%d (48000)", sbc_cie.samp_freq);}
   3209     else
   3210     {    APPL_TRACE_DEBUG("\tBAD samp_freq:%d", sbc_cie.samp_freq);}
   3211 
   3212     if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_MONO)
   3213     {    APPL_TRACE_DEBUG("\tch_mode:%d (Mono)", sbc_cie.ch_mode);}
   3214     else  if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_DUAL)
   3215     {    APPL_TRACE_DEBUG("\tch_mode:%d (Dual)", sbc_cie.ch_mode);}
   3216     else  if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_STEREO)
   3217     {    APPL_TRACE_DEBUG("\tch_mode:%d (Stereo)", sbc_cie.ch_mode);}
   3218     else  if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_JOINT)
   3219     {    APPL_TRACE_DEBUG("\tch_mode:%d (Joint)", sbc_cie.ch_mode);}
   3220     else
   3221     {    APPL_TRACE_DEBUG("\tBAD ch_mode:%d", sbc_cie.ch_mode);}
   3222 
   3223     if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_4)
   3224     {    APPL_TRACE_DEBUG("\tblock_len:%d (4)", sbc_cie.block_len);}
   3225     else  if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_8)
   3226     {    APPL_TRACE_DEBUG("\tblock_len:%d (8)", sbc_cie.block_len);}
   3227     else  if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_12)
   3228     {    APPL_TRACE_DEBUG("\tblock_len:%d (12)", sbc_cie.block_len);}
   3229     else  if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_16)
   3230     {    APPL_TRACE_DEBUG("\tblock_len:%d (16)", sbc_cie.block_len);}
   3231     else
   3232     {    APPL_TRACE_DEBUG("\tBAD block_len:%d", sbc_cie.block_len);}
   3233 
   3234     if (sbc_cie.num_subbands == A2D_SBC_IE_SUBBAND_4)
   3235     {    APPL_TRACE_DEBUG("\tnum_subbands:%d (4)", sbc_cie.num_subbands);}
   3236     else  if (sbc_cie.num_subbands == A2D_SBC_IE_SUBBAND_8)
   3237     {    APPL_TRACE_DEBUG("\tnum_subbands:%d (8)", sbc_cie.num_subbands);}
   3238     else
   3239     {    APPL_TRACE_DEBUG("\tBAD num_subbands:%d", sbc_cie.num_subbands);}
   3240 
   3241     if (sbc_cie.alloc_mthd == A2D_SBC_IE_ALLOC_MD_S)
   3242     {    APPL_TRACE_DEBUG("\talloc_mthd:%d (SNR)", sbc_cie.alloc_mthd);}
   3243     else  if (sbc_cie.alloc_mthd == A2D_SBC_IE_ALLOC_MD_L)
   3244     {    APPL_TRACE_DEBUG("\talloc_mthd:%d (Loundess)", sbc_cie.alloc_mthd);}
   3245     else
   3246     {    APPL_TRACE_DEBUG("\tBAD alloc_mthd:%d", sbc_cie.alloc_mthd);}
   3247 
   3248     APPL_TRACE_DEBUG("\tBit pool Min:%d Max:%d", sbc_cie.min_bitpool, sbc_cie.max_bitpool);
   3249 
   3250 }
   3251 
   3252 void btif_debug_a2dp_dump(int fd)
   3253 {
   3254     uint64_t now_us = time_now_us();
   3255     btif_media_stats_t *stats = &btif_media_cb.stats;
   3256     scheduling_stats_t *enqueue_stats = &stats->tx_queue_enqueue_stats;
   3257     scheduling_stats_t *dequeue_stats = &stats->tx_queue_dequeue_stats;
   3258     size_t ave_size;
   3259     uint64_t ave_time_us;
   3260 
   3261     dprintf(fd, "\nA2DP State:\n");
   3262     dprintf(fd, "  TxQueue:\n");
   3263 
   3264     dprintf(fd, "  Counts (enqueue/dequeue/readbuf)                        : %zu / %zu / %zu\n",
   3265             enqueue_stats->total_updates,
   3266             dequeue_stats->total_updates,
   3267             stats->tx_queue_total_readbuf_calls);
   3268 
   3269     dprintf(fd, "  Last update time ago in ms (enqueue/dequeue/readbuf)    : %llu / %llu / %llu\n",
   3270             (enqueue_stats->last_update_us > 0) ?
   3271                 (unsigned long long)(now_us - enqueue_stats->last_update_us) / 1000 : 0,
   3272             (dequeue_stats->last_update_us > 0) ?
   3273                 (unsigned long long)(now_us - dequeue_stats->last_update_us) / 1000 : 0,
   3274             (stats->tx_queue_last_readbuf_us > 0)?
   3275                 (unsigned long long)(now_us - stats->tx_queue_last_readbuf_us) / 1000 : 0);
   3276 
   3277     ave_size = 0;
   3278     if (stats->media_read_expected_count != 0)
   3279         ave_size = stats->media_read_total_expected_frames / stats->media_read_expected_count;
   3280     dprintf(fd, "  Frames expected (total/max/ave)                         : %zu / %zu / %zu\n",
   3281             stats->media_read_total_expected_frames,
   3282             stats->media_read_max_expected_frames,
   3283             ave_size);
   3284 
   3285     ave_size = 0;
   3286     if (stats->media_read_limited_count != 0)
   3287         ave_size = stats->media_read_total_limited_frames / stats->media_read_limited_count;
   3288     dprintf(fd, "  Frames limited (total/max/ave)                          : %zu / %zu / %zu\n",
   3289             stats->media_read_total_limited_frames,
   3290             stats->media_read_max_limited_frames,
   3291             ave_size);
   3292 
   3293     dprintf(fd, "  Counts (expected/limited)                               : %zu / %zu\n",
   3294             stats->media_read_expected_count,
   3295             stats->media_read_limited_count);
   3296 
   3297     ave_size = 0;
   3298     if (enqueue_stats->total_updates != 0)
   3299         ave_size = stats->tx_queue_total_frames / enqueue_stats->total_updates;
   3300     dprintf(fd, "  Frames per packet (total/max/ave)                       : %zu / %zu / %zu\n",
   3301             stats->tx_queue_total_frames,
   3302             stats->tx_queue_max_frames_per_packet,
   3303             ave_size);
   3304 
   3305     dprintf(fd, "  Counts (flushed/dropped/dropouts)                       : %zu / %zu / %zu\n",
   3306             stats->tx_queue_total_flushed_messages,
   3307             stats->tx_queue_total_dropped_messages,
   3308             stats->tx_queue_dropouts);
   3309 
   3310     dprintf(fd, "  Last update time ago in ms (flushed/dropped)            : %llu / %llu\n",
   3311             (stats->tx_queue_last_flushed_us > 0) ?
   3312                 (unsigned long long)(now_us - stats->tx_queue_last_flushed_us) / 1000 : 0,
   3313             (stats->tx_queue_last_dropouts_us > 0)?
   3314                 (unsigned long long)(now_us - stats->tx_queue_last_dropouts_us)/ 1000 : 0);
   3315 
   3316     dprintf(fd, "  Counts (underflow/underrun)                             : %zu / %zu\n",
   3317             stats->media_read_total_underflow_count,
   3318             stats->media_read_total_underrun_count);
   3319 
   3320     dprintf(fd, "  Bytes (underflow/underrun)                              : %zu / %zu\n",
   3321             stats->media_read_total_underflow_bytes,
   3322             stats->media_read_total_underrun_bytes);
   3323 
   3324     dprintf(fd, "  Last update time ago in ms (underflow/underrun)         : %llu / %llu\n",
   3325             (stats->media_read_last_underflow_us > 0) ?
   3326                 (unsigned long long)(now_us - stats->media_read_last_underflow_us) / 1000 : 0,
   3327             (stats->media_read_last_underrun_us > 0)?
   3328                 (unsigned long long)(now_us - stats->media_read_last_underrun_us) / 1000 : 0);
   3329 
   3330     //
   3331     // TxQueue enqueue stats
   3332     //
   3333     dprintf(fd, "  Enqueue deviation counts (overdue/premature)            : %zu / %zu\n",
   3334             enqueue_stats->overdue_scheduling_count,
   3335             enqueue_stats->premature_scheduling_count);
   3336 
   3337     ave_time_us = 0;
   3338     if (enqueue_stats->overdue_scheduling_count != 0) {
   3339         ave_time_us = enqueue_stats->total_overdue_scheduling_delta_us /
   3340             enqueue_stats->overdue_scheduling_count;
   3341     }
   3342     dprintf(fd, "  Enqueue overdue scheduling time in ms (total/max/ave)   : %llu / %llu / %llu\n",
   3343             (unsigned long long)enqueue_stats->total_overdue_scheduling_delta_us / 1000,
   3344             (unsigned long long)enqueue_stats->max_overdue_scheduling_delta_us / 1000,
   3345             (unsigned long long)ave_time_us / 1000);
   3346 
   3347     ave_time_us = 0;
   3348     if (enqueue_stats->premature_scheduling_count != 0) {
   3349         ave_time_us = enqueue_stats->total_premature_scheduling_delta_us /
   3350             enqueue_stats->premature_scheduling_count;
   3351     }
   3352     dprintf(fd, "  Enqueue premature scheduling time in ms (total/max/ave) : %llu / %llu / %llu\n",
   3353             (unsigned long long)enqueue_stats->total_premature_scheduling_delta_us / 1000,
   3354             (unsigned long long)enqueue_stats->max_premature_scheduling_delta_us / 1000,
   3355             (unsigned long long)ave_time_us / 1000);
   3356 
   3357 
   3358     //
   3359     // TxQueue dequeue stats
   3360     //
   3361     dprintf(fd, "  Dequeue deviation counts (overdue/premature)            : %zu / %zu\n",
   3362             dequeue_stats->overdue_scheduling_count,
   3363             dequeue_stats->premature_scheduling_count);
   3364 
   3365     ave_time_us = 0;
   3366     if (dequeue_stats->overdue_scheduling_count != 0) {
   3367         ave_time_us = dequeue_stats->total_overdue_scheduling_delta_us /
   3368             dequeue_stats->overdue_scheduling_count;
   3369     }
   3370     dprintf(fd, "  Dequeue overdue scheduling time in ms (total/max/ave)   : %llu / %llu / %llu\n",
   3371             (unsigned long long)dequeue_stats->total_overdue_scheduling_delta_us / 1000,
   3372             (unsigned long long)dequeue_stats->max_overdue_scheduling_delta_us / 1000,
   3373             (unsigned long long)ave_time_us / 1000);
   3374 
   3375     ave_time_us = 0;
   3376     if (dequeue_stats->premature_scheduling_count != 0) {
   3377         ave_time_us = dequeue_stats->total_premature_scheduling_delta_us /
   3378             dequeue_stats->premature_scheduling_count;
   3379     }
   3380     dprintf(fd, "  Dequeue premature scheduling time in ms (total/max/ave) : %llu / %llu / %llu\n",
   3381             (unsigned long long)dequeue_stats->total_premature_scheduling_delta_us / 1000,
   3382             (unsigned long long)dequeue_stats->max_premature_scheduling_delta_us / 1000,
   3383             (unsigned long long)ave_time_us / 1000);
   3384 
   3385 }
   3386 
   3387 void btif_update_a2dp_metrics(void)
   3388 {
   3389     uint64_t now_us = time_now_us();
   3390     btif_media_stats_t *stats = &btif_media_cb.stats;
   3391     scheduling_stats_t *dequeue_stats = &stats->tx_queue_dequeue_stats;
   3392     int32_t media_timer_min_ms = 0;
   3393     int32_t media_timer_max_ms = 0;
   3394     int32_t media_timer_avg_ms = 0;
   3395     int32_t buffer_overruns_max_count = 0;
   3396     int32_t buffer_overruns_total = 0;
   3397     float buffer_underruns_average = 0.0;
   3398     int32_t buffer_underruns_count = 0;
   3399 
   3400     int64_t session_duration_sec =
   3401         (now_us - stats->session_start_us) / (1000 * 1000);
   3402 
   3403     /* NOTE: Disconnect reason is unused */
   3404     const char *disconnect_reason = NULL;
   3405     uint32_t device_class = BTM_COD_MAJOR_AUDIO;
   3406 
   3407     if (dequeue_stats->total_updates > 1) {
   3408         media_timer_min_ms = BTIF_SINK_MEDIA_TIME_TICK_MS -
   3409             (dequeue_stats->max_premature_scheduling_delta_us / 1000);
   3410         media_timer_max_ms = BTIF_SINK_MEDIA_TIME_TICK_MS +
   3411             (dequeue_stats->max_overdue_scheduling_delta_us / 1000);
   3412 
   3413         uint64_t total_scheduling_count =
   3414             dequeue_stats->overdue_scheduling_count +
   3415             dequeue_stats->premature_scheduling_count +
   3416             dequeue_stats->exact_scheduling_count;
   3417         if (total_scheduling_count > 0) {
   3418             media_timer_avg_ms = dequeue_stats->total_scheduling_time_us /
   3419                 (1000 * total_scheduling_count);
   3420         }
   3421 
   3422         buffer_overruns_max_count = stats->media_read_max_expected_frames;
   3423         buffer_overruns_total = stats->tx_queue_total_dropped_messages;
   3424         buffer_underruns_count = stats->media_read_total_underflow_count +
   3425             stats->media_read_total_underrun_count;
   3426         if (buffer_underruns_count > 0) {
   3427             buffer_underruns_average =
   3428                 (stats->media_read_total_underflow_bytes + stats->media_read_total_underrun_bytes) / buffer_underruns_count;
   3429         }
   3430     }
   3431 
   3432     metrics_a2dp_session(session_duration_sec, disconnect_reason, device_class,
   3433                          media_timer_min_ms, media_timer_max_ms,
   3434                          media_timer_avg_ms, buffer_overruns_max_count,
   3435                          buffer_overruns_total, buffer_underruns_average,
   3436                          buffer_underruns_count);
   3437 }
   3438